@subconverter/core 0.1.0 → 0.2.1

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/proxy-group.ts","../src/types/proxy.ts","../src/types/ruleset.ts","../src/types/settings.ts","../src/types/tribool.ts","../src/utils/base64.ts","../src/utils/ini.ts","../src/utils/string.ts","../src/utils/url.ts","../src/utils/hash.ts","../src/utils/template.ts","../src/settings/config.ts","../src/settings/request-params.ts","../src/parser/ciphers.ts","../src/parser/construct.ts","../src/parser/netch.ts","../src/parser/conf.ts","../src/parser/uri.ts","../src/parser/subscription.ts","../src/generator/clash.ts","../src/generator/nodes.ts","../src/generator/links.ts","../src/generator/surge.ts","../src/generator/loon.ts","../src/generator/ruleset.ts","../src/generator/mellow.ts","../src/generator/quan.ts","../src/generator/quanx.ts","../src/generator/singbox.ts","../src/engine.ts"],"sourcesContent":["/** Proxy group kinds, mirroring subconverter's `ProxyGroupType`. */\nexport enum ProxyGroupType {\n Select = \"select\",\n URLTest = \"url-test\",\n Fallback = \"fallback\",\n LoadBalance = \"load-balance\",\n Relay = \"relay\",\n SSID = \"ssid\",\n Smart = \"smart\",\n}\n\n/** Load-balance strategy, mirroring `BalanceStrategy`. */\nexport enum BalanceStrategy {\n ConsistentHashing = \"consistent-hashing\",\n RoundRobin = \"round-robin\",\n}\n\n/** A configured proxy group (`[Proxy Group]` entries). */\nexport interface ProxyGroupConfig {\n name: string;\n type: ProxyGroupType;\n proxies: string[];\n usingProvider: string[];\n url: string;\n interval: number;\n timeout: number;\n tolerance: number;\n strategy: BalanceStrategy;\n lazy: boolean | undefined;\n disableUdp: boolean | undefined;\n persistent: boolean | undefined;\n evaluateBeforeUse: boolean | undefined;\n}\n\n/** Create a proxy group with subconverter's default field values. */\nexport function createProxyGroupConfig(): ProxyGroupConfig {\n return {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name: \"\",\n persistent: undefined,\n proxies: [],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 0,\n tolerance: 0,\n type: ProxyGroupType.Select,\n url: \"\",\n usingProvider: [],\n };\n}\n\n/** Resolve a textual group type (as found in config files). */\nexport function parseProxyGroupType(value: string): ProxyGroupType | undefined {\n const normalized = value.trim().toLowerCase();\n switch (normalized) {\n case \"select\":\n return ProxyGroupType.Select;\n case \"url-test\":\n return ProxyGroupType.URLTest;\n case \"fallback\":\n return ProxyGroupType.Fallback;\n case \"load-balance\":\n return ProxyGroupType.LoadBalance;\n case \"relay\":\n return ProxyGroupType.Relay;\n case \"ssid\":\n return ProxyGroupType.SSID;\n case \"smart\":\n return ProxyGroupType.Smart;\n default:\n return undefined;\n }\n}\n","import type { TriBool } from \"./tribool\";\n\n/** Proxy protocol kinds supported by the converter. */\nexport enum ProxyType {\n Unknown = \"unknown\",\n Shadowsocks = \"ss\",\n ShadowsocksR = \"ssr\",\n VMess = \"vmess\",\n VLESS = \"vless\",\n Trojan = \"trojan\",\n Snell = \"snell\",\n HTTP = \"http\",\n HTTPS = \"https\",\n SOCKS5 = \"socks5\",\n WireGuard = \"wireguard\",\n Hysteria = \"hysteria\",\n Hysteria2 = \"hysteria2\",\n TUIC = \"tuic\",\n AnyTLS = \"anytls\",\n}\n\n/** Human-readable name used by generators that prefix the remark. */\nexport function proxyTypeName(type: ProxyType): string {\n switch (type) {\n case ProxyType.Shadowsocks:\n return \"SS\";\n case ProxyType.ShadowsocksR:\n return \"SSR\";\n case ProxyType.VMess:\n return \"VMess\";\n case ProxyType.VLESS:\n return \"VLESS\";\n case ProxyType.Trojan:\n return \"Trojan\";\n case ProxyType.Snell:\n return \"Snell\";\n case ProxyType.HTTP:\n return \"HTTP\";\n case ProxyType.HTTPS:\n return \"HTTPS\";\n case ProxyType.SOCKS5:\n return \"SOCKS5\";\n case ProxyType.WireGuard:\n return \"WireGuard\";\n case ProxyType.Hysteria:\n return \"Hysteria\";\n case ProxyType.Hysteria2:\n return \"Hysteria2\";\n case ProxyType.TUIC:\n return \"TUIC\";\n case ProxyType.AnyTLS:\n return \"AnyTLS\";\n default:\n return \"Unknown\";\n }\n}\n\n/** Default provider group names, mirrored from the C++ `*_DEFAULT_GROUP`. */\nexport const DEFAULT_GROUPS = {\n anytls: \"AnyTLSProvider\",\n http: \"HTTPProvider\",\n hysteria: \"HysteriaProvider\",\n hysteria2: \"Hysteria2Provider\",\n snell: \"SnellProvider\",\n socks: \"SocksProvider\",\n ss: \"SSProvider\",\n ssr: \"SSRProvider\",\n trojan: \"TrojanProvider\",\n tuic: \"TUICProvider\",\n v2ray: \"V2RayProvider\",\n wireguard: \"WireGuardProvider\",\n} as const;\n\n/**\n * A single proxy node.\n *\n * The field set intentionally mirrors subconverter's `Proxy` struct so ports of\n * the C++ parsers/generators stay one-to-one and easy to audit.\n */\nexport interface Proxy {\n type: ProxyType;\n id: number;\n groupId: number;\n group: string;\n remark: string;\n hostname: string;\n port: number;\n\n username: string;\n password: string;\n encryptMethod: string;\n plugin: string;\n pluginOption: string;\n protocol: string;\n protocolParam: string;\n obfs: string;\n obfsParam: string;\n userId: string;\n alterId: number;\n transferProtocol: string;\n fakeType: string;\n tlsSecure: boolean;\n\n host: string;\n path: string;\n edge: string;\n\n /** VLESS `flow` control (e.g. `xtls-rprx-vision`). */\n flow: string;\n /** TUIC congestion control algorithm. */\n congestionControl: string;\n\n quicSecure: string;\n quicSecret: string;\n\n udp: TriBool;\n tcpFastOpen: TriBool;\n allowInsecure: TriBool;\n tls13: TriBool;\n\n underlyingProxy: string;\n\n snellVersion: number;\n serverName: string;\n\n selfIp: string;\n selfIpv6: string;\n publicKey: string;\n privateKey: string;\n preSharedKey: string;\n dnsServers: string[];\n mtu: number;\n allowedIps: string;\n keepAlive: number;\n testUrl: string;\n clientId: string;\n\n ports: string;\n up: string;\n upSpeed: number;\n down: string;\n downSpeed: number;\n authStr: string;\n sni: string;\n fingerprint: string;\n ca: string;\n caStr: string;\n recvWindowConn: number;\n recvWindow: number;\n disableMtuDiscovery: TriBool;\n hopInterval: number;\n alpn: string[];\n\n cwnd: number;\n}\n\n/** Create a proxy with subconverter's default field values. */\nexport function createProxy(): Proxy {\n return {\n allowedIps: \"0.0.0.0/0, ::/0\",\n allowInsecure: undefined,\n alpn: [],\n alterId: 0,\n authStr: \"\",\n ca: \"\",\n caStr: \"\",\n clientId: \"\",\n congestionControl: \"\",\n cwnd: 0,\n disableMtuDiscovery: undefined,\n dnsServers: [],\n down: \"\",\n downSpeed: 0,\n edge: \"\",\n encryptMethod: \"\",\n fakeType: \"\",\n fingerprint: \"\",\n flow: \"\",\n group: \"\",\n groupId: 0,\n hopInterval: 0,\n host: \"\",\n hostname: \"\",\n id: 0,\n keepAlive: 0,\n mtu: 0,\n obfs: \"\",\n obfsParam: \"\",\n password: \"\",\n path: \"\",\n plugin: \"\",\n pluginOption: \"\",\n port: 0,\n ports: \"\",\n preSharedKey: \"\",\n privateKey: \"\",\n protocol: \"\",\n protocolParam: \"\",\n publicKey: \"\",\n quicSecret: \"\",\n quicSecure: \"\",\n recvWindow: 0,\n recvWindowConn: 0,\n remark: \"\",\n selfIp: \"\",\n selfIpv6: \"\",\n serverName: \"\",\n snellVersion: 0,\n sni: \"\",\n tcpFastOpen: undefined,\n testUrl: \"\",\n tls13: undefined,\n tlsSecure: false,\n transferProtocol: \"\",\n type: ProxyType.Unknown,\n udp: undefined,\n underlyingProxy: \"\",\n up: \"\",\n upSpeed: 0,\n userId: \"\",\n username: \"\",\n };\n}\n","/** Ruleset source dialects, mirroring `ruleset_type` in ruleconvert.h. */\nexport enum RulesetType {\n Surge = \"surge\",\n QuantumultX = \"quanx\",\n ClashDomain = \"clash-domain\",\n ClashIpCidr = \"clash-ipcidr\",\n ClashClassical = \"clash-classical\",\n}\n\n/** One `ruleset=` entry resolved into a group + remote/local source. */\nexport interface RulesetConfig {\n group: string;\n url: string;\n interval: number;\n}\n\n/** A ruleset with its fetched content and resolved type. */\nexport interface RulesetContent {\n ruleGroup: string;\n rulePath: string;\n rulePathTyped: string;\n ruleType: RulesetType;\n content: string;\n updateInterval: number;\n}\n\n/** Create a ruleset config with subconverter's defaults. */\nexport function createRulesetConfig(): RulesetConfig {\n return { group: \"\", interval: 86400, url: \"\" };\n}\n","import type { ProxyGroupConfig } from \"./proxy-group\";\nimport type { RulesetConfig } from \"./ruleset\";\nimport type { TriBool } from \"./tribool\";\n\n/** A regex/script rewrite rule, mirroring `RegexMatchConfig`. */\nexport interface RegexMatchConfig {\n match: string;\n replace: string;\n script: string;\n}\n\n/** Target output formats. */\nexport enum TargetFormat {\n Clash = \"clash\",\n ClashR = \"clashr\",\n Surge = \"surge\",\n QuantumultX = \"quanx\",\n Quantumult = \"quan\",\n Loon = \"loon\",\n Mellow = \"mellow\",\n V2Ray = \"v2ray\",\n Trojan = \"trojan\",\n SSD = \"ssd\",\n SSC = \"ss\",\n SSR = \"ssr\",\n SingBox = \"singbox\",\n Mixed = \"mixed\",\n NodeList = \"nodelist\",\n Auto = \"auto\",\n}\n\n/** Per-run conversion settings, mirroring `extra_settings`. */\nexport interface ExtraSettings {\n enableRuleGenerator: boolean;\n overwriteOriginalRules: boolean;\n renameArray: RegexMatchConfig[];\n emojiArray: RegexMatchConfig[];\n addEmoji: boolean;\n removeEmoji: boolean;\n appendProxyType: boolean;\n nodeList: boolean;\n sortFlag: boolean;\n filterDeprecated: boolean;\n clashNewFieldName: boolean;\n clashScript: boolean;\n clashClassicalRuleset: boolean;\n dedupe: boolean;\n surgeSsrPath: string;\n managedConfigPrefix: string;\n quanxDevId: string;\n udp: TriBool;\n tfo: TriBool;\n skipCertVerify: TriBool;\n tls13: TriBool;\n sortScript: string;\n clashProxiesStyle: string;\n clashProxyGroupsStyle: string;\n authorized: boolean;\n}\n\n/** Create `ExtraSettings` with subconverter's defaults. */\nexport function createExtraSettings(): ExtraSettings {\n return {\n addEmoji: false,\n appendProxyType: false,\n authorized: false,\n clashClassicalRuleset: false,\n clashNewFieldName: false,\n clashProxiesStyle: \"flow\",\n clashProxyGroupsStyle: \"flow\",\n clashScript: false,\n dedupe: false,\n emojiArray: [],\n enableRuleGenerator: true,\n filterDeprecated: false,\n managedConfigPrefix: \"\",\n nodeList: false,\n overwriteOriginalRules: true,\n quanxDevId: \"\",\n removeEmoji: false,\n renameArray: [],\n skipCertVerify: undefined,\n sortFlag: false,\n sortScript: \"\",\n surgeSsrPath: \"\",\n tfo: undefined,\n tls13: undefined,\n udp: undefined,\n };\n}\n\n/** Structured request/config parameters used by the engine. */\nexport interface RequestSettings {\n target: TargetFormat;\n url: string;\n group: ProxyGroupConfig[];\n ruleset: RulesetConfig[];\n rename: RegexMatchConfig[];\n emoji: RegexMatchConfig[];\n includeRemarks: string[];\n excludeRemarks: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n appendType: boolean;\n nodeList: boolean;\n sort: boolean;\n filterDeprecated: boolean;\n list: boolean;\n tfo: TriBool;\n udp: TriBool;\n scv: TriBool;\n tls13: TriBool;\n newFieldName: boolean;\n classicalRuleset: boolean;\n insert: boolean;\n mixin: string;\n interval: number;\n script: string;\n clashScript: boolean;\n proxiesStyle: string;\n proxyGroupsStyle: string;\n autoExtract: boolean;\n uploadPath: string;\n}\n","/**\n * A three-valued boolean mirroring subconverter's `tribool`.\n *\n * `undefined` means \"unspecified\" and callers decide whether to apply a\n * default; `true`/`false` are explicit overrides (e.g. from URL parameters).\n */\nexport type TriBool = boolean | undefined;\n\n/** Treat `undefined` as `false`. */\nexport function triBoolOr(value: TriBool, fallback: boolean): boolean {\n return value === undefined ? fallback : value;\n}\n\n/** Parse a loose string (e.g. `\"1\"`, `\"true\"`, `\"0\"`) into a {@link TriBool}. */\nexport function parseTriBool(value: string | undefined | null): TriBool {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n return undefined;\n}\n","const B64_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst B64_URLSAFE_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\nconst B64_LOOKUP: Record<string, number> = {};\nfor (let i = 0; i < B64_ALPHABET.length; i += 1) {\n B64_LOOKUP[B64_ALPHABET[i] as string] = i;\n}\nB64_LOOKUP[\"-\"] = 62;\nB64_LOOKUP[\"_\"] = 63;\n\n/** UTF-8 encode a string to bytes (browser + Node safe). */\nexport function utf8Encode(input: string): Uint8Array {\n return new TextEncoder().encode(input);\n}\n\n/** Decode UTF-8 bytes back to a string. */\nexport function utf8Decode(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes);\n}\n\nfunction encodeWithAlphabet(input: string, alphabet: string): string {\n const bytes = utf8Encode(input);\n let output = \"\";\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i] as number;\n const b1 = i + 1 < bytes.length ? (bytes[i + 1] as number) : 0;\n const b2 = i + 2 < bytes.length ? (bytes[i + 2] as number) : 0;\n const triple = (b0 << 16) | (b1 << 8) | b2;\n output += alphabet[(triple >> 18) & 0x3f];\n output += alphabet[(triple >> 12) & 0x3f];\n output += i + 1 < bytes.length ? alphabet[(triple >> 6) & 0x3f] : \"=\";\n output += i + 2 < bytes.length ? alphabet[triple & 0x3f] : \"=\";\n }\n return output;\n}\n\nfunction decodeBytes(input: string): Uint8Array {\n const normalized = input.replace(/\\s+/g, \"\");\n const clean = normalized.replace(/=+$/, \"\");\n const out: number[] = [];\n let buffer = 0;\n let bits = 0;\n for (const char of clean) {\n const value = B64_LOOKUP[char];\n if (value === undefined) {\n continue;\n }\n buffer = (buffer << 6) | value;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n out.push((buffer >> bits) & 0xff);\n }\n }\n return Uint8Array.from(out);\n}\n\n/** Standard base64 encode (with padding). */\nexport function base64Encode(input: string): string {\n return encodeWithAlphabet(input, B64_ALPHABET);\n}\n\n/** URL-safe base64 encode without padding. */\nexport function urlSafeBase64Encode(input: string): string {\n return encodeWithAlphabet(input, B64_URLSAFE_ALPHABET).replace(/=+$/, \"\");\n}\n\n/** Standard base64 decode; tolerant of URL-safe input and missing padding. */\nexport function base64Decode(input: string): string {\n return utf8Decode(decodeBytes(input));\n}\n\n/** URL-safe base64 decode; alias of {@link base64Decode} (same tolerance). */\nexport function urlSafeBase64Decode(input: string): string {\n return base64Decode(input);\n}\n\n/**\n * Best-effort base64 decode used for subscription bodies: subconverter expects\n * a base64 blob but real-world providers sometimes serve plain text.\n */\nexport function tryBase64Decode(input: string): string {\n const trimmed = input.trim();\n if (trimmed === \"\") {\n return \"\";\n }\n if (!/^[A-Za-z0-9+/\\-_=\\s]+$/.test(trimmed)) {\n return input;\n }\n try {\n const decoded = base64Decode(trimmed);\n return decoded.includes(\"\\uFFFD\") ? input : decoded;\n } catch {\n return input;\n }\n}\n","export interface IniSection {\n name: string;\n items: Array<[string, string]>;\n}\n\nexport interface IniDocument {\n sections: IniSection[];\n /** Items appearing before the first section header. */\n isolated: Array<[string, string]>;\n}\n\nexport interface ParseIniOptions {\n /** Section name used to hold items that appear before the first header. */\n isolatedSection?: string;\n /** When false, empty-valued items are dropped. */\n keepEmptyValues?: boolean;\n /** Strip surrounding whitespace from keys and values. */\n trim?: boolean;\n}\n\n/**\n * Minimal INI reader mirroring the subset of `ini_reader` subconverter relies\n * on: case-preserving keys, duplicate sections, and isolated leading items.\n */\nexport function parseIni(content: string, options: ParseIniOptions = {}): IniDocument {\n const isolatedSection = options.isolatedSection ?? \"\";\n const keepEmptyValues = options.keepEmptyValues ?? false;\n const doTrim = options.trim ?? true;\n\n const sections: IniSection[] = [];\n const isolated: Array<[string, string]> = [];\n let current: IniSection | undefined;\n\n const lines = content.split(/\\r?\\n/);\n for (const rawLine of lines) {\n let line = rawLine;\n if (doTrim) {\n line = line.trim();\n }\n if (line === \"\") {\n continue;\n }\n if (line.startsWith(\"[\") && line.endsWith(\"]\")) {\n const name = line.slice(1, -1).trim();\n current = { items: [], name };\n sections.push(current);\n continue;\n }\n const eq = line.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n const key = doTrim ? line.slice(0, eq).trim() : line.slice(0, eq);\n const value = doTrim ? line.slice(eq + 1).trim() : line.slice(eq + 1);\n if (value === \"\" && !keepEmptyValues) {\n continue;\n }\n const pair: [string, string] = [key, value];\n if (current) {\n current.items.push(pair);\n } else {\n isolated.push(pair);\n }\n }\n\n if (isolated.length > 0 && isolatedSection !== \"\") {\n sections.unshift({ items: isolated, name: isolatedSection });\n }\n\n return { isolated, sections };\n}\n\n/** Return the first section with `name`, if any. */\nexport function findSection(doc: IniDocument, name: string): IniSection | undefined {\n return doc.sections.find((section) => section.name === name);\n}\n\n/** Return every item of every section named `name`, in document order. */\nexport function getSectionItems(doc: IniDocument, name: string): Array<[string, string]> {\n const items: Array<[string, string]> = [];\n for (const section of doc.sections) {\n if (section.name === name) {\n items.push(...section.items);\n }\n }\n return items;\n}\n\n/** A raw INI section: a header name and its untouched lines. */\nexport interface RawIniSection {\n name: string;\n lines: string[];\n}\n\n/** Split text into ordered raw sections, preserving line content. */\nexport function parseRawIni(content: string): RawIniSection[] {\n const sections: RawIniSection[] = [];\n let current: RawIniSection | undefined;\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.replace(/\\s+$/, \"\");\n const header = /^\\[(.*)\\]$/.exec(line.trim());\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line.trim() === \"\") {\n continue;\n }\n if (current) {\n current.lines.push(line);\n }\n }\n return sections;\n}\n\n/** Render raw sections back into INI text with blank lines between sections. */\nexport function renderRawIni(sections: RawIniSection[]): string {\n const out: string[] = [];\n for (const section of sections) {\n out.push(`[${section.name}]`);\n out.push(...section.lines);\n out.push(\"\");\n }\n return `${out.join(\"\\n\").trimEnd()}\\n`;\n}\n\n/** Insert or replace a named raw section, keeping its position when present. */\nexport function setRawSection(sections: RawIniSection[], name: string, lines: string[]): void {\n const existing = sections.find((section) => section.name === name);\n if (existing) {\n existing.lines = lines;\n return;\n }\n sections.push({ lines, name });\n}\n","/** Trim ASCII whitespace from both ends. */\nexport function trim(input: string): string {\n return input.replace(/^\\s+|\\s+$/g, \"\");\n}\n\n/** Trim and lowercase. */\nexport function trimLowerCase(input: string): string {\n return trim(input).toLowerCase();\n}\n\n/** Parse the leading integer of a string; `0` when none is present. */\nexport function toInt(value: string | number | undefined | null): number {\n if (value === undefined || value === null) {\n return 0;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? Math.trunc(value) : 0;\n }\n const match = /[+-]?\\d+/.exec(value);\n if (!match) {\n return 0;\n }\n const parsed = Number.parseInt(match[0], 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\n/** Parse a boolean-ish value (\"true\"/\"false\"/\"1\"/\"0\"). */\nexport function toBool(value: string | undefined | null): boolean {\n if (value === undefined || value === null) {\n return false;\n }\n const normalized = value.trim().toLowerCase();\n return normalized === \"true\" || normalized === \"1\";\n}\n\n/** `true` when `needle` occurs in `haystack`. */\nexport function strFind(haystack: string, needle: string): boolean {\n return haystack.includes(needle);\n}\n\n/** `true` when `input` starts with `prefix`. */\nexport function startsWith(input: string, prefix: string): boolean {\n return input.startsWith(prefix);\n}\n\n/** Count non-overlapping occurrences of `needle` in `haystack`. */\nexport function countOccurrences(haystack: string, needle: string): number {\n if (needle === \"\") {\n return 0;\n }\n let count = 0;\n let index = haystack.indexOf(needle);\n while (index !== -1) {\n count += 1;\n index = haystack.indexOf(needle, index + needle.length);\n }\n return count;\n}\n\n/** Split a string on a literal delimiter, dropping trailing empties when asked. */\nexport function split(input: string, delimiter: string, removeEmpty = false): string[] {\n const parts = input.split(delimiter);\n return removeEmpty ? parts.filter((part) => part !== \"\") : parts;\n}\n\n/**\n * Replace every regex match, mirroring subconverter's `regReplace`.\n * An empty `replacement` removes the matches.\n */\nexport function regReplace(input: string, pattern: string, replacement = \"\"): string {\n return input.replace(new RegExp(pattern, \"g\"), replacement);\n}\n\n/** `true` when `pattern` (a JS regex source) matches anywhere in `input`. */\nexport function regMatch(input: string, pattern: string): boolean {\n return new RegExp(pattern).test(input);\n}\n\n/**\n * Replace distinct consecutive occurrences of `from` with `to`.\n * Kept for API parity; equivalent to a global literal replace.\n */\nexport function replaceAllDistinct(input: string, from: string, to: string): string {\n if (from === \"\") {\n return input;\n }\n return input.split(from).join(to);\n}\n\n/** `true` when the string is a dotted-quad IPv4 literal. */\nexport function isIpv4(input: string): boolean {\n const parts = input.split(\".\");\n if (parts.length !== 4) {\n return false;\n }\n return parts.every((part) => /^\\d{1,3}$/.test(part) && Number(part) <= 255);\n}\n\n/** `true` when the string is a bracketed/unbracketed IPv6 literal. */\nexport function isIpv6(input: string): boolean {\n return /^\\[?[0-9A-Fa-f:]{2,}\\]?$/.test(input) && input.includes(\":\");\n}\n\n/** `true` when the host is an IP literal (v4 or v6). */\nexport function isIp(input: string): boolean {\n return isIpv4(input) || isIpv6(input);\n}\n\n/** Pad a value to two digits. */\nexport function pad2(value: number): string {\n return value < 10 ? `0${value}` : String(value);\n}\n\n/** `true` when the string is empty or only whitespace. */\nexport function isBlank(input: string | undefined | null): boolean {\n return input === undefined || input === null || trim(input) === \"\";\n}\n","/** Percent-decode a URL component, tolerating malformed sequences. */\nexport function urlDecode(input: string): string {\n try {\n return decodeURIComponent(input);\n } catch {\n return input.replace(/%([0-9A-Fa-f]{2})/g, (_, hex: string) =>\n String.fromCharCode(Number.parseInt(hex, 16)),\n );\n }\n}\n\n/** Percent-encode a URL component (RFC 3986 unreserved kept intact). */\nexport function urlEncode(input: string): string {\n return encodeURIComponent(input).replace(\n /[!'()*]/g,\n (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n\n/**\n * Read a parameter from a query string, mirroring subconverter's\n * `getUrlArg` (last occurrence wins, value percent-decoded).\n */\nexport function getUrlArg(query: string, key: string): string {\n if (query === \"\") {\n return \"\";\n }\n const normalized = query.startsWith(\"?\") ? query.slice(1) : query;\n const parts = normalized.split(\"&\");\n let found = \"\";\n const target = key.toLowerCase();\n for (const part of parts) {\n if (part === \"\") {\n continue;\n }\n const eq = part.indexOf(\"=\");\n const rawKey = eq >= 0 ? part.slice(0, eq) : part;\n if (rawKey.toLowerCase() !== target) {\n continue;\n }\n const rawValue = eq >= 0 ? part.slice(eq + 1) : \"\";\n found = urlDecode(rawValue);\n }\n return found.trim();\n}\n\n/** Split a URL into its scheme/authority-specific parts without a URL parser. */\nexport function splitUrl(raw: string): { base: string; query: string } {\n const hashIndex = raw.indexOf(\"#\");\n const withoutHash = hashIndex >= 0 ? raw.slice(0, hashIndex) : raw;\n const queryIndex = withoutHash.indexOf(\"?\");\n if (queryIndex < 0) {\n return { base: withoutHash, query: \"\" };\n }\n return { base: withoutHash.slice(0, queryIndex), query: withoutHash.slice(queryIndex + 1) };\n}\n\n/** Strip a scheme prefix (e.g. `ss://`) from a link. */\nexport function stripScheme(link: string): string {\n const index = link.indexOf(\"://\");\n return index >= 0 ? link.slice(index + 3) : link;\n}\n","/**\n * FNV-1a 64-bit hash, matching subconverter's `hash_` (used for WireGuard\n * section names and other deterministic identifiers).\n */\nexport function fnv1a64(input: string): bigint {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n for (const char of input) {\n hash ^= BigInt(char.codePointAt(0) as number);\n hash = BigInt.asUintN(64, hash * prime);\n }\n return hash;\n}\n\n/** Lowercase hex representation of {@link fnv1a64}. */\nexport function fnv1a64Hex(input: string): string {\n return fnv1a64(input).toString(16);\n}\n","/** A flat map of template variables (dotted keys are allowed, e.g. `clash.dns.port`). */\nexport type TemplateVars = Record<string, string>;\n\nconst INTERPOLATION = /\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g;\n\n/**\n * Interpolate `{{ name }}` placeholders in a template body.\n *\n * This is a pragmatic subset of subconverter's template engine: variables come\n * from the `[template]` section of an external config (or the `template` config\n * block). Unknown variables resolve to an empty string, matching the engine's\n * \"undefined variable\" behavior.\n */\nexport function renderTemplate(content: string, vars: TemplateVars): string {\n return content.replace(INTERPOLATION, (_match, name: string) => vars[name] ?? \"\");\n}\n\n/** `true` when the content contains any `{{ ... }}` placeholder. */\nexport function hasTemplatePlaceholders(content: string): boolean {\n INTERPOLATION.lastIndex = 0;\n return INTERPOLATION.test(content);\n}\n\n/** Collect the variable names referenced by a template body. */\nexport function templateVariableNames(content: string): string[] {\n const names = new Set<string>();\n for (const match of content.matchAll(INTERPOLATION)) {\n names.add(match[1] as string);\n }\n return [...names];\n}\n","import type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport { BalanceStrategy, ProxyGroupType } from \"../types/proxy-group\";\nimport type { RulesetConfig } from \"../types/ruleset\";\nimport type { RegexMatchConfig } from \"../types/settings\";\nimport { parseIni } from \"../utils/ini\";\nimport { startsWith, toInt } from \"../utils/string\";\n\n/** A parsed subconverter external configuration file. */\nexport interface ExternalConfig {\n groups: ProxyGroupConfig[];\n rulesets: RulesetConfig[];\n rename: RegexMatchConfig[];\n emoji: RegexMatchConfig[];\n includeRemarks: string[];\n excludeRemarks: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n enableRuleGenerator: boolean;\n overwriteOriginalRules: boolean;\n baseFiles: Record<string, string>;\n templatePath: string;\n templateVars: Record<string, string>;\n}\n\nconst GROUP_TYPE_MAP: Record<string, ProxyGroupType> = {\n fallback: ProxyGroupType.Fallback,\n \"load-balance\": ProxyGroupType.LoadBalance,\n relay: ProxyGroupType.Relay,\n select: ProxyGroupType.Select,\n smart: ProxyGroupType.Smart,\n ssid: ProxyGroupType.SSID,\n \"url-test\": ProxyGroupType.URLTest,\n};\n\n/** Parse `interval[,timeout[,tolerance]]`, mirroring `parseGroupTimes`. */\nexport function parseGroupTimes(src: string): {\n interval: number;\n timeout: number;\n tolerance: number;\n} {\n const [interval = \"\", timeout = \"\", tolerance = \"\"] = src.split(\",\");\n return {\n interval: toInt(interval),\n timeout: toInt(timeout),\n tolerance: toInt(tolerance),\n };\n}\n\n/** Parse a `name`type`rule...` INI proxy-group definition. */\nexport function parseCustomProxyGroup(value: string): ProxyGroupConfig | undefined {\n const parts = value.split(\"`\");\n if (parts.length < 3) {\n return undefined;\n }\n const name = parts[0] as string;\n const typeName = parts[1] as string;\n const type = GROUP_TYPE_MAP[typeName];\n if (type === undefined) {\n return undefined;\n }\n const group: ProxyGroupConfig = {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name,\n persistent: undefined,\n proxies: [],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 5,\n tolerance: 0,\n type,\n url: \"\",\n usingProvider: [],\n };\n let upperBound = parts.length;\n if (\n type === ProxyGroupType.URLTest ||\n type === ProxyGroupType.LoadBalance ||\n type === ProxyGroupType.Fallback\n ) {\n if (upperBound < 5) {\n return undefined;\n }\n upperBound -= 2;\n group.url = parts[upperBound] as string;\n const times = parseGroupTimes(parts[upperBound + 1] as string);\n group.interval = times.interval;\n group.timeout = times.timeout;\n group.tolerance = times.tolerance;\n }\n for (let i = 2; i < upperBound; i += 1) {\n const rule = parts[i] as string;\n if (startsWith(rule, \"!!PROVIDER=\")) {\n group.usingProvider.push(...rule.slice(11).split(\",\"));\n } else {\n group.proxies.push(rule);\n }\n }\n return group;\n}\n\n/** Parse a `group,url[,interval]` or `group,[]RULE` INI ruleset definition. */\nexport function parseRulesetConfig(value: string): RulesetConfig | undefined {\n const pos = value.indexOf(\",\");\n if (pos === -1) {\n return undefined;\n }\n const group = value.slice(0, pos);\n const config: RulesetConfig = { group, interval: 86400, url: \"\" };\n if (value.slice(pos + 1, pos + 3) === \"[]\") {\n config.url = value.slice(pos + 1);\n return config;\n }\n const endPos = value.lastIndexOf(\",\");\n if (endPos !== pos) {\n config.interval = toInt(value.slice(endPos + 1));\n config.url = value.slice(pos + 1, endPos);\n } else {\n config.url = value.slice(pos + 1);\n }\n return config;\n}\n\n/** Parse a rename/emoji rule using a delimiter (mirrors `from_ini`). */\nexport function parseRegexMatch(value: string, delimiter: string): RegexMatchConfig {\n if (startsWith(value, \"script:\")) {\n return { match: \"\", replace: \"\", script: value.slice(7) };\n }\n const pos = value.lastIndexOf(delimiter);\n const match = pos === -1 ? value : value.slice(0, pos);\n const replace = pos !== -1 && pos < value.length - 1 ? value.slice(pos + 1) : \"\";\n return { match, replace, script: \"\" };\n}\n\n/** Parse a subconverter external configuration file. */\nexport function parseExternalConfig(content: string): ExternalConfig {\n const result: ExternalConfig = {\n addEmoji: false,\n baseFiles: {},\n emoji: [],\n enableRuleGenerator: true,\n excludeRemarks: [],\n groups: [],\n includeRemarks: [],\n overwriteOriginalRules: true,\n removeEmoji: false,\n rename: [],\n rulesets: [],\n templatePath: \"\",\n templateVars: {},\n };\n\n const doc = parseIni(content, { keepEmptyValues: true });\n for (const section of doc.sections) {\n if (section.name.toLowerCase() !== \"template\") {\n continue;\n }\n for (const [key, value] of section.items) {\n if (key.toLowerCase() === \"template_path\") {\n result.templatePath = value;\n } else {\n result.templateVars[key] = value;\n }\n }\n }\n const relevant = doc.sections.filter((section) => section.name.toLowerCase() === \"custom\");\n const sections = relevant.length > 0 ? relevant : [{ items: [...doc.isolated], name: \"custom\" }];\n\n for (const section of sections) {\n for (const [keyRaw, value] of section.items) {\n const key = keyRaw.toLowerCase();\n switch (key) {\n case \"ruleset\": {\n const parsed = parseRulesetConfig(value);\n if (parsed) {\n result.rulesets.push(parsed);\n }\n break;\n }\n case \"custom_proxy_group\": {\n const parsed = parseCustomProxyGroup(value);\n if (parsed) {\n result.groups.push(parsed);\n }\n break;\n }\n case \"rename\":\n case \"rename_node\":\n result.rename.push(parseRegexMatch(value, \"@\"));\n break;\n case \"emoji\":\n case \"emojis\":\n result.emoji.push(parseRegexMatch(value, \",\"));\n break;\n case \"include_remarks\":\n case \"include\":\n if (value !== \"\") {\n result.includeRemarks.push(value);\n }\n break;\n case \"exclude_remarks\":\n case \"exclude\":\n if (value !== \"\") {\n result.excludeRemarks.push(value);\n }\n break;\n case \"add_emoji\":\n result.addEmoji = value.toLowerCase() === \"true\";\n break;\n case \"remove_old_emoji\":\n case \"remove_emoji\":\n result.removeEmoji = value.toLowerCase() === \"true\";\n break;\n case \"enable_rule_generator\":\n result.enableRuleGenerator = value.toLowerCase() !== \"false\";\n break;\n case \"overwrite_original_rules\":\n result.overwriteOriginalRules = value.toLowerCase() !== \"false\";\n break;\n default:\n if (key.endsWith(\"_rule_base\")) {\n result.baseFiles[key] = value;\n }\n break;\n }\n }\n }\n return result;\n}\n","import { parseRegexMatch } from \"./config\";\nimport type { RequestSettings } from \"../types/settings\";\nimport { TargetFormat } from \"../types/settings\";\nimport { parseTriBool, type TriBool } from \"../types/tribool\";\nimport { toInt } from \"../utils/string\";\nimport { getUrlArg } from \"../utils/url\";\n\nconst TARGETS = new Set<string>(Object.values(TargetFormat));\n\nfunction boolArg(query: string, key: string): boolean {\n const value = getUrlArg(query, key).toLowerCase();\n return value === \"true\" || value === \"1\" || value === \"\";\n}\n\nfunction triArg(query: string, key: string): TriBool {\n const value = getUrlArg(query, key);\n return value === \"\" ? undefined : parseTriBool(value);\n}\n\nfunction listArg(query: string, key: string): string[] {\n const value = getUrlArg(query, key);\n return value === \"\" ? [] : value.split(\",\");\n}\n\n/** Base {@link RequestSettings} with subconverter's defaults. */\nexport function createRequestSettings(): RequestSettings {\n return {\n addEmoji: false,\n appendType: false,\n autoExtract: false,\n clashScript: false,\n classicalRuleset: false,\n emoji: [],\n excludeRemarks: [],\n filterDeprecated: false,\n group: [],\n includeRemarks: [],\n insert: false,\n interval: 0,\n list: false,\n mixin: \"\",\n newFieldName: false,\n nodeList: false,\n proxiesStyle: \"flow\",\n proxyGroupsStyle: \"flow\",\n removeEmoji: false,\n rename: [],\n ruleset: [],\n script: \"\",\n scv: undefined,\n sort: false,\n target: TargetFormat.Auto,\n tfo: undefined,\n tls13: undefined,\n udp: undefined,\n uploadPath: \"\",\n url: \"\",\n };\n}\n\n/** Parse a request query string into {@link RequestSettings}. */\nexport function parseRequestSettings(query: string): RequestSettings {\n const settings = createRequestSettings();\n const target = getUrlArg(query, \"target\");\n if (TARGETS.has(target)) {\n settings.target = target as TargetFormat;\n }\n settings.url = getUrlArg(query, \"url\");\n settings.list = boolArg(query, \"list\");\n settings.nodeList = settings.list;\n settings.addEmoji = boolArg(query, \"add_emoji\");\n settings.removeEmoji = boolArg(query, \"remove_emoji\");\n settings.appendType = boolArg(query, \"append_type\");\n settings.filterDeprecated = boolArg(query, \"filter_deprecated\");\n settings.newFieldName = boolArg(query, \"new_name\") || boolArg(query, \"new_field_name\");\n settings.classicalRuleset = boolArg(query, \"classical\");\n settings.insert = getUrlArg(query, \"insert\") !== \"\";\n settings.clashScript = boolArg(query, \"clash_script\");\n settings.autoExtract = boolArg(query, \"auto_extract\");\n settings.tfo = triArg(query, \"tfo\");\n settings.udp = triArg(query, \"udp\");\n settings.scv = triArg(query, \"scv\");\n settings.tls13 = triArg(query, \"tls13\");\n settings.interval = toInt(getUrlArg(query, \"interval\"));\n settings.script = getUrlArg(query, \"script\");\n settings.mixin = getUrlArg(query, \"mixin\");\n settings.uploadPath = getUrlArg(query, \"upload_path\");\n settings.proxiesStyle = getUrlArg(query, \"proxies_style\") || \"flow\";\n settings.proxyGroupsStyle = getUrlArg(query, \"proxy_groups_style\") || \"flow\";\n settings.includeRemarks = listArg(query, \"include\");\n settings.excludeRemarks = listArg(query, \"exclude\");\n const renameRaw = getUrlArg(query, \"rename\");\n if (renameRaw !== \"\") {\n settings.rename = [parseRegexMatch(renameRaw, \"@\")];\n }\n const emojiRaw = getUrlArg(query, \"emoji\");\n if (emojiRaw !== \"\") {\n settings.emoji = [parseRegexMatch(emojiRaw, \",\")];\n }\n return settings;\n}\n","/** Shadowsocks AEAD/stream ciphers recognized by the parser. */\nexport const SS_CIPHERS = [\n \"2022-blake3-aes-128-gcm\",\n \"2022-blake3-aes-256-gcm\",\n \"2022-blake3-chacha20-poly1305\",\n \"2022-blake3-chacha12-poly1305\",\n \"2022-blake3-chacha8-poly1305\",\n \"aes-128-cfb\",\n \"aes-128-ctr\",\n \"aes-128-gcm\",\n \"aes-192-cfb\",\n \"aes-192-ctr\",\n \"aes-192-gcm\",\n \"aes-256-cfb\",\n \"aes-256-ctr\",\n \"aes-256-gcm\",\n \"bf-cfb\",\n \"camellia-128-cfb\",\n \"camellia-192-cfb\",\n \"camellia-256-cfb\",\n \"chacha20\",\n \"chacha20-ietf\",\n \"chacha20-ietf-poly1305\",\n \"rc4-md5\",\n \"salsa20\",\n \"xchacha20-ietf-poly1305\",\n];\n\n/** ShadowsocksR stream ciphers recognized by the parser. */\nexport const SSR_CIPHERS = [\n \"aes-128-cfb\",\n \"aes-128-ctr\",\n \"aes-192-cfb\",\n \"aes-192-ctr\",\n \"aes-256-cfb\",\n \"aes-256-ctr\",\n \"bf-cfb\",\n \"camellia-128-cfb\",\n \"camellia-192-cfb\",\n \"camellia-256-cfb\",\n \"cast5-cfb\",\n \"chacha20\",\n \"chacha20-ietf\",\n \"des-cfb\",\n \"idea-cfb\",\n \"none\",\n \"rc2-cfb\",\n \"rc4\",\n \"rc4-md5\",\n \"salsa20\",\n \"seed-cfb\",\n \"table\",\n];\n\n/** `true` when `cipher` is a Shadowsocks cipher. */\nexport function isSsCipher(cipher: string): boolean {\n return SS_CIPHERS.includes(cipher.toLowerCase());\n}\n\n/**\n * True when an SSR node can be flattened to plain Shadowsocks: a known SS\n * cipher with no meaningful obfs/protocol. Mirrors subparser.cpp:713.\n */\nexport function isFlattenableSsr(method: string, obfs: string, protocol: string): boolean {\n return (\n isSsCipher(method) &&\n (obfs === \"\" || obfs === \"plain\") &&\n (protocol === \"\" || protocol === \"origin\")\n );\n}\n","import type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { base64Decode } from \"../utils/base64\";\nimport { isIpv4, isIpv6, toInt, trim } from \"../utils/string\";\n\nfunction commonConstruct(\n node: Proxy,\n type: ProxyType,\n group: string,\n remark: string,\n server: string,\n port: string | number,\n udp: TriBool,\n tfo: TriBool,\n scv: TriBool,\n tls13: TriBool,\n underlyingProxy: string,\n): void {\n node.type = type;\n node.group = group;\n node.remark = remark;\n node.hostname = server;\n node.underlyingProxy = underlyingProxy;\n node.port = toInt(port);\n node.udp = udp;\n node.tcpFastOpen = tfo;\n node.allowInsecure = scv;\n node.tls13 = tls13;\n}\n\nexport interface VmessOptions {\n group: string;\n remark: string;\n add: string;\n port: string | number;\n type?: string;\n id?: string;\n aid?: string | number;\n net?: string;\n cipher?: string;\n path?: string;\n host?: string;\n edge?: string;\n tls?: string;\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a VMess node. Mirrors subparser.cpp `vmessConstruct`. */\nexport function vmessConstruct(node: Proxy, options: VmessOptions): void {\n const {\n add,\n aid = 0,\n cipher = \"\",\n edge = \"\",\n group,\n host = \"\",\n id = \"\",\n net = \"\",\n path = \"\",\n port,\n remark,\n scv,\n sni = \"\",\n tfo,\n tls = \"\",\n tls13,\n type = \"\",\n udp,\n underlyingProxy = \"\",\n } = options;\n\n commonConstruct(\n node,\n ProxyType.VMess,\n group,\n remark,\n add,\n port,\n udp,\n tfo,\n scv,\n tls13,\n underlyingProxy,\n );\n node.userId = id === \"\" ? \"00000000-0000-0000-0000-000000000000\" : id;\n node.alterId = toInt(aid);\n node.encryptMethod = cipher;\n node.transferProtocol = net === \"\" ? \"tcp\" : net;\n node.edge = edge;\n node.serverName = sni;\n\n if (net === \"quic\") {\n node.quicSecure = host;\n node.quicSecret = path;\n } else {\n node.host = host === \"\" && !isIpv4(add) && !isIpv6(add) ? add : trim(host);\n node.path = path === \"\" ? \"/\" : trim(path);\n }\n node.fakeType = type;\n node.tlsSecure = tls === \"tls\";\n}\n\nexport interface SsrOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n protocol: string;\n method: string;\n obfs: string;\n password: string;\n obfsParam?: string;\n protocolParam?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a ShadowsocksR node. Mirrors `ssrConstruct`. */\nexport function ssrConstruct(node: Proxy, options: SsrOptions): void {\n commonConstruct(\n node,\n ProxyType.ShadowsocksR,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.encryptMethod = options.method;\n node.protocol = options.protocol;\n node.protocolParam = options.protocolParam ?? \"\";\n node.obfs = options.obfs;\n node.obfsParam = options.obfsParam ?? \"\";\n}\n\nexport interface SsOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n method: string;\n plugin?: string;\n pluginOption?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Shadowsocks node. Mirrors `ssConstruct`. */\nexport function ssConstruct(node: Proxy, options: SsOptions): void {\n commonConstruct(\n node,\n ProxyType.Shadowsocks,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.encryptMethod = options.method;\n node.plugin = options.plugin ?? \"\";\n node.pluginOption = options.pluginOption ?? \"\";\n}\n\nexport interface SocksOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n username?: string;\n password?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a SOCKS5 node. Mirrors `socksConstruct`. */\nexport function socksConstruct(node: Proxy, options: SocksOptions): void {\n commonConstruct(\n node,\n ProxyType.SOCKS5,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.username = options.username ?? \"\";\n node.password = options.password ?? \"\";\n}\n\nexport interface HttpOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n username?: string;\n password?: string;\n tls: boolean;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build an HTTP/HTTPS node. Mirrors `httpConstruct`. */\nexport function httpConstruct(node: Proxy, options: HttpOptions): void {\n commonConstruct(\n node,\n options.tls ? ProxyType.HTTPS : ProxyType.HTTP,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.username = options.username ?? \"\";\n node.password = options.password ?? \"\";\n node.tlsSecure = options.tls;\n}\n\nexport interface TrojanOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n network?: string;\n host?: string;\n path?: string;\n tlsSecure?: boolean;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n sni?: string;\n underlyingProxy?: string;\n}\n\n/** Build a Trojan node. Mirrors `trojanConstruct`. */\nexport function trojanConstruct(node: Proxy, options: TrojanOptions): void {\n commonConstruct(\n node,\n ProxyType.Trojan,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.host = options.host ?? \"\";\n node.tlsSecure = options.tlsSecure ?? true;\n node.transferProtocol =\n options.network === undefined || options.network === \"\" ? \"tcp\" : options.network;\n node.path = options.path ?? \"\";\n node.serverName = options.sni ?? \"\";\n}\n\nexport interface SnellOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n obfs?: string;\n host?: string;\n version?: number;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Snell node. Mirrors `snellConstruct`. */\nexport function snellConstruct(node: Proxy, options: SnellOptions): void {\n commonConstruct(\n node,\n ProxyType.Snell,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.obfs = options.obfs ?? \"\";\n node.host = options.host ?? \"\";\n node.snellVersion = options.version ?? 0;\n}\n\nexport interface AnyTlsOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build an AnyTLS node. Mirrors `anyTLSConstruct`. */\nexport function anyTlsConstruct(node: Proxy, options: AnyTlsOptions): void {\n commonConstruct(\n node,\n ProxyType.AnyTLS,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.password = options.password;\n node.sni = options.sni ?? \"\";\n}\n\nexport interface WireGuardOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n selfIp?: string;\n selfIpv6?: string;\n privateKey?: string;\n publicKey?: string;\n preSharedKey?: string;\n dnsServers?: string[];\n mtu?: string | number;\n keepAlive?: string | number;\n testUrl?: string;\n clientId?: string;\n udp?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a WireGuard node. Mirrors `wireguardConstruct`. */\nexport function wireGuardConstruct(node: Proxy, options: WireGuardOptions): void {\n commonConstruct(\n node,\n ProxyType.WireGuard,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n undefined,\n undefined,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.selfIp = options.selfIp ?? \"\";\n node.selfIpv6 = options.selfIpv6 ?? \"\";\n node.privateKey = options.privateKey ?? \"\";\n node.publicKey = options.publicKey ?? \"\";\n node.preSharedKey = options.preSharedKey ?? \"\";\n node.dnsServers = options.dnsServers ?? [];\n node.mtu = toInt(options.mtu);\n node.keepAlive = toInt(options.keepAlive);\n node.testUrl = options.testUrl ?? \"\";\n node.clientId = options.clientId ?? \"\";\n}\n\nexport interface HysteriaOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n ports?: string;\n protocol?: string;\n obfsProtocol?: string;\n up?: string;\n upSpeed?: string;\n down?: string;\n downSpeed?: string;\n auth?: string;\n authStr?: string;\n obfs?: string;\n sni?: string;\n fingerprint?: string;\n ca?: string;\n caStr?: string;\n recvWindowConn?: string | number;\n recvWindow?: string | number;\n disableMtuDiscovery?: string;\n hopInterval?: string | number;\n alpn?: string;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Hysteria (v1) node. Mirrors `hysteriaConstruct`. */\nexport function hysteriaConstruct(node: Proxy, options: HysteriaOptions): void {\n commonConstruct(\n node,\n ProxyType.Hysteria,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.ports = options.ports ?? \"\";\n node.protocol = options.protocol ?? \"\";\n node.obfsParam = options.obfsProtocol ?? \"\";\n\n const up = options.up ?? \"\";\n if (up !== \"\") {\n if (up.length > 4 && up.endsWith(\"bps\")) {\n node.up = up;\n } else if (toInt(up)) {\n node.upSpeed = toInt(up);\n node.up = `${up} Mbps`;\n }\n }\n if (options.upSpeed) {\n node.upSpeed = toInt(options.upSpeed);\n }\n const down = options.down ?? \"\";\n if (down !== \"\") {\n if (down.length > 4 && down.endsWith(\"bps\")) {\n node.down = down;\n } else if (toInt(down)) {\n node.downSpeed = toInt(down);\n node.down = `${down} Mbps`;\n }\n }\n if (options.downSpeed) {\n node.downSpeed = toInt(options.downSpeed);\n }\n\n node.authStr = options.authStr ?? \"\";\n if (options.auth) {\n node.authStr = base64Decode(options.auth);\n }\n node.tlsSecure = true;\n node.obfs = options.obfs ?? \"\";\n node.sni = options.sni ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n node.ca = options.ca ?? \"\";\n node.caStr = options.caStr ?? \"\";\n node.recvWindowConn = toInt(options.recvWindowConn);\n node.recvWindow = toInt(options.recvWindow);\n node.disableMtuDiscovery = options.disableMtuDiscovery\n ? options.disableMtuDiscovery === \"true\"\n : undefined;\n node.hopInterval = toInt(options.hopInterval);\n if (options.alpn) {\n node.alpn = [options.alpn];\n }\n}\n\nexport interface Hysteria2Options {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n ports?: string;\n up?: string;\n down?: string;\n password?: string;\n obfs?: string;\n obfsPassword?: string;\n sni?: string;\n fingerprint?: string;\n alpn?: string;\n ca?: string;\n caStr?: string;\n cwnd?: string | number;\n hopInterval?: string | number;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Hysteria2 node. Mirrors `hysteria2Construct`. */\nexport function hysteria2Construct(node: Proxy, options: Hysteria2Options): void {\n commonConstruct(\n node,\n ProxyType.Hysteria2,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.upSpeed = toInt(options.up);\n node.downSpeed = toInt(options.down);\n node.ports = options.ports ?? \"\";\n node.password = options.password ?? \"\";\n node.obfs = options.obfs ?? \"\";\n node.obfsParam = options.obfsPassword ?? \"\";\n node.sni = options.sni ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n if (options.alpn) {\n node.alpn = [options.alpn];\n }\n node.ca = options.ca ?? \"\";\n node.caStr = options.caStr ?? \"\";\n node.cwnd = toInt(options.cwnd);\n node.hopInterval = toInt(options.hopInterval);\n}\n\nexport interface VlessOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n userId: string;\n flow?: string;\n encryption?: string;\n network?: string;\n tls?: string;\n sni?: string;\n host?: string;\n path?: string;\n fingerprint?: string;\n alpn?: string[];\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a VLESS node. */\nexport function vlessConstruct(node: Proxy, options: VlessOptions): void {\n commonConstruct(\n node,\n ProxyType.VLESS,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.userId = options.userId;\n node.flow = options.flow ?? \"\";\n node.encryptMethod = options.encryption ?? \"none\";\n node.transferProtocol =\n options.network === undefined || options.network === \"\" ? \"tcp\" : options.network;\n node.tlsSecure = options.tls === \"tls\" || options.tls === \"reality\";\n node.serverName = options.sni ?? \"\";\n node.host = options.host ?? \"\";\n node.path = options.path ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n if (options.alpn) {\n node.alpn = options.alpn;\n }\n}\n\nexport interface TuicOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n userId: string;\n password: string;\n congestionControl?: string;\n alpn?: string[];\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a TUIC node. */\nexport function tuicConstruct(node: Proxy, options: TuicOptions): void {\n commonConstruct(\n node,\n ProxyType.TUIC,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.userId = options.userId;\n node.password = options.password;\n node.congestionControl = options.congestionControl ?? \"\";\n node.serverName = options.sni ?? \"\";\n if (options.alpn) {\n node.alpn = options.alpn;\n }\n}\n","import { isFlattenableSsr } from \"./ciphers\";\nimport {\n httpConstruct,\n snellConstruct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n vmessConstruct,\n} from \"./construct\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS } from \"../types/proxy\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { toInt } from \"../utils/string\";\n\nfunction tri(value: unknown): boolean | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n return String(value).toLowerCase() === \"true\";\n}\n\nfunction str(value: unknown): string {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\n/** Parse a `Netch://<base64 json>` link into `node`. */\nexport function explodeNetch(netch: string, node: Proxy): void {\n let data: any;\n try {\n data = JSON.parse(urlSafeBase64Decode(netch.slice(8)));\n } catch {\n return;\n }\n if (data === null || typeof data !== \"object\") {\n return;\n }\n const type = str(data.Type);\n const group = str(data.Group);\n let remark = str(data.Remark);\n const address = str(data.Hostname);\n const udp = tri(data.EnableUDP);\n const tfo = tri(data.EnableTFO);\n const scv = tri(data.AllowInsecure);\n const port = str(data.Port);\n if (port === \"0\" || port === \"\") {\n return;\n }\n const method = str(data.EncryptMethod);\n const password = str(data.Password);\n if (remark === \"\") {\n remark = `${address}:${port}`;\n }\n\n switch (type) {\n case \"SS\":\n ssConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ss : group,\n method,\n password,\n plugin: str(data.Plugin),\n pluginOption: str(data.PluginOption),\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n break;\n case \"SSR\": {\n const protocol = str(data.Protocol);\n const obfs = str(data.OBFS);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ss : group,\n method,\n password,\n plugin: str(data.Plugin),\n pluginOption: str(data.PluginOption),\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n } else {\n ssrConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ssr : group,\n method,\n obfs,\n obfsParam: str(data.OBFSParam),\n password,\n port,\n protocol,\n protocolParam: str(data.ProtocolParam),\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n }\n break;\n }\n case \"VMess\":\n vmessConstruct(node, {\n add: address,\n aid: str(data.AlterID),\n cipher: method,\n edge: str(data.Edge),\n group: group === \"\" ? DEFAULT_GROUPS.v2ray : group,\n host: str(data.Host),\n id: str(data.UserID),\n net: str(data.TransferProtocol),\n path: str(data.Path),\n port,\n remark,\n scv,\n sni: str(data.ServerName),\n tfo,\n tls: str(data.TLSSecure),\n type: str(data.FakeType),\n udp,\n });\n break;\n case \"Socks5\":\n socksConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.socks : group,\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n username: str(data.Username),\n });\n break;\n case \"HTTP\":\n case \"HTTPS\":\n httpConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.http : group,\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n tls: type === \"HTTPS\",\n });\n break;\n case \"Trojan\":\n trojanConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.trojan : group,\n host: str(data.Host),\n network: str(data.TransferProtocol),\n password,\n path: str(data.Path),\n port,\n remark,\n scv,\n server: address,\n tfo,\n tlsSecure: str(data.TLSSecure) === \"true\",\n udp,\n });\n break;\n case \"Snell\":\n snellConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.snell : group,\n host: str(data.Host),\n obfs: str(data.OBFS),\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n version: toInt(str(data.SnellVersion)),\n });\n break;\n default:\n break;\n }\n}\n","import { parse as parseYaml } from \"yaml\";\n\nimport { isFlattenableSsr } from \"./ciphers\";\nimport {\n anyTlsConstruct,\n httpConstruct,\n hysteria2Construct,\n hysteriaConstruct,\n snellConstruct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n tuicConstruct,\n vlessConstruct,\n vmessConstruct,\n wireGuardConstruct,\n} from \"./construct\";\nimport { explodeNetch } from \"./netch\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS, createProxy } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { base64Encode } from \"../utils/base64\";\nimport { split, toInt, trim } from \"../utils/string\";\n\nfunction asString(value: unknown): string {\n if (value === undefined || value === null) {\n return \"\";\n }\n return String(value);\n}\n\nfunction asBool(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n return asString(value).toLowerCase() === \"true\";\n}\n\nfunction asTri(value: unknown): TriBool {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n return asBool(value);\n}\n\nfunction get(obj: any, key: string | number): unknown {\n return obj !== null && typeof obj === \"object\" ? obj[key] : undefined;\n}\n\n/** Parse a Clash `proxies:` list into normalized nodes. */\nexport function explodeClash(root: any, nodes: Proxy[]): void {\n const section = get(root, \"proxies\") !== undefined ? \"proxies\" : \"Proxy\";\n const list = get(root, section) as any[] | undefined;\n if (!Array.isArray(list)) {\n return;\n }\n let index = nodes.length;\n\n for (const single of list) {\n const proxyType = asString(get(single, \"type\")).toLowerCase();\n const ps = asString(get(single, \"name\"));\n const server = asString(get(single, \"server\"));\n const port = asString(get(single, \"port\"));\n let underlyingProxy = asString(get(single, \"underlying-proxy\"));\n if (underlyingProxy === \"\") {\n underlyingProxy = asString(get(single, \"dialer-proxy\"));\n }\n if (port === \"\" || port === \"0\") {\n continue;\n }\n const udp = asTri(get(single, \"udp\"));\n const tfo = asTri(get(single, \"fast-open\"));\n const scv = asTri(get(single, \"skip-cert-verify\"));\n const node = createProxy();\n let group = \"\";\n\n switch (proxyType) {\n case \"vmess\": {\n group = DEFAULT_GROUPS.v2ray;\n const id = asString(get(single, \"uuid\"));\n const aid = asString(get(single, \"alterId\"));\n const cipher = asString(get(single, \"cipher\"));\n const net = get(single, \"network\") !== undefined ? asString(get(single, \"network\")) : \"tcp\";\n const sni = asString(get(single, \"servername\"));\n let path = \"\";\n let host = \"\";\n let edge = \"\";\n switch (net) {\n case \"http\":\n path = asString(get(get(get(single, \"http-opts\"), \"path\"), 0));\n host = asString(get(get(get(get(single, \"http-opts\"), \"headers\"), \"Host\"), 0));\n edge = \"\";\n break;\n case \"ws\":\n if (get(single, \"ws-opts\") !== undefined) {\n const wsOpts = get(single, \"ws-opts\");\n path = get(wsOpts, \"path\") !== undefined ? asString(get(wsOpts, \"path\")) : \"/\";\n host = asString(get(get(wsOpts, \"headers\"), \"Host\"));\n edge = asString(get(get(wsOpts, \"headers\"), \"Edge\"));\n } else {\n path = get(single, \"ws-path\") !== undefined ? asString(get(single, \"ws-path\")) : \"/\";\n host = asString(get(get(single, \"ws-headers\"), \"Host\"));\n edge = asString(get(get(single, \"ws-headers\"), \"Edge\"));\n }\n break;\n case \"h2\":\n path = asString(get(get(single, \"h2-opts\"), \"path\"));\n host = asString(get(get(get(single, \"h2-opts\"), \"host\"), 0));\n edge = \"\";\n break;\n case \"grpc\":\n host = asString(get(single, \"servername\"));\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n edge = \"\";\n break;\n default:\n break;\n }\n const tls = asBool(get(single, \"tls\")) ? \"tls\" : \"\";\n vmessConstruct(node, {\n add: server,\n aid,\n cipher,\n edge,\n group,\n host,\n id,\n net,\n path,\n port,\n remark: ps,\n scv,\n sni,\n tfo,\n tls,\n type: \"\",\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"ss\": {\n group = DEFAULT_GROUPS.ss;\n let cipher = asString(get(single, \"cipher\"));\n const password = asString(get(single, \"password\"));\n let plugin = \"\";\n let pluginOption = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let pluginMux = \"\";\n let pluginTls = \"\";\n let path = \"\";\n if (get(single, \"plugin\") !== undefined) {\n const pluginName = asString(get(single, \"plugin\")).toLowerCase();\n const pluginOpts = get(single, \"plugin-opts\");\n if (pluginName === \"obfs\") {\n plugin = \"obfs-local\";\n pluginMode = asString(get(pluginOpts, \"mode\"));\n pluginHost = asString(get(pluginOpts, \"host\"));\n } else if (pluginName === \"v2ray-plugin\") {\n plugin = \"v2ray-plugin\";\n pluginMode = asString(get(pluginOpts, \"mode\"));\n pluginHost = asString(get(pluginOpts, \"host\"));\n pluginTls = asBool(get(pluginOpts, \"tls\")) ? \"tls;\" : \"\";\n path = asString(get(pluginOpts, \"path\"));\n pluginMux = asBool(get(pluginOpts, \"mux\")) ? \"mux=4;\" : \"\";\n }\n } else if (get(single, \"obfs\") !== undefined) {\n plugin = \"obfs-local\";\n pluginMode = asString(get(single, \"obfs\"));\n pluginHost = asString(get(single, \"obfs-host\"));\n }\n if (plugin === \"simple-obfs\" || plugin === \"obfs-local\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n } else if (plugin === \"v2ray-plugin\") {\n pluginOption = `mode=${pluginMode};${pluginTls}${pluginMux}`;\n if (pluginHost !== \"\") {\n pluginOption += `host=${pluginHost};`;\n }\n if (path !== \"\") {\n pluginOption += `path=${path};`;\n }\n if (pluginMux !== \"\") {\n pluginOption += `mux=${pluginMux};`;\n }\n }\n if (cipher === \"AEAD_CHACHA20_POLY1305\") {\n cipher = \"chacha20-ietf-poly1305\";\n } else if (cipher.includes(\"AEAD\")) {\n cipher = cipher.replace(/AEAD_/g, \"\").replace(/_/g, \"-\").toLowerCase();\n }\n ssConstruct(node, {\n group,\n method: cipher,\n password,\n plugin,\n pluginOption,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"socks5\": {\n group = DEFAULT_GROUPS.socks;\n const user = asString(get(single, \"username\"));\n const password = asString(get(single, \"password\"));\n socksConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n server,\n underlyingProxy,\n username: user,\n });\n break;\n }\n case \"ssr\": {\n group = DEFAULT_GROUPS.ssr;\n let cipher = asString(get(single, \"cipher\"));\n if (cipher === \"dummy\") {\n cipher = \"none\";\n }\n const password = asString(get(single, \"password\"));\n const protocol = asString(get(single, \"protocol\"));\n const obfs = asString(get(single, \"obfs\"));\n const protocolParam =\n get(single, \"protocol-param\") !== undefined\n ? asString(get(single, \"protocol-param\"))\n : asString(get(single, \"protocolparam\"));\n const obfsParam =\n get(single, \"obfs-param\") !== undefined\n ? asString(get(single, \"obfs-param\"))\n : asString(get(single, \"obfsparam\"));\n ssrConstruct(node, {\n group,\n method: cipher,\n obfs,\n obfsParam,\n password,\n port,\n protocol,\n protocolParam,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"http\": {\n group = DEFAULT_GROUPS.http;\n const user = asString(get(single, \"username\"));\n const password = asString(get(single, \"password\"));\n const tls = asString(get(single, \"tls\"));\n httpConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n tls: tls === \"true\",\n underlyingProxy,\n username: user,\n });\n break;\n }\n case \"trojan\": {\n group = DEFAULT_GROUPS.trojan;\n const password = asString(get(single, \"password\"));\n const host = asString(get(single, \"sni\"));\n let net = asString(get(single, \"network\"));\n let path = \"\";\n switch (net) {\n case \"grpc\":\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n break;\n case \"ws\":\n path = asString(get(get(single, \"ws-opts\"), \"path\"));\n break;\n default:\n net = \"tcp\";\n path = \"\";\n break;\n }\n trojanConstruct(node, {\n group,\n host,\n network: net,\n password,\n path,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n tlsSecure: true,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"snell\": {\n group = DEFAULT_GROUPS.snell;\n const password = asString(get(single, \"psk\"));\n const obfs = asString(get(get(single, \"obfs-opts\"), \"mode\"));\n const host = asString(get(get(single, \"obfs-opts\"), \"host\"));\n const version = asString(get(single, \"version\"));\n snellConstruct(node, {\n group,\n host,\n obfs,\n password,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n version: toInt(version),\n });\n break;\n }\n case \"wireguard\": {\n group = DEFAULT_GROUPS.wireguard;\n const publicKey = asString(get(single, \"public-key\"));\n const privateKey = asString(get(single, \"private-key\"));\n const dns = get(single, \"dns\");\n const dnsServers = Array.isArray(dns)\n ? dns.map((d) => String(d))\n : dns\n ? [String(dns)]\n : [];\n const mtu = asString(get(single, \"mtu\"));\n const psk = asString(get(single, \"preshared-key\"));\n const ip = asString(get(single, \"ip\"));\n const ipv6 = asString(get(single, \"ipv6\"));\n wireGuardConstruct(node, {\n dnsServers,\n group,\n keepAlive: \"0\",\n mtu,\n port,\n preSharedKey: psk,\n privateKey,\n publicKey,\n remark: ps,\n selfIp: ip,\n selfIpv6: ipv6,\n server,\n testUrl: \"\",\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"hysteria\": {\n group = DEFAULT_GROUPS.hysteria;\n const ports = asString(get(single, \"ports\"));\n const protocol = asString(get(single, \"protocol\"));\n const obfsProtocol = asString(get(single, \"obfs-protocol\"));\n const up = asString(get(single, \"up\"));\n const upSpeed = asString(get(single, \"up-speed\"));\n const down = asString(get(single, \"down\"));\n const downSpeed = asString(get(single, \"down-speed\"));\n const auth = asString(get(single, \"auth\"));\n let authStr = asString(get(single, \"auth-str\"));\n if (authStr === \"\") {\n authStr = asString(get(single, \"auth_str\"));\n }\n const obfs = asString(get(single, \"obfs\"));\n const sni = asString(get(single, \"sni\"));\n const fingerprint = asString(get(single, \"fingerprint\"));\n const alpnValue = get(single, \"alpn\");\n const alpn = Array.isArray(alpnValue) ? asString(alpnValue[0]) : asString(alpnValue);\n const ca = asString(get(single, \"ca\"));\n const caStr = asString(get(single, \"ca-str\"));\n const recvWindowConn = asString(get(single, \"recv-window-conn\"));\n const recvWindow = asString(get(single, \"recv-window\"));\n let disableMtuDiscovery = asString(get(single, \"disable-mtu-discovery\"));\n if (disableMtuDiscovery === \"\") {\n disableMtuDiscovery = asString(get(single, \"disable_mtu_discovery\"));\n }\n const hopInterval = asString(get(single, \"hop-interval\"));\n hysteriaConstruct(node, {\n alpn,\n auth,\n authStr,\n ca,\n caStr,\n disableMtuDiscovery,\n down,\n downSpeed,\n fingerprint,\n group,\n hopInterval,\n obfs,\n obfsProtocol,\n port,\n ports,\n protocol,\n recvWindow,\n recvWindowConn,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n underlyingProxy,\n up,\n upSpeed,\n });\n break;\n }\n case \"hysteria2\": {\n group = DEFAULT_GROUPS.hysteria2;\n const ports = asString(get(single, \"ports\"));\n const up = asString(get(single, \"up\"));\n const down = asString(get(single, \"down\"));\n let password = asString(get(single, \"password\"));\n if (password === \"\") {\n password = asString(get(single, \"auth\"));\n }\n const obfs = asString(get(single, \"obfs\"));\n const obfsPassword = asString(get(single, \"obfs-password\"));\n const sni = asString(get(single, \"sni\"));\n const fingerprint = asString(get(single, \"fingerprint\"));\n const alpnValue = get(single, \"alpn\");\n const alpn = Array.isArray(alpnValue) ? asString(alpnValue[0]) : asString(alpnValue);\n const ca = asString(get(single, \"ca\"));\n const caStr = asString(get(single, \"ca-str\"));\n const cwnd = asString(get(single, \"cwnd\"));\n const hopInterval = asString(get(single, \"hop-interval\"));\n hysteria2Construct(node, {\n alpn,\n ca,\n caStr,\n cwnd,\n down,\n fingerprint,\n group,\n hopInterval,\n obfs,\n obfsPassword,\n password,\n port,\n ports,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n underlyingProxy,\n up,\n });\n break;\n }\n case \"anytls\": {\n group = DEFAULT_GROUPS.anytls;\n const password = asString(get(single, \"password\"));\n const sni = asString(get(single, \"sni\"));\n anyTlsConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"vless\": {\n group = DEFAULT_GROUPS.v2ray;\n const userId = asString(get(single, \"uuid\"));\n const net = asString(get(single, \"network\"));\n const tls = asString(get(single, \"tls\"));\n let path = \"\";\n let host = \"\";\n if (net === \"ws\") {\n path = asString(get(get(single, \"ws-opts\"), \"path\"));\n host = asString(get(get(get(single, \"ws-opts\"), \"headers\"), \"Host\"));\n } else if (net === \"grpc\") {\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n }\n const alpnValue = get(single, \"alpn\");\n vlessConstruct(node, {\n alpn: Array.isArray(alpnValue) ? alpnValue.map((a) => String(a)) : undefined,\n encryption: asString(get(single, \"encryption\")),\n fingerprint: asString(get(single, \"client-fingerprint\")),\n flow: asString(get(single, \"flow\")),\n group,\n host,\n network: net,\n path,\n port,\n remark: ps,\n scv,\n server,\n sni: asString(get(single, \"servername\")),\n tfo,\n tls: tls === \"true\" ? \"tls\" : \"\",\n udp,\n underlyingProxy,\n userId,\n });\n break;\n }\n case \"tuic\": {\n group = DEFAULT_GROUPS.v2ray;\n const alpnValue = get(single, \"alpn\");\n tuicConstruct(node, {\n alpn: Array.isArray(alpnValue) ? alpnValue.map((a) => String(a)) : undefined,\n congestionControl: asString(get(single, \"congestion-controller\")),\n group,\n password: asString(get(single, \"password\")),\n port,\n remark: ps,\n scv,\n server,\n sni: asString(get(single, \"sni\")),\n tfo,\n udp,\n underlyingProxy,\n userId: asString(get(single, \"uuid\")),\n });\n break;\n }\n default:\n continue;\n }\n\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Split INI-style text into ordered sections with their raw lines. */\nfunction parseRawSections(text: string): Array<{ name: string; lines: string[] }> {\n const sections: Array<{ name: string; lines: string[] }> = [];\n const isolated: string[] = [];\n let current: { name: string; lines: string[] } | undefined;\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n const header = /^\\[(.*)\\]$/.exec(line);\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line === \"\" || line.startsWith(\"#\") || line.startsWith(\";\")) {\n continue;\n }\n if (current) {\n current.lines.push(line);\n } else {\n isolated.push(line);\n }\n }\n if (isolated.length > 0) {\n sections.unshift({ lines: isolated, name: \"Proxy\" });\n }\n return sections;\n}\n\nfunction getRawSection(sections: Array<{ name: string; lines: string[] }>, name: string): string[] {\n const lines: string[] = [];\n for (const section of sections) {\n if (section.name === name) {\n lines.push(...section.lines);\n }\n }\n return lines;\n}\n\nfunction collectKeyValues(\n lines: string[],\n startIndex: number,\n sink: { [key: string]: string },\n): void {\n for (let i = startIndex; i < lines.length; i += 1) {\n const line = trim(lines[i] as string);\n const eq = line.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n sink[trim(line.slice(0, eq))] = trim(line.slice(eq + 1));\n }\n}\n\n/** Parse a Surge/Loon `[Proxy]` configuration into nodes. */\nexport function explodeSurge(surge: string, nodes: Proxy[]): boolean {\n let text = surge;\n if (text.includes(\"[Proxy]\")) {\n text = text.replace(/^[\\s\\S]*?\\[/, \"[\");\n }\n const sections = parseRawSections(text);\n const proxyLines = getRawSection(sections, \"Proxy\");\n if (proxyLines.length === 0) {\n return false;\n }\n const startCount = nodes.length;\n let index = nodes.length;\n\n for (const line of proxyLines) {\n const match = /^(.*?)\\s*=\\s*(.*)$/.exec(line);\n if (!match) {\n continue;\n }\n const remark = match[1] as string;\n const config = match[2] as string;\n const configs = split(config, \",\");\n if (configs.length < 3) {\n continue;\n }\n const node = createProxy();\n let server = \"\";\n let port = \"\";\n let method = \"\";\n let username = \"\";\n let password = \"\";\n let plugin = \"\";\n let pluginOption = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let id = \"\";\n let net = \"tcp\";\n let tls = \"\";\n let host = \"\";\n let edge = \"\";\n let path = \"\";\n let version = \"\";\n let aead = \"1\";\n let udp: TriBool;\n let tfo: TriBool;\n let scv: TriBool;\n let tls13: TriBool;\n\n switch ((configs[0] as string).toLowerCase()) {\n case \"direct\":\n case \"reject\":\n case \"reject-tinygif\":\n continue;\n case \"custom\": {\n if (configs.length < 5) {\n continue;\n }\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n method = trim(configs[3] as string);\n password = trim(configs[4] as string);\n for (let i = 6; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"obfs\") {\n plugin = \"simple-obfs\";\n pluginMode = itemVal;\n } else if (itemName === \"obfs-host\") {\n pluginHost = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n }\n }\n if (plugin !== \"\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n }\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n });\n break;\n }\n case \"ss\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"encrypt-method\") {\n method = itemVal;\n } else if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"obfs\") {\n plugin = \"simple-obfs\";\n pluginMode = itemVal;\n } else if (itemName === \"obfs-host\") {\n pluginHost = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n }\n }\n if (plugin !== \"\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n }\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n });\n break;\n }\n case \"socks5\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n if (configs.length >= 5) {\n username = trim(configs[3] as string);\n password = trim(configs[4] as string);\n }\n for (let i = 5; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n socksConstruct(node, {\n group: DEFAULT_GROUPS.socks,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n username,\n });\n break;\n }\n case \"vmess\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n net = \"tcp\";\n method = \"auto\";\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n switch (itemName) {\n case \"username\":\n id = itemVal;\n break;\n case \"ws\":\n net = itemVal === \"true\" ? \"ws\" : \"tcp\";\n break;\n case \"tls\":\n tls = itemVal === \"true\" ? \"tls\" : \"\";\n break;\n case \"ws-path\":\n path = itemVal;\n break;\n case \"obfs-host\":\n host = itemVal;\n break;\n case \"ws-headers\": {\n const headers = split(itemVal, \"|\");\n for (const header of headers) {\n const kv = split(trim(header), \":\");\n if (kv.length !== 2) {\n continue;\n }\n if (/host/i.test(kv[0] as string)) {\n host = trimQuote(kv[1] as string);\n } else if (/edge/i.test(kv[0] as string)) {\n edge = trimQuote(kv[1] as string);\n }\n }\n break;\n }\n case \"udp-relay\":\n udp = asTri(itemVal);\n break;\n case \"tfo\":\n tfo = asTri(itemVal);\n break;\n case \"skip-cert-verify\":\n scv = asTri(itemVal);\n break;\n case \"tls13\":\n tls13 = asTri(itemVal);\n break;\n case \"vmess-aead\":\n aead = itemVal === \"true\" ? \"0\" : \"1\";\n break;\n default:\n break;\n }\n }\n vmessConstruct(node, {\n add: server,\n aid: aead,\n cipher: method,\n edge,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n scv,\n tfo,\n tls,\n tls13,\n udp,\n });\n break;\n }\n case \"http\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"username\") {\n username = itemVal;\n } else if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n httpConstruct(node, {\n group: DEFAULT_GROUPS.http,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n tls: false,\n username,\n });\n break;\n }\n case \"trojan\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"sni\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n trojanConstruct(node, {\n group: DEFAULT_GROUPS.trojan,\n host,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n tlsSecure: true,\n udp,\n });\n break;\n }\n case \"snell\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"psk\") {\n password = itemVal;\n } else if (itemName === \"obfs\") {\n plugin = itemVal;\n } else if (itemName === \"obfs-host\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n } else if (itemName === \"version\") {\n version = itemVal;\n }\n }\n snellConstruct(node, {\n group: DEFAULT_GROUPS.snell,\n host,\n obfs: plugin,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n version: toInt(version),\n });\n break;\n }\n case \"wireguard\": {\n let section = \"\";\n let testUrl = \"\";\n for (let i = 1; i < configs.length; i += 1) {\n const vArray = split(trim(configs[i] as string), \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"section-name\") {\n section = itemVal;\n } else if (itemName === \"test-url\") {\n testUrl = itemVal;\n }\n }\n if (section === \"\") {\n continue;\n }\n const wgLines = getRawSection(sections, `WireGuard ${section}`);\n if (wgLines.length === 0) {\n continue;\n }\n const wg: { [key: string]: string } = {};\n collectKeyValues(wgLines, 0, wg);\n const dnsServers: string[] = [];\n if (wg[\"dns-server\"]) {\n for (const dns of split(wg[\"dns-server\"], \",\")) {\n dnsServers.push(trim(dns));\n }\n }\n wireGuardConstruct(node, {\n dnsServers,\n group: DEFAULT_GROUPS.wireguard,\n keepAlive: wg[\"keepalive\"] ?? \"\",\n mtu: wg[\"mtu\"] ?? \"\",\n port: \"0\",\n privateKey: wg[\"private-key\"] ?? \"\",\n remark,\n selfIp: wg[\"self-ip\"] ?? \"\",\n selfIpv6: wg[\"self-ip-v6\"] ?? \"\",\n server: \"\",\n testUrl,\n udp,\n });\n parsePeers(node, wg[\"peer\"] ?? \"\");\n break;\n }\n case \"anytls\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"sni\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark,\n scv,\n server,\n sni: host,\n tfo,\n udp,\n });\n break;\n }\n default: {\n const handled = parseQuanxStyle(remark, configs, node, { scv, tfo, tls13, udp });\n if (!handled) {\n continue;\n }\n break;\n }\n }\n\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n return nodes.length > startCount;\n}\n\ninterface QuanxFlags {\n udp: TriBool;\n tfo: TriBool;\n scv: TriBool;\n tls13: TriBool;\n}\n\nfunction parseQuanxStyle(\n remark: string,\n configs: string[],\n node: Proxy,\n flags: QuanxFlags,\n): boolean {\n const kind = remark.toLowerCase();\n const first = configs[0] as string;\n const lastColon = first.lastIndexOf(\":\");\n const server = trim(first.slice(0, lastColon));\n const port = trim(first.slice(lastColon + 1));\n if (port === \"0\") {\n return false;\n }\n let method = \"\";\n let password = \"\";\n let username = \"\";\n let host = \"\";\n let path = \"\";\n let plugin = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let protocol = \"\";\n let protocolParam = \"\";\n let tls = \"\";\n let net = \"tcp\";\n let id = \"\";\n let aead = \"1\";\n let newRemark = remark;\n const udp = flags.udp;\n const tfo = flags.tfo;\n let scv = flags.scv;\n const tls13 = flags.tls13;\n\n const kv: { [key: string]: string } = {};\n for (let i = 1; i < configs.length; i += 1) {\n const vArray = split(trim(configs[i] as string), \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n kv[trim(vArray[0] as string)] = trim(vArray[1] as string);\n }\n\n if (kind === \"shadowsocks\") {\n method = kv[\"method\"] ?? \"\";\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n protocol = kv[\"ssr-protocol\"] ?? \"\";\n protocolParam = kv[\"ssr-protocol-param\"] ?? \"\";\n if (kv[\"obfs\"]) {\n const obfsVal = kv[\"obfs\"] as string;\n if (obfsVal === \"http\" || obfsVal === \"tls\") {\n plugin = \"simple-obfs\";\n pluginMode = obfsVal;\n } else if (obfsVal === \"wss\" || obfsVal === \"ws\") {\n if (obfsVal === \"wss\") {\n tls = \"tls\";\n }\n pluginMode = \"websocket\";\n plugin = \"v2ray-plugin\";\n } else {\n pluginMode = obfsVal;\n }\n }\n pluginHost = kv[\"obfs-host\"] ?? \"\";\n path = kv[\"obfs-uri\"] ?? \"\";\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n let pluginOption = \"\";\n if (plugin === \"simple-obfs\") {\n pluginOption = `obfs=${pluginMode}`;\n if (pluginHost !== \"\") {\n pluginOption += `;obfs-host=${pluginHost}`;\n }\n } else if (plugin === \"v2ray-plugin\") {\n if (pluginHost === \"\" && !/^\\d+(\\.\\d+){3}$/.test(server) && !server.includes(\":\")) {\n pluginHost = server;\n }\n pluginOption = `mode=${pluginMode}`;\n if (pluginHost !== \"\") {\n pluginOption += `;host=${pluginHost}`;\n }\n if (path !== \"\") {\n pluginOption += `;path=${path}`;\n }\n pluginOption += `;${tls}`;\n }\n if (protocol !== \"\") {\n ssrConstruct(node, {\n group: DEFAULT_GROUPS.ssr,\n method,\n obfs: pluginMode,\n obfsParam: pluginHost,\n password,\n port,\n protocol,\n protocolParam,\n remark: newRemark,\n scv,\n server,\n tfo,\n udp,\n });\n } else {\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls13,\n udp,\n });\n }\n return true;\n }\n\n if (kind === \"vmess\") {\n net = \"tcp\";\n method = kv[\"method\"] ?? \"\";\n id = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"obfs\"]) {\n const obfsVal = kv[\"obfs\"] as string;\n if (obfsVal === \"ws\") {\n net = \"ws\";\n } else if (obfsVal === \"over-tls\") {\n tls = \"tls\";\n } else if (obfsVal === \"wss\") {\n net = \"ws\";\n tls = \"tls\";\n }\n }\n host = kv[\"obfs-host\"] ?? \"\";\n path = kv[\"obfs-uri\"] ?? \"\";\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] === \"true\" ? \"tls\" : \"\";\n }\n if (kv[\"aead\"]) {\n aead = kv[\"aead\"] === \"true\" ? \"0\" : \"1\";\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n vmessConstruct(node, {\n add: server,\n aid: aead,\n cipher: method,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: newRemark,\n scv,\n tfo,\n tls,\n tls13,\n udp,\n });\n return true;\n }\n\n if (kind === \"trojan\") {\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] as string;\n }\n host = kv[\"tls-host\"] ?? \"\";\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n trojanConstruct(node, {\n group: DEFAULT_GROUPS.trojan,\n host,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls13,\n tlsSecure: tls === \"true\",\n udp,\n });\n return true;\n }\n\n if (kind === \"http\") {\n username = kv[\"username\"] ?? \"\";\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] as string;\n }\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n if (username === \"none\") {\n username = \"\";\n }\n if (password === \"none\") {\n password = \"\";\n }\n httpConstruct(node, {\n group: DEFAULT_GROUPS.http,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls: tls === \"true\",\n tls13,\n username,\n });\n return true;\n }\n\n if (kind === \"anytls\") {\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n host = kv[\"sni\"] ?? \"\";\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n sni: host,\n tfo,\n udp,\n });\n return true;\n }\n\n return false;\n}\n\nfunction trimQuote(input: string): string {\n let value = trim(input);\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n return value;\n}\n\n/** Parse a WireGuard `peer = (...)` blob into `node`. */\nexport function parsePeers(node: Proxy, data: string): void {\n const peers = [...data.matchAll(/\\((.*?)\\)/g)].map((m) => m[1] as string);\n if (peers.length === 0) {\n return;\n }\n const peer = peers[0] as string;\n const pairs = [...peer.matchAll(/([a-z-]+)\\s?=\\s?([^\" ),]+|\".*?\"),?\\s?/g)];\n for (const pair of pairs) {\n const key = pair[1] as string;\n const val = pair[2] as string;\n switch (key) {\n case \"public-key\":\n node.publicKey = val;\n break;\n case \"endpoint\": {\n const colon = val.lastIndexOf(\":\");\n node.hostname = val.slice(0, colon);\n node.port = toInt(val.slice(colon + 1));\n break;\n }\n case \"client-id\":\n node.clientId = val;\n break;\n case \"allowed-ips\":\n node.allowedIps = trimQuote(val);\n break;\n default:\n break;\n }\n }\n}\n\n/** Parse a Clash/plain YAML string into nodes (returns count). */\nexport function parseClashText(content: string, nodes: Proxy[]): boolean {\n try {\n const root = parseYaml(content);\n if (\n root &&\n typeof root === \"object\" &&\n (get(root, \"Proxy\") !== undefined || get(root, \"proxies\") !== undefined)\n ) {\n explodeClash(root, nodes);\n return true;\n }\n } catch {\n return false;\n }\n return false;\n}\n\n/** Parse an ss/ssr/v2ray configuration JSON blob (single or list). */\nexport function parseConfContent(content: string, nodes: Proxy[]): boolean {\n if (content.includes('\"version\"')) {\n explodeSsConf(content, nodes);\n } else if (content.includes('\"serverSubscribes\"')) {\n explodeSsrConf(content, nodes);\n } else if (content.includes('\"uiItem\"') || content.includes(\"vnext\")) {\n explodeVmessConf(content, nodes);\n } else if (content.includes('\"proxy_apps\"')) {\n explodeSsAndroid(content, nodes);\n } else if (content.includes('\"idInUse\"')) {\n explodeSstap(content, nodes);\n } else if (content.includes('\"local_address\"') && content.includes('\"local_port\"')) {\n explodeSsrConf(content, nodes);\n } else if (content.includes('\"ModeFileNameType\"')) {\n explodeNetchConf(content, nodes);\n } else {\n return false;\n }\n return nodes.length > 0;\n}\n\n/** Parse a Shadowsocks Android (`ssconf`) JSON config. */\nexport function explodeSsConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n const section = \"version\" in json && \"servers\" in json ? \"servers\" : \"configs\";\n if (!(section in json)) {\n return;\n }\n const group = asString(json.remarks);\n const list: any[] = json[section];\n if (!Array.isArray(list)) {\n return;\n }\n let index = nodes.length;\n for (const entry of list) {\n const remark = asString(entry.remarks);\n const port = asString(entry.server_port);\n if (port === \"0\") {\n continue;\n }\n const server = asString(entry.server);\n const node = createProxy();\n ssConstruct(node, {\n group,\n method: asString(entry.method),\n password: asString(entry.password),\n plugin: asString(entry.plugin),\n pluginOption: asString(entry.plugin_opts),\n port,\n remark: remark === \"\" ? `${server}:${port}` : remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a Shadowsocks Android (`com.github.shadowsocks`) node array. */\nexport function explodeSsAndroid(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(`{\"nodes\":${content}}`);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.nodes)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.nodes) {\n const server = asString(entry.server);\n if (server === \"\") {\n continue;\n }\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks);\n const node = createProxy();\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method: asString(entry.method),\n password: asString(entry.password),\n plugin: asString(entry.plugin),\n pluginOption: asString(entry.plugin_opts),\n port,\n remark: remark === \"\" ? `${server}:${port}` : remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a ShadowsocksR config JSON. */\nexport function explodeSsrConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n let index = nodes.length;\n if (\"local_port\" in json && \"local_address\" in json) {\n const node = createProxy();\n const server = asString(json.server);\n const port = asString(json.server_port);\n const remark = `${server}:${port}`;\n const method = asString(json.method);\n const obfs = asString(json.obfs);\n const protocol = asString(json.protocol);\n const password = asString(json.password);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin: asString(json.plugin),\n pluginOption: asString(json.plugin_opts),\n port,\n remark,\n server,\n });\n } else {\n ssrConstruct(node, {\n group: DEFAULT_GROUPS.ssr,\n method,\n obfs,\n obfsParam: asString(json.obfs_param),\n password,\n port,\n protocol,\n protocolParam: asString(json.protocol_param),\n remark,\n server,\n });\n }\n node.id = index;\n nodes.push(node);\n return;\n }\n\n const list: any[] = json.configs ?? [];\n if (!Array.isArray(list)) {\n return;\n }\n for (const entry of list) {\n const group = asString(entry.group) === \"\" ? DEFAULT_GROUPS.ssr : asString(entry.group);\n const server = asString(entry.server);\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks) === \"\" ? `${server}:${port}` : asString(entry.remarks);\n const node = createProxy();\n ssrConstruct(node, {\n group,\n method: asString(entry.method),\n obfs: asString(entry.obfs),\n obfsParam: asString(entry.obfsparam),\n password: asString(entry.password),\n port,\n protocol: asString(entry.protocol),\n protocolParam: asString(entry.protocolparam),\n remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a v2rayN config JSON. */\nexport function explodeVmessConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n let index = nodes.length;\n\n if (\"outbounds\" in json) {\n const outbounds = json.outbounds;\n if (\n Array.isArray(outbounds) &&\n outbounds.length > 0 &&\n outbounds[0]?.settings?.vnext?.length > 0\n ) {\n const vnext = outbounds[0].settings.vnext[0];\n const add = asString(vnext.address);\n const port = asString(vnext.port);\n if (port === \"0\") {\n return;\n }\n const users = vnext.users;\n const id = Array.isArray(users) && users.length ? asString(users[0].id) : \"\";\n const aid = Array.isArray(users) && users.length ? asString(users[0].alterId) : \"\";\n const cipher = Array.isArray(users) && users.length ? asString(users[0].security) : \"\";\n const stream = outbounds[0].streamSettings ?? {};\n const net = asString(stream.network);\n const tls = asString(stream.security);\n let path = \"\";\n let host = \"\";\n let edge = \"\";\n let type = \"\";\n if (net === \"ws\") {\n const ws = stream.wsSettings ?? {};\n path = asString(ws.path);\n if (ws.headers) {\n host = asString(ws.headers.Host);\n edge = asString(ws.headers.Edge);\n }\n }\n const tcp = stream.tcpSettings;\n if (tcp && tcp.header) {\n type = asString(tcp.header.type);\n if (type === \"http\" && tcp.header.request) {\n if (Array.isArray(tcp.header.request.path) && tcp.header.request.path.length) {\n path = asString(tcp.header.request.path[0]);\n }\n if (tcp.header.request.headers) {\n host = asString(tcp.header.request.headers.Host);\n edge = asString(tcp.header.request.headers.Edge);\n }\n }\n }\n const node = createProxy();\n vmessConstruct(node, {\n add,\n aid,\n cipher,\n edge,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: `${add}:${port}`,\n tls,\n type,\n });\n nodes.push(node);\n }\n return;\n }\n\n const subdata = new Map<string, string>();\n const subItems: any[] = json.subItem ?? [];\n for (const item of subItems) {\n subdata.set(asString(item.id), asString(item.remarks));\n }\n\n const list: any[] = json.vmess ?? [];\n for (const entry of list) {\n if (\n entry.address === null ||\n entry.address === undefined ||\n entry.port === null ||\n entry.id === null\n ) {\n continue;\n }\n let ps = asString(entry.remarks);\n const add = asString(entry.address);\n const port = asString(entry.port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const subid = asString(entry.subid);\n let group = \"\";\n if (subid !== \"\") {\n group = subdata.get(subid) ?? \"\";\n }\n if (ps === \"\") {\n ps = `${add}:${port}`;\n }\n const scv = asTri(entry.allowInsecure);\n const configType = toInt(entry.configType);\n const node = createProxy();\n if (configType === 1) {\n vmessConstruct(node, {\n add,\n aid: asString(entry.alterId),\n cipher: asString(entry.security),\n group: group || DEFAULT_GROUPS.v2ray,\n host: asString(entry.requestHost),\n id: asString(entry.id),\n net: asString(entry.network),\n path: asString(entry.path),\n port,\n remark: ps,\n scv,\n sni: asString(entry.sni),\n tls: asString(entry.streamSecurity),\n type: asString(entry.headerType),\n });\n } else if (configType === 3) {\n ssConstruct(node, {\n group: group || DEFAULT_GROUPS.ss,\n method: asString(entry.security),\n password: asString(entry.id),\n port,\n remark: ps,\n scv,\n server: add,\n });\n } else if (configType === 4) {\n socksConstruct(node, {\n group: group || DEFAULT_GROUPS.socks,\n port,\n remark: ps,\n scv,\n server: add,\n });\n } else {\n continue;\n }\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse an SSTap config JSON. */\nexport function explodeSstap(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.configs)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.configs) {\n const group = asString(entry.group);\n const server = asString(entry.server);\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks) === \"\" ? `${server}:${port}` : asString(entry.remarks);\n const password = asString(entry.password);\n const node = createProxy();\n const configType = toInt(entry.type);\n if (configType === 5) {\n socksConstruct(node, {\n group,\n password,\n port,\n remark,\n server,\n username: asString(entry.username),\n });\n } else if (configType === 6) {\n const protocol = asString(entry.protocol);\n const obfs = asString(entry.obfs);\n const method = asString(entry.method);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, { group, method, password, port, remark, server });\n } else {\n ssrConstruct(node, {\n group,\n method,\n obfs,\n obfsParam: asString(entry.obfsparam),\n password,\n port,\n protocol,\n protocolParam: asString(entry.protocolparam),\n remark,\n server,\n });\n }\n } else {\n continue;\n }\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a Netch config JSON. */\nexport function explodeNetchConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.Server)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.Server) {\n const node = createProxy();\n explodeNetch(`Netch://${base64Encode(JSON.stringify(entry))}`, node);\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n","import { isFlattenableSsr } from \"./ciphers\";\nimport {\n anyTlsConstruct,\n httpConstruct,\n hysteria2Construct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n tuicConstruct,\n vlessConstruct,\n vmessConstruct,\n} from \"./construct\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS, createProxy } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { split, toInt, trim } from \"../utils/string\";\nimport { getUrlArg, urlDecode } from \"../utils/url\";\n\n/** `true` when the link is a plain HTTP(S) subscription URL. */\nexport function isLink(link: string): boolean {\n return link.startsWith(\"http://\") || link.startsWith(\"https://\");\n}\n\nfunction firstMatch(input: string, pattern: string): string[] | null {\n const match = new RegExp(pattern).exec(input);\n return match ? match.slice() : null;\n}\n\n/** Parse `vmess://<base64 json>` or a variant link into `node`. */\nexport function explodeVmess(vmess: string, node: Proxy): void {\n if (/^vmess:\\/\\/[A-Za-z0-9-_]+\\?.*/.test(vmess)) {\n explodeShadowrocket(vmess, node);\n return;\n }\n if (/^vmess:\\/\\/.*?@.*/.test(vmess)) {\n explodeStdVmess(vmess, node);\n return;\n }\n if (/^vmess1:\\/\\/.*?\\?.*/.test(vmess)) {\n explodeKitsunebi(vmess, node);\n return;\n }\n\n const decoded = urlSafeBase64Decode(vmess.replace(/(vmess|vmess1):\\/\\//, \"\"));\n if (/.*?\\s=\\s.*/.test(decoded)) {\n explodeQuan(decoded, node);\n return;\n }\n\n let data: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(decoded);\n if (parsed === null || typeof parsed !== \"object\") {\n return;\n }\n data = parsed as Record<string, unknown>;\n } catch {\n return;\n }\n\n let version = \"1\";\n if (data[\"v\"] !== undefined) {\n version = String(data[\"v\"]);\n }\n const ps = String(data[\"ps\"] ?? \"\");\n let add = String(data[\"add\"] ?? \"\");\n const port = String(data[\"port\"] ?? \"\");\n if (port === \"0\" || port === \"\") {\n return;\n }\n const type = String(data[\"type\"] ?? \"\");\n const id = String(data[\"id\"] ?? \"\");\n const aid = String(data[\"aid\"] ?? \"\");\n const net = String(data[\"net\"] ?? \"\");\n const tls = String(data[\"tls\"] ?? \"\");\n let host = String(data[\"host\"] ?? \"\");\n const sni = String(data[\"sni\"] ?? \"\");\n let path = \"\";\n\n switch (toInt(version)) {\n case 1: {\n if (host !== \"\") {\n const parts = split(host, \";\");\n if (parts.length === 2) {\n host = parts[0] as string;\n path = parts[1] as string;\n }\n }\n break;\n }\n case 2: {\n path = String(data[\"path\"] ?? \"\");\n break;\n }\n default:\n break;\n }\n add = trim(add);\n\n vmessConstruct(node, {\n add,\n aid,\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: ps,\n sni,\n tls,\n type,\n });\n}\n\n/** Parse the `net:uuid-aid@host:port` VMess variant. */\nexport function explodeStdVmess(vmess: string, node: Proxy): void {\n let body = vmess.slice(8);\n let remark = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const matcher =\n /^([a-z]+)(?:\\+([a-z]+))?:([\\da-f]{4}(?:[\\da-f]{4}-){4}[\\da-f]{12})-(\\d+)@(.+):(\\d+)(?:\\/?\\?(.*))?$/;\n const match = matcher.exec(body);\n if (!match) {\n return;\n }\n const net = match[1] as string;\n const tls = match[2] ?? \"\";\n const id = match[3] as string;\n const aid = match[4] as string;\n const add = match[5] as string;\n const port = match[6] as string;\n const addition = match[7] ?? \"\";\n\n let type = \"\";\n let host = \"\";\n let path = \"\";\n switch (net) {\n case \"tcp\":\n case \"kcp\":\n type = getUrlArg(addition, \"type\");\n break;\n case \"http\":\n case \"ws\":\n host = getUrlArg(addition, \"host\");\n path = getUrlArg(addition, \"path\");\n break;\n case \"quic\":\n type = getUrlArg(addition, \"security\");\n host = getUrlArg(addition, \"type\");\n path = getUrlArg(addition, \"key\");\n break;\n default:\n return;\n }\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid,\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type,\n });\n}\n\n/** Parse a Shadowrocket-style VMess link. */\nexport function explodeShadowrocket(rocket: string, node: Proxy): void {\n let body = rocket.slice(8);\n let net = \"tcp\";\n const qpos = body.indexOf(\"?\");\n const addition = qpos >= 0 ? body.slice(qpos + 1) : \"\";\n body = qpos >= 0 ? body.slice(0, qpos) : body;\n\n const match = firstMatch(urlSafeBase64Decode(body), \"(.*?):(.*)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const cipher = match[1] as string;\n const id = match[2] as string;\n const add = match[3] as string;\n const port = match[4] as string;\n if (port === \"0\") {\n return;\n }\n let remark = urlDecode(getUrlArg(addition, \"remarks\"));\n const obfs = getUrlArg(addition, \"obfs\");\n let host = \"\";\n let path = \"\";\n const type = \"\";\n if (obfs !== \"\") {\n if (obfs === \"websocket\") {\n net = \"ws\";\n host = getUrlArg(addition, \"obfsParam\");\n path = getUrlArg(addition, \"path\");\n }\n } else {\n net = getUrlArg(addition, \"network\");\n host = getUrlArg(addition, \"wsHost\");\n path = getUrlArg(addition, \"wspath\");\n }\n const tls = getUrlArg(addition, \"tls\") === \"1\" ? \"tls\" : \"\";\n let aid = getUrlArg(addition, \"aid\");\n if (aid === \"\") {\n aid = \"0\";\n }\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid,\n cipher,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type,\n });\n}\n\n/** Parse a Kitsunebi-style `vmess1://` link. */\nexport function explodeKitsunebi(kit: string, node: Proxy): void {\n let body = kit.slice(9);\n let remark = \"\";\n let path = \"\";\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = body.slice(hashPos + 1);\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n const addition = qpos >= 0 ? body.slice(qpos + 1) : \"\";\n body = qpos >= 0 ? body.slice(0, qpos) : body;\n\n const match = firstMatch(body, \"(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const id = match[1] as string;\n const add = match[2] as string;\n let port = match[3] as string;\n const slash = port.indexOf(\"/\");\n if (slash !== -1) {\n path = port.slice(slash);\n port = port.slice(0, slash);\n }\n if (port === \"0\") {\n return;\n }\n const net = getUrlArg(addition, \"network\");\n const tls = getUrlArg(addition, \"tls\") === \"true\" ? \"tls\" : \"\";\n const host = getUrlArg(addition, \"ws.host\");\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid: \"0\",\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type: \"\",\n });\n}\n\n/** Parse a Quantumult `remarks = vmess, ...` definition. */\nexport function explodeQuan(quan: string, node: Proxy): void {\n const normalized = quan.replace(/(.*?)\\s=\\s(.*)/, \"$1,$2\");\n const configs = split(normalized, \",\");\n if (configs.length < 6 || configs[1] !== \"vmess\") {\n return;\n }\n const remark = trim(configs[0] as string);\n const add = trim(configs[2] as string);\n const port = trim(configs[3] as string);\n if (port === \"0\") {\n return;\n }\n const cipher = trim(configs[4] as string);\n const id = trim((configs[5] as string).replace(/\"/g, \"\"));\n\n let group: string = DEFAULT_GROUPS.v2ray;\n let tls = \"\";\n let host = \"\";\n let path = \"\";\n let net = \"tcp\";\n let edge = \"\";\n\n for (let i = 6; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray.slice(1).join(\"=\"));\n switch (itemName) {\n case \"group\":\n group = itemVal;\n break;\n case \"over-tls\":\n tls = itemVal === \"true\" ? \"tls\" : \"\";\n break;\n case \"tls-host\":\n host = itemVal;\n break;\n case \"obfs-path\":\n path = itemVal.replace(/\"/g, \"\");\n break;\n case \"obfs-header\": {\n const headers = split(itemVal.replace(/\"/g, \"\").replace(/\\[Rr\\]\\[Nn\\]/g, \"|\"), \"|\");\n for (const header of headers) {\n if (/Host: /i.test(header)) {\n host = header.slice(6);\n } else if (/Edge: /i.test(header)) {\n edge = header.slice(6);\n }\n }\n break;\n }\n case \"obfs\":\n if (itemVal === \"ws\") {\n net = \"ws\";\n }\n break;\n default:\n break;\n }\n }\n if (path === \"\") {\n path = \"/\";\n }\n vmessConstruct(node, {\n add,\n aid: \"0\",\n cipher,\n edge,\n group,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type: \"none\",\n });\n}\n\n/** Parse a `ss://` link into `node`. */\nexport function explodeSs(ss: string, node: Proxy): void {\n let body = ss.slice(5).replace(/\\/\\?/g, \"?\");\n const group: string = DEFAULT_GROUPS.ss;\n let remark = \"\";\n let addition = \"\";\n let plugin = \"\";\n let pluginOption = \"\";\n let resolvedGroup: string = group;\n\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n const plugins = urlDecode(getUrlArg(addition, \"plugin\"));\n const pluginPos = plugins.indexOf(\";\");\n plugin = pluginPos === -1 ? plugins : plugins.slice(0, pluginPos);\n pluginOption = pluginPos === -1 ? \"\" : plugins.slice(pluginPos + 1);\n const rawGroup = getUrlArg(addition, \"group\");\n if (rawGroup !== \"\") {\n resolvedGroup = urlSafeBase64Decode(rawGroup);\n }\n body = body.slice(0, qpos);\n }\n\n let method = \"\";\n let password = \"\";\n let server = \"\";\n let port = \"\";\n\n if (body.includes(\"@\")) {\n const match = firstMatch(body, \"(\\\\S+?)@(\\\\S+):(\\\\d+)\");\n if (!match) {\n return;\n }\n const secret = match[1] as string;\n server = match[2] as string;\n port = match[3] as string;\n const secretMatch = firstMatch(urlSafeBase64Decode(secret), \"(\\\\S+?):(\\\\S+)\");\n if (!secretMatch) {\n return;\n }\n method = secretMatch[1] as string;\n password = secretMatch[2] as string;\n } else {\n const match = firstMatch(urlSafeBase64Decode(body), \"(\\\\S+?):(\\\\S+)@(\\\\S+):(\\\\d+)\");\n if (!match) {\n return;\n }\n method = match[1] as string;\n password = match[2] as string;\n server = match[3] as string;\n port = match[4] as string;\n }\n\n if (port === \"0\") {\n return;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n ssConstruct(node, {\n group: resolvedGroup,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n server,\n });\n}\n\n/** Parse a `ssr://` link into `node`. */\nexport function explodeSsr(ssr: string, node: Proxy): void {\n let body = ssr.slice(6).replace(/\\r/g, \"\");\n body = urlSafeBase64Decode(body);\n\n let group = \"\";\n let remark = \"\";\n let obfsParam = \"\";\n let protocolParam = \"\";\n\n const obfsPos = body.indexOf(\"/?\");\n if (obfsPos !== -1) {\n const strobfs = body.slice(obfsPos + 2);\n body = body.slice(0, obfsPos);\n group = urlSafeBase64Decode(getUrlArg(strobfs, \"group\"));\n remark = urlSafeBase64Decode(getUrlArg(strobfs, \"remarks\"));\n obfsParam = urlSafeBase64Decode(getUrlArg(strobfs, \"obfsparam\")).replace(/\\s/g, \"\");\n protocolParam = urlSafeBase64Decode(getUrlArg(strobfs, \"protoparam\")).replace(/\\s/g, \"\");\n }\n\n const match = firstMatch(body, \"(\\\\S+):(\\\\d+?):(\\\\S+?):(\\\\S+?):(\\\\S+?):(\\\\S+)\");\n if (!match) {\n return;\n }\n const server = match[1] as string;\n const port = match[2] as string;\n const protocol = match[3] as string;\n const method = match[4] as string;\n const obfs = match[5] as string;\n const password = urlSafeBase64Decode(match[6] as string);\n if (port === \"0\") {\n return;\n }\n\n const resolvedGroup = group === \"\" ? DEFAULT_GROUPS.ssr : group;\n const resolvedRemark = remark === \"\" ? `${server}:${port}` : remark;\n\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: resolvedGroup,\n method,\n password,\n port,\n remark: resolvedRemark,\n server,\n });\n } else {\n ssrConstruct(node, {\n group: resolvedGroup,\n method,\n obfs,\n obfsParam,\n password,\n port,\n protocol,\n protocolParam,\n remark: resolvedRemark,\n server,\n });\n }\n}\n\n/** Parse an `ssd://` (ShadowsocksD) subscription. */\nexport function explodeSsd(link: string, nodes: Proxy[]): void {\n let index = nodes.length;\n const decoded = urlSafeBase64Decode(link.slice(6));\n let data: any;\n try {\n data = JSON.parse(decoded);\n } catch {\n return;\n }\n if (data === null || typeof data !== \"object\" || !(\"servers\" in data)) {\n return;\n }\n const group = String(data.airport ?? \"\");\n const servers = data.servers;\n\n let entries: any[];\n if (Array.isArray(servers)) {\n entries = servers;\n } else if (servers !== null && typeof servers === \"object\") {\n entries = Object.keys(servers).map((key) => servers[key]);\n } else {\n return;\n }\n\n for (const entry of entries) {\n if (entry === null || typeof entry !== \"object\") {\n continue;\n }\n const server = String(entry.server ?? \"\");\n const port = String(entry.port ?? data.port ?? \"\");\n if (server === \"\" || port === \"\" || port === \"0\") {\n continue;\n }\n const remark = String(entry.remarks ?? \"\");\n const method = String(entry.encryption ?? data.encryption ?? \"\");\n const password = String(entry.password ?? data.password ?? \"\");\n const plugin = String(entry.plugin ?? data.plugin ?? \"\");\n const pluginOption = String(entry.plugin_options ?? data.plugin_options ?? \"\");\n const node = createProxy();\n ssConstruct(node, {\n group,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse `socks://`, `tg://socks`, or `https://t.me/socks` links. */\nexport function explodeSocks(link: string, node: Proxy): void {\n let group = \"\";\n let remark = \"\";\n let server = \"\";\n let port = \"\";\n let username = \"\";\n let password = \"\";\n\n if (link.includes(\"socks://\")) {\n let body = link;\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n body = urlSafeBase64Decode(body.slice(8));\n if (body.includes(\"@\")) {\n const userinfo = split(body, \"@\");\n if (userinfo.length < 2) {\n return;\n }\n body = userinfo[1] as string;\n const creds = split(userinfo[0] as string, \":\");\n if (creds.length < 2) {\n return;\n }\n username = creds[0] as string;\n password = creds[1] as string;\n }\n const args = split(body, \":\");\n if (args.length < 2) {\n return;\n }\n server = args[0] as string;\n port = args[1] as string;\n } else if (link.includes(\"https://t.me/socks\") || link.includes(\"tg://socks\")) {\n server = getUrlArg(link, \"server\");\n port = getUrlArg(link, \"port\");\n username = urlDecode(getUrlArg(link, \"user\"));\n password = urlDecode(getUrlArg(link, \"pass\"));\n remark = urlDecode(getUrlArg(link, \"remarks\"));\n group = urlDecode(getUrlArg(link, \"group\"));\n }\n\n if (group === \"\") {\n group = DEFAULT_GROUPS.socks;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n if (port === \"0\" || port === \"\") {\n return;\n }\n socksConstruct(node, { group, password, port, remark, server, username });\n}\n\n/** Parse a telegram-style HTTP proxy link. */\nexport function explodeHttp(link: string, node: Proxy): void {\n const server = getUrlArg(link, \"server\");\n const port = getUrlArg(link, \"port\");\n const username = urlDecode(getUrlArg(link, \"user\"));\n const password = urlDecode(getUrlArg(link, \"pass\"));\n let remark = urlDecode(getUrlArg(link, \"remarks\"));\n let group = urlDecode(getUrlArg(link, \"group\"));\n if (group === \"\") {\n group = DEFAULT_GROUPS.http;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n if (port === \"0\" || port === \"\") {\n return;\n }\n httpConstruct(node, {\n group,\n password,\n port,\n remark,\n server,\n tls: link.includes(\"/https\"),\n username,\n });\n}\n\n/** Parse an HTTP(S) link with base64-encoded credentials. */\nexport function explodeHttpSub(link: string, node: Proxy): void {\n let body = link;\n let remarks = \"\";\n let group = \"\";\n const tls = body.includes(\"https://\");\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n const addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n remarks = urlDecode(getUrlArg(addition, \"remarks\"));\n group = urlDecode(getUrlArg(addition, \"group\"));\n }\n body = body.slice(body.indexOf(\"://\") + 3);\n body = urlSafeBase64Decode(body);\n\n let server = \"\";\n let port = \"\";\n let username = \"\";\n let password = \"\";\n if (body.includes(\"@\")) {\n const match = firstMatch(body, \"(.*?):(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n username = match[1] as string;\n password = match[2] as string;\n server = match[3] as string;\n port = match[4] as string;\n } else {\n const match = firstMatch(body, \"(.*):(.*)\");\n if (!match) {\n return;\n }\n server = match[1] as string;\n port = match[2] as string;\n }\n if (group === \"\") {\n group = DEFAULT_GROUPS.http;\n }\n if (remarks === \"\") {\n remarks = `${server}:${port}`;\n }\n if (port === \"0\") {\n return;\n }\n httpConstruct(node, {\n group,\n password,\n port,\n remark: remarks,\n server,\n tls,\n username,\n });\n}\n\n/** Parse a `trojan://` link. */\nexport function explodeTrojan(trojan: string, node: Proxy): void {\n let body = trojan.slice(9);\n let remark = \"\";\n let addition = \"\";\n let host = \"\";\n let path = \"\";\n let network = \"\";\n\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n\n const match = firstMatch(body, \"(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const password = match[1] as string;\n const server = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n\n host = getUrlArg(addition, \"sni\");\n if (host === \"\") {\n host = getUrlArg(addition, \"peer\");\n }\n const tfo = getUrlArg(addition, \"tfo\");\n const group = urlDecode(getUrlArg(addition, \"group\"));\n\n if (getUrlArg(addition, \"ws\") === \"1\") {\n path = getUrlArg(addition, \"wspath\");\n network = \"ws\";\n } else if (getUrlArg(addition, \"type\") === \"ws\") {\n path = getUrlArg(addition, \"path\");\n if (path.startsWith(\"%2F\")) {\n path = urlDecode(path);\n }\n network = \"ws\";\n }\n\n const type = getUrlArg(addition, \"type\");\n const sni = getUrlArg(addition, \"sni\");\n const insecure = getUrlArg(addition, \"allowInsecure\");\n\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n trojanConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.trojan : group,\n host,\n network,\n password,\n path,\n port,\n remark,\n scv: insecure === \"\" ? undefined : parseTri(insecure),\n server,\n sni,\n tfo: tfo === \"\" ? undefined : parseTri(tfo),\n tlsSecure: type !== \"\" || true,\n });\n}\n\nfunction parseTri(value: string): TriBool {\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n return undefined;\n}\n\n/** Parse a `hysteria2://` / `hy2://` link. */\nexport function explodeHysteria2(link: string, node: Proxy): void {\n const body = link.replace(/(hysteria2|hy2):\\/\\//, \"hysteria2://\").replace(/\\/\\?/g, \"?\");\n if (/hysteria2:\\/\\/.*?[:].*/.test(body)) {\n explodeStdHysteria2(body, node);\n }\n}\n\nfunction explodeStdHysteria2(link: string, node: Proxy): void {\n let body = link.slice(12);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n\n let password = \"\";\n let add = \"\";\n let port = \"\";\n if (body.includes(\"@\")) {\n const match = /^(.*?)@(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n password = match[1] as string;\n add = match[2] as string;\n port = match[3] as string;\n } else {\n password = getUrlArg(addition, \"password\");\n if (password === \"\") {\n return;\n }\n if (!body.includes(\":\")) {\n return;\n }\n const match = /^(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n add = match[1] as string;\n port = match[2] as string;\n }\n\n const scv = getUrlArg(addition, \"insecure\");\n const up = getUrlArg(addition, \"up\");\n const down = getUrlArg(addition, \"down\");\n const alpn = getUrlArg(addition, \"alpn\");\n const obfs = getUrlArg(addition, \"obfs\");\n const obfsPassword = getUrlArg(addition, \"obfs-password\");\n const sni = getUrlArg(addition, \"sni\");\n const fingerprint = getUrlArg(addition, \"pinSHA256\");\n const mport = getUrlArg(addition, \"mport\");\n const portsArg = getUrlArg(addition, \"ports\");\n const ports = portsArg !== \"\" ? portsArg : mport !== \"\" ? mport : port;\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n hysteria2Construct(node, {\n alpn,\n down,\n fingerprint,\n group: DEFAULT_GROUPS.hysteria2,\n obfs,\n obfsPassword,\n password,\n port,\n ports,\n remark,\n scv: scv === \"\" ? undefined : parseTri(scv),\n server: add,\n sni,\n up,\n });\n}\n\n/** Parse an `anytls://` link. */\nexport function explodeAnyTls(link: string, node: Proxy): void {\n let body = link.slice(9);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?)@(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const password = match[1] as string;\n const add = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n const sni = getUrlArg(addition, \"sni\");\n const udp = getUrlArg(addition, \"udp\");\n const scv = getUrlArg(addition, \"insecure\");\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark,\n scv: scv === \"\" ? undefined : parseTri(scv),\n server: add,\n sni,\n udp: udp === \"\" ? undefined : parseTri(udp),\n });\n}\n\n/** Parse a `vless://` link. */\nexport function explodeVless(link: string, node: Proxy): void {\n let body = link.slice(8);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?)@\\[?(.*?)\\]?:(\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const userId = match[1] as string;\n const server = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n const network = getUrlArg(addition, \"type\");\n const security = getUrlArg(addition, \"security\");\n const host = getUrlArg(addition, \"host\");\n const path = urlDecode(getUrlArg(addition, \"path\"));\n const sni = getUrlArg(addition, \"sni\");\n const flow = getUrlArg(addition, \"flow\");\n const fingerprint = getUrlArg(addition, \"fp\");\n const alpn = getUrlArg(addition, \"alpn\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n vlessConstruct(node, {\n alpn: alpn === \"\" ? undefined : alpn.split(\",\"),\n fingerprint,\n flow,\n group: DEFAULT_GROUPS.v2ray,\n host,\n network,\n path,\n port,\n remark,\n scv:\n getUrlArg(addition, \"allowInsecure\") === \"\"\n ? undefined\n : parseTri(getUrlArg(addition, \"allowInsecure\")),\n server,\n sni,\n tls: security,\n userId,\n });\n}\n\n/** Parse a `tuic://` link. */\nexport function explodeTuic(link: string, node: Proxy): void {\n let body = link.slice(7);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?):(.*?)@\\[?(.*?)\\]?:(\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const userId = match[1] as string;\n const password = match[2] as string;\n const server = match[3] as string;\n const port = match[4] as string;\n if (port === \"0\") {\n return;\n }\n const congestionControl =\n getUrlArg(addition, \"congestion_control\") || getUrlArg(addition, \"congestion-controller\");\n const alpn = getUrlArg(addition, \"alpn\");\n const sni = getUrlArg(addition, \"sni\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n tuicConstruct(node, {\n alpn: alpn === \"\" ? undefined : alpn.split(\",\"),\n congestionControl,\n group: DEFAULT_GROUPS.v2ray,\n password,\n port,\n remark,\n scv:\n getUrlArg(addition, \"allow_insecure\") === \"\"\n ? undefined\n : parseTri(getUrlArg(addition, \"allow_insecure\")),\n server,\n sni,\n userId,\n });\n}\n","import { explodeSurge, parseClashText, parseConfContent } from \"./conf\";\nimport { explodeNetch } from \"./netch\";\nimport {\n explodeAnyTls,\n explodeHttp,\n explodeHttpSub,\n explodeHysteria2,\n explodeSs,\n explodeSsr,\n explodeSocks,\n explodeSsd,\n explodeTrojan,\n explodeTuic,\n explodeVless,\n explodeVmess,\n isLink,\n} from \"./uri\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, createProxy } from \"../types/proxy\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { countOccurrences, startsWith } from \"../utils/string\";\n\n/** Parse a single proxy link into `node`. */\nexport function explode(link: string, node: Proxy): void {\n if (startsWith(link, \"ssr://\")) {\n explodeSsr(link, node);\n } else if (startsWith(link, \"vmess://\") || startsWith(link, \"vmess1://\")) {\n explodeVmess(link, node);\n } else if (startsWith(link, \"ss://\")) {\n explodeSs(link, node);\n } else if (\n startsWith(link, \"socks://\") ||\n startsWith(link, \"https://t.me/socks\") ||\n startsWith(link, \"tg://socks\")\n ) {\n explodeSocks(link, node);\n } else if (startsWith(link, \"https://t.me/http\") || startsWith(link, \"tg://http\")) {\n explodeHttp(link, node);\n } else if (startsWith(link, \"Netch://\")) {\n explodeNetch(link, node);\n } else if (startsWith(link, \"trojan://\")) {\n explodeTrojan(link, node);\n } else if (startsWith(link, \"vless://\")) {\n explodeVless(link, node);\n } else if (startsWith(link, \"tuic://\")) {\n explodeTuic(link, node);\n } else if (link.includes(\"hysteria2://\") || link.includes(\"hy2://\")) {\n explodeHysteria2(link, node);\n } else if (startsWith(link, \"anytls://\")) {\n explodeAnyTls(link, node);\n } else if (isLink(link)) {\n explodeHttpSub(link, node);\n }\n}\n\n/** Parse a link string, returning a node when recognized. */\nexport function parseLink(link: string): Proxy | undefined {\n const node = createProxy();\n explode(link, node);\n return node.type === ProxyType.Unknown ? undefined : node;\n}\n\n/**\n * Parse a subscription body: SSD, Clash YAML, Surge INI, or a newline/space\n * delimited base64 list of links. Mirrors `explodeSub`.\n */\nexport function explodeSub(sub: string, nodes: Proxy[]): void {\n let processed = false;\n\n if (startsWith(sub, \"ssd://\")) {\n explodeSsd(sub, nodes);\n processed = true;\n }\n\n if (!processed && /\"?(Proxy|proxies)\"?:/.test(sub)) {\n if (parseClashText(sub, nodes)) {\n processed = true;\n }\n }\n\n if (!processed && explodeSurge(sub, nodes)) {\n processed = true;\n }\n\n if (processed) {\n return;\n }\n\n const body = urlSafeBase64Decode(sub);\n if (/(vmess|shadowsocks|http|trojan)\\s*?=/.test(body)) {\n if (explodeSurge(body, nodes)) {\n return;\n }\n }\n const before = nodes.length;\n splitLinks(body, nodes);\n if (nodes.length === before && body !== sub) {\n // Not a base64 body after all (e.g. a plain-text provider list).\n splitLinks(sub, nodes);\n }\n}\n\nfunction splitLinks(body: string, nodes: Proxy[]): void {\n const normalized = body.replace(/\\r\\n/g, \"\\n\");\n const delimiter =\n countOccurrences(normalized, \"\\n\") < 1\n ? countOccurrences(normalized, \"\\r\") < 1\n ? \" \"\n : \"\\r\"\n : \"\\n\";\n for (const rawLink of normalized.split(delimiter)) {\n const link = rawLink.replace(/\\r/g, \"\");\n if (link === \"\") {\n continue;\n }\n const node = createProxy();\n explode(link, node);\n if (node.type === ProxyType.Unknown) {\n continue;\n }\n nodes.push(node);\n }\n}\n\n/** Parse a config blob (Clash/SS/SSR/V2Ray/SSTap/Netch) or a subscription. */\nexport function parseSubscription(content: string): Proxy[] {\n const nodes: Proxy[] = [];\n if (parseConfContent(content, nodes)) {\n return nodes;\n }\n explodeSub(content, nodes);\n return nodes;\n}\n","import { stringify as yamlStringify } from \"yaml\";\n\nimport { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode } from \"../utils/base64\";\nimport { getUrlArg, urlDecode } from \"../utils/url\";\n\nconst CLASHR_PROTOCOLS = [\n \"origin\",\n \"auth_sha1_v4\",\n \"auth_aes128_md5\",\n \"auth_aes128_sha1\",\n \"auth_chain_a\",\n \"auth_chain_b\",\n];\nconst CLASHR_OBFS = [\n \"plain\",\n \"http_simple\",\n \"http_post\",\n \"random_head\",\n \"tls1.2_ticket_auth\",\n \"tls1.2_ticket_fastauth\",\n];\nconst CLASH_SSR_CIPHERS = [\n \"rc4-md5\",\n \"aes-128-ctr\",\n \"aes-192-ctr\",\n \"aes-256-ctr\",\n \"aes-128-cfb\",\n \"aes-192-cfb\",\n \"aes-256-cfb\",\n \"chacha20-ietf\",\n \"xchacha20\",\n \"none\",\n];\n\ntype ClashProxy = Record<string, unknown>;\n\nfunction stripBrackets(value: string): string {\n return value.replace(/^\\[+/, \"\").replace(/\\]+$/, \"\");\n}\n\nfunction toTri(value: boolean | undefined): boolean | undefined {\n return value;\n}\n\nfunction buildClashProxy(\n x: Proxy,\n settings: ExtraSettings,\n clashR: boolean,\n remark: string,\n skipCertVerify: boolean | undefined,\n tfo: boolean | undefined,\n): ClashProxy | undefined {\n const proxy: ClashProxy = {\n name: remark,\n port: x.port,\n server: stripBrackets(x.hostname),\n };\n\n switch (x.type) {\n case ProxyType.Shadowsocks: {\n if (settings.filterDeprecated && x.encryptMethod === \"chacha20\") {\n return undefined;\n }\n proxy.type = \"ss\";\n proxy.cipher = x.encryptMethod;\n proxy.password = x.password;\n const pluginOpts = x.pluginOption.replace(/;/g, \"&\");\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n proxy.plugin = \"obfs\";\n proxy[\"plugin-opts\"] = {\n host: urlDecode(getUrlArg(pluginOpts, \"obfs-host\")),\n mode: urlDecode(getUrlArg(pluginOpts, \"obfs\")),\n };\n } else if (x.plugin === \"v2ray-plugin\") {\n proxy.plugin = \"v2ray-plugin\";\n const opts: Record<string, unknown> = {\n host: getUrlArg(pluginOpts, \"host\"),\n mode: getUrlArg(pluginOpts, \"mode\"),\n mux: pluginOpts.includes(\"mux\"),\n path: getUrlArg(pluginOpts, \"path\"),\n tls: pluginOpts.includes(\"tls\"),\n };\n if (skipCertVerify !== undefined) {\n opts[\"skip-cert-verify\"] = skipCertVerify;\n }\n proxy[\"plugin-opts\"] = opts;\n }\n break;\n }\n case ProxyType.VMess: {\n proxy.type = \"vmess\";\n proxy.uuid = x.userId;\n proxy.alterId = x.alterId;\n proxy.cipher = x.encryptMethod;\n proxy.tls = x.tlsSecure;\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.serverName !== \"\") {\n proxy.servername = x.serverName;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n if (settings.clashNewFieldName) {\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" || x.edge !== \"\"\n ? {\n headers: {\n ...(x.edge !== \"\" ? { Edge: x.edge } : {}),\n ...(x.host !== \"\" ? { Host: x.host } : {}),\n },\n }\n : {}),\n path: x.path,\n };\n } else {\n proxy[\"ws-path\"] = x.path;\n if (x.host !== \"\" || x.edge !== \"\") {\n proxy[\"ws-headers\"] = {\n ...(x.edge !== \"\" ? { Edge: x.edge } : {}),\n ...(x.host !== \"\" ? { Host: x.host } : {}),\n };\n }\n }\n break;\n case \"http\":\n proxy.network = x.transferProtocol;\n proxy[\"http-opts\"] = {\n ...(x.host !== \"\" || x.edge !== \"\"\n ? {\n headers: {\n ...(x.edge !== \"\" ? { Edge: [x.edge] } : {}),\n ...(x.host !== \"\" ? { Host: [x.host] } : {}),\n },\n }\n : {}),\n method: \"GET\",\n path: [x.path],\n };\n break;\n case \"h2\":\n proxy.network = x.transferProtocol;\n proxy[\"h2-opts\"] = {\n ...(x.host !== \"\" ? { host: [x.host] } : {}),\n path: x.path,\n };\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n proxy.servername = x.host;\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n break;\n default:\n return undefined;\n }\n break;\n }\n case ProxyType.ShadowsocksR: {\n if (settings.filterDeprecated) {\n if (!clashR && !CLASH_SSR_CIPHERS.includes(x.encryptMethod)) {\n return undefined;\n }\n if (!CLASHR_PROTOCOLS.includes(x.protocol)) {\n return undefined;\n }\n if (!CLASHR_OBFS.includes(x.obfs)) {\n return undefined;\n }\n }\n proxy.type = \"ssr\";\n proxy.cipher = x.encryptMethod === \"none\" ? \"dummy\" : x.encryptMethod;\n proxy.password = x.password;\n proxy.protocol = x.protocol;\n proxy.obfs = x.obfs;\n if (clashR) {\n proxy.protocolparam = x.protocolParam;\n proxy.obfsparam = x.obfsParam;\n } else {\n proxy[\"protocol-param\"] = x.protocolParam;\n proxy[\"obfs-param\"] = x.obfsParam;\n }\n break;\n }\n case ProxyType.SOCKS5:\n proxy.type = \"socks5\";\n if (x.username !== \"\") {\n proxy.username = x.username;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxy.type = \"http\";\n if (x.username !== \"\") {\n proxy.username = x.username;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n proxy.tls = x.tlsSecure;\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.Trojan:\n proxy.type = \"trojan\";\n proxy.password = x.password;\n if (x.host !== \"\") {\n proxy.sni = x.host;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n if (x.path !== \"\") {\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n }\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" ? { headers: { Host: x.host } } : {}),\n path: x.path,\n };\n break;\n default:\n break;\n }\n break;\n case ProxyType.Snell:\n if (x.snellVersion >= 4) {\n return undefined;\n }\n proxy.type = \"snell\";\n proxy.psk = x.password;\n if (x.snellVersion !== 0) {\n proxy.version = x.snellVersion;\n }\n if (x.obfs !== \"\") {\n proxy[\"obfs-opts\"] = {\n ...(x.host !== \"\" ? { host: x.host } : {}),\n mode: x.obfs,\n };\n }\n break;\n case ProxyType.WireGuard:\n proxy.type = \"wireguard\";\n proxy[\"public-key\"] = x.publicKey;\n proxy[\"private-key\"] = x.privateKey;\n proxy.ip = x.selfIp;\n if (x.selfIpv6 !== \"\") {\n proxy.ipv6 = x.selfIpv6;\n }\n if (x.preSharedKey !== \"\") {\n proxy[\"preshared-key\"] = x.preSharedKey;\n }\n if (x.dnsServers.length > 0) {\n proxy.dns = x.dnsServers;\n }\n if (x.mtu > 0) {\n proxy.mtu = x.mtu;\n }\n break;\n case ProxyType.Hysteria: {\n proxy.type = \"hysteria\";\n if (x.ports !== \"\") {\n proxy.ports = x.ports;\n }\n if (x.protocol !== \"\") {\n proxy.protocol = x.protocol;\n }\n if (x.obfsParam !== \"\") {\n proxy[\"obfs-protocol\"] = x.obfsParam;\n }\n if (x.up !== \"\") {\n proxy.up = x.up;\n }\n if (x.upSpeed) {\n proxy[\"up-speed\"] = x.upSpeed;\n }\n if (x.down !== \"\") {\n proxy.down = x.down;\n }\n if (x.downSpeed) {\n proxy[\"down-speed\"] = x.downSpeed;\n }\n if (x.authStr !== \"\") {\n proxy[\"auth-str\"] = x.authStr;\n proxy.auth = base64Encode(x.authStr);\n }\n if (x.obfs !== \"\") {\n proxy.obfs = x.obfs;\n }\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.fingerprint !== \"\") {\n proxy.fingerprint = x.fingerprint;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n proxy.ca = x.ca;\n }\n if (x.caStr !== \"\") {\n proxy[\"ca-str\"] = x.caStr;\n }\n if (x.recvWindowConn) {\n proxy[\"recv-window-conn\"] = x.recvWindowConn;\n }\n if (x.recvWindow) {\n proxy[\"recv-window\"] = x.recvWindow;\n }\n if (x.disableMtuDiscovery !== undefined) {\n proxy[\"disable-mtu-discovery\"] = x.disableMtuDiscovery;\n }\n if (x.tcpFastOpen !== undefined) {\n proxy[\"fast-open\"] = x.tcpFastOpen;\n }\n if (x.hopInterval) {\n proxy[\"hop-interval\"] = x.hopInterval;\n }\n break;\n }\n case ProxyType.Hysteria2:\n proxy.type = \"hysteria2\";\n if (x.ports !== \"\") {\n proxy.ports = x.ports;\n }\n if (x.upSpeed) {\n proxy.up = x.upSpeed;\n }\n if (x.downSpeed) {\n proxy.down = x.downSpeed;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n if (x.obfs !== \"\") {\n proxy.obfs = x.obfs;\n }\n if (x.obfsParam !== \"\") {\n proxy[\"obfs-password\"] = x.obfsParam;\n }\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.fingerprint !== \"\") {\n proxy.fingerprint = x.fingerprint;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n proxy.ca = x.ca;\n }\n if (x.caStr !== \"\") {\n proxy[\"ca-str\"] = x.caStr;\n }\n if (x.cwnd) {\n proxy.cwnd = x.cwnd;\n }\n if (x.hopInterval) {\n proxy[\"hop-interval\"] = x.hopInterval;\n }\n break;\n case ProxyType.AnyTLS:\n proxy.type = \"anytls\";\n proxy.password = x.password;\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.VLESS:\n proxy.type = \"vless\";\n proxy.uuid = x.userId;\n if (x.flow !== \"\") {\n proxy.flow = x.flow;\n }\n proxy.tls = x.tlsSecure;\n if (x.serverName !== \"\") {\n proxy.servername = x.serverName;\n }\n if (x.fingerprint !== \"\") {\n proxy[\"client-fingerprint\"] = x.fingerprint;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" ? { headers: { Host: x.host } } : {}),\n path: x.path,\n };\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n break;\n default:\n break;\n }\n break;\n case ProxyType.TUIC:\n proxy.type = \"tuic\";\n proxy.uuid = x.userId;\n proxy.password = x.password;\n if (x.congestionControl !== \"\") {\n proxy[\"congestion-controller\"] = x.congestionControl;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.serverName !== \"\") {\n proxy.sni = x.serverName;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n default:\n return undefined;\n }\n\n if (udpEnabled(x, settings) && x.type !== ProxyType.Snell) {\n proxy.udp = true;\n }\n if (tfo !== undefined) {\n proxy.tfo = tfo;\n }\n if (settings.clashNewFieldName && x.underlyingProxy !== \"\") {\n proxy[\"dialer-proxy\"] = x.underlyingProxy;\n }\n return proxy;\n}\n\nfunction udpEnabled(x: Proxy, settings: ExtraSettings): boolean {\n return x.udp !== undefined ? x.udp : settings.udp === true;\n}\n\nexport interface ClashBuildResult {\n doc: Record<string, unknown>;\n nodeList: Proxy[];\n}\n\n/** Build the Clash document object (without serialization). */\nexport function buildClash(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n clashR = false,\n): ClashBuildResult {\n const proxies: ClashProxy[] = [];\n const nodeList: Proxy[] = [];\n const remarksList: string[] = [];\n\n for (const x of nodes) {\n const type = proxyTypeName(x.type);\n if (settings.appendProxyType) {\n x.remark = `[${type}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList, false);\n x.remark = remark;\n\n const skipCertVerify =\n x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const built = buildClashProxy(x, settings, clashR, remark, toTri(skipCertVerify), toTri(tfo));\n if (!built) {\n continue;\n }\n proxies.push(built);\n remarksList.push(remark);\n nodeList.push(x);\n }\n\n if (settings.nodeList) {\n return { doc: { proxies }, nodeList };\n }\n\n const groups: unknown[] = [];\n for (const group of extraProxyGroup) {\n const singlegroup: Record<string, unknown> = {\n name: group.name,\n type: group.type === \"smart\" ? \"url-test\" : group.type,\n };\n switch (group.type) {\n case \"select\":\n case \"relay\":\n break;\n case \"load-balance\":\n singlegroup.strategy = group.strategy;\n singlegroup.lazy = group.lazy;\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n case \"smart\":\n case \"url-test\":\n if (group.lazy !== undefined) {\n singlegroup.lazy = group.lazy;\n }\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n case \"fallback\":\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n default:\n continue;\n }\n if (group.disableUdp !== undefined) {\n singlegroup[\"disable-udp\"] = group.disableUdp;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodeList, filtered, true);\n }\n if (group.usingProvider.length > 0) {\n singlegroup.use = group.usingProvider;\n } else {\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n singlegroup.proxies = filtered;\n }\n groups.push(singlegroup);\n }\n\n const doc: Record<string, unknown> = {};\n if (settings.clashNewFieldName) {\n doc.proxies = proxies;\n if (groups.length > 0) {\n doc[\"proxy-groups\"] = groups;\n }\n } else {\n doc.Proxy = proxies;\n if (groups.length > 0) {\n doc[\"Proxy Group\"] = groups;\n }\n }\n return { doc, nodeList };\n}\n\n/** Serialize a Clash document built by {@link buildClash}. */\nexport function stringifyClash(doc: Record<string, unknown>): string {\n return yamlStringify(doc, {\n aliasDuplicateObjects: false,\n lineWidth: 0,\n });\n}\n\n/** Convert nodes into a Clash YAML configuration string. */\nexport function toClash(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n clashR = false,\n): string {\n const { doc } = buildClash(nodes, extraProxyGroup, settings, clashR);\n return stringifyClash(doc);\n}\n","import type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { RegexMatchConfig } from \"../types/settings\";\n\nfunction toRegex(pattern: string): RegExp {\n try {\n return new RegExp(pattern);\n } catch {\n return /$^/;\n }\n}\n\nfunction regFind(value: string, pattern: string): boolean {\n return toRegex(pattern).test(value);\n}\n\nfunction regMatch(value: string, pattern: string): boolean {\n const match = toRegex(pattern).exec(value);\n return match !== null && match[0] === value;\n}\n\nfunction regReplace(value: string, pattern: string, replacement: string): string {\n return value.replace(new RegExp(pattern, \"g\"), replacement);\n}\n\nconst TYPE_MATCH_NAMES: Partial<Record<ProxyType, string>> = {\n [ProxyType.AnyTLS]: \"ANYTLS\",\n [ProxyType.HTTP]: \"HTTP\",\n [ProxyType.HTTPS]: \"HTTPS\",\n [ProxyType.Hysteria]: \"HYSTERIA\",\n [ProxyType.Hysteria2]: \"HYSTERIA2\",\n [ProxyType.Shadowsocks]: \"SS\",\n [ProxyType.ShadowsocksR]: \"SSR\",\n [ProxyType.Snell]: \"SNELL\",\n [ProxyType.SOCKS5]: \"SOCKS5\",\n [ProxyType.Trojan]: \"TROJAN\",\n [ProxyType.TUIC]: \"TUIC\",\n [ProxyType.VLESS]: \"VLESS\",\n [ProxyType.VMess]: \"VMESS\",\n [ProxyType.WireGuard]: \"WIREGUARD\",\n};\n\n/** Does `target` fall within a subconverter range expression like `1-5,8,!3`? */\nexport function matchRange(range: string, target: number): boolean {\n const items = range.split(\",\");\n let match = false;\n for (const item of items) {\n if (/^-?\\d+$/.test(item)) {\n if (Number.parseInt(item, 10) === target) {\n match = true;\n }\n } else if (/^(\\d+)-(\\d+)$/.test(item)) {\n const m = /^(\\d+)-(\\d+)$/.exec(item) as RegExpExecArray;\n const begin = Number.parseInt(m[1] as string, 10);\n const end = Number.parseInt(m[2] as string, 10);\n if (target >= begin && target <= end) {\n match = true;\n }\n } else if (/^!-?(\\d+)$/.test(item)) {\n match = true;\n const m = /^!-?(\\d+)$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) === target) {\n match = false;\n }\n } else if (/^!(\\d+)-(\\d+)$/.test(item)) {\n match = true;\n const m = /^!(\\d+)-(\\d+)$/.exec(item) as RegExpExecArray;\n const begin = Number.parseInt(m[1] as string, 10);\n const end = Number.parseInt(m[2] as string, 10);\n if (target >= begin && target <= end) {\n match = false;\n }\n } else if (/^(\\d+)-$/.test(item)) {\n const m = /^(\\d+)-$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) >= target) {\n match = true;\n }\n } else if (/^(\\d+)\\+$/.test(item)) {\n const m = /^(\\d+)\\+$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) <= target) {\n match = true;\n }\n }\n }\n return match;\n}\n\n/**\n * Resolve a matcher rule against a node.\n *\n * Returns whether the rule's primary predicate matched; `realRule` receives the\n * remaining remark regex (empty means \"match all\").\n */\nexport function applyMatcher(rule: string, node: Proxy): { matched: boolean; realRule: string } {\n if (rule.startsWith(\"!!GROUP=\")) {\n const m = /^!!(?:GROUP)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: regFind(node.group, target), realRule };\n }\n if (rule.startsWith(\"!!GROUPID=\") || rule.startsWith(\"!!INSERT=\")) {\n const m = /^!!(?:GROUPID|INSERT)=([\\d\\-+!,]+)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n const dir = rule.startsWith(\"!!INSERT=\") ? -1 : 1;\n return { matched: matchRange(target, dir * node.groupId), realRule };\n }\n if (rule.startsWith(\"!!TYPE=\")) {\n const m = /^!!(?:TYPE)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n if (node.type === ProxyType.Unknown) {\n return { matched: false, realRule };\n }\n const name = TYPE_MATCH_NAMES[node.type] ?? \"\";\n return { matched: regMatch(name, target), realRule };\n }\n if (rule.startsWith(\"!!PORT=\")) {\n const m = /^!!(?:PORT)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: matchRange(target, node.port), realRule };\n }\n if (rule.startsWith(\"!!SERVER=\")) {\n const m = /^!!(?:SERVER)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: regFind(node.hostname, target), realRule };\n }\n return { matched: true, realRule: rule };\n}\n\n/** `true` when a node should be filtered out by the include/exclude remarks. */\nexport function checkIgnore(\n node: Proxy,\n excludeRemarks: string[],\n includeRemarks: string[],\n): boolean {\n const excluded = excludeRemarks.some((rule) => {\n const { matched, realRule } = applyMatcher(rule, node);\n if (!matched) {\n return false;\n }\n if (realRule === \"\") {\n return true;\n }\n return regFind(node.remark, realRule);\n });\n let included: boolean;\n if (includeRemarks.length > 0) {\n included = includeRemarks.some((rule) => {\n const { matched, realRule } = applyMatcher(rule, node);\n if (!matched) {\n return false;\n }\n if (realRule === \"\") {\n return true;\n }\n return regFind(node.remark, realRule);\n });\n } else {\n included = true;\n }\n return excluded || !included;\n}\n\n/** Remove excluded nodes and renumber the remaining ones in place. */\nexport function filterNodes(\n nodes: Proxy[],\n excludeRemarks: string[],\n includeRemarks: string[],\n groupId: number,\n): void {\n let nodeIndex = 0;\n const kept: Proxy[] = [];\n for (const node of nodes) {\n if (checkIgnore(node, excludeRemarks, includeRemarks)) {\n continue;\n }\n node.id = nodeIndex;\n node.groupId = groupId;\n nodeIndex += 1;\n kept.push(node);\n }\n nodes.length = 0;\n nodes.push(...kept);\n}\n\n/** Normalize a remark for output: `=`→`-`, optional CSV quoting, de-duplication. */\nexport function processRemark(remark: string, remarksList: string[], procComma = true): string {\n let result = remark.replace(/=/g, \"-\");\n if (procComma && result.includes(\",\")) {\n result = `\"${result}\"`;\n }\n let tempRemark = result;\n let count = 2;\n while (remarksList.includes(tempRemark)) {\n tempRemark = `${result} ${count}`;\n count += 1;\n }\n return tempRemark;\n}\n\n/** Expand a proxy-group `proxies` rule into concrete node remarks. */\nexport function groupGenerate(\n rule: string,\n nodeList: Proxy[],\n filteredNodeList: string[],\n addDirect: boolean,\n): void {\n if (rule.startsWith(\"[]\") && addDirect) {\n filteredNodeList.push(rule.slice(2));\n return;\n }\n for (const node of nodeList) {\n const { matched, realRule } = applyMatcher(rule, node);\n if (\n matched &&\n (realRule === \"\" || regFind(node.remark, realRule)) &&\n !filteredNodeList.includes(node.remark)\n ) {\n filteredNodeList.push(node.remark);\n }\n }\n}\n\n/** Strip leading astral emoji from a remark (mirrors subconverter's byte check). */\nexport function removeEmoji(originalRemark: string): string {\n let index = 0;\n while (index < originalRemark.length) {\n const code = originalRemark.codePointAt(index) as number;\n if (code >= 0x1f000 && code <= 0x1ffff) {\n index += code > 0xffff ? 2 : 1;\n } else {\n break;\n }\n }\n const remark = originalRemark.slice(index).trim();\n return remark === \"\" ? originalRemark : remark;\n}\n\n/** Prefix an emoji chosen by the emoji rules. */\nexport function addEmoji(node: Proxy, emojiArray: RegexMatchConfig[]): string {\n for (const rule of emojiArray) {\n if (rule.replace === \"\") {\n continue;\n }\n const { matched, realRule } = applyMatcher(rule.match, node);\n if (matched && realRule !== \"\" && regFind(node.remark, realRule)) {\n return `${rule.replace} ${node.remark}`;\n }\n }\n return node.remark;\n}\n\n/** Apply rename rules to a node's remark (script rules are ignored). */\nexport function nodeRename(node: Proxy, renameArray: RegexMatchConfig[]): void {\n const original = node.remark;\n for (const rule of renameArray) {\n if (rule.script !== \"\") {\n continue;\n }\n const { matched, realRule } = applyMatcher(rule.match, node);\n if (matched && realRule !== \"\") {\n node.remark = regReplace(node.remark, realRule, rule.replace);\n }\n }\n if (node.remark === \"\") {\n node.remark = original;\n }\n}\n\nexport interface PreprocessOptions {\n removeEmoji: boolean;\n addEmoji: boolean;\n sortFlag: boolean;\n renameArray: RegexMatchConfig[];\n emojiArray: RegexMatchConfig[];\n}\n\n/** Apply emoji removal, renaming, emoji insertion, and optional sorting. */\nexport function preprocessNodes(nodes: Proxy[], options: PreprocessOptions): void {\n for (const node of nodes) {\n if (options.removeEmoji) {\n node.remark = removeEmoji(node.remark).trim();\n }\n nodeRename(node, options.renameArray);\n if (options.addEmoji) {\n node.remark = addEmoji(node, options.emojiArray);\n }\n }\n if (options.sortFlag) {\n nodes.sort((a, b) => (a.remark < b.remark ? -1 : a.remark > b.remark ? 1 : 0));\n }\n}\n\n/** Remove nodes that share a type, server, port, and remark. Returns the count removed. */\nexport function dedupeNodes(nodes: Proxy[]): number {\n const seen = new Set<string>();\n const kept: Proxy[] = [];\n for (const node of nodes) {\n const key = `${node.type}\\u0000${node.hostname}\\u0000${node.port}\\u0000${node.remark}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n kept.push(node);\n }\n const removed = nodes.length - kept.length;\n nodes.length = 0;\n nodes.push(...kept);\n return removed;\n}\n","import { isSsCipher, SSR_CIPHERS } from \"../parser/ciphers\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode, urlSafeBase64Encode } from \"../utils/base64\";\nimport { toInt } from \"../utils/string\";\nimport { getUrlArg, urlEncode } from \"../utils/url\";\n\n/** Build the JSON payload of a `vmess://` link. */\nexport function vmessLinkConstruct(\n remarks: string,\n add: string,\n port: string,\n type: string,\n id: string,\n aid: string,\n net: string,\n path: string,\n host: string,\n tls: string,\n): string {\n return JSON.stringify({\n add,\n aid,\n host,\n id,\n net: net === \"\" ? \"tcp\" : net,\n path,\n port,\n ps: remarks,\n tls,\n type: type === \"\" ? \"none\" : type,\n v: \"2\",\n });\n}\n\n/** Build an `ss://` link. */\nexport function ssLinkConstruct(proxy: Proxy): string {\n const port = String(proxy.port);\n let link = `ss://${urlSafeBase64Encode(`${proxy.encryptMethod}:${proxy.password}`)}@${proxy.hostname}:${port}`;\n if (proxy.plugin !== \"\" && proxy.pluginOption !== \"\") {\n link += `/?plugin=${urlEncode(`${proxy.plugin};${proxy.pluginOption}`)}`;\n }\n link += `#${urlEncode(proxy.remark)}`;\n return link;\n}\n\n/** Build an `ssr://` link. */\nexport function ssrLinkConstruct(\n hostname: string,\n port: number,\n protocol: string,\n method: string,\n obfs: string,\n password: string,\n group: string,\n remark: string,\n obfsParam = \"\",\n protocolParam = \"\",\n): string {\n const payload =\n `${hostname}:${port}:${protocol}:${method}:${obfs}:${urlSafeBase64Encode(password)}` +\n `/?group=${urlSafeBase64Encode(group)}&remarks=${urlSafeBase64Encode(remark)}` +\n `&obfsparam=${urlSafeBase64Encode(obfsParam)}&protoparam=${urlSafeBase64Encode(protocolParam)}`;\n return `ssr://${urlSafeBase64Encode(payload)}`;\n}\n\n/** Build a `trojan://` link. */\nexport function trojanLinkConstruct(proxy: Proxy): string {\n const port = String(proxy.port);\n let link = `trojan://${proxy.password}@${proxy.hostname}:${port}?allowInsecure=${proxy.allowInsecure === true ? \"1\" : \"0\"}`;\n if (proxy.host !== \"\") {\n link += `&sni=${proxy.host}`;\n }\n if (proxy.transferProtocol === \"ws\") {\n link += \"&ws=1\";\n if (proxy.path !== \"\") {\n link += `&wspath=${urlEncode(proxy.path)}`;\n }\n }\n link += `#${urlEncode(proxy.remark)}`;\n return link;\n}\n\nfunction getBit(types: number, position: number): boolean {\n return (types & (1 << (position - 1))) !== 0;\n}\n\n/**\n * Export nodes as a plaintext or base64 list of share links.\n * `types` bitmask: SS=1, SSR=2, VMess=4, Trojan=8.\n */\nexport function proxyToSingle(nodes: Proxy[], types: number, settings: ExtraSettings): string {\n const ss = getBit(types, 1);\n const ssr = getBit(types, 2);\n const vmess = getBit(types, 3);\n const trojan = getBit(types, 4);\n let allLinks = \"\";\n\n for (const x of nodes) {\n let proxyStr = \"\";\n const port = String(x.port);\n const aid = String(x.alterId);\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (ss) {\n proxyStr = ssLinkConstruct(x);\n } else if (ssr) {\n if (SSR_CIPHERS.includes(x.encryptMethod) && x.plugin === \"\") {\n proxyStr = ssrLinkConstruct(\n x.hostname,\n x.port,\n \"origin\",\n x.encryptMethod,\n \"plain\",\n x.password,\n x.group,\n x.remark,\n );\n }\n } else {\n continue;\n }\n break;\n case ProxyType.ShadowsocksR:\n if (ssr) {\n proxyStr = ssrLinkConstruct(\n x.hostname,\n x.port,\n x.protocol,\n x.encryptMethod,\n x.obfs,\n x.password,\n x.group,\n x.remark,\n x.obfsParam,\n x.protocolParam,\n );\n } else if (ss) {\n if (isSsCipher(x.encryptMethod) && x.protocol === \"origin\" && x.obfs === \"plain\") {\n proxyStr = `ss://${urlSafeBase64Encode(`${x.encryptMethod}:${x.password}`)}@${x.hostname}:${port}#${urlEncode(x.remark)}`;\n }\n } else {\n continue;\n }\n break;\n case ProxyType.VMess:\n if (!vmess) {\n continue;\n }\n proxyStr = `vmess://${base64Encode(\n vmessLinkConstruct(\n x.remark,\n x.hostname,\n port,\n x.fakeType,\n x.userId,\n aid,\n x.transferProtocol,\n x.path,\n x.host,\n x.tlsSecure ? \"tls\" : \"\",\n ),\n )}`;\n break;\n case ProxyType.Trojan:\n if (!trojan) {\n continue;\n }\n proxyStr = trojanLinkConstruct(x);\n break;\n default:\n continue;\n }\n if (proxyStr !== \"\") {\n allLinks += `${proxyStr}\\n`;\n }\n }\n\n return settings.nodeList ? allLinks : base64Encode(allLinks);\n}\n\n/** Export Shadowsocks nodes as a SIP008 (`ssconf`) document. */\nexport function proxyToSsSub(nodes: Proxy[], baseConf: string): string {\n let base: Record<string, unknown>;\n try {\n const trimmed = baseConf.trim() === \"\" ? \"{}\" : baseConf;\n base = JSON.parse(trimmed) as Record<string, unknown>;\n } catch {\n base = {};\n }\n const proxies: unknown[] = [];\n for (const x of nodes) {\n let plugin = x.plugin;\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (plugin === \"simple-obfs\") {\n plugin = \"obfs-local\";\n }\n break;\n case ProxyType.ShadowsocksR:\n if (!isSsCipher(x.encryptMethod) || x.protocol !== \"origin\" || x.obfs !== \"plain\") {\n continue;\n }\n break;\n default:\n continue;\n }\n proxies.push({\n ...base,\n method: x.encryptMethod,\n password: x.password,\n plugin,\n plugin_opts: x.pluginOption,\n remarks: x.remark,\n server: x.hostname,\n server_port: x.port,\n });\n }\n return JSON.stringify(proxies);\n}\n\n/** Export Shadowsocks nodes as an `ssd://` document. */\nexport function proxyToSsd(nodes: Proxy[], group: string, userinfo: string): string {\n const resolvedGroup = group === \"\" ? \"SSD\" : group;\n const doc: Record<string, unknown> = {\n airport: resolvedGroup,\n encryption: \"aes-128-gcm\",\n password: \"password\",\n port: 1,\n };\n if (userinfo !== \"\") {\n const data = userinfo.replace(/; /g, \"&\");\n const upload = getUrlArg(data, \"upload\");\n const download = getUrlArg(data, \"download\");\n const total = getUrlArg(data, \"total\");\n const expiry = getUrlArg(data, \"expire\");\n const gb = 1024 ** 3;\n doc.traffic_used = (Number(upload || 0) + Number(download || 0)) / gb;\n doc.traffic_total = Number(total || 0) / gb;\n if (expiry !== \"\") {\n const date = new Date(toInt(expiry) * 1000);\n doc.expiry = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}-${String(date.getDate()).padStart(2, \"0\")} ${String(date.getHours()).padStart(2, \"0\")}:${String(date.getMinutes()).padStart(2, \"0\")}`;\n }\n }\n const servers: unknown[] = [];\n let index = 0;\n for (const x of nodes) {\n if (x.type === ProxyType.Shadowsocks) {\n const plugin = x.plugin === \"obfs-local\" ? \"simple-obfs\" : x.plugin;\n servers.push({\n encryption: x.encryptMethod,\n id: index,\n password: x.password,\n plugin,\n plugin_options: x.pluginOption,\n port: x.port,\n remarks: x.remark,\n server: x.hostname,\n });\n index += 1;\n } else if (x.type === ProxyType.ShadowsocksR) {\n if (isSsCipher(x.encryptMethod) && x.protocol === \"origin\" && x.obfs === \"plain\") {\n servers.push({\n encryption: x.encryptMethod,\n id: index,\n password: x.password,\n port: x.port,\n remarks: x.remark,\n server: x.hostname,\n });\n index += 1;\n }\n }\n }\n doc.servers = servers;\n return `ssd://${base64Encode(JSON.stringify(doc))}`;\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { fnv1a64Hex } from \"../utils/hash\";\nimport { isIpv4, isIpv6 } from \"../utils/string\";\n\ninterface RawSection {\n name: string;\n lines: string[];\n}\n\nfunction parseRawSections(text: string): RawSection[] {\n const sections: RawSection[] = [];\n let current: RawSection | undefined;\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine;\n const header = /^\\[(.*)\\]$/.exec(line.trim());\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line.trim() === \"\") {\n continue;\n }\n if (current) {\n current.lines.push(line);\n }\n }\n return sections;\n}\n\nfunction triStr(value: boolean | undefined): string {\n return value ? \"true\" : \"false\";\n}\n\nfunction httpProxyLine(x: Proxy, scv: boolean | undefined): string {\n let proxy = `http, ${x.hostname}, ${x.port}`;\n if (x.username !== \"\") {\n proxy += `, username=${x.username}`;\n }\n if (x.password !== \"\") {\n proxy += `, password=${x.password}`;\n }\n proxy += `, tls=${triStr(x.tlsSecure)}`;\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n return proxy;\n}\n\n/** Build a WireGuard `peer=(...)` clause. */\nexport function generatePeer(node: Proxy, clientIdAsReserved = false): string {\n let result = `public-key = ${node.publicKey}`;\n result += `, endpoint = ${node.hostname}:${node.port}`;\n if (node.preSharedKey !== \"\") {\n result += `, preshared-key = ${node.preSharedKey}`;\n }\n if (node.allowedIps !== \"\") {\n result += `, allowed-ips = \"${node.allowedIps}\"`;\n }\n if (node.keepAlive > 0) {\n result += `, keepalive = ${node.keepAlive}`;\n }\n if (node.clientId !== \"\") {\n result += clientIdAsReserved\n ? `, reserved = [${node.clientId}]`\n : `, client-id = ${node.clientId}`;\n }\n return result;\n}\n\nexport interface SurgeOptions {\n version: number;\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\ninterface SurgeBuildResult {\n proxies: string[];\n groups: string[];\n extraSections: Map<string, string[]>;\n sectionOrder: string[];\n}\n\nfunction buildSurge(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurgeOptions,\n): SurgeBuildResult {\n const surgeVer = options.version;\n const remarksList: string[] = [];\n const proxies: string[] = [];\n const nodelist: Proxy[] = [];\n const extraSections = new Map<string, string[]>();\n const sectionOrder: string[] = [];\n let localPort = 1080;\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tls13 = x.tls13 !== undefined ? x.tls13 : settings.tls13;\n\n let proxy = \"\";\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (surgeVer >= 3 || surgeVer === -3) {\n proxy = `ss, ${x.hostname}, ${x.port}, encrypt-method=${x.encryptMethod}, password=${x.password}`;\n } else {\n proxy = `custom, ${x.hostname}, ${x.port}, ${x.encryptMethod}, ${x.password}, https://github.com/pobizhe/SSEncrypt/raw/master/SSEncrypt.module`;\n }\n if (x.plugin !== \"\") {\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n if (x.pluginOption !== \"\") {\n proxy += `,${x.pluginOption.replace(/;/g, \",\")}`;\n }\n } else {\n continue;\n }\n }\n break;\n case ProxyType.VMess: {\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `vmess, ${x.hostname}, ${x.port}, username=${x.userId}, tls=${triStr(x.tlsSecure)}, vmess-aead=${x.alterId === 0 ? \"true\" : \"false\"}`;\n if (x.tlsSecure && tls13 !== undefined) {\n proxy += `, tls13=${triStr(tls13)}`;\n }\n const headers: string[] = [];\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\": {\n if (x.host === \"\") {\n proxy += `, ws=true, ws-path=${x.path}, sni=${x.hostname}`;\n } else {\n proxy += `, ws=true, ws-path=${x.path}, sni=${x.host}`;\n }\n if (x.host !== \"\") {\n headers.push(`Host:${x.host}`);\n }\n if (x.edge !== \"\") {\n headers.push(`Edge:${x.edge}`);\n }\n if (headers.length > 0) {\n proxy += `, ws-headers=${headers.join(\"|\")}`;\n }\n break;\n }\n default:\n continue;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n }\n case ProxyType.ShadowsocksR: {\n if (settings.surgeSsrPath === \"\" || surgeVer < 2) {\n continue;\n }\n const args = [\n \"-l\",\n String(localPort),\n \"-s\",\n x.hostname,\n \"-p\",\n String(x.port),\n \"-m\",\n x.encryptMethod,\n \"-k\",\n x.password,\n \"-o\",\n x.obfs,\n \"-O\",\n x.protocol,\n ];\n if (x.obfsParam !== \"\") {\n args.push(\"-g\", x.obfsParam);\n }\n if (x.protocolParam !== \"\") {\n args.push(\"-G\", x.protocolParam);\n }\n proxy = `external, exec=\"${settings.surgeSsrPath}\", args=\"${args.join('\", args=\"')}\", local-port=${localPort}`;\n if (isIpv4(x.hostname) || isIpv6(x.hostname)) {\n proxy += `, addresses=${x.hostname}`;\n }\n localPort += 1;\n break;\n }\n case ProxyType.SOCKS5:\n proxy = `socks5, ${x.hostname}, ${x.port}`;\n if (x.username !== \"\") {\n proxy += `, username=${x.username}`;\n }\n if (x.password !== \"\") {\n proxy += `, password=${x.password}`;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n case ProxyType.HTTPS:\n if (surgeVer === -3) {\n proxy = `https, ${x.hostname}, ${x.port}, ${x.username}, ${x.password}`;\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n }\n proxy = httpProxyLine(x, scv);\n break;\n case ProxyType.HTTP:\n proxy = httpProxyLine(x, scv);\n break;\n case ProxyType.Trojan:\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `trojan, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.snellVersion !== 0) {\n proxy += `, version=${x.snellVersion}`;\n }\n if (x.host !== \"\") {\n proxy += `, sni=${x.host}`;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n case ProxyType.Snell:\n proxy = `snell, ${x.hostname}, ${x.port}, psk=${x.password}`;\n if (x.obfs !== \"\") {\n proxy += `, obfs=${x.obfs}`;\n if (x.host !== \"\") {\n proxy += `, obfs-host=${x.host}`;\n }\n }\n if (x.snellVersion !== 0) {\n proxy += `, version=${x.snellVersion}`;\n }\n break;\n case ProxyType.WireGuard: {\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n const section = fnv1a64Hex(x.remark).slice(0, 5);\n proxy = `wireguard, section-name=${section}`;\n if (x.testUrl !== \"\") {\n proxy += `, test-url=${x.testUrl}`;\n }\n const wgLines: string[] = [`private-key = ${x.privateKey}`, `self-ip = ${x.selfIp}`];\n if (x.selfIpv6 !== \"\") {\n wgLines.push(`self-ip-v6 = ${x.selfIpv6}`);\n }\n if (x.dnsServers.length > 0) {\n wgLines.push(`dns-server = ${x.dnsServers.join(\",\")}`);\n }\n if (x.mtu > 0) {\n wgLines.push(`mtu = ${x.mtu}`);\n }\n wgLines.push(`peer = (${generatePeer(x)})`);\n const sectionName = `WireGuard ${section}`;\n extraSections.set(sectionName, wgLines);\n sectionOrder.push(sectionName);\n break;\n }\n case ProxyType.Hysteria2:\n if (surgeVer < 4) {\n continue;\n }\n proxy = `hysteria, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.downSpeed) {\n proxy += `, download-bandwidth=${x.downSpeed}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${triStr(scv)}`;\n }\n if (x.fingerprint !== \"\") {\n proxy += `,server-cert-fingerprint-sha256=${x.fingerprint}`;\n }\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n break;\n case ProxyType.AnyTLS:\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `anytls, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n break;\n default:\n continue;\n }\n\n if (tfo !== undefined) {\n proxy += `, tfo=${triStr(tfo)}`;\n }\n if (udp !== undefined) {\n proxy += `, udp-relay=${triStr(udp)}`;\n }\n if (x.underlyingProxy !== \"\") {\n proxy += `, underlying-proxy=${x.underlyingProxy}`;\n }\n\n proxies.push(`${remark} = ${proxy}`);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return { extraSections, groups: [], proxies, sectionOrder };\n }\n\n const groups: string[] = [];\n for (const group of extraProxyGroup) {\n const filtered: string[] = [];\n let groupLine = \"\";\n switch (group.type) {\n case \"select\":\n case \"smart\":\n case \"url-test\":\n case \"fallback\":\n break;\n case \"load-balance\":\n if (surgeVer < 1 && surgeVer !== -3) {\n continue;\n }\n break;\n case \"ssid\": {\n const rest = group.proxies.slice(1).join(\",\");\n const line = `${group.type},default=${group.proxies[0] ?? \"\"},${rest}`;\n groups.push(`${group.name} = ${line}`);\n continue;\n }\n default:\n continue;\n }\n\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n if (filtered.length === 1) {\n const single = (filtered[0] as string).toLowerCase();\n if (single === \"direct\" || single === \"reject\" || single === \"reject-tinygif\") {\n proxies.push(`${group.name} = ${single}`);\n continue;\n }\n }\n groupLine = `${group.type},${filtered.join(\",\")}`;\n if (group.type === \"url-test\" || group.type === \"fallback\" || group.type === \"load-balance\") {\n groupLine += `,url=${group.url},interval=${group.interval}`;\n if (group.tolerance > 0) {\n groupLine += `,tolerance=${group.tolerance}`;\n }\n if (group.timeout > 0) {\n groupLine += `,timeout=${group.timeout}`;\n }\n if (group.persistent !== undefined) {\n groupLine += `,persistent=${triStr(group.persistent)}`;\n }\n if (group.evaluateBeforeUse !== undefined) {\n groupLine += `,evaluate-before-use=${triStr(group.evaluateBeforeUse)}`;\n }\n }\n groups.push(`${group.name} = ${groupLine}`);\n }\n\n return { extraSections, groups, proxies, sectionOrder };\n}\n\n/** Convert nodes into a Surge configuration string. */\nexport function toSurge(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurgeOptions,\n): string {\n const result = buildSurge(nodes, extraProxyGroup, settings, options);\n if (options.nodeList) {\n return result.proxies.join(\"\\n\");\n }\n\n const baseSections = options.baseConf === \"\" ? [] : parseRawSections(options.baseConf);\n const byName = new Map<string, RawSection>();\n const order: string[] = [];\n for (const section of baseSections) {\n byName.set(section.name, section);\n order.push(section.name);\n }\n const setSection = (name: string, lines: string[]): void => {\n if (!byName.has(name)) {\n order.push(name);\n }\n byName.set(name, { lines, name });\n };\n setSection(\"Proxy\", [\"DIRECT = direct\", ...result.proxies]);\n if (result.groups.length > 0) {\n setSection(\"Proxy Group\", result.groups);\n }\n for (const name of result.sectionOrder) {\n setSection(name, result.extraSections.get(name) as string[]);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setSection(options.rules.section, options.rules.lines);\n }\n\n const out: string[] = [];\n for (const name of order) {\n const section = byName.get(name);\n if (!section) {\n continue;\n }\n out.push(`[${name}]`);\n out.push(...section.lines);\n out.push(\"\");\n }\n return out.join(\"\\n\").trimEnd() + \"\\n\";\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { generatePeer } from \"./surge\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { isIpv4, isIpv6 } from \"../utils/string\";\n\nfunction buildLoonNode(x: Proxy, settings: ExtraSettings, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n let method = x.encryptMethod;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxy: string;\n switch (x.type) {\n case ProxyType.Shadowsocks:\n proxy = `Shadowsocks,${hostname},${port},${method},\"${x.password}\"`;\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n if (x.pluginOption !== \"\") {\n proxy += `,${x.pluginOption.replace(/;obfs-host=/g, \",\").replace(/obfs=/g, \"\")}`;\n }\n } else if (x.plugin !== \"\") {\n return undefined;\n }\n break;\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxy = `vmess,${hostname},${port},${method},\"${x.userId}\",over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure) {\n proxy += `,tls-name=${x.host}`;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n proxy += \",transport=tcp\";\n break;\n case \"ws\":\n proxy += `,transport=ws,path=${x.path},host=${x.host}`;\n break;\n default:\n return undefined;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.ShadowsocksR:\n proxy = `ShadowsocksR,${hostname},${port},${method},\"${x.password}\",protocol=${x.protocol},protocol-param=${x.protocolParam},obfs=${x.obfs},obfs-param=${x.obfsParam}`;\n break;\n case ProxyType.HTTP:\n proxy = `http,${hostname},${port},${x.username},\"${x.password}\"`;\n break;\n case ProxyType.HTTPS:\n proxy = `https,${hostname},${port},${x.username},\"${x.password}\"`;\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.Trojan:\n proxy = `trojan,${hostname},${port},\"${x.password}\"`;\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.SOCKS5:\n proxy = `socks5,${hostname},${port}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxy += `,${x.username},\"${x.password}\"`;\n }\n proxy += `,over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure) {\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n }\n break;\n case ProxyType.WireGuard:\n proxy = `wireguard, interface-ip=${x.selfIp}`;\n if (x.selfIpv6 !== \"\") {\n proxy += `, interface-ipv6=${x.selfIpv6}`;\n }\n proxy += `, private-key=${x.privateKey}`;\n for (const dns of x.dnsServers) {\n if (isIpv4(dns)) {\n proxy += `, dns=${dns}`;\n } else if (isIpv6(dns)) {\n proxy += `, dnsv6=${dns}`;\n }\n }\n if (x.mtu > 0) {\n proxy += `, mtu=${x.mtu}`;\n }\n if (x.keepAlive > 0) {\n proxy += `, keepalive=${x.keepAlive}`;\n }\n proxy += `, peers=[{${generatePeer(x, true)}}]`;\n break;\n case ProxyType.Hysteria2:\n proxy = `hysteria2,${hostname},${port},\"${x.password}\"`;\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n if (x.fingerprint !== \"\") {\n proxy += `,tls-cert-sha256=${x.fingerprint}`;\n }\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n break;\n case ProxyType.AnyTLS:\n proxy = `anytls,${hostname},${port},\"${x.password}\"`;\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n default:\n return undefined;\n }\n if (settings.tfo) {\n proxy += \",fast-open=true\";\n }\n if (settings.udp) {\n proxy += \",udp=true\";\n }\n void remark;\n return proxy;\n}\n\nfunction buildLoonGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n const filtered: string[] = [];\n switch (group.type) {\n case \"select\":\n case \"load-balance\":\n case \"url-test\":\n case \"fallback\":\n break;\n case \"ssid\":\n if (group.proxies.length < 2) {\n continue;\n }\n lines.push(\n `${group.name} = ssid,default=${group.proxies[0]},${group.proxies.slice(1).join(\",\")}`,\n );\n continue;\n default:\n continue;\n }\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n let groupLine = `${group.type},${filtered.join(\",\")}`;\n if (group.type !== \"select\") {\n groupLine += `,url=${group.url},interval=${group.interval}`;\n if (group.type === \"load-balance\") {\n groupLine += `,algorithm=${group.strategy === \"round-robin\" ? \"round-robin\" : \"pcc\"}`;\n if (group.timeout > 0) {\n groupLine += `,max-timeout=${group.timeout}`;\n }\n }\n if (group.type === \"url-test\" && group.tolerance > 0) {\n groupLine += `,tolerance=${group.tolerance}`;\n }\n if (group.type === \"fallback\") {\n groupLine += `,max-timeout=${group.timeout}`;\n }\n }\n lines.push(`${group.name} = ${groupLine}`);\n }\n return lines;\n}\n\nexport interface LoonOptions {\n baseConf: string;\n nodeList: boolean;\n}\n\n/** Convert nodes into a Loon configuration string. */\nexport function toLoon(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: LoonOptions,\n): string {\n const remarksList: string[] = [];\n const proxyLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildLoonNode(x, settings, remark);\n if (line === undefined) {\n continue;\n }\n proxyLines.push(`${remark} = ${line}`);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return proxyLines.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"Proxy\", proxyLines);\n const groupLines = buildLoonGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"Proxy Group\", groupLines);\n }\n return renderRawIni(sections);\n}\n","import type { RulesetContent, RulesetType } from \"../types/ruleset\";\nimport { RulesetType as RulesetTypeEnum } from \"../types/ruleset\";\n\nconst BASIC_TYPES = [\n \"DOMAIN\",\n \"DOMAIN-SUFFIX\",\n \"DOMAIN-KEYWORD\",\n \"IP-CIDR\",\n \"SRC-IP-CIDR\",\n \"GEOIP\",\n \"MATCH\",\n \"FINAL\",\n];\n\nexport const CLASH_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"SRC-PORT\",\n \"DST-PORT\",\n \"PROCESS-NAME\",\n];\n\nexport const SURGE2_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"USER-AGENT\",\n \"URL-REGEX\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nexport const SURGE_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"USER-AGENT\",\n \"URL-REGEX\",\n \"AND\",\n \"OR\",\n \"NOT\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nexport const QUANX_RULE_TYPES = [\n ...BASIC_TYPES,\n \"USER-AGENT\",\n \"HOST\",\n \"HOST-SUFFIX\",\n \"HOST-KEYWORD\",\n];\n\nexport const SURF_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nfunction isIpv4(value: string): boolean {\n const parts = value.split(\".\");\n return parts.length === 4 && parts.every((p) => /^\\d{1,3}$/.test(p) && Number(p) <= 255);\n}\n\nfunction stripComment(line: string): string {\n const idx = line.indexOf(\"//\");\n return (idx >= 0 ? line.slice(0, idx) : line).trim();\n}\n\nfunction isRuleLine(line: string): boolean {\n return line.length > 0 && line[0] !== \";\" && line[0] !== \"#\" && !line.startsWith(\"//\");\n}\n\n/**\n * Convert a ruleset body into the common `TYPE,VALUE[,flag]` Surge dialect.\n * Mirrors ruleconvert.cpp `convertRuleset`.\n */\nexport function convertRuleset(content: string, type: RulesetType): string {\n if (type === RulesetTypeEnum.Surge) {\n return content;\n }\n\n if (/^payload:\\r?\\n/.test(content)) {\n let output = content.replace(/payload:\\r?\\n/, \"\");\n output = output.replace(/^\\s*-\\s+(['\"]?)(.*?)\\1\\s*$/gm, \"$2\");\n if (type === RulesetTypeEnum.ClashClassical) {\n return output;\n }\n const lines: string[] = [];\n for (let raw of output.split(/\\r?\\n/)) {\n raw = raw.trim();\n if (raw.includes(\"//\")) {\n raw = stripComment(raw);\n }\n if (!isRuleLine(raw)) {\n continue;\n }\n let prefix: string;\n if (raw.includes(\"/\")) {\n prefix = isIpv4(raw.slice(0, raw.indexOf(\"/\"))) ? \"IP-CIDR,\" : \"IP-CIDR6,\";\n } else if (raw.startsWith(\".\") || raw.startsWith(\"+.\")) {\n let keyword = false;\n let value = raw;\n while (value.endsWith(\".*\")) {\n keyword = true;\n value = value.slice(0, -2);\n }\n prefix = keyword ? \"DOMAIN-KEYWORD,\" : \"DOMAIN-SUFFIX,\";\n value = value.slice(value.startsWith(\"+.\") ? 2 : value.startsWith(\".\") ? 1 : 0);\n lines.push(prefix + value);\n continue;\n } else {\n prefix = \"DOMAIN,\";\n }\n lines.push(prefix + raw);\n }\n return lines.join(\"\\n\");\n }\n\n // QuanX dialect.\n const lines: string[] = [];\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line === \"\" || line.startsWith(\"#\") || line.startsWith(\";\")) {\n continue;\n }\n const normalized = line.replace(/^host/i, \"DOMAIN\").replace(/^ip6-cidr/i, \"IP-CIDR6\");\n const match =\n /^(DOMAIN(?:-(?:SUFFIX|KEYWORD))?|IP-CIDR6?|USER-AGENT),\\s*?(\\S*?)(?:,(?!no-resolve).*?)(,no-resolve)?$/i.exec(\n normalized,\n );\n if (match) {\n const ruleType = (match[1] as string).toUpperCase();\n const value = match[2] as string;\n lines.push(`${ruleType},${value}${match[3] ?? \"\"}`);\n } else {\n lines.push(normalized);\n }\n }\n return lines.join(\"\\n\");\n}\n\n/** Rewrite `TYPE,VALUE[,flag]` into `TYPE,VALUE,GROUP[,flag]`. */\nexport function transformRuleToCommon(input: string, group: string, noResolveOnly = false): string {\n const parts = input.split(\",\");\n if (parts.length < 2) {\n return `${parts[0] ?? \"\"},${group}`;\n }\n let line = `${parts[0]},${parts[1]},${group}`;\n if (parts.length > 2 && (!noResolveOnly || parts[2] === \"no-resolve\")) {\n line += `,${parts[2]}`;\n }\n return line;\n}\n\nfunction startsWithAny(line: string, types: string[]): boolean {\n return types.some((type) => line.startsWith(type));\n}\n\nfunction collectRuleLines(content: string, group: string, noResolveOnly: boolean): string[] {\n const converted = convertRuleset(content, RulesetTypeEnum.Surge);\n const out: string[] = [];\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n if (line === \"\") {\n continue;\n }\n out.push(transformRuleToCommon(line, group, noResolveOnly));\n }\n return out;\n}\n\n/** Convert rulesets into an ordered list of Clash rule strings. */\nexport function rulesetToClashRules(rulesets: RulesetContent[]): string[] {\n const rules: string[] = [];\n for (const ruleset of rulesets) {\n const content = ruleset.content;\n if (content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (content.startsWith(\"[]\")) {\n let line = content.slice(2);\n if (line.startsWith(\"FINAL\")) {\n line = `MATCH${line.slice(5)}`;\n }\n rules.push(transformRuleToCommon(line, group));\n continue;\n }\n const converted = convertRuleset(content, ruleset.ruleType);\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (!startsWithAny(line, CLASH_RULE_TYPES)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n rules.push(transformRuleToCommon(line, group));\n }\n }\n return rules;\n}\n\nexport interface SurgeRulesetResult {\n section: string;\n lines: string[];\n}\n\n/** Convert rulesets into Surge/QuanX/Quan/Loon rule lines. */\nexport function rulesetToSurgeRules(\n rulesets: RulesetContent[],\n surgeVersion: number,\n): SurgeRulesetResult {\n let section: string;\n let allowed: string[];\n let noResolveOnly = false;\n switch (surgeVersion) {\n case 0:\n section = \"RoutingRule\";\n allowed = SURGE_RULE_TYPES;\n break;\n case -1:\n section = \"filter_local\";\n allowed = QUANX_RULE_TYPES;\n noResolveOnly = true;\n break;\n case -2:\n section = \"TCP\";\n allowed = QUANX_RULE_TYPES;\n noResolveOnly = true;\n break;\n case -3:\n section = \"Rule\";\n allowed = SURF_RULE_TYPES;\n break;\n case -4:\n section = \"Rule\";\n allowed = SURGE_RULE_TYPES;\n break;\n default:\n section = \"Rule\";\n allowed = surgeVersion > 2 ? SURGE_RULE_TYPES : SURGE2_RULE_TYPES;\n break;\n }\n const lines: string[] = [];\n for (const ruleset of rulesets) {\n if (ruleset.content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (ruleset.content.startsWith(\"[]\")) {\n let line = ruleset.content.slice(2);\n if (line === \"MATCH\") {\n line = \"FINAL\";\n }\n if (surgeVersion === -1 || surgeVersion === -2) {\n line = transformRuleToCommon(line, group, true);\n } else if (!line.startsWith(\"AND\") && !line.startsWith(\"OR\") && !line.startsWith(\"NOT\")) {\n line = transformRuleToCommon(line, group);\n }\n lines.push(line.replace(/,,/g, \",\"));\n continue;\n }\n for (const rawLine of collectRuleLines(ruleset.content, group, noResolveOnly)) {\n if (surgeVersion === -2 && rawLine.startsWith(\"IP-CIDR6\")) {\n continue;\n }\n if (!startsWithAny(rawLine, allowed)) {\n continue;\n }\n const line =\n surgeVersion === -1 || surgeVersion === -2\n ? rawLine.replace(/^IP-CIDR6/, \"IP6-CIDR\")\n : rawLine;\n lines.push(line);\n }\n }\n return { lines, section };\n}\n\nexport const SING_BOX_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-VERSION\",\n \"INBOUND\",\n \"PROTOCOL\",\n \"NETWORK\",\n \"GEOSITE\",\n \"SRC-GEOIP\",\n \"DOMAIN-REGEX\",\n \"PROCESS-NAME\",\n \"PROCESS-PATH\",\n \"PACKAGE-NAME\",\n \"PORT\",\n \"PORT-RANGE\",\n \"SRC-PORT\",\n \"SRC-PORT-RANGE\",\n \"USER\",\n \"USER-ID\",\n];\n\n/** A sing-box `route` fragment produced from rulesets. */\nexport interface SingBoxRoute {\n rules: Record<string, unknown>[];\n final: string;\n}\n\nfunction toSingBoxKey(type: string): string {\n return type\n .toLowerCase()\n .replace(/-/g, \"_\")\n .replace(/ip_cidr6/g, \"ip_cidr\")\n .replace(/src_/g, \"source_\");\n}\n\n/**\n * Convert rulesets into a sing-box `route` fragment.\n * Mirrors ruleconvert.cpp `rulesetToSingBox`.\n */\nexport function rulesetToSingBoxRules(rulesets: RulesetContent[]): SingBoxRoute {\n const rules: Record<string, unknown>[] = [{ outbound: \"dns-out\", protocol: \"dns\" }];\n let final = \"\";\n\n for (const ruleset of rulesets) {\n const content = ruleset.content;\n if (content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (content.startsWith(\"[]\")) {\n const line = content.slice(2);\n if (line.startsWith(\"FINAL\") || line.startsWith(\"MATCH\")) {\n final = group;\n continue;\n }\n const parts = line.split(\",\");\n if (parts.length < 2) {\n continue;\n }\n const type = toSingBoxKey(parts[0] as string);\n const value = (parts[1] as string).toLowerCase();\n if (type === \"match\" || type === \"final\") {\n rules.push({ outbound: value });\n } else {\n rules.push({ outbound: group, [type]: value });\n }\n continue;\n }\n\n const converted = convertRuleset(content, ruleset.ruleType);\n const rule: Record<string, unknown> = {};\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n const args = line.split(\",\");\n if (args.length < 2) {\n continue;\n }\n const rawType = args[0] as string;\n if (!SING_BOX_RULE_TYPES.includes(rawType)) {\n continue;\n }\n const key = toSingBoxKey(rawType);\n const value = (args[1] as string).toLowerCase();\n const bucket = (rule[key] as string[] | undefined) ?? [];\n bucket.push(value);\n rule[key] = bucket;\n }\n if (Object.keys(rule).length === 0) {\n continue;\n }\n rule.outbound = group;\n rules.push(rule);\n }\n\n return { final, rules };\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { rulesetToSurgeRules } from \"./ruleset\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { RulesetContent } from \"../types/ruleset\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { urlSafeBase64Encode } from \"../utils/base64\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { urlEncode } from \"../utils/url\";\n\nfunction buildMellowEndpoint(x: Proxy, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (x.plugin !== \"\") {\n return undefined;\n }\n return `${remark}, ss, ss://${urlSafeBase64Encode(`${x.encryptMethod}:${x.password}`)}@${hostname}:${port}`;\n case ProxyType.VMess: {\n let proxy = `${remark}, vmess1, vmess1://${x.userId}@${hostname}:${port}`;\n if (x.path !== \"\") {\n proxy += x.path;\n }\n proxy += `?network=${x.transferProtocol}`;\n switch (x.transferProtocol) {\n case \"ws\":\n proxy += `&ws.host=${urlEncode(x.host)}`;\n break;\n case \"http\":\n if (x.host !== \"\") {\n proxy += `&http.host=${urlEncode(x.host)}`;\n }\n break;\n case \"quic\":\n if (x.quicSecure !== \"\" || x.quicSecret !== \"\") {\n proxy += `&quic.security=${x.quicSecure}&quic.key=${x.quicSecret}`;\n }\n break;\n default:\n break;\n }\n proxy += `&tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure && x.host !== \"\") {\n proxy += `&tls.servername=${urlEncode(x.host)}`;\n }\n if (x.allowInsecure !== undefined) {\n proxy += `&tls.allowinsecure=${x.allowInsecure ? \"true\" : \"false\"}`;\n }\n if (x.tcpFastOpen !== undefined) {\n proxy += `&sockopt.tcpfastopen=${x.tcpFastOpen ? \"true\" : \"false\"}`;\n }\n return proxy;\n }\n case ProxyType.SOCKS5:\n return `${remark}, builtin, socks, address=${hostname}, port=${port}, user=${x.username}, pass=${x.password}`;\n case ProxyType.HTTP:\n return `${remark}, builtin, http, address=${hostname}, port=${port}, user=${x.username}, pass=${x.password}`;\n default:\n return undefined;\n }\n}\n\nfunction buildMellowGroups(\n extraProxyGroup: ProxyGroupConfig[],\n nodelist: Proxy[],\n remarks: string[],\n): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n switch (group.type) {\n case \"select\":\n case \"url-test\":\n case \"fallback\":\n case \"load-balance\":\n break;\n default:\n continue;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, false);\n }\n if (filtered.length === 0) {\n if (remarks.length === 0) {\n filtered.push(\"DIRECT\");\n } else {\n filtered.push(...remarks);\n }\n }\n lines.push(`${group.name}, ${filtered.join(\":\")}, latency, interval=300, timeout=6`);\n }\n return lines;\n}\n\nexport interface MellowOptions {\n baseConf: string;\n nodeList: boolean;\n rulesets?: RulesetContent[];\n overwriteOriginalRules?: boolean;\n}\n\n/** Convert nodes into a Mellow (`mellow.conf`) configuration string. */\nexport function toMellow(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: MellowOptions,\n): string {\n const remarksList: string[] = [];\n const endpoints: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildMellowEndpoint(x, remark);\n if (line === undefined) {\n continue;\n }\n endpoints.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return endpoints.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n const append = (name: string, lines: string[]): void => {\n if (lines.length === 0) {\n return;\n }\n const existing = sections.find((section) => section.name === name);\n if (existing && !(options.overwriteOriginalRules ?? true)) {\n existing.lines.push(...lines);\n } else {\n setRawSection(sections, name, lines);\n }\n };\n append(\"Endpoint\", endpoints);\n append(\"EndpointGroup\", buildMellowGroups(extraProxyGroup, nodelist, remarksList));\n if (options.rulesets && options.rulesets.length > 0) {\n const rules = rulesetToSurgeRules(options.rulesets, 0);\n append(rules.section, rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode, urlSafeBase64Encode } from \"../utils/base64\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { urlEncode } from \"../utils/url\";\n\nfunction buildQuanNode(\n x: Proxy,\n settings: ExtraSettings,\n remark: string,\n nodeList: boolean,\n): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n const group = x.group;\n let method = x.encryptMethod;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxyStr: string;\n switch (x.type) {\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxyStr = `${remark} = vmess, ${hostname}, ${port}, ${method}, \"${x.userId}\", group=${group}`;\n if (x.tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (x.transferProtocol === \"ws\") {\n proxyStr += `, obfs=ws, obfs-path=\"${x.path}\", obfs-header=\"Host: ${x.host}`;\n if (x.edge !== \"\") {\n proxyStr += `[Rr][Nn]Edge: ${x.edge}`;\n }\n proxyStr += '\"';\n }\n if (nodeList) {\n proxyStr = `vmess://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n case ProxyType.ShadowsocksR:\n if (nodeList) {\n proxyStr = `ssr://${urlSafeBase64Encode(\n `${hostname}:${port}:${x.protocol}:${method}:${x.obfs}:${urlSafeBase64Encode(x.password)}` +\n `/?group=${urlSafeBase64Encode(group)}&remarks=${urlSafeBase64Encode(remark)}` +\n `&obfsparam=${urlSafeBase64Encode(x.obfsParam)}&protoparam=${urlSafeBase64Encode(x.protocolParam)}`,\n )}`;\n } else {\n proxyStr = `${remark} = shadowsocksr, ${hostname}, ${port}, ${method}, \"${x.password}\", group=${group}, protocol=${x.protocol}, obfs=${x.obfs}`;\n if (x.protocolParam !== \"\") {\n proxyStr += `, protocol_param=${x.protocolParam}`;\n }\n if (x.obfsParam !== \"\") {\n proxyStr += `, obfs_param=${x.obfsParam}`;\n }\n }\n break;\n case ProxyType.Shadowsocks:\n if (nodeList) {\n proxyStr = `ss://${urlSafeBase64Encode(`${method}:${x.password}`)}@${hostname}:${port}`;\n if (x.plugin !== \"\" && x.pluginOption !== \"\") {\n proxyStr += `/?plugin=${urlEncode(`${x.plugin};${x.pluginOption}`)}`;\n }\n proxyStr += `&group=${urlSafeBase64Encode(group)}#${urlEncode(remark)}`;\n } else {\n proxyStr = `${remark} = shadowsocks, ${hostname}, ${port}, ${method}, \"${x.password}\", group=${group}`;\n if (x.plugin === \"obfs-local\" && x.pluginOption !== \"\") {\n proxyStr += `, ${x.pluginOption.replace(/;/g, \", \")}`;\n }\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxyStr = `${remark} = http, upstream-proxy-address=${hostname}, upstream-proxy-port=${port}, group=${group}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, upstream-proxy-auth=true, upstream-proxy-username=${x.username}, upstream-proxy-password=${x.password}`;\n } else {\n proxyStr += \", upstream-proxy-auth=false\";\n }\n if (x.tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (x.host !== \"\") {\n proxyStr += `, tls-host=${x.host}`;\n }\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (nodeList) {\n proxyStr = `http://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n case ProxyType.SOCKS5:\n proxyStr = `${remark} = socks, upstream-proxy-address=${hostname}, upstream-proxy-port=${port}, group=${group}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, upstream-proxy-auth=true, upstream-proxy-username=${x.username}, upstream-proxy-password=${x.password}`;\n } else {\n proxyStr += \", upstream-proxy-auth=false\";\n }\n if (x.tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (x.host !== \"\") {\n proxyStr += `, tls-host=${x.host}`;\n }\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (nodeList) {\n proxyStr = `socks://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n default:\n return undefined;\n }\n return proxyStr;\n}\n\nfunction buildQuanGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n let type: string;\n switch (group.type) {\n case \"select\":\n case \"fallback\":\n type = \"static\";\n break;\n case \"url-test\":\n type = \"auto\";\n break;\n case \"load-balance\":\n type = \"balance, round-robin\";\n break;\n case \"ssid\": {\n let singlegroup = `${group.name} : wifi = ${group.proxies[0] ?? \"\"}`;\n let content = \"\";\n let celluar = \"\";\n for (const proxy of group.proxies.slice(1)) {\n const m = /^(.*?),?celluar\\s?=\\s?(.*?)(,.*)$/.exec(proxy);\n if (!m) {\n content += `${proxy}\\n`;\n continue;\n }\n celluar = m[2] as string;\n content += `${m[1] as string}${m[3] as string}\\n`;\n }\n if (celluar !== \"\") {\n singlegroup += `, celluar = ${celluar}`;\n }\n singlegroup += `\\n${content.trim().replace(/^,|,$/g, \"\").replace(/,/g, \"\\n\")}`;\n lines.push(base64Encode(singlegroup));\n continue;\n }\n default:\n continue;\n }\n\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"direct\");\n }\n if (filtered.length < 2) {\n type = \"static\";\n }\n const proxies = filtered.join(\"\\n\");\n let singlegroup = `${group.name} : ${type}`;\n if (type === \"static\") {\n singlegroup += `, ${filtered[0] as string}`;\n }\n singlegroup += `\\n${proxies}\\n`;\n lines.push(base64Encode(singlegroup));\n }\n return lines;\n}\n\nexport interface QuanOptions {\n baseConf: string;\n nodeList: boolean;\n}\n\n/** Convert nodes into a Quantumult configuration string. */\nexport function toQuan(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: QuanOptions,\n): string {\n const remarksList: string[] = [];\n const serverLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildQuanNode(x, settings, remark, options.nodeList);\n if (line === undefined) {\n continue;\n }\n serverLines.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return base64Encode(serverLines.join(\"\\n\"));\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"SERVER\", serverLines);\n const groupLines = buildQuanGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"POLICY\", groupLines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { getUrlArg } from \"../utils/url\";\n\nfunction triStr(value: boolean | undefined): string {\n return value ? \"true\" : \"false\";\n}\n\nfunction buildQuanxNode(x: Proxy, settings: ExtraSettings, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n let method = x.encryptMethod;\n let plugin = x.plugin;\n let pluginOption = x.pluginOption;\n let host = x.host;\n let path = x.path;\n let tlsSecure = x.tlsSecure;\n\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tls13 = x.tls13 !== undefined ? x.tls13 : settings.tls13;\n\n let proxyStr: string;\n switch (x.type) {\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxyStr = `vmess = ${hostname}:${port}, method=${method}, password=${x.userId}`;\n if (x.alterId !== 0) {\n proxyStr += \", aead=false\";\n }\n if (tlsSecure && tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxyStr += tlsSecure ? \", obfs=wss\" : \", obfs=ws\";\n proxyStr += `, obfs-host=${host}, obfs-uri=${path}`;\n } else if (tlsSecure) {\n proxyStr += `, obfs=over-tls, obfs-host=${host}`;\n }\n break;\n case ProxyType.Shadowsocks:\n proxyStr = `shadowsocks = ${hostname}:${port}, method=${method}, password=${x.password}`;\n if (plugin !== \"\") {\n if (plugin === \"simple-obfs\" || plugin === \"obfs-local\") {\n if (pluginOption !== \"\") {\n proxyStr += `, ${pluginOption.replace(/;/g, \", \")}`;\n }\n } else if (plugin === \"v2ray-plugin\") {\n pluginOption = pluginOption.replace(/;/g, \"&\");\n plugin = getUrlArg(pluginOption, \"mode\") === \"websocket\" ? \"ws\" : \"\";\n host = getUrlArg(pluginOption, \"host\");\n path = getUrlArg(pluginOption, \"path\");\n tlsSecure = pluginOption.includes(\"tls\");\n if (tlsSecure && plugin === \"ws\") {\n plugin += \"s\";\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n }\n proxyStr += `, obfs=${plugin}`;\n if (host !== \"\") {\n proxyStr += `, obfs-host=${host}`;\n }\n if (path !== \"\") {\n proxyStr += `, obfs-uri=${path}`;\n }\n } else {\n return undefined;\n }\n }\n break;\n case ProxyType.ShadowsocksR:\n proxyStr = `shadowsocks = ${hostname}:${port}, method=${method}, password=${x.password}, ssr-protocol=${x.protocol}`;\n if (x.protocolParam !== \"\") {\n proxyStr += `, ssr-protocol-param=${x.protocolParam}`;\n }\n proxyStr += `, obfs=${x.obfs}`;\n if (x.obfsParam !== \"\") {\n proxyStr += `, obfs-host=${x.obfsParam}`;\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxyStr = `http = ${hostname}:${port}, username=${x.username === \"\" ? \"none\" : x.username}, password=${x.password === \"\" ? \"none\" : x.password}`;\n if (tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n break;\n case ProxyType.Trojan:\n proxyStr = `trojan = ${hostname}:${port}, password=${x.password}`;\n if (tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n break;\n case ProxyType.SOCKS5:\n proxyStr = `socks5 = ${hostname}:${port}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, username=${x.username}, password=${x.password}`;\n if (tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n }\n break;\n case ProxyType.AnyTLS:\n proxyStr = `anytls = ${hostname}:${port}, password=${x.password}`;\n if (x.sni !== \"\") {\n proxyStr += `, tls-host=${x.sni}`;\n }\n break;\n default:\n return undefined;\n }\n if (tfo !== undefined) {\n proxyStr += `, fast-open=${triStr(tfo)}`;\n }\n if (udp !== undefined) {\n proxyStr += `, udp-relay=${triStr(udp)}`;\n }\n if (\n tlsSecure &&\n scv !== undefined &&\n x.type !== ProxyType.Shadowsocks &&\n x.type !== ProxyType.ShadowsocksR\n ) {\n proxyStr += `, tls-verification=${scv ? \"false\" : \"true\"}`;\n }\n proxyStr += `, tag=${remark}`;\n return proxyStr;\n}\n\nfunction buildQuanxGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n let type: string;\n const filtered: string[] = [];\n switch (group.type) {\n case \"select\":\n type = \"static\";\n break;\n case \"url-test\":\n type = \"url-latency-benchmark\";\n break;\n case \"fallback\":\n type = \"available\";\n break;\n case \"load-balance\":\n type = \"round-robin\";\n break;\n case \"ssid\":\n type = \"ssid\";\n for (const proxy of group.proxies) {\n filtered.push(proxy.replace(/=/g, \":\"));\n }\n break;\n default:\n continue;\n }\n if (group.type !== \"ssid\") {\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"direct\");\n }\n if (filtered.length < 2) {\n type = \"static\";\n }\n }\n const proxies = filtered.join(\", \");\n let line = `${type}=${group.name}, ${proxies}`;\n if (group.type !== \"select\" && group.type !== \"ssid\") {\n line += `, check-interval=${group.interval}`;\n if (group.tolerance > 0) {\n line += `, tolerance=${group.tolerance}`;\n }\n }\n lines.push(line);\n }\n return lines;\n}\n\nexport interface QuanxOptions {\n baseConf: string;\n nodeList: boolean;\n}\n\n/** Convert nodes into a Quantumult X configuration string. */\nexport function toQuanX(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: QuanxOptions,\n): string {\n const remarksList: string[] = [];\n const serverLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildQuanxNode(x, settings, remark);\n if (line === undefined) {\n continue;\n }\n serverLines.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return serverLines.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"server_local\", serverLines);\n const groupLines = buildQuanxGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"policy\", groupLines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { rulesetToSingBoxRules } from \"./ruleset\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { RulesetContent } from \"../types/ruleset\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode } from \"../utils/base64\";\n\n/** Format a sing-box duration string from seconds (e.g. 3660 → `1h1m`). */\nexport function formatSingBoxInterval(interval: number): string {\n let remaining = interval;\n let result = \"\";\n if (remaining >= 3600) {\n result += `${Math.floor(remaining / 3600)}h`;\n remaining %= 3600;\n }\n if (remaining >= 60) {\n result += `${Math.floor(remaining / 60)}m`;\n remaining %= 60;\n }\n if (remaining > 0) {\n result += `${remaining}s`;\n }\n return result;\n}\n\nfunction buildTransport(proxy: Proxy): Record<string, unknown> | undefined {\n switch (proxy.transferProtocol) {\n case \"http\":\n return undefined;\n case \"ws\": {\n const headers: Record<string, string> = {};\n if (proxy.host !== \"\") {\n headers.Host = proxy.host;\n }\n if (proxy.edge !== \"\") {\n headers.Edge = proxy.edge;\n }\n return {\n headers,\n path: proxy.path === \"\" ? \"/\" : proxy.path,\n type: \"ws\",\n };\n }\n case \"grpc\":\n return {\n ...(proxy.path !== \"\" ? { service_name: proxy.path } : {}),\n type: \"grpc\",\n };\n default:\n return undefined;\n }\n}\n\nfunction buildTls(x: Proxy, scv: boolean | undefined): Record<string, unknown> | undefined {\n if (!x.tlsSecure) {\n return undefined;\n }\n const tls: Record<string, unknown> = { enabled: true, insecure: scv === true };\n if (x.serverName !== \"\") {\n tls.server_name = x.serverName;\n } else if (x.host !== \"\") {\n tls.server_name = x.host;\n } else if (x.sni !== \"\") {\n tls.server_name = x.sni;\n }\n if (x.alpn.length > 0) {\n tls.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n tls.certificate = x.ca;\n }\n if (x.caStr !== \"\") {\n tls.certificate = x.caStr;\n }\n return tls;\n}\n\nfunction buildOutbound(\n x: Proxy,\n settings: ExtraSettings,\n remark: string,\n): Record<string, unknown> | undefined {\n const common = {\n server: x.hostname,\n server_port: x.port,\n tag: remark,\n };\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxy: Record<string, unknown>;\n switch (x.type) {\n case ProxyType.Shadowsocks: {\n const out: Record<string, unknown> = {\n ...common,\n method: x.encryptMethod,\n password: x.password,\n type: \"shadowsocks\",\n };\n if (x.plugin !== \"\" && x.pluginOption !== \"\") {\n out.plugin = x.plugin === \"simple-obfs\" ? \"obfs-local\" : x.plugin;\n out.plugin_opts = x.pluginOption;\n }\n proxy = out;\n break;\n }\n case ProxyType.ShadowsocksR:\n proxy = {\n ...common,\n method: x.encryptMethod,\n obfs: x.obfs,\n obfs_param: x.obfsParam,\n password: x.password,\n protocol: x.protocol,\n protocol_param: x.protocolParam,\n type: \"shadowsocksr\",\n };\n break;\n case ProxyType.VMess: {\n const out: Record<string, unknown> = {\n ...common,\n alter_id: x.alterId,\n security: x.encryptMethod,\n type: \"vmess\",\n uuid: x.userId,\n };\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.Trojan: {\n const out: Record<string, unknown> = { ...common, password: x.password, type: \"trojan\" };\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.WireGuard: {\n const addresses = [x.selfIp];\n if (x.selfIpv6 !== \"\") {\n addresses.push(x.selfIpv6);\n }\n const peer: Record<string, unknown> = {\n public_key: x.publicKey,\n server: x.hostname,\n server_port: x.port,\n };\n if (x.preSharedKey !== \"\") {\n peer.pre_shared_key = x.preSharedKey;\n }\n if (x.allowedIps !== \"\") {\n peer.allowed_ips = x.allowedIps.split(\",\").map((s) => s.trim());\n }\n if (x.clientId !== \"\") {\n peer.reserved = x.clientId.split(\",\").map((s) => Number(s.trim()));\n }\n proxy = {\n local_address: addresses,\n mtu: x.mtu,\n peers: [peer],\n private_key: x.privateKey,\n tag: remark,\n type: \"wireguard\",\n };\n break;\n }\n case ProxyType.Hysteria: {\n const out: Record<string, unknown> = { ...common, type: \"hysteria\" };\n if (x.up !== \"\") {\n out.up_mbps = x.upSpeed;\n }\n if (x.down !== \"\") {\n out.down_mbps = x.downSpeed;\n }\n if (x.obfs !== \"\") {\n out.obfs = x.obfs;\n }\n if (x.authStr !== \"\") {\n out.auth_str = x.authStr;\n out.auth = base64Encode(x.authStr);\n }\n if (x.recvWindowConn) {\n out.recv_window_conn = x.recvWindowConn;\n }\n if (x.recvWindow) {\n out.recv_window = x.recvWindow;\n }\n if (x.disableMtuDiscovery !== undefined) {\n out.disable_mtu_discovery = x.disableMtuDiscovery;\n }\n proxy = out;\n break;\n }\n case ProxyType.Hysteria2: {\n const out: Record<string, unknown> = { ...common, type: \"hysteria2\" };\n if (x.ports !== \"\") {\n out.server_ports = x.ports\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\")\n .map((p) => (/^\\d+$/.test(p) ? `${p}:${p}` : p));\n }\n if (x.upSpeed) {\n out.up_mbps = x.upSpeed;\n }\n if (x.downSpeed) {\n out.down_mbps = x.downSpeed;\n }\n if (x.obfs !== \"\") {\n out.obfs = {\n ...(x.obfsParam !== \"\" ? { password: x.obfsParam } : {}),\n type: x.obfs,\n };\n }\n if (x.password !== \"\") {\n out.password = x.password;\n }\n if (x.hopInterval) {\n out.hop_interval = formatSingBoxInterval(x.hopInterval);\n }\n proxy = out;\n break;\n }\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxy = {\n ...common,\n password: x.password,\n type: \"http\",\n username: x.username,\n };\n break;\n case ProxyType.SOCKS5:\n proxy = {\n ...common,\n password: x.password,\n type: \"socks\",\n username: x.username,\n version: \"5\",\n };\n break;\n case ProxyType.AnyTLS:\n proxy = {\n ...common,\n type: \"anytls\",\n users: [{ password: x.password, username: \"sekai\" }],\n };\n break;\n default:\n return undefined;\n }\n\n const tls = buildTls(x, scv);\n if (tls) {\n proxy.tls = tls;\n }\n if (udp !== undefined && !udp) {\n proxy.network = \"tcp\";\n }\n if (tfo !== undefined) {\n proxy.tcp_fast_open = tfo;\n }\n return proxy;\n}\n\nexport interface SingBoxOptions {\n baseConf: string;\n nodeList: boolean;\n rulesets?: RulesetContent[];\n overwriteOriginalRules?: boolean;\n}\n\n/** Convert nodes into a sing-box configuration JSON string. */\nexport function toSingBox(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SingBoxOptions,\n): string {\n let doc: Record<string, unknown>;\n if (options.nodeList) {\n doc = {};\n } else {\n try {\n doc = (options.baseConf.trim() === \"\" ? {} : JSON.parse(options.baseConf)) as Record<\n string,\n unknown\n >;\n } catch {\n throw new Error(\"sing-box base config is not valid JSON\");\n }\n }\n\n const outbounds: Record<string, unknown>[] = [];\n if (!options.nodeList) {\n outbounds.push({ tag: \"DIRECT\", type: \"direct\" });\n outbounds.push({ tag: \"REJECT\", type: \"block\" });\n outbounds.push({ tag: \"dns-out\", type: \"dns\" });\n }\n\n const remarksList: string[] = [];\n const nodelist: Proxy[] = [];\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList, false);\n x.remark = remark;\n const outbound = buildOutbound(x, settings, remark);\n if (!outbound) {\n continue;\n }\n outbounds.push(outbound);\n nodelist.push(x);\n remarksList.push(remark);\n }\n\n if (!options.nodeList) {\n for (const group of extraProxyGroup) {\n let type: string;\n switch (group.type) {\n case \"select\":\n type = \"selector\";\n break;\n case \"url-test\":\n case \"fallback\":\n case \"load-balance\":\n type = \"urltest\";\n break;\n default:\n continue;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n const entry: Record<string, unknown> = { outbounds: filtered, tag: group.name, type };\n if (group.type === \"url-test\") {\n entry.url = group.url;\n entry.interval = formatSingBoxInterval(group.interval);\n if (group.tolerance > 0) {\n entry.tolerance = group.tolerance;\n }\n }\n outbounds.push(entry);\n }\n }\n\n doc.outbounds = outbounds;\n\n if (\n !options.nodeList &&\n options.rulesets &&\n options.rulesets.length > 0 &&\n settings.enableRuleGenerator\n ) {\n const route = rulesetToSingBoxRules(options.rulesets);\n const existingRoute = doc.route as Record<string, unknown> | undefined;\n const existingRules =\n !(options.overwriteOriginalRules ?? true) &&\n existingRoute &&\n Array.isArray(existingRoute.rules)\n ? (existingRoute.rules as Record<string, unknown>[])\n : [];\n doc.route = {\n ...(existingRoute ?? {}),\n final: route.final,\n rules: [...existingRules, ...route.rules],\n };\n }\n\n return JSON.stringify(doc, null, 2);\n}\n","import { buildClash, stringifyClash } from \"./generator/clash\";\nimport { proxyToSingle, proxyToSsd, proxyToSsSub } from \"./generator/links\";\nimport { toLoon } from \"./generator/loon\";\nimport { toMellow } from \"./generator/mellow\";\nimport { dedupeNodes, preprocessNodes } from \"./generator/nodes\";\nimport { toQuan } from \"./generator/quan\";\nimport { toQuanX } from \"./generator/quanx\";\nimport { rulesetToClashRules, rulesetToSurgeRules } from \"./generator/ruleset\";\nimport { toSingBox } from \"./generator/singbox\";\nimport { toSurge } from \"./generator/surge\";\nimport type { Proxy } from \"./types/proxy\";\nimport type { ProxyGroupConfig } from \"./types/proxy-group\";\nimport type { RulesetContent } from \"./types/ruleset\";\nimport type { ExtraSettings } from \"./types/settings\";\nimport { TargetFormat, createExtraSettings } from \"./types/settings\";\n\n/** Options controlling a single conversion. */\nexport interface GenerateOptions {\n target: TargetFormat;\n groups?: ProxyGroupConfig[];\n settings?: Partial<ExtraSettings>;\n baseConf?: string;\n surgeVersion?: number;\n rulesets?: RulesetContent[];\n}\n\nconst V2RAY_TYPE_MASK = 1 | 2 | 4 | 8;\n\n/** Apply rename/emoji/sort preprocessing from settings to nodes. */\nexport function runPreprocess(nodes: Proxy[], settings: ExtraSettings): void {\n preprocessNodes(nodes, {\n addEmoji: settings.addEmoji,\n emojiArray: settings.emojiArray,\n removeEmoji: settings.removeEmoji,\n renameArray: settings.renameArray,\n sortFlag: settings.sortFlag,\n });\n if (settings.dedupe) {\n dedupeNodes(nodes);\n }\n}\n\n/**\n * Convert nodes into the requested output format.\n *\n * This is the isomorphic generation entry point used by the CLI, the Node\n * adapter, and the browser build.\n */\nexport function generate(nodes: Proxy[], options: GenerateOptions): string {\n const settings: ExtraSettings = { ...createExtraSettings(), ...options.settings };\n runPreprocess(nodes, settings);\n\n switch (options.target) {\n case TargetFormat.Clash:\n case TargetFormat.ClashR: {\n const { doc } = buildClash(\n nodes,\n options.groups ?? [],\n settings,\n options.target === TargetFormat.ClashR,\n );\n attachClashRules(doc, settings, options.rulesets);\n return stringifyClash(doc);\n }\n case TargetFormat.Surge: {\n const surgeVersion = options.surgeVersion ?? 4;\n const rules = options.rulesets\n ? rulesetToSurgeRules(options.rulesets, surgeVersion)\n : undefined;\n return toSurge(nodes, options.groups ?? [], settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n version: surgeVersion,\n });\n }\n case TargetFormat.QuantumultX:\n return toQuanX(nodes, options.groups ?? [], settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n });\n case TargetFormat.Quantumult:\n return toQuan(nodes, options.groups ?? [], settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n });\n case TargetFormat.Loon:\n return toLoon(nodes, options.groups ?? [], settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n });\n case TargetFormat.SingBox:\n return toSingBox(nodes, options.groups ?? [], settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n overwriteOriginalRules: settings.overwriteOriginalRules,\n rulesets: options.rulesets,\n });\n case TargetFormat.Mellow:\n return toMellow(nodes, options.groups ?? [], settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n overwriteOriginalRules: settings.overwriteOriginalRules,\n rulesets: options.rulesets,\n });\n case TargetFormat.V2Ray:\n return proxyToSingle(nodes, 4, settings);\n case TargetFormat.Trojan:\n return proxyToSingle(nodes, 8, settings);\n case TargetFormat.Mixed:\n return proxyToSingle(nodes, V2RAY_TYPE_MASK, settings);\n case TargetFormat.SSC:\n return proxyToSingle(nodes, 1, settings);\n case TargetFormat.SSR:\n return proxyToSingle(nodes, 2, settings);\n case TargetFormat.SSD:\n return proxyToSsd(nodes, \"\", \"\");\n case TargetFormat.NodeList: {\n settings.nodeList = true;\n return proxyToSingle(nodes, V2RAY_TYPE_MASK, settings);\n }\n default:\n throw new Error(`Unsupported target format: ${options.target}`);\n }\n}\n\n/** Export Shadowsocks nodes as a SIP008 document (`ssconf`). */\nexport function toSip008(nodes: Proxy[], baseConf = \"\"): string {\n return proxyToSsSub(nodes, baseConf);\n}\n\nfunction attachClashRules(\n doc: Record<string, unknown>,\n settings: ExtraSettings,\n rulesets: RulesetContent[] | undefined,\n): void {\n if (!rulesets || rulesets.length === 0) {\n return;\n }\n const field = settings.clashNewFieldName ? \"rules\" : \"Rule\";\n const generated = rulesetToClashRules(rulesets);\n if (generated.length === 0) {\n return;\n }\n const existing = doc[field];\n if (settings.overwriteOriginalRules || !Array.isArray(existing)) {\n doc[field] = generated;\n } else {\n doc[field] = [...(existing as string[]), ...generated];\n }\n}\n"],"mappings":"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","names":["ProxyGroupType","BalanceStrategy","ProxyType","RulesetType","TargetFormat","regMatch","regReplace","parseRawSections","isIpv4","lines","singlegroup","triStr"]}
1
+ {"version":3,"sources":["../src/types/proxy-group.ts","../src/types/proxy.ts","../src/types/ruleset.ts","../src/types/settings.ts","../src/types/tribool.ts","../src/utils/base64.ts","../src/utils/ini.ts","../src/utils/string.ts","../src/utils/url.ts","../src/utils/hash.ts","../src/utils/template.ts","../src/settings/config.ts","../src/settings/request-params.ts","../src/userinfo.ts","../src/parser/ciphers.ts","../src/parser/construct.ts","../src/parser/netch.ts","../src/parser/conf.ts","../src/parser/uri.ts","../src/parser/subscription.ts","../src/generator/clash.ts","../src/utils/country.ts","../src/generator/nodes.ts","../src/generator/default-profile.ts","../src/generator/links.ts","../src/generator/surge.ts","../src/generator/loon.ts","../src/generator/ruleset.ts","../src/generator/mellow.ts","../src/generator/quan.ts","../src/generator/quanx.ts","../src/generator/singbox.ts","../src/generator/surfboard.ts","../src/engine.ts"],"sourcesContent":["/** Proxy group kinds, mirroring subconverter's `ProxyGroupType`. */\nexport enum ProxyGroupType {\n Select = \"select\",\n URLTest = \"url-test\",\n Fallback = \"fallback\",\n LoadBalance = \"load-balance\",\n Relay = \"relay\",\n SSID = \"ssid\",\n Smart = \"smart\",\n}\n\n/** Load-balance strategy, mirroring `BalanceStrategy`. */\nexport enum BalanceStrategy {\n ConsistentHashing = \"consistent-hashing\",\n RoundRobin = \"round-robin\",\n}\n\n/** A configured proxy group (`[Proxy Group]` entries). */\nexport interface ProxyGroupConfig {\n name: string;\n type: ProxyGroupType;\n proxies: string[];\n usingProvider: string[];\n url: string;\n interval: number;\n timeout: number;\n tolerance: number;\n strategy: BalanceStrategy;\n lazy: boolean | undefined;\n disableUdp: boolean | undefined;\n persistent: boolean | undefined;\n evaluateBeforeUse: boolean | undefined;\n}\n\n/** Create a proxy group with subconverter's default field values. */\nexport function createProxyGroupConfig(): ProxyGroupConfig {\n return {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name: \"\",\n persistent: undefined,\n proxies: [],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 0,\n tolerance: 0,\n type: ProxyGroupType.Select,\n url: \"\",\n usingProvider: [],\n };\n}\n\n/**\n * Create one select group that fans out to every proxy type, mirroring the\n * CLI `--group` flag and the server `group` param. Shared so both\n * entrypoints build byte-identical groups.\n */\nexport function createSelectGroup(name: string): ProxyGroupConfig {\n return {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name,\n persistent: undefined,\n proxies: [\"[]DIRECT\", \"!!TYPE=SS\", \"!!TYPE=SSR\", \"!!TYPE=VMESS\", \"!!TYPE=TROJAN\"],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 0,\n tolerance: 0,\n type: ProxyGroupType.Select,\n url: \"\",\n usingProvider: [],\n };\n}\n\n/** Resolve a textual group type (as found in config files). */\nexport function parseProxyGroupType(value: string): ProxyGroupType | undefined {\n const normalized = value.trim().toLowerCase();\n switch (normalized) {\n case \"select\":\n return ProxyGroupType.Select;\n case \"url-test\":\n return ProxyGroupType.URLTest;\n case \"fallback\":\n return ProxyGroupType.Fallback;\n case \"load-balance\":\n return ProxyGroupType.LoadBalance;\n case \"relay\":\n return ProxyGroupType.Relay;\n case \"ssid\":\n return ProxyGroupType.SSID;\n case \"smart\":\n return ProxyGroupType.Smart;\n default:\n return undefined;\n }\n}\n","import type { TriBool } from \"./tribool\";\n\n/** Proxy protocol kinds supported by the converter. */\nexport enum ProxyType {\n Unknown = \"unknown\",\n Shadowsocks = \"ss\",\n ShadowsocksR = \"ssr\",\n VMess = \"vmess\",\n VLESS = \"vless\",\n Trojan = \"trojan\",\n Snell = \"snell\",\n HTTP = \"http\",\n HTTPS = \"https\",\n SOCKS5 = \"socks5\",\n WireGuard = \"wireguard\",\n Hysteria = \"hysteria\",\n Hysteria2 = \"hysteria2\",\n TUIC = \"tuic\",\n AnyTLS = \"anytls\",\n}\n\n/** Human-readable name used by generators that prefix the remark. */\nexport function proxyTypeName(type: ProxyType): string {\n switch (type) {\n case ProxyType.Shadowsocks:\n return \"SS\";\n case ProxyType.ShadowsocksR:\n return \"SSR\";\n case ProxyType.VMess:\n return \"VMess\";\n case ProxyType.VLESS:\n return \"VLESS\";\n case ProxyType.Trojan:\n return \"Trojan\";\n case ProxyType.Snell:\n return \"Snell\";\n case ProxyType.HTTP:\n return \"HTTP\";\n case ProxyType.HTTPS:\n return \"HTTPS\";\n case ProxyType.SOCKS5:\n return \"SOCKS5\";\n case ProxyType.WireGuard:\n return \"WireGuard\";\n case ProxyType.Hysteria:\n return \"Hysteria\";\n case ProxyType.Hysteria2:\n return \"Hysteria2\";\n case ProxyType.TUIC:\n return \"TUIC\";\n case ProxyType.AnyTLS:\n return \"AnyTLS\";\n default:\n return \"Unknown\";\n }\n}\n\n/** Default provider group names, mirrored from the C++ `*_DEFAULT_GROUP`. */\nexport const DEFAULT_GROUPS = {\n anytls: \"AnyTLSProvider\",\n http: \"HTTPProvider\",\n hysteria: \"HysteriaProvider\",\n hysteria2: \"Hysteria2Provider\",\n snell: \"SnellProvider\",\n socks: \"SocksProvider\",\n ss: \"SSProvider\",\n ssr: \"SSRProvider\",\n trojan: \"TrojanProvider\",\n tuic: \"TUICProvider\",\n v2ray: \"V2RayProvider\",\n wireguard: \"WireGuardProvider\",\n} as const;\n\n/**\n * A single proxy node.\n *\n * The field set intentionally mirrors subconverter's `Proxy` struct so ports of\n * the C++ parsers/generators stay one-to-one and easy to audit.\n */\nexport interface Proxy {\n type: ProxyType;\n id: number;\n groupId: number;\n group: string;\n remark: string;\n hostname: string;\n port: number;\n\n username: string;\n password: string;\n encryptMethod: string;\n plugin: string;\n pluginOption: string;\n protocol: string;\n protocolParam: string;\n obfs: string;\n obfsParam: string;\n userId: string;\n alterId: number;\n transferProtocol: string;\n fakeType: string;\n tlsSecure: boolean;\n\n host: string;\n path: string;\n edge: string;\n\n /** VLESS `flow` control (e.g. `xtls-rprx-vision`). */\n flow: string;\n /** TUIC congestion control algorithm. */\n congestionControl: string;\n\n quicSecure: string;\n quicSecret: string;\n\n udp: TriBool;\n tcpFastOpen: TriBool;\n allowInsecure: TriBool;\n tls13: TriBool;\n\n underlyingProxy: string;\n\n snellVersion: number;\n serverName: string;\n\n selfIp: string;\n selfIpv6: string;\n publicKey: string;\n privateKey: string;\n preSharedKey: string;\n dnsServers: string[];\n mtu: number;\n allowedIps: string;\n keepAlive: number;\n testUrl: string;\n clientId: string;\n\n ports: string;\n up: string;\n upSpeed: number;\n down: string;\n downSpeed: number;\n authStr: string;\n sni: string;\n fingerprint: string;\n shortId: string;\n ca: string;\n caStr: string;\n recvWindowConn: number;\n recvWindow: number;\n disableMtuDiscovery: TriBool;\n hopInterval: number;\n alpn: string[];\n\n cwnd: number;\n}\n\n/** Create a proxy with subconverter's default field values. */\nexport function createProxy(): Proxy {\n return {\n allowedIps: \"0.0.0.0/0, ::/0\",\n allowInsecure: undefined,\n alpn: [],\n alterId: 0,\n authStr: \"\",\n ca: \"\",\n caStr: \"\",\n clientId: \"\",\n congestionControl: \"\",\n cwnd: 0,\n disableMtuDiscovery: undefined,\n dnsServers: [],\n down: \"\",\n downSpeed: 0,\n edge: \"\",\n encryptMethod: \"\",\n fakeType: \"\",\n fingerprint: \"\",\n flow: \"\",\n group: \"\",\n groupId: 0,\n hopInterval: 0,\n host: \"\",\n hostname: \"\",\n id: 0,\n keepAlive: 0,\n mtu: 0,\n obfs: \"\",\n obfsParam: \"\",\n password: \"\",\n path: \"\",\n plugin: \"\",\n pluginOption: \"\",\n port: 0,\n ports: \"\",\n preSharedKey: \"\",\n privateKey: \"\",\n protocol: \"\",\n protocolParam: \"\",\n publicKey: \"\",\n quicSecret: \"\",\n quicSecure: \"\",\n recvWindow: 0,\n recvWindowConn: 0,\n remark: \"\",\n selfIp: \"\",\n selfIpv6: \"\",\n serverName: \"\",\n shortId: \"\",\n snellVersion: 0,\n sni: \"\",\n tcpFastOpen: undefined,\n testUrl: \"\",\n tls13: undefined,\n tlsSecure: false,\n transferProtocol: \"\",\n type: ProxyType.Unknown,\n udp: undefined,\n underlyingProxy: \"\",\n up: \"\",\n upSpeed: 0,\n userId: \"\",\n username: \"\",\n };\n}\n","/** Ruleset source dialects, mirroring `ruleset_type` in ruleconvert.h. */\nexport enum RulesetType {\n Surge = \"surge\",\n QuantumultX = \"quanx\",\n ClashDomain = \"clash-domain\",\n ClashIpCidr = \"clash-ipcidr\",\n ClashClassical = \"clash-classical\",\n}\n\n/** One `ruleset=` entry resolved into a group + remote/local source. */\nexport interface RulesetConfig {\n group: string;\n url: string;\n interval: number;\n}\n\n/** A ruleset with its fetched content and resolved type. */\nexport interface RulesetContent {\n ruleGroup: string;\n rulePath: string;\n rulePathTyped: string;\n ruleType: RulesetType;\n content: string;\n updateInterval: number;\n}\n\n/** Create a ruleset config with subconverter's defaults. */\nexport function createRulesetConfig(): RulesetConfig {\n return { group: \"\", interval: 86400, url: \"\" };\n}\n","import type { Proxy } from \"./proxy\";\nimport type { ProxyGroupConfig } from \"./proxy-group\";\nimport type { RulesetConfig } from \"./ruleset\";\nimport type { TriBool } from \"./tribool\";\n\n/** A regex/script rewrite rule, mirroring `RegexMatchConfig`. */\nexport interface RegexMatchConfig {\n match: string;\n replace: string;\n script: string;\n}\n\n/** Target output formats. */\nexport enum TargetFormat {\n Clash = \"clash\",\n ClashR = \"clashr\",\n Surge = \"surge\",\n Surfboard = \"surfboard\",\n QuantumultX = \"quanx\",\n Quantumult = \"quan\",\n Loon = \"loon\",\n Mellow = \"mellow\",\n V2Ray = \"v2ray\",\n Trojan = \"trojan\",\n SSD = \"ssd\",\n SSC = \"ss\",\n SSSub = \"sssub\",\n SSR = \"ssr\",\n SingBox = \"singbox\",\n Mixed = \"mixed\",\n NodeList = \"nodelist\",\n Auto = \"auto\",\n}\n\n/** Per-run conversion settings, mirroring `extra_settings`. */\nexport interface ExtraSettings {\n enableRuleGenerator: boolean;\n overwriteOriginalRules: boolean;\n renameArray: RegexMatchConfig[];\n emojiArray: RegexMatchConfig[];\n /** Regex rewrites applied to node names before every other naming rule. */\n nameRegexArray: RegexMatchConfig[];\n /** Literal fragments stripped from node names before every other naming rule. */\n nameRemove: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n /** Prefix node names with the server's country/region when the name lacks one. */\n autoCountry: boolean;\n /** Locale used for `Intl.DisplayNames` country names (default `zh-CN`). */\n countryLocale: string;\n /**\n * Resolve a node's ISO 3166-1 alpha-2 country code. Platform-free: the Node\n * adapter supplies a GeoIP-backed lookup; browsers may supply their own.\n */\n countryResolver?: (node: Proxy) => string | undefined;\n appendProxyType: boolean;\n nodeList: boolean;\n sortFlag: boolean;\n filterDeprecated: boolean;\n clashNewFieldName: boolean;\n clashScript: boolean;\n clashClassicalRuleset: boolean;\n dedupe: boolean;\n surgeSsrPath: string;\n managedConfigPrefix: string;\n quanxDevId: string;\n udp: TriBool;\n tfo: TriBool;\n skipCertVerify: TriBool;\n tls13: TriBool;\n sortScript: string;\n clashProxiesStyle: string;\n clashProxyGroupsStyle: string;\n authorized: boolean;\n}\n\n/** Create `ExtraSettings` with subconverter's defaults. */\nexport function createExtraSettings(): ExtraSettings {\n return {\n addEmoji: false,\n appendProxyType: false,\n authorized: false,\n autoCountry: false,\n clashClassicalRuleset: false,\n clashNewFieldName: true,\n clashProxiesStyle: \"flow\",\n clashProxyGroupsStyle: \"flow\",\n clashScript: false,\n countryLocale: \"zh-CN\",\n countryResolver: undefined,\n dedupe: false,\n emojiArray: [],\n enableRuleGenerator: true,\n filterDeprecated: false,\n managedConfigPrefix: \"\",\n nameRegexArray: [],\n nameRemove: [],\n nodeList: false,\n overwriteOriginalRules: true,\n quanxDevId: \"\",\n removeEmoji: false,\n renameArray: [],\n skipCertVerify: undefined,\n sortFlag: false,\n sortScript: \"\",\n surgeSsrPath: \"\",\n tfo: undefined,\n tls13: undefined,\n udp: undefined,\n };\n}\n\n/** Structured request/config parameters used by the engine. */\nexport interface RequestSettings {\n target: TargetFormat;\n url: string;\n group: ProxyGroupConfig[];\n ruleset: RulesetConfig[];\n rename: RegexMatchConfig[];\n emoji: RegexMatchConfig[];\n /** Regex replacements applied to node names before renaming. */\n nameRegex: RegexMatchConfig[];\n /** Literal fragments removed from node names before renaming. */\n nameRemove: string[];\n includeRemarks: string[];\n excludeRemarks: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n autoCountry: boolean;\n appendType: boolean;\n nodeList: boolean;\n dedupe: boolean;\n sort: boolean;\n filterDeprecated: boolean;\n list: boolean;\n tfo: TriBool;\n udp: TriBool;\n scv: TriBool;\n tls13: TriBool;\n newFieldName: boolean;\n classicalRuleset: boolean;\n insert: boolean;\n mixin: string;\n interval: number;\n script: string;\n clashScript: boolean;\n proxiesStyle: string;\n proxyGroupsStyle: string;\n autoExtract: boolean;\n uploadPath: string;\n /** Extra quota endpoint fetched server-side (`userinfo_url` / `userinfo-url`). */\n userinfoUrl: string;\n /** Converter for the quota endpoint (`jms` for Just-My-Socks, `subscription`, `auto`). */\n userinfoProvider: string;\n}\n","/**\n * A three-valued boolean mirroring subconverter's `tribool`.\n *\n * `undefined` means \"unspecified\" and callers decide whether to apply a\n * default; `true`/`false` are explicit overrides (e.g. from URL parameters).\n */\nexport type TriBool = boolean | undefined;\n\n/** Treat `undefined` as `false`. */\nexport function triBoolOr(value: TriBool, fallback: boolean): boolean {\n return value === undefined ? fallback : value;\n}\n\n/** Parse a loose string (e.g. `\"1\"`, `\"true\"`, `\"0\"`) into a {@link TriBool}. */\nexport function parseTriBool(value: string | undefined | null): TriBool {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n return undefined;\n}\n","const B64_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst B64_URLSAFE_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\nconst B64_LOOKUP: Record<string, number> = {};\nfor (let i = 0; i < B64_ALPHABET.length; i += 1) {\n B64_LOOKUP[B64_ALPHABET[i] as string] = i;\n}\nB64_LOOKUP[\"-\"] = 62;\nB64_LOOKUP[\"_\"] = 63;\n\n/** UTF-8 encode a string to bytes (browser + Node safe). */\nexport function utf8Encode(input: string): Uint8Array {\n return new TextEncoder().encode(input);\n}\n\n/** Decode UTF-8 bytes back to a string. */\nexport function utf8Decode(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes);\n}\n\nfunction encodeWithAlphabet(input: string, alphabet: string): string {\n const bytes = utf8Encode(input);\n let output = \"\";\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i] as number;\n const b1 = i + 1 < bytes.length ? (bytes[i + 1] as number) : 0;\n const b2 = i + 2 < bytes.length ? (bytes[i + 2] as number) : 0;\n const triple = (b0 << 16) | (b1 << 8) | b2;\n output += alphabet[(triple >> 18) & 0x3f];\n output += alphabet[(triple >> 12) & 0x3f];\n output += i + 1 < bytes.length ? alphabet[(triple >> 6) & 0x3f] : \"=\";\n output += i + 2 < bytes.length ? alphabet[triple & 0x3f] : \"=\";\n }\n return output;\n}\n\nfunction decodeBytes(input: string): Uint8Array {\n const normalized = input.replace(/\\s+/g, \"\");\n const clean = normalized.replace(/=+$/, \"\");\n const out: number[] = [];\n let buffer = 0;\n let bits = 0;\n for (const char of clean) {\n const value = B64_LOOKUP[char];\n if (value === undefined) {\n continue;\n }\n buffer = (buffer << 6) | value;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n out.push((buffer >> bits) & 0xff);\n }\n }\n return Uint8Array.from(out);\n}\n\n/** Standard base64 encode (with padding). */\nexport function base64Encode(input: string): string {\n return encodeWithAlphabet(input, B64_ALPHABET);\n}\n\n/** URL-safe base64 encode without padding. */\nexport function urlSafeBase64Encode(input: string): string {\n return encodeWithAlphabet(input, B64_URLSAFE_ALPHABET).replace(/=+$/, \"\");\n}\n\n/** Standard base64 decode; tolerant of URL-safe input and missing padding. */\nexport function base64Decode(input: string): string {\n return utf8Decode(decodeBytes(input));\n}\n\n/** URL-safe base64 decode; alias of {@link base64Decode} (same tolerance). */\nexport function urlSafeBase64Decode(input: string): string {\n return base64Decode(input);\n}\n\n/**\n * Best-effort base64 decode used for subscription bodies: subconverter expects\n * a base64 blob but real-world providers sometimes serve plain text.\n */\nexport function tryBase64Decode(input: string): string {\n const trimmed = input.trim();\n if (trimmed === \"\") {\n return \"\";\n }\n if (!/^[A-Za-z0-9+/\\-_=\\s]+$/.test(trimmed)) {\n return input;\n }\n try {\n const decoded = base64Decode(trimmed);\n return decoded.includes(\"\\uFFFD\") ? input : decoded;\n } catch {\n return input;\n }\n}\n","export interface IniSection {\n name: string;\n items: Array<[string, string]>;\n}\n\nexport interface IniDocument {\n sections: IniSection[];\n /** Items appearing before the first section header. */\n isolated: Array<[string, string]>;\n}\n\nexport interface ParseIniOptions {\n /** Section name used to hold items that appear before the first header. */\n isolatedSection?: string;\n /** When false, empty-valued items are dropped. */\n keepEmptyValues?: boolean;\n /** Strip surrounding whitespace from keys and values. */\n trim?: boolean;\n}\n\n/**\n * Minimal INI reader mirroring the subset of `ini_reader` subconverter relies\n * on: case-preserving keys, duplicate sections, and isolated leading items.\n */\nexport function parseIni(content: string, options: ParseIniOptions = {}): IniDocument {\n const isolatedSection = options.isolatedSection ?? \"\";\n const keepEmptyValues = options.keepEmptyValues ?? false;\n const doTrim = options.trim ?? true;\n\n const sections: IniSection[] = [];\n const isolated: Array<[string, string]> = [];\n let current: IniSection | undefined;\n\n const lines = content.split(/\\r?\\n/);\n for (const rawLine of lines) {\n let line = rawLine;\n if (doTrim) {\n line = line.trim();\n }\n if (line === \"\") {\n continue;\n }\n if (line.startsWith(\"[\") && line.endsWith(\"]\")) {\n const name = line.slice(1, -1).trim();\n current = { items: [], name };\n sections.push(current);\n continue;\n }\n const eq = line.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n const key = doTrim ? line.slice(0, eq).trim() : line.slice(0, eq);\n const value = doTrim ? line.slice(eq + 1).trim() : line.slice(eq + 1);\n if (value === \"\" && !keepEmptyValues) {\n continue;\n }\n const pair: [string, string] = [key, value];\n if (current) {\n current.items.push(pair);\n } else {\n isolated.push(pair);\n }\n }\n\n if (isolated.length > 0 && isolatedSection !== \"\") {\n sections.unshift({ items: isolated, name: isolatedSection });\n }\n\n return { isolated, sections };\n}\n\n/** Return the first section with `name`, if any. */\nexport function findSection(doc: IniDocument, name: string): IniSection | undefined {\n return doc.sections.find((section) => section.name === name);\n}\n\n/** Return every item of every section named `name`, in document order. */\nexport function getSectionItems(doc: IniDocument, name: string): Array<[string, string]> {\n const items: Array<[string, string]> = [];\n for (const section of doc.sections) {\n if (section.name === name) {\n items.push(...section.items);\n }\n }\n return items;\n}\n\n/** A raw INI section: a header name and its untouched lines. */\nexport interface RawIniSection {\n name: string;\n lines: string[];\n}\n\n/** Split text into ordered raw sections, preserving line content. */\nexport function parseRawIni(content: string): RawIniSection[] {\n const sections: RawIniSection[] = [];\n let current: RawIniSection | undefined;\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.replace(/\\s+$/, \"\");\n const header = /^\\[(.*)\\]$/.exec(line.trim());\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line.trim() === \"\") {\n continue;\n }\n if (current) {\n current.lines.push(line);\n }\n }\n return sections;\n}\n\n/** Render raw sections back into INI text with blank lines between sections. */\nexport function renderRawIni(sections: RawIniSection[]): string {\n const out: string[] = [];\n for (const section of sections) {\n out.push(`[${section.name}]`);\n out.push(...section.lines);\n out.push(\"\");\n }\n return `${out.join(\"\\n\").trimEnd()}\\n`;\n}\n\n/** Insert or replace a named raw section, keeping its position when present. */\nexport function setRawSection(sections: RawIniSection[], name: string, lines: string[]): void {\n const existing = sections.find((section) => section.name === name);\n if (existing) {\n existing.lines = lines;\n return;\n }\n sections.push({ lines, name });\n}\n","/** Trim ASCII whitespace from both ends. */\nexport function trim(input: string): string {\n return input.replace(/^\\s+|\\s+$/g, \"\");\n}\n\n/** Trim and lowercase. */\nexport function trimLowerCase(input: string): string {\n return trim(input).toLowerCase();\n}\n\n/** Parse the leading integer of a string; `0` when none is present. */\nexport function toInt(value: string | number | undefined | null): number {\n if (value === undefined || value === null) {\n return 0;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? Math.trunc(value) : 0;\n }\n const match = /[+-]?\\d+/.exec(value);\n if (!match) {\n return 0;\n }\n const parsed = Number.parseInt(match[0], 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\n/** Parse a boolean-ish value (\"true\"/\"false\"/\"1\"/\"0\"). */\nexport function toBool(value: string | undefined | null): boolean {\n if (value === undefined || value === null) {\n return false;\n }\n const normalized = value.trim().toLowerCase();\n return normalized === \"true\" || normalized === \"1\";\n}\n\n/** `true` when `needle` occurs in `haystack`. */\nexport function strFind(haystack: string, needle: string): boolean {\n return haystack.includes(needle);\n}\n\n/** `true` when `input` starts with `prefix`. */\nexport function startsWith(input: string, prefix: string): boolean {\n return input.startsWith(prefix);\n}\n\n/** Count non-overlapping occurrences of `needle` in `haystack`. */\nexport function countOccurrences(haystack: string, needle: string): number {\n if (needle === \"\") {\n return 0;\n }\n let count = 0;\n let index = haystack.indexOf(needle);\n while (index !== -1) {\n count += 1;\n index = haystack.indexOf(needle, index + needle.length);\n }\n return count;\n}\n\n/** Split a string on a literal delimiter, dropping trailing empties when asked. */\nexport function split(input: string, delimiter: string, removeEmpty = false): string[] {\n const parts = input.split(delimiter);\n return removeEmpty ? parts.filter((part) => part !== \"\") : parts;\n}\n\n/**\n * Replace every regex match, mirroring subconverter's `regReplace`.\n * An empty `replacement` removes the matches.\n */\nexport function regReplace(input: string, pattern: string, replacement = \"\"): string {\n return input.replace(new RegExp(pattern, \"g\"), replacement);\n}\n\n/** `true` when `pattern` (a JS regex source) matches anywhere in `input`. */\nexport function regMatch(input: string, pattern: string): boolean {\n return new RegExp(pattern).test(input);\n}\n\n/**\n * Replace distinct consecutive occurrences of `from` with `to`.\n * Kept for API parity; equivalent to a global literal replace.\n */\nexport function replaceAllDistinct(input: string, from: string, to: string): string {\n if (from === \"\") {\n return input;\n }\n return input.split(from).join(to);\n}\n\n/** `true` when the string is a dotted-quad IPv4 literal. */\nexport function isIpv4(input: string): boolean {\n const parts = input.split(\".\");\n if (parts.length !== 4) {\n return false;\n }\n return parts.every((part) => /^\\d{1,3}$/.test(part) && Number(part) <= 255);\n}\n\n/** `true` when the string is a bracketed/unbracketed IPv6 literal. */\nexport function isIpv6(input: string): boolean {\n return /^\\[?[0-9A-Fa-f:]{2,}\\]?$/.test(input) && input.includes(\":\");\n}\n\n/** `true` when the host is an IP literal (v4 or v6). */\nexport function isIp(input: string): boolean {\n return isIpv4(input) || isIpv6(input);\n}\n\n/** Pad a value to two digits. */\nexport function pad2(value: number): string {\n return value < 10 ? `0${value}` : String(value);\n}\n\n/** `true` when the string is empty or only whitespace. */\nexport function isBlank(input: string | undefined | null): boolean {\n return input === undefined || input === null || trim(input) === \"\";\n}\n","/** Percent-decode a URL component, tolerating malformed sequences. */\nexport function urlDecode(input: string): string {\n try {\n return decodeURIComponent(input);\n } catch {\n return input.replace(/%([0-9A-Fa-f]{2})/g, (_, hex: string) =>\n String.fromCharCode(Number.parseInt(hex, 16)),\n );\n }\n}\n\n/** Percent-encode a URL component (RFC 3986 unreserved kept intact). */\nexport function urlEncode(input: string): string {\n return encodeURIComponent(input).replace(\n /[!'()*]/g,\n (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n\n/** Normalize a query key: case-insensitive with `_`/`-` equivalent. */\nexport function normalizeQueryKey(key: string): string {\n return key.toLowerCase().replace(/_/g, \"-\");\n}\n\n/**\n * Read every occurrence of a parameter from a query string in document\n * order (case-insensitive key with `_`/`-` equivalent, each value\n * percent-decoded, `+` preserved).\n * Shared by `getUrlArg` and server-side repeatable params (`url`, `group`,\n * `ruleset`) so both entrypoints decode identically.\n */\nexport function getAllUrlArgs(query: string, key: string): string[] {\n if (query === \"\") {\n return [];\n }\n // Tolerate full links (`tg://socks?server=...`, `vless://...?type=...`):\n // strip any fragment and everything up to the first `?` so the first\n // parameter is not swallowed by the scheme prefix.\n const hashCut = query.split(\"#\", 1)[0] as string;\n const qIndex = hashCut.indexOf(\"?\");\n const rawQuery = qIndex >= 0 ? hashCut.slice(qIndex + 1) : hashCut;\n const normalized = rawQuery.startsWith(\"?\") ? rawQuery.slice(1) : rawQuery;\n const values: string[] = [];\n const target = normalizeQueryKey(key);\n for (const part of normalized.split(\"&\")) {\n if (part === \"\") {\n continue;\n }\n const eq = part.indexOf(\"=\");\n const rawKey = eq >= 0 ? part.slice(0, eq) : part;\n // Keys are rarely encoded, but decode before normalizing so\n // `add%5Femoji` matches `add_emoji` like values already do.\n if (normalizeQueryKey(urlDecode(rawKey)) !== target) {\n continue;\n }\n values.push(urlDecode(eq >= 0 ? part.slice(eq + 1) : \"\"));\n }\n return values;\n}\n\n/**\n * Read a parameter from a query string, mirroring subconverter's\n * `getUrlArg` (last occurrence wins, value percent-decoded).\n */\nexport function getUrlArg(query: string, key: string): string {\n const values = getAllUrlArgs(query, key);\n return values.length > 0 ? (values[values.length - 1] as string).trim() : \"\";\n}\n\n/** Split a URL into its scheme/authority-specific parts without a URL parser. */\nexport function splitUrl(raw: string): { base: string; query: string } {\n const hashIndex = raw.indexOf(\"#\");\n const withoutHash = hashIndex >= 0 ? raw.slice(0, hashIndex) : raw;\n const queryIndex = withoutHash.indexOf(\"?\");\n if (queryIndex < 0) {\n return { base: withoutHash, query: \"\" };\n }\n return { base: withoutHash.slice(0, queryIndex), query: withoutHash.slice(queryIndex + 1) };\n}\n\n/** Strip a scheme prefix (e.g. `ss://`) from a link. */\nexport function stripScheme(link: string): string {\n const index = link.indexOf(\"://\");\n return index >= 0 ? link.slice(index + 3) : link;\n}\n","/**\n * FNV-1a 64-bit hash, matching subconverter's `hash_` (used for WireGuard\n * section names and other deterministic identifiers).\n */\nexport function fnv1a64(input: string): bigint {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n for (const char of input) {\n hash ^= BigInt(char.codePointAt(0) as number);\n hash = BigInt.asUintN(64, hash * prime);\n }\n return hash;\n}\n\n/** Lowercase hex representation of {@link fnv1a64}. */\nexport function fnv1a64Hex(input: string): string {\n return fnv1a64(input).toString(16);\n}\n","/** A flat map of template variables (dotted keys are allowed, e.g. `clash.dns.port`). */\nexport type TemplateVars = Record<string, string>;\n\nconst INTERPOLATION = /\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g;\n\n/**\n * Interpolate `{{ name }}` placeholders in a template body.\n *\n * This is a pragmatic subset of subconverter's template engine: variables come\n * from the `[template]` section of an external config (or the `template` config\n * block). Unknown variables resolve to an empty string, matching the engine's\n * \"undefined variable\" behavior.\n */\nexport function renderTemplate(content: string, vars: TemplateVars): string {\n return content.replace(INTERPOLATION, (_match, name: string) => vars[name] ?? \"\");\n}\n\n/** `true` when the content contains any `{{ ... }}` placeholder. */\nexport function hasTemplatePlaceholders(content: string): boolean {\n INTERPOLATION.lastIndex = 0;\n return INTERPOLATION.test(content);\n}\n\n/** Collect the variable names referenced by a template body. */\nexport function templateVariableNames(content: string): string[] {\n const names = new Set<string>();\n for (const match of content.matchAll(INTERPOLATION)) {\n names.add(match[1] as string);\n }\n return [...names];\n}\n","import type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport { BalanceStrategy, ProxyGroupType } from \"../types/proxy-group\";\nimport type { RulesetConfig } from \"../types/ruleset\";\nimport type { RegexMatchConfig } from \"../types/settings\";\nimport { parseIni } from \"../utils/ini\";\nimport { startsWith, toInt } from \"../utils/string\";\n\n/** A parsed subconverter external configuration file. */\nexport interface ExternalConfig {\n groups: ProxyGroupConfig[];\n rulesets: RulesetConfig[];\n rename: RegexMatchConfig[];\n emoji: RegexMatchConfig[];\n nameRegex: RegexMatchConfig[];\n nameRemove: string[];\n includeRemarks: string[];\n excludeRemarks: string[];\n addEmoji: boolean;\n removeEmoji: boolean;\n autoCountry: boolean;\n enableRuleGenerator: boolean;\n overwriteOriginalRules: boolean;\n baseFiles: Record<string, string>;\n templatePath: string;\n templateVars: Record<string, string>;\n}\n\nconst GROUP_TYPE_MAP: Record<string, ProxyGroupType> = {\n fallback: ProxyGroupType.Fallback,\n \"load-balance\": ProxyGroupType.LoadBalance,\n relay: ProxyGroupType.Relay,\n select: ProxyGroupType.Select,\n smart: ProxyGroupType.Smart,\n ssid: ProxyGroupType.SSID,\n \"url-test\": ProxyGroupType.URLTest,\n};\n\n/** Parse `interval[,timeout[,tolerance]]`, mirroring `parseGroupTimes`. */\nexport function parseGroupTimes(src: string): {\n interval: number;\n timeout: number;\n tolerance: number;\n} {\n const [interval = \"\", timeout = \"\", tolerance = \"\"] = src.split(\",\");\n return {\n interval: toInt(interval),\n timeout: toInt(timeout),\n tolerance: toInt(tolerance),\n };\n}\n\n/** Parse a `name`type`rule...` INI proxy-group definition. */\nexport function parseCustomProxyGroup(value: string): ProxyGroupConfig | undefined {\n const parts = value.split(\"`\");\n if (parts.length < 3) {\n return undefined;\n }\n const name = parts[0] as string;\n const typeName = parts[1] as string;\n const type = GROUP_TYPE_MAP[typeName];\n if (type === undefined) {\n return undefined;\n }\n const group: ProxyGroupConfig = {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name,\n persistent: undefined,\n proxies: [],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 5,\n tolerance: 0,\n type,\n url: \"\",\n usingProvider: [],\n };\n let upperBound = parts.length;\n if (\n type === ProxyGroupType.URLTest ||\n type === ProxyGroupType.LoadBalance ||\n type === ProxyGroupType.Fallback\n ) {\n if (upperBound < 5) {\n return undefined;\n }\n upperBound -= 2;\n group.url = parts[upperBound] as string;\n const times = parseGroupTimes(parts[upperBound + 1] as string);\n group.interval = times.interval;\n group.timeout = times.timeout;\n group.tolerance = times.tolerance;\n }\n for (let i = 2; i < upperBound; i += 1) {\n const rule = parts[i] as string;\n if (startsWith(rule, \"!!PROVIDER=\")) {\n group.usingProvider.push(...rule.slice(11).split(\",\"));\n } else {\n group.proxies.push(rule);\n }\n }\n return group;\n}\n\n/** Parse a `group,url[,interval]` or `group,[]RULE` INI ruleset definition. */\nexport function parseRulesetConfig(value: string): RulesetConfig | undefined {\n const pos = value.indexOf(\",\");\n if (pos === -1) {\n return undefined;\n }\n const group = value.slice(0, pos);\n const config: RulesetConfig = { group, interval: 86400, url: \"\" };\n if (value.slice(pos + 1, pos + 3) === \"[]\") {\n config.url = value.slice(pos + 1);\n return config;\n }\n const endPos = value.lastIndexOf(\",\");\n if (endPos !== pos) {\n config.interval = toInt(value.slice(endPos + 1));\n config.url = value.slice(pos + 1, endPos);\n } else {\n config.url = value.slice(pos + 1);\n }\n return config;\n}\n\n/** Parse a rename/emoji rule using a delimiter (mirrors `from_ini`). */\nexport function parseRegexMatch(value: string, delimiter: string): RegexMatchConfig {\n if (startsWith(value, \"script:\")) {\n return { match: \"\", replace: \"\", script: value.slice(7) };\n }\n const pos = value.lastIndexOf(delimiter);\n const match = pos === -1 ? value : value.slice(0, pos);\n const replace = pos !== -1 && pos < value.length - 1 ? value.slice(pos + 1) : \"\";\n return { match, replace, script: \"\" };\n}\n\n/** Parse a subconverter external configuration file. */\nexport function parseExternalConfig(content: string): ExternalConfig {\n const result: ExternalConfig = {\n addEmoji: false,\n autoCountry: false,\n baseFiles: {},\n emoji: [],\n enableRuleGenerator: true,\n excludeRemarks: [],\n groups: [],\n includeRemarks: [],\n nameRegex: [],\n nameRemove: [],\n overwriteOriginalRules: true,\n removeEmoji: false,\n rename: [],\n rulesets: [],\n templatePath: \"\",\n templateVars: {},\n };\n\n const doc = parseIni(content, { keepEmptyValues: true });\n for (const section of doc.sections) {\n if (section.name.toLowerCase() !== \"template\") {\n continue;\n }\n for (const [key, value] of section.items) {\n if (key.toLowerCase() === \"template_path\") {\n result.templatePath = value;\n } else {\n result.templateVars[key] = value;\n }\n }\n }\n const relevant = doc.sections.filter((section) => section.name.toLowerCase() === \"custom\");\n const sections = relevant.length > 0 ? relevant : [{ items: [...doc.isolated], name: \"custom\" }];\n\n for (const section of sections) {\n for (const [keyRaw, value] of section.items) {\n const key = keyRaw.toLowerCase();\n switch (key) {\n case \"ruleset\": {\n const parsed = parseRulesetConfig(value);\n if (parsed) {\n result.rulesets.push(parsed);\n }\n break;\n }\n case \"custom_proxy_group\": {\n const parsed = parseCustomProxyGroup(value);\n if (parsed) {\n result.groups.push(parsed);\n }\n break;\n }\n case \"rename\":\n case \"rename_node\":\n result.rename.push(parseRegexMatch(value, \"@\"));\n break;\n case \"name_regex\":\n result.nameRegex.push(parseRegexMatch(value, \"@\"));\n break;\n case \"name_remove\":\n for (const fragment of value.split(\",\")) {\n const trimmed = fragment.trim();\n if (trimmed !== \"\") {\n result.nameRemove.push(trimmed);\n }\n }\n break;\n case \"emoji\":\n case \"emojis\":\n result.emoji.push(parseRegexMatch(value, \",\"));\n break;\n case \"include_remarks\":\n case \"include\":\n if (value !== \"\") {\n result.includeRemarks.push(value);\n }\n break;\n case \"exclude_remarks\":\n case \"exclude\":\n if (value !== \"\") {\n result.excludeRemarks.push(value);\n }\n break;\n case \"add_emoji\":\n result.addEmoji = value.toLowerCase() === \"true\";\n break;\n case \"auto_country\":\n case \"country\":\n result.autoCountry = value.toLowerCase() === \"true\";\n break;\n case \"remove_old_emoji\":\n case \"remove_emoji\":\n result.removeEmoji = value.toLowerCase() === \"true\";\n break;\n case \"enable_rule_generator\":\n result.enableRuleGenerator = value.toLowerCase() !== \"false\";\n break;\n case \"overwrite_original_rules\":\n result.overwriteOriginalRules = value.toLowerCase() !== \"false\";\n break;\n default:\n if (key.endsWith(\"_rule_base\")) {\n result.baseFiles[key] = value;\n }\n break;\n }\n }\n }\n return result;\n}\n","import { parseRegexMatch } from \"./config\";\nimport type { RequestSettings } from \"../types/settings\";\nimport { TargetFormat } from \"../types/settings\";\nimport { parseTriBool, type TriBool } from \"../types/tribool\";\nimport { toInt } from \"../utils/string\";\nimport { getAllUrlArgs, getUrlArg } from \"../utils/url\";\n\nconst TARGETS = new Set<string>(Object.values(TargetFormat));\n\n/**\n * `true` when `key` appears anywhere in the query string (`_`/`-`\n * equivalent). Delegates to `getAllUrlArgs` so presence checks share the\n * exact same decoding/precedence as value reads.\n */\nfunction hasArg(query: string, key: string): boolean {\n return getAllUrlArgs(query, key).length > 0;\n}\n\nfunction boolArg(query: string, key: string): boolean {\n // A missing key means `false`; a bare `?flag` (no value) means `true`.\n if (!hasArg(query, key)) {\n return false;\n }\n const value = getUrlArg(query, key).toLowerCase();\n return value === \"true\" || value === \"1\" || value === \"\";\n}\n\nfunction triArg(query: string, key: string): TriBool {\n const value = getUrlArg(query, key);\n return value === \"\" ? undefined : parseTriBool(value);\n}\n\nfunction listArg(query: string, key: string): string[] {\n const value = getUrlArg(query, key);\n return value === \"\" ? [] : value.split(\",\");\n}\n\n/**\n * Resolve the Clash field-name style. Defaults to the new `proxies` /\n * `proxy-groups` / `rules` keys; `legacy=true` (or an explicit\n * `new_name=false` / `new_field_name=false`) opts back into the legacy\n * `Proxy` / `Proxy Group` / `Rule` keys.\n *\n * Exported so the CLI reuses the exact same semantics instead of\n * maintaining a divergent copy.\n */\nexport function resolveNewFieldName(query: string): boolean {\n if (\n boolArg(query, \"legacy\") ||\n boolArg(query, \"legacy_field_name\") ||\n boolArg(query, \"legacy-field-name\")\n ) {\n return false;\n }\n if (\n hasArg(query, \"new_name\") ||\n hasArg(query, \"new_field_name\") ||\n hasArg(query, \"new-name\") ||\n hasArg(query, \"new-field-name\")\n ) {\n return (\n boolArg(query, \"new_name\") ||\n boolArg(query, \"new_field_name\") ||\n boolArg(query, \"new-name\") ||\n boolArg(query, \"new-field-name\")\n );\n }\n return true;\n}\n\n/** Read the first non-empty value across underscore/hyphen aliases. */\nfunction firstArg(query: string, ...keys: string[]): string {\n for (const key of keys) {\n const value = getUrlArg(query, key);\n if (value !== \"\") {\n return value;\n }\n }\n return \"\";\n}\n\n/**\n * Read a boolean flag across aliases. Returns `undefined` when no alias is\n * present; otherwise `true` when any occurrence is `true`/`1`/bare.\n * Shared by server-side flags (`dedupe`, `sort`, `no_rules`, …) so they\n * share one presence/OR semantic instead of per-callsite copies.\n */\nexport function queryBoolFlag(query: string, ...keys: string[]): boolean | undefined {\n let found = false;\n let result = false;\n for (const key of keys) {\n for (const raw of getAllUrlArgs(query, key)) {\n found = true;\n const normalized = raw.trim().toLowerCase();\n if (normalized === \"\" || normalized === \"true\" || normalized === \"1\") {\n result = true;\n }\n }\n }\n return found ? result : undefined;\n}\n\n/** Base {@link RequestSettings} with subconverter's defaults. */\nexport function createRequestSettings(): RequestSettings {\n return {\n addEmoji: false,\n appendType: false,\n autoCountry: false,\n autoExtract: false,\n clashScript: false,\n classicalRuleset: false,\n dedupe: false,\n emoji: [],\n excludeRemarks: [],\n filterDeprecated: false,\n group: [],\n includeRemarks: [],\n insert: false,\n interval: 0,\n list: false,\n mixin: \"\",\n nameRegex: [],\n nameRemove: [],\n newFieldName: true,\n nodeList: false,\n proxiesStyle: \"flow\",\n proxyGroupsStyle: \"flow\",\n removeEmoji: false,\n rename: [],\n ruleset: [],\n script: \"\",\n scv: undefined,\n sort: false,\n target: TargetFormat.Auto,\n tfo: undefined,\n tls13: undefined,\n udp: undefined,\n uploadPath: \"\",\n url: \"\",\n userinfoProvider: \"\",\n userinfoUrl: \"\",\n };\n}\n\n/** Parse a request query string into {@link RequestSettings}. */\nexport function parseRequestSettings(query: string): RequestSettings {\n const settings = createRequestSettings();\n const target = getUrlArg(query, \"target\");\n if (TARGETS.has(target)) {\n settings.target = target as TargetFormat;\n }\n settings.url = getUrlArg(query, \"url\");\n settings.list = boolArg(query, \"list\");\n settings.nodeList = settings.list;\n // `sort_flag`/`sort-flag` are accepted alongside `sort` to match the\n // server-side `toExtraSettings` aliases (normalization alone cannot map\n // `sort` <-> `sort_flag` since they differ beyond `_`/`-`).\n settings.sort = queryBoolFlag(query, \"sort\", \"sort_flag\", \"sort-flag\") ?? false;\n settings.dedupe = queryBoolFlag(query, \"dedupe\", \"deduplicate\") ?? false;\n settings.addEmoji = boolArg(query, \"add_emoji\");\n settings.removeEmoji = boolArg(query, \"remove_emoji\");\n settings.autoCountry = boolArg(query, \"auto_country\");\n settings.appendType = boolArg(query, \"append_type\");\n settings.filterDeprecated = boolArg(query, \"filter_deprecated\");\n settings.newFieldName = resolveNewFieldName(query);\n settings.classicalRuleset = boolArg(query, \"classical\");\n settings.insert = getUrlArg(query, \"insert\") !== \"\";\n settings.clashScript = boolArg(query, \"clash_script\");\n settings.autoExtract = boolArg(query, \"auto_extract\");\n settings.tfo = triArg(query, \"tfo\");\n settings.udp = triArg(query, \"udp\");\n settings.scv = triArg(query, \"scv\");\n settings.tls13 = triArg(query, \"tls13\");\n settings.interval = toInt(getUrlArg(query, \"interval\"));\n settings.script = getUrlArg(query, \"script\");\n settings.mixin = getUrlArg(query, \"mixin\");\n settings.uploadPath = getUrlArg(query, \"upload_path\");\n settings.proxiesStyle = getUrlArg(query, \"proxies_style\") || \"flow\";\n settings.proxyGroupsStyle = getUrlArg(query, \"proxy_groups_style\") || \"flow\";\n settings.includeRemarks = listArg(query, \"include\");\n settings.excludeRemarks = listArg(query, \"exclude\");\n settings.userinfoUrl = firstArg(query, \"userinfo_url\", \"userinfo-url\", \"userinfo\");\n settings.userinfoProvider = firstArg(\n query,\n \"userinfo_provider\",\n \"userinfo-provider\",\n \"userinfo_type\",\n \"userinfo-type\",\n );\n const renameRaw = getUrlArg(query, \"rename\");\n if (renameRaw !== \"\") {\n settings.rename = [parseRegexMatch(renameRaw, \"@\")];\n }\n // `name_regex` accepts the same `match@replacement` form as `rename` and may\n // be repeated; `name_remove` takes a comma-separated list of literals.\n settings.nameRegex = getAllUrlArgs(query, \"name_regex\")\n .flatMap((raw) => raw.split(\"\\n\"))\n .map((raw) => raw.trim())\n .filter((raw) => raw !== \"\")\n .map((raw) => parseRegexMatch(raw, \"@\"));\n settings.nameRemove = getAllUrlArgs(query, \"name_remove\")\n .flatMap((raw) => raw.split(\",\"))\n .map((raw) => raw.trim())\n .filter((raw) => raw !== \"\");\n const emojiRaw = getUrlArg(query, \"emoji\");\n if (emojiRaw !== \"\") {\n settings.emoji = [parseRegexMatch(emojiRaw, \",\")];\n }\n return settings;\n}\n","import { toInt } from \"./utils/string\";\n\n/** Normalized traffic counters for a `subscription-userinfo` header. */\nexport interface UserinfoData {\n /** Downloaded bytes. */\n download: number;\n /** Expiration as a unix timestamp in seconds (`0` when unknown). */\n expire: number;\n /** Total monthly bytes (`0` when unknown/unlimited). */\n total: number;\n /** Uploaded bytes. */\n upload: number;\n}\n\n/** Raw Just-My-Socks API payload (`bw_counter_b`, `monthly_bw_limit_b`, ...). */\nexport interface JmsUserinfoPayload {\n bwCounterB?: number | string;\n bwResetDayOfMonth?: number | string;\n monthlyBwLimitB?: number | string;\n}\n\n/** Supported `userinfo_provider` values for `/sub?userinfo_url=...`. */\nexport type UserinfoProvider = \"auto\" | \"jms\" | \"subscription\";\n\nconst PROVIDER_ALIASES: Record<string, UserinfoProvider> = {\n auto: \"auto\",\n clash: \"subscription\",\n jms: \"jms\",\n \"just-my-socks\": \"jms\",\n justmysocks: \"jms\",\n raw: \"subscription\",\n sub: \"subscription\",\n subscription: \"subscription\",\n \"subscription-userinfo\": \"subscription\",\n};\n\n/** Normalize a provider name (`JMS`, `justMySocks`, ...); unknown falls back to `auto`. */\nexport function normalizeUserinfoProvider(provider: string | undefined | null): UserinfoProvider {\n if (!provider) {\n return \"auto\";\n }\n const key = provider.trim().toLowerCase().replace(/_/g, \"-\");\n return PROVIDER_ALIASES[key] ?? \"auto\";\n}\n\n/**\n * Guess the quota provider from a `userinfo_url` when the caller did not pass\n * one explicitly. Just-My-Socks quota endpoints (`justmysocks*`,\n * `jmssub*`, `getbwcounter*`) use the JMS JSON shape; anything else yields\n * `undefined` (no suitable provider — the caller must skip conversion\n * instead of guessing).\n */\nexport function inferUserinfoProviderFromUrl(url: string): UserinfoProvider | undefined {\n const squished = url.trim().toLowerCase().replace(/[-_]/g, \"\");\n if (\n squished.includes(\"justmysocks\") ||\n squished.includes(\"jmssub\") ||\n squished.includes(\"getbwcounter\")\n ) {\n return \"jms\";\n }\n return undefined;\n}\n\n/** Clamp a value to a non-negative safe integer. */\nfunction toNonNegativeNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return Number.isFinite(value) && value > 0 ? Math.trunc(value) : 0;\n }\n if (typeof value === \"string\") {\n const parsed = toInt(value);\n return parsed > 0 ? parsed : 0;\n }\n return 0;\n}\n\n/** Days in a UTC month (`month` is 0-based). */\nfunction daysInUtcMonth(year: number, month: number): number {\n return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n}\n\n/**\n * JMS bills quota in decimal GB (1 GB = 1000^3 bytes) while Clash clients\n * render `subscription-userinfo` with 1024^3, which would show 500 GB as\n * ~466 GiB. Scale decimal bytes to binary bytes so clients display the\n * advertised GB. `expire` (a timestamp) is never scaled.\n */\nconst DECIMAL_TO_BINARY = 1024 ** 3 / 1000 ** 3;\n\nfunction scaleDecimalBytes(value: number): number {\n return Math.round(value * DECIMAL_TO_BINARY);\n}\n\n/** Scale every byte counter of normalized quota data (decimal -> binary). */\nfunction scaleUserinfoDecimal(data: UserinfoData): UserinfoData {\n return {\n download: scaleDecimalBytes(data.download),\n expire: data.expire,\n total: scaleDecimalBytes(data.total),\n upload: scaleDecimalBytes(data.upload),\n };\n}\n\n/**\n * Compute the next reset timestamp (unix seconds, UTC midnight) for a\n * monthly reset day, mirroring how providers reset quotas on a fixed\n * day-of-month. Returns `0` when the reset day is invalid.\n */\nexport function nextMonthlyResetTimestamp(resetDay: number, nowSec?: number): number {\n const day = Math.trunc(resetDay);\n if (!Number.isFinite(day) || day < 1 || day > 31) {\n return 0;\n }\n const now = nowSec && nowSec > 0 ? Math.trunc(nowSec) : Math.trunc(Date.now() / 1000);\n const current = new Date(now * 1000);\n const year = current.getUTCFullYear();\n const month = current.getUTCMonth();\n const today = current.getUTCDate();\n const useCurrentMonth = today < day;\n const targetYear = useCurrentMonth ? year : month === 11 ? year + 1 : year;\n const targetMonth = useCurrentMonth ? month : (month + 1) % 12;\n const clampedDay = Math.min(day, daysInUtcMonth(targetYear, targetMonth));\n return Math.trunc(Date.UTC(targetYear, targetMonth, clampedDay) / 1000);\n}\n\n/** Parse a Just-My-Socks JSON payload into normalized counters. */\nexport function parseJmsUserinfo(raw: string, nowSec?: number): UserinfoData | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return undefined;\n }\n const record = parsed as Record<string, unknown>;\n // Only claim payloads with provider-specific keys; generic\n // `upload`/`download`/`total` JSON is handled by the generic parser so\n // `auto` detection preserves all fields.\n const hasJmsKeys =\n record[\"monthly_bw_limit_b\"] !== undefined ||\n record[\"monthlyBwLimitB\"] !== undefined ||\n record[\"bw_counter_b\"] !== undefined ||\n record[\"bwCounterB\"] !== undefined ||\n record[\"bw_reset_day_of_month\"] !== undefined ||\n record[\"bwResetDayOfMonth\"] !== undefined;\n if (!hasJmsKeys) {\n return undefined;\n }\n // Tolerate both snake_case API keys and camelCase aliases.\n const limitRaw = record[\"monthly_bw_limit_b\"] ?? record[\"monthlyBwLimitB\"];\n const usedRaw = record[\"bw_counter_b\"] ?? record[\"bwCounterB\"];\n const resetRaw =\n record[\"bw_reset_day_of_month\"] ??\n record[\"bwResetDayOfMonth\"] ??\n record[\"reset_day\"] ??\n record[\"resetDay\"];\n const payload: JmsUserinfoPayload = {\n bwCounterB: usedRaw as number | string | undefined,\n bwResetDayOfMonth: resetRaw as number | string | undefined,\n monthlyBwLimitB: limitRaw as number | string | undefined,\n };\n // JMS bills decimal GB: scale to binary bytes so clients dividing by\n // 1024^3 display the advertised quota (500 GB -> 536870912000 bytes).\n const total = scaleDecimalBytes(toNonNegativeNumber(payload.monthlyBwLimitB));\n const download = scaleDecimalBytes(toNonNegativeNumber(payload.bwCounterB));\n const resetDay = toInt(\n typeof payload.bwResetDayOfMonth === \"number\"\n ? String(payload.bwResetDayOfMonth)\n : ((payload.bwResetDayOfMonth ?? \"\") as string),\n );\n return {\n download,\n expire: resetDay > 0 ? nextMonthlyResetTimestamp(resetDay, nowSec) : 0,\n total,\n upload: 0,\n };\n}\n\n/** Parse a `subscription-userinfo` header value into normalized counters. */\nexport function parseSubscriptionUserinfo(header: string): UserinfoData | undefined {\n if (!header || header.trim() === \"\") {\n return undefined;\n }\n const data: UserinfoData = { download: 0, expire: 0, total: 0, upload: 0 };\n let found = false;\n for (const part of header.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n const key = part.slice(0, eq).trim().toLowerCase();\n const value = part.slice(eq + 1).trim();\n if (value === \"\") {\n continue;\n }\n switch (key) {\n case \"download\":\n case \"down\":\n data.download = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n case \"expire\":\n case \"expires\":\n data.expire = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n case \"total\":\n case \"limit\":\n data.total = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n case \"upload\":\n case \"up\":\n data.upload = toNonNegativeNumber(toInt(value));\n found = true;\n break;\n default:\n break;\n }\n }\n return found ? data : undefined;\n}\n\n/** Render normalized counters as a `subscription-userinfo` header value. */\nexport function formatSubscriptionUserinfo(data: UserinfoData): string {\n const upload = toNonNegativeNumber(data.upload);\n const download = toNonNegativeNumber(data.download);\n const total = toNonNegativeNumber(data.total);\n const expire = toNonNegativeNumber(data.expire);\n return `upload=${upload}; download=${download}; total=${total}; expire=${expire}`;\n}\n\n/** Parse a generic JSON quota payload (`upload`/`download`/`total`/`expire` aliases). */\nfunction parseGenericJsonUserinfo(raw: string): UserinfoData | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return undefined;\n }\n const record = parsed as Record<string, unknown>;\n const pick = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (record[key] !== undefined) {\n return record[key];\n }\n }\n return undefined;\n };\n const uploadRaw = pick(\"upload\", \"upload_b\", \"up\", \"u\");\n const downloadRaw = pick(\n \"download\",\n \"download_b\",\n \"down\",\n \"d\",\n \"used\",\n \"bw_counter_b\",\n \"bwCounterB\",\n );\n const totalRaw = pick(\n \"total\",\n \"total_b\",\n \"limit\",\n \"bandwidth\",\n \"monthly_bw_limit_b\",\n \"monthlyBwLimitB\",\n );\n const expireRaw = pick(\"expire\", \"expires\", \"expire_at\", \"expireAt\", \"reset\");\n if (uploadRaw === undefined && downloadRaw === undefined && totalRaw === undefined) {\n return undefined;\n }\n return {\n download: toNonNegativeNumber(downloadRaw),\n expire: toNonNegativeNumber(expireRaw),\n total: toNonNegativeNumber(totalRaw),\n upload: toNonNegativeNumber(uploadRaw),\n };\n}\n\n/**\n * Convert a raw `userinfo_url` response body into a `subscription-userinfo`\n * header value using the given provider (`jms` for Just-My-Socks).\n * Returns `undefined` when the payload cannot be understood.\n */\nexport function convertUserinfo(\n raw: string,\n provider?: string,\n nowSec?: number,\n): string | undefined {\n if (!raw || raw.trim() === \"\") {\n return undefined;\n }\n const normalized = normalizeUserinfoProvider(provider);\n if (normalized === \"jms\") {\n const jms = parseJmsUserinfo(raw, nowSec);\n if (jms) {\n return formatSubscriptionUserinfo(jms);\n }\n // Explicit `jms` provider with a generic JSON shape: still decimal.\n const generic = parseGenericJsonUserinfo(raw);\n return generic ? formatSubscriptionUserinfo(scaleUserinfoDecimal(generic)) : undefined;\n }\n if (normalized === \"subscription\") {\n const parsed = parseSubscriptionUserinfo(raw) ?? parseGenericJsonUserinfo(raw);\n return parsed ? formatSubscriptionUserinfo(parsed) : undefined;\n }\n // `auto`: JMS shape first, then generic JSON, then header string.\n const jms = parseJmsUserinfo(raw, nowSec);\n if (jms) {\n return formatSubscriptionUserinfo(jms);\n }\n const generic = parseGenericJsonUserinfo(raw);\n if (generic) {\n return formatSubscriptionUserinfo(generic);\n }\n const header = parseSubscriptionUserinfo(raw);\n return header ? formatSubscriptionUserinfo(header) : undefined;\n}\n","/** Shadowsocks AEAD/stream ciphers recognized by the parser. */\nexport const SS_CIPHERS = [\n \"2022-blake3-aes-128-gcm\",\n \"2022-blake3-aes-256-gcm\",\n \"2022-blake3-chacha20-poly1305\",\n \"2022-blake3-chacha12-poly1305\",\n \"2022-blake3-chacha8-poly1305\",\n \"aes-128-cfb\",\n \"aes-128-ctr\",\n \"aes-128-gcm\",\n \"aes-192-cfb\",\n \"aes-192-ctr\",\n \"aes-192-gcm\",\n \"aes-256-cfb\",\n \"aes-256-ctr\",\n \"aes-256-gcm\",\n \"bf-cfb\",\n \"camellia-128-cfb\",\n \"camellia-192-cfb\",\n \"camellia-256-cfb\",\n \"chacha20\",\n \"chacha20-ietf\",\n \"chacha20-ietf-poly1305\",\n \"rc4-md5\",\n \"salsa20\",\n \"xchacha20-ietf-poly1305\",\n];\n\n/** ShadowsocksR stream ciphers recognized by the parser. */\nexport const SSR_CIPHERS = [\n \"aes-128-cfb\",\n \"aes-128-ctr\",\n \"aes-192-cfb\",\n \"aes-192-ctr\",\n \"aes-256-cfb\",\n \"aes-256-ctr\",\n \"bf-cfb\",\n \"camellia-128-cfb\",\n \"camellia-192-cfb\",\n \"camellia-256-cfb\",\n \"cast5-cfb\",\n \"chacha20\",\n \"chacha20-ietf\",\n \"des-cfb\",\n \"idea-cfb\",\n \"none\",\n \"rc2-cfb\",\n \"rc4\",\n \"rc4-md5\",\n \"salsa20\",\n \"seed-cfb\",\n \"table\",\n];\n\n/** `true` when `cipher` is a Shadowsocks cipher. */\nexport function isSsCipher(cipher: string): boolean {\n return SS_CIPHERS.includes(cipher.toLowerCase());\n}\n\n/**\n * True when an SSR node can be flattened to plain Shadowsocks: a known SS\n * cipher with no meaningful obfs/protocol. Mirrors subparser.cpp:713.\n */\nexport function isFlattenableSsr(method: string, obfs: string, protocol: string): boolean {\n return (\n isSsCipher(method) &&\n (obfs === \"\" || obfs === \"plain\") &&\n (protocol === \"\" || protocol === \"origin\")\n );\n}\n","import type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { base64Decode } from \"../utils/base64\";\nimport { isIpv4, isIpv6, toInt, trim } from \"../utils/string\";\n\nfunction commonConstruct(\n node: Proxy,\n type: ProxyType,\n group: string,\n remark: string,\n server: string,\n port: string | number,\n udp: TriBool,\n tfo: TriBool,\n scv: TriBool,\n tls13: TriBool,\n underlyingProxy: string,\n): void {\n node.type = type;\n node.group = group;\n node.remark = remark;\n node.hostname = server;\n node.underlyingProxy = underlyingProxy;\n node.port = toInt(port);\n node.udp = udp;\n node.tcpFastOpen = tfo;\n node.allowInsecure = scv;\n node.tls13 = tls13;\n}\n\nexport interface VmessOptions {\n group: string;\n remark: string;\n add: string;\n port: string | number;\n type?: string;\n id?: string;\n aid?: string | number;\n net?: string;\n cipher?: string;\n path?: string;\n host?: string;\n edge?: string;\n tls?: string;\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a VMess node. Mirrors subparser.cpp `vmessConstruct`. */\nexport function vmessConstruct(node: Proxy, options: VmessOptions): void {\n const {\n add,\n aid = 0,\n cipher = \"\",\n edge = \"\",\n group,\n host = \"\",\n id = \"\",\n net = \"\",\n path = \"\",\n port,\n remark,\n scv,\n sni = \"\",\n tfo,\n tls = \"\",\n tls13,\n type = \"\",\n udp,\n underlyingProxy = \"\",\n } = options;\n\n commonConstruct(\n node,\n ProxyType.VMess,\n group,\n remark,\n add,\n port,\n udp,\n tfo,\n scv,\n tls13,\n underlyingProxy,\n );\n node.userId = id === \"\" ? \"00000000-0000-0000-0000-000000000000\" : id;\n node.alterId = toInt(aid);\n node.encryptMethod = cipher;\n node.transferProtocol = net === \"\" ? \"tcp\" : net;\n node.edge = edge;\n node.serverName = sni;\n\n if (net === \"quic\") {\n node.quicSecure = host;\n node.quicSecret = path;\n } else {\n node.host = host === \"\" && !isIpv4(add) && !isIpv6(add) ? add : trim(host);\n node.path = path === \"\" ? \"/\" : trim(path);\n }\n node.fakeType = type;\n node.tlsSecure = tls === \"tls\";\n}\n\nexport interface SsrOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n protocol: string;\n method: string;\n obfs: string;\n password: string;\n obfsParam?: string;\n protocolParam?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a ShadowsocksR node. Mirrors `ssrConstruct`. */\nexport function ssrConstruct(node: Proxy, options: SsrOptions): void {\n commonConstruct(\n node,\n ProxyType.ShadowsocksR,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.encryptMethod = options.method;\n node.protocol = options.protocol;\n node.protocolParam = options.protocolParam ?? \"\";\n node.obfs = options.obfs;\n node.obfsParam = options.obfsParam ?? \"\";\n}\n\nexport interface SsOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n method: string;\n plugin?: string;\n pluginOption?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Shadowsocks node. Mirrors `ssConstruct`. */\nexport function ssConstruct(node: Proxy, options: SsOptions): void {\n commonConstruct(\n node,\n ProxyType.Shadowsocks,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.encryptMethod = options.method;\n node.plugin = options.plugin ?? \"\";\n node.pluginOption = options.pluginOption ?? \"\";\n}\n\nexport interface SocksOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n username?: string;\n password?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a SOCKS5 node. Mirrors `socksConstruct`. */\nexport function socksConstruct(node: Proxy, options: SocksOptions): void {\n commonConstruct(\n node,\n ProxyType.SOCKS5,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.username = options.username ?? \"\";\n node.password = options.password ?? \"\";\n}\n\nexport interface HttpOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n username?: string;\n password?: string;\n tls: boolean;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build an HTTP/HTTPS node. Mirrors `httpConstruct`. */\nexport function httpConstruct(node: Proxy, options: HttpOptions): void {\n commonConstruct(\n node,\n options.tls ? ProxyType.HTTPS : ProxyType.HTTP,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.username = options.username ?? \"\";\n node.password = options.password ?? \"\";\n node.tlsSecure = options.tls;\n}\n\nexport interface TrojanOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n network?: string;\n host?: string;\n path?: string;\n tlsSecure?: boolean;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n tls13?: TriBool;\n sni?: string;\n underlyingProxy?: string;\n}\n\n/** Build a Trojan node. Mirrors `trojanConstruct`. */\nexport function trojanConstruct(node: Proxy, options: TrojanOptions): void {\n commonConstruct(\n node,\n ProxyType.Trojan,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n options.tls13,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.host = options.host ?? \"\";\n node.tlsSecure = options.tlsSecure ?? true;\n node.transferProtocol =\n options.network === undefined || options.network === \"\" ? \"tcp\" : options.network;\n node.path = options.path ?? \"\";\n node.serverName = options.sni ?? \"\";\n}\n\nexport interface SnellOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n obfs?: string;\n host?: string;\n version?: number;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Snell node. Mirrors `snellConstruct`. */\nexport function snellConstruct(node: Proxy, options: SnellOptions): void {\n commonConstruct(\n node,\n ProxyType.Snell,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.password = options.password;\n node.obfs = options.obfs ?? \"\";\n node.host = options.host ?? \"\";\n node.snellVersion = options.version ?? 0;\n}\n\nexport interface AnyTlsOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n password: string;\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build an AnyTLS node. Mirrors `anyTLSConstruct`. */\nexport function anyTlsConstruct(node: Proxy, options: AnyTlsOptions): void {\n commonConstruct(\n node,\n ProxyType.AnyTLS,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.password = options.password;\n node.sni = options.sni ?? \"\";\n}\n\nexport interface WireGuardOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n selfIp?: string;\n selfIpv6?: string;\n privateKey?: string;\n publicKey?: string;\n preSharedKey?: string;\n dnsServers?: string[];\n mtu?: string | number;\n keepAlive?: string | number;\n testUrl?: string;\n clientId?: string;\n udp?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a WireGuard node. Mirrors `wireguardConstruct`. */\nexport function wireGuardConstruct(node: Proxy, options: WireGuardOptions): void {\n commonConstruct(\n node,\n ProxyType.WireGuard,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n undefined,\n undefined,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.selfIp = options.selfIp ?? \"\";\n node.selfIpv6 = options.selfIpv6 ?? \"\";\n node.privateKey = options.privateKey ?? \"\";\n node.publicKey = options.publicKey ?? \"\";\n node.preSharedKey = options.preSharedKey ?? \"\";\n node.dnsServers = options.dnsServers ?? [];\n node.mtu = toInt(options.mtu);\n node.keepAlive = toInt(options.keepAlive);\n node.testUrl = options.testUrl ?? \"\";\n node.clientId = options.clientId ?? \"\";\n}\n\nexport interface HysteriaOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n ports?: string;\n protocol?: string;\n obfsProtocol?: string;\n up?: string;\n upSpeed?: string;\n down?: string;\n downSpeed?: string;\n auth?: string;\n authStr?: string;\n obfs?: string;\n sni?: string;\n fingerprint?: string;\n ca?: string;\n caStr?: string;\n recvWindowConn?: string | number;\n recvWindow?: string | number;\n disableMtuDiscovery?: string;\n hopInterval?: string | number;\n alpn?: string;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Hysteria (v1) node. Mirrors `hysteriaConstruct`. */\nexport function hysteriaConstruct(node: Proxy, options: HysteriaOptions): void {\n commonConstruct(\n node,\n ProxyType.Hysteria,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.ports = options.ports ?? \"\";\n node.protocol = options.protocol ?? \"\";\n node.obfsParam = options.obfsProtocol ?? \"\";\n\n const up = options.up ?? \"\";\n if (up !== \"\") {\n if (up.length > 4 && up.endsWith(\"bps\")) {\n node.up = up;\n } else if (toInt(up)) {\n node.upSpeed = toInt(up);\n node.up = `${up} Mbps`;\n }\n }\n if (options.upSpeed) {\n node.upSpeed = toInt(options.upSpeed);\n }\n const down = options.down ?? \"\";\n if (down !== \"\") {\n if (down.length > 4 && down.endsWith(\"bps\")) {\n node.down = down;\n } else if (toInt(down)) {\n node.downSpeed = toInt(down);\n node.down = `${down} Mbps`;\n }\n }\n if (options.downSpeed) {\n node.downSpeed = toInt(options.downSpeed);\n }\n\n node.authStr = options.authStr ?? \"\";\n if (options.auth) {\n node.authStr = base64Decode(options.auth);\n }\n node.tlsSecure = true;\n node.obfs = options.obfs ?? \"\";\n node.sni = options.sni ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n node.ca = options.ca ?? \"\";\n node.caStr = options.caStr ?? \"\";\n node.recvWindowConn = toInt(options.recvWindowConn);\n node.recvWindow = toInt(options.recvWindow);\n node.disableMtuDiscovery = options.disableMtuDiscovery\n ? options.disableMtuDiscovery === \"true\"\n : undefined;\n node.hopInterval = toInt(options.hopInterval);\n if (options.alpn) {\n node.alpn = [options.alpn];\n }\n}\n\nexport interface Hysteria2Options {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n ports?: string;\n up?: string;\n down?: string;\n password?: string;\n obfs?: string;\n obfsPassword?: string;\n sni?: string;\n fingerprint?: string;\n alpn?: string;\n ca?: string;\n caStr?: string;\n cwnd?: string | number;\n hopInterval?: string | number;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a Hysteria2 node. Mirrors `hysteria2Construct`. */\nexport function hysteria2Construct(node: Proxy, options: Hysteria2Options): void {\n commonConstruct(\n node,\n ProxyType.Hysteria2,\n options.group,\n options.remark,\n options.server,\n options.port,\n undefined,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.upSpeed = toInt(options.up);\n node.downSpeed = toInt(options.down);\n node.ports = options.ports ?? \"\";\n node.password = options.password ?? \"\";\n node.obfs = options.obfs ?? \"\";\n node.obfsParam = options.obfsPassword ?? \"\";\n node.sni = options.sni ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n if (options.alpn) {\n node.alpn = [options.alpn];\n }\n node.ca = options.ca ?? \"\";\n node.caStr = options.caStr ?? \"\";\n node.cwnd = toInt(options.cwnd);\n node.hopInterval = toInt(options.hopInterval);\n}\n\nexport interface VlessOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n userId: string;\n flow?: string;\n encryption?: string;\n network?: string;\n tls?: string;\n sni?: string;\n host?: string;\n path?: string;\n fingerprint?: string;\n publicKey?: string;\n shortId?: string;\n alpn?: string[];\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a VLESS node. */\nexport function vlessConstruct(node: Proxy, options: VlessOptions): void {\n commonConstruct(\n node,\n ProxyType.VLESS,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.userId = options.userId;\n node.flow = options.flow ?? \"\";\n node.encryptMethod = options.encryption ?? \"none\";\n node.transferProtocol =\n options.network === undefined || options.network === \"\" ? \"tcp\" : options.network;\n node.tlsSecure = options.tls === \"tls\" || options.tls === \"reality\";\n node.serverName = options.sni ?? \"\";\n node.host = options.host ?? \"\";\n node.path = options.path ?? \"\";\n node.fingerprint = options.fingerprint ?? \"\";\n node.publicKey = options.publicKey ?? \"\";\n node.shortId = options.shortId ?? \"\";\n if (options.alpn) {\n node.alpn = options.alpn;\n }\n}\n\nexport interface TuicOptions {\n group: string;\n remark: string;\n server: string;\n port: string | number;\n userId: string;\n password: string;\n congestionControl?: string;\n alpn?: string[];\n sni?: string;\n udp?: TriBool;\n tfo?: TriBool;\n scv?: TriBool;\n underlyingProxy?: string;\n}\n\n/** Build a TUIC node. */\nexport function tuicConstruct(node: Proxy, options: TuicOptions): void {\n commonConstruct(\n node,\n ProxyType.TUIC,\n options.group,\n options.remark,\n options.server,\n options.port,\n options.udp,\n options.tfo,\n options.scv,\n undefined,\n options.underlyingProxy ?? \"\",\n );\n node.tlsSecure = true;\n node.userId = options.userId;\n node.password = options.password;\n node.congestionControl = options.congestionControl ?? \"\";\n node.serverName = options.sni ?? \"\";\n if (options.alpn) {\n node.alpn = options.alpn;\n }\n}\n","import { isFlattenableSsr } from \"./ciphers\";\nimport {\n httpConstruct,\n snellConstruct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n vmessConstruct,\n} from \"./construct\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS } from \"../types/proxy\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { toInt } from \"../utils/string\";\n\nfunction tri(value: unknown): boolean | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n return String(value).toLowerCase() === \"true\";\n}\n\nfunction str(value: unknown): string {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\n/** Parse a `Netch://<base64 json>` link into `node`. */\nexport function explodeNetch(netch: string, node: Proxy): void {\n let data: any;\n try {\n data = JSON.parse(urlSafeBase64Decode(netch.slice(8)));\n } catch {\n return;\n }\n if (data === null || typeof data !== \"object\") {\n return;\n }\n const type = str(data.Type);\n const group = str(data.Group);\n let remark = str(data.Remark);\n const address = str(data.Hostname);\n const udp = tri(data.EnableUDP);\n const tfo = tri(data.EnableTFO);\n const scv = tri(data.AllowInsecure);\n const port = str(data.Port);\n if (port === \"0\" || port === \"\") {\n return;\n }\n const method = str(data.EncryptMethod);\n const password = str(data.Password);\n if (remark === \"\") {\n remark = `${address}:${port}`;\n }\n\n switch (type) {\n case \"SS\":\n ssConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ss : group,\n method,\n password,\n plugin: str(data.Plugin),\n pluginOption: str(data.PluginOption),\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n break;\n case \"SSR\": {\n const protocol = str(data.Protocol);\n const obfs = str(data.OBFS);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ss : group,\n method,\n password,\n plugin: str(data.Plugin),\n pluginOption: str(data.PluginOption),\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n } else {\n ssrConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.ssr : group,\n method,\n obfs,\n obfsParam: str(data.OBFSParam),\n password,\n port,\n protocol,\n protocolParam: str(data.ProtocolParam),\n remark,\n scv,\n server: address,\n tfo,\n udp,\n });\n }\n break;\n }\n case \"VMess\":\n vmessConstruct(node, {\n add: address,\n aid: str(data.AlterID),\n cipher: method,\n edge: str(data.Edge),\n group: group === \"\" ? DEFAULT_GROUPS.v2ray : group,\n host: str(data.Host),\n id: str(data.UserID),\n net: str(data.TransferProtocol),\n path: str(data.Path),\n port,\n remark,\n scv,\n sni: str(data.ServerName),\n tfo,\n tls: str(data.TLSSecure),\n type: str(data.FakeType),\n udp,\n });\n break;\n case \"Socks5\":\n socksConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.socks : group,\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n username: str(data.Username),\n });\n break;\n case \"HTTP\":\n case \"HTTPS\":\n httpConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.http : group,\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n tls: type === \"HTTPS\",\n });\n break;\n case \"Trojan\":\n trojanConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.trojan : group,\n host: str(data.Host),\n network: str(data.TransferProtocol),\n password,\n path: str(data.Path),\n port,\n remark,\n scv,\n server: address,\n tfo,\n tlsSecure: str(data.TLSSecure) === \"true\",\n udp,\n });\n break;\n case \"Snell\":\n snellConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.snell : group,\n host: str(data.Host),\n obfs: str(data.OBFS),\n password,\n port,\n remark,\n scv,\n server: address,\n tfo,\n udp,\n version: toInt(str(data.SnellVersion)),\n });\n break;\n default:\n break;\n }\n}\n","import { parse as parseYaml } from \"yaml\";\n\nimport { isFlattenableSsr } from \"./ciphers\";\nimport {\n anyTlsConstruct,\n httpConstruct,\n hysteria2Construct,\n hysteriaConstruct,\n snellConstruct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n tuicConstruct,\n vlessConstruct,\n vmessConstruct,\n wireGuardConstruct,\n} from \"./construct\";\nimport { explodeNetch } from \"./netch\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS, createProxy } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { base64Encode } from \"../utils/base64\";\nimport { split, toInt, trim } from \"../utils/string\";\n\nfunction asString(value: unknown): string {\n if (value === undefined || value === null) {\n return \"\";\n }\n return String(value);\n}\n\nfunction asBool(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n return asString(value).toLowerCase() === \"true\";\n}\n\nfunction asTri(value: unknown): TriBool {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n return asBool(value);\n}\n\nfunction get(obj: any, key: string | number): unknown {\n return obj !== null && typeof obj === \"object\" ? obj[key] : undefined;\n}\n\n/** Parse a Clash `proxies:` list into normalized nodes. */\nexport function explodeClash(root: any, nodes: Proxy[]): void {\n const section = get(root, \"proxies\") !== undefined ? \"proxies\" : \"Proxy\";\n const list = get(root, section) as any[] | undefined;\n if (!Array.isArray(list)) {\n return;\n }\n let index = nodes.length;\n\n for (const single of list) {\n const proxyType = asString(get(single, \"type\")).toLowerCase();\n const ps = asString(get(single, \"name\"));\n const server = asString(get(single, \"server\"));\n const port = asString(get(single, \"port\"));\n let underlyingProxy = asString(get(single, \"underlying-proxy\"));\n if (underlyingProxy === \"\") {\n underlyingProxy = asString(get(single, \"dialer-proxy\"));\n }\n if (port === \"\" || port === \"0\") {\n continue;\n }\n const udp = asTri(get(single, \"udp\"));\n const tfo = asTri(get(single, \"fast-open\"));\n const scv = asTri(get(single, \"skip-cert-verify\"));\n const node = createProxy();\n let group = \"\";\n\n switch (proxyType) {\n case \"vmess\": {\n group = DEFAULT_GROUPS.v2ray;\n const id = asString(get(single, \"uuid\"));\n const aid = asString(get(single, \"alterId\"));\n const cipher = asString(get(single, \"cipher\"));\n const net = get(single, \"network\") !== undefined ? asString(get(single, \"network\")) : \"tcp\";\n const sni = asString(get(single, \"servername\"));\n let path = \"\";\n let host = \"\";\n let edge = \"\";\n switch (net) {\n case \"http\":\n path = asString(get(get(get(single, \"http-opts\"), \"path\"), 0));\n host = asString(get(get(get(get(single, \"http-opts\"), \"headers\"), \"Host\"), 0));\n edge = \"\";\n break;\n case \"ws\":\n if (get(single, \"ws-opts\") !== undefined) {\n const wsOpts = get(single, \"ws-opts\");\n path = get(wsOpts, \"path\") !== undefined ? asString(get(wsOpts, \"path\")) : \"/\";\n host = asString(get(get(wsOpts, \"headers\"), \"Host\"));\n edge = asString(get(get(wsOpts, \"headers\"), \"Edge\"));\n } else {\n path = get(single, \"ws-path\") !== undefined ? asString(get(single, \"ws-path\")) : \"/\";\n host = asString(get(get(single, \"ws-headers\"), \"Host\"));\n edge = asString(get(get(single, \"ws-headers\"), \"Edge\"));\n }\n break;\n case \"h2\":\n path = asString(get(get(single, \"h2-opts\"), \"path\"));\n host = asString(get(get(get(single, \"h2-opts\"), \"host\"), 0));\n edge = \"\";\n break;\n case \"grpc\":\n host = asString(get(single, \"servername\"));\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n edge = \"\";\n break;\n default:\n break;\n }\n const tls = asBool(get(single, \"tls\")) ? \"tls\" : \"\";\n vmessConstruct(node, {\n add: server,\n aid,\n cipher,\n edge,\n group,\n host,\n id,\n net,\n path,\n port,\n remark: ps,\n scv,\n sni,\n tfo,\n tls,\n type: \"\",\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"ss\": {\n group = DEFAULT_GROUPS.ss;\n let cipher = asString(get(single, \"cipher\"));\n const password = asString(get(single, \"password\"));\n let plugin = \"\";\n let pluginOption = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let pluginMux = \"\";\n let pluginTls = \"\";\n let path = \"\";\n if (get(single, \"plugin\") !== undefined) {\n const pluginName = asString(get(single, \"plugin\")).toLowerCase();\n const pluginOpts = get(single, \"plugin-opts\");\n if (pluginName === \"obfs\") {\n plugin = \"obfs-local\";\n pluginMode = asString(get(pluginOpts, \"mode\"));\n pluginHost = asString(get(pluginOpts, \"host\"));\n } else if (pluginName === \"v2ray-plugin\") {\n plugin = \"v2ray-plugin\";\n pluginMode = asString(get(pluginOpts, \"mode\"));\n pluginHost = asString(get(pluginOpts, \"host\"));\n pluginTls = asBool(get(pluginOpts, \"tls\")) ? \"tls;\" : \"\";\n path = asString(get(pluginOpts, \"path\"));\n pluginMux = asBool(get(pluginOpts, \"mux\")) ? \"mux=4;\" : \"\";\n }\n } else if (get(single, \"obfs\") !== undefined) {\n plugin = \"obfs-local\";\n pluginMode = asString(get(single, \"obfs\"));\n pluginHost = asString(get(single, \"obfs-host\"));\n }\n if (plugin === \"simple-obfs\" || plugin === \"obfs-local\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n } else if (plugin === \"v2ray-plugin\") {\n pluginOption = `mode=${pluginMode};${pluginTls}${pluginMux}`;\n if (pluginHost !== \"\") {\n pluginOption += `host=${pluginHost};`;\n }\n if (path !== \"\") {\n pluginOption += `path=${path};`;\n }\n if (pluginMux !== \"\") {\n pluginOption += `mux=${pluginMux};`;\n }\n }\n if (cipher === \"AEAD_CHACHA20_POLY1305\") {\n cipher = \"chacha20-ietf-poly1305\";\n } else if (cipher.includes(\"AEAD\")) {\n cipher = cipher.replace(/AEAD_/g, \"\").replace(/_/g, \"-\").toLowerCase();\n }\n ssConstruct(node, {\n group,\n method: cipher,\n password,\n plugin,\n pluginOption,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"socks5\": {\n group = DEFAULT_GROUPS.socks;\n const user = asString(get(single, \"username\"));\n const password = asString(get(single, \"password\"));\n socksConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n server,\n underlyingProxy,\n username: user,\n });\n break;\n }\n case \"ssr\": {\n group = DEFAULT_GROUPS.ssr;\n let cipher = asString(get(single, \"cipher\"));\n if (cipher === \"dummy\") {\n cipher = \"none\";\n }\n const password = asString(get(single, \"password\"));\n const protocol = asString(get(single, \"protocol\"));\n const obfs = asString(get(single, \"obfs\"));\n const protocolParam =\n get(single, \"protocol-param\") !== undefined\n ? asString(get(single, \"protocol-param\"))\n : asString(get(single, \"protocolparam\"));\n const obfsParam =\n get(single, \"obfs-param\") !== undefined\n ? asString(get(single, \"obfs-param\"))\n : asString(get(single, \"obfsparam\"));\n ssrConstruct(node, {\n group,\n method: cipher,\n obfs,\n obfsParam,\n password,\n port,\n protocol,\n protocolParam,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"http\": {\n group = DEFAULT_GROUPS.http;\n const user = asString(get(single, \"username\"));\n const password = asString(get(single, \"password\"));\n const tls = asString(get(single, \"tls\"));\n httpConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n tls: tls === \"true\",\n underlyingProxy,\n username: user,\n });\n break;\n }\n case \"trojan\": {\n group = DEFAULT_GROUPS.trojan;\n const password = asString(get(single, \"password\"));\n const host = asString(get(single, \"sni\"));\n let net = asString(get(single, \"network\"));\n let path = \"\";\n switch (net) {\n case \"grpc\":\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n break;\n case \"ws\":\n path = asString(get(get(single, \"ws-opts\"), \"path\"));\n break;\n default:\n net = \"tcp\";\n path = \"\";\n break;\n }\n trojanConstruct(node, {\n group,\n host,\n network: net,\n password,\n path,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n tlsSecure: true,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"snell\": {\n group = DEFAULT_GROUPS.snell;\n const password = asString(get(single, \"psk\"));\n const obfs = asString(get(get(single, \"obfs-opts\"), \"mode\"));\n const host = asString(get(get(single, \"obfs-opts\"), \"host\"));\n const version = asString(get(single, \"version\"));\n snellConstruct(node, {\n group,\n host,\n obfs,\n password,\n port,\n remark: ps,\n scv,\n server,\n tfo,\n udp,\n underlyingProxy,\n version: toInt(version),\n });\n break;\n }\n case \"wireguard\": {\n group = DEFAULT_GROUPS.wireguard;\n const publicKey = asString(get(single, \"public-key\"));\n const privateKey = asString(get(single, \"private-key\"));\n const dns = get(single, \"dns\");\n const dnsServers = Array.isArray(dns)\n ? dns.map((d) => String(d))\n : dns\n ? [String(dns)]\n : [];\n const mtu = asString(get(single, \"mtu\"));\n const psk = asString(get(single, \"preshared-key\"));\n const ip = asString(get(single, \"ip\"));\n const ipv6 = asString(get(single, \"ipv6\"));\n wireGuardConstruct(node, {\n dnsServers,\n group,\n keepAlive: \"0\",\n mtu,\n port,\n preSharedKey: psk,\n privateKey,\n publicKey,\n remark: ps,\n selfIp: ip,\n selfIpv6: ipv6,\n server,\n testUrl: \"\",\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"hysteria\": {\n group = DEFAULT_GROUPS.hysteria;\n const ports = asString(get(single, \"ports\"));\n const protocol = asString(get(single, \"protocol\"));\n const obfsProtocol = asString(get(single, \"obfs-protocol\"));\n const up = asString(get(single, \"up\"));\n const upSpeed = asString(get(single, \"up-speed\"));\n const down = asString(get(single, \"down\"));\n const downSpeed = asString(get(single, \"down-speed\"));\n const auth = asString(get(single, \"auth\"));\n let authStr = asString(get(single, \"auth-str\"));\n if (authStr === \"\") {\n authStr = asString(get(single, \"auth_str\"));\n }\n const obfs = asString(get(single, \"obfs\"));\n const sni = asString(get(single, \"sni\"));\n const fingerprint = asString(get(single, \"fingerprint\"));\n const alpnValue = get(single, \"alpn\");\n const alpn = Array.isArray(alpnValue) ? asString(alpnValue[0]) : asString(alpnValue);\n const ca = asString(get(single, \"ca\"));\n const caStr = asString(get(single, \"ca-str\"));\n const recvWindowConn = asString(get(single, \"recv-window-conn\"));\n const recvWindow = asString(get(single, \"recv-window\"));\n let disableMtuDiscovery = asString(get(single, \"disable-mtu-discovery\"));\n if (disableMtuDiscovery === \"\") {\n disableMtuDiscovery = asString(get(single, \"disable_mtu_discovery\"));\n }\n const hopInterval = asString(get(single, \"hop-interval\"));\n hysteriaConstruct(node, {\n alpn,\n auth,\n authStr,\n ca,\n caStr,\n disableMtuDiscovery,\n down,\n downSpeed,\n fingerprint,\n group,\n hopInterval,\n obfs,\n obfsProtocol,\n port,\n ports,\n protocol,\n recvWindow,\n recvWindowConn,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n underlyingProxy,\n up,\n upSpeed,\n });\n break;\n }\n case \"hysteria2\": {\n group = DEFAULT_GROUPS.hysteria2;\n const ports = asString(get(single, \"ports\"));\n const up = asString(get(single, \"up\"));\n const down = asString(get(single, \"down\"));\n let password = asString(get(single, \"password\"));\n if (password === \"\") {\n password = asString(get(single, \"auth\"));\n }\n const obfs = asString(get(single, \"obfs\"));\n const obfsPassword = asString(get(single, \"obfs-password\"));\n const sni = asString(get(single, \"sni\"));\n const fingerprint = asString(get(single, \"fingerprint\"));\n const alpnValue = get(single, \"alpn\");\n const alpn = Array.isArray(alpnValue) ? asString(alpnValue[0]) : asString(alpnValue);\n const ca = asString(get(single, \"ca\"));\n const caStr = asString(get(single, \"ca-str\"));\n const cwnd = asString(get(single, \"cwnd\"));\n const hopInterval = asString(get(single, \"hop-interval\"));\n hysteria2Construct(node, {\n alpn,\n ca,\n caStr,\n cwnd,\n down,\n fingerprint,\n group,\n hopInterval,\n obfs,\n obfsPassword,\n password,\n port,\n ports,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n underlyingProxy,\n up,\n });\n break;\n }\n case \"anytls\": {\n group = DEFAULT_GROUPS.anytls;\n const password = asString(get(single, \"password\"));\n const sni = asString(get(single, \"sni\"));\n anyTlsConstruct(node, {\n group,\n password,\n port,\n remark: ps,\n scv,\n server,\n sni,\n tfo,\n udp,\n underlyingProxy,\n });\n break;\n }\n case \"vless\": {\n group = DEFAULT_GROUPS.v2ray;\n const userId = asString(get(single, \"uuid\"));\n const net = asString(get(single, \"network\"));\n const tls = asString(get(single, \"tls\"));\n let path = \"\";\n let host = \"\";\n if (net === \"ws\") {\n path = asString(get(get(single, \"ws-opts\"), \"path\"));\n host = asString(get(get(get(single, \"ws-opts\"), \"headers\"), \"Host\"));\n } else if (net === \"grpc\") {\n path = asString(get(get(single, \"grpc-opts\"), \"grpc-service-name\"));\n }\n const alpnValue = get(single, \"alpn\");\n vlessConstruct(node, {\n alpn: Array.isArray(alpnValue) ? alpnValue.map((a) => String(a)) : undefined,\n encryption: asString(get(single, \"encryption\")),\n fingerprint: asString(get(single, \"client-fingerprint\")),\n flow: asString(get(single, \"flow\")),\n group,\n host,\n network: net,\n path,\n port,\n remark: ps,\n scv,\n server,\n sni: asString(get(single, \"servername\")),\n tfo,\n tls: tls === \"true\" ? \"tls\" : \"\",\n udp,\n underlyingProxy,\n userId,\n });\n break;\n }\n case \"tuic\": {\n group = DEFAULT_GROUPS.v2ray;\n const alpnValue = get(single, \"alpn\");\n tuicConstruct(node, {\n alpn: Array.isArray(alpnValue) ? alpnValue.map((a) => String(a)) : undefined,\n congestionControl: asString(get(single, \"congestion-controller\")),\n group,\n password: asString(get(single, \"password\")),\n port,\n remark: ps,\n scv,\n server,\n sni: asString(get(single, \"sni\")),\n tfo,\n udp,\n underlyingProxy,\n userId: asString(get(single, \"uuid\")),\n });\n break;\n }\n default:\n continue;\n }\n\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Split INI-style text into ordered sections with their raw lines. */\nfunction parseRawSections(text: string): Array<{ name: string; lines: string[] }> {\n const sections: Array<{ name: string; lines: string[] }> = [];\n const isolated: string[] = [];\n let current: { name: string; lines: string[] } | undefined;\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n const header = /^\\[(.*)\\]$/.exec(line);\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line === \"\" || line.startsWith(\"#\") || line.startsWith(\";\")) {\n continue;\n }\n if (current) {\n current.lines.push(line);\n } else {\n isolated.push(line);\n }\n }\n if (isolated.length > 0) {\n sections.unshift({ lines: isolated, name: \"Proxy\" });\n }\n return sections;\n}\n\nfunction getRawSection(sections: Array<{ name: string; lines: string[] }>, name: string): string[] {\n const lines: string[] = [];\n for (const section of sections) {\n if (section.name === name) {\n lines.push(...section.lines);\n }\n }\n return lines;\n}\n\nfunction collectKeyValues(\n lines: string[],\n startIndex: number,\n sink: { [key: string]: string },\n): void {\n for (let i = startIndex; i < lines.length; i += 1) {\n const line = trim(lines[i] as string);\n const eq = line.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n sink[trim(line.slice(0, eq))] = trim(line.slice(eq + 1));\n }\n}\n\n/** Parse a Surge/Loon `[Proxy]` configuration into nodes. */\nexport function explodeSurge(surge: string, nodes: Proxy[]): boolean {\n let text = surge;\n if (text.includes(\"[Proxy]\")) {\n text = text.replace(/^[\\s\\S]*?\\[/, \"[\");\n }\n const sections = parseRawSections(text);\n const proxyLines = getRawSection(sections, \"Proxy\");\n if (proxyLines.length === 0) {\n return false;\n }\n const startCount = nodes.length;\n let index = nodes.length;\n\n for (const line of proxyLines) {\n const match = /^(.*?)\\s*=\\s*(.*)$/.exec(line);\n if (!match) {\n continue;\n }\n const remark = match[1] as string;\n const config = match[2] as string;\n const configs = split(config, \",\");\n if (configs.length < 3) {\n continue;\n }\n const node = createProxy();\n let server = \"\";\n let port = \"\";\n let method = \"\";\n let username = \"\";\n let password = \"\";\n let plugin = \"\";\n let pluginOption = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let id = \"\";\n let net = \"tcp\";\n let tls = \"\";\n let host = \"\";\n let edge = \"\";\n let path = \"\";\n let version = \"\";\n let aead = \"1\";\n let udp: TriBool;\n let tfo: TriBool;\n let scv: TriBool;\n let tls13: TriBool;\n\n switch ((configs[0] as string).toLowerCase()) {\n case \"direct\":\n case \"reject\":\n case \"reject-tinygif\":\n continue;\n case \"custom\": {\n if (configs.length < 5) {\n continue;\n }\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n method = trim(configs[3] as string);\n password = trim(configs[4] as string);\n for (let i = 6; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"obfs\") {\n plugin = \"simple-obfs\";\n pluginMode = itemVal;\n } else if (itemName === \"obfs-host\") {\n pluginHost = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n }\n }\n if (plugin !== \"\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n }\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n });\n break;\n }\n case \"ss\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"encrypt-method\") {\n method = itemVal;\n } else if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"obfs\") {\n plugin = \"simple-obfs\";\n pluginMode = itemVal;\n } else if (itemName === \"obfs-host\") {\n pluginHost = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n }\n }\n if (plugin !== \"\") {\n pluginOption = `obfs=${pluginMode}`;\n pluginOption += pluginHost === \"\" ? \"\" : `;obfs-host=${pluginHost}`;\n }\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n });\n break;\n }\n case \"socks5\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n if (configs.length >= 5) {\n username = trim(configs[3] as string);\n password = trim(configs[4] as string);\n }\n for (let i = 5; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n socksConstruct(node, {\n group: DEFAULT_GROUPS.socks,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n username,\n });\n break;\n }\n case \"vmess\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n net = \"tcp\";\n method = \"auto\";\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n switch (itemName) {\n case \"username\":\n id = itemVal;\n break;\n case \"ws\":\n net = itemVal === \"true\" ? \"ws\" : \"tcp\";\n break;\n case \"tls\":\n tls = itemVal === \"true\" ? \"tls\" : \"\";\n break;\n case \"ws-path\":\n path = itemVal;\n break;\n case \"obfs-host\":\n host = itemVal;\n break;\n case \"ws-headers\": {\n const headers = split(itemVal, \"|\");\n for (const header of headers) {\n const kv = split(trim(header), \":\");\n if (kv.length !== 2) {\n continue;\n }\n if (/host/i.test(kv[0] as string)) {\n host = trimQuote(kv[1] as string);\n } else if (/edge/i.test(kv[0] as string)) {\n edge = trimQuote(kv[1] as string);\n }\n }\n break;\n }\n case \"udp-relay\":\n udp = asTri(itemVal);\n break;\n case \"tfo\":\n tfo = asTri(itemVal);\n break;\n case \"skip-cert-verify\":\n scv = asTri(itemVal);\n break;\n case \"tls13\":\n tls13 = asTri(itemVal);\n break;\n case \"vmess-aead\":\n aead = itemVal === \"true\" ? \"0\" : \"1\";\n break;\n default:\n break;\n }\n }\n vmessConstruct(node, {\n add: server,\n aid: aead,\n cipher: method,\n edge,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n scv,\n tfo,\n tls,\n tls13,\n udp,\n });\n break;\n }\n case \"http\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"username\") {\n username = itemVal;\n } else if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n httpConstruct(node, {\n group: DEFAULT_GROUPS.http,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n tls: false,\n username,\n });\n break;\n }\n case \"trojan\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"sni\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n trojanConstruct(node, {\n group: DEFAULT_GROUPS.trojan,\n host,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n tlsSecure: true,\n udp,\n });\n break;\n }\n case \"snell\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"psk\") {\n password = itemVal;\n } else if (itemName === \"obfs\") {\n plugin = itemVal;\n } else if (itemName === \"obfs-host\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n } else if (itemName === \"version\") {\n version = itemVal;\n }\n }\n snellConstruct(node, {\n group: DEFAULT_GROUPS.snell,\n host,\n obfs: plugin,\n password,\n port,\n remark,\n scv,\n server,\n tfo,\n udp,\n version: toInt(version),\n });\n break;\n }\n case \"wireguard\": {\n let section = \"\";\n let testUrl = \"\";\n for (let i = 1; i < configs.length; i += 1) {\n const vArray = split(trim(configs[i] as string), \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"section-name\") {\n section = itemVal;\n } else if (itemName === \"test-url\") {\n testUrl = itemVal;\n }\n }\n if (section === \"\") {\n continue;\n }\n const wgLines = getRawSection(sections, `WireGuard ${section}`);\n if (wgLines.length === 0) {\n continue;\n }\n const wg: { [key: string]: string } = {};\n collectKeyValues(wgLines, 0, wg);\n const dnsServers: string[] = [];\n if (wg[\"dns-server\"]) {\n for (const dns of split(wg[\"dns-server\"], \",\")) {\n dnsServers.push(trim(dns));\n }\n }\n wireGuardConstruct(node, {\n dnsServers,\n group: DEFAULT_GROUPS.wireguard,\n keepAlive: wg[\"keepalive\"] ?? \"\",\n mtu: wg[\"mtu\"] ?? \"\",\n port: \"0\",\n privateKey: wg[\"private-key\"] ?? \"\",\n remark,\n selfIp: wg[\"self-ip\"] ?? \"\",\n selfIpv6: wg[\"self-ip-v6\"] ?? \"\",\n server: \"\",\n testUrl,\n udp,\n });\n parsePeers(node, wg[\"peer\"] ?? \"\");\n break;\n }\n case \"anytls\": {\n server = trim(configs[1] as string);\n port = trim(configs[2] as string);\n if (port === \"0\") {\n continue;\n }\n for (let i = 3; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray[1] as string);\n if (itemName === \"password\") {\n password = itemVal;\n } else if (itemName === \"sni\") {\n host = itemVal;\n } else if (itemName === \"udp-relay\") {\n udp = asTri(itemVal);\n } else if (itemName === \"tfo\") {\n tfo = asTri(itemVal);\n } else if (itemName === \"skip-cert-verify\") {\n scv = asTri(itemVal);\n }\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark,\n scv,\n server,\n sni: host,\n tfo,\n udp,\n });\n break;\n }\n default: {\n const handled = parseQuanxStyle(remark, configs, node, { scv, tfo, tls13, udp });\n if (!handled) {\n continue;\n }\n break;\n }\n }\n\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n return nodes.length > startCount;\n}\n\ninterface QuanxFlags {\n udp: TriBool;\n tfo: TriBool;\n scv: TriBool;\n tls13: TriBool;\n}\n\nfunction parseQuanxStyle(\n remark: string,\n configs: string[],\n node: Proxy,\n flags: QuanxFlags,\n): boolean {\n const kind = remark.toLowerCase();\n const first = configs[0] as string;\n const lastColon = first.lastIndexOf(\":\");\n const server = trim(first.slice(0, lastColon));\n const port = trim(first.slice(lastColon + 1));\n if (port === \"0\") {\n return false;\n }\n let method = \"\";\n let password = \"\";\n let username = \"\";\n let host = \"\";\n let path = \"\";\n let plugin = \"\";\n let pluginMode = \"\";\n let pluginHost = \"\";\n let protocol = \"\";\n let protocolParam = \"\";\n let tls = \"\";\n let net = \"tcp\";\n let id = \"\";\n let aead = \"1\";\n let newRemark = remark;\n const udp = flags.udp;\n const tfo = flags.tfo;\n let scv = flags.scv;\n const tls13 = flags.tls13;\n\n const kv: { [key: string]: string } = {};\n for (let i = 1; i < configs.length; i += 1) {\n const vArray = split(trim(configs[i] as string), \"=\");\n if (vArray.length !== 2) {\n continue;\n }\n kv[trim(vArray[0] as string)] = trim(vArray[1] as string);\n }\n\n if (kind === \"shadowsocks\") {\n method = kv[\"method\"] ?? \"\";\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n protocol = kv[\"ssr-protocol\"] ?? \"\";\n protocolParam = kv[\"ssr-protocol-param\"] ?? \"\";\n if (kv[\"obfs\"]) {\n const obfsVal = kv[\"obfs\"] as string;\n if (obfsVal === \"http\" || obfsVal === \"tls\") {\n plugin = \"simple-obfs\";\n pluginMode = obfsVal;\n } else if (obfsVal === \"wss\" || obfsVal === \"ws\") {\n if (obfsVal === \"wss\") {\n tls = \"tls\";\n }\n pluginMode = \"websocket\";\n plugin = \"v2ray-plugin\";\n } else {\n pluginMode = obfsVal;\n }\n }\n pluginHost = kv[\"obfs-host\"] ?? \"\";\n path = kv[\"obfs-uri\"] ?? \"\";\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n let pluginOption = \"\";\n if (plugin === \"simple-obfs\") {\n pluginOption = `obfs=${pluginMode}`;\n if (pluginHost !== \"\") {\n pluginOption += `;obfs-host=${pluginHost}`;\n }\n } else if (plugin === \"v2ray-plugin\") {\n if (pluginHost === \"\" && !/^\\d+(\\.\\d+){3}$/.test(server) && !server.includes(\":\")) {\n pluginHost = server;\n }\n pluginOption = `mode=${pluginMode}`;\n if (pluginHost !== \"\") {\n pluginOption += `;host=${pluginHost}`;\n }\n if (path !== \"\") {\n pluginOption += `;path=${path}`;\n }\n pluginOption += `;${tls}`;\n }\n if (protocol !== \"\") {\n ssrConstruct(node, {\n group: DEFAULT_GROUPS.ssr,\n method,\n obfs: pluginMode,\n obfsParam: pluginHost,\n password,\n port,\n protocol,\n protocolParam,\n remark: newRemark,\n scv,\n server,\n tfo,\n udp,\n });\n } else {\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls13,\n udp,\n });\n }\n return true;\n }\n\n if (kind === \"vmess\") {\n net = \"tcp\";\n method = kv[\"method\"] ?? \"\";\n id = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"obfs\"]) {\n const obfsVal = kv[\"obfs\"] as string;\n if (obfsVal === \"ws\") {\n net = \"ws\";\n } else if (obfsVal === \"over-tls\") {\n tls = \"tls\";\n } else if (obfsVal === \"wss\") {\n net = \"ws\";\n tls = \"tls\";\n }\n }\n host = kv[\"obfs-host\"] ?? \"\";\n path = kv[\"obfs-uri\"] ?? \"\";\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] === \"true\" ? \"tls\" : \"\";\n }\n if (kv[\"aead\"]) {\n aead = kv[\"aead\"] === \"true\" ? \"0\" : \"1\";\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n vmessConstruct(node, {\n add: server,\n aid: aead,\n cipher: method,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: newRemark,\n scv,\n tfo,\n tls,\n tls13,\n udp,\n });\n return true;\n }\n\n if (kind === \"trojan\") {\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] as string;\n }\n host = kv[\"tls-host\"] ?? \"\";\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n trojanConstruct(node, {\n group: DEFAULT_GROUPS.trojan,\n host,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls13,\n tlsSecure: tls === \"true\",\n udp,\n });\n return true;\n }\n\n if (kind === \"http\") {\n username = kv[\"username\"] ?? \"\";\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n if (kv[\"over-tls\"]) {\n tls = kv[\"over-tls\"] as string;\n }\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n if (username === \"none\") {\n username = \"\";\n }\n if (password === \"none\") {\n password = \"\";\n }\n httpConstruct(node, {\n group: DEFAULT_GROUPS.http,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n tfo,\n tls: tls === \"true\",\n tls13,\n username,\n });\n return true;\n }\n\n if (kind === \"anytls\") {\n password = kv[\"password\"] ?? \"\";\n if (kv[\"tag\"]) {\n newRemark = kv[\"tag\"] as string;\n }\n host = kv[\"sni\"] ?? \"\";\n if (kv[\"tls-verification\"] === \"false\") {\n scv = true;\n }\n if (newRemark === \"\") {\n newRemark = `${server}:${port}`;\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark: newRemark,\n scv,\n server,\n sni: host,\n tfo,\n udp,\n });\n return true;\n }\n\n return false;\n}\n\nfunction trimQuote(input: string): string {\n let value = trim(input);\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n return value;\n}\n\n/** Parse a WireGuard `peer = (...)` blob into `node`. */\nexport function parsePeers(node: Proxy, data: string): void {\n const peers = [...data.matchAll(/\\((.*?)\\)/g)].map((m) => m[1] as string);\n if (peers.length === 0) {\n return;\n }\n const peer = peers[0] as string;\n const pairs = [...peer.matchAll(/([a-z-]+)\\s?=\\s?([^\" ),]+|\".*?\"),?\\s?/g)];\n for (const pair of pairs) {\n const key = pair[1] as string;\n const val = pair[2] as string;\n switch (key) {\n case \"public-key\":\n node.publicKey = val;\n break;\n case \"endpoint\": {\n const colon = val.lastIndexOf(\":\");\n node.hostname = val.slice(0, colon);\n node.port = toInt(val.slice(colon + 1));\n break;\n }\n case \"client-id\":\n node.clientId = val;\n break;\n case \"allowed-ips\":\n node.allowedIps = trimQuote(val);\n break;\n default:\n break;\n }\n }\n}\n\n/** Parse a Clash/plain YAML string into nodes (returns count). */\nexport function parseClashText(content: string, nodes: Proxy[]): boolean {\n try {\n const root = parseYaml(content);\n if (\n root &&\n typeof root === \"object\" &&\n (get(root, \"Proxy\") !== undefined || get(root, \"proxies\") !== undefined)\n ) {\n explodeClash(root, nodes);\n return true;\n }\n } catch {\n return false;\n }\n return false;\n}\n\n/** Parse an ss/ssr/v2ray configuration JSON blob (single or list). */\nexport function parseConfContent(content: string, nodes: Proxy[]): boolean {\n if (content.includes('\"version\"')) {\n explodeSsConf(content, nodes);\n } else if (content.includes('\"serverSubscribes\"')) {\n explodeSsrConf(content, nodes);\n } else if (content.includes('\"uiItem\"') || content.includes(\"vnext\")) {\n explodeVmessConf(content, nodes);\n } else if (content.includes('\"proxy_apps\"')) {\n explodeSsAndroid(content, nodes);\n } else if (content.includes('\"idInUse\"')) {\n explodeSstap(content, nodes);\n } else if (content.includes('\"local_address\"') && content.includes('\"local_port\"')) {\n explodeSsrConf(content, nodes);\n } else if (content.includes('\"ModeFileNameType\"')) {\n explodeNetchConf(content, nodes);\n } else {\n return false;\n }\n return nodes.length > 0;\n}\n\n/** Parse a Shadowsocks Android (`ssconf`) JSON config. */\nexport function explodeSsConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n const section = \"version\" in json && \"servers\" in json ? \"servers\" : \"configs\";\n if (!(section in json)) {\n return;\n }\n const group = asString(json.remarks);\n const list: any[] = json[section];\n if (!Array.isArray(list)) {\n return;\n }\n let index = nodes.length;\n for (const entry of list) {\n const remark = asString(entry.remarks);\n const port = asString(entry.server_port);\n if (port === \"0\") {\n continue;\n }\n const server = asString(entry.server);\n const node = createProxy();\n ssConstruct(node, {\n group,\n method: asString(entry.method),\n password: asString(entry.password),\n plugin: asString(entry.plugin),\n pluginOption: asString(entry.plugin_opts),\n port,\n remark: remark === \"\" ? `${server}:${port}` : remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a Shadowsocks Android (`com.github.shadowsocks`) node array. */\nexport function explodeSsAndroid(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(`{\"nodes\":${content}}`);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.nodes)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.nodes) {\n const server = asString(entry.server);\n if (server === \"\") {\n continue;\n }\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks);\n const node = createProxy();\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method: asString(entry.method),\n password: asString(entry.password),\n plugin: asString(entry.plugin),\n pluginOption: asString(entry.plugin_opts),\n port,\n remark: remark === \"\" ? `${server}:${port}` : remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a ShadowsocksR config JSON. */\nexport function explodeSsrConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n let index = nodes.length;\n if (\"local_port\" in json && \"local_address\" in json) {\n const node = createProxy();\n const server = asString(json.server);\n const port = asString(json.server_port);\n const remark = `${server}:${port}`;\n const method = asString(json.method);\n const obfs = asString(json.obfs);\n const protocol = asString(json.protocol);\n const password = asString(json.password);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: DEFAULT_GROUPS.ss,\n method,\n password,\n plugin: asString(json.plugin),\n pluginOption: asString(json.plugin_opts),\n port,\n remark,\n server,\n });\n } else {\n ssrConstruct(node, {\n group: DEFAULT_GROUPS.ssr,\n method,\n obfs,\n obfsParam: asString(json.obfs_param),\n password,\n port,\n protocol,\n protocolParam: asString(json.protocol_param),\n remark,\n server,\n });\n }\n node.id = index;\n nodes.push(node);\n return;\n }\n\n const list: any[] = json.configs ?? [];\n if (!Array.isArray(list)) {\n return;\n }\n for (const entry of list) {\n const group = asString(entry.group) === \"\" ? DEFAULT_GROUPS.ssr : asString(entry.group);\n const server = asString(entry.server);\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks) === \"\" ? `${server}:${port}` : asString(entry.remarks);\n const node = createProxy();\n ssrConstruct(node, {\n group,\n method: asString(entry.method),\n obfs: asString(entry.obfs),\n obfsParam: asString(entry.obfsparam),\n password: asString(entry.password),\n port,\n protocol: asString(entry.protocol),\n protocolParam: asString(entry.protocolparam),\n remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a v2rayN config JSON. */\nexport function explodeVmessConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\") {\n return;\n }\n let index = nodes.length;\n\n if (\"outbounds\" in json) {\n const outbounds = json.outbounds;\n if (\n Array.isArray(outbounds) &&\n outbounds.length > 0 &&\n outbounds[0]?.settings?.vnext?.length > 0\n ) {\n const vnext = outbounds[0].settings.vnext[0];\n const add = asString(vnext.address);\n const port = asString(vnext.port);\n if (port === \"0\") {\n return;\n }\n const users = vnext.users;\n const id = Array.isArray(users) && users.length ? asString(users[0].id) : \"\";\n const aid = Array.isArray(users) && users.length ? asString(users[0].alterId) : \"\";\n const cipher = Array.isArray(users) && users.length ? asString(users[0].security) : \"\";\n const stream = outbounds[0].streamSettings ?? {};\n const net = asString(stream.network);\n const tls = asString(stream.security);\n let path = \"\";\n let host = \"\";\n let edge = \"\";\n let type = \"\";\n if (net === \"ws\") {\n const ws = stream.wsSettings ?? {};\n path = asString(ws.path);\n if (ws.headers) {\n host = asString(ws.headers.Host);\n edge = asString(ws.headers.Edge);\n }\n }\n const tcp = stream.tcpSettings;\n if (tcp && tcp.header) {\n type = asString(tcp.header.type);\n if (type === \"http\" && tcp.header.request) {\n if (Array.isArray(tcp.header.request.path) && tcp.header.request.path.length) {\n path = asString(tcp.header.request.path[0]);\n }\n if (tcp.header.request.headers) {\n host = asString(tcp.header.request.headers.Host);\n edge = asString(tcp.header.request.headers.Edge);\n }\n }\n }\n const node = createProxy();\n vmessConstruct(node, {\n add,\n aid,\n cipher,\n edge,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: `${add}:${port}`,\n tls,\n type,\n });\n nodes.push(node);\n }\n return;\n }\n\n const subdata = new Map<string, string>();\n const subItems: any[] = json.subItem ?? [];\n for (const item of subItems) {\n subdata.set(asString(item.id), asString(item.remarks));\n }\n\n const list: any[] = json.vmess ?? [];\n for (const entry of list) {\n if (\n entry.address === null ||\n entry.address === undefined ||\n entry.port === null ||\n entry.id === null\n ) {\n continue;\n }\n let ps = asString(entry.remarks);\n const add = asString(entry.address);\n const port = asString(entry.port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const subid = asString(entry.subid);\n let group = \"\";\n if (subid !== \"\") {\n group = subdata.get(subid) ?? \"\";\n }\n if (ps === \"\") {\n ps = `${add}:${port}`;\n }\n const scv = asTri(entry.allowInsecure);\n const configType = toInt(entry.configType);\n const node = createProxy();\n if (configType === 1) {\n vmessConstruct(node, {\n add,\n aid: asString(entry.alterId),\n cipher: asString(entry.security),\n group: group || DEFAULT_GROUPS.v2ray,\n host: asString(entry.requestHost),\n id: asString(entry.id),\n net: asString(entry.network),\n path: asString(entry.path),\n port,\n remark: ps,\n scv,\n sni: asString(entry.sni),\n tls: asString(entry.streamSecurity),\n type: asString(entry.headerType),\n });\n } else if (configType === 3) {\n ssConstruct(node, {\n group: group || DEFAULT_GROUPS.ss,\n method: asString(entry.security),\n password: asString(entry.id),\n port,\n remark: ps,\n scv,\n server: add,\n });\n } else if (configType === 4) {\n socksConstruct(node, {\n group: group || DEFAULT_GROUPS.socks,\n port,\n remark: ps,\n scv,\n server: add,\n });\n } else {\n continue;\n }\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse an SSTap config JSON. */\nexport function explodeSstap(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.configs)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.configs) {\n const group = asString(entry.group);\n const server = asString(entry.server);\n const port = asString(entry.server_port);\n if (port === \"0\" || port === \"\") {\n continue;\n }\n const remark = asString(entry.remarks) === \"\" ? `${server}:${port}` : asString(entry.remarks);\n const password = asString(entry.password);\n const node = createProxy();\n const configType = toInt(entry.type);\n if (configType === 5) {\n socksConstruct(node, {\n group,\n password,\n port,\n remark,\n server,\n username: asString(entry.username),\n });\n } else if (configType === 6) {\n const protocol = asString(entry.protocol);\n const obfs = asString(entry.obfs);\n const method = asString(entry.method);\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, { group, method, password, port, remark, server });\n } else {\n ssrConstruct(node, {\n group,\n method,\n obfs,\n obfsParam: asString(entry.obfsparam),\n password,\n port,\n protocol,\n protocolParam: asString(entry.protocolparam),\n remark,\n server,\n });\n }\n } else {\n continue;\n }\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse a Netch config JSON. */\nexport function explodeNetchConf(content: string, nodes: Proxy[]): void {\n let json: any;\n try {\n json = JSON.parse(content);\n } catch {\n return;\n }\n if (json === null || typeof json !== \"object\" || !Array.isArray(json.Server)) {\n return;\n }\n let index = nodes.length;\n for (const entry of json.Server) {\n const node = createProxy();\n explodeNetch(`Netch://${base64Encode(JSON.stringify(entry))}`, node);\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n","import { isFlattenableSsr } from \"./ciphers\";\nimport {\n anyTlsConstruct,\n httpConstruct,\n hysteria2Construct,\n socksConstruct,\n ssConstruct,\n ssrConstruct,\n trojanConstruct,\n tuicConstruct,\n vlessConstruct,\n vmessConstruct,\n} from \"./construct\";\nimport type { Proxy } from \"../types/proxy\";\nimport { DEFAULT_GROUPS, createProxy } from \"../types/proxy\";\nimport type { TriBool } from \"../types/tribool\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { split, toInt, trim } from \"../utils/string\";\nimport { getUrlArg, urlDecode } from \"../utils/url\";\n\n/** `true` when the link is a plain HTTP(S) subscription URL. */\nexport function isLink(link: string): boolean {\n return link.startsWith(\"http://\") || link.startsWith(\"https://\");\n}\n\nfunction firstMatch(input: string, pattern: string): string[] | null {\n const match = new RegExp(pattern).exec(input);\n return match ? match.slice() : null;\n}\n\n/** Parse `vmess://<base64 json>` or a variant link into `node`. */\nexport function explodeVmess(vmess: string, node: Proxy): void {\n if (/^vmess:\\/\\/[A-Za-z0-9-_]+\\?.*/.test(vmess)) {\n explodeShadowrocket(vmess, node);\n return;\n }\n if (/^vmess:\\/\\/.*?@.*/.test(vmess)) {\n explodeStdVmess(vmess, node);\n return;\n }\n if (/^vmess1:\\/\\/.*?\\?.*/.test(vmess)) {\n explodeKitsunebi(vmess, node);\n return;\n }\n\n const decoded = urlSafeBase64Decode(vmess.replace(/(vmess|vmess1):\\/\\//, \"\"));\n if (/.*?\\s=\\s.*/.test(decoded)) {\n explodeQuan(decoded, node);\n return;\n }\n\n let data: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(decoded);\n if (parsed === null || typeof parsed !== \"object\") {\n return;\n }\n data = parsed as Record<string, unknown>;\n } catch {\n return;\n }\n\n let version = \"1\";\n if (data[\"v\"] !== undefined) {\n version = String(data[\"v\"]);\n }\n const ps = String(data[\"ps\"] ?? \"\");\n let add = String(data[\"add\"] ?? \"\");\n const port = String(data[\"port\"] ?? \"\");\n if (port === \"0\" || port === \"\") {\n return;\n }\n const type = String(data[\"type\"] ?? \"\");\n const id = String(data[\"id\"] ?? \"\");\n const aid = String(data[\"aid\"] ?? \"\");\n const net = String(data[\"net\"] ?? \"\");\n const tls = String(data[\"tls\"] ?? \"\");\n let host = String(data[\"host\"] ?? \"\");\n const sni = String(data[\"sni\"] ?? \"\");\n let path = \"\";\n\n switch (toInt(version)) {\n case 1: {\n if (host !== \"\") {\n const parts = split(host, \";\");\n if (parts.length === 2) {\n host = parts[0] as string;\n path = parts[1] as string;\n }\n }\n break;\n }\n case 2: {\n path = String(data[\"path\"] ?? \"\");\n break;\n }\n default:\n break;\n }\n add = trim(add);\n\n vmessConstruct(node, {\n add,\n aid,\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark: ps,\n sni,\n tls,\n type,\n });\n}\n\n/** Parse the `net:uuid-aid@host:port` VMess variant. */\nexport function explodeStdVmess(vmess: string, node: Proxy): void {\n let body = vmess.slice(8);\n let remark = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const matcher =\n /^([a-z]+)(?:\\+([a-z]+))?:([\\da-f]{4}(?:[\\da-f]{4}-){4}[\\da-f]{12})-(\\d+)@(.+):(\\d+)(?:\\/?\\?(.*))?$/;\n const match = matcher.exec(body);\n if (!match) {\n return;\n }\n const net = match[1] as string;\n const tls = match[2] ?? \"\";\n const id = match[3] as string;\n const aid = match[4] as string;\n const add = match[5] as string;\n const port = match[6] as string;\n const addition = match[7] ?? \"\";\n\n let type = \"\";\n let host = \"\";\n let path = \"\";\n switch (net) {\n case \"tcp\":\n case \"kcp\":\n type = getUrlArg(addition, \"type\");\n break;\n case \"http\":\n case \"ws\":\n host = getUrlArg(addition, \"host\");\n path = getUrlArg(addition, \"path\");\n break;\n case \"quic\":\n type = getUrlArg(addition, \"security\");\n host = getUrlArg(addition, \"type\");\n path = getUrlArg(addition, \"key\");\n break;\n default:\n return;\n }\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid,\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type,\n });\n}\n\n/** Parse a Shadowrocket-style VMess link. */\nexport function explodeShadowrocket(rocket: string, node: Proxy): void {\n let body = rocket.slice(8);\n let net = \"tcp\";\n const qpos = body.indexOf(\"?\");\n const addition = qpos >= 0 ? body.slice(qpos + 1) : \"\";\n body = qpos >= 0 ? body.slice(0, qpos) : body;\n\n const match = firstMatch(urlSafeBase64Decode(body), \"(.*?):(.*)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const cipher = match[1] as string;\n const id = match[2] as string;\n const add = match[3] as string;\n const port = match[4] as string;\n if (port === \"0\") {\n return;\n }\n let remark = urlDecode(getUrlArg(addition, \"remarks\"));\n const obfs = getUrlArg(addition, \"obfs\");\n let host = \"\";\n let path = \"\";\n const type = \"\";\n if (obfs !== \"\") {\n if (obfs === \"websocket\") {\n net = \"ws\";\n host = getUrlArg(addition, \"obfsParam\");\n path = getUrlArg(addition, \"path\");\n }\n } else {\n net = getUrlArg(addition, \"network\");\n host = getUrlArg(addition, \"wsHost\");\n path = getUrlArg(addition, \"wspath\");\n }\n const tls = getUrlArg(addition, \"tls\") === \"1\" ? \"tls\" : \"\";\n let aid = getUrlArg(addition, \"aid\");\n if (aid === \"\") {\n aid = \"0\";\n }\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid,\n cipher,\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type,\n });\n}\n\n/** Parse a Kitsunebi-style `vmess1://` link. */\nexport function explodeKitsunebi(kit: string, node: Proxy): void {\n let body = kit.slice(9);\n let remark = \"\";\n let path = \"\";\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = body.slice(hashPos + 1);\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n const addition = qpos >= 0 ? body.slice(qpos + 1) : \"\";\n body = qpos >= 0 ? body.slice(0, qpos) : body;\n\n const match = firstMatch(body, \"(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const id = match[1] as string;\n const add = match[2] as string;\n let port = match[3] as string;\n const slash = port.indexOf(\"/\");\n if (slash !== -1) {\n path = port.slice(slash);\n port = port.slice(0, slash);\n }\n if (port === \"0\") {\n return;\n }\n const net = getUrlArg(addition, \"network\");\n const tls = getUrlArg(addition, \"tls\") === \"true\" ? \"tls\" : \"\";\n const host = getUrlArg(addition, \"ws.host\");\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n vmessConstruct(node, {\n add,\n aid: \"0\",\n cipher: \"auto\",\n group: DEFAULT_GROUPS.v2ray,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type: \"\",\n });\n}\n\n/** Parse a Quantumult `remarks = vmess, ...` definition. */\nexport function explodeQuan(quan: string, node: Proxy): void {\n const normalized = quan.replace(/(.*?)\\s=\\s(.*)/, \"$1,$2\");\n const configs = split(normalized, \",\");\n if (configs.length < 6 || configs[1] !== \"vmess\") {\n return;\n }\n const remark = trim(configs[0] as string);\n const add = trim(configs[2] as string);\n const port = trim(configs[3] as string);\n if (port === \"0\") {\n return;\n }\n const cipher = trim(configs[4] as string);\n const id = trim((configs[5] as string).replace(/\"/g, \"\"));\n\n let group: string = DEFAULT_GROUPS.v2ray;\n let tls = \"\";\n let host = \"\";\n let path = \"\";\n let net = \"tcp\";\n let edge = \"\";\n\n for (let i = 6; i < configs.length; i += 1) {\n const vArray = split(configs[i] as string, \"=\");\n if (vArray.length < 2) {\n continue;\n }\n const itemName = trim(vArray[0] as string);\n const itemVal = trim(vArray.slice(1).join(\"=\"));\n switch (itemName) {\n case \"group\":\n group = itemVal;\n break;\n case \"over-tls\":\n tls = itemVal === \"true\" ? \"tls\" : \"\";\n break;\n case \"tls-host\":\n host = itemVal;\n break;\n case \"obfs-path\":\n path = itemVal.replace(/\"/g, \"\");\n break;\n case \"obfs-header\": {\n const headers = split(itemVal.replace(/\"/g, \"\").replace(/\\[Rr\\]\\[Nn\\]/g, \"|\"), \"|\");\n for (const header of headers) {\n if (/Host: /i.test(header)) {\n host = header.slice(6);\n } else if (/Edge: /i.test(header)) {\n edge = header.slice(6);\n }\n }\n break;\n }\n case \"obfs\":\n if (itemVal === \"ws\") {\n net = \"ws\";\n }\n break;\n default:\n break;\n }\n }\n if (path === \"\") {\n path = \"/\";\n }\n vmessConstruct(node, {\n add,\n aid: \"0\",\n cipher,\n edge,\n group,\n host,\n id,\n net,\n path,\n port,\n remark,\n tls,\n type: \"none\",\n });\n}\n\n/** Parse a `ss://` link into `node`. */\nexport function explodeSs(ss: string, node: Proxy): void {\n let body = ss.slice(5).replace(/\\/\\?/g, \"?\");\n const group: string = DEFAULT_GROUPS.ss;\n let remark = \"\";\n let addition = \"\";\n let plugin = \"\";\n let pluginOption = \"\";\n let resolvedGroup: string = group;\n\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n const plugins = urlDecode(getUrlArg(addition, \"plugin\"));\n const pluginPos = plugins.indexOf(\";\");\n plugin = pluginPos === -1 ? plugins : plugins.slice(0, pluginPos);\n pluginOption = pluginPos === -1 ? \"\" : plugins.slice(pluginPos + 1);\n const rawGroup = getUrlArg(addition, \"group\");\n if (rawGroup !== \"\") {\n resolvedGroup = urlSafeBase64Decode(rawGroup);\n }\n body = body.slice(0, qpos);\n }\n\n let method = \"\";\n let password = \"\";\n let server = \"\";\n let port = \"\";\n\n if (body.includes(\"@\")) {\n const match = firstMatch(body, \"(\\\\S+?)@(\\\\S+):(\\\\d+)\");\n if (!match) {\n return;\n }\n const secret = match[1] as string;\n server = match[2] as string;\n port = match[3] as string;\n const secretMatch = firstMatch(urlSafeBase64Decode(secret), \"(\\\\S+?):(\\\\S+)\");\n if (!secretMatch) {\n return;\n }\n method = secretMatch[1] as string;\n password = secretMatch[2] as string;\n } else {\n const match = firstMatch(urlSafeBase64Decode(body), \"(\\\\S+?):(\\\\S+)@(\\\\S+):(\\\\d+)\");\n if (!match) {\n return;\n }\n method = match[1] as string;\n password = match[2] as string;\n server = match[3] as string;\n port = match[4] as string;\n }\n\n if (port === \"0\") {\n return;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n ssConstruct(node, {\n group: resolvedGroup,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n server,\n });\n}\n\n/** Parse a `ssr://` link into `node`. */\nexport function explodeSsr(ssr: string, node: Proxy): void {\n let body = ssr.slice(6).replace(/\\r/g, \"\");\n body = urlSafeBase64Decode(body);\n\n let group = \"\";\n let remark = \"\";\n let obfsParam = \"\";\n let protocolParam = \"\";\n\n const obfsPos = body.indexOf(\"/?\");\n if (obfsPos !== -1) {\n const strobfs = body.slice(obfsPos + 2);\n body = body.slice(0, obfsPos);\n group = urlSafeBase64Decode(getUrlArg(strobfs, \"group\"));\n remark = urlSafeBase64Decode(getUrlArg(strobfs, \"remarks\"));\n obfsParam = urlSafeBase64Decode(getUrlArg(strobfs, \"obfsparam\")).replace(/\\s/g, \"\");\n protocolParam = urlSafeBase64Decode(getUrlArg(strobfs, \"protoparam\")).replace(/\\s/g, \"\");\n }\n\n const match = firstMatch(body, \"(\\\\S+):(\\\\d+?):(\\\\S+?):(\\\\S+?):(\\\\S+?):(\\\\S+)\");\n if (!match) {\n return;\n }\n const server = match[1] as string;\n const port = match[2] as string;\n const protocol = match[3] as string;\n const method = match[4] as string;\n const obfs = match[5] as string;\n const password = urlSafeBase64Decode(match[6] as string);\n if (port === \"0\") {\n return;\n }\n\n const resolvedGroup = group === \"\" ? DEFAULT_GROUPS.ssr : group;\n const resolvedRemark = remark === \"\" ? `${server}:${port}` : remark;\n\n if (isFlattenableSsr(method, obfs, protocol)) {\n ssConstruct(node, {\n group: resolvedGroup,\n method,\n password,\n port,\n remark: resolvedRemark,\n server,\n });\n } else {\n ssrConstruct(node, {\n group: resolvedGroup,\n method,\n obfs,\n obfsParam,\n password,\n port,\n protocol,\n protocolParam,\n remark: resolvedRemark,\n server,\n });\n }\n}\n\n/** Parse an `ssd://` (ShadowsocksD) subscription. */\nexport function explodeSsd(link: string, nodes: Proxy[]): void {\n let index = nodes.length;\n const decoded = urlSafeBase64Decode(link.slice(6));\n let data: any;\n try {\n data = JSON.parse(decoded);\n } catch {\n return;\n }\n if (data === null || typeof data !== \"object\" || !(\"servers\" in data)) {\n return;\n }\n const group = String(data.airport ?? \"\");\n const servers = data.servers;\n\n let entries: any[];\n if (Array.isArray(servers)) {\n entries = servers;\n } else if (servers !== null && typeof servers === \"object\") {\n entries = Object.keys(servers).map((key) => servers[key]);\n } else {\n return;\n }\n\n for (const entry of entries) {\n if (entry === null || typeof entry !== \"object\") {\n continue;\n }\n const server = String(entry.server ?? \"\");\n const port = String(entry.port ?? data.port ?? \"\");\n if (server === \"\" || port === \"\" || port === \"0\") {\n continue;\n }\n const remark = String(entry.remarks ?? \"\");\n const method = String(entry.encryption ?? data.encryption ?? \"\");\n const password = String(entry.password ?? data.password ?? \"\");\n const plugin = String(entry.plugin ?? data.plugin ?? \"\");\n const pluginOption = String(entry.plugin_options ?? data.plugin_options ?? \"\");\n const node = createProxy();\n ssConstruct(node, {\n group,\n method,\n password,\n plugin,\n pluginOption,\n port,\n remark,\n server,\n });\n node.id = index;\n nodes.push(node);\n index += 1;\n }\n}\n\n/** Parse `socks://`, `tg://socks`, or `https://t.me/socks` links. */\nexport function explodeSocks(link: string, node: Proxy): void {\n let group = \"\";\n let remark = \"\";\n let server = \"\";\n let port = \"\";\n let username = \"\";\n let password = \"\";\n\n if (link.includes(\"socks://\")) {\n let body = link;\n const hashPos = body.indexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n body = urlSafeBase64Decode(body.slice(8));\n if (body.includes(\"@\")) {\n const userinfo = split(body, \"@\");\n if (userinfo.length < 2) {\n return;\n }\n body = userinfo[1] as string;\n const creds = split(userinfo[0] as string, \":\");\n if (creds.length < 2) {\n return;\n }\n username = creds[0] as string;\n password = creds[1] as string;\n }\n const args = split(body, \":\");\n if (args.length < 2) {\n return;\n }\n server = args[0] as string;\n port = args[1] as string;\n } else if (link.includes(\"https://t.me/socks\") || link.includes(\"tg://socks\")) {\n server = getUrlArg(link, \"server\");\n port = getUrlArg(link, \"port\");\n username = urlDecode(getUrlArg(link, \"user\"));\n password = urlDecode(getUrlArg(link, \"pass\"));\n remark = urlDecode(getUrlArg(link, \"remarks\"));\n group = urlDecode(getUrlArg(link, \"group\"));\n }\n\n if (group === \"\") {\n group = DEFAULT_GROUPS.socks;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n if (port === \"0\" || port === \"\") {\n return;\n }\n socksConstruct(node, { group, password, port, remark, server, username });\n}\n\n/** Parse a telegram-style HTTP proxy link. */\nexport function explodeHttp(link: string, node: Proxy): void {\n const server = getUrlArg(link, \"server\");\n const port = getUrlArg(link, \"port\");\n const username = urlDecode(getUrlArg(link, \"user\"));\n const password = urlDecode(getUrlArg(link, \"pass\"));\n let remark = urlDecode(getUrlArg(link, \"remarks\"));\n let group = urlDecode(getUrlArg(link, \"group\"));\n if (group === \"\") {\n group = DEFAULT_GROUPS.http;\n }\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n if (port === \"0\" || port === \"\") {\n return;\n }\n httpConstruct(node, {\n group,\n password,\n port,\n remark,\n server,\n tls: link.includes(\"/https\"),\n username,\n });\n}\n\n/** Parse an HTTP(S) link with base64-encoded credentials. */\nexport function explodeHttpSub(link: string, node: Proxy): void {\n let body = link;\n let remarks = \"\";\n let group = \"\";\n const tls = body.includes(\"https://\");\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n const addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n remarks = urlDecode(getUrlArg(addition, \"remarks\"));\n group = urlDecode(getUrlArg(addition, \"group\"));\n }\n body = body.slice(body.indexOf(\"://\") + 3);\n body = urlSafeBase64Decode(body);\n\n let server = \"\";\n let port = \"\";\n let username = \"\";\n let password = \"\";\n if (body.includes(\"@\")) {\n const match = firstMatch(body, \"(.*?):(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n username = match[1] as string;\n password = match[2] as string;\n server = match[3] as string;\n port = match[4] as string;\n } else {\n const match = firstMatch(body, \"(.*):(.*)\");\n if (!match) {\n return;\n }\n server = match[1] as string;\n port = match[2] as string;\n }\n if (group === \"\") {\n group = DEFAULT_GROUPS.http;\n }\n if (remarks === \"\") {\n remarks = `${server}:${port}`;\n }\n if (port === \"0\") {\n return;\n }\n httpConstruct(node, {\n group,\n password,\n port,\n remark: remarks,\n server,\n tls,\n username,\n });\n}\n\n/** Parse a `trojan://` link. */\nexport function explodeTrojan(trojan: string, node: Proxy): void {\n let body = trojan.slice(9);\n let remark = \"\";\n let addition = \"\";\n let host = \"\";\n let path = \"\";\n let network = \"\";\n\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n\n const match = firstMatch(body, \"(.*?)@(.*):(.*)\");\n if (!match) {\n return;\n }\n const password = match[1] as string;\n const server = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n\n host = getUrlArg(addition, \"sni\");\n if (host === \"\") {\n host = getUrlArg(addition, \"peer\");\n }\n const tfo = getUrlArg(addition, \"tfo\");\n const group = urlDecode(getUrlArg(addition, \"group\"));\n\n if (getUrlArg(addition, \"ws\") === \"1\") {\n path = getUrlArg(addition, \"wspath\");\n network = \"ws\";\n } else if (getUrlArg(addition, \"type\") === \"ws\") {\n path = getUrlArg(addition, \"path\");\n if (path.startsWith(\"%2F\")) {\n path = urlDecode(path);\n }\n network = \"ws\";\n }\n\n const type = getUrlArg(addition, \"type\");\n const sni = getUrlArg(addition, \"sni\");\n const insecure = getUrlArg(addition, \"allowInsecure\");\n\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n trojanConstruct(node, {\n group: group === \"\" ? DEFAULT_GROUPS.trojan : group,\n host,\n network,\n password,\n path,\n port,\n remark,\n scv: insecure === \"\" ? undefined : parseTri(insecure),\n server,\n sni,\n tfo: tfo === \"\" ? undefined : parseTri(tfo),\n tlsSecure: type !== \"\" || true,\n });\n}\n\nfunction parseTri(value: string): TriBool {\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n return undefined;\n}\n\n/** Parse a `hysteria2://` / `hy2://` link. */\nexport function explodeHysteria2(link: string, node: Proxy): void {\n const body = link.replace(/(hysteria2|hy2):\\/\\//, \"hysteria2://\").replace(/\\/\\?/g, \"?\");\n if (/hysteria2:\\/\\/.*?[:].*/.test(body)) {\n explodeStdHysteria2(body, node);\n }\n}\n\nfunction explodeStdHysteria2(link: string, node: Proxy): void {\n let body = link.slice(12);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n\n let password = \"\";\n let add = \"\";\n let port = \"\";\n if (body.includes(\"@\")) {\n const match = /^(.*?)@(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n password = match[1] as string;\n add = match[2] as string;\n port = match[3] as string;\n } else {\n password = getUrlArg(addition, \"password\");\n if (password === \"\") {\n return;\n }\n if (!body.includes(\":\")) {\n return;\n }\n const match = /^(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n add = match[1] as string;\n port = match[2] as string;\n }\n\n const scv = getUrlArg(addition, \"insecure\");\n const up = getUrlArg(addition, \"up\");\n const down = getUrlArg(addition, \"down\");\n const alpn = getUrlArg(addition, \"alpn\");\n const obfs = getUrlArg(addition, \"obfs\");\n const obfsPassword = getUrlArg(addition, \"obfs-password\");\n const sni = getUrlArg(addition, \"sni\");\n const fingerprint = getUrlArg(addition, \"pinSHA256\");\n const mport = getUrlArg(addition, \"mport\");\n const portsArg = getUrlArg(addition, \"ports\");\n const ports = portsArg !== \"\" ? portsArg : mport !== \"\" ? mport : port;\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n hysteria2Construct(node, {\n alpn,\n down,\n fingerprint,\n group: DEFAULT_GROUPS.hysteria2,\n obfs,\n obfsPassword,\n password,\n port,\n ports,\n remark,\n scv: scv === \"\" ? undefined : parseTri(scv),\n server: add,\n sni,\n up,\n });\n}\n\n/** Parse an `anytls://` link. */\nexport function explodeAnyTls(link: string, node: Proxy): void {\n let body = link.slice(9);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.lastIndexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?)@(.*)[:](\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const password = match[1] as string;\n const add = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n const sni = getUrlArg(addition, \"sni\");\n const udp = getUrlArg(addition, \"udp\");\n const scv = getUrlArg(addition, \"insecure\");\n if (remark === \"\") {\n remark = `${add}:${port}`;\n }\n anyTlsConstruct(node, {\n group: DEFAULT_GROUPS.anytls,\n password,\n port,\n remark,\n scv: scv === \"\" ? undefined : parseTri(scv),\n server: add,\n sni,\n udp: udp === \"\" ? undefined : parseTri(udp),\n });\n}\n\n/** Parse a `vless://` link. */\nexport function explodeVless(link: string, node: Proxy): void {\n let body = link.slice(8);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?)@\\[?(.*?)\\]?:(\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const userId = match[1] as string;\n const server = match[2] as string;\n const port = match[3] as string;\n if (port === \"0\") {\n return;\n }\n const network = getUrlArg(addition, \"type\");\n const security = getUrlArg(addition, \"security\");\n const host = getUrlArg(addition, \"host\");\n const rawPath = urlDecode(getUrlArg(addition, \"path\"));\n const serviceName = urlDecode(getUrlArg(addition, \"serviceName\"));\n const path = rawPath !== \"\" ? rawPath : serviceName;\n const sni = getUrlArg(addition, \"sni\");\n const flow = getUrlArg(addition, \"flow\");\n const fingerprint = getUrlArg(addition, \"fp\");\n const publicKey = getUrlArg(addition, \"pbk\");\n const shortId = getUrlArg(addition, \"sid\");\n const alpn = getUrlArg(addition, \"alpn\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n vlessConstruct(node, {\n alpn: alpn === \"\" ? undefined : alpn.split(\",\"),\n fingerprint,\n flow,\n group: DEFAULT_GROUPS.v2ray,\n host,\n network,\n path,\n port,\n publicKey,\n remark,\n scv:\n getUrlArg(addition, \"allowInsecure\") === \"\"\n ? undefined\n : parseTri(getUrlArg(addition, \"allowInsecure\")),\n server,\n shortId,\n sni,\n tls: security,\n userId,\n });\n}\n\n/** Parse a `tuic://` link. */\nexport function explodeTuic(link: string, node: Proxy): void {\n let body = link.slice(7);\n let remark = \"\";\n let addition = \"\";\n const hashPos = body.lastIndexOf(\"#\");\n if (hashPos !== -1) {\n remark = urlDecode(body.slice(hashPos + 1));\n body = body.slice(0, hashPos);\n }\n const qpos = body.indexOf(\"?\");\n if (qpos !== -1) {\n addition = body.slice(qpos + 1);\n body = body.slice(0, qpos);\n }\n const match = /^(.*?):(.*?)@\\[?(.*?)\\]?:(\\d+)$/.exec(body);\n if (!match) {\n return;\n }\n const userId = match[1] as string;\n const password = match[2] as string;\n const server = match[3] as string;\n const port = match[4] as string;\n if (port === \"0\") {\n return;\n }\n const congestionControl =\n getUrlArg(addition, \"congestion_control\") || getUrlArg(addition, \"congestion-controller\");\n const alpn = getUrlArg(addition, \"alpn\");\n const sni = getUrlArg(addition, \"sni\");\n if (remark === \"\") {\n remark = `${server}:${port}`;\n }\n tuicConstruct(node, {\n alpn: alpn === \"\" ? undefined : alpn.split(\",\"),\n congestionControl,\n group: DEFAULT_GROUPS.v2ray,\n password,\n port,\n remark,\n scv:\n getUrlArg(addition, \"allow_insecure\") === \"\"\n ? undefined\n : parseTri(getUrlArg(addition, \"allow_insecure\")),\n server,\n sni,\n userId,\n });\n}\n","import { explodeSurge, parseClashText, parseConfContent } from \"./conf\";\nimport { explodeNetch } from \"./netch\";\nimport {\n explodeAnyTls,\n explodeHttp,\n explodeHttpSub,\n explodeHysteria2,\n explodeSs,\n explodeSsr,\n explodeSocks,\n explodeSsd,\n explodeTrojan,\n explodeTuic,\n explodeVless,\n explodeVmess,\n isLink,\n} from \"./uri\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, createProxy } from \"../types/proxy\";\nimport { urlSafeBase64Decode } from \"../utils/base64\";\nimport { countOccurrences, startsWith } from \"../utils/string\";\n\n/** Parse a single proxy link into `node`. */\nexport function explode(link: string, node: Proxy): void {\n if (startsWith(link, \"ssr://\")) {\n explodeSsr(link, node);\n } else if (startsWith(link, \"vmess://\") || startsWith(link, \"vmess1://\")) {\n explodeVmess(link, node);\n } else if (startsWith(link, \"ss://\")) {\n explodeSs(link, node);\n } else if (\n startsWith(link, \"socks://\") ||\n startsWith(link, \"https://t.me/socks\") ||\n startsWith(link, \"tg://socks\")\n ) {\n explodeSocks(link, node);\n } else if (startsWith(link, \"https://t.me/http\") || startsWith(link, \"tg://http\")) {\n explodeHttp(link, node);\n } else if (startsWith(link, \"Netch://\")) {\n explodeNetch(link, node);\n } else if (startsWith(link, \"trojan://\")) {\n explodeTrojan(link, node);\n } else if (startsWith(link, \"vless://\")) {\n explodeVless(link, node);\n } else if (startsWith(link, \"tuic://\")) {\n explodeTuic(link, node);\n } else if (link.includes(\"hysteria2://\") || link.includes(\"hy2://\")) {\n explodeHysteria2(link, node);\n } else if (startsWith(link, \"anytls://\")) {\n explodeAnyTls(link, node);\n } else if (isLink(link)) {\n explodeHttpSub(link, node);\n }\n}\n\n/** Parse a link string, returning a node when recognized. */\nexport function parseLink(link: string): Proxy | undefined {\n const node = createProxy();\n explode(link, node);\n return node.type === ProxyType.Unknown ? undefined : node;\n}\n\n/**\n * Parse a subscription body: SSD, Clash YAML, Surge INI, or a newline/space\n * delimited base64 list of links. Mirrors `explodeSub`.\n */\nexport function explodeSub(sub: string, nodes: Proxy[]): void {\n let processed = false;\n\n if (startsWith(sub, \"ssd://\")) {\n explodeSsd(sub, nodes);\n processed = true;\n }\n\n if (!processed && /\"?(Proxy|proxies)\"?:/.test(sub)) {\n if (parseClashText(sub, nodes)) {\n processed = true;\n }\n }\n\n if (!processed && explodeSurge(sub, nodes)) {\n processed = true;\n }\n\n if (processed) {\n return;\n }\n\n const body = urlSafeBase64Decode(sub);\n if (/(vmess|shadowsocks|http|trojan)\\s*?=/.test(body)) {\n if (explodeSurge(body, nodes)) {\n return;\n }\n }\n const before = nodes.length;\n splitLinks(body, nodes);\n if (nodes.length === before && body !== sub) {\n // Not a base64 body after all (e.g. a plain-text provider list).\n splitLinks(sub, nodes);\n }\n}\n\nfunction splitLinks(body: string, nodes: Proxy[]): void {\n const normalized = body.replace(/\\r\\n/g, \"\\n\");\n const delimiter =\n countOccurrences(normalized, \"\\n\") < 1\n ? countOccurrences(normalized, \"\\r\") < 1\n ? \" \"\n : \"\\r\"\n : \"\\n\";\n for (const rawLink of normalized.split(delimiter)) {\n const link = rawLink.replace(/\\r/g, \"\");\n if (link === \"\") {\n continue;\n }\n const node = createProxy();\n explode(link, node);\n if (node.type === ProxyType.Unknown) {\n continue;\n }\n nodes.push(node);\n }\n}\n\n/** Parse a config blob (Clash/SS/SSR/V2Ray/SSTap/Netch) or a subscription. */\nexport function parseSubscription(content: string): Proxy[] {\n const nodes: Proxy[] = [];\n if (parseConfContent(content, nodes)) {\n return nodes;\n }\n explodeSub(content, nodes);\n return nodes;\n}\n","import { stringify as yamlStringify } from \"yaml\";\n\nimport { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode } from \"../utils/base64\";\nimport { getUrlArg, urlDecode } from \"../utils/url\";\n\nconst CLASHR_PROTOCOLS = [\n \"origin\",\n \"auth_sha1_v4\",\n \"auth_aes128_md5\",\n \"auth_aes128_sha1\",\n \"auth_chain_a\",\n \"auth_chain_b\",\n];\nconst CLASHR_OBFS = [\n \"plain\",\n \"http_simple\",\n \"http_post\",\n \"random_head\",\n \"tls1.2_ticket_auth\",\n \"tls1.2_ticket_fastauth\",\n];\nconst CLASH_SSR_CIPHERS = [\n \"rc4-md5\",\n \"aes-128-ctr\",\n \"aes-192-ctr\",\n \"aes-256-ctr\",\n \"aes-128-cfb\",\n \"aes-192-cfb\",\n \"aes-256-cfb\",\n \"chacha20-ietf\",\n \"xchacha20\",\n \"none\",\n];\n\ntype ClashProxy = Record<string, unknown>;\n\nfunction stripBrackets(value: string): string {\n return value.replace(/^\\[+/, \"\").replace(/\\]+$/, \"\");\n}\n\nfunction toTri(value: boolean | undefined): boolean | undefined {\n return value;\n}\n\nfunction buildClashProxy(\n x: Proxy,\n settings: ExtraSettings,\n clashR: boolean,\n remark: string,\n skipCertVerify: boolean | undefined,\n tfo: boolean | undefined,\n): ClashProxy | undefined {\n const proxy: ClashProxy = {\n name: remark,\n port: x.port,\n server: stripBrackets(x.hostname),\n };\n\n switch (x.type) {\n case ProxyType.Shadowsocks: {\n if (settings.filterDeprecated && x.encryptMethod === \"chacha20\") {\n return undefined;\n }\n proxy.type = \"ss\";\n proxy.cipher = x.encryptMethod;\n proxy.password = x.password;\n const pluginOpts = x.pluginOption.replace(/;/g, \"&\");\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n proxy.plugin = \"obfs\";\n proxy[\"plugin-opts\"] = {\n host: urlDecode(getUrlArg(pluginOpts, \"obfs-host\")),\n mode: urlDecode(getUrlArg(pluginOpts, \"obfs\")),\n };\n } else if (x.plugin === \"v2ray-plugin\") {\n proxy.plugin = \"v2ray-plugin\";\n const opts: Record<string, unknown> = {\n host: getUrlArg(pluginOpts, \"host\"),\n mode: getUrlArg(pluginOpts, \"mode\"),\n mux: pluginOpts.includes(\"mux\"),\n path: getUrlArg(pluginOpts, \"path\"),\n tls: pluginOpts.includes(\"tls\"),\n };\n if (skipCertVerify !== undefined) {\n opts[\"skip-cert-verify\"] = skipCertVerify;\n }\n proxy[\"plugin-opts\"] = opts;\n }\n break;\n }\n case ProxyType.VMess: {\n proxy.type = \"vmess\";\n proxy.uuid = x.userId;\n proxy.alterId = x.alterId;\n proxy.cipher = x.encryptMethod;\n proxy.tls = x.tlsSecure;\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.serverName !== \"\") {\n proxy.servername = x.serverName;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n if (settings.clashNewFieldName) {\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" || x.edge !== \"\"\n ? {\n headers: {\n ...(x.edge !== \"\" ? { Edge: x.edge } : {}),\n ...(x.host !== \"\" ? { Host: x.host } : {}),\n },\n }\n : {}),\n path: x.path,\n };\n } else {\n proxy[\"ws-path\"] = x.path;\n if (x.host !== \"\" || x.edge !== \"\") {\n proxy[\"ws-headers\"] = {\n ...(x.edge !== \"\" ? { Edge: x.edge } : {}),\n ...(x.host !== \"\" ? { Host: x.host } : {}),\n };\n }\n }\n break;\n case \"http\":\n proxy.network = x.transferProtocol;\n proxy[\"http-opts\"] = {\n ...(x.host !== \"\" || x.edge !== \"\"\n ? {\n headers: {\n ...(x.edge !== \"\" ? { Edge: [x.edge] } : {}),\n ...(x.host !== \"\" ? { Host: [x.host] } : {}),\n },\n }\n : {}),\n method: \"GET\",\n path: [x.path],\n };\n break;\n case \"h2\":\n proxy.network = x.transferProtocol;\n proxy[\"h2-opts\"] = {\n ...(x.host !== \"\" ? { host: [x.host] } : {}),\n path: x.path,\n };\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n proxy.servername = x.host;\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n break;\n default:\n return undefined;\n }\n break;\n }\n case ProxyType.ShadowsocksR: {\n if (settings.filterDeprecated) {\n if (!clashR && !CLASH_SSR_CIPHERS.includes(x.encryptMethod)) {\n return undefined;\n }\n if (!CLASHR_PROTOCOLS.includes(x.protocol)) {\n return undefined;\n }\n if (!CLASHR_OBFS.includes(x.obfs)) {\n return undefined;\n }\n }\n proxy.type = \"ssr\";\n proxy.cipher = x.encryptMethod === \"none\" ? \"dummy\" : x.encryptMethod;\n proxy.password = x.password;\n proxy.protocol = x.protocol;\n proxy.obfs = x.obfs;\n if (clashR) {\n proxy.protocolparam = x.protocolParam;\n proxy.obfsparam = x.obfsParam;\n } else {\n proxy[\"protocol-param\"] = x.protocolParam;\n proxy[\"obfs-param\"] = x.obfsParam;\n }\n break;\n }\n case ProxyType.SOCKS5:\n proxy.type = \"socks5\";\n if (x.username !== \"\") {\n proxy.username = x.username;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxy.type = \"http\";\n if (x.username !== \"\") {\n proxy.username = x.username;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n proxy.tls = x.tlsSecure;\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.Trojan:\n proxy.type = \"trojan\";\n proxy.password = x.password;\n if (x.host !== \"\") {\n proxy.sni = x.host;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n if (x.path !== \"\") {\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n }\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" ? { headers: { Host: x.host } } : {}),\n path: x.path,\n };\n break;\n default:\n break;\n }\n break;\n case ProxyType.Snell:\n if (x.snellVersion >= 4) {\n return undefined;\n }\n proxy.type = \"snell\";\n proxy.psk = x.password;\n if (x.snellVersion !== 0) {\n proxy.version = x.snellVersion;\n }\n if (x.obfs !== \"\") {\n proxy[\"obfs-opts\"] = {\n ...(x.host !== \"\" ? { host: x.host } : {}),\n mode: x.obfs,\n };\n }\n break;\n case ProxyType.WireGuard:\n proxy.type = \"wireguard\";\n proxy[\"public-key\"] = x.publicKey;\n proxy[\"private-key\"] = x.privateKey;\n proxy.ip = x.selfIp;\n if (x.selfIpv6 !== \"\") {\n proxy.ipv6 = x.selfIpv6;\n }\n if (x.preSharedKey !== \"\") {\n proxy[\"preshared-key\"] = x.preSharedKey;\n }\n if (x.dnsServers.length > 0) {\n proxy.dns = x.dnsServers;\n }\n if (x.mtu > 0) {\n proxy.mtu = x.mtu;\n }\n break;\n case ProxyType.Hysteria: {\n proxy.type = \"hysteria\";\n if (x.ports !== \"\") {\n proxy.ports = x.ports;\n }\n if (x.protocol !== \"\") {\n proxy.protocol = x.protocol;\n }\n if (x.obfsParam !== \"\") {\n proxy[\"obfs-protocol\"] = x.obfsParam;\n }\n if (x.up !== \"\") {\n proxy.up = x.up;\n }\n if (x.upSpeed) {\n proxy[\"up-speed\"] = x.upSpeed;\n }\n if (x.down !== \"\") {\n proxy.down = x.down;\n }\n if (x.downSpeed) {\n proxy[\"down-speed\"] = x.downSpeed;\n }\n if (x.authStr !== \"\") {\n proxy[\"auth-str\"] = x.authStr;\n proxy.auth = base64Encode(x.authStr);\n }\n if (x.obfs !== \"\") {\n proxy.obfs = x.obfs;\n }\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.fingerprint !== \"\") {\n proxy.fingerprint = x.fingerprint;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n proxy.ca = x.ca;\n }\n if (x.caStr !== \"\") {\n proxy[\"ca-str\"] = x.caStr;\n }\n if (x.recvWindowConn) {\n proxy[\"recv-window-conn\"] = x.recvWindowConn;\n }\n if (x.recvWindow) {\n proxy[\"recv-window\"] = x.recvWindow;\n }\n if (x.disableMtuDiscovery !== undefined) {\n proxy[\"disable-mtu-discovery\"] = x.disableMtuDiscovery;\n }\n if (x.tcpFastOpen !== undefined) {\n proxy[\"fast-open\"] = x.tcpFastOpen;\n }\n if (x.hopInterval) {\n proxy[\"hop-interval\"] = x.hopInterval;\n }\n break;\n }\n case ProxyType.Hysteria2:\n proxy.type = \"hysteria2\";\n if (x.ports !== \"\") {\n proxy.ports = x.ports;\n }\n if (x.upSpeed) {\n proxy.up = x.upSpeed;\n }\n if (x.downSpeed) {\n proxy.down = x.downSpeed;\n }\n if (x.password !== \"\") {\n proxy.password = x.password;\n }\n if (x.obfs !== \"\") {\n proxy.obfs = x.obfs;\n }\n if (x.obfsParam !== \"\") {\n proxy[\"obfs-password\"] = x.obfsParam;\n }\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n if (x.fingerprint !== \"\") {\n proxy.fingerprint = x.fingerprint;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n proxy.ca = x.ca;\n }\n if (x.caStr !== \"\") {\n proxy[\"ca-str\"] = x.caStr;\n }\n if (x.cwnd) {\n proxy.cwnd = x.cwnd;\n }\n if (x.hopInterval) {\n proxy[\"hop-interval\"] = x.hopInterval;\n }\n break;\n case ProxyType.AnyTLS:\n proxy.type = \"anytls\";\n proxy.password = x.password;\n if (x.sni !== \"\") {\n proxy.sni = x.sni;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n case ProxyType.VLESS:\n proxy.type = \"vless\";\n proxy.uuid = x.userId;\n if (x.flow !== \"\") {\n proxy.flow = x.flow;\n }\n proxy.tls = x.tlsSecure;\n if (x.serverName !== \"\") {\n proxy.servername = x.serverName;\n }\n if (x.fingerprint !== \"\") {\n proxy[\"client-fingerprint\"] = x.fingerprint;\n }\n if (x.publicKey !== \"\" || x.shortId !== \"\") {\n const realityOpts: Record<string, unknown> = {};\n if (x.publicKey !== \"\") {\n realityOpts[\"public-key\"] = x.publicKey;\n }\n realityOpts[\"short-id\"] = x.shortId;\n proxy[\"reality-opts\"] = realityOpts;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\":\n proxy.network = x.transferProtocol;\n proxy[\"ws-opts\"] = {\n ...(x.host !== \"\" ? { headers: { Host: x.host } } : {}),\n path: x.path,\n };\n break;\n case \"grpc\":\n proxy.network = x.transferProtocol;\n proxy[\"grpc-opts\"] = { \"grpc-service-name\": x.path };\n break;\n default:\n break;\n }\n break;\n case ProxyType.TUIC:\n proxy.type = \"tuic\";\n proxy.uuid = x.userId;\n proxy.password = x.password;\n if (x.congestionControl !== \"\") {\n proxy[\"congestion-controller\"] = x.congestionControl;\n }\n if (x.alpn.length > 0) {\n proxy.alpn = x.alpn;\n }\n if (x.serverName !== \"\") {\n proxy.sni = x.serverName;\n }\n if (skipCertVerify !== undefined) {\n proxy[\"skip-cert-verify\"] = skipCertVerify;\n }\n break;\n default:\n return undefined;\n }\n\n if (udpEnabled(x, settings) && x.type !== ProxyType.Snell) {\n proxy.udp = true;\n }\n if (tfo !== undefined) {\n proxy.tfo = tfo;\n }\n if (settings.clashNewFieldName && x.underlyingProxy !== \"\") {\n proxy[\"dialer-proxy\"] = x.underlyingProxy;\n }\n return proxy;\n}\n\nfunction udpEnabled(x: Proxy, settings: ExtraSettings): boolean {\n return x.udp !== undefined ? x.udp : settings.udp === true;\n}\n\nexport interface ClashBuildResult {\n doc: Record<string, unknown>;\n nodeList: Proxy[];\n}\n\n/** Build the Clash document object (without serialization). */\nexport function buildClash(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n clashR = false,\n): ClashBuildResult {\n const proxies: ClashProxy[] = [];\n const nodeList: Proxy[] = [];\n const remarksList: string[] = [];\n\n for (const x of nodes) {\n const type = proxyTypeName(x.type);\n if (settings.appendProxyType) {\n x.remark = `[${type}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList, false);\n x.remark = remark;\n\n const skipCertVerify =\n x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const built = buildClashProxy(x, settings, clashR, remark, toTri(skipCertVerify), toTri(tfo));\n if (!built) {\n continue;\n }\n proxies.push(built);\n remarksList.push(remark);\n nodeList.push(x);\n }\n\n if (settings.nodeList) {\n return { doc: { proxies }, nodeList };\n }\n\n const groups: unknown[] = [];\n for (const group of extraProxyGroup) {\n const singlegroup: Record<string, unknown> = {\n name: group.name,\n type: group.type === \"smart\" ? \"url-test\" : group.type,\n };\n switch (group.type) {\n case \"select\":\n case \"relay\":\n break;\n case \"load-balance\":\n singlegroup.strategy = group.strategy;\n singlegroup.lazy = group.lazy;\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n case \"smart\":\n case \"url-test\":\n if (group.lazy !== undefined) {\n singlegroup.lazy = group.lazy;\n }\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n case \"fallback\":\n singlegroup.url = group.url;\n if (group.interval > 0) {\n singlegroup.interval = group.interval;\n }\n if (group.tolerance > 0) {\n singlegroup.tolerance = group.tolerance;\n }\n break;\n default:\n continue;\n }\n if (group.disableUdp !== undefined) {\n singlegroup[\"disable-udp\"] = group.disableUdp;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodeList, filtered, true);\n }\n if (group.usingProvider.length > 0) {\n singlegroup.use = group.usingProvider;\n } else {\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n singlegroup.proxies = filtered;\n }\n groups.push(singlegroup);\n }\n\n const doc: Record<string, unknown> = {};\n if (settings.clashNewFieldName) {\n doc.proxies = proxies;\n if (groups.length > 0) {\n doc[\"proxy-groups\"] = groups;\n }\n } else {\n doc.Proxy = proxies;\n if (groups.length > 0) {\n doc[\"Proxy Group\"] = groups;\n }\n }\n return { doc, nodeList };\n}\n\n/** Serialize a Clash document built by {@link buildClash}. */\nexport function stringifyClash(doc: Record<string, unknown>): string {\n return yamlStringify(doc, {\n aliasDuplicateObjects: false,\n lineWidth: 0,\n });\n}\n\n/** Convert nodes into a Clash YAML configuration string. */\nexport function toClash(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n clashR = false,\n): string {\n const { doc } = buildClash(nodes, extraProxyGroup, settings, clashR);\n return stringifyClash(doc);\n}\n","/**\n * ISO 3166-1 alpha-2 region helpers used when a proxy name has no country.\n *\n * The display names come from `Intl.DisplayNames` (no bundled database), with\n * small overrides where the CLDR Chinese name is too verbose for a node name\n * (e.g. `中国香港特别行政区` -> `香港`). Flag emoji are derived from the code.\n */\n\n/** All ISO 3166-1 alpha-2 codes, sorted, used for alias detection. */\nconst REGION_CODES = [\n \"AD\",\n \"AE\",\n \"AF\",\n \"AG\",\n \"AI\",\n \"AL\",\n \"AM\",\n \"AO\",\n \"AQ\",\n \"AR\",\n \"AS\",\n \"AT\",\n \"AU\",\n \"AW\",\n \"AX\",\n \"AZ\",\n \"BA\",\n \"BB\",\n \"BD\",\n \"BE\",\n \"BF\",\n \"BG\",\n \"BH\",\n \"BI\",\n \"BJ\",\n \"BL\",\n \"BM\",\n \"BN\",\n \"BO\",\n \"BQ\",\n \"BR\",\n \"BS\",\n \"BT\",\n \"BV\",\n \"BW\",\n \"BY\",\n \"BZ\",\n \"CA\",\n \"CC\",\n \"CD\",\n \"CF\",\n \"CG\",\n \"CH\",\n \"CI\",\n \"CK\",\n \"CL\",\n \"CM\",\n \"CN\",\n \"CO\",\n \"CR\",\n \"CU\",\n \"CV\",\n \"CW\",\n \"CX\",\n \"CY\",\n \"CZ\",\n \"DE\",\n \"DJ\",\n \"DK\",\n \"DM\",\n \"DO\",\n \"DZ\",\n \"EC\",\n \"EE\",\n \"EG\",\n \"EH\",\n \"ER\",\n \"ES\",\n \"ET\",\n \"FI\",\n \"FJ\",\n \"FK\",\n \"FM\",\n \"FO\",\n \"FR\",\n \"GA\",\n \"GB\",\n \"GD\",\n \"GE\",\n \"GF\",\n \"GG\",\n \"GH\",\n \"GI\",\n \"GL\",\n \"GM\",\n \"GN\",\n \"GP\",\n \"GQ\",\n \"GR\",\n \"GS\",\n \"GT\",\n \"GU\",\n \"GW\",\n \"GY\",\n \"HK\",\n \"HM\",\n \"HN\",\n \"HR\",\n \"HT\",\n \"HU\",\n \"ID\",\n \"IE\",\n \"IL\",\n \"IM\",\n \"IN\",\n \"IO\",\n \"IQ\",\n \"IR\",\n \"IS\",\n \"IT\",\n \"JE\",\n \"JM\",\n \"JO\",\n \"JP\",\n \"KE\",\n \"KG\",\n \"KH\",\n \"KI\",\n \"KM\",\n \"KN\",\n \"KP\",\n \"KR\",\n \"KW\",\n \"KY\",\n \"KZ\",\n \"LA\",\n \"LB\",\n \"LC\",\n \"LI\",\n \"LK\",\n \"LR\",\n \"LS\",\n \"LT\",\n \"LU\",\n \"LV\",\n \"LY\",\n \"MA\",\n \"MC\",\n \"MD\",\n \"ME\",\n \"MF\",\n \"MG\",\n \"MH\",\n \"MK\",\n \"ML\",\n \"MM\",\n \"MN\",\n \"MO\",\n \"MP\",\n \"MQ\",\n \"MR\",\n \"MS\",\n \"MT\",\n \"MU\",\n \"MV\",\n \"MW\",\n \"MX\",\n \"MY\",\n \"MZ\",\n \"NA\",\n \"NC\",\n \"NE\",\n \"NF\",\n \"NG\",\n \"NI\",\n \"NL\",\n \"NO\",\n \"NP\",\n \"NR\",\n \"NU\",\n \"NZ\",\n \"OM\",\n \"PA\",\n \"PE\",\n \"PF\",\n \"PG\",\n \"PH\",\n \"PK\",\n \"PL\",\n \"PM\",\n \"PN\",\n \"PR\",\n \"PS\",\n \"PT\",\n \"PW\",\n \"PY\",\n \"QA\",\n \"RE\",\n \"RO\",\n \"RS\",\n \"RU\",\n \"RW\",\n \"SA\",\n \"SB\",\n \"SC\",\n \"SD\",\n \"SE\",\n \"SG\",\n \"SH\",\n \"SI\",\n \"SJ\",\n \"SK\",\n \"SL\",\n \"SM\",\n \"SN\",\n \"SO\",\n \"SR\",\n \"SS\",\n \"ST\",\n \"SV\",\n \"SX\",\n \"SY\",\n \"SZ\",\n \"TC\",\n \"TD\",\n \"TF\",\n \"TG\",\n \"TH\",\n \"TJ\",\n \"TK\",\n \"TL\",\n \"TM\",\n \"TN\",\n \"TO\",\n \"TR\",\n \"TT\",\n \"TV\",\n \"TW\",\n \"TZ\",\n \"UA\",\n \"UG\",\n \"UM\",\n \"US\",\n \"UY\",\n \"UZ\",\n \"VA\",\n \"VC\",\n \"VE\",\n \"VG\",\n \"VI\",\n \"VN\",\n \"VU\",\n \"WF\",\n \"WS\",\n \"YE\",\n \"YT\",\n \"ZA\",\n \"ZM\",\n \"ZW\",\n] as const;\n\nconst REGION_CODE_SET = new Set<string>(REGION_CODES);\n\n/** Compact Chinese names for regions whose CLDR name is too long for a node. */\nconst ZH_OVERRIDES: Record<string, string> = {\n AE: \"阿联酋\",\n BN: \"文莱\",\n BO: \"玻利维亚\",\n CD: \"刚果(金)\",\n CG: \"刚果(布)\",\n CV: \"佛得角\",\n CZ: \"捷克\",\n DO: \"多米尼加\",\n HK: \"香港\",\n KH: \"柬埔寨\",\n KP: \"朝鲜\",\n KR: \"韩国\",\n LA: \"老挝\",\n MD: \"摩尔多瓦\",\n MK: \"北马其顿\",\n MM: \"缅甸\",\n MO: \"澳门\",\n NL: \"荷兰\",\n PS: \"巴勒斯坦\",\n RU: \"俄罗斯\",\n SY: \"叙利亚\",\n SZ: \"斯威士兰\",\n TL: \"东帝汶\",\n TW: \"台湾\",\n TZ: \"坦桑尼亚\",\n VA: \"梵蒂冈\",\n VE: \"委内瑞拉\",\n};\n\n/** Compact names for regions whose CLDR name is too long for a node. */\nconst EN_OVERRIDES: Record<string, string> = {\n HK: \"Hong Kong\",\n MO: \"Macau\",\n PS: \"Palestine\",\n TW: \"Taiwan\",\n};\n\n/** Extra spellings seen in subscription node names. */\nconst EXTRA_ALIASES = [\n \"Burma\",\n \"Cape Verde\",\n \"Czechia\",\n \"East Timor\",\n \"Holland\",\n \"Hong Kong\",\n \"Macao\",\n \"Macau\",\n \"North Korea\",\n \"South Korea\",\n \"UAE\",\n \"UK\",\n \"USA\",\n \"United Kingdom\",\n \"United States\",\n];\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst displayNameCache = new Map<string, Intl.DisplayNames>();\n\nfunction displayNames(locale: string): Intl.DisplayNames | undefined {\n const cached = displayNameCache.get(locale);\n if (cached) {\n return cached;\n }\n try {\n const created = new Intl.DisplayNames([locale], { fallback: \"code\", type: \"region\" });\n displayNameCache.set(locale, created);\n return created;\n } catch {\n return undefined;\n }\n}\n\n/** Normalize a region code, returning `\"\"` when it is not two ASCII letters. */\nfunction normalizeRegionCode(code: string): string {\n const upper = code.trim().toUpperCase();\n return /^[A-Z]{2}$/.test(upper) ? upper : \"\";\n}\n\n/** Localized country/region name (e.g. `美国`), falling back to the code. */\nexport function regionDisplayName(code: string, locale = \"zh-CN\"): string {\n const upper = normalizeRegionCode(code);\n if (upper === \"\") {\n return code.trim();\n }\n if (locale.toLowerCase().startsWith(\"zh\") && ZH_OVERRIDES[upper] !== undefined) {\n return ZH_OVERRIDES[upper] as string;\n }\n if (locale.toLowerCase().startsWith(\"en\") && EN_OVERRIDES[upper] !== undefined) {\n return EN_OVERRIDES[upper] as string;\n }\n const names = displayNames(locale);\n return names?.of(upper) ?? upper;\n}\n\n/** Flag emoji for a region code, or `\"\"` when the code is invalid. */\nexport function regionFlag(code: string): string {\n const upper = normalizeRegionCode(code);\n if (upper === \"\") {\n return \"\";\n }\n const base = 0x1f1e6;\n return String.fromCodePoint(base + upper.charCodeAt(0) - 65, base + upper.charCodeAt(1) - 65);\n}\n\n/** `true` when the code is a known ISO 3166-1 alpha-2 region. */\nexport function isRegionCode(code: string): boolean {\n return REGION_CODE_SET.has(normalizeRegionCode(code));\n}\n\nlet aliasRegex: RegExp | undefined;\n\nfunction buildAliasRegex(): RegExp {\n const ascii: string[] = [];\n const other: string[] = [];\n const seen = new Set<string>();\n const add = (alias: string): void => {\n const trimmed = alias.trim();\n if (trimmed.length < 2 || seen.has(trimmed)) {\n return;\n }\n seen.add(trimmed);\n if (/^[\\x20-\\x7e]+$/.test(trimmed)) {\n ascii.push(escapeRegExp(trimmed));\n } else {\n other.push(escapeRegExp(trimmed));\n }\n };\n for (const code of REGION_CODES) {\n add(regionDisplayName(code, \"zh-CN\"));\n add(regionDisplayName(code, \"en\"));\n add(regionFlag(code));\n }\n for (const alias of EXTRA_ALIASES) {\n add(alias);\n }\n const parts: string[] = [];\n if (ascii.length > 0) {\n parts.push(`(?<![A-Za-z])(?:${ascii.join(\"|\")})(?![A-Za-z])`);\n }\n if (other.length > 0) {\n parts.push(`(?:${other.join(\"|\")})`);\n }\n return new RegExp(parts.join(\"|\"), \"iu\");\n}\n\nfunction getAliasRegex(): RegExp {\n aliasRegex ??= buildAliasRegex();\n return aliasRegex;\n}\n\n/**\n * `true` when a node name already mentions a country/region — a localized\n * name, a common English spelling, a flag emoji, or an ISO code token such as\n * `US` in `US-01` / `US01`.\n */\nexport function hasRegionName(remark: string): boolean {\n const text = remark.trim();\n if (text === \"\") {\n return false;\n }\n if (getAliasRegex().test(text)) {\n return true;\n }\n for (const token of text.split(/[^\\p{L}\\p{N}]+/u)) {\n if (token === \"\") {\n continue;\n }\n if (/^\\p{Lu}{2}$/u.test(token) && isRegionCode(token)) {\n return true;\n }\n // `US01` / `us01`: an uppercase code prefix, or a lowercase one followed\n // by at least two digits (so `no1`, `in1` are not read as Norway/India).\n if (/^[A-Za-z]{2}\\d{2}/.test(token) && isRegionCode(token.slice(0, 2))) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Prepend `name-` to a node remark (e.g. `server1` -> `美国-server1`).\n * An empty remark becomes just the country name.\n */\nexport function formatCountryRemark(remark: string, code: string, locale = \"zh-CN\"): string {\n const name = regionDisplayName(code, locale);\n const trimmed = remark.trim();\n if (name === \"\") {\n return trimmed;\n }\n return trimmed === \"\" ? name : `${name}-${trimmed}`;\n}\n","import type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { RegexMatchConfig } from \"../types/settings\";\nimport { formatCountryRemark, hasRegionName } from \"../utils/country\";\n\nfunction toRegex(pattern: string): RegExp {\n try {\n return new RegExp(pattern);\n } catch {\n return /$^/;\n }\n}\n\nfunction regFind(value: string, pattern: string): boolean {\n return toRegex(pattern).test(value);\n}\n\nfunction regMatch(value: string, pattern: string): boolean {\n const match = toRegex(pattern).exec(value);\n return match !== null && match[0] === value;\n}\n\nfunction regReplace(value: string, pattern: string, replacement: string): string {\n return value.replace(new RegExp(pattern, \"g\"), replacement);\n}\n\nconst TYPE_MATCH_NAMES: Partial<Record<ProxyType, string>> = {\n [ProxyType.AnyTLS]: \"ANYTLS\",\n [ProxyType.HTTP]: \"HTTP\",\n [ProxyType.HTTPS]: \"HTTPS\",\n [ProxyType.Hysteria]: \"HYSTERIA\",\n [ProxyType.Hysteria2]: \"HYSTERIA2\",\n [ProxyType.Shadowsocks]: \"SS\",\n [ProxyType.ShadowsocksR]: \"SSR\",\n [ProxyType.Snell]: \"SNELL\",\n [ProxyType.SOCKS5]: \"SOCKS5\",\n [ProxyType.Trojan]: \"TROJAN\",\n [ProxyType.TUIC]: \"TUIC\",\n [ProxyType.VLESS]: \"VLESS\",\n [ProxyType.VMess]: \"VMESS\",\n [ProxyType.WireGuard]: \"WIREGUARD\",\n};\n\n/** Does `target` fall within a subconverter range expression like `1-5,8,!3`? */\nexport function matchRange(range: string, target: number): boolean {\n const items = range.split(\",\");\n let match = false;\n for (const item of items) {\n if (/^-?\\d+$/.test(item)) {\n if (Number.parseInt(item, 10) === target) {\n match = true;\n }\n } else if (/^(\\d+)-(\\d+)$/.test(item)) {\n const m = /^(\\d+)-(\\d+)$/.exec(item) as RegExpExecArray;\n const begin = Number.parseInt(m[1] as string, 10);\n const end = Number.parseInt(m[2] as string, 10);\n if (target >= begin && target <= end) {\n match = true;\n }\n } else if (/^!-?(\\d+)$/.test(item)) {\n match = true;\n const m = /^!-?(\\d+)$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) === target) {\n match = false;\n }\n } else if (/^!(\\d+)-(\\d+)$/.test(item)) {\n match = true;\n const m = /^!(\\d+)-(\\d+)$/.exec(item) as RegExpExecArray;\n const begin = Number.parseInt(m[1] as string, 10);\n const end = Number.parseInt(m[2] as string, 10);\n if (target >= begin && target <= end) {\n match = false;\n }\n } else if (/^(\\d+)-$/.test(item)) {\n const m = /^(\\d+)-$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) >= target) {\n match = true;\n }\n } else if (/^(\\d+)\\+$/.test(item)) {\n const m = /^(\\d+)\\+$/.exec(item) as RegExpExecArray;\n if (Number.parseInt(m[1] as string, 10) <= target) {\n match = true;\n }\n }\n }\n return match;\n}\n\n/**\n * Resolve a matcher rule against a node.\n *\n * Returns whether the rule's primary predicate matched; `realRule` receives the\n * remaining remark regex (empty means \"match all\").\n */\nexport function applyMatcher(rule: string, node: Proxy): { matched: boolean; realRule: string } {\n if (rule.startsWith(\"!!GROUP=\")) {\n const m = /^!!(?:GROUP)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: regFind(node.group, target), realRule };\n }\n if (rule.startsWith(\"!!GROUPID=\") || rule.startsWith(\"!!INSERT=\")) {\n const m = /^!!(?:GROUPID|INSERT)=([\\d\\-+!,]+)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n const dir = rule.startsWith(\"!!INSERT=\") ? -1 : 1;\n return { matched: matchRange(target, dir * node.groupId), realRule };\n }\n if (rule.startsWith(\"!!TYPE=\")) {\n const m = /^!!(?:TYPE)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n if (node.type === ProxyType.Unknown) {\n return { matched: false, realRule };\n }\n const name = TYPE_MATCH_NAMES[node.type] ?? \"\";\n return { matched: regMatch(name, target), realRule };\n }\n if (rule.startsWith(\"!!PORT=\")) {\n const m = /^!!(?:PORT)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: matchRange(target, node.port), realRule };\n }\n if (rule.startsWith(\"!!SERVER=\")) {\n const m = /^!!(?:SERVER)=(.+?)(?:!!(.*))?$/.exec(rule);\n const target = m?.[1] ?? \"\";\n const realRule = m?.[2] ?? \"\";\n return { matched: regFind(node.hostname, target), realRule };\n }\n return { matched: true, realRule: rule };\n}\n\n/** `true` when a node should be filtered out by the include/exclude remarks. */\nexport function checkIgnore(\n node: Proxy,\n excludeRemarks: string[],\n includeRemarks: string[],\n): boolean {\n const excluded = excludeRemarks.some((rule) => {\n const { matched, realRule } = applyMatcher(rule, node);\n if (!matched) {\n return false;\n }\n if (realRule === \"\") {\n return true;\n }\n return regFind(node.remark, realRule);\n });\n let included: boolean;\n if (includeRemarks.length > 0) {\n included = includeRemarks.some((rule) => {\n const { matched, realRule } = applyMatcher(rule, node);\n if (!matched) {\n return false;\n }\n if (realRule === \"\") {\n return true;\n }\n return regFind(node.remark, realRule);\n });\n } else {\n included = true;\n }\n return excluded || !included;\n}\n\n/** Remove excluded nodes and renumber the remaining ones in place. */\nexport function filterNodes(\n nodes: Proxy[],\n excludeRemarks: string[],\n includeRemarks: string[],\n groupId: number,\n): void {\n let nodeIndex = 0;\n const kept: Proxy[] = [];\n for (const node of nodes) {\n if (checkIgnore(node, excludeRemarks, includeRemarks)) {\n continue;\n }\n node.id = nodeIndex;\n node.groupId = groupId;\n nodeIndex += 1;\n kept.push(node);\n }\n nodes.length = 0;\n nodes.push(...kept);\n}\n\n/** Normalize a remark for output: `=`→`-`, optional CSV quoting, de-duplication. */\nexport function processRemark(remark: string, remarksList: string[], procComma = true): string {\n let result = remark.replace(/=/g, \"-\");\n if (procComma && result.includes(\",\")) {\n result = `\"${result}\"`;\n }\n let tempRemark = result;\n let count = 2;\n while (remarksList.includes(tempRemark)) {\n tempRemark = `${result} ${count}`;\n count += 1;\n }\n return tempRemark;\n}\n\n/** Expand a proxy-group `proxies` rule into concrete node remarks. */\nexport function groupGenerate(\n rule: string,\n nodeList: Proxy[],\n filteredNodeList: string[],\n addDirect: boolean,\n): void {\n if (rule.startsWith(\"[]\") && addDirect) {\n filteredNodeList.push(rule.slice(2));\n return;\n }\n for (const node of nodeList) {\n const { matched, realRule } = applyMatcher(rule, node);\n if (\n matched &&\n (realRule === \"\" || regFind(node.remark, realRule)) &&\n !filteredNodeList.includes(node.remark)\n ) {\n filteredNodeList.push(node.remark);\n }\n }\n}\n\n/** Strip leading astral emoji from a remark (mirrors subconverter's byte check). */\nexport function removeEmoji(originalRemark: string): string {\n let index = 0;\n while (index < originalRemark.length) {\n const code = originalRemark.codePointAt(index) as number;\n if (code >= 0x1f000 && code <= 0x1ffff) {\n index += code > 0xffff ? 2 : 1;\n } else {\n break;\n }\n }\n const remark = originalRemark.slice(index).trim();\n return remark === \"\" ? originalRemark : remark;\n}\n\n/** Prefix an emoji chosen by the emoji rules. */\nexport function addEmoji(node: Proxy, emojiArray: RegexMatchConfig[]): string {\n for (const rule of emojiArray) {\n if (rule.replace === \"\") {\n continue;\n }\n const { matched, realRule } = applyMatcher(rule.match, node);\n if (matched && realRule !== \"\" && regFind(node.remark, realRule)) {\n return `${rule.replace} ${node.remark}`;\n }\n }\n return node.remark;\n}\n\n/** Replace every match of the user-supplied regex rules in a node's remark. */\nexport function nodeNameRegex(node: Proxy, rules: RegexMatchConfig[]): void {\n const original = node.remark;\n for (const rule of rules) {\n if (rule.script !== \"\" || rule.match === \"\") {\n continue;\n }\n try {\n node.remark = node.remark.replace(new RegExp(rule.match, \"g\"), rule.replace);\n } catch {\n // Ignore malformed patterns instead of failing the whole conversion.\n }\n }\n if (node.remark === \"\") {\n node.remark = original;\n }\n}\n\nconst NAME_SEPARATOR_EDGES = /^[-_.\\s]+|[-_.\\s]+$/g;\nconst NAME_SEPARATOR_RUN = /([-_.\\s])[-_.\\s]+/g;\n\n/**\n * Remove literal fragments from a node's remark (e.g. `foo.server1.bar` with\n * `[\"foo\", \"bar\"]` -> `server1`). Separators left at the edges or doubled by\n * the removal are collapsed.\n */\nexport function nodeNameRemove(node: Proxy, removeList: string[]): void {\n const original = node.remark;\n let remark = node.remark;\n let removed = false;\n for (const fragment of removeList) {\n if (fragment === \"\" || !remark.includes(fragment)) {\n continue;\n }\n remark = remark.split(fragment).join(\"\");\n removed = true;\n }\n if (removed) {\n remark = remark.replace(NAME_SEPARATOR_EDGES, \"\").replace(NAME_SEPARATOR_RUN, \"$1\");\n }\n node.remark = remark === \"\" ? original : remark;\n}\n\n/** Apply rename rules to a node's remark (script rules are ignored). */\nexport function nodeRename(node: Proxy, renameArray: RegexMatchConfig[]): void {\n const original = node.remark;\n for (const rule of renameArray) {\n if (rule.script !== \"\") {\n continue;\n }\n const { matched, realRule } = applyMatcher(rule.match, node);\n if (matched && realRule !== \"\") {\n node.remark = regReplace(node.remark, realRule, rule.replace);\n }\n }\n if (node.remark === \"\") {\n node.remark = original;\n }\n}\n\n/**\n * Prefix a node's remark with its server country/region when the remark does\n * not already mention one (e.g. `server1` -> `美国-server1`).\n *\n * `resolve` returns an ISO 3166-1 alpha-2 code; a missing/unknown code leaves\n * the remark untouched. Mirrors the request `auto_country` switch.\n */\nexport function addCountryPrefix(\n node: Proxy,\n resolve: (node: Proxy) => string | undefined,\n locale = \"zh-CN\",\n): string {\n const remark = node.remark.trim();\n if (hasRegionName(remark)) {\n return node.remark;\n }\n const code = resolve(node);\n if (code === undefined || code === \"\") {\n return node.remark;\n }\n return formatCountryRemark(remark, code, locale);\n}\n\nexport interface PreprocessOptions {\n removeEmoji: boolean;\n addEmoji: boolean;\n sortFlag: boolean;\n renameArray: RegexMatchConfig[];\n emojiArray: RegexMatchConfig[];\n /** User regex rewrites applied before every other naming rule. */\n nameRegexArray?: RegexMatchConfig[];\n /** Literal fragments stripped from names before every other naming rule. */\n nameRemove?: string[];\n autoCountry?: boolean;\n countryLocale?: string;\n countryResolver?: (node: Proxy) => string | undefined;\n}\n\n/** Apply name cleanup, emoji removal, renaming, emoji insertion, and optional sorting. */\nexport function preprocessNodes(nodes: Proxy[], options: PreprocessOptions): void {\n for (const node of nodes) {\n if (options.removeEmoji) {\n node.remark = removeEmoji(node.remark).trim();\n }\n if (options.nameRegexArray && options.nameRegexArray.length > 0) {\n nodeNameRegex(node, options.nameRegexArray);\n }\n if (options.nameRemove && options.nameRemove.length > 0) {\n nodeNameRemove(node, options.nameRemove);\n }\n nodeRename(node, options.renameArray);\n if (options.addEmoji) {\n node.remark = addEmoji(node, options.emojiArray);\n }\n if (options.autoCountry && options.countryResolver) {\n node.remark = addCountryPrefix(\n node,\n options.countryResolver,\n options.countryLocale ?? \"zh-CN\",\n );\n }\n }\n if (options.sortFlag) {\n nodes.sort((a, b) => (a.remark < b.remark ? -1 : a.remark > b.remark ? 1 : 0));\n }\n}\n\n/** Remove nodes that share a type, server, port, and remark. Returns the count removed. */\nexport function dedupeNodes(nodes: Proxy[]): number {\n const seen = new Set<string>();\n const kept: Proxy[] = [];\n for (const node of nodes) {\n const key = `${node.type}\\u0000${node.hostname}\\u0000${node.port}\\u0000${node.remark}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n kept.push(node);\n }\n const removed = nodes.length - kept.length;\n nodes.length = 0;\n nodes.push(...kept);\n return removed;\n}\n","import type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport { BalanceStrategy, ProxyGroupType } from \"../types/proxy-group\";\nimport type { RulesetConfig, RulesetContent } from \"../types/ruleset\";\nimport { RulesetType } from \"../types/ruleset\";\n\nconst TEST_URL = \"http://www.gstatic.com/generate_204\";\n\nfunction group(\n name: string,\n type: ProxyGroupType,\n proxies: string[],\n extra: Partial<ProxyGroupConfig> = {},\n): ProxyGroupConfig {\n return {\n disableUdp: undefined,\n evaluateBeforeUse: undefined,\n interval: 0,\n lazy: undefined,\n name,\n persistent: undefined,\n proxies: [...proxies],\n strategy: BalanceStrategy.ConsistentHashing,\n timeout: 5,\n tolerance: 0,\n type,\n url: \"\",\n usingProvider: [],\n ...extra,\n };\n}\n\n/**\n * Bundled default proxy groups, mirroring upstream `ACL4SSR.ini`\n * (`tindy2013/subconverter/base/config/ACL4SSR.ini`).\n *\n * Used only when `generate(..., { includeRules: true })` is set and the caller\n * did not provide explicit groups. Kept offline so the core engine stays\n * platform-free (no fetch required).\n */\nexport function getDefaultProxyGroups(): ProxyGroupConfig[] {\n return [\n group(\"🚀 节点选择\", ProxyGroupType.Select, [\"[]♻️ 自动选择\", \"[]DIRECT\", \".*\"]),\n group(\"♻️ 自动选择\", ProxyGroupType.URLTest, [\".*\"], {\n interval: 300,\n tolerance: 50,\n url: TEST_URL,\n }),\n group(\"🌍 国外媒体\", ProxyGroupType.Select, [\n \"[]🚀 节点选择\",\n \"[]♻️ 自动选择\",\n \"[]🎯 全球直连\",\n \".*\",\n ]),\n group(\"📲 电报信息\", ProxyGroupType.Select, [\"[]🚀 节点选择\", \"[]🎯 全球直连\", \".*\"]),\n group(\"Ⓜ️ 微软服务\", ProxyGroupType.Select, [\"[]🎯 全球直连\", \"[]🚀 节点选择\", \".*\"]),\n group(\"🍎 苹果服务\", ProxyGroupType.Select, [\"[]🚀 节点选择\", \"[]🎯 全球直连\", \".*\"]),\n group(\"🎯 全球直连\", ProxyGroupType.Select, [\"[]DIRECT\", \"[]🚀 节点选择\", \"[]♻️ 自动选择\"]),\n group(\"🛑 全球拦截\", ProxyGroupType.Select, [\"[]REJECT\", \"[]DIRECT\"]),\n group(\"🍃 应用净化\", ProxyGroupType.Select, [\"[]REJECT\", \"[]DIRECT\"]),\n group(\"🐟 漏网之鱼\", ProxyGroupType.Select, [\n \"[]🚀 节点选择\",\n \"[]🎯 全球直连\",\n \"[]♻️ 自动选择\",\n \".*\",\n ]),\n ];\n}\n\n/** Inline `[]RULE` content helper (no remote fetch needed). */\nfunction inline(group: string, rule: string): RulesetContent {\n return {\n content: `[]${rule}`,\n ruleGroup: group,\n rulePath: \"\",\n rulePathTyped: \"\",\n ruleType: RulesetType.Surge,\n updateInterval: 86400,\n };\n}\n\nfunction surge(group: string, lines: string[]): RulesetContent {\n return {\n content: lines.join(\"\\n\"),\n ruleGroup: group,\n rulePath: \"\",\n rulePathTyped: \"\",\n ruleType: RulesetType.Surge,\n updateInterval: 86400,\n };\n}\n\n/**\n * Bundled offline default rules, mirroring the structure of upstream\n * `ACL4SSR.ini` + its `rules/ACL4SSR` lists (LAN/China direct, ad reject,\n * messenger/media proxy, final catch-all).\n *\n * These are intentionally compact (≈60 rules) so `includeRules: true` works\n * without network access. Callers needing the full upstream lists should pass\n * explicit {@link RulesetContent} (or {@link getDefaultRulesetConfigs} via the\n * Node adapter, which fetches the remote lists).\n */\nexport function getDefaultRulesets(): RulesetContent[] {\n return [\n surge(\"🎯 全球直连\", [\n \"DOMAIN-SUFFIX,localhost\",\n \"DOMAIN,localhost\",\n \"IP-CIDR,127.0.0.0/8\",\n \"IP-CIDR,10.0.0.0/8\",\n \"IP-CIDR,172.16.0.0/12\",\n \"IP-CIDR,192.168.0.0/16\",\n \"IP-CIDR,224.0.0.0/4\",\n \"DOMAIN-SUFFIX,cn\",\n \"DOMAIN-SUFFIX,126.com\",\n \"DOMAIN-SUFFIX,163.com\",\n \"DOMAIN-SUFFIX,qq.com\",\n \"DOMAIN-SUFFIX,baidu.com\",\n \"DOMAIN-SUFFIX,alibaba.com\",\n \"DOMAIN-SUFFIX,taobao.com\",\n ]),\n surge(\"🛑 全球拦截\", [\n \"DOMAIN-SUFFIX,doubleclick.net\",\n \"DOMAIN-SUFFIX,googlesyndication.com\",\n \"DOMAIN-SUFFIX,googleadservices.com\",\n \"DOMAIN-SUFFIX,ads.yahoo.com\",\n \"DOMAIN-KEYWORD,adservice\",\n \"DOMAIN-KEYWORD,advertising\",\n ]),\n surge(\"🍃 应用净化\", [\n \"DOMAIN-SUFFIX,app-measurement.com\",\n \"DOMAIN-SUFFIX,crashlytics.com\",\n \"DOMAIN-KEYWORD,analytics\",\n \"DOMAIN-KEYWORD,tracking\",\n ]),\n surge(\"🌍 国外媒体\", [\n \"DOMAIN-SUFFIX,netflix.com\",\n \"DOMAIN-SUFFIX,nflxvideo.net\",\n \"DOMAIN-SUFFIX,youtube.com\",\n \"DOMAIN-SUFFIX,googlevideo.com\",\n \"DOMAIN-SUFFIX,disneyplus.com\",\n \"DOMAIN-SUFFIX,spotify.com\",\n \"DOMAIN-SUFFIX,tiktok.com\",\n ]),\n surge(\"📲 电报信息\", [\n \"DOMAIN-SUFFIX,telegram.org\",\n \"DOMAIN-SUFFIX,t.me\",\n \"DOMAIN-SUFFIX,telegram.me\",\n \"IP-CIDR,149.154.160.0/20\",\n \"IP-CIDR,91.108.4.0/22\",\n ]),\n surge(\"Ⓜ️ 微软服务\", [\n \"DOMAIN-SUFFIX,microsoft.com\",\n \"DOMAIN-SUFFIX,windows.com\",\n \"DOMAIN-SUFFIX,office.com\",\n \"DOMAIN-SUFFIX,live.com\",\n ]),\n surge(\"🍎 苹果服务\", [\n \"DOMAIN-SUFFIX,apple.com\",\n \"DOMAIN-SUFFIX,icloud.com\",\n \"DOMAIN-SUFFIX,apple-cloudkit.com\",\n ]),\n surge(\"🚀 节点选择\", [\"DOMAIN-SUFFIX,google.com\", \"DOMAIN-SUFFIX,github.com\"]),\n inline(\"🎯 全球直连\", \"GEOIP,CN\"),\n inline(\"🐟 漏网之鱼\", \"FINAL\"),\n ];\n}\n\n/**\n * Remote ruleset configs matching upstream `ACL4SSR.ini` for callers that can\n * fetch (Node adapter / CLI `--config`). Paths follow the public ACL4SSR\n * mirror; `collectRulesets` in `@subconverter/node` resolves them.\n */\nexport function getDefaultRulesetConfigs(): RulesetConfig[] {\n const base = \"https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash\";\n const list = (group: string, file: string): RulesetConfig => ({\n group,\n interval: 86400,\n url: `${base}/${file}`,\n });\n return [\n list(\"🎯 全球直连\", \"LocalAreaNetwork.list\"),\n list(\"🛑 全球拦截\", \"BanAD.list\"),\n list(\"🍃 应用净化\", \"BanProgramAD.list\"),\n list(\"🎯 全球直连\", \"GoogleCN.list\"),\n list(\"Ⓜ️ 微软服务\", \"Microsoft.list\"),\n list(\"🍎 苹果服务\", \"Apple.list\"),\n list(\"🌍 国外媒体\", \"ProxyMedia.list\"),\n list(\"📲 电报信息\", \"Telegram.list\"),\n list(\"🚀 节点选择\", \"ProxyLite.list\"),\n list(\"🎯 全球直连\", \"ChinaDomain.list\"),\n list(\"🎯 全球直连\", \"ChinaCompanyIp.list\"),\n { group: \"🎯 全球直连\", interval: 86400, url: \"[]GEOIP,CN\" },\n { group: \"🐟 漏网之鱼\", interval: 86400, url: \"[]FINAL\" },\n ];\n}\n","import { isSsCipher, SSR_CIPHERS } from \"../parser/ciphers\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode, urlSafeBase64Encode } from \"../utils/base64\";\nimport { toInt } from \"../utils/string\";\nimport { getUrlArg, urlEncode } from \"../utils/url\";\n\n/** Build the JSON payload of a `vmess://` link. */\nexport function vmessLinkConstruct(\n remarks: string,\n add: string,\n port: string,\n type: string,\n id: string,\n aid: string,\n net: string,\n path: string,\n host: string,\n tls: string,\n): string {\n return JSON.stringify({\n add,\n aid,\n host,\n id,\n net: net === \"\" ? \"tcp\" : net,\n path,\n port,\n ps: remarks,\n tls,\n type: type === \"\" ? \"none\" : type,\n v: \"2\",\n });\n}\n\n/** Build an `ss://` link. */\nexport function ssLinkConstruct(proxy: Proxy): string {\n const port = String(proxy.port);\n let link = `ss://${urlSafeBase64Encode(`${proxy.encryptMethod}:${proxy.password}`)}@${proxy.hostname}:${port}`;\n if (proxy.plugin !== \"\" && proxy.pluginOption !== \"\") {\n link += `/?plugin=${urlEncode(`${proxy.plugin};${proxy.pluginOption}`)}`;\n }\n link += `#${urlEncode(proxy.remark)}`;\n return link;\n}\n\n/** Build an `ssr://` link. */\nexport function ssrLinkConstruct(\n hostname: string,\n port: number,\n protocol: string,\n method: string,\n obfs: string,\n password: string,\n group: string,\n remark: string,\n obfsParam = \"\",\n protocolParam = \"\",\n): string {\n const payload =\n `${hostname}:${port}:${protocol}:${method}:${obfs}:${urlSafeBase64Encode(password)}` +\n `/?group=${urlSafeBase64Encode(group)}&remarks=${urlSafeBase64Encode(remark)}` +\n `&obfsparam=${urlSafeBase64Encode(obfsParam)}&protoparam=${urlSafeBase64Encode(protocolParam)}`;\n return `ssr://${urlSafeBase64Encode(payload)}`;\n}\n\n/** Build a `trojan://` link. */\nexport function trojanLinkConstruct(proxy: Proxy): string {\n const port = String(proxy.port);\n let link = `trojan://${proxy.password}@${proxy.hostname}:${port}?allowInsecure=${proxy.allowInsecure === true ? \"1\" : \"0\"}`;\n if (proxy.host !== \"\") {\n link += `&sni=${proxy.host}`;\n }\n if (proxy.transferProtocol === \"ws\") {\n link += \"&ws=1\";\n if (proxy.path !== \"\") {\n link += `&wspath=${urlEncode(proxy.path)}`;\n }\n }\n link += `#${urlEncode(proxy.remark)}`;\n return link;\n}\n\nfunction getBit(types: number, position: number): boolean {\n return (types & (1 << (position - 1))) !== 0;\n}\n\n/**\n * Export nodes as a plaintext or base64 list of share links.\n * `types` bitmask: SS=1, SSR=2, VMess=4, Trojan=8.\n */\nexport function proxyToSingle(nodes: Proxy[], types: number, settings: ExtraSettings): string {\n const ss = getBit(types, 1);\n const ssr = getBit(types, 2);\n const vmess = getBit(types, 3);\n const trojan = getBit(types, 4);\n let allLinks = \"\";\n\n for (const x of nodes) {\n let proxyStr = \"\";\n const port = String(x.port);\n const aid = String(x.alterId);\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (ss) {\n proxyStr = ssLinkConstruct(x);\n } else if (ssr) {\n if (SSR_CIPHERS.includes(x.encryptMethod) && x.plugin === \"\") {\n proxyStr = ssrLinkConstruct(\n x.hostname,\n x.port,\n \"origin\",\n x.encryptMethod,\n \"plain\",\n x.password,\n x.group,\n x.remark,\n );\n }\n } else {\n continue;\n }\n break;\n case ProxyType.ShadowsocksR:\n if (ssr) {\n proxyStr = ssrLinkConstruct(\n x.hostname,\n x.port,\n x.protocol,\n x.encryptMethod,\n x.obfs,\n x.password,\n x.group,\n x.remark,\n x.obfsParam,\n x.protocolParam,\n );\n } else if (ss) {\n if (isSsCipher(x.encryptMethod) && x.protocol === \"origin\" && x.obfs === \"plain\") {\n proxyStr = `ss://${urlSafeBase64Encode(`${x.encryptMethod}:${x.password}`)}@${x.hostname}:${port}#${urlEncode(x.remark)}`;\n }\n } else {\n continue;\n }\n break;\n case ProxyType.VMess:\n if (!vmess) {\n continue;\n }\n proxyStr = `vmess://${base64Encode(\n vmessLinkConstruct(\n x.remark,\n x.hostname,\n port,\n x.fakeType,\n x.userId,\n aid,\n x.transferProtocol,\n x.path,\n x.host,\n x.tlsSecure ? \"tls\" : \"\",\n ),\n )}`;\n break;\n case ProxyType.Trojan:\n if (!trojan) {\n continue;\n }\n proxyStr = trojanLinkConstruct(x);\n break;\n default:\n continue;\n }\n if (proxyStr !== \"\") {\n allLinks += `${proxyStr}\\n`;\n }\n }\n\n return settings.nodeList ? allLinks : base64Encode(allLinks);\n}\n\n/** Export Shadowsocks nodes as a SIP008 (`ssconf`) document. */\nexport function proxyToSsSub(nodes: Proxy[], baseConf: string): string {\n let base: Record<string, unknown>;\n try {\n const trimmed = baseConf.trim() === \"\" ? \"{}\" : baseConf;\n base = JSON.parse(trimmed) as Record<string, unknown>;\n } catch {\n base = {};\n }\n const proxies: unknown[] = [];\n for (const x of nodes) {\n let plugin = x.plugin;\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (plugin === \"simple-obfs\") {\n plugin = \"obfs-local\";\n }\n break;\n case ProxyType.ShadowsocksR:\n if (!isSsCipher(x.encryptMethod) || x.protocol !== \"origin\" || x.obfs !== \"plain\") {\n continue;\n }\n break;\n default:\n continue;\n }\n proxies.push({\n ...base,\n method: x.encryptMethod,\n password: x.password,\n plugin,\n plugin_opts: x.pluginOption,\n remarks: x.remark,\n server: x.hostname,\n server_port: x.port,\n });\n }\n return JSON.stringify(proxies);\n}\n\n/** Export Shadowsocks nodes as an `ssd://` document. */\nexport function proxyToSsd(nodes: Proxy[], group: string, userinfo: string): string {\n const resolvedGroup = group === \"\" ? \"SSD\" : group;\n const doc: Record<string, unknown> = {\n airport: resolvedGroup,\n encryption: \"aes-128-gcm\",\n password: \"password\",\n port: 1,\n };\n if (userinfo !== \"\") {\n const data = userinfo.replace(/; /g, \"&\");\n const upload = getUrlArg(data, \"upload\");\n const download = getUrlArg(data, \"download\");\n const total = getUrlArg(data, \"total\");\n const expiry = getUrlArg(data, \"expire\");\n // SSD reports traffic in decimal GB (1 GB = 1000^3 bytes) per spec,\n // distinct from Clash `subscription-userinfo` clients that divide by\n // 1024^3 (see `scaleDecimalBytes` in userinfo.ts).\n const gb = 1000 ** 3;\n doc.traffic_used = (Number(upload || 0) + Number(download || 0)) / gb;\n doc.traffic_total = Number(total || 0) / gb;\n if (expiry !== \"\") {\n const date = new Date(toInt(expiry) * 1000);\n doc.expiry = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}-${String(date.getDate()).padStart(2, \"0\")} ${String(date.getHours()).padStart(2, \"0\")}:${String(date.getMinutes()).padStart(2, \"0\")}`;\n }\n }\n const servers: unknown[] = [];\n let index = 0;\n for (const x of nodes) {\n if (x.type === ProxyType.Shadowsocks) {\n const plugin = x.plugin === \"obfs-local\" ? \"simple-obfs\" : x.plugin;\n servers.push({\n encryption: x.encryptMethod,\n id: index,\n password: x.password,\n plugin,\n plugin_options: x.pluginOption,\n port: x.port,\n remarks: x.remark,\n server: x.hostname,\n });\n index += 1;\n } else if (x.type === ProxyType.ShadowsocksR) {\n if (isSsCipher(x.encryptMethod) && x.protocol === \"origin\" && x.obfs === \"plain\") {\n servers.push({\n encryption: x.encryptMethod,\n id: index,\n password: x.password,\n port: x.port,\n remarks: x.remark,\n server: x.hostname,\n });\n index += 1;\n }\n }\n }\n doc.servers = servers;\n return `ssd://${base64Encode(JSON.stringify(doc))}`;\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { fnv1a64Hex } from \"../utils/hash\";\nimport { isIpv4, isIpv6 } from \"../utils/string\";\n\ninterface RawSection {\n name: string;\n lines: string[];\n}\n\nfunction parseRawSections(text: string): RawSection[] {\n const sections: RawSection[] = [];\n let current: RawSection | undefined;\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine;\n const header = /^\\[(.*)\\]$/.exec(line.trim());\n if (header) {\n current = { lines: [], name: (header[1] as string).trim() };\n sections.push(current);\n continue;\n }\n if (line.trim() === \"\") {\n continue;\n }\n if (current) {\n current.lines.push(line);\n }\n }\n return sections;\n}\n\nfunction triStr(value: boolean | undefined): string {\n return value ? \"true\" : \"false\";\n}\n\nfunction httpProxyLine(x: Proxy, scv: boolean | undefined): string {\n let proxy = `http, ${x.hostname}, ${x.port}`;\n if (x.username !== \"\") {\n proxy += `, username=${x.username}`;\n }\n if (x.password !== \"\") {\n proxy += `, password=${x.password}`;\n }\n proxy += `, tls=${triStr(x.tlsSecure)}`;\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n return proxy;\n}\n\n/** Build a WireGuard `peer=(...)` clause. */\nexport function generatePeer(node: Proxy, clientIdAsReserved = false): string {\n let result = `public-key = ${node.publicKey}`;\n result += `, endpoint = ${node.hostname}:${node.port}`;\n if (node.preSharedKey !== \"\") {\n result += `, preshared-key = ${node.preSharedKey}`;\n }\n if (node.allowedIps !== \"\") {\n result += `, allowed-ips = \"${node.allowedIps}\"`;\n }\n if (node.keepAlive > 0) {\n result += `, keepalive = ${node.keepAlive}`;\n }\n if (node.clientId !== \"\") {\n result += clientIdAsReserved\n ? `, reserved = [${node.clientId}]`\n : `, client-id = ${node.clientId}`;\n }\n return result;\n}\n\nexport interface SurgeOptions {\n version: number;\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\ninterface SurgeBuildResult {\n proxies: string[];\n groups: string[];\n extraSections: Map<string, string[]>;\n sectionOrder: string[];\n}\n\nfunction buildSurge(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurgeOptions,\n): SurgeBuildResult {\n const surgeVer = options.version;\n const remarksList: string[] = [];\n const proxies: string[] = [];\n const nodelist: Proxy[] = [];\n const extraSections = new Map<string, string[]>();\n const sectionOrder: string[] = [];\n let localPort = 1080;\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tls13 = x.tls13 !== undefined ? x.tls13 : settings.tls13;\n\n let proxy = \"\";\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (surgeVer >= 3 || surgeVer === -3) {\n proxy = `ss, ${x.hostname}, ${x.port}, encrypt-method=${x.encryptMethod}, password=${x.password}`;\n } else {\n proxy = `custom, ${x.hostname}, ${x.port}, ${x.encryptMethod}, ${x.password}, https://github.com/pobizhe/SSEncrypt/raw/master/SSEncrypt.module`;\n }\n if (x.plugin !== \"\") {\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n if (x.pluginOption !== \"\") {\n proxy += `,${x.pluginOption.replace(/;/g, \",\")}`;\n }\n } else {\n continue;\n }\n }\n break;\n case ProxyType.VMess: {\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `vmess, ${x.hostname}, ${x.port}, username=${x.userId}, tls=${triStr(x.tlsSecure)}, vmess-aead=${x.alterId === 0 ? \"true\" : \"false\"}`;\n if (x.tlsSecure && tls13 !== undefined) {\n proxy += `, tls13=${triStr(tls13)}`;\n }\n const headers: string[] = [];\n switch (x.transferProtocol) {\n case \"tcp\":\n break;\n case \"ws\": {\n if (x.host === \"\") {\n proxy += `, ws=true, ws-path=${x.path}, sni=${x.hostname}`;\n } else {\n proxy += `, ws=true, ws-path=${x.path}, sni=${x.host}`;\n }\n if (x.host !== \"\") {\n headers.push(`Host:${x.host}`);\n }\n if (x.edge !== \"\") {\n headers.push(`Edge:${x.edge}`);\n }\n if (headers.length > 0) {\n proxy += `, ws-headers=${headers.join(\"|\")}`;\n }\n break;\n }\n default:\n continue;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n }\n case ProxyType.ShadowsocksR: {\n if (settings.surgeSsrPath === \"\" || surgeVer < 2) {\n continue;\n }\n const args = [\n \"-l\",\n String(localPort),\n \"-s\",\n x.hostname,\n \"-p\",\n String(x.port),\n \"-m\",\n x.encryptMethod,\n \"-k\",\n x.password,\n \"-o\",\n x.obfs,\n \"-O\",\n x.protocol,\n ];\n if (x.obfsParam !== \"\") {\n args.push(\"-g\", x.obfsParam);\n }\n if (x.protocolParam !== \"\") {\n args.push(\"-G\", x.protocolParam);\n }\n proxy = `external, exec=\"${settings.surgeSsrPath}\", args=\"${args.join('\", args=\"')}\", local-port=${localPort}`;\n if (isIpv4(x.hostname) || isIpv6(x.hostname)) {\n proxy += `, addresses=${x.hostname}`;\n }\n localPort += 1;\n break;\n }\n case ProxyType.SOCKS5:\n proxy = `socks5, ${x.hostname}, ${x.port}`;\n if (x.username !== \"\") {\n proxy += `, username=${x.username}`;\n }\n if (x.password !== \"\") {\n proxy += `, password=${x.password}`;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n case ProxyType.HTTPS:\n if (surgeVer === -3) {\n proxy = `https, ${x.hostname}, ${x.port}, ${x.username}, ${x.password}`;\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n }\n proxy = httpProxyLine(x, scv);\n break;\n case ProxyType.HTTP:\n proxy = httpProxyLine(x, scv);\n break;\n case ProxyType.Trojan:\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `trojan, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.snellVersion !== 0) {\n proxy += `, version=${x.snellVersion}`;\n }\n if (x.host !== \"\") {\n proxy += `, sni=${x.host}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxy += \", ws=true\";\n if (x.path !== \"\") {\n proxy += `, ws-path=${x.path}`;\n }\n const wsHost = x.host !== \"\" ? x.host : x.hostname;\n proxy += `, ws-headers=Host:\"${wsHost}\"`;\n }\n if (scv !== undefined) {\n proxy += `, skip-cert-verify=${triStr(scv)}`;\n }\n break;\n case ProxyType.Snell:\n proxy = `snell, ${x.hostname}, ${x.port}, psk=${x.password}`;\n if (x.obfs !== \"\") {\n proxy += `, obfs=${x.obfs}`;\n if (x.host !== \"\") {\n proxy += `, obfs-host=${x.host}`;\n }\n }\n if (x.snellVersion !== 0) {\n proxy += `, version=${x.snellVersion}`;\n }\n break;\n case ProxyType.WireGuard: {\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n const section = fnv1a64Hex(x.remark).slice(0, 5);\n proxy = `wireguard, section-name=${section}`;\n if (x.testUrl !== \"\") {\n proxy += `, test-url=${x.testUrl}`;\n }\n const wgLines: string[] = [`private-key = ${x.privateKey}`, `self-ip = ${x.selfIp}`];\n if (x.selfIpv6 !== \"\") {\n wgLines.push(`self-ip-v6 = ${x.selfIpv6}`);\n }\n if (x.dnsServers.length > 0) {\n wgLines.push(`dns-server = ${x.dnsServers.join(\",\")}`);\n }\n if (x.mtu > 0) {\n wgLines.push(`mtu = ${x.mtu}`);\n }\n wgLines.push(`peer = (${generatePeer(x)})`);\n const sectionName = `WireGuard ${section}`;\n extraSections.set(sectionName, wgLines);\n sectionOrder.push(sectionName);\n break;\n }\n case ProxyType.Hysteria2:\n if (surgeVer < 4) {\n continue;\n }\n proxy = `hysteria2, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.downSpeed) {\n proxy += `, download-bandwidth=${x.downSpeed}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${triStr(scv)}`;\n }\n if (x.fingerprint !== \"\") {\n proxy += `,server-cert-fingerprint-sha256=${x.fingerprint}`;\n }\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n break;\n case ProxyType.AnyTLS:\n if (surgeVer < 4 && surgeVer !== -3) {\n continue;\n }\n proxy = `anytls, ${x.hostname}, ${x.port}, password=${x.password}`;\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n break;\n default:\n continue;\n }\n\n if (tfo !== undefined) {\n proxy += `, tfo=${triStr(tfo)}`;\n }\n if (udp !== undefined) {\n proxy += `, udp-relay=${triStr(udp)}`;\n }\n if (x.underlyingProxy !== \"\") {\n proxy += `, underlying-proxy=${x.underlyingProxy}`;\n }\n\n proxies.push(`${remark} = ${proxy}`);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return { extraSections, groups: [], proxies, sectionOrder };\n }\n\n const groups: string[] = [];\n for (const group of extraProxyGroup) {\n const filtered: string[] = [];\n let groupLine = \"\";\n switch (group.type) {\n case \"select\":\n case \"smart\":\n case \"url-test\":\n case \"fallback\":\n break;\n case \"load-balance\":\n if (surgeVer < 1 && surgeVer !== -3) {\n continue;\n }\n break;\n case \"ssid\": {\n const rest = group.proxies.slice(1).join(\",\");\n const line = `${group.type},default=${group.proxies[0] ?? \"\"},${rest}`;\n groups.push(`${group.name} = ${line}`);\n continue;\n }\n default:\n continue;\n }\n\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n if (filtered.length === 1) {\n const single = (filtered[0] as string).toLowerCase();\n if (single === \"direct\" || single === \"reject\" || single === \"reject-tinygif\") {\n proxies.push(`${group.name} = ${single}`);\n continue;\n }\n }\n groupLine = `${group.type},${filtered.join(\",\")}`;\n if (group.type === \"url-test\" || group.type === \"fallback\" || group.type === \"load-balance\") {\n groupLine += `,url=${group.url},interval=${group.interval}`;\n if (group.tolerance > 0) {\n groupLine += `,tolerance=${group.tolerance}`;\n }\n if (group.timeout > 0) {\n groupLine += `,timeout=${group.timeout}`;\n }\n if (group.persistent !== undefined) {\n groupLine += `,persistent=${triStr(group.persistent)}`;\n }\n if (group.evaluateBeforeUse !== undefined) {\n groupLine += `,evaluate-before-use=${triStr(group.evaluateBeforeUse)}`;\n }\n }\n groups.push(`${group.name} = ${groupLine}`);\n }\n\n return { extraSections, groups, proxies, sectionOrder };\n}\n\n/** Convert nodes into a Surge configuration string. */\nexport function toSurge(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurgeOptions,\n): string {\n const result = buildSurge(nodes, extraProxyGroup, settings, options);\n if (options.nodeList) {\n return result.proxies.join(\"\\n\");\n }\n\n const baseSections = options.baseConf === \"\" ? [] : parseRawSections(options.baseConf);\n const byName = new Map<string, RawSection>();\n const order: string[] = [];\n for (const section of baseSections) {\n byName.set(section.name, section);\n order.push(section.name);\n }\n const setSection = (name: string, lines: string[]): void => {\n if (!byName.has(name)) {\n order.push(name);\n }\n byName.set(name, { lines, name });\n };\n setSection(\"Proxy\", [\"DIRECT = direct\", ...result.proxies]);\n if (result.groups.length > 0) {\n setSection(\"Proxy Group\", result.groups);\n }\n for (const name of result.sectionOrder) {\n setSection(name, result.extraSections.get(name) as string[]);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setSection(options.rules.section, options.rules.lines);\n }\n\n const out: string[] = [];\n for (const name of order) {\n const section = byName.get(name);\n if (!section) {\n continue;\n }\n out.push(`[${name}]`);\n out.push(...section.lines);\n out.push(\"\");\n }\n return out.join(\"\\n\").trimEnd() + \"\\n\";\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { generatePeer } from \"./surge\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { isIpv4, isIpv6 } from \"../utils/string\";\n\nfunction buildLoonNode(x: Proxy, settings: ExtraSettings, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n let method = x.encryptMethod;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxy: string;\n switch (x.type) {\n case ProxyType.Shadowsocks:\n proxy = `Shadowsocks,${hostname},${port},${method},\"${x.password}\"`;\n if (x.plugin === \"simple-obfs\" || x.plugin === \"obfs-local\") {\n if (x.pluginOption !== \"\") {\n proxy += `,${x.pluginOption.replace(/;obfs-host=/g, \",\").replace(/obfs=/g, \"\")}`;\n }\n } else if (x.plugin !== \"\") {\n return undefined;\n }\n break;\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxy = `vmess,${hostname},${port},${method},\"${x.userId}\",over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure) {\n proxy += `,tls-name=${x.host}`;\n }\n switch (x.transferProtocol) {\n case \"tcp\":\n proxy += \",transport=tcp\";\n break;\n case \"ws\":\n proxy += `,transport=ws,path=${x.path},host=${x.host}`;\n break;\n default:\n return undefined;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.ShadowsocksR:\n proxy = `ShadowsocksR,${hostname},${port},${method},\"${x.password}\",protocol=${x.protocol},protocol-param=${x.protocolParam},obfs=${x.obfs},obfs-param=${x.obfsParam}`;\n break;\n case ProxyType.HTTP:\n proxy = `http,${hostname},${port},${x.username},\"${x.password}\"`;\n break;\n case ProxyType.HTTPS:\n proxy = `https,${hostname},${port},${x.username},\"${x.password}\"`;\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.VLESS:\n if (\n x.transferProtocol !== \"\" &&\n x.transferProtocol !== \"tcp\" &&\n x.transferProtocol !== \"ws\"\n ) {\n return undefined;\n }\n proxy = `VLESS,${hostname},${port},\"${x.userId}\"`;\n if (x.flow !== \"\") {\n proxy += `,flow=${x.flow}`;\n }\n if (x.publicKey !== \"\") {\n proxy += `,public-key=\"${x.publicKey}\"`;\n }\n if (x.shortId !== \"\") {\n proxy += `,short-id=${x.shortId}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxy += `,path=${x.path},host=${x.host}`;\n }\n proxy += `,transport=${x.transferProtocol === \"ws\" ? \"ws\" : \"tcp\"}`;\n if (x.udp !== undefined) {\n proxy += `,udp=${x.udp ? \"true\" : \"false\"}`;\n } else {\n proxy += \",udp=false\";\n }\n proxy += `,over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure && x.serverName !== \"\") {\n proxy += `,sni=${x.serverName}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.Trojan:\n proxy = `trojan,${hostname},${port},\"${x.password}\"`;\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxy += `,transport=ws,path=${x.path},host=${x.host}`;\n } else {\n proxy += \",transport=tcp\";\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n break;\n case ProxyType.SOCKS5:\n proxy = `socks5,${hostname},${port}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxy += `,${x.username},\"${x.password}\"`;\n }\n proxy += `,over-tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure) {\n if (x.host !== \"\") {\n proxy += `,tls-name=${x.host}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n }\n break;\n case ProxyType.WireGuard:\n proxy = `wireguard, interface-ip=${x.selfIp}`;\n if (x.selfIpv6 !== \"\") {\n proxy += `, interface-ipv6=${x.selfIpv6}`;\n }\n proxy += `, private-key=${x.privateKey}`;\n for (const dns of x.dnsServers) {\n if (isIpv4(dns)) {\n proxy += `, dns=${dns}`;\n } else if (isIpv6(dns)) {\n proxy += `, dnsv6=${dns}`;\n }\n }\n if (x.mtu > 0) {\n proxy += `, mtu=${x.mtu}`;\n }\n if (x.keepAlive > 0) {\n proxy += `, keepalive=${x.keepAlive}`;\n }\n proxy += `, peers=[{${generatePeer(x, true)}}]`;\n break;\n case ProxyType.Hysteria2:\n proxy = `Hysteria2,${hostname},${port},\"${x.password}\"`;\n if (x.sni !== \"\") {\n proxy += `,sni=${x.sni}`;\n }\n // NOTE: some converters emit `download-bandwidth` from the *up*\n // value (and a default 100 when unset), which contradicts the\n // Hysteria2 spec. Emit the actual `down` speed instead; omit when unset.\n if (x.downSpeed > 0) {\n proxy += `,download-bandwidth=${x.downSpeed}`;\n }\n if (scv !== undefined) {\n proxy += `,skip-cert-verify=${scv ? \"true\" : \"false\"}`;\n }\n if (x.fingerprint !== \"\") {\n proxy += `,tls-cert-sha256=${x.fingerprint}`;\n }\n break;\n // Loon has no AnyTLS/TUIC mapping — keep the drop instead of\n // emitting non-standard lines.\n default:\n return undefined;\n }\n if (settings.tfo) {\n proxy += \",fast-open=true\";\n }\n if (settings.udp) {\n proxy += \",udp=true\";\n }\n void remark;\n return proxy;\n}\n\nfunction buildLoonGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n const filtered: string[] = [];\n switch (group.type) {\n case \"select\":\n case \"load-balance\":\n case \"url-test\":\n case \"fallback\":\n break;\n case \"ssid\":\n if (group.proxies.length < 2) {\n continue;\n }\n lines.push(\n `${group.name} = ssid,default=${group.proxies[0]},${group.proxies.slice(1).join(\",\")}`,\n );\n continue;\n default:\n continue;\n }\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n let groupLine = `${group.type},${filtered.join(\",\")}`;\n if (group.type !== \"select\") {\n groupLine += `,url=${group.url},interval=${group.interval}`;\n if (group.type === \"load-balance\") {\n groupLine += `,algorithm=${group.strategy === \"round-robin\" ? \"round-robin\" : \"pcc\"}`;\n if (group.timeout > 0) {\n groupLine += `,max-timeout=${group.timeout}`;\n }\n }\n if (group.type === \"url-test\" && group.tolerance > 0) {\n groupLine += `,tolerance=${group.tolerance}`;\n }\n if (group.type === \"fallback\") {\n groupLine += `,max-timeout=${group.timeout}`;\n }\n }\n lines.push(`${group.name} = ${groupLine}`);\n }\n return lines;\n}\n\nexport interface LoonOptions {\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\n/** Convert nodes into a Loon configuration string. */\nexport function toLoon(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: LoonOptions,\n): string {\n const remarksList: string[] = [];\n const proxyLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildLoonNode(x, settings, remark);\n if (line === undefined) {\n continue;\n }\n proxyLines.push(`${remark} = ${line}`);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return proxyLines.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"Proxy\", proxyLines);\n const groupLines = buildLoonGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"Proxy Group\", groupLines);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setRawSection(sections, options.rules.section, options.rules.lines);\n }\n return renderRawIni(sections);\n}\n","import type { RulesetContent, RulesetType } from \"../types/ruleset\";\nimport { RulesetType as RulesetTypeEnum } from \"../types/ruleset\";\n\nconst BASIC_TYPES = [\n \"DOMAIN\",\n \"DOMAIN-SUFFIX\",\n \"DOMAIN-KEYWORD\",\n \"IP-CIDR\",\n \"SRC-IP-CIDR\",\n \"GEOIP\",\n \"MATCH\",\n \"FINAL\",\n];\n\nexport const CLASH_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"SRC-PORT\",\n \"DST-PORT\",\n \"PROCESS-NAME\",\n];\n\nexport const SURGE2_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"USER-AGENT\",\n \"URL-REGEX\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nexport const SURGE_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"USER-AGENT\",\n \"URL-REGEX\",\n \"AND\",\n \"OR\",\n \"NOT\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nexport const QUANX_RULE_TYPES = [\n ...BASIC_TYPES,\n \"USER-AGENT\",\n \"HOST\",\n \"HOST-SUFFIX\",\n \"HOST-KEYWORD\",\n];\n\nexport const SURF_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-CIDR6\",\n \"PROCESS-NAME\",\n \"IN-PORT\",\n \"DEST-PORT\",\n \"SRC-IP\",\n];\n\nfunction isIpv4(value: string): boolean {\n const parts = value.split(\".\");\n return parts.length === 4 && parts.every((p) => /^\\d{1,3}$/.test(p) && Number(p) <= 255);\n}\n\nfunction stripComment(line: string): string {\n const idx = line.indexOf(\"//\");\n return (idx >= 0 ? line.slice(0, idx) : line).trim();\n}\n\nfunction isRuleLine(line: string): boolean {\n return line.length > 0 && line[0] !== \";\" && line[0] !== \"#\" && !line.startsWith(\"//\");\n}\n\n/**\n * Convert a ruleset body into the common `TYPE,VALUE[,flag]` Surge dialect.\n * Mirrors ruleconvert.cpp `convertRuleset`.\n */\nexport function convertRuleset(content: string, type: RulesetType): string {\n if (type === RulesetTypeEnum.Surge) {\n return content;\n }\n\n if (/^payload:\\r?\\n/.test(content)) {\n let output = content.replace(/payload:\\r?\\n/, \"\");\n output = output.replace(/^\\s*-\\s+(['\"]?)(.*?)\\1\\s*$/gm, \"$2\");\n if (type === RulesetTypeEnum.ClashClassical) {\n return output;\n }\n const lines: string[] = [];\n for (let raw of output.split(/\\r?\\n/)) {\n raw = raw.trim();\n if (raw.includes(\"//\")) {\n raw = stripComment(raw);\n }\n if (!isRuleLine(raw)) {\n continue;\n }\n let prefix: string;\n if (raw.includes(\"/\")) {\n prefix = isIpv4(raw.slice(0, raw.indexOf(\"/\"))) ? \"IP-CIDR,\" : \"IP-CIDR6,\";\n } else if (raw.startsWith(\".\") || raw.startsWith(\"+.\")) {\n let keyword = false;\n let value = raw;\n while (value.endsWith(\".*\")) {\n keyword = true;\n value = value.slice(0, -2);\n }\n prefix = keyword ? \"DOMAIN-KEYWORD,\" : \"DOMAIN-SUFFIX,\";\n value = value.slice(value.startsWith(\"+.\") ? 2 : value.startsWith(\".\") ? 1 : 0);\n lines.push(prefix + value);\n continue;\n } else {\n prefix = \"DOMAIN,\";\n }\n lines.push(prefix + raw);\n }\n return lines.join(\"\\n\");\n }\n\n // QuanX dialect.\n const lines: string[] = [];\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line === \"\" || line.startsWith(\"#\") || line.startsWith(\";\")) {\n continue;\n }\n const normalized = line.replace(/^host/i, \"DOMAIN\").replace(/^ip6-cidr/i, \"IP-CIDR6\");\n const match =\n /^(DOMAIN(?:-(?:SUFFIX|KEYWORD))?|IP-CIDR6?|USER-AGENT),\\s*?(\\S*?)(?:,(?!no-resolve).*?)(,no-resolve)?$/i.exec(\n normalized,\n );\n if (match) {\n const ruleType = (match[1] as string).toUpperCase();\n const value = match[2] as string;\n lines.push(`${ruleType},${value}${match[3] ?? \"\"}`);\n } else {\n lines.push(normalized);\n }\n }\n return lines.join(\"\\n\");\n}\n\n/** Rewrite `TYPE,VALUE[,flag]` into `TYPE,VALUE,GROUP[,flag]`. */\nexport function transformRuleToCommon(input: string, group: string, noResolveOnly = false): string {\n const parts = input.split(\",\");\n if (parts.length < 2) {\n return `${parts[0] ?? \"\"},${group}`;\n }\n let line = `${parts[0]},${parts[1]},${group}`;\n if (parts.length > 2 && (!noResolveOnly || parts[2] === \"no-resolve\")) {\n line += `,${parts[2]}`;\n }\n return line;\n}\n\nfunction startsWithAny(line: string, types: string[]): boolean {\n return types.some((type) => line.startsWith(type));\n}\n\nfunction collectRuleLines(content: string, group: string, noResolveOnly: boolean): string[] {\n const converted = convertRuleset(content, RulesetTypeEnum.Surge);\n const out: string[] = [];\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n if (line === \"\") {\n continue;\n }\n out.push(transformRuleToCommon(line, group, noResolveOnly));\n }\n return out;\n}\n\n/** Convert rulesets into an ordered list of Clash rule strings. */\nexport function rulesetToClashRules(rulesets: RulesetContent[]): string[] {\n const rules: string[] = [];\n for (const ruleset of rulesets) {\n const content = ruleset.content;\n if (content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (content.startsWith(\"[]\")) {\n let line = content.slice(2);\n if (line.startsWith(\"FINAL\")) {\n line = `MATCH${line.slice(5)}`;\n }\n rules.push(transformRuleToCommon(line, group));\n continue;\n }\n const converted = convertRuleset(content, ruleset.ruleType);\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (!startsWithAny(line, CLASH_RULE_TYPES)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n rules.push(transformRuleToCommon(line, group));\n }\n }\n return rules;\n}\n\nexport interface SurgeRulesetResult {\n section: string;\n lines: string[];\n}\n\n/** Convert rulesets into Surge/QuanX/Quan/Loon rule lines. */\nexport function rulesetToSurgeRules(\n rulesets: RulesetContent[],\n surgeVersion: number,\n): SurgeRulesetResult {\n let section: string;\n let allowed: string[];\n let noResolveOnly = false;\n switch (surgeVersion) {\n case 0:\n section = \"RoutingRule\";\n allowed = SURGE_RULE_TYPES;\n break;\n case -1:\n section = \"filter_local\";\n allowed = QUANX_RULE_TYPES;\n noResolveOnly = true;\n break;\n case -2:\n section = \"TCP\";\n allowed = QUANX_RULE_TYPES;\n noResolveOnly = true;\n break;\n case -3:\n section = \"Rule\";\n allowed = SURF_RULE_TYPES;\n break;\n case -4:\n section = \"Rule\";\n allowed = SURGE_RULE_TYPES;\n break;\n default:\n section = \"Rule\";\n allowed = surgeVersion > 2 ? SURGE_RULE_TYPES : SURGE2_RULE_TYPES;\n break;\n }\n const lines: string[] = [];\n for (const ruleset of rulesets) {\n if (ruleset.content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (ruleset.content.startsWith(\"[]\")) {\n let line = ruleset.content.slice(2);\n if (line === \"MATCH\") {\n line = \"FINAL\";\n }\n if (surgeVersion === -1 || surgeVersion === -2) {\n line = transformRuleToCommon(line, group, true);\n } else if (!line.startsWith(\"AND\") && !line.startsWith(\"OR\") && !line.startsWith(\"NOT\")) {\n line = transformRuleToCommon(line, group);\n }\n lines.push(line.replace(/,,/g, \",\"));\n continue;\n }\n for (const rawLine of collectRuleLines(ruleset.content, group, noResolveOnly)) {\n if (surgeVersion === -2 && rawLine.startsWith(\"IP-CIDR6\")) {\n continue;\n }\n if (!startsWithAny(rawLine, allowed)) {\n continue;\n }\n const line =\n surgeVersion === -1 || surgeVersion === -2\n ? rawLine.replace(/^IP-CIDR6/, \"IP6-CIDR\")\n : rawLine;\n lines.push(line);\n }\n }\n return { lines, section };\n}\n\nexport const SING_BOX_RULE_TYPES = [\n ...BASIC_TYPES,\n \"IP-VERSION\",\n \"INBOUND\",\n \"PROTOCOL\",\n \"NETWORK\",\n \"GEOSITE\",\n \"SRC-GEOIP\",\n \"DOMAIN-REGEX\",\n \"PROCESS-NAME\",\n \"PROCESS-PATH\",\n \"PACKAGE-NAME\",\n \"PORT\",\n \"PORT-RANGE\",\n \"SRC-PORT\",\n \"SRC-PORT-RANGE\",\n \"USER\",\n \"USER-ID\",\n];\n\n/** A sing-box `route` fragment produced from rulesets. */\nexport interface SingBoxRoute {\n rules: Record<string, unknown>[];\n final: string;\n}\n\nfunction toSingBoxKey(type: string): string {\n return type\n .toLowerCase()\n .replace(/-/g, \"_\")\n .replace(/ip_cidr6/g, \"ip_cidr\")\n .replace(/src_/g, \"source_\");\n}\n\n/**\n * Convert rulesets into a sing-box `route` fragment.\n * Mirrors ruleconvert.cpp `rulesetToSingBox`.\n */\nexport function rulesetToSingBoxRules(rulesets: RulesetContent[]): SingBoxRoute {\n const rules: Record<string, unknown>[] = [{ outbound: \"dns-out\", protocol: \"dns\" }];\n let final = \"\";\n\n for (const ruleset of rulesets) {\n const content = ruleset.content;\n if (content === \"\") {\n continue;\n }\n const group = ruleset.ruleGroup;\n if (content.startsWith(\"[]\")) {\n const line = content.slice(2);\n if (line.startsWith(\"FINAL\") || line.startsWith(\"MATCH\")) {\n final = group;\n continue;\n }\n const parts = line.split(\",\");\n if (parts.length < 2) {\n continue;\n }\n const type = toSingBoxKey(parts[0] as string);\n const value = (parts[1] as string).toLowerCase();\n if (type === \"match\" || type === \"final\") {\n rules.push({ outbound: value });\n } else {\n rules.push({ outbound: group, [type]: value });\n }\n continue;\n }\n\n const converted = convertRuleset(content, ruleset.ruleType);\n const rule: Record<string, unknown> = {};\n for (const rawLine of converted.split(/\\r?\\n/)) {\n let line = rawLine.trim();\n if (!isRuleLine(line)) {\n continue;\n }\n if (line.includes(\"//\")) {\n line = stripComment(line);\n }\n const args = line.split(\",\");\n if (args.length < 2) {\n continue;\n }\n const rawType = args[0] as string;\n if (!SING_BOX_RULE_TYPES.includes(rawType)) {\n continue;\n }\n const key = toSingBoxKey(rawType);\n const value = (args[1] as string).toLowerCase();\n const bucket = (rule[key] as string[] | undefined) ?? [];\n bucket.push(value);\n rule[key] = bucket;\n }\n if (Object.keys(rule).length === 0) {\n continue;\n }\n rule.outbound = group;\n rules.push(rule);\n }\n\n return { final, rules };\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { rulesetToSurgeRules } from \"./ruleset\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { RulesetContent } from \"../types/ruleset\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { urlSafeBase64Encode } from \"../utils/base64\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { urlEncode } from \"../utils/url\";\n\nfunction buildMellowEndpoint(x: Proxy, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n switch (x.type) {\n case ProxyType.Shadowsocks:\n if (x.plugin !== \"\") {\n return undefined;\n }\n return `${remark}, ss, ss://${urlSafeBase64Encode(`${x.encryptMethod}:${x.password}`)}@${hostname}:${port}`;\n case ProxyType.VMess: {\n let proxy = `${remark}, vmess1, vmess1://${x.userId}@${hostname}:${port}`;\n if (x.path !== \"\") {\n proxy += x.path;\n }\n proxy += `?network=${x.transferProtocol}`;\n switch (x.transferProtocol) {\n case \"ws\":\n proxy += `&ws.host=${urlEncode(x.host)}`;\n break;\n case \"http\":\n if (x.host !== \"\") {\n proxy += `&http.host=${urlEncode(x.host)}`;\n }\n break;\n case \"quic\":\n if (x.quicSecure !== \"\" || x.quicSecret !== \"\") {\n proxy += `&quic.security=${x.quicSecure}&quic.key=${x.quicSecret}`;\n }\n break;\n default:\n break;\n }\n proxy += `&tls=${x.tlsSecure ? \"true\" : \"false\"}`;\n if (x.tlsSecure && x.host !== \"\") {\n proxy += `&tls.servername=${urlEncode(x.host)}`;\n }\n if (x.allowInsecure !== undefined) {\n proxy += `&tls.allowinsecure=${x.allowInsecure ? \"true\" : \"false\"}`;\n }\n if (x.tcpFastOpen !== undefined) {\n proxy += `&sockopt.tcpfastopen=${x.tcpFastOpen ? \"true\" : \"false\"}`;\n }\n return proxy;\n }\n case ProxyType.SOCKS5:\n return `${remark}, builtin, socks, address=${hostname}, port=${port}, user=${x.username}, pass=${x.password}`;\n case ProxyType.HTTP:\n return `${remark}, builtin, http, address=${hostname}, port=${port}, user=${x.username}, pass=${x.password}`;\n default:\n return undefined;\n }\n}\n\nfunction buildMellowGroups(\n extraProxyGroup: ProxyGroupConfig[],\n nodelist: Proxy[],\n remarks: string[],\n): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n switch (group.type) {\n case \"select\":\n case \"url-test\":\n case \"fallback\":\n case \"load-balance\":\n break;\n default:\n continue;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, false);\n }\n if (filtered.length === 0) {\n if (remarks.length === 0) {\n filtered.push(\"DIRECT\");\n } else {\n filtered.push(...remarks);\n }\n }\n lines.push(`${group.name}, ${filtered.join(\":\")}, latency, interval=300, timeout=6`);\n }\n return lines;\n}\n\nexport interface MellowOptions {\n baseConf: string;\n nodeList: boolean;\n rulesets?: RulesetContent[];\n overwriteOriginalRules?: boolean;\n}\n\n/** Convert nodes into a Mellow (`mellow.conf`) configuration string. */\nexport function toMellow(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: MellowOptions,\n): string {\n const remarksList: string[] = [];\n const endpoints: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildMellowEndpoint(x, remark);\n if (line === undefined) {\n continue;\n }\n endpoints.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return endpoints.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n const append = (name: string, lines: string[]): void => {\n if (lines.length === 0) {\n return;\n }\n const existing = sections.find((section) => section.name === name);\n if (existing && !(options.overwriteOriginalRules ?? true)) {\n existing.lines.push(...lines);\n } else {\n setRawSection(sections, name, lines);\n }\n };\n append(\"Endpoint\", endpoints);\n append(\"EndpointGroup\", buildMellowGroups(extraProxyGroup, nodelist, remarksList));\n if (options.rulesets && options.rulesets.length > 0) {\n const rules = rulesetToSurgeRules(options.rulesets, 0);\n append(rules.section, rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode, urlSafeBase64Encode } from \"../utils/base64\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { urlEncode } from \"../utils/url\";\n\nfunction buildQuanNode(\n x: Proxy,\n settings: ExtraSettings,\n remark: string,\n nodeList: boolean,\n): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n const group = x.group;\n let method = x.encryptMethod;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxyStr: string;\n switch (x.type) {\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxyStr = `${remark} = vmess, ${hostname}, ${port}, ${method}, \"${x.userId}\", group=${group}`;\n if (x.tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (x.transferProtocol === \"ws\") {\n proxyStr += `, obfs=ws, obfs-path=\"${x.path}\", obfs-header=\"Host: ${x.host}`;\n if (x.edge !== \"\") {\n proxyStr += `[Rr][Nn]Edge: ${x.edge}`;\n }\n proxyStr += '\"';\n }\n if (nodeList) {\n proxyStr = `vmess://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n case ProxyType.ShadowsocksR:\n if (nodeList) {\n proxyStr = `ssr://${urlSafeBase64Encode(\n `${hostname}:${port}:${x.protocol}:${method}:${x.obfs}:${urlSafeBase64Encode(x.password)}` +\n `/?group=${urlSafeBase64Encode(group)}&remarks=${urlSafeBase64Encode(remark)}` +\n `&obfsparam=${urlSafeBase64Encode(x.obfsParam)}&protoparam=${urlSafeBase64Encode(x.protocolParam)}`,\n )}`;\n } else {\n proxyStr = `${remark} = shadowsocksr, ${hostname}, ${port}, ${method}, \"${x.password}\", group=${group}, protocol=${x.protocol}, obfs=${x.obfs}`;\n if (x.protocolParam !== \"\") {\n proxyStr += `, protocol_param=${x.protocolParam}`;\n }\n if (x.obfsParam !== \"\") {\n proxyStr += `, obfs_param=${x.obfsParam}`;\n }\n }\n break;\n case ProxyType.Shadowsocks:\n if (nodeList) {\n proxyStr = `ss://${urlSafeBase64Encode(`${method}:${x.password}`)}@${hostname}:${port}`;\n if (x.plugin !== \"\" && x.pluginOption !== \"\") {\n proxyStr += `/?plugin=${urlEncode(`${x.plugin};${x.pluginOption}`)}`;\n }\n proxyStr += `&group=${urlSafeBase64Encode(group)}#${urlEncode(remark)}`;\n } else {\n proxyStr = `${remark} = shadowsocks, ${hostname}, ${port}, ${method}, \"${x.password}\", group=${group}`;\n if (x.plugin === \"obfs-local\" && x.pluginOption !== \"\") {\n proxyStr += `, ${x.pluginOption.replace(/;/g, \", \")}`;\n }\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxyStr = `${remark} = http, upstream-proxy-address=${hostname}, upstream-proxy-port=${port}, group=${group}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, upstream-proxy-auth=true, upstream-proxy-username=${x.username}, upstream-proxy-password=${x.password}`;\n } else {\n proxyStr += \", upstream-proxy-auth=false\";\n }\n if (x.tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (x.host !== \"\") {\n proxyStr += `, tls-host=${x.host}`;\n }\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (nodeList) {\n proxyStr = `http://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n case ProxyType.SOCKS5:\n proxyStr = `${remark} = socks, upstream-proxy-address=${hostname}, upstream-proxy-port=${port}, group=${group}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, upstream-proxy-auth=true, upstream-proxy-username=${x.username}, upstream-proxy-password=${x.password}`;\n } else {\n proxyStr += \", upstream-proxy-auth=false\";\n }\n if (x.tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (x.host !== \"\") {\n proxyStr += `, tls-host=${x.host}`;\n }\n if (scv !== undefined) {\n proxyStr += `, certificate=${scv ? \"0\" : \"1\"}`;\n }\n }\n if (nodeList) {\n proxyStr = `socks://${urlSafeBase64Encode(proxyStr)}`;\n }\n break;\n default:\n return undefined;\n }\n return proxyStr;\n}\n\nfunction buildQuanGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n let type: string;\n switch (group.type) {\n case \"select\":\n case \"fallback\":\n type = \"static\";\n break;\n case \"url-test\":\n type = \"auto\";\n break;\n case \"load-balance\":\n type = \"balance, round-robin\";\n break;\n case \"ssid\": {\n let singlegroup = `${group.name} : wifi = ${group.proxies[0] ?? \"\"}`;\n let content = \"\";\n let celluar = \"\";\n for (const proxy of group.proxies.slice(1)) {\n const m = /^(.*?),?celluar\\s?=\\s?(.*?)(,.*)$/.exec(proxy);\n if (!m) {\n content += `${proxy}\\n`;\n continue;\n }\n celluar = m[2] as string;\n content += `${m[1] as string}${m[3] as string}\\n`;\n }\n if (celluar !== \"\") {\n singlegroup += `, celluar = ${celluar}`;\n }\n singlegroup += `\\n${content.trim().replace(/^,|,$/g, \"\").replace(/,/g, \"\\n\")}`;\n lines.push(base64Encode(singlegroup));\n continue;\n }\n default:\n continue;\n }\n\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"direct\");\n }\n if (filtered.length < 2) {\n type = \"static\";\n }\n const proxies = filtered.join(\"\\n\");\n let singlegroup = `${group.name} : ${type}`;\n if (type === \"static\") {\n singlegroup += `, ${filtered[0] as string}`;\n }\n singlegroup += `\\n${proxies}\\n`;\n lines.push(base64Encode(singlegroup));\n }\n return lines;\n}\n\nexport interface QuanOptions {\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\n/** Convert nodes into a Quantumult configuration string. */\nexport function toQuan(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: QuanOptions,\n): string {\n const remarksList: string[] = [];\n const serverLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildQuanNode(x, settings, remark, options.nodeList);\n if (line === undefined) {\n continue;\n }\n serverLines.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return base64Encode(serverLines.join(\"\\n\"));\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"SERVER\", serverLines);\n const groupLines = buildQuanGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"POLICY\", groupLines);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setRawSection(sections, options.rules.section, options.rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { parseRawIni, renderRawIni, setRawSection, type RawIniSection } from \"../utils/ini\";\nimport { getUrlArg } from \"../utils/url\";\n\nfunction triStr(value: boolean | undefined): string {\n return value ? \"true\" : \"false\";\n}\n\nfunction buildQuanxNode(x: Proxy, settings: ExtraSettings, remark: string): string | undefined {\n const hostname = x.hostname;\n const port = String(x.port);\n let method = x.encryptMethod;\n let plugin = x.plugin;\n let pluginOption = x.pluginOption;\n let host = x.host;\n let path = x.path;\n let tlsSecure = x.tlsSecure;\n\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n const tls13 = x.tls13 !== undefined ? x.tls13 : settings.tls13;\n\n let proxyStr: string;\n switch (x.type) {\n case ProxyType.VMess:\n if (method === \"auto\") {\n method = \"chacha20-ietf-poly1305\";\n }\n proxyStr = `vmess = ${hostname}:${port}, method=${method}, password=${x.userId}`;\n if (x.alterId !== 0) {\n proxyStr += \", aead=false\";\n }\n if (tlsSecure && tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n if (x.transferProtocol === \"ws\") {\n proxyStr += tlsSecure ? \", obfs=wss\" : \", obfs=ws\";\n proxyStr += `, obfs-host=${host}, obfs-uri=${path}`;\n } else if (tlsSecure) {\n proxyStr += `, obfs=over-tls, obfs-host=${host}`;\n }\n break;\n case ProxyType.Shadowsocks:\n proxyStr = `shadowsocks = ${hostname}:${port}, method=${method}, password=${x.password}`;\n if (plugin !== \"\") {\n if (plugin === \"simple-obfs\" || plugin === \"obfs-local\") {\n if (pluginOption !== \"\") {\n proxyStr += `, ${pluginOption.replace(/;/g, \", \")}`;\n }\n } else if (plugin === \"v2ray-plugin\") {\n pluginOption = pluginOption.replace(/;/g, \"&\");\n plugin = getUrlArg(pluginOption, \"mode\") === \"websocket\" ? \"ws\" : \"\";\n host = getUrlArg(pluginOption, \"host\");\n path = getUrlArg(pluginOption, \"path\");\n tlsSecure = pluginOption.includes(\"tls\");\n if (tlsSecure && plugin === \"ws\") {\n plugin += \"s\";\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n }\n proxyStr += `, obfs=${plugin}`;\n if (host !== \"\") {\n proxyStr += `, obfs-host=${host}`;\n }\n if (path !== \"\") {\n proxyStr += `, obfs-uri=${path}`;\n }\n } else {\n return undefined;\n }\n }\n break;\n case ProxyType.ShadowsocksR:\n proxyStr = `shadowsocks = ${hostname}:${port}, method=${method}, password=${x.password}, ssr-protocol=${x.protocol}`;\n if (x.protocolParam !== \"\") {\n proxyStr += `, ssr-protocol-param=${x.protocolParam}`;\n }\n proxyStr += `, obfs=${x.obfs}`;\n if (x.obfsParam !== \"\") {\n proxyStr += `, obfs-host=${x.obfsParam}`;\n }\n break;\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxyStr = `http = ${hostname}:${port}, username=${x.username === \"\" ? \"none\" : x.username}, password=${x.password === \"\" ? \"none\" : x.password}`;\n if (tlsSecure) {\n proxyStr += \", over-tls=true\";\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n break;\n case ProxyType.Trojan:\n proxyStr = `trojan = ${hostname}:${port}, password=${x.password}`;\n if (tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n break;\n case ProxyType.SOCKS5:\n proxyStr = `socks5 = ${hostname}:${port}`;\n if (x.username !== \"\" && x.password !== \"\") {\n proxyStr += `, username=${x.username}, password=${x.password}`;\n if (tlsSecure) {\n proxyStr += `, over-tls=true, tls-host=${x.host}`;\n if (tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n } else {\n proxyStr += \", over-tls=false\";\n }\n }\n break;\n case ProxyType.VLESS: {\n const vmethod = method === \"\" ? \"none\" : method;\n proxyStr = `vless = ${hostname}:${port}, method=${vmethod}, password=${x.userId}`;\n if (tlsSecure && tls13 !== undefined) {\n proxyStr += `, tls13=${triStr(tls13)}`;\n }\n const obfsHost = host !== \"\" ? host : x.serverName !== \"\" ? x.serverName : x.sni;\n if (x.transferProtocol === \"ws\") {\n proxyStr += tlsSecure ? \", obfs=wss\" : \", obfs=ws\";\n proxyStr += `, obfs-host=${obfsHost}, obfs-uri=${path}`;\n } else if (tlsSecure) {\n proxyStr += `, obfs=over-tls, obfs-host=${obfsHost}`;\n }\n if (x.publicKey !== \"\") {\n proxyStr += `, reality-base64-pubkey=${x.publicKey}`;\n }\n if (x.shortId !== \"\") {\n proxyStr += `, reality-hex-shortid=${x.shortId}`;\n }\n if (x.flow !== \"\") {\n proxyStr += `, vless-flow=${x.flow}`;\n }\n break;\n }\n // Quantumult X has no AnyTLS/Hysteria2/TUIC mapping — drop them instead\n // of emitting non-standard lines.\n default:\n return undefined;\n }\n if (tfo !== undefined) {\n proxyStr += `, fast-open=${triStr(tfo)}`;\n }\n if (udp !== undefined) {\n proxyStr += `, udp-relay=${triStr(udp)}`;\n }\n if (\n tlsSecure &&\n scv !== undefined &&\n x.type !== ProxyType.Shadowsocks &&\n x.type !== ProxyType.ShadowsocksR\n ) {\n proxyStr += `, tls-verification=${scv ? \"false\" : \"true\"}`;\n }\n proxyStr += `, tag=${remark}`;\n return proxyStr;\n}\n\nfunction buildQuanxGroups(extraProxyGroup: ProxyGroupConfig[], nodelist: Proxy[]): string[] {\n const lines: string[] = [];\n for (const group of extraProxyGroup) {\n let type: string;\n const filtered: string[] = [];\n switch (group.type) {\n case \"select\":\n type = \"static\";\n break;\n case \"url-test\":\n type = \"url-latency-benchmark\";\n break;\n case \"fallback\":\n type = \"available\";\n break;\n case \"load-balance\":\n type = \"round-robin\";\n break;\n case \"ssid\":\n type = \"ssid\";\n for (const proxy of group.proxies) {\n filtered.push(proxy.replace(/=/g, \":\"));\n }\n break;\n default:\n continue;\n }\n if (group.type !== \"ssid\") {\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"direct\");\n }\n if (filtered.length < 2) {\n type = \"static\";\n }\n }\n const proxies = filtered.join(\", \");\n let line = `${type}=${group.name}, ${proxies}`;\n if (group.type !== \"select\" && group.type !== \"ssid\") {\n line += `, check-interval=${group.interval}`;\n if (group.tolerance > 0) {\n line += `, tolerance=${group.tolerance}`;\n }\n }\n lines.push(line);\n }\n return lines;\n}\n\nexport interface QuanxOptions {\n baseConf: string;\n nodeList: boolean;\n /** Rule lines to inject, plus the section name to place them in. */\n rules?: { section: string; lines: string[] };\n}\n\n/** Convert nodes into a Quantumult X configuration string. */\nexport function toQuanX(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: QuanxOptions,\n): string {\n const remarksList: string[] = [];\n const serverLines: string[] = [];\n const nodelist: Proxy[] = [];\n\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList);\n x.remark = remark;\n const line = buildQuanxNode(x, settings, remark);\n if (line === undefined) {\n continue;\n }\n serverLines.push(line);\n remarksList.push(remark);\n nodelist.push(x);\n }\n\n if (options.nodeList) {\n return serverLines.join(\"\\n\");\n }\n\n const sections: RawIniSection[] = options.baseConf === \"\" ? [] : parseRawIni(options.baseConf);\n setRawSection(sections, \"server_local\", serverLines);\n const groupLines = buildQuanxGroups(extraProxyGroup, nodelist);\n if (groupLines.length > 0) {\n setRawSection(sections, \"policy\", groupLines);\n }\n if (options.rules && options.rules.lines.length > 0) {\n setRawSection(sections, options.rules.section, options.rules.lines);\n }\n return renderRawIni(sections);\n}\n","import { groupGenerate, processRemark } from \"./nodes\";\nimport { rulesetToSingBoxRules } from \"./ruleset\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType, proxyTypeName } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { RulesetContent } from \"../types/ruleset\";\nimport type { ExtraSettings } from \"../types/settings\";\nimport { base64Encode } from \"../utils/base64\";\n\n/** Format a sing-box duration string from seconds (e.g. 3660 → `1h1m`). */\nexport function formatSingBoxInterval(interval: number): string {\n let remaining = interval;\n let result = \"\";\n if (remaining >= 3600) {\n result += `${Math.floor(remaining / 3600)}h`;\n remaining %= 3600;\n }\n if (remaining >= 60) {\n result += `${Math.floor(remaining / 60)}m`;\n remaining %= 60;\n }\n if (remaining > 0) {\n result += `${remaining}s`;\n }\n return result;\n}\n\nfunction buildTransport(proxy: Proxy): Record<string, unknown> | undefined {\n switch (proxy.transferProtocol) {\n case \"http\":\n return undefined;\n case \"ws\": {\n const headers: Record<string, string> = {};\n if (proxy.host !== \"\") {\n headers.Host = proxy.host;\n }\n if (proxy.edge !== \"\") {\n headers.Edge = proxy.edge;\n }\n return {\n headers,\n path: proxy.path === \"\" ? \"/\" : proxy.path,\n type: \"ws\",\n };\n }\n case \"grpc\":\n return {\n ...(proxy.path !== \"\" ? { service_name: proxy.path } : {}),\n type: \"grpc\",\n };\n default:\n return undefined;\n }\n}\n\nfunction buildTls(x: Proxy, scv: boolean | undefined): Record<string, unknown> | undefined {\n if (!x.tlsSecure) {\n return undefined;\n }\n const tls: Record<string, unknown> = { enabled: true, insecure: scv === true };\n if (x.serverName !== \"\") {\n tls.server_name = x.serverName;\n } else if (x.host !== \"\") {\n tls.server_name = x.host;\n } else if (x.sni !== \"\") {\n tls.server_name = x.sni;\n }\n if (x.alpn.length > 0) {\n tls.alpn = x.alpn;\n }\n if (x.ca !== \"\") {\n tls.certificate = x.ca;\n }\n if (x.caStr !== \"\") {\n tls.certificate = x.caStr;\n }\n return tls;\n}\n\nfunction buildOutbound(\n x: Proxy,\n settings: ExtraSettings,\n remark: string,\n): Record<string, unknown> | undefined {\n const common = {\n server: x.hostname,\n server_port: x.port,\n tag: remark,\n };\n const udp = x.udp !== undefined ? x.udp : settings.udp;\n const tfo = x.tcpFastOpen !== undefined ? x.tcpFastOpen : settings.tfo;\n const scv = x.allowInsecure !== undefined ? x.allowInsecure : settings.skipCertVerify;\n\n let proxy: Record<string, unknown>;\n switch (x.type) {\n case ProxyType.Shadowsocks: {\n const out: Record<string, unknown> = {\n ...common,\n method: x.encryptMethod,\n password: x.password,\n type: \"shadowsocks\",\n };\n if (x.plugin !== \"\" && x.pluginOption !== \"\") {\n out.plugin = x.plugin === \"simple-obfs\" ? \"obfs-local\" : x.plugin;\n out.plugin_opts = x.pluginOption;\n }\n proxy = out;\n break;\n }\n // sing-box has no SSR support — drop such nodes.\n case ProxyType.ShadowsocksR:\n return undefined;\n case ProxyType.VMess: {\n const out: Record<string, unknown> = {\n ...common,\n alter_id: x.alterId,\n security: x.encryptMethod,\n type: \"vmess\",\n uuid: x.userId,\n };\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.VLESS: {\n const out: Record<string, unknown> = { ...common, type: \"vless\", uuid: x.userId };\n if (x.flow !== \"\") {\n out.flow = x.flow;\n }\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.Trojan: {\n const out: Record<string, unknown> = { ...common, password: x.password, type: \"trojan\" };\n const transport = buildTransport(x);\n if (transport) {\n out.transport = transport;\n }\n proxy = out;\n break;\n }\n case ProxyType.TUIC: {\n const out: Record<string, unknown> = {\n ...common,\n password: x.password,\n type: \"tuic\",\n udp_relay_mode: \"native\",\n uuid: x.userId,\n };\n if (x.congestionControl !== \"\") {\n out.congestion_control = x.congestionControl;\n }\n proxy = out;\n break;\n }\n case ProxyType.WireGuard: {\n const addresses = [x.selfIp];\n if (x.selfIpv6 !== \"\") {\n addresses.push(x.selfIpv6);\n }\n const peer: Record<string, unknown> = {\n public_key: x.publicKey,\n server: x.hostname,\n server_port: x.port,\n };\n if (x.preSharedKey !== \"\") {\n peer.pre_shared_key = x.preSharedKey;\n }\n if (x.allowedIps !== \"\") {\n peer.allowed_ips = x.allowedIps.split(\",\").map((s) => s.trim());\n }\n if (x.clientId !== \"\") {\n peer.reserved = x.clientId.split(\",\").map((s) => Number(s.trim()));\n }\n proxy = {\n local_address: addresses,\n mtu: x.mtu,\n peers: [peer],\n private_key: x.privateKey,\n tag: remark,\n type: \"wireguard\",\n };\n break;\n }\n case ProxyType.Hysteria: {\n const out: Record<string, unknown> = { ...common, type: \"hysteria\" };\n if (x.up !== \"\") {\n out.up_mbps = x.upSpeed;\n }\n if (x.down !== \"\") {\n out.down_mbps = x.downSpeed;\n }\n if (x.obfs !== \"\") {\n out.obfs = x.obfs;\n }\n if (x.authStr !== \"\") {\n out.auth_str = x.authStr;\n out.auth = base64Encode(x.authStr);\n }\n if (x.recvWindowConn) {\n out.recv_window_conn = x.recvWindowConn;\n }\n if (x.recvWindow) {\n out.recv_window = x.recvWindow;\n }\n if (x.disableMtuDiscovery !== undefined) {\n out.disable_mtu_discovery = x.disableMtuDiscovery;\n }\n proxy = out;\n break;\n }\n case ProxyType.Hysteria2: {\n const out: Record<string, unknown> = { ...common, type: \"hysteria2\" };\n if (x.ports !== \"\") {\n out.server_ports = x.ports\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\")\n .map((p) => (/^\\d+$/.test(p) ? `${p}:${p}` : p));\n }\n if (x.upSpeed) {\n out.up_mbps = x.upSpeed;\n }\n if (x.downSpeed) {\n out.down_mbps = x.downSpeed;\n }\n if (x.obfs !== \"\") {\n out.obfs = {\n ...(x.obfsParam !== \"\" ? { password: x.obfsParam } : {}),\n type: x.obfs,\n };\n }\n if (x.password !== \"\") {\n out.password = x.password;\n }\n if (x.hopInterval) {\n out.hop_interval = formatSingBoxInterval(x.hopInterval);\n }\n proxy = out;\n break;\n }\n case ProxyType.HTTP:\n case ProxyType.HTTPS:\n proxy = {\n ...common,\n password: x.password,\n type: \"http\",\n username: x.username,\n };\n break;\n case ProxyType.SOCKS5:\n proxy = {\n ...common,\n password: x.password,\n type: \"socks\",\n username: x.username,\n version: \"5\",\n };\n break;\n case ProxyType.AnyTLS:\n proxy = {\n ...common,\n type: \"anytls\",\n users: [{ password: x.password, username: \"sekai\" }],\n };\n break;\n default:\n return undefined;\n }\n\n const tls = buildTls(x, scv);\n if (tls) {\n if (x.type === ProxyType.VLESS && (x.publicKey !== \"\" || x.shortId !== \"\")) {\n const tlsRec = tls as Record<string, unknown>;\n if (x.fingerprint !== \"\") {\n tlsRec.utls = { enabled: true, fingerprint: x.fingerprint };\n }\n tlsRec.reality = {\n enabled: true,\n public_key: x.publicKey,\n short_id: x.shortId,\n };\n }\n proxy.tls = tls;\n }\n if (udp !== undefined && !udp) {\n proxy.network = \"tcp\";\n }\n if (tfo !== undefined) {\n proxy.tcp_fast_open = tfo;\n }\n return proxy;\n}\n\nexport interface SingBoxOptions {\n baseConf: string;\n nodeList: boolean;\n rulesets?: RulesetContent[];\n overwriteOriginalRules?: boolean;\n}\n\n/** Convert nodes into a sing-box configuration JSON string. */\nexport function toSingBox(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SingBoxOptions,\n): string {\n let doc: Record<string, unknown>;\n if (options.nodeList) {\n doc = {};\n } else {\n try {\n doc = (options.baseConf.trim() === \"\" ? {} : JSON.parse(options.baseConf)) as Record<\n string,\n unknown\n >;\n } catch {\n throw new Error(\"sing-box base config is not valid JSON\");\n }\n }\n\n const outbounds: Record<string, unknown>[] = [];\n if (!options.nodeList) {\n outbounds.push({ tag: \"DIRECT\", type: \"direct\" });\n outbounds.push({ tag: \"REJECT\", type: \"block\" });\n outbounds.push({ tag: \"dns-out\", type: \"dns\" });\n }\n\n const remarksList: string[] = [];\n const nodelist: Proxy[] = [];\n for (const x of nodes) {\n if (settings.appendProxyType) {\n x.remark = `[${proxyTypeName(x.type)}] ${x.remark}`;\n }\n const remark = processRemark(x.remark, remarksList, false);\n x.remark = remark;\n const outbound = buildOutbound(x, settings, remark);\n if (!outbound) {\n continue;\n }\n outbounds.push(outbound);\n nodelist.push(x);\n remarksList.push(remark);\n }\n\n if (!options.nodeList) {\n for (const group of extraProxyGroup) {\n let type: string;\n switch (group.type) {\n case \"select\":\n type = \"selector\";\n break;\n case \"url-test\":\n case \"fallback\":\n case \"load-balance\":\n type = \"urltest\";\n break;\n default:\n continue;\n }\n const filtered: string[] = [];\n for (const rule of group.proxies) {\n groupGenerate(rule, nodelist, filtered, true);\n }\n if (filtered.length === 0) {\n filtered.push(\"DIRECT\");\n }\n const entry: Record<string, unknown> = { outbounds: filtered, tag: group.name, type };\n if (group.type === \"url-test\") {\n entry.url = group.url;\n entry.interval = formatSingBoxInterval(group.interval);\n if (group.tolerance > 0) {\n entry.tolerance = group.tolerance;\n }\n }\n outbounds.push(entry);\n }\n }\n\n doc.outbounds = outbounds;\n\n if (\n !options.nodeList &&\n options.rulesets &&\n options.rulesets.length > 0 &&\n settings.enableRuleGenerator\n ) {\n const route = rulesetToSingBoxRules(options.rulesets);\n const existingRoute = doc.route as Record<string, unknown> | undefined;\n const existingRules =\n !(options.overwriteOriginalRules ?? true) &&\n existingRoute &&\n Array.isArray(existingRoute.rules)\n ? (existingRoute.rules as Record<string, unknown>[])\n : [];\n doc.route = {\n ...(existingRoute ?? {}),\n final: route.final,\n rules: [...existingRules, ...route.rules],\n };\n }\n\n return JSON.stringify(doc, null, 2);\n}\n","import { toSurge } from \"./surge\";\nimport type { Proxy } from \"../types/proxy\";\nimport { ProxyType } from \"../types/proxy\";\nimport type { ProxyGroupConfig } from \"../types/proxy-group\";\nimport type { ExtraSettings } from \"../types/settings\";\n\nexport interface SurfboardOptions {\n baseConf: string;\n nodeList: boolean;\n rules?: { section: string; lines: string[] };\n}\n\n/**\n * Convert nodes into a Surfboard configuration.\n *\n * Surfboard is Surge-compatible but drops Hysteria2/AnyTLS nodes while keeping the same\n * latest-Surge proxy-line format for the rest (SS/SSR-less VMess/Trojan/\n * SOCKS/HTTP subset). Reuse the Surge generator on the filtered node list\n * so proxy-line fixes stay in one place.\n */\nexport function toSurfboard(\n nodes: Proxy[],\n extraProxyGroup: ProxyGroupConfig[],\n settings: ExtraSettings,\n options: SurfboardOptions,\n): string {\n const filtered = nodes.filter(\n (n) => n.type !== ProxyType.Hysteria2 && n.type !== ProxyType.AnyTLS,\n );\n return toSurge(filtered, extraProxyGroup, settings, {\n baseConf: options.baseConf,\n nodeList: options.nodeList,\n rules: options.rules,\n version: 5,\n });\n}\n","import { buildClash, stringifyClash } from \"./generator/clash\";\nimport { getDefaultProxyGroups, getDefaultRulesets } from \"./generator/default-profile\";\nimport { proxyToSingle, proxyToSsd, proxyToSsSub } from \"./generator/links\";\nimport { toLoon } from \"./generator/loon\";\nimport { toMellow } from \"./generator/mellow\";\nimport { dedupeNodes, preprocessNodes } from \"./generator/nodes\";\nimport { toQuan } from \"./generator/quan\";\nimport { toQuanX } from \"./generator/quanx\";\nimport { rulesetToClashRules, rulesetToSurgeRules } from \"./generator/ruleset\";\nimport { toSingBox } from \"./generator/singbox\";\nimport { toSurfboard } from \"./generator/surfboard\";\nimport { toSurge } from \"./generator/surge\";\nimport type { Proxy } from \"./types/proxy\";\nimport type { ProxyGroupConfig } from \"./types/proxy-group\";\nimport type { RulesetContent } from \"./types/ruleset\";\nimport type { ExtraSettings } from \"./types/settings\";\nimport { TargetFormat, createExtraSettings } from \"./types/settings\";\n\n/** Options controlling a single conversion. */\nexport interface GenerateOptions {\n target: TargetFormat;\n groups?: ProxyGroupConfig[];\n settings?: Partial<ExtraSettings>;\n baseConf?: string;\n surgeVersion?: number;\n rulesets?: RulesetContent[];\n /**\n * Whether to attach rules (and default proxy groups) like upstream\n * `tindy2013/subconverter` does with e.g. `config=ACL4SSR.ini`.\n *\n * - `true`/`undefined` (default): emit rules; when `rulesets` is empty,\n * fall back to the bundled offline defaults. When `groups` is empty,\n * fall back to the bundled default proxy groups so rule references\n * resolve. Pass `no_rules`/`--no-rules` (`false`) to strip rules.\n * - `false`: never emit rules, even if `rulesets` are provided.\n */\n includeRules?: boolean;\n}\n\nconst V2RAY_TYPE_MASK = 1 | 2 | 4 | 8;\n\n/** Apply rename/emoji/sort preprocessing from settings to nodes. */\nexport function runPreprocess(nodes: Proxy[], settings: ExtraSettings): void {\n preprocessNodes(nodes, {\n addEmoji: settings.addEmoji,\n autoCountry: settings.autoCountry,\n countryLocale: settings.countryLocale,\n countryResolver: settings.countryResolver,\n emojiArray: settings.emojiArray,\n nameRegexArray: settings.nameRegexArray,\n nameRemove: settings.nameRemove,\n removeEmoji: settings.removeEmoji,\n renameArray: settings.renameArray,\n sortFlag: settings.sortFlag,\n });\n if (settings.dedupe) {\n dedupeNodes(nodes);\n }\n}\n\n/**\n * Convert nodes into the requested output format.\n *\n * This is the isomorphic generation entry point used by the CLI, the Node\n * adapter, and the browser build.\n */\nexport function generate(nodes: Proxy[], options: GenerateOptions): string {\n const settings: ExtraSettings = { ...createExtraSettings(), ...options.settings };\n runPreprocess(nodes, settings);\n const groups = resolveGroups(options);\n const rulesets = resolveRulesets(options, settings);\n\n switch (options.target) {\n case TargetFormat.Clash:\n case TargetFormat.ClashR: {\n const { doc } = buildClash(nodes, groups, settings, options.target === TargetFormat.ClashR);\n attachClashRules(doc, settings, rulesets);\n return stringifyClash(doc);\n }\n case TargetFormat.Surge: {\n const surgeVersion = options.surgeVersion ?? 5;\n const rules = rulesets ? rulesetToSurgeRules(rulesets, surgeVersion) : undefined;\n return toSurge(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n version: surgeVersion,\n });\n }\n case TargetFormat.QuantumultX: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, -1) : undefined;\n return toQuanX(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.Quantumult: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, -2) : undefined;\n return toQuan(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.Loon: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, -4) : undefined;\n return toLoon(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.SingBox:\n return toSingBox(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n overwriteOriginalRules: settings.overwriteOriginalRules,\n rulesets,\n });\n case TargetFormat.Mellow:\n return toMellow(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n overwriteOriginalRules: settings.overwriteOriginalRules,\n rulesets,\n });\n case TargetFormat.V2Ray:\n return proxyToSingle(nodes, 4, settings);\n case TargetFormat.Trojan:\n return proxyToSingle(nodes, 8, settings);\n case TargetFormat.Mixed:\n return proxyToSingle(nodes, V2RAY_TYPE_MASK, settings);\n case TargetFormat.SSC:\n return proxyToSingle(nodes, 1, settings);\n case TargetFormat.SSR:\n return proxyToSingle(nodes, 2, settings);\n case TargetFormat.SSD:\n return proxyToSsd(nodes, \"\", \"\");\n case TargetFormat.SSSub:\n return proxyToSsSub(nodes, options.baseConf ?? \"\");\n case TargetFormat.Surfboard: {\n const rules = rulesets ? rulesetToSurgeRules(rulesets, options.surgeVersion ?? 5) : undefined;\n return toSurfboard(nodes, groups, settings, {\n baseConf: options.baseConf ?? \"\",\n nodeList: settings.nodeList,\n rules,\n });\n }\n case TargetFormat.NodeList: {\n settings.nodeList = true;\n return proxyToSingle(nodes, V2RAY_TYPE_MASK, settings);\n }\n default:\n throw new Error(`Unsupported target format: ${options.target}`);\n }\n}\n\n/** Export Shadowsocks nodes as a SIP008 document (`ssconf`). */\nexport function toSip008(nodes: Proxy[], baseConf = \"\"): string {\n return proxyToSsSub(nodes, baseConf);\n}\n\n/** Resolve effective proxy groups, injecting bundled defaults unless opted out. */\nfunction resolveGroups(options: GenerateOptions): ProxyGroupConfig[] {\n if (options.includeRules !== false && (!options.groups || options.groups.length === 0)) {\n return getDefaultProxyGroups();\n }\n return options.groups ?? [];\n}\n\n/**\n * Resolve effective rulesets.\n *\n * - `includeRules: false` always strips rules (`no_rules` / `--no-rules`).\n * - `includeRules: true`/`undefined` (default) falls back to bundled offline\n * defaults when no explicit rulesets are given (mirrors upstream\n * `config=ACL4SSR.ini`).\n * `enableRuleGenerator: false` or `nodeList: true` always strips rules,\n * mirroring upstream `enable_rule_generator` / bare-list semantics.\n */\nfunction resolveRulesets(\n options: GenerateOptions,\n settings: ExtraSettings,\n): RulesetContent[] | undefined {\n if (options.includeRules === false) {\n return undefined;\n }\n if (!settings.enableRuleGenerator || settings.nodeList) {\n return undefined;\n }\n if (options.rulesets && options.rulesets.length > 0) {\n return options.rulesets;\n }\n return getDefaultRulesets();\n}\n\nfunction attachClashRules(\n doc: Record<string, unknown>,\n settings: ExtraSettings,\n rulesets: RulesetContent[] | undefined,\n): void {\n if (!settings.enableRuleGenerator || settings.nodeList) {\n return;\n }\n if (!rulesets || rulesets.length === 0) {\n return;\n }\n const field = settings.clashNewFieldName ? \"rules\" : \"Rule\";\n const generated = rulesetToClashRules(rulesets);\n if (generated.length === 0) {\n return;\n }\n const existing = doc[field];\n if (settings.overwriteOriginalRules || !Array.isArray(existing)) {\n doc[field] = generated;\n } else {\n doc[field] = [...(existing as string[]), ...generated];\n }\n}\n"],"mappings":"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EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,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","names":["ProxyGroupType","BalanceStrategy","ProxyType","RulesetType","TargetFormat","group","jms","generic","group","group","group","surge","group","regMatch","regReplace","group","group","group","parseRawSections","group","group","isIpv4","lines","group","group","group","singlegroup","triStr","group","group"]}