dsh-zen-remote 2.3.11 → 2.4.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 +39 -78
- package/README.md +94 -84
- package/README.zh-CN.md +90 -81
- package/bin/zen-remote.mjs +5 -0
- package/docs/interface.md +6 -6
- package/docs/remote-access.en.md +6 -4
- package/docs/remote-access.md +6 -4
- package/dsh-push.mjs +96 -10
- package/lib/adapters/dsh-better-sidebar/index.js +7 -3
- package/lib/adapters/dsh-better-sidebar/index.js.map +1 -1
- package/lib/admin-routes.js +10 -2
- package/lib/admin-routes.js.map +1 -1
- package/lib/cli/args.js +251 -0
- package/lib/cli/args.js.map +1 -0
- package/lib/cli/bootstrap.js +449 -0
- package/lib/cli/bootstrap.js.map +1 -0
- package/lib/cli/command-setup.js +484 -0
- package/lib/cli/command-setup.js.map +1 -0
- package/lib/cli/commands-client.js +359 -0
- package/lib/cli/commands-client.js.map +1 -0
- package/lib/cli/commands-host.js +1108 -0
- package/lib/cli/commands-host.js.map +1 -0
- package/lib/cli/commands-status.js +279 -0
- package/lib/cli/commands-status.js.map +1 -0
- package/lib/cli/config-writer.js +334 -0
- package/lib/cli/config-writer.js.map +1 -0
- package/lib/cli/context.js +10 -0
- package/lib/cli/context.js.map +1 -0
- package/lib/cli/i18n.js +620 -0
- package/lib/cli/i18n.js.map +1 -0
- package/lib/cli/ipc-client.js +160 -0
- package/lib/cli/ipc-client.js.map +1 -0
- package/lib/cli/ipc-server.js +464 -0
- package/lib/cli/ipc-server.js.map +1 -0
- package/lib/cli/main.js +245 -0
- package/lib/cli/main.js.map +1 -0
- package/lib/cli/qr-terminal.js +48 -0
- package/lib/cli/qr-terminal.js.map +1 -0
- package/lib/client-data/qr.js +286 -0
- package/lib/client-data/qr.js.map +1 -0
- package/lib/client-routes.js +308 -25
- package/lib/client-routes.js.map +1 -1
- package/lib/client.js +1013 -229
- package/lib/config.js +50 -12
- package/lib/config.js.map +1 -1
- package/lib/debug-report.js +28 -1
- package/lib/debug-report.js.map +1 -1
- package/lib/fetch-route-intercept.js +334 -26
- package/lib/fetch-route-intercept.js.map +1 -1
- package/lib/index.js +564 -363
- package/lib/index.js.map +1 -1
- package/lib/intercept.js +1833 -280
- package/lib/intercept.js.map +1 -1
- package/lib/lan-gate-server.cjs +36 -10
- package/lib/merge-streams.js +103 -11
- package/lib/merge-streams.js.map +1 -1
- package/lib/plugin-route-intercept.js +93 -63
- package/lib/plugin-route-intercept.js.map +1 -1
- package/lib/relay-access.js +8 -1
- package/lib/relay-access.js.map +1 -1
- package/lib/relay-client.js +133 -4
- package/lib/relay-client.js.map +1 -1
- package/lib/relay-pool.js +275 -0
- package/lib/relay-pool.js.map +1 -0
- package/lib/relay-server.js +269 -17
- package/lib/relay-server.js.map +1 -1
- package/lib/restart-fields.js +6 -4
- package/lib/restart-fields.js.map +1 -1
- package/lib/share-store.js +65 -27
- package/lib/share-store.js.map +1 -1
- package/lib/state-store.js +400 -0
- package/lib/state-store.js.map +1 -0
- package/lib/types/adapters/dsh-better-sidebar/index.d.ts +3 -2
- package/lib/types/adapters/dsh-better-sidebar/index.d.ts.map +1 -1
- package/lib/types/admin-routes.d.ts.map +1 -1
- package/lib/types/cli/args.d.ts +78 -0
- package/lib/types/cli/args.d.ts.map +1 -0
- package/lib/types/cli/bootstrap.d.ts +170 -0
- package/lib/types/cli/bootstrap.d.ts.map +1 -0
- package/lib/types/cli/command-setup.d.ts +72 -0
- package/lib/types/cli/command-setup.d.ts.map +1 -0
- package/lib/types/cli/commands-client.d.ts +36 -0
- package/lib/types/cli/commands-client.d.ts.map +1 -0
- package/lib/types/cli/commands-host.d.ts +82 -0
- package/lib/types/cli/commands-host.d.ts.map +1 -0
- package/lib/types/cli/commands-status.d.ts +46 -0
- package/lib/types/cli/commands-status.d.ts.map +1 -0
- package/lib/types/cli/config-writer.d.ts +92 -0
- package/lib/types/cli/config-writer.d.ts.map +1 -0
- package/lib/types/cli/context.d.ts +39 -0
- package/lib/types/cli/context.d.ts.map +1 -0
- package/lib/types/cli/i18n.d.ts +32 -0
- package/lib/types/cli/i18n.d.ts.map +1 -0
- package/lib/types/cli/ipc-client.d.ts +83 -0
- package/lib/types/cli/ipc-client.d.ts.map +1 -0
- package/lib/types/cli/ipc-server.d.ts +113 -0
- package/lib/types/cli/ipc-server.d.ts.map +1 -0
- package/lib/types/cli/main.d.ts +57 -0
- package/lib/types/cli/main.d.ts.map +1 -0
- package/lib/types/cli/qr-terminal.d.ts +17 -0
- package/lib/types/cli/qr-terminal.d.ts.map +1 -0
- package/lib/types/client/RemoteStatusIcon.d.ts.map +1 -1
- package/lib/types/client/current-session-report.d.ts +4 -0
- package/lib/types/client/current-session-report.d.ts.map +1 -1
- package/lib/types/client/effects/model-group-side.d.ts.map +1 -1
- package/lib/types/client/effects/remote-session.d.ts.map +1 -1
- package/lib/types/client/locales.d.ts +47 -3
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/settings/SettingsSection.d.ts.map +1 -1
- package/lib/types/client/settings/settings-css.d.ts +1 -1
- package/lib/types/client/settings/settings-css.d.ts.map +1 -1
- package/lib/types/client/styles/remote-session.css.d.ts +1 -1
- package/lib/types/client/styles/remote-session.css.d.ts.map +1 -1
- package/lib/types/client/wizard/GatewayWizard.d.ts.map +1 -1
- package/lib/types/client/wizard/cards/ProxyCard.d.ts.map +1 -1
- package/lib/types/client/wizard/wizard-css.d.ts +1 -1
- package/lib/types/client/wizard/wizard-css.d.ts.map +1 -1
- package/lib/types/client-data/model-group-side.d.ts +23 -2
- package/lib/types/client-data/model-group-side.d.ts.map +1 -1
- package/lib/types/client-data/remote-status.d.ts +47 -1
- package/lib/types/client-data/remote-status.d.ts.map +1 -1
- package/lib/types/client-data/settings-form.d.ts +85 -1
- package/lib/types/client-data/settings-form.d.ts.map +1 -1
- package/lib/types/client-data/wizard.d.ts +56 -1
- package/lib/types/client-data/wizard.d.ts.map +1 -1
- package/lib/types/client-routes.d.ts +25 -1
- package/lib/types/client-routes.d.ts.map +1 -1
- package/lib/types/config.d.ts +40 -14
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/debug-report.d.ts.map +1 -1
- package/lib/types/fetch-route-intercept.d.ts +66 -8
- package/lib/types/fetch-route-intercept.d.ts.map +1 -1
- package/lib/types/index.d.ts +9 -2
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/intercept.d.ts +72 -10
- package/lib/types/intercept.d.ts.map +1 -1
- package/lib/types/merge-streams.d.ts +79 -1
- package/lib/types/merge-streams.d.ts.map +1 -1
- package/lib/types/plugin-route-intercept.d.ts +25 -9
- package/lib/types/plugin-route-intercept.d.ts.map +1 -1
- package/lib/types/relay-access.d.ts +3 -1
- package/lib/types/relay-access.d.ts.map +1 -1
- package/lib/types/relay-client.d.ts +23 -2
- package/lib/types/relay-client.d.ts.map +1 -1
- package/lib/types/relay-pool.d.ts +148 -0
- package/lib/types/relay-pool.d.ts.map +1 -0
- package/lib/types/relay-server.d.ts +30 -3
- package/lib/types/relay-server.d.ts.map +1 -1
- package/lib/types/restart-fields.d.ts +5 -5
- package/lib/types/restart-fields.d.ts.map +1 -1
- package/lib/types/share-store.d.ts.map +1 -1
- package/lib/types/state-store.d.ts +179 -0
- package/lib/types/state-store.d.ts.map +1 -0
- package/lib/types/upload-limits.d.ts +15 -0
- package/lib/types/upload-limits.d.ts.map +1 -1
- package/lib/types/virtual-id.d.ts +21 -0
- package/lib/types/virtual-id.d.ts.map +1 -1
- package/lib/types/wizard/probe.d.ts.map +1 -1
- package/lib/types/wizard/proxy-snippets.d.ts +3 -0
- package/lib/types/wizard/proxy-snippets.d.ts.map +1 -1
- package/lib/types/wizard/routes.d.ts +1 -0
- package/lib/types/wizard/routes.d.ts.map +1 -1
- package/lib/types/wizard/status.d.ts +9 -0
- package/lib/types/wizard/status.d.ts.map +1 -1
- package/lib/types/wizard/verify.d.ts +3 -0
- package/lib/types/wizard/verify.d.ts.map +1 -1
- package/lib/upload-limits.js +15 -0
- package/lib/upload-limits.js.map +1 -1
- package/lib/virtual-id.js +60 -0
- package/lib/virtual-id.js.map +1 -1
- package/lib/wizard/probe.js +46 -1
- package/lib/wizard/probe.js.map +1 -1
- package/lib/wizard/proxy-snippets.js +14 -1
- package/lib/wizard/proxy-snippets.js.map +1 -1
- package/lib/wizard/routes.js +23 -4
- package/lib/wizard/routes.js.map +1 -1
- package/lib/wizard/status.js +21 -0
- package/lib/wizard/status.js.map +1 -1
- package/lib/wizard/verify.js +31 -8
- package/lib/wizard/verify.js.map +1 -1
- package/package.json +8 -4
- package/pwa/icons/badge-96.png +0 -0
- package/pwa/icons/badge.svg +1 -0
- package/pwa/manifest.json +2 -1
- package/pwa/sw.js +3 -1
- package/scripts/check-debug-report.mjs +41 -1
- package/scripts/check-settings-form.mjs +14 -3
- package/scripts/check-settings-view.mjs +247 -0
- package/scripts/check-wizard-ui.mjs +37 -0
- package/src/adapters/dsh-better-sidebar/index.ts +7 -3
- package/src/admin-routes.ts +10 -2
- package/src/cli/args.ts +289 -0
- package/src/cli/bootstrap.ts +569 -0
- package/src/cli/command-setup.ts +540 -0
- package/src/cli/commands-client.ts +369 -0
- package/src/cli/commands-host.ts +1127 -0
- package/src/cli/commands-status.ts +296 -0
- package/src/cli/config-writer.ts +354 -0
- package/src/cli/context.ts +38 -0
- package/src/cli/i18n.ts +645 -0
- package/src/cli/ipc-client.ts +216 -0
- package/src/cli/ipc-server.ts +531 -0
- package/src/cli/main.ts +285 -0
- package/src/cli/qr-terminal.ts +49 -0
- package/src/client/RemoteStatusIcon.tsx +4 -1
- package/src/client/current-session-report.ts +28 -4
- package/src/client/effects/model-group-side.ts +19 -5
- package/src/client/effects/remote-session.ts +26 -6
- package/src/client/locales.ts +96 -6
- package/src/client/settings/SettingsSection.tsx +287 -92
- package/src/client/settings/settings-css.ts +18 -0
- package/src/client/styles/remote-session.css.ts +15 -1
- package/src/client/wizard/GatewayWizard.tsx +470 -109
- package/src/client/wizard/cards/ProxyCard.tsx +2 -1
- package/src/client/wizard/wizard-css.ts +23 -0
- package/src/client-data/model-group-side.ts +37 -10
- package/src/client-data/remote-status.ts +112 -17
- package/src/client-data/settings-form.ts +164 -8
- package/src/client-data/wizard.ts +112 -2
- package/src/client-routes.ts +334 -26
- package/src/config.ts +62 -16
- package/src/debug-report.ts +27 -1
- package/src/fetch-route-intercept.ts +381 -32
- package/src/index.ts +566 -367
- package/src/intercept.ts +1866 -286
- package/src/merge-streams.ts +155 -10
- package/src/plugin-route-intercept.ts +120 -71
- package/src/relay-access.ts +14 -3
- package/src/relay-client.ts +163 -5
- package/src/relay-pool.ts +387 -0
- package/src/relay-server.ts +312 -16
- package/src/restart-fields.ts +6 -4
- package/src/share-store.ts +59 -26
- package/src/state-store.ts +428 -0
- package/src/upload-limits.ts +16 -0
- package/src/virtual-id.ts +57 -0
- package/src/wizard/probe.ts +54 -2
- package/src/wizard/proxy-snippets.ts +17 -2
- package/src/wizard/routes.ts +24 -5
- package/src/wizard/status.ts +28 -0
- package/src/wizard/verify.ts +33 -11
- package/AGENTS.md +0 -185
- package/docs/adr/0001-plugin-bridge-forwards-plugin-routes.md +0 -15
- package/docs/adr/0002-relay-emulates-websocket.md +0 -8
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI-5: the `setup` end-to-end wizard — the web three-step wizard
|
|
3
|
+
* (`GatewayWizard.tsx`) rendered onto a terminal, in one interactive /
|
|
4
|
+
* parametric state machine: command-line-provided answers are taken as-is,
|
|
5
|
+
* missing ones are asked in a TTY run and raise MissingRequiredOptionError
|
|
6
|
+
* in a `--yes` / headless run.
|
|
7
|
+
*
|
|
8
|
+
* Preflight (SPEC §4) runs FIRST and always: discover the plugin's IPC
|
|
9
|
+
* socket — when nothing live answers (or `--profile` was given explicitly)
|
|
10
|
+
* the multi-select profile install runs, then `ensureDshRunning` brings a
|
|
11
|
+
* DSH up (daemon trigger + bounded poll). Everything after that goes through
|
|
12
|
+
* THAT live IPC client.
|
|
13
|
+
*
|
|
14
|
+
* Step 1 is the role. Switching mirrors GatewayWizard.tsx's discipline
|
|
15
|
+
* exactly: host → client stops the managed Caddy / Cloudflare tunnel through
|
|
16
|
+
* their IPC stop routes BEFORE writing `role: 'client'`, then polls ping
|
|
17
|
+
* until `connects`; client → host writes `role: 'host'` and polls until
|
|
18
|
+
* `serves` (the row reloads under the CLI — the hot-swap socket never
|
|
19
|
+
* drops).
|
|
20
|
+
*
|
|
21
|
+
* Steps 2 & 3 are NOT reimplementations: the host branch drives
|
|
22
|
+
* `runHostIngressStartCommand` / `runHostIngressVerifyCommand` (mode
|
|
23
|
+
* switch cleanup, snippets, three lights, QR) and the client branch drives
|
|
24
|
+
* `runClientPairCommand` / `runClientUnpairCommand` (claim, handshake lights,
|
|
25
|
+
* removal) — the same code `host *` / `client *` use, over a synthesized
|
|
26
|
+
* argv. `setup`'s own additions are only the flow around them: the
|
|
27
|
+
* keep-current-config choice, the two-question recommendation funnel, the
|
|
28
|
+
* retry menu after a failed verification, the desktop-client pairing
|
|
29
|
+
* follow-up, and the paired-host management menu.
|
|
30
|
+
*/
|
|
31
|
+
import { parseCliArgs } from './args.js';
|
|
32
|
+
import { ensureDshRunning, ensurePluginInstalled, MissingRequiredOptionError } from './bootstrap.js';
|
|
33
|
+
import { discoverCliSockets } from './ipc-client.js';
|
|
34
|
+
import { CLI_PROTOCOL_VERSION } from './ipc-server.js';
|
|
35
|
+
import { fetchBody, plainOf, serverLineText } from './commands-status.js';
|
|
36
|
+
import { runHostDevicePairCommand, runHostIngressStartCommand, runHostIngressVerifyCommand, writeConfigOrReport, } from './commands-host.js';
|
|
37
|
+
import { runClientPairCommand, runClientUnpairCommand } from './commands-client.js';
|
|
38
|
+
import { WIZARD_STATUS_ROUTE, WIZARD_CADDY_STOP_ROUTE, WIZARD_TUNNEL_STOP_ROUTE } from '../wizard/routes.js';
|
|
39
|
+
import { CLIENT_STATUS_ROUTE } from '../client-routes.js';
|
|
40
|
+
const INGRESS_MODES = ['caddy', 'cloudflared', 'external', 'lan'];
|
|
41
|
+
/** The role-switch ping poll: frequent by default, tests shrink it. */
|
|
42
|
+
const ROLE_POLL_INTERVAL_DEFAULT_MS = 300;
|
|
43
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
44
|
+
// ===========================================================================
|
|
45
|
+
// Small helpers
|
|
46
|
+
// ===========================================================================
|
|
47
|
+
/** A command context for one of the driven subcommands: same translator,
|
|
48
|
+
* interactivity, prompter and seams, fresh args from a synthesized argv. */
|
|
49
|
+
function commandCtx(ctx, argv, ipc) {
|
|
50
|
+
return {
|
|
51
|
+
args: parseCliArgs(argv),
|
|
52
|
+
ipc,
|
|
53
|
+
t: ctx.t,
|
|
54
|
+
interactive: ctx.interactive,
|
|
55
|
+
...(ctx.prompter === undefined ? {} : { prompter: ctx.prompter }),
|
|
56
|
+
stdout: ctx.stdout,
|
|
57
|
+
...(ctx.now === undefined ? {} : { now: ctx.now }),
|
|
58
|
+
...(ctx.cwd === undefined ? {} : { cwd: ctx.cwd }),
|
|
59
|
+
...(ctx.pollIntervalMs === undefined ? {} : { pollIntervalMs: ctx.pollIntervalMs }),
|
|
60
|
+
...(ctx.abortSignal === undefined ? {} : { abortSignal: ctx.abortSignal }),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** The user's setup options, re-issued as argv for the driven subcommands —
|
|
64
|
+
* the inner flows read the SAME values (`--domain`, `--cf-token`,
|
|
65
|
+
* `--no-wait`, …) they would have read from a direct `host` / `client`
|
|
66
|
+
* invocation. */
|
|
67
|
+
function carryOptionArgs(options) {
|
|
68
|
+
const argv = [];
|
|
69
|
+
if (options.wait !== 20)
|
|
70
|
+
argv.push('--wait', String(options.wait));
|
|
71
|
+
if (options.noWait)
|
|
72
|
+
argv.push('--no-wait');
|
|
73
|
+
if (options.domain !== undefined)
|
|
74
|
+
argv.push('--domain', options.domain);
|
|
75
|
+
if (options.cfToken !== undefined)
|
|
76
|
+
argv.push('--cf-token', options.cfToken);
|
|
77
|
+
if (options.email !== undefined)
|
|
78
|
+
argv.push('--email', options.email);
|
|
79
|
+
if (options.httpsPort !== undefined)
|
|
80
|
+
argv.push('--https-port', String(options.httpsPort));
|
|
81
|
+
if (options.publicUrl !== undefined)
|
|
82
|
+
argv.push('--public-url', options.publicUrl);
|
|
83
|
+
if (options.tunnelId !== undefined)
|
|
84
|
+
argv.push('--tunnel-id', options.tunnelId);
|
|
85
|
+
if (options.proxy !== undefined)
|
|
86
|
+
argv.push('--proxy', options.proxy);
|
|
87
|
+
if (options.hostUrl !== undefined)
|
|
88
|
+
argv.push('--host-url', options.hostUrl);
|
|
89
|
+
if (options.code !== undefined)
|
|
90
|
+
argv.push('--code', options.code);
|
|
91
|
+
if (options.name !== undefined)
|
|
92
|
+
argv.push('--name', options.name);
|
|
93
|
+
return argv;
|
|
94
|
+
}
|
|
95
|
+
/** The pool rows of a client/status answer, defensively filtered. */
|
|
96
|
+
function serversOfRow(body) {
|
|
97
|
+
const rows = body === null ? [] : Array.isArray(body.servers) ? body.servers : [];
|
|
98
|
+
return rows
|
|
99
|
+
.map((row) => plainOf(row))
|
|
100
|
+
.filter((row) => row !== null);
|
|
101
|
+
}
|
|
102
|
+
function poolMaxOf(body) {
|
|
103
|
+
return typeof body?.maxServers === 'number' ? body.maxServers : 8;
|
|
104
|
+
}
|
|
105
|
+
function textOf(row, field) {
|
|
106
|
+
const value = row?.[field];
|
|
107
|
+
return typeof value === 'string' ? value : '';
|
|
108
|
+
}
|
|
109
|
+
// ===========================================================================
|
|
110
|
+
// Preflight: install + launch
|
|
111
|
+
// ===========================================================================
|
|
112
|
+
/**
|
|
113
|
+
* SPEC §4: discovery first; install (multi-select / `--profile`) only when
|
|
114
|
+
* nothing live answers or `--profile` was given; then bring DSH up and hand
|
|
115
|
+
* back the live IPC client plus its first ping. All failures print their own
|
|
116
|
+
* bilingual guidance and come back as `undefined`.
|
|
117
|
+
*/
|
|
118
|
+
async function preflight(ctx) {
|
|
119
|
+
const { t, args } = ctx;
|
|
120
|
+
const out = ctx.stdout;
|
|
121
|
+
const options = args.options;
|
|
122
|
+
const discover = ctx.discover ?? discoverCliSockets;
|
|
123
|
+
const discoverOptions = {
|
|
124
|
+
dshHome: ctx.dshHome,
|
|
125
|
+
...(options.socket === undefined ? {} : { explicitSocket: options.socket }),
|
|
126
|
+
platform: ctx.platform ?? process.platform,
|
|
127
|
+
};
|
|
128
|
+
const first = await discover(discoverOptions);
|
|
129
|
+
if (first.live.length === 0 && first.versionMismatch.length > 0) {
|
|
130
|
+
const mismatched = first.versionMismatch[0];
|
|
131
|
+
out.write(`${t('err.protocolVersion', {
|
|
132
|
+
found: String(mismatched?.cliProtocolVersion ?? '?'),
|
|
133
|
+
expected: CLI_PROTOCOL_VERSION,
|
|
134
|
+
})}\n`);
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
// The profile the install decided on feeds the launch: with no daemon to
|
|
138
|
+
// auto-start, the manual guidance must name the profile the user actually
|
|
139
|
+
// picked, not the synthesized `web` default.
|
|
140
|
+
let preferredProfile = 'web';
|
|
141
|
+
if (first.live.length === 0 || options.profile !== undefined) {
|
|
142
|
+
const install = await ensurePluginInstalled({
|
|
143
|
+
dshHome: ctx.dshHome,
|
|
144
|
+
...(options.profile === undefined ? {} : { profileFlag: options.profile }),
|
|
145
|
+
interactive: ctx.interactive,
|
|
146
|
+
...(ctx.prompter === undefined ? {} : { prompter: ctx.prompter }),
|
|
147
|
+
...(ctx.spawnCommand === undefined ? {} : { spawnCommand: ctx.spawnCommand }),
|
|
148
|
+
stdout: out,
|
|
149
|
+
t,
|
|
150
|
+
});
|
|
151
|
+
if (!install.ok)
|
|
152
|
+
return undefined;
|
|
153
|
+
if (install.preferredProfile !== undefined)
|
|
154
|
+
preferredProfile = install.preferredProfile;
|
|
155
|
+
}
|
|
156
|
+
const up = await ensureDshRunning({
|
|
157
|
+
dshHome: ctx.dshHome,
|
|
158
|
+
preferredProfile,
|
|
159
|
+
waitSeconds: options.wait,
|
|
160
|
+
...(options.socket === undefined ? {} : { explicitSocket: options.socket }),
|
|
161
|
+
...(ctx.platform === undefined ? {} : { platform: ctx.platform }),
|
|
162
|
+
...(ctx.uid === undefined ? {} : { uid: ctx.uid }),
|
|
163
|
+
...(ctx.execProbe === undefined ? {} : { execProbe: ctx.execProbe }),
|
|
164
|
+
discover,
|
|
165
|
+
...(ctx.macosAppPath === undefined ? {} : { macosAppPath: ctx.macosAppPath }),
|
|
166
|
+
...(ctx.systemUnitDir === undefined ? {} : { systemUnitDir: ctx.systemUnitDir }),
|
|
167
|
+
stdout: out,
|
|
168
|
+
t,
|
|
169
|
+
});
|
|
170
|
+
if (!up.started)
|
|
171
|
+
return undefined;
|
|
172
|
+
return { ipc: up.client, ping: up.ping };
|
|
173
|
+
}
|
|
174
|
+
// ===========================================================================
|
|
175
|
+
// Step 1: the role
|
|
176
|
+
// ===========================================================================
|
|
177
|
+
function printStepHeader(ctx, titleKey) {
|
|
178
|
+
const { t, stdout } = ctx;
|
|
179
|
+
stdout.write(`\n${t('setup.divider')}\n${t(titleKey)}\n${t('setup.divider')}\n`);
|
|
180
|
+
}
|
|
181
|
+
/** Resolve the target role: the flag wins (peer / garbage answered with the
|
|
182
|
+
* bilingual refusal), an interactive run asks with the current role
|
|
183
|
+
* highlighted, a headless run fails fast on the missing option. */
|
|
184
|
+
async function resolveTargetRole(ctx, ping) {
|
|
185
|
+
const { t, args } = ctx;
|
|
186
|
+
const requested = args.options.role;
|
|
187
|
+
if (requested === 'host' || requested === 'client')
|
|
188
|
+
return requested;
|
|
189
|
+
if (requested !== undefined) {
|
|
190
|
+
const message = requested === 'peer'
|
|
191
|
+
? t('err.role.peerNotEnabled')
|
|
192
|
+
: t('err.role.invalid', { value: requested });
|
|
193
|
+
ctx.stdout.write(`${message}\n`);
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
if (ctx.interactive && ctx.prompter !== undefined) {
|
|
197
|
+
printStepHeader(ctx, 'setup.step1Title');
|
|
198
|
+
const picked = await ctx.prompter.selectOne(t('setup.roleQuestion'), [t('setup.roleHost'), t('setup.roleClient')], ping.role === 'client' ? 1 : 0);
|
|
199
|
+
return picked === 1 ? 'client' : 'host';
|
|
200
|
+
}
|
|
201
|
+
throw new MissingRequiredOptionError('role');
|
|
202
|
+
}
|
|
203
|
+
// ===========================================================================
|
|
204
|
+
// Steps 2 & 3, host branch
|
|
205
|
+
// ===========================================================================
|
|
206
|
+
/** The four modes' label keys, in INGRESS_MODES order. */
|
|
207
|
+
const MODE_LABEL_KEYS = {
|
|
208
|
+
caddy: 'setup.ingressCaddy',
|
|
209
|
+
cloudflared: 'setup.ingressCloudflared',
|
|
210
|
+
external: 'setup.ingressExternal',
|
|
211
|
+
lan: 'setup.ingressLan',
|
|
212
|
+
};
|
|
213
|
+
/** The two-question funnel: public IP + Cloudflare-hosted domain map onto
|
|
214
|
+
* the four modes (caddy needs both; cloudflared replaces the public IP;
|
|
215
|
+
* external takes a public IP with the proxy the user already owns; lan
|
|
216
|
+
* covers everything else). */
|
|
217
|
+
function recommendMode(publicIp, onCloudflare) {
|
|
218
|
+
if (onCloudflare)
|
|
219
|
+
return publicIp ? 'caddy' : 'cloudflared';
|
|
220
|
+
return publicIp ? 'external' : 'lan';
|
|
221
|
+
}
|
|
222
|
+
async function runHostBranch(ctx, ipc) {
|
|
223
|
+
const { t, args } = ctx;
|
|
224
|
+
const out = ctx.stdout;
|
|
225
|
+
const options = args.options;
|
|
226
|
+
// Step 2: the ingress mode. Explicit --ingress/--mode wins; otherwise the
|
|
227
|
+
// current effective config offers "keep and verify" as choice 0 (in a
|
|
228
|
+
// headless run that keep IS the answer — re-running setup on a configured
|
|
229
|
+
// host must not blow away the working ingress).
|
|
230
|
+
printStepHeader(ctx, 'setup.step2HostTitle');
|
|
231
|
+
const wizard = await fetchBody(() => ipc.request('GET', WIZARD_STATUS_ROUTE));
|
|
232
|
+
const hasIngress = (textOf(wizard, 'mode') !== '' && textOf(wizard, 'mode') !== 'off')
|
|
233
|
+
|| textOf(wizard, 'publicUrl') !== '';
|
|
234
|
+
let mode = options.ingress ?? options.mode;
|
|
235
|
+
let keep = false;
|
|
236
|
+
if (mode === undefined) {
|
|
237
|
+
if (ctx.interactive && ctx.prompter !== undefined) {
|
|
238
|
+
const values = [];
|
|
239
|
+
const labels = [];
|
|
240
|
+
if (hasIngress) {
|
|
241
|
+
values.push('keep');
|
|
242
|
+
labels.push(t('setup.ingressKeep'));
|
|
243
|
+
}
|
|
244
|
+
for (const ingressMode of INGRESS_MODES) {
|
|
245
|
+
values.push(ingressMode);
|
|
246
|
+
labels.push(t(MODE_LABEL_KEYS[ingressMode]));
|
|
247
|
+
}
|
|
248
|
+
values.push('recommend');
|
|
249
|
+
labels.push(t('setup.ingressRecommend'));
|
|
250
|
+
const picked = await ctx.prompter.selectOne(t('setup.ingressQuestion'), labels, 0);
|
|
251
|
+
const value = values[picked];
|
|
252
|
+
if (value === 'keep')
|
|
253
|
+
keep = true;
|
|
254
|
+
else if (value === 'recommend') {
|
|
255
|
+
const publicIp = await ctx.prompter.confirm(t('setup.recommend.publicIp'), false);
|
|
256
|
+
const onCloudflare = await ctx.prompter.confirm(t('setup.recommend.cfDomain'), false);
|
|
257
|
+
mode = recommendMode(publicIp, onCloudflare);
|
|
258
|
+
out.write(`${t('setup.recommend.result', { mode })}\n`);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
mode = value;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else if (hasIngress) {
|
|
265
|
+
keep = true;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
throw new MissingRequiredOptionError('mode');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (!keep && mode !== undefined) {
|
|
272
|
+
const startCode = await runHostIngressStartCommand(commandCtx(ctx, ['host', 'ingress', 'start', '--mode', mode, ...carryOptionArgs(options)], ipc));
|
|
273
|
+
if (startCode !== 0)
|
|
274
|
+
return startCode;
|
|
275
|
+
}
|
|
276
|
+
// Step 3: the three-light verification, with the interactive retry menu
|
|
277
|
+
// when the first two lights fail (a headless run just reports).
|
|
278
|
+
printStepHeader(ctx, 'setup.step3HostTitle');
|
|
279
|
+
while (true) {
|
|
280
|
+
const verifyCode = await runHostIngressVerifyCommand(commandCtx(ctx, ['host', 'ingress', 'verify', ...carryOptionArgs(options)], ipc));
|
|
281
|
+
if (verifyCode === 0)
|
|
282
|
+
break;
|
|
283
|
+
if (!ctx.interactive || ctx.prompter === undefined)
|
|
284
|
+
return verifyCode;
|
|
285
|
+
const picked = await ctx.prompter.selectOne(t('setup.verifyFailedOptions'), [t('setup.verifyRetry'), t('setup.verifyKeepExit')], 0);
|
|
286
|
+
if (picked !== 0)
|
|
287
|
+
return verifyCode;
|
|
288
|
+
}
|
|
289
|
+
// The desktop-client follow-up: one confirm, one minted desktop code.
|
|
290
|
+
if (ctx.interactive && ctx.prompter !== undefined && !options.noWait) {
|
|
291
|
+
if (await ctx.prompter.confirm(t('setup.desktopPairQuestion'), false)) {
|
|
292
|
+
await runHostDevicePairCommand(commandCtx(ctx, ['host', 'device', 'pair', '--device-role', 'desktop-client'], ipc));
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Completion summary: the wizard status as it stands NOW.
|
|
296
|
+
const settled = await fetchBody(() => ipc.request('GET', WIZARD_STATUS_ROUTE));
|
|
297
|
+
const settledMode = textOf(settled, 'mode') === '' ? 'off' : textOf(settled, 'mode');
|
|
298
|
+
const settledUrl = textOf(settled, 'publicUrl');
|
|
299
|
+
out.write(`\n${t('setup.divider')}\n`);
|
|
300
|
+
out.write(`${t('setup.summary.title')}\n`);
|
|
301
|
+
out.write(`${t('setup.summary.role', { role: 'host' })}\n`);
|
|
302
|
+
out.write(`${t('setup.summary.ingress', { mode: settledMode, publicUrl: settledUrl === '' ? '—' : settledUrl })}\n`);
|
|
303
|
+
out.write(`${t('setup.summary.hint')}\n`);
|
|
304
|
+
out.write(`${t('setup.divider')}\n`);
|
|
305
|
+
return 0;
|
|
306
|
+
}
|
|
307
|
+
// ===========================================================================
|
|
308
|
+
// Steps 2 & 3, client branch
|
|
309
|
+
// ===========================================================================
|
|
310
|
+
function printClientList(ctx, servers, max) {
|
|
311
|
+
const { t } = ctx;
|
|
312
|
+
ctx.stdout.write(`${t('clientList.header', { count: servers.length, max })}\n`);
|
|
313
|
+
if (servers.length >= max)
|
|
314
|
+
ctx.stdout.write(` ${t('client.limitReached')}\n`);
|
|
315
|
+
for (const row of servers)
|
|
316
|
+
ctx.stdout.write(` ${serverLineText(t, row)}\n`);
|
|
317
|
+
}
|
|
318
|
+
async function runClientBranch(ctx, ipc) {
|
|
319
|
+
const { t, args } = ctx;
|
|
320
|
+
const out = ctx.stdout;
|
|
321
|
+
const options = args.options;
|
|
322
|
+
printStepHeader(ctx, 'setup.step2ClientTitle');
|
|
323
|
+
// Command-line pairing answers short-circuit the menu entirely. The address
|
|
324
|
+
// may come as the positional (`setup <hostUrl>`) or the flag — the flag
|
|
325
|
+
// wins when both appear.
|
|
326
|
+
const hostUrl = options.hostUrl ?? args.target;
|
|
327
|
+
const providedPair = hostUrl !== undefined && options.code !== undefined;
|
|
328
|
+
const pairArgv = ['client', 'pair', ...carryOptionArgs(options)];
|
|
329
|
+
if (options.hostUrl === undefined && hostUrl !== undefined)
|
|
330
|
+
pairArgv.push('--host-url', hostUrl);
|
|
331
|
+
// The straight-into-pairing rule (N === 0) describes the ENTRY state; after
|
|
332
|
+
// a menu action the menu itself is the place to be — exiting stays the
|
|
333
|
+
// user's explicit choice, never an uninvited question flow.
|
|
334
|
+
let firstLap = true;
|
|
335
|
+
while (true) {
|
|
336
|
+
const status = await fetchBody(() => ipc.request('GET', CLIENT_STATUS_ROUTE));
|
|
337
|
+
const servers = serversOfRow(status);
|
|
338
|
+
const max = poolMaxOf(status);
|
|
339
|
+
// N === 0 on entry (or a fully parametric pair): straight into pairing.
|
|
340
|
+
if (providedPair || (firstLap && servers.length === 0)) {
|
|
341
|
+
const pairCode = await runClientPairCommand(commandCtx(ctx, pairArgv, ipc));
|
|
342
|
+
if (pairCode !== 0)
|
|
343
|
+
return pairCode;
|
|
344
|
+
if (ctx.interactive && ctx.prompter !== undefined) {
|
|
345
|
+
if (await ctx.prompter.confirm(t('client.addAnother'), false)) {
|
|
346
|
+
firstLap = false;
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
firstLap = false;
|
|
353
|
+
printClientList(ctx, servers, max);
|
|
354
|
+
// N > 0 headless (no answers, nothing to do): show the list and finish.
|
|
355
|
+
if (!ctx.interactive || ctx.prompter === undefined)
|
|
356
|
+
break;
|
|
357
|
+
// The menu: an empty pool (everything was removed) offers add + done; a
|
|
358
|
+
// full pool (8/8) tops with repair / remove per SPEC; otherwise the
|
|
359
|
+
// four-way menu with add as the default first choice.
|
|
360
|
+
const atLimit = servers.length >= max;
|
|
361
|
+
const values = servers.length === 0 ? ['add', 'done'] : atLimit ? ['repair', 'remove', 'done'] : ['add', 'repair', 'remove', 'done'];
|
|
362
|
+
const labelKeys = servers.length === 0
|
|
363
|
+
? ['client.menuAdd', 'client.menuDone']
|
|
364
|
+
: atLimit
|
|
365
|
+
? ['client.menuRepair', 'client.menuRemove', 'client.menuDone']
|
|
366
|
+
: ['client.menuAdd', 'client.menuRepair', 'client.menuRemove', 'client.menuDone'];
|
|
367
|
+
const labels = labelKeys.map((key) => t(key));
|
|
368
|
+
const picked = await ctx.prompter.selectOne(t('client.menuTitle'), labels, 0);
|
|
369
|
+
const value = values[picked] ?? 'done';
|
|
370
|
+
if (value === 'done')
|
|
371
|
+
break;
|
|
372
|
+
if (value === 'add') {
|
|
373
|
+
const pairCode = await runClientPairCommand(commandCtx(ctx, pairArgv, ipc));
|
|
374
|
+
if (pairCode !== 0)
|
|
375
|
+
return pairCode;
|
|
376
|
+
// One more only while the pool still has room — at 8/8 the menu's
|
|
377
|
+
// limit branch takes over on the next lap anyway.
|
|
378
|
+
if (servers.length + 1 < max && ctx.interactive && ctx.prompter !== undefined) {
|
|
379
|
+
if (!(await ctx.prompter.confirm(t('client.addAnother'), false)))
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
if (value === 'repair') {
|
|
385
|
+
const rowIndex = await ctx.prompter.selectOne(t('setup.clientRepairQuestion'), servers.map((row) => serverLineText(t, row)), 0);
|
|
386
|
+
const row = servers[rowIndex];
|
|
387
|
+
const repairUrl = textOf(row, 'serverUrl');
|
|
388
|
+
if (repairUrl === '')
|
|
389
|
+
continue;
|
|
390
|
+
const repairCode = await runClientPairCommand(commandCtx(ctx, [...pairArgv, '--host-url', repairUrl], ipc));
|
|
391
|
+
if (repairCode !== 0)
|
|
392
|
+
return repairCode;
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
// remove
|
|
396
|
+
const removeCode = await runClientUnpairCommand(commandCtx(ctx, ['client', 'unpair'], ipc));
|
|
397
|
+
if (removeCode !== 0)
|
|
398
|
+
return removeCode;
|
|
399
|
+
}
|
|
400
|
+
// Completion summary: the pool as it stands NOW.
|
|
401
|
+
const settled = await fetchBody(() => ipc.request('GET', CLIENT_STATUS_ROUTE));
|
|
402
|
+
const settledServers = serversOfRow(settled);
|
|
403
|
+
out.write(`\n${ctx.t('setup.divider')}\n`);
|
|
404
|
+
out.write(`${ctx.t('setup.summary.title')}\n`);
|
|
405
|
+
out.write(`${ctx.t('setup.summary.role', { role: 'client' })}\n`);
|
|
406
|
+
out.write(`${ctx.t('setup.summary.client', { count: settledServers.length, max: poolMaxOf(settled) })}\n`);
|
|
407
|
+
out.write(`${ctx.t('setup.summary.hint')}\n`);
|
|
408
|
+
out.write(`${ctx.t('setup.divider')}\n`);
|
|
409
|
+
return 0;
|
|
410
|
+
}
|
|
411
|
+
// ===========================================================================
|
|
412
|
+
// The whole wizard
|
|
413
|
+
// ===========================================================================
|
|
414
|
+
/**
|
|
415
|
+
* `dsh-zen-remote setup` — preflight, step 1 (role + switch sync), then the
|
|
416
|
+
* role's steps 2 & 3. Missing required answers in a headless run throw
|
|
417
|
+
* MissingRequiredOptionError for the entry point to render.
|
|
418
|
+
*/
|
|
419
|
+
export async function runSetupCommand(ctx) {
|
|
420
|
+
const up = await preflight(ctx);
|
|
421
|
+
if (up === undefined)
|
|
422
|
+
return 1;
|
|
423
|
+
const { ipc } = up;
|
|
424
|
+
const { t } = ctx;
|
|
425
|
+
const waitSeconds = Math.max(1, ctx.args.options.wait);
|
|
426
|
+
const target = await resolveTargetRole(ctx, up.ping);
|
|
427
|
+
if (target === undefined)
|
|
428
|
+
return 1;
|
|
429
|
+
// Step 1's switch sync (GatewayWizard.tsx's discipline): the managed
|
|
430
|
+
// ingress processes belong to the outgoing role and are stopped before
|
|
431
|
+
// the config write; the polls ride out the restart-watcher reload over
|
|
432
|
+
// the hot-swap socket.
|
|
433
|
+
const pollUntil = async (want) => {
|
|
434
|
+
const interval = ctx.pollIntervalMs ?? ROLE_POLL_INTERVAL_DEFAULT_MS;
|
|
435
|
+
const deadline = Date.now() + waitSeconds * 1000;
|
|
436
|
+
while (true) {
|
|
437
|
+
try {
|
|
438
|
+
const current = await ipc.ping();
|
|
439
|
+
if (want(current))
|
|
440
|
+
return true;
|
|
441
|
+
}
|
|
442
|
+
catch {
|
|
443
|
+
// A reload window can drop one ping — the deadline decides.
|
|
444
|
+
}
|
|
445
|
+
if (Date.now() >= deadline)
|
|
446
|
+
return false;
|
|
447
|
+
await sleep(interval);
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
if (target === 'host') {
|
|
451
|
+
if (!up.ping.serves) {
|
|
452
|
+
ctx.stdout.write(`${t('setup.switchingToHost')}\n`);
|
|
453
|
+
if (!(await writeConfigOrReport(commandCtx(ctx, ['status'], ipc), { role: 'host' })))
|
|
454
|
+
return 1;
|
|
455
|
+
if (!(await pollUntil((ping) => ping.serves === true))) {
|
|
456
|
+
ctx.stdout.write(`${t('setup.roleSwitchTimeout', { seconds: waitSeconds })}\n`);
|
|
457
|
+
return 1;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return await runHostBranch(ctx, ipc);
|
|
461
|
+
}
|
|
462
|
+
if (up.ping.serves) {
|
|
463
|
+
ctx.stdout.write(`${t('setup.switchingToClient')}\n`);
|
|
464
|
+
// Best-effort stops: a refused stop must not block the role switch.
|
|
465
|
+
try {
|
|
466
|
+
await ipc.request('POST', WIZARD_CADDY_STOP_ROUTE);
|
|
467
|
+
}
|
|
468
|
+
catch { /* transport error — the stop route is gone with the process */ }
|
|
469
|
+
try {
|
|
470
|
+
await ipc.request('POST', WIZARD_TUNNEL_STOP_ROUTE);
|
|
471
|
+
}
|
|
472
|
+
catch { /* same */ }
|
|
473
|
+
}
|
|
474
|
+
if (up.ping.role !== 'client') {
|
|
475
|
+
if (!(await writeConfigOrReport(commandCtx(ctx, ['status'], ipc), { role: 'client' })))
|
|
476
|
+
return 1;
|
|
477
|
+
if (!(await pollUntil((ping) => ping.connects === true))) {
|
|
478
|
+
ctx.stdout.write(`${t('setup.roleSwitchTimeout', { seconds: waitSeconds })}\n`);
|
|
479
|
+
return 1;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return await runClientBranch(ctx, ipc);
|
|
483
|
+
}
|
|
484
|
+
//# sourceMappingURL=command-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-setup.js","sourceRoot":"","sources":["../../src/cli/command-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAEpG,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAItD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEzE,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAC5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAgCzD,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,CAAU,CAAA;AAE1E,uEAAuE;AACvE,MAAM,6BAA6B,GAAG,GAAG,CAAA;AAEzC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAE9F,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;4EAC4E;AAC5E,SAAS,UAAU,CAAC,GAAwB,EAAE,IAAc,EAAE,GAAiB;IAC7E,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;QACxB,GAAG;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjE,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC;QACnF,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;KAC3E,CAAA;AACH,CAAC;AAED;;;iBAGiB;AACjB,SAAS,eAAe,CAAC,OAAmB;IAC1C,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,IAAI,OAAO,CAAC,IAAI,KAAK,EAAE;QAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAClE,IAAI,OAAO,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACvE,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3E,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IACpE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;IACzF,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACjF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9E,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IACpE,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3E,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACjE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACjE,OAAO,IAAI,CAAA;AACb,CAAC;AAED,qEAAqE;AACrE,SAAS,YAAY,CAAC,IAAsB;IAC1C,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;IACjF,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SAC1B,MAAM,CAAC,CAAC,GAAG,EAAoB,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,IAAsB;IACvC,OAAO,OAAO,IAAI,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,SAAS,MAAM,CAAC,GAAqB,EAAE,KAAa;IAClD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/C,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E;;;;;GAKG;AACH,KAAK,UAAU,SAAS,CAAC,GAAwB;IAC/C,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IACvB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,kBAAkB,CAAA;IACnD,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3E,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;KAC3C,CAAA;IAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAA;IAC7C,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAC3C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,qBAAqB,EAAE;YACpC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,kBAAkB,IAAI,GAAG,CAAC;YACpD,QAAQ,EAAE,oBAAoB;SAC/B,CAAC,IAAI,CAAC,CAAA;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,yEAAyE;IACzE,0EAA0E;IAC1E,6CAA6C;IAC7C,IAAI,gBAAgB,GAAG,KAAK,CAAA;IAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC;YAC1C,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1E,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjE,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;YAC7E,MAAM,EAAE,GAAG;YACX,CAAC;SACF,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,SAAS,CAAA;QACjC,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS;YAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAA;IACzF,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC;QAChC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,gBAAgB;QAChB,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3E,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QACpE,QAAQ;QACR,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7E,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;QAChF,MAAM,EAAE,GAAG;QACX,CAAC;KACF,CAAC,CAAA;IACF,IAAI,CAAC,EAAE,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IACjC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;AAC1C,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,eAAe,CAAC,GAAwB,EAAE,QAAgB;IACjE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IACzB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;AAClF,CAAC;AAED;;mEAEmE;AACnE,KAAK,UAAU,iBAAiB,CAAC,GAAwB,EAAE,IAAqB;IAC9E,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IACnC,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IACpE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,SAAS,KAAK,MAAM;YAClC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC;YAC9B,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QAC/C,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAA;QAChC,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClD,eAAe,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;QACxC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CACzC,CAAC,CAAC,oBAAoB,CAAC,EACvB,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAC5C,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC/B,CAAA;QACD,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;IACzC,CAAC;IACD,MAAM,IAAI,0BAA0B,CAAC,MAAM,CAAC,CAAA;AAC9C,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,0DAA0D;AAC1D,MAAM,eAAe,GAA6D;IAChF,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EAAE,0BAA0B;IACvC,QAAQ,EAAE,uBAAuB;IACjC,GAAG,EAAE,kBAAkB;CACxB,CAAA;AAED;;;8BAG8B;AAC9B,SAAS,aAAa,CAAC,QAAiB,EAAE,YAAqB;IAC7D,IAAI,YAAY;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAA;IAC3D,OAAO,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAA;AACtC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAwB,EAAE,GAAiB;IACtE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IACvB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAE5B,0EAA0E;IAC1E,sEAAsE;IACtE,0EAA0E;IAC1E,gDAAgD;IAChD,eAAe,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC7E,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC;WACjF,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,CAAA;IACvC,IAAI,IAAI,GAAuB,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAA;IAC9D,IAAI,IAAI,GAAG,KAAK,CAAA;IAChB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClD,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACnB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAA;YACrC,CAAC;YACD,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;gBACxB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;YAC9C,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACxB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YAClF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;YAC5B,IAAI,KAAK,KAAK,MAAM;gBAAE,IAAI,GAAG,IAAI,CAAA;iBAC5B,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE,KAAK,CAAC,CAAA;gBACjF,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE,KAAK,CAAC,CAAA;gBACrF,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;gBAC5C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;YACzD,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,KAAK,CAAA;YACd,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,0BAA0B,CAAC,MAAM,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAChD,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAChG,CAAA;QACD,IAAI,SAAS,KAAK,CAAC;YAAE,OAAO,SAAS,CAAA;IACvC,CAAC;IAED,wEAAwE;IACxE,gEAAgE;IAChE,eAAe,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;IAC5C,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,MAAM,2BAA2B,CAClD,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CACjF,CAAA;QACD,IAAI,UAAU,KAAK,CAAC;YAAE,MAAK;QAC3B,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,UAAU,CAAA;QACrE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CACzC,CAAC,CAAC,2BAA2B,CAAC,EAC9B,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,sBAAsB,CAAC,CAAC,EACnD,CAAC,CACF,CAAA;QACD,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,CAAA;IACrC,CAAC;IAED,sEAAsE;IACtE,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrE,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;YACtE,MAAM,wBAAwB,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACrH,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC9E,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACpF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC/C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IACtC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC1C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;IAC3D,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAA;IACpH,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IACzC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IACpC,OAAO,CAAC,CAAA;AACV,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,SAAS,eAAe,CAAC,GAAwB,EAAE,OAA6B,EAAE,GAAW;IAC3F,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAA;IACjB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/E,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG;QAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC9E,KAAK,MAAM,GAAG,IAAI,OAAO;QAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;AAC9E,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAwB,EAAE,GAAiB;IACxE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IACvB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAE5B,eAAe,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAA;IAE9C,4EAA4E;IAC5E,wEAAwE;IACxE,yBAAyB;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAA;IAC9C,MAAM,YAAY,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,CAAA;IACxE,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAA;IAChE,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAChG,4EAA4E;IAC5E,uEAAuE;IACvE,4DAA4D;IAC5D,IAAI,QAAQ,GAAG,IAAI,CAAA;IAEnB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAA;QAC7E,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;QACpC,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;QAE7B,wEAAwE;QACxE,IAAI,YAAY,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA;YAC3E,IAAI,QAAQ,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAA;YACnC,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAClD,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC9D,QAAQ,GAAG,KAAK,CAAA;oBAChB,SAAQ;gBACV,CAAC;YACH,CAAC;YACD,MAAK;QACP,CAAC;QACD,QAAQ,GAAG,KAAK,CAAA;QAEhB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;QAClC,wEAAwE;QACxE,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;YAAE,MAAK;QAEzD,wEAAwE;QACxE,oEAAoE;QACpE,sDAAsD;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAA;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;QACpI,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC;YACpC,CAAC,CAAE,CAAC,gBAAgB,EAAE,iBAAiB,CAAW;YAClD,CAAC,CAAC,OAAO;gBACP,CAAC,CAAE,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,CAAW;gBAC1E,CAAC,CAAE,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,CAAW,CAAA;QAChG,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAA;QAEtC,IAAI,KAAK,KAAK,MAAM;YAAE,MAAK;QAC3B,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA;YAC3E,IAAI,QAAQ,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAA;YACnC,kEAAkE;YAClE,kDAAkD;YAClD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC9E,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,CAAC;oBAAE,MAAK;YACzE,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CAC3C,CAAC,CAAC,4BAA4B,CAAC,EAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAC5C,CAAC,CACF,CAAA;YACD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;YAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;YAC1C,IAAI,SAAS,KAAK,EAAE;gBAAE,SAAQ;YAC9B,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAC3C,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAC7D,CAAA;YACD,IAAI,UAAU,KAAK,CAAC;gBAAE,OAAO,UAAU,CAAA;YACvC,SAAQ;QACV,CAAC;QACD,SAAS;QACT,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC3F,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAA;IACzC,CAAC;IAED,iDAAiD;IACjD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC9E,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAC5C,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC1C,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC9C,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAA;IACjE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IAC1G,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC7C,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IACxC,OAAO,CAAC,CAAA;AACV,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAwB;IAC5D,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,CAAC,CAAA;IAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAClB,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAA;IACjB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAEtD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IACpD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,CAAA;IAElC,qEAAqE;IACrE,uEAAuE;IACvE,uEAAuE;IACvE,uBAAuB;IACvB,MAAM,SAAS,GAAG,KAAK,EAAE,IAAwC,EAAoB,EAAE;QACrF,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,IAAI,6BAA6B,CAAA;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,GAAG,IAAI,CAAA;QAChD,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;gBAChC,IAAI,IAAI,CAAC,OAAO,CAAC;oBAAE,OAAO,IAAI,CAAA;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;YAC9D,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;gBAAE,OAAO,KAAK,CAAA;YACxC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAA;QACvB,CAAC;IACH,CAAC,CAAA;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAA;YACnD,IAAI,CAAC,CAAC,MAAM,mBAAmB,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAA;YAC9F,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,CAAA;gBAC/E,OAAO,CAAC,CAAA;YACV,CAAC;QACH,CAAC;QACD,OAAO,MAAM,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAA;QACrD,oEAAoE;QACpE,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAA;QACpD,CAAC;QAAC,MAAM,CAAC,CAAC,+DAA+D,CAAC,CAAC;QAC3E,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;QACrD,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,MAAM,mBAAmB,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAAE,OAAO,CAAC,CAAA;QAChG,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,CAAA;YAC/E,OAAO,CAAC,CAAA;QACV,CAAC;IACH,CAAC;IACD,OAAO,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC"}
|