surgio 2.15.0 → 2.16.0
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/CHANGELOG.md +11 -0
- package/build/provider/CustomProvider.js +14 -5
- package/build/types.d.ts +1 -1
- package/build/utils/index.d.ts +2 -6
- package/build/utils/index.js +3 -230
- package/build/utils/loon.js +50 -18
- package/build/utils/quantumult.d.ts +6 -0
- package/build/utils/quantumult.js +255 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
# [2.16.0](https://github.com/geekdada/surgio/compare/v2.15.0...v2.16.0) (2022-03-19)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* format wsHeaders keys ([5c745fe](https://github.com/geekdada/surgio/commit/5c745fe1ff143e99b2ca6559e96c8969c8aad32d))
|
|
7
|
+
* support trojan websocket for loon ([63e66d6](https://github.com/geekdada/surgio/commit/63e66d612a6ce9f68bc2d0dfa6b0b616e00a548d))
|
|
8
|
+
* support trojan WebSocket for quantumultx generating ([5ded7b0](https://github.com/geekdada/surgio/commit/5ded7b01a246c4c2709087ef9e2734af554a839c))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
1
12
|
# [2.15.0](https://github.com/geekdada/surgio/compare/v2.14.2...v2.15.0) (2022-03-18)
|
|
2
13
|
|
|
3
14
|
|
|
@@ -32,18 +32,27 @@ class CustomProvider extends Provider_1.default {
|
|
|
32
32
|
this.nodeList = config.nodeList;
|
|
33
33
|
}
|
|
34
34
|
async getNodeList() {
|
|
35
|
-
const
|
|
35
|
+
const udpRelayCheckSchema = joi_1.default.object({
|
|
36
36
|
'udp-relay': joi_1.default.bool().strict(),
|
|
37
37
|
}).unknown();
|
|
38
38
|
return this.nodeList.map((item) => {
|
|
39
|
-
const { error } =
|
|
39
|
+
const { error: udpRelayCheckError } = udpRelayCheckSchema.validate(item);
|
|
40
|
+
const lowercaseKeys = ['wsHeaders'];
|
|
40
41
|
// istanbul ignore next
|
|
41
|
-
if (
|
|
42
|
-
throw
|
|
42
|
+
if (udpRelayCheckError) {
|
|
43
|
+
throw udpRelayCheckError;
|
|
43
44
|
}
|
|
45
|
+
lowercaseKeys.forEach((key) => {
|
|
46
|
+
if (item[key]) {
|
|
47
|
+
item[key] = Object.keys(item[key]).reduce((acc, curr) => {
|
|
48
|
+
acc[curr.toLowerCase()] = item[key][curr];
|
|
49
|
+
return acc;
|
|
50
|
+
}, {});
|
|
51
|
+
}
|
|
52
|
+
});
|
|
44
53
|
return item;
|
|
45
54
|
});
|
|
46
55
|
}
|
|
47
56
|
}
|
|
48
57
|
exports.default = CustomProvider;
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3VzdG9tUHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJvdmlkZXIvQ3VzdG9tUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4Q0FBc0I7QUFDdEIsb0NBSWtCO0FBQ2xCLDBEQUFrQztBQUVsQyxNQUFxQixjQUFlLFNBQVEsa0JBQVE7SUFHbEQsWUFBWSxJQUFZLEVBQUUsTUFBNEI7UUFDcEQsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVwQixNQUFNLFVBQVUsR0FBRyxhQUFHLENBQUMsTUFBTSxDQUFDO1lBQzVCLElBQUksRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO2lCQUNmLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQVMsb0JBQVksQ0FBQyxDQUFDO2lCQUM3QyxRQUFRLEVBQUU7WUFDYixRQUFRLEVBQUUsYUFBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUNqQyxNQUFNLEVBQUUsYUFBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUM5QixHQUFHLEVBQUUsYUFBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUMzQixLQUFLLEVBQUUsYUFBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUM3QixPQUFPLEVBQUUsYUFBRyxDQUFDLE1BQU0sRUFBRTtZQUNyQixTQUFTLEVBQUUsYUFBRyxDQUFDLE1BQU0sRUFBRTtZQUN2QixlQUFlLEVBQUUsYUFBRyxDQUFDLE1BQU0sRUFBRTtTQUM5QixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLE1BQU0sR0FBRyxhQUFHLENBQUMsTUFBTSxDQUFDO1lBQ3hCLFFBQVEsRUFBRSxhQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtTQUNuRCxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQyx1QkFBdUI7UUFDdkIsSUFBSSxLQUFLLEVBQUU7WUFDVCxNQUFNLEtBQUssQ0FBQztTQUNiO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVztRQUN0QixNQUFNLG1CQUFtQixHQUFHLGFBQUcsQ0FBQyxNQUFNLENBQUM7WUFDckMsV0FBVyxFQUFFLGFBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUU7U0FDakMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2hDLE1BQU0sRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVwQyx1QkFBdUI7WUFDdkIsSUFBSSxrQkFBa0IsRUFBRTtnQkFDdEIsTUFBTSxrQkFBa0IsQ0FBQzthQUMxQjtZQUVELGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDNUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO3dCQUN0RCxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUMxQyxPQUFPLEdBQUcsQ0FBQztvQkFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7aUJBQ1I7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUExREQsaUNBMERDIn0=
|
package/build/types.d.ts
CHANGED
|
@@ -228,7 +228,7 @@ export interface TrojanNodeConfig extends SimpleNodeConfig {
|
|
|
228
228
|
readonly sni?: string;
|
|
229
229
|
readonly 'udp-relay'?: boolean;
|
|
230
230
|
readonly tls13?: boolean;
|
|
231
|
-
readonly network?: '
|
|
231
|
+
readonly network?: 'tcp' | 'ws';
|
|
232
232
|
readonly wsPath?: string;
|
|
233
233
|
readonly wsHeaders?: Record<string, string>;
|
|
234
234
|
}
|
package/build/utils/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { JsonObject } from 'type-fest';
|
|
2
|
-
import {
|
|
2
|
+
import { NodeFilterType, NodeNameFilterType, PlainObjectOf, PossibleNodeConfigType, ProxyGroupModifier, ShadowsocksNodeConfig, ShadowsocksrNodeConfig, SimpleNodeConfig, SortedNodeNameFilterType, VmessNodeConfig } from '../types';
|
|
3
3
|
export * from './surge';
|
|
4
4
|
export * from './clash';
|
|
5
|
+
export * from './quantumult';
|
|
5
6
|
export declare const getDownloadUrl: (baseUrl: string | undefined, artifactName: string, inline?: boolean, accessToken?: string | undefined) => string;
|
|
6
7
|
export declare const getUrl: (baseUrl: string, path: string, accessToken?: string | undefined) => string;
|
|
7
8
|
export declare const getShadowsocksJSONConfig: (url: string, udpRelay?: boolean | undefined) => Promise<ReadonlyArray<ShadowsocksNodeConfig>>;
|
|
@@ -16,11 +17,6 @@ export declare const fromBase64: (str: string) => string;
|
|
|
16
17
|
export declare const getShadowsocksNodes: (list: ReadonlyArray<ShadowsocksNodeConfig>, groupName?: string) => string;
|
|
17
18
|
export declare const getShadowsocksrNodes: (list: ReadonlyArray<ShadowsocksrNodeConfig>, groupName: string) => string;
|
|
18
19
|
export declare const getV2rayNNodes: (list: ReadonlyArray<VmessNodeConfig>) => string;
|
|
19
|
-
export declare const getQuantumultNodes: (list: ReadonlyArray<ShadowsocksNodeConfig | VmessNodeConfig | ShadowsocksrNodeConfig | HttpsNodeConfig>, groupName?: string, filter?: SortedNodeNameFilterType | NodeNameFilterType | undefined) => string;
|
|
20
|
-
/**
|
|
21
|
-
* @see https://github.com/crossutility/Quantumult-X/blob/master/sample.conf
|
|
22
|
-
*/
|
|
23
|
-
export declare const getQuantumultXNodes: (list: ReadonlyArray<PossibleNodeConfigType>, filter?: SortedNodeNameFilterType | NodeNameFilterType | undefined) => string;
|
|
24
20
|
export declare const getShadowsocksNodesJSON: (list: ReadonlyArray<ShadowsocksNodeConfig>) => string;
|
|
25
21
|
export declare const getNodeNames: (list: ReadonlyArray<SimpleNodeConfig>, filter?: SortedNodeNameFilterType | NodeNameFilterType | undefined, separator?: string | undefined) => string;
|
|
26
22
|
export declare const generateClashProxyGroup: (ruleName: string, ruleType: 'select' | 'url-test' | 'fallback' | 'load-balance', nodeNameList: ReadonlyArray<SimpleNodeConfig>, options: {
|
package/build/utils/index.js
CHANGED
|
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.isRailway = exports.isPkgBundle = exports.isGitLabCI = exports.isGitHubActions = exports.isHeroku = exports.isVercel = exports.isNow = exports.isIp = exports.lowercaseHeaderKeys = exports.formatV2rayConfig = exports.ensureConfigFolder = exports.normalizeClashProxyGroupConfig = exports.decodeStringList = exports.pickAndFormatStringList = exports.toYaml = exports.generateClashProxyGroup = exports.getNodeNames = exports.getShadowsocksNodesJSON = exports.
|
|
20
|
+
exports.isRailway = exports.isPkgBundle = exports.isGitLabCI = exports.isGitHubActions = exports.isHeroku = exports.isVercel = exports.isNow = exports.isIp = exports.lowercaseHeaderKeys = exports.formatV2rayConfig = exports.ensureConfigFolder = exports.normalizeClashProxyGroupConfig = exports.decodeStringList = exports.pickAndFormatStringList = exports.toYaml = exports.generateClashProxyGroup = exports.getNodeNames = exports.getShadowsocksNodesJSON = exports.getV2rayNNodes = exports.getShadowsocksrNodes = exports.getShadowsocksNodes = exports.fromBase64 = exports.toBase64 = exports.fromUrlSafeBase64 = exports.toUrlSafeBase64 = exports.getMellowNodes = exports.getShadowsocksJSONConfig = exports.getUrl = exports.getDownloadUrl = void 0;
|
|
21
21
|
const logger_1 = require("@surgio/logger");
|
|
22
22
|
const assert_1 = __importDefault(require("assert"));
|
|
23
23
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
@@ -37,6 +37,7 @@ const http_client_1 = __importDefault(require("./http-client"));
|
|
|
37
37
|
const v2ray_1 = require("./v2ray");
|
|
38
38
|
__exportStar(require("./surge"), exports);
|
|
39
39
|
__exportStar(require("./clash"), exports);
|
|
40
|
+
__exportStar(require("./quantumult"), exports);
|
|
40
41
|
const logger = (0, logger_1.createLogger)({ service: 'surgio:utils' });
|
|
41
42
|
const getDownloadUrl = (baseUrl = '/', artifactName, inline = true, accessToken) => {
|
|
42
43
|
let urlSearchParams;
|
|
@@ -273,234 +274,6 @@ const getV2rayNNodes = (list) => {
|
|
|
273
274
|
return result.join('\n');
|
|
274
275
|
};
|
|
275
276
|
exports.getV2rayNNodes = getV2rayNNodes;
|
|
276
|
-
const getQuantumultNodes = function (list, groupName = 'Surgio', filter) {
|
|
277
|
-
// istanbul ignore next
|
|
278
|
-
if (arguments.length === 3 && typeof filter === 'undefined') {
|
|
279
|
-
throw new Error(constant_1.ERR_INVALID_FILTER);
|
|
280
|
-
}
|
|
281
|
-
function getHeader(wsHeaders) {
|
|
282
|
-
return Object.keys(wsHeaders)
|
|
283
|
-
.map((headerKey) => `${headerKey}:${wsHeaders[headerKey]}`)
|
|
284
|
-
.join('[Rr][Nn]');
|
|
285
|
-
}
|
|
286
|
-
const result = (0, filter_1.applyFilter)(list, filter)
|
|
287
|
-
.map((nodeConfig) => {
|
|
288
|
-
switch (nodeConfig.type) {
|
|
289
|
-
case types_1.NodeTypeEnum.Vmess: {
|
|
290
|
-
const config = [
|
|
291
|
-
'vmess',
|
|
292
|
-
nodeConfig.hostname,
|
|
293
|
-
nodeConfig.port,
|
|
294
|
-
nodeConfig.method === 'auto'
|
|
295
|
-
? 'chacha20-ietf-poly1305'
|
|
296
|
-
: nodeConfig.method,
|
|
297
|
-
JSON.stringify(nodeConfig.uuid),
|
|
298
|
-
nodeConfig.alterId,
|
|
299
|
-
`group=${groupName}`,
|
|
300
|
-
`over-tls=${nodeConfig.tls === true ? 'true' : 'false'}`,
|
|
301
|
-
`certificate=1`,
|
|
302
|
-
`obfs=${nodeConfig.network}`,
|
|
303
|
-
`obfs-path=${JSON.stringify(nodeConfig.path || '/')}`,
|
|
304
|
-
`obfs-header=${JSON.stringify(getHeader(Object.assign({ host: nodeConfig.host || nodeConfig.hostname, 'user-agent': constant_1.OBFS_UA }, lodash_1.default.omit(nodeConfig.wsHeaders, ['host']))))}`,
|
|
305
|
-
]
|
|
306
|
-
.filter((value) => !!value)
|
|
307
|
-
.join(',');
|
|
308
|
-
return ('vmess://' + (0, exports.toBase64)([nodeConfig.nodeName, config].join(' = ')));
|
|
309
|
-
}
|
|
310
|
-
case types_1.NodeTypeEnum.Shadowsocks: {
|
|
311
|
-
return (0, exports.getShadowsocksNodes)([nodeConfig], groupName);
|
|
312
|
-
}
|
|
313
|
-
case types_1.NodeTypeEnum.Shadowsocksr:
|
|
314
|
-
return (0, exports.getShadowsocksrNodes)([nodeConfig], groupName);
|
|
315
|
-
case types_1.NodeTypeEnum.HTTPS: {
|
|
316
|
-
const config = [
|
|
317
|
-
nodeConfig.nodeName,
|
|
318
|
-
[
|
|
319
|
-
'http',
|
|
320
|
-
`upstream-proxy-address=${nodeConfig.hostname}`,
|
|
321
|
-
`upstream-proxy-port=${nodeConfig.port}`,
|
|
322
|
-
'upstream-proxy-auth=true',
|
|
323
|
-
`upstream-proxy-username=${nodeConfig.username}`,
|
|
324
|
-
`upstream-proxy-password=${nodeConfig.password}`,
|
|
325
|
-
'over-tls=true',
|
|
326
|
-
'certificate=1',
|
|
327
|
-
].join(', '),
|
|
328
|
-
].join(' = ');
|
|
329
|
-
return 'http://' + (0, exports.toBase64)(config);
|
|
330
|
-
}
|
|
331
|
-
// istanbul ignore next
|
|
332
|
-
default:
|
|
333
|
-
logger.warn(`不支持为 Quantumult 生成 ${nodeConfig.type} 的节点,节点 ${nodeConfig.nodeName} 会被省略`);
|
|
334
|
-
return void 0;
|
|
335
|
-
}
|
|
336
|
-
})
|
|
337
|
-
.filter((item) => item !== undefined);
|
|
338
|
-
return result.join('\n');
|
|
339
|
-
};
|
|
340
|
-
exports.getQuantumultNodes = getQuantumultNodes;
|
|
341
|
-
/**
|
|
342
|
-
* @see https://github.com/crossutility/Quantumult-X/blob/master/sample.conf
|
|
343
|
-
*/
|
|
344
|
-
const getQuantumultXNodes = function (list, filter) {
|
|
345
|
-
// istanbul ignore next
|
|
346
|
-
if (arguments.length === 2 && typeof filter === 'undefined') {
|
|
347
|
-
throw new Error(constant_1.ERR_INVALID_FILTER);
|
|
348
|
-
}
|
|
349
|
-
const result = (0, filter_1.applyFilter)(list, filter)
|
|
350
|
-
.map((nodeConfig) => {
|
|
351
|
-
var _a;
|
|
352
|
-
switch (nodeConfig.type) {
|
|
353
|
-
case types_1.NodeTypeEnum.Vmess: {
|
|
354
|
-
const config = [
|
|
355
|
-
`${nodeConfig.hostname}:${nodeConfig.port}`,
|
|
356
|
-
// method 为 auto 时 qx 会无法识别
|
|
357
|
-
nodeConfig.method === 'auto'
|
|
358
|
-
? `method=chacha20-ietf-poly1305`
|
|
359
|
-
: `method=${nodeConfig.method}`,
|
|
360
|
-
`password=${nodeConfig.uuid}`,
|
|
361
|
-
...(nodeConfig['udp-relay'] ? ['udp-relay=true'] : []),
|
|
362
|
-
...(nodeConfig.tfo ? ['fast-open=true'] : []),
|
|
363
|
-
...(((_a = nodeConfig.quantumultXConfig) === null || _a === void 0 ? void 0 : _a.vmessAEAD)
|
|
364
|
-
? ['aead=true']
|
|
365
|
-
: ['aead=false']),
|
|
366
|
-
];
|
|
367
|
-
switch (nodeConfig.network) {
|
|
368
|
-
case 'ws':
|
|
369
|
-
if (nodeConfig.tls) {
|
|
370
|
-
config.push(`obfs=wss`);
|
|
371
|
-
if (nodeConfig.skipCertVerify) {
|
|
372
|
-
config.push('tls-verification=false');
|
|
373
|
-
}
|
|
374
|
-
else {
|
|
375
|
-
config.push('tls-verification=true');
|
|
376
|
-
}
|
|
377
|
-
// istanbul ignore next
|
|
378
|
-
if (nodeConfig.tls13) {
|
|
379
|
-
config.push(`tls13=true`);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
else {
|
|
383
|
-
config.push(`obfs=ws`);
|
|
384
|
-
}
|
|
385
|
-
config.push(`obfs-uri=${nodeConfig.path || '/'}`);
|
|
386
|
-
config.push(`obfs-host=${nodeConfig.host || nodeConfig.hostname}`);
|
|
387
|
-
break;
|
|
388
|
-
case 'tcp':
|
|
389
|
-
if (nodeConfig.tls) {
|
|
390
|
-
config.push(`obfs=over-tls`);
|
|
391
|
-
if (nodeConfig.skipCertVerify) {
|
|
392
|
-
config.push('tls-verification=false');
|
|
393
|
-
}
|
|
394
|
-
else {
|
|
395
|
-
config.push('tls-verification=true');
|
|
396
|
-
}
|
|
397
|
-
// istanbul ignore next
|
|
398
|
-
if (nodeConfig.tls13) {
|
|
399
|
-
config.push(`tls13=true`);
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
break;
|
|
403
|
-
default:
|
|
404
|
-
// do nothing
|
|
405
|
-
}
|
|
406
|
-
config.push(`tag=${nodeConfig.nodeName}`);
|
|
407
|
-
// istanbul ignore next
|
|
408
|
-
if (nodeConfig.wsHeaders &&
|
|
409
|
-
Object.keys(nodeConfig.wsHeaders).length > 1) {
|
|
410
|
-
logger.warn(`Quantumult X 不支持自定义额外的 Header 字段,节点 ${nodeConfig.nodeName} 可能不可用`);
|
|
411
|
-
}
|
|
412
|
-
return `vmess=${config.join(', ')}`;
|
|
413
|
-
}
|
|
414
|
-
case types_1.NodeTypeEnum.Shadowsocks: {
|
|
415
|
-
const config = [
|
|
416
|
-
`${nodeConfig.hostname}:${nodeConfig.port}`,
|
|
417
|
-
...(0, exports.pickAndFormatStringList)(nodeConfig, ['method', 'password']),
|
|
418
|
-
...(nodeConfig.obfs && ['http', 'tls'].includes(nodeConfig.obfs)
|
|
419
|
-
? [
|
|
420
|
-
`obfs=${nodeConfig.obfs}`,
|
|
421
|
-
`obfs-host=${nodeConfig['obfs-host']}`,
|
|
422
|
-
]
|
|
423
|
-
: []),
|
|
424
|
-
...(nodeConfig.obfs && ['ws', 'wss'].includes(nodeConfig.obfs)
|
|
425
|
-
? [
|
|
426
|
-
`obfs=${nodeConfig.obfs}`,
|
|
427
|
-
`obfs-host=${nodeConfig['obfs-host'] || nodeConfig.hostname}`,
|
|
428
|
-
`obfs-uri=${nodeConfig['obfs-uri'] || '/'}`,
|
|
429
|
-
]
|
|
430
|
-
: []),
|
|
431
|
-
...(nodeConfig['udp-relay'] ? [`udp-relay=true`] : []),
|
|
432
|
-
...(nodeConfig.tfo ? [`fast-open=${nodeConfig.tfo}`] : []),
|
|
433
|
-
];
|
|
434
|
-
if (nodeConfig.obfs === 'wss') {
|
|
435
|
-
if (nodeConfig.skipCertVerify) {
|
|
436
|
-
config.push('tls-verification=false');
|
|
437
|
-
}
|
|
438
|
-
else {
|
|
439
|
-
config.push('tls-verification=true');
|
|
440
|
-
}
|
|
441
|
-
if (nodeConfig.tls13) {
|
|
442
|
-
config.push('tls13=true');
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
// istanbul ignore next
|
|
446
|
-
if (nodeConfig.wsHeaders &&
|
|
447
|
-
Object.keys(nodeConfig.wsHeaders).length > 1) {
|
|
448
|
-
logger.warn(`Quantumult X 不支持自定义额外的 Header 字段,节点 ${nodeConfig.nodeName} 可能不可用`);
|
|
449
|
-
}
|
|
450
|
-
config.push(`tag=${nodeConfig.nodeName}`);
|
|
451
|
-
return `shadowsocks=${config.join(', ')}`;
|
|
452
|
-
}
|
|
453
|
-
case types_1.NodeTypeEnum.Shadowsocksr: {
|
|
454
|
-
const config = [
|
|
455
|
-
`${nodeConfig.hostname}:${nodeConfig.port}`,
|
|
456
|
-
...(0, exports.pickAndFormatStringList)(nodeConfig, ['method', 'password']),
|
|
457
|
-
`ssr-protocol=${nodeConfig.protocol}`,
|
|
458
|
-
`ssr-protocol-param=${nodeConfig.protoparam}`,
|
|
459
|
-
`obfs=${nodeConfig.obfs}`,
|
|
460
|
-
`obfs-host=${nodeConfig.obfsparam}`,
|
|
461
|
-
...(nodeConfig['udp-relay'] ? [`udp-relay=true`] : []),
|
|
462
|
-
...(nodeConfig.tfo ? [`fast-open=${nodeConfig.tfo}`] : []),
|
|
463
|
-
`tag=${nodeConfig.nodeName}`,
|
|
464
|
-
].join(', ');
|
|
465
|
-
return `shadowsocks=${config}`;
|
|
466
|
-
}
|
|
467
|
-
case types_1.NodeTypeEnum.HTTP:
|
|
468
|
-
case types_1.NodeTypeEnum.HTTPS: {
|
|
469
|
-
const config = [
|
|
470
|
-
`${nodeConfig.hostname}:${nodeConfig.port}`,
|
|
471
|
-
...(0, exports.pickAndFormatStringList)(nodeConfig, ['username', 'password']),
|
|
472
|
-
...(nodeConfig.tfo ? [`fast-open=${nodeConfig.tfo}`] : []),
|
|
473
|
-
];
|
|
474
|
-
if (nodeConfig.type === types_1.NodeTypeEnum.HTTPS) {
|
|
475
|
-
config.push('over-tls=true', `tls-verification=${nodeConfig.skipCertVerify !== true}`, ...(nodeConfig.tls13 ? [`tls13=${nodeConfig.tls13}`] : []));
|
|
476
|
-
}
|
|
477
|
-
config.push(`tag=${nodeConfig.nodeName}`);
|
|
478
|
-
return `http=${config.join(', ')}`;
|
|
479
|
-
}
|
|
480
|
-
case types_1.NodeTypeEnum.Trojan: {
|
|
481
|
-
const config = [
|
|
482
|
-
`${nodeConfig.hostname}:${nodeConfig.port}`,
|
|
483
|
-
...(0, exports.pickAndFormatStringList)(nodeConfig, ['password']),
|
|
484
|
-
'over-tls=true',
|
|
485
|
-
`tls-verification=${nodeConfig.skipCertVerify !== true}`,
|
|
486
|
-
...(nodeConfig.sni ? [`tls-host=${nodeConfig.sni}`] : []),
|
|
487
|
-
...(nodeConfig.tfo ? [`fast-open=${nodeConfig.tfo}`] : []),
|
|
488
|
-
...(nodeConfig['udp-relay'] ? [`udp-relay=true`] : []),
|
|
489
|
-
...(nodeConfig.tls13 ? [`tls13=${nodeConfig.tls13}`] : []),
|
|
490
|
-
`tag=${nodeConfig.nodeName}`,
|
|
491
|
-
];
|
|
492
|
-
return `trojan=${config.join(', ')}`;
|
|
493
|
-
}
|
|
494
|
-
// istanbul ignore next
|
|
495
|
-
default:
|
|
496
|
-
logger.warn(`不支持为 QuantumultX 生成 ${nodeConfig.type} 的节点,节点 ${nodeConfig.nodeName} 会被省略`);
|
|
497
|
-
return void 0;
|
|
498
|
-
}
|
|
499
|
-
})
|
|
500
|
-
.filter((item) => item !== undefined);
|
|
501
|
-
return result.join('\n');
|
|
502
|
-
};
|
|
503
|
-
exports.getQuantumultXNodes = getQuantumultXNodes;
|
|
504
277
|
// istanbul ignore next
|
|
505
278
|
const getShadowsocksNodesJSON = (list) => {
|
|
506
279
|
const nodes = list
|
|
@@ -723,4 +496,4 @@ exports.isPkgBundle = isPkgBundle;
|
|
|
723
496
|
// istanbul ignore next
|
|
724
497
|
const isRailway = () => typeof process.env.RAILWAY_STATIC_URL !== 'undefined';
|
|
725
498
|
exports.isRailway = isRailway;
|
|
726
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBOEM7QUFDOUMsb0RBQTRCO0FBQzVCLHdEQUEwQjtBQUMxQixvREFBdUI7QUFDdkIsNENBQW9CO0FBQ3BCLCtCQUE0QjtBQUM1QixnRUFBdUM7QUFFdkMsNkJBQTJDO0FBQzNDLG9FQUEyQztBQUMzQyxnREFBd0I7QUFDeEIsOENBQXNCO0FBRXRCLG9DQWFrQjtBQUNsQixtQ0FBc0M7QUFDdEMsMENBQTBEO0FBQzFELHFDQUF1RDtBQUN2RCxnRUFBdUM7QUFDdkMsbUNBQXlDO0FBRXpDLDBDQUF3QjtBQUN4QiwwQ0FBd0I7QUFFeEIsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7QUFFbEQsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsT0FBTyxHQUFHLEdBQUcsRUFDYixZQUFvQixFQUNwQixNQUFNLEdBQUcsSUFBSSxFQUNiLFdBQW9CLEVBQ1osRUFBRTtJQUNWLElBQUksZUFBZ0MsQ0FBQztJQUNyQyxJQUFJLElBQVksQ0FBQztJQUVqQixJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDOUIsZUFBZSxHQUFHLElBQUkscUJBQWUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbkM7U0FBTTtRQUNMLGVBQWUsR0FBRyxJQUFJLHFCQUFlLEVBQUUsQ0FBQztRQUN4QyxJQUFJLEdBQUcsWUFBWSxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxXQUFXLEVBQUU7UUFDZixlQUFlLENBQUMsR0FB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
|
|
499
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBOEM7QUFDOUMsb0RBQTRCO0FBQzVCLHdEQUEwQjtBQUMxQixvREFBdUI7QUFDdkIsNENBQW9CO0FBQ3BCLCtCQUE0QjtBQUM1QixnRUFBdUM7QUFFdkMsNkJBQTJDO0FBQzNDLG9FQUEyQztBQUMzQyxnREFBd0I7QUFDeEIsOENBQXNCO0FBRXRCLG9DQVlrQjtBQUNsQixtQ0FBc0M7QUFDdEMsMENBQTBEO0FBQzFELHFDQUF1RDtBQUN2RCxnRUFBdUM7QUFDdkMsbUNBQXlDO0FBRXpDLDBDQUF3QjtBQUN4QiwwQ0FBd0I7QUFDeEIsK0NBQTZCO0FBRTdCLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksRUFBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0FBRWxELE1BQU0sY0FBYyxHQUFHLENBQzVCLE9BQU8sR0FBRyxHQUFHLEVBQ2IsWUFBb0IsRUFDcEIsTUFBTSxHQUFHLElBQUksRUFDYixXQUFvQixFQUNaLEVBQUU7SUFDVixJQUFJLGVBQWdDLENBQUM7SUFDckMsSUFBSSxJQUFZLENBQUM7SUFFakIsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzlCLGVBQWUsR0FBRyxJQUFJLHFCQUFlLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25DO1NBQU07UUFDTCxlQUFlLEdBQUcsSUFBSSxxQkFBZSxFQUFFLENBQUM7UUFDeEMsSUFBSSxHQUFHLFlBQVksQ0FBQztLQUNyQjtJQUVELElBQUksV0FBVyxFQUFFO1FBQ2YsZUFBZSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDbEQ7SUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQ1gsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDaEM7SUFFRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7SUFFekMsT0FBTyxHQUFHLE9BQU8sR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUN4RCxDQUFDLENBQUM7QUEzQlcsUUFBQSxjQUFjLGtCQTJCekI7QUFFSyxNQUFNLE1BQU0sR0FBRyxDQUNwQixPQUFlLEVBQ2YsSUFBWSxFQUNaLFdBQW9CLEVBQ1osRUFBRTtJQUNWLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkMsSUFBSSxXQUFXLEVBQUU7UUFDZixHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDbkQ7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4QixDQUFDLENBQUM7QUFYVyxRQUFBLE1BQU0sVUFXakI7QUFFSyxNQUFNLHdCQUF3QixHQUFHLEtBQUssRUFDM0MsR0FBVyxFQUNYLFFBQWtCLEVBQzZCLEVBQUU7SUFDakQsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUUzQixLQUFLLFVBQVUsdUJBQXVCO1FBR3BDLE1BQU0sUUFBUSxHQUFHLG1CQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNuQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQVcsQ0FBQztZQUM1QyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNoQixNQUFNLEdBQUcsR0FBRyxNQUFNLHFCQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUV0QyxtQkFBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUvQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFVCxPQUFRLFFBQVEsQ0FBQyxPQUE4QixDQUFDLEdBQUcsQ0FDakQsQ0FBQyxJQUFJLEVBQXlCLEVBQUU7WUFDOUIsTUFBTSxVQUFVLEdBQVE7Z0JBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBaUI7Z0JBQ2hDLElBQUksRUFBRSxvQkFBWSxDQUFDLFdBQVc7Z0JBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBZ0I7Z0JBQy9CLElBQUksRUFBRSxJQUFJLENBQUMsV0FBcUI7Z0JBQ2hDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBZ0I7Z0JBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBa0I7YUFDbEMsQ0FBQztZQUVGLElBQUksT0FBTyxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUNqQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDO2FBQ3BDO1lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRTtnQkFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBRTNELElBQUksSUFBSSxFQUFFO29CQUNSLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxQixVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztpQkFDbkU7YUFDRjtZQUVELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sTUFBTSx1QkFBdUIsRUFBRSxDQUFDO0FBQ3pDLENBQUMsQ0FBQztBQWpEVyxRQUFBLHdCQUF3Qiw0QkFpRG5DO0FBRUssTUFBTSxjQUFjLEdBQUcsVUFDNUIsSUFBNEQsRUFDNUQsTUFBa0Q7SUFFbEQsdUJBQXVCO0lBQ3ZCLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO1FBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQWtCLENBQUMsQ0FBQztLQUNyQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUEsb0JBQVcsRUFBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQ3JDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1FBQ2xCLFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtZQUN2QixLQUFLLG9CQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUEsc0JBQWMsRUFBQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDM0QsT0FBTztvQkFDTCxVQUFVLENBQUMsUUFBUTtvQkFDbkIsUUFBUTtvQkFDUixHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUM7aUJBQzVDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2Q7WUFFRCxLQUFLLG9CQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUEsMkJBQW1CLEVBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzNEO1lBRUQsdUJBQXVCO1lBQ3ZCO2dCQUNFLE1BQU0sQ0FBQyxJQUFJLENBQ1Qsa0JBQW1CLFVBQWtCLENBQUMsSUFBSSxXQUN2QyxVQUFrQixDQUFDLFFBQ3RCLE9BQU8sQ0FDUixDQUFDO2dCQUNGLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDSCxDQUFDLENBQUM7U0FDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU1QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBdkNXLFFBQUEsY0FBYyxrQkF1Q3pCO0FBRUYsdUJBQXVCO0FBQ2hCLE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBVyxFQUFVLEVBQUUsQ0FDckQsd0JBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQURwQyxRQUFBLGVBQWUsbUJBQ3FCO0FBRWpELHVCQUF1QjtBQUNoQixNQUFNLGlCQUFpQixHQUFHLENBQUMsR0FBVyxFQUFVLEVBQUU7SUFDdkQsSUFBSSx3QkFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUMvQixPQUFPLHdCQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQzdDO0lBQ0QsT0FBTyxJQUFBLGtCQUFVLEVBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBTFcsUUFBQSxpQkFBaUIscUJBSzVCO0FBRUYsdUJBQXVCO0FBQ2hCLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBVyxFQUFVLEVBQUUsQ0FDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRGpDLFFBQUEsUUFBUSxZQUN5QjtBQUU5Qyx1QkFBdUI7QUFDaEIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFXLEVBQVUsRUFBRSxDQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFEakMsUUFBQSxVQUFVLGNBQ3VCO0FBRTlDOztHQUVHO0FBQ0ksTUFBTSxtQkFBbUIsR0FBRyxDQUNqQyxJQUEwQyxFQUMxQyxTQUFTLEdBQUcsUUFBUSxFQUNaLEVBQUU7SUFDVixNQUFNLE1BQU0sR0FBdUIsSUFBSTtTQUNwQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUNsQix1QkFBdUI7UUFDdkIsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtZQUMvQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssb0JBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDN0IsTUFBTSxNQUFNLEdBQUcsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sS0FBSyxtQ0FJTixDQUFDLE1BQU0sQ0FBQyxJQUFJO29CQUNiLENBQUMsQ0FBQzt3QkFDRSxNQUFNLEVBQUUsR0FBRyxrQkFBa0IsQ0FDM0IsbUJBQW1CLE1BQU0sQ0FBQyxJQUFJLGNBQWMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQ2xFLEVBQUU7cUJBQ0o7b0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUNOLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDakUsQ0FBQztnQkFFRixPQUFPO29CQUNMLE9BQU87b0JBQ1AsSUFBQSx1QkFBZSxFQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RELEdBQUc7b0JBQ0gsTUFBTSxDQUFDLFFBQVE7b0JBQ2YsR0FBRztvQkFDSCxNQUFNLENBQUMsSUFBSTtvQkFDWCxJQUFJO29CQUNKLHNCQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTt3QkFDM0IsTUFBTSxFQUFFLEtBQUs7d0JBQ2IsSUFBSSxFQUFFLEtBQUs7cUJBQ1osQ0FBQztvQkFDRixHQUFHO29CQUNILGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7aUJBQ3BDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ1o7WUFFRCx1QkFBdUI7WUFDdkI7Z0JBQ0UsTUFBTSxDQUFDLElBQUksQ0FDVCwwQkFBMEIsVUFBVSxDQUFDLElBQUksVUFBVSxVQUFVLENBQUMsUUFBUSxPQUFPLENBQzlFLENBQUM7Z0JBQ0YsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNILENBQUMsQ0FBQztTQUNELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTVCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUM7QUF4RFcsUUFBQSxtQkFBbUIsdUJBd0Q5QjtBQUVLLE1BQU0sb0JBQW9CLEdBQUcsQ0FDbEMsSUFBMkMsRUFDM0MsU0FBaUIsRUFDVCxFQUFFO0lBQ1YsTUFBTSxNQUFNLEdBQXNDLElBQUk7U0FDbkQsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDbEIsdUJBQXVCO1FBQ3ZCLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUU7WUFDL0IsT0FBTyxLQUFLLENBQUMsQ0FBQztTQUNmO1FBRUQsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssb0JBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDOUIsTUFBTSxPQUFPLEdBQUc7b0JBQ2QsVUFBVSxDQUFDLFFBQVE7b0JBQ25CLFVBQVUsQ0FBQyxJQUFJO29CQUNmLFVBQVUsQ0FBQyxRQUFRO29CQUNuQixVQUFVLENBQUMsTUFBTTtvQkFDakIsVUFBVSxDQUFDLElBQUk7b0JBQ2YsSUFBQSx1QkFBZSxFQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7aUJBQ3JDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sS0FBSyxHQUFHO29CQUNaLFNBQVMsRUFBRSxJQUFBLHVCQUFlLEVBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztvQkFDaEQsVUFBVSxFQUFFLElBQUEsdUJBQWUsRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDO29CQUNsRCxPQUFPLEVBQUUsSUFBQSx1QkFBZSxFQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7b0JBQzdDLEtBQUssRUFBRSxJQUFBLHVCQUFlLEVBQUMsU0FBUyxDQUFDO29CQUNqQyxPQUFPLEVBQUUsQ0FBQztvQkFDVixHQUFHLEVBQUUsQ0FBQztpQkFDUCxDQUFDO2dCQUVGLE9BQU8sQ0FDTCxRQUFRO29CQUNSLElBQUEsdUJBQWUsRUFDYjt3QkFDRSxPQUFPO3dCQUNQLElBQUk7d0JBQ0osc0JBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFOzRCQUMzQixNQUFNLEVBQUUsS0FBSzt5QkFDZCxDQUFDO3FCQUNILENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUNYLENBQ0YsQ0FBQzthQUNIO1lBRUQsdUJBQXVCO1lBQ3ZCO2dCQUNFLE1BQU0sQ0FBQyxJQUFJLENBQ1QsMkJBQTJCLFVBQVUsQ0FBQyxJQUFJLFVBQVUsVUFBVSxDQUFDLFFBQVEsT0FBTyxDQUMvRSxDQUFDO2dCQUNGLE9BQU8sS0FBSyxDQUFDLENBQUM7U0FDakI7SUFDSCxDQUFDLENBQUM7U0FDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQztJQUV4QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBdkRXLFFBQUEsb0JBQW9CLHdCQXVEL0I7QUFFSyxNQUFNLGNBQWMsR0FBRyxDQUM1QixJQUFvQyxFQUM1QixFQUFFO0lBQ1YsTUFBTSxNQUFNLEdBQTBCLElBQUk7U0FDdkMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFzQixFQUFFO1FBQ3RDLHVCQUF1QjtRQUN2QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFO1lBQy9CLE9BQU8sS0FBSyxDQUFDLENBQUM7U0FDZjtRQUVELFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtZQUN2QixLQUFLLG9CQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxHQUFHO29CQUNYLENBQUMsRUFBRSxHQUFHO29CQUNOLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUTtvQkFDdkIsR0FBRyxFQUFFLFVBQVUsQ0FBQyxRQUFRO29CQUN4QixJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFO29CQUMxQixFQUFFLEVBQUUsVUFBVSxDQUFDLElBQUk7b0JBQ25CLEdBQUcsRUFBRSxVQUFVLENBQUMsT0FBTztvQkFDdkIsR0FBRyxFQUFFLFVBQVUsQ0FBQyxPQUFPO29CQUN2QixJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7b0JBQ3JCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtvQkFDckIsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtpQkFDakMsQ0FBQztnQkFFRixPQUFPLFVBQVUsR0FBRyxJQUFBLGdCQUFRLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3BEO1lBRUQsdUJBQXVCO1lBQ3ZCO2dCQUNFLE1BQU0sQ0FBQyxJQUFJLENBQ1Qsb0JBQW9CLFVBQVUsQ0FBQyxJQUFJLFVBQVUsVUFBVSxDQUFDLFFBQVEsT0FBTyxDQUN4RSxDQUFDO2dCQUNGLE9BQU8sS0FBSyxDQUFDLENBQUM7U0FDakI7SUFDSCxDQUFDLENBQUM7U0FDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUM7SUFFeEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQztBQXhDVyxRQUFBLGNBQWMsa0JBd0N6QjtBQUVGLHVCQUF1QjtBQUNoQixNQUFNLHVCQUF1QixHQUFHLENBQ3JDLElBQTBDLEVBQ2xDLEVBQUU7SUFDVixNQUFNLEtBQUssR0FBdUIsSUFBSTtTQUNuQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUNsQix1QkFBdUI7UUFDdkIsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtZQUMvQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssb0JBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDN0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLHVCQUNFLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxFQUM1QixNQUFNLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFDM0IsV0FBVyxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQzVCLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUN6QixjQUFjLEVBQUUsSUFBQSx1QkFBZSxFQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFDcEQsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQzdCLFlBQVksRUFBRSxLQUFLLEVBQ25CLFlBQVksRUFBRSxLQUFLLEVBQ25CLE1BQU0sRUFBRSxJQUFJLElBQ1QsQ0FBQyxPQUFPO29CQUNULENBQUMsQ0FBQzt3QkFDRSxNQUFNLEVBQUUsWUFBWTt3QkFDcEIsYUFBYSxFQUFFLFFBQVEsVUFBVSxDQUFDLElBQUksY0FBYyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7cUJBQzlFO29CQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDVDthQUNIO1lBRUQsdUJBQXVCO1lBQ3ZCO2dCQUNFLE1BQU0sQ0FBQyxJQUFJLENBQ1QsMEJBQTBCLFVBQVUsQ0FBQyxJQUFJLFVBQVUsVUFBVSxDQUFDLFFBQVEsT0FBTyxDQUM5RSxDQUFDO2dCQUNGLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQyxDQUFDO1NBQ0QsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUM7SUFFeEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyxDQUFDO0FBM0NXLFFBQUEsdUJBQXVCLDJCQTJDbEM7QUFFSyxNQUFNLFlBQVksR0FBRyxVQUMxQixJQUFxQyxFQUNyQyxNQUFzRCxFQUN0RCxTQUFrQjtJQUVsQix1QkFBdUI7SUFDdkIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7UUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBa0IsQ0FBQyxDQUFDO0tBQ3JDO0lBRUQsT0FBTyxJQUFBLG9CQUFXLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztTQUM3QixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDNUIsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFiVyxRQUFBLFlBQVksZ0JBYXZCO0FBRUssTUFBTSx1QkFBdUIsR0FBRyxDQUNyQyxRQUFnQixFQUNoQixRQUE2RCxFQUM3RCxZQUE2QyxFQUM3QyxPQUtDLEVBT0QsRUFBRTtJQUNGLElBQUksT0FBTyxDQUFDO0lBRVosSUFBSSxPQUFPLENBQUMsZUFBZSxFQUFFO1FBQzNCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQixNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFXLEVBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RCxPQUFPLEdBQUksRUFBZSxDQUFDLE1BQU0sQ0FDL0IsT0FBTyxDQUFDLGVBQWUsRUFDdkIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUNuQyxDQUFDO1NBQ0g7YUFBTTtZQUNMLE9BQU8sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO1NBQ25DO0tBQ0Y7U0FBTTtRQUNMLE1BQU0sS0FBSyxHQUFHLElBQUEsb0JBQVcsRUFBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDOUM7SUFFRCx1QkFDRSxJQUFJLEVBQUUsUUFBUSxFQUNkLElBQUksRUFBRSxRQUFRLEVBQ2QsT0FBTyxJQUNKLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDN0QsQ0FBQyxDQUFDO1lBQ0UsR0FBRyxFQUFFLE9BQU8sQ0FBQyxZQUFZO1lBQ3pCLFFBQVEsRUFBRSxPQUFPLENBQUMsaUJBQWlCO1NBQ3BDO1FBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUNUO0FBQ0osQ0FBQyxDQUFDO0FBN0NXLFFBQUEsdUJBQXVCLDJCQTZDbEM7QUFFSyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQWUsRUFBVSxFQUFFLENBQUMsY0FBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUExRCxRQUFBLE1BQU0sVUFBb0Q7QUFFaEUsTUFBTSx1QkFBdUIsR0FBRyxDQUNyQyxHQUFRLEVBQ1IsT0FBMEIsRUFDUCxFQUFFO0lBQ3JCLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDdEIsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBWFcsUUFBQSx1QkFBdUIsMkJBV2xDO0FBRUssTUFBTSxnQkFBZ0IsR0FBRyxDQUM5QixVQUFpQyxFQUM5QixFQUFFO0lBQ0wsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUMxQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMxQyxJQUFJLEtBQUssRUFBRTtnQkFDVCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQzthQUNuRDtTQUNGO2FBQU07WUFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQVcsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFmVyxRQUFBLGdCQUFnQixvQkFlM0I7QUFFSyxNQUFNLDhCQUE4QixHQUFHLENBQzVDLFFBQStDLEVBQy9DLGFBQTJFLEVBQzNFLGtCQUFzQyxFQUN0QyxVQUdJLEVBQUUsRUFDYyxFQUFFO0lBQ3RCLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUUvRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUM3QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDakMsdUJBQXVCO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBQSx1QkFBYyxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDaEQsTUFBTSxJQUFJLEtBQUssQ0FDYixPQUFPLElBQUksQ0FBQyxNQUFNLDRCQUE0QixDQUMvQyxDQUFDO2FBQ0g7WUFFRCxPQUFPLElBQUEsK0JBQXVCLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDN0QsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQzdCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtnQkFDbEMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQjthQUM3QyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsT0FBTyxJQUFBLCtCQUF1QixFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBQzdELGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDN0IsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUNsQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO2FBQzdDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFsQ1csUUFBQSw4QkFBOEIsa0NBa0N6QztBQUVLLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxNQUFjLFlBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBVSxFQUFFO0lBQ3ZFLElBQUksT0FBTyxDQUFDO0lBRVosSUFBSTtRQUNGLGtCQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxPQUFPLEdBQUcsR0FBRyxDQUFDO0tBQ2Y7SUFBQyxPQUFPLEdBQUcsRUFBRTtRQUNaLDJDQUEyQztRQUMzQyx1QkFBdUI7UUFDdkIsT0FBTyxHQUFHLE1BQU0sQ0FBQztLQUNsQjtJQUVELE1BQU0sU0FBUyxHQUFHLElBQUEsV0FBSSxFQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2xELGtCQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQWZXLFFBQUEsa0JBQWtCLHNCQWU3QjtBQUVLLE1BQU0saUJBQWlCLEdBQUcsQ0FDL0IsU0FBaUIsRUFDakIsVUFBMkIsRUFDZixFQUFFO0lBQ2QsTUFBTSxNQUFNLEdBQVE7UUFDbEIsR0FBRyxFQUFFO1lBQ0gsUUFBUSxFQUFFLFNBQVM7U0FDcEI7UUFDRCxPQUFPLEVBQUU7WUFDUCxJQUFJLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUN2QixNQUFNLEVBQUUsV0FBVztZQUNuQixRQUFRLEVBQUUsT0FBTztZQUNqQixRQUFRLEVBQUU7Z0JBQ1IsSUFBSSxFQUFFLFFBQVE7YUFDZjtTQUNGO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFO2dCQUNSLEtBQUssRUFBRTtvQkFDTDt3QkFDRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVE7d0JBQzVCLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQzt3QkFDN0IsS0FBSyxFQUFFOzRCQUNMO2dDQUNFLEVBQUUsRUFBRSxVQUFVLENBQUMsSUFBSTtnQ0FDbkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2dDQUNuQyxRQUFRLEVBQUUsVUFBVSxDQUFDLE1BQU07Z0NBQzNCLEtBQUssRUFBRSxDQUFDOzZCQUNUO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7WUFDRCxjQUFjLEVBQUU7Z0JBQ2QsUUFBUSxFQUFFLE1BQU07YUFDakI7U0FDRjtLQUNGLENBQUM7SUFFRixJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDbEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLG1DQUN6QixNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsS0FDakMsUUFBUSxFQUFFLEtBQUssRUFDZixXQUFXLGdDQUNULFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxRQUFRLElBQy9DLENBQUMsT0FBTyxVQUFVLENBQUMsY0FBYyxLQUFLLFNBQVM7Z0JBQ2hELENBQUMsQ0FBQztvQkFDRSxhQUFhLEVBQUUsVUFBVSxDQUFDLGNBQWM7aUJBQ3pDO2dCQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsR0FDTixDQUFDLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUN2QyxDQUFDLENBQUM7b0JBQ0Usb0JBQW9CLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSztpQkFDeEM7Z0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUVaLENBQUM7S0FDSDtJQUVELElBQUksVUFBVSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7UUFDL0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLG1DQUN6QixNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsS0FDakMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQzNCLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7Z0JBQ3JCLE9BQU8sRUFBRTtvQkFDUCxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7b0JBQ3JCLFlBQVksRUFBRSxrQkFBTztpQkFDdEI7YUFDRixHQUNGLENBQUM7S0FDSDtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQTNFVyxRQUFBLGlCQUFpQixxQkEyRTVCO0FBRUssTUFBTSxtQkFBbUIsR0FBRyxDQUNqQyxPQUErQixFQUNQLEVBQUU7SUFDMUIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXJCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDbkMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQVZXLFFBQUEsbUJBQW1CLHVCQVU5QjtBQUVGLHVCQUF1QjtBQUNoQixNQUFNLElBQUksR0FBRyxDQUFDLEdBQVcsRUFBVyxFQUFFLENBQzNDLGFBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksYUFBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUR4QixRQUFBLElBQUksUUFDb0I7QUFFckMsdUJBQXVCO0FBQ2hCLE1BQU0sS0FBSyxHQUFHLEdBQVksRUFBRSxDQUNqQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLFdBQVc7SUFDN0MsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsS0FBSyxXQUFXLENBQUM7QUFGdEMsUUFBQSxLQUFLLFNBRWlDO0FBRW5ELHVCQUF1QjtBQUNoQixNQUFNLFFBQVEsR0FBRyxHQUFZLEVBQUUsQ0FBQyxJQUFBLGFBQUssR0FBRSxDQUFDO0FBQWxDLFFBQUEsUUFBUSxZQUEwQjtBQUUvQyx1QkFBdUI7QUFDaEIsTUFBTSxRQUFRLEdBQUcsR0FBWSxFQUFFLENBQUMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUM7QUFBbEUsUUFBQSxRQUFRLFlBQTBEO0FBRS9FLHVCQUF1QjtBQUNoQixNQUFNLGVBQWUsR0FBRyxHQUFZLEVBQUUsQ0FDM0MsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsS0FBSyxXQUFXLENBQUM7QUFEdkMsUUFBQSxlQUFlLG1CQUN3QjtBQUVwRCx1QkFBdUI7QUFDaEIsTUFBTSxVQUFVLEdBQUcsR0FBWSxFQUFFLENBQ3RDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssV0FBVyxDQUFDO0FBRGxDLFFBQUEsVUFBVSxjQUN3QjtBQUUvQyx1QkFBdUI7QUFDaEIsTUFBTSxXQUFXLEdBQUcsR0FBWSxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUEvRCxRQUFBLFdBQVcsZUFBb0Q7QUFFNUUsdUJBQXVCO0FBQ2hCLE1BQU0sU0FBUyxHQUFHLEdBQVksRUFBRSxDQUNyQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEtBQUssV0FBVyxDQUFDO0FBRDNDLFFBQUEsU0FBUyxhQUNrQyJ9
|
package/build/utils/loon.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.getLoonNodes = void 0;
|
|
4
7
|
const logger_1 = require("@surgio/logger");
|
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
5
9
|
const types_1 = require("../types");
|
|
6
10
|
const constant_1 = require("../constant");
|
|
7
11
|
const filter_1 = require("./filter");
|
|
8
|
-
const logger = (0, logger_1.createLogger)({ service: 'surgio:utils' });
|
|
12
|
+
const logger = (0, logger_1.createLogger)({ service: 'surgio:utils:loon' });
|
|
9
13
|
// @see https://www.notion.so/1-9809ce5acf524d868affee8dd5fc0a6e
|
|
10
14
|
const getLoonNodes = function (list, filter) {
|
|
11
15
|
if (arguments.length === 2 && typeof filter === 'undefined') {
|
|
@@ -31,6 +35,12 @@ const getLoonNodes = function (list, filter) {
|
|
|
31
35
|
return void 0;
|
|
32
36
|
}
|
|
33
37
|
}
|
|
38
|
+
if (nodeConfig.tfo) {
|
|
39
|
+
config.push('fast-open=true');
|
|
40
|
+
}
|
|
41
|
+
if (nodeConfig['udp-relay']) {
|
|
42
|
+
config.push('udp=true');
|
|
43
|
+
}
|
|
34
44
|
return config.join(',');
|
|
35
45
|
}
|
|
36
46
|
case types_1.NodeTypeEnum.Shadowsocksr: {
|
|
@@ -40,11 +50,17 @@ const getLoonNodes = function (list, filter) {
|
|
|
40
50
|
nodeConfig.port,
|
|
41
51
|
nodeConfig.method,
|
|
42
52
|
JSON.stringify(nodeConfig.password),
|
|
43
|
-
nodeConfig.protocol
|
|
44
|
-
`{
|
|
45
|
-
nodeConfig.obfs
|
|
46
|
-
`{
|
|
53
|
+
`protocol=${nodeConfig.protocol}`,
|
|
54
|
+
`protocol-param=${nodeConfig.protoparam}`,
|
|
55
|
+
`obfs=${nodeConfig.obfs}`,
|
|
56
|
+
`obfs-param=${nodeConfig.obfsparam}`,
|
|
47
57
|
];
|
|
58
|
+
if (nodeConfig.tfo) {
|
|
59
|
+
config.push('fast-open=true');
|
|
60
|
+
}
|
|
61
|
+
if (nodeConfig['udp-relay']) {
|
|
62
|
+
config.push('udp=true');
|
|
63
|
+
}
|
|
48
64
|
return config.join(',');
|
|
49
65
|
}
|
|
50
66
|
case types_1.NodeTypeEnum.Vmess: {
|
|
@@ -56,13 +72,16 @@ const getLoonNodes = function (list, filter) {
|
|
|
56
72
|
? `method=chacha20-ietf-poly1305`
|
|
57
73
|
: `method=${nodeConfig.method}`,
|
|
58
74
|
JSON.stringify(nodeConfig.uuid),
|
|
59
|
-
`transport
|
|
75
|
+
`transport=${nodeConfig.network}`,
|
|
60
76
|
];
|
|
61
77
|
if (nodeConfig.network === 'ws') {
|
|
62
|
-
config.push(`path
|
|
78
|
+
config.push(`path=${nodeConfig.path || '/'}`, `host=${nodeConfig.host || nodeConfig.hostname}`);
|
|
79
|
+
if (Object.keys(lodash_1.default.omit(nodeConfig.wsHeaders, 'host')).length > 0) {
|
|
80
|
+
logger.warn(`Loon 不支持自定义额外的 Header 字段,节点 ${nodeConfig.nodeName} 可能不可用`);
|
|
81
|
+
}
|
|
63
82
|
}
|
|
64
83
|
if (nodeConfig.tls) {
|
|
65
|
-
config.push(`over-tls
|
|
84
|
+
config.push(`over-tls=${nodeConfig.tls}`, `tls-name=${nodeConfig.host || nodeConfig.hostname}`, `skip-cert-verify=${nodeConfig.skipCertVerify === true}`);
|
|
66
85
|
}
|
|
67
86
|
return config.join(',');
|
|
68
87
|
}
|
|
@@ -72,28 +91,41 @@ const getLoonNodes = function (list, filter) {
|
|
|
72
91
|
nodeConfig.hostname,
|
|
73
92
|
nodeConfig.port,
|
|
74
93
|
JSON.stringify(nodeConfig.password),
|
|
75
|
-
`tls-name
|
|
76
|
-
`skip-cert-verify
|
|
94
|
+
`tls-name=${nodeConfig.sni || nodeConfig.hostname}`,
|
|
95
|
+
`skip-cert-verify=${nodeConfig.skipCertVerify === true}`,
|
|
77
96
|
];
|
|
97
|
+
if (nodeConfig.network === 'ws') {
|
|
98
|
+
config.push('transport=ws', `path=${nodeConfig.wsPath || '/'}`);
|
|
99
|
+
if (nodeConfig.wsHeaders) {
|
|
100
|
+
if (lodash_1.default.get(nodeConfig, 'wsHeaders.host')) {
|
|
101
|
+
config.push(`host=${nodeConfig.wsHeaders.host}`);
|
|
102
|
+
}
|
|
103
|
+
if (Object.keys(lodash_1.default.omit(nodeConfig.wsHeaders, 'host')).length > 0) {
|
|
104
|
+
logger.warn(`Loon 不支持自定义额外的 Header 字段,节点 ${nodeConfig.nodeName} 可能不可用`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
78
108
|
return config.join(',');
|
|
79
109
|
}
|
|
80
|
-
case types_1.NodeTypeEnum.HTTPS:
|
|
81
|
-
|
|
110
|
+
case types_1.NodeTypeEnum.HTTPS: {
|
|
111
|
+
const config = [
|
|
82
112
|
`${nodeConfig.nodeName} = https`,
|
|
83
113
|
nodeConfig.hostname,
|
|
84
114
|
nodeConfig.port,
|
|
85
115
|
nodeConfig.username /* istanbul ignore next */ || '',
|
|
86
|
-
JSON.stringify(nodeConfig.password
|
|
87
|
-
|
|
88
|
-
|
|
116
|
+
JSON.stringify(nodeConfig.password /* istanbul ignore next */ || ''),
|
|
117
|
+
`tls-name=${nodeConfig.sni || nodeConfig.hostname}`,
|
|
118
|
+
`skip-cert-verify=${nodeConfig.skipCertVerify === true}`,
|
|
119
|
+
];
|
|
120
|
+
return config.join(',');
|
|
121
|
+
}
|
|
89
122
|
case types_1.NodeTypeEnum.HTTP:
|
|
90
123
|
return [
|
|
91
124
|
`${nodeConfig.nodeName} = http`,
|
|
92
125
|
nodeConfig.hostname,
|
|
93
126
|
nodeConfig.port,
|
|
94
127
|
nodeConfig.username /* istanbul ignore next */ || '',
|
|
95
|
-
JSON.stringify(nodeConfig.password
|
|
96
|
-
'""',
|
|
128
|
+
JSON.stringify(nodeConfig.password /* istanbul ignore next */ || ''),
|
|
97
129
|
].join(',');
|
|
98
130
|
// istanbul ignore next
|
|
99
131
|
default:
|
|
@@ -105,4 +137,4 @@ const getLoonNodes = function (list, filter) {
|
|
|
105
137
|
return result.join('\n');
|
|
106
138
|
};
|
|
107
139
|
exports.getLoonNodes = getLoonNodes;
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy9sb29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJDQUE4QztBQUM5QyxvREFBdUI7QUFFdkIsb0NBS2tCO0FBQ2xCLDBDQUFpRDtBQUNqRCxxQ0FBdUM7QUFFdkMsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztBQUU5RCxnRUFBZ0U7QUFDekQsTUFBTSxZQUFZLEdBQUcsVUFDMUIsSUFBMkMsRUFDM0MsTUFBc0Q7SUFFdEQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7UUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBa0IsQ0FBQyxDQUFDO0tBQ3JDO0lBRUQsTUFBTSxNQUFNLEdBQTBCLElBQUEsb0JBQVcsRUFBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQzVELEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBc0IsRUFBRTtRQUN0QyxRQUFRLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDdkIsS0FBSyxvQkFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3QixNQUFNLE1BQU0sR0FBMkI7b0JBQ3JDLEdBQUcsVUFBVSxDQUFDLFFBQVEsZ0JBQWdCO29CQUN0QyxVQUFVLENBQUMsUUFBUTtvQkFDbkIsVUFBVSxDQUFDLElBQUk7b0JBQ2YsVUFBVSxDQUFDLE1BQU07b0JBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztpQkFDcEMsQ0FBQztnQkFFRixJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDN0MsTUFBTSxDQUFDLElBQUksQ0FD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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { HttpsNodeConfig, NodeNameFilterType, PossibleNodeConfigType, ShadowsocksNodeConfig, ShadowsocksrNodeConfig, SortedNodeNameFilterType, VmessNodeConfig } from '../types';
|
|
2
|
+
export declare const getQuantumultNodes: (list: ReadonlyArray<ShadowsocksNodeConfig | VmessNodeConfig | ShadowsocksrNodeConfig | HttpsNodeConfig>, groupName?: string, filter?: SortedNodeNameFilterType | NodeNameFilterType | undefined) => string;
|
|
3
|
+
/**
|
|
4
|
+
* @see https://github.com/crossutility/Quantumult-X/blob/master/sample.conf
|
|
5
|
+
*/
|
|
6
|
+
export declare const getQuantumultXNodes: (list: ReadonlyArray<PossibleNodeConfigType>, filter?: SortedNodeNameFilterType | NodeNameFilterType | undefined) => string;
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getQuantumultXNodes = exports.getQuantumultNodes = void 0;
|
|
7
|
+
const logger_1 = require("@surgio/logger");
|
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
9
|
+
const constant_1 = require("../constant");
|
|
10
|
+
const types_1 = require("../types");
|
|
11
|
+
const filter_1 = require("./filter");
|
|
12
|
+
const index_1 = require("./index");
|
|
13
|
+
const logger = (0, logger_1.createLogger)({ service: 'surgio:utils:quantumult' });
|
|
14
|
+
const getQuantumultNodes = function (list, groupName = 'Surgio', filter) {
|
|
15
|
+
// istanbul ignore next
|
|
16
|
+
if (arguments.length === 3 && typeof filter === 'undefined') {
|
|
17
|
+
throw new Error(constant_1.ERR_INVALID_FILTER);
|
|
18
|
+
}
|
|
19
|
+
function getHeader(wsHeaders) {
|
|
20
|
+
return Object.keys(wsHeaders)
|
|
21
|
+
.map((headerKey) => `${headerKey}:${wsHeaders[headerKey]}`)
|
|
22
|
+
.join('[Rr][Nn]');
|
|
23
|
+
}
|
|
24
|
+
const result = (0, filter_1.applyFilter)(list, filter)
|
|
25
|
+
.map((nodeConfig) => {
|
|
26
|
+
switch (nodeConfig.type) {
|
|
27
|
+
case types_1.NodeTypeEnum.Vmess: {
|
|
28
|
+
const config = [
|
|
29
|
+
'vmess',
|
|
30
|
+
nodeConfig.hostname,
|
|
31
|
+
nodeConfig.port,
|
|
32
|
+
nodeConfig.method === 'auto'
|
|
33
|
+
? 'chacha20-ietf-poly1305'
|
|
34
|
+
: nodeConfig.method,
|
|
35
|
+
JSON.stringify(nodeConfig.uuid),
|
|
36
|
+
nodeConfig.alterId,
|
|
37
|
+
`group=${groupName}`,
|
|
38
|
+
`over-tls=${nodeConfig.tls === true ? 'true' : 'false'}`,
|
|
39
|
+
`certificate=1`,
|
|
40
|
+
`obfs=${nodeConfig.network}`,
|
|
41
|
+
`obfs-path=${JSON.stringify(nodeConfig.path || '/')}`,
|
|
42
|
+
`obfs-header=${JSON.stringify(getHeader(Object.assign({ host: nodeConfig.host || nodeConfig.hostname, 'user-agent': constant_1.OBFS_UA }, lodash_1.default.omit(nodeConfig.wsHeaders, ['host']))))}`,
|
|
43
|
+
]
|
|
44
|
+
.filter((value) => !!value)
|
|
45
|
+
.join(',');
|
|
46
|
+
return ('vmess://' + (0, index_1.toBase64)([nodeConfig.nodeName, config].join(' = ')));
|
|
47
|
+
}
|
|
48
|
+
case types_1.NodeTypeEnum.Shadowsocks: {
|
|
49
|
+
return (0, index_1.getShadowsocksNodes)([nodeConfig], groupName);
|
|
50
|
+
}
|
|
51
|
+
case types_1.NodeTypeEnum.Shadowsocksr:
|
|
52
|
+
return (0, index_1.getShadowsocksrNodes)([nodeConfig], groupName);
|
|
53
|
+
case types_1.NodeTypeEnum.HTTPS: {
|
|
54
|
+
const config = [
|
|
55
|
+
nodeConfig.nodeName,
|
|
56
|
+
[
|
|
57
|
+
'http',
|
|
58
|
+
`upstream-proxy-address=${nodeConfig.hostname}`,
|
|
59
|
+
`upstream-proxy-port=${nodeConfig.port}`,
|
|
60
|
+
'upstream-proxy-auth=true',
|
|
61
|
+
`upstream-proxy-username=${nodeConfig.username}`,
|
|
62
|
+
`upstream-proxy-password=${nodeConfig.password}`,
|
|
63
|
+
'over-tls=true',
|
|
64
|
+
'certificate=1',
|
|
65
|
+
].join(', '),
|
|
66
|
+
].join(' = ');
|
|
67
|
+
return 'http://' + (0, index_1.toBase64)(config);
|
|
68
|
+
}
|
|
69
|
+
// istanbul ignore next
|
|
70
|
+
default:
|
|
71
|
+
logger.warn(`不支持为 Quantumult 生成 ${nodeConfig.type} 的节点,节点 ${nodeConfig.nodeName} 会被省略`);
|
|
72
|
+
return void 0;
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
.filter((item) => item !== undefined);
|
|
76
|
+
return result.join('\n');
|
|
77
|
+
};
|
|
78
|
+
exports.getQuantumultNodes = getQuantumultNodes;
|
|
79
|
+
/**
|
|
80
|
+
* @see https://github.com/crossutility/Quantumult-X/blob/master/sample.conf
|
|
81
|
+
*/
|
|
82
|
+
const getQuantumultXNodes = function (list, filter) {
|
|
83
|
+
// istanbul ignore next
|
|
84
|
+
if (arguments.length === 2 && typeof filter === 'undefined') {
|
|
85
|
+
throw new Error(constant_1.ERR_INVALID_FILTER);
|
|
86
|
+
}
|
|
87
|
+
const result = (0, filter_1.applyFilter)(list, filter)
|
|
88
|
+
.map((nodeConfig) => {
|
|
89
|
+
var _a;
|
|
90
|
+
switch (nodeConfig.type) {
|
|
91
|
+
case types_1.NodeTypeEnum.Vmess: {
|
|
92
|
+
const config = [
|
|
93
|
+
`${nodeConfig.hostname}:${nodeConfig.port}`,
|
|
94
|
+
// method 为 auto 时 qx 会无法识别
|
|
95
|
+
nodeConfig.method === 'auto'
|
|
96
|
+
? `method=chacha20-ietf-poly1305`
|
|
97
|
+
: `method=${nodeConfig.method}`,
|
|
98
|
+
`password=${nodeConfig.uuid}`,
|
|
99
|
+
...(nodeConfig['udp-relay'] ? ['udp-relay=true'] : []),
|
|
100
|
+
...(nodeConfig.tfo ? ['fast-open=true'] : []),
|
|
101
|
+
...(((_a = nodeConfig.quantumultXConfig) === null || _a === void 0 ? void 0 : _a.vmessAEAD)
|
|
102
|
+
? ['aead=true']
|
|
103
|
+
: ['aead=false']),
|
|
104
|
+
];
|
|
105
|
+
switch (nodeConfig.network) {
|
|
106
|
+
case 'ws':
|
|
107
|
+
if (nodeConfig.tls) {
|
|
108
|
+
config.push(`obfs=wss`);
|
|
109
|
+
if (nodeConfig.skipCertVerify) {
|
|
110
|
+
config.push('tls-verification=false');
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
config.push('tls-verification=true');
|
|
114
|
+
}
|
|
115
|
+
// istanbul ignore next
|
|
116
|
+
if (nodeConfig.tls13) {
|
|
117
|
+
config.push(`tls13=true`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
config.push(`obfs=ws`);
|
|
122
|
+
}
|
|
123
|
+
config.push(`obfs-uri=${nodeConfig.path || '/'}`);
|
|
124
|
+
config.push(`obfs-host=${nodeConfig.host || nodeConfig.hostname}`);
|
|
125
|
+
break;
|
|
126
|
+
case 'tcp':
|
|
127
|
+
if (nodeConfig.tls) {
|
|
128
|
+
config.push(`obfs=over-tls`);
|
|
129
|
+
if (nodeConfig.skipCertVerify) {
|
|
130
|
+
config.push('tls-verification=false');
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
config.push('tls-verification=true');
|
|
134
|
+
}
|
|
135
|
+
// istanbul ignore next
|
|
136
|
+
if (nodeConfig.tls13) {
|
|
137
|
+
config.push(`tls13=true`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
141
|
+
default:
|
|
142
|
+
// do nothing
|
|
143
|
+
}
|
|
144
|
+
config.push(`tag=${nodeConfig.nodeName}`);
|
|
145
|
+
// istanbul ignore next
|
|
146
|
+
if (nodeConfig.wsHeaders &&
|
|
147
|
+
Object.keys(nodeConfig.wsHeaders).length > 1) {
|
|
148
|
+
logger.warn(`Quantumult X 不支持自定义额外的 Header 字段,节点 ${nodeConfig.nodeName} 可能不可用`);
|
|
149
|
+
}
|
|
150
|
+
return `vmess=${config.join(', ')}`;
|
|
151
|
+
}
|
|
152
|
+
case types_1.NodeTypeEnum.Shadowsocks: {
|
|
153
|
+
const config = [
|
|
154
|
+
`${nodeConfig.hostname}:${nodeConfig.port}`,
|
|
155
|
+
...(0, index_1.pickAndFormatStringList)(nodeConfig, ['method', 'password']),
|
|
156
|
+
...(nodeConfig.obfs && ['http', 'tls'].includes(nodeConfig.obfs)
|
|
157
|
+
? [
|
|
158
|
+
`obfs=${nodeConfig.obfs}`,
|
|
159
|
+
`obfs-host=${nodeConfig['obfs-host']}`,
|
|
160
|
+
]
|
|
161
|
+
: []),
|
|
162
|
+
...(nodeConfig.obfs && ['ws', 'wss'].includes(nodeConfig.obfs)
|
|
163
|
+
? [
|
|
164
|
+
`obfs=${nodeConfig.obfs}`,
|
|
165
|
+
`obfs-host=${nodeConfig['obfs-host'] || nodeConfig.hostname}`,
|
|
166
|
+
`obfs-uri=${nodeConfig['obfs-uri'] || '/'}`,
|
|
167
|
+
]
|
|
168
|
+
: []),
|
|
169
|
+
...(nodeConfig['udp-relay'] ? [`udp-relay=true`] : []),
|
|
170
|
+
...(nodeConfig.tfo ? [`fast-open=${nodeConfig.tfo}`] : []),
|
|
171
|
+
];
|
|
172
|
+
if (nodeConfig.obfs === 'wss') {
|
|
173
|
+
if (nodeConfig.skipCertVerify) {
|
|
174
|
+
config.push('tls-verification=false');
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
config.push('tls-verification=true');
|
|
178
|
+
}
|
|
179
|
+
if (nodeConfig.tls13) {
|
|
180
|
+
config.push('tls13=true');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// istanbul ignore next
|
|
184
|
+
if (nodeConfig.wsHeaders &&
|
|
185
|
+
Object.keys(lodash_1.default.omit(nodeConfig.wsHeaders, ['host'])).length > 0) {
|
|
186
|
+
logger.warn(`Quantumult X 不支持自定义额外的 Header 字段,节点 ${nodeConfig.nodeName} 可能不可用`);
|
|
187
|
+
}
|
|
188
|
+
config.push(`tag=${nodeConfig.nodeName}`);
|
|
189
|
+
return `shadowsocks=${config.join(', ')}`;
|
|
190
|
+
}
|
|
191
|
+
case types_1.NodeTypeEnum.Shadowsocksr: {
|
|
192
|
+
const config = [
|
|
193
|
+
`${nodeConfig.hostname}:${nodeConfig.port}`,
|
|
194
|
+
...(0, index_1.pickAndFormatStringList)(nodeConfig, ['method', 'password']),
|
|
195
|
+
`ssr-protocol=${nodeConfig.protocol}`,
|
|
196
|
+
`ssr-protocol-param=${nodeConfig.protoparam}`,
|
|
197
|
+
`obfs=${nodeConfig.obfs}`,
|
|
198
|
+
`obfs-host=${nodeConfig.obfsparam}`,
|
|
199
|
+
...(nodeConfig['udp-relay'] ? [`udp-relay=true`] : []),
|
|
200
|
+
...(nodeConfig.tfo ? [`fast-open=${nodeConfig.tfo}`] : []),
|
|
201
|
+
`tag=${nodeConfig.nodeName}`,
|
|
202
|
+
].join(', ');
|
|
203
|
+
return `shadowsocks=${config}`;
|
|
204
|
+
}
|
|
205
|
+
case types_1.NodeTypeEnum.HTTP:
|
|
206
|
+
case types_1.NodeTypeEnum.HTTPS: {
|
|
207
|
+
const config = [
|
|
208
|
+
`${nodeConfig.hostname}:${nodeConfig.port}`,
|
|
209
|
+
...(0, index_1.pickAndFormatStringList)(nodeConfig, ['username', 'password']),
|
|
210
|
+
...(nodeConfig.tfo ? [`fast-open=${nodeConfig.tfo}`] : []),
|
|
211
|
+
];
|
|
212
|
+
if (nodeConfig.type === types_1.NodeTypeEnum.HTTPS) {
|
|
213
|
+
config.push('over-tls=true', `tls-verification=${nodeConfig.skipCertVerify !== true}`, ...(nodeConfig.tls13 ? [`tls13=${nodeConfig.tls13}`] : []));
|
|
214
|
+
}
|
|
215
|
+
config.push(`tag=${nodeConfig.nodeName}`);
|
|
216
|
+
return `http=${config.join(', ')}`;
|
|
217
|
+
}
|
|
218
|
+
case types_1.NodeTypeEnum.Trojan: {
|
|
219
|
+
const config = [
|
|
220
|
+
`${nodeConfig.hostname}:${nodeConfig.port}`,
|
|
221
|
+
...(0, index_1.pickAndFormatStringList)(nodeConfig, ['password']),
|
|
222
|
+
'over-tls=true',
|
|
223
|
+
`tls-verification=${nodeConfig.skipCertVerify !== true}`,
|
|
224
|
+
...(nodeConfig.sni ? [`tls-host=${nodeConfig.sni}`] : []),
|
|
225
|
+
...(nodeConfig.tfo ? [`fast-open=${nodeConfig.tfo}`] : []),
|
|
226
|
+
...(nodeConfig['udp-relay'] ? [`udp-relay=true`] : []),
|
|
227
|
+
...(nodeConfig.tls13 ? [`tls13=${nodeConfig.tls13}`] : []),
|
|
228
|
+
];
|
|
229
|
+
if (nodeConfig.network === 'ws') {
|
|
230
|
+
config.push('obfs=wss');
|
|
231
|
+
if (nodeConfig.wsPath) {
|
|
232
|
+
config.push(`obfs-uri=${nodeConfig.wsPath}`);
|
|
233
|
+
}
|
|
234
|
+
if (nodeConfig.wsHeaders && nodeConfig.wsHeaders.host) {
|
|
235
|
+
config.push(`obfs-host=${nodeConfig.wsHeaders.host}`);
|
|
236
|
+
// istanbul ignore next
|
|
237
|
+
if (Object.keys(lodash_1.default.omit(nodeConfig.wsHeaders, ['host'])).length > 0) {
|
|
238
|
+
logger.warn(`Quantumult X 不支持自定义额外的 Header 字段,节点 ${nodeConfig.nodeName} 可能不可用`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
config.push(`tag=${nodeConfig.nodeName}`);
|
|
243
|
+
return `trojan=${config.join(', ')}`;
|
|
244
|
+
}
|
|
245
|
+
// istanbul ignore next
|
|
246
|
+
default:
|
|
247
|
+
logger.warn(`不支持为 QuantumultX 生成 ${nodeConfig.type} 的节点,节点 ${nodeConfig.nodeName} 会被省略`);
|
|
248
|
+
return void 0;
|
|
249
|
+
}
|
|
250
|
+
})
|
|
251
|
+
.filter((item) => item !== undefined);
|
|
252
|
+
return result.join('\n');
|
|
253
|
+
};
|
|
254
|
+
exports.getQuantumultXNodes = getQuantumultXNodes;
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbnR1bXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy9xdWFudHVtdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJDQUE4QztBQUM5QyxvREFBdUI7QUFFdkIsMENBQTBEO0FBQzFELG9DQVNrQjtBQUNsQixxQ0FBdUM7QUFDdkMsbUNBS2lCO0FBRWpCLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksRUFBQyxFQUFFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxDQUFDLENBQUM7QUFFN0QsTUFBTSxrQkFBa0IsR0FBRyxVQUNoQyxJQUtDLEVBQ0QsU0FBUyxHQUFHLFFBQVEsRUFDcEIsTUFBc0Q7SUFFdEQsdUJBQXVCO0lBQ3ZCLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO1FBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQWtCLENBQUMsQ0FBQztLQUNyQztJQUVELFNBQVMsU0FBUyxDQUFDLFNBQWlDO1FBQ2xELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDMUIsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzthQUMxRCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUEwQixJQUFBLG9CQUFXLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztTQUM1RCxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQXNCLEVBQUU7UUFDdEMsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssb0JBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsT0FBTztvQkFDUCxVQUFVLENBQUMsUUFBUTtvQkFDbkIsVUFBVSxDQUFDLElB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
|