@fnndsc/chell 4.2.8 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builtins/fs/pull.d.ts +2 -2
- package/dist/builtins/fs/pull.js +10 -6
- package/dist/builtins/fs/pull.js.map +1 -1
- package/dist/builtins/help.js +12 -12
- package/dist/builtins/net/query.js +26 -6
- package/dist/builtins/net/query.js.map +1 -1
- package/dist/chell.d.ts +6 -12
- package/dist/chell.js +5 -1187
- package/dist/chell.js.map +1 -1
- package/dist/core/boot.d.ts +7 -0
- package/dist/core/boot.js +601 -0
- package/dist/core/boot.js.map +1 -0
- package/dist/core/dispatch.d.ts +48 -0
- package/dist/core/dispatch.js +544 -0
- package/dist/core/dispatch.js.map +1 -0
- package/dist/core/preprocess.d.ts +46 -0
- package/dist/core/preprocess.js +146 -0
- package/dist/core/preprocess.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/spinner.js +4 -2
- package/dist/lib/spinner.js.map +1 -1
- package/package.json +10 -6
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Boot, connection, and REPL startup for the ChELL shell.
|
|
3
|
+
*
|
|
4
|
+
* Holds the process-lifecycle glue that sits around the command dispatcher:
|
|
5
|
+
* - self/dependency package.json loading and the boot info panels
|
|
6
|
+
* - password prompting and ChRIS connection establishment (CLI args or saved session)
|
|
7
|
+
* - VFS provider registration and cache prefetch
|
|
8
|
+
* - the interactive session runner and `chell_start` entrypoint
|
|
9
|
+
*
|
|
10
|
+
* The parse/dispatch logic it drives lives in `../chell.js`.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import * as readline from 'readline';
|
|
15
|
+
import * as os from 'os';
|
|
16
|
+
import * as path from 'path';
|
|
17
|
+
import { readFileSync, existsSync } from 'fs';
|
|
18
|
+
import { fileURLToPath } from 'url';
|
|
19
|
+
import { createRequire } from 'module';
|
|
20
|
+
import { Writable } from 'stream';
|
|
21
|
+
import chalk from 'chalk';
|
|
22
|
+
import { REPL } from './repl.js';
|
|
23
|
+
import { session } from '../session/index.js';
|
|
24
|
+
import { error_stripDebugPrefix } from '../builtins/index.js';
|
|
25
|
+
import { errorStack, Ok, Err } from '@fnndsc/cumin';
|
|
26
|
+
import { vfs } from '../lib/vfs/vfs.js';
|
|
27
|
+
import { spinner } from '../lib/spinner.js';
|
|
28
|
+
import { logo_print, logo_animatePulse, logo_animateStop } from '../lib/logo.js';
|
|
29
|
+
import { bootLogger_create, bootsequence_printIntroPanelsStacked } from '../lib/bootsequence.js';
|
|
30
|
+
import { settings_load } from '../config/settings.js';
|
|
31
|
+
import { cli_parse } from './cli.js';
|
|
32
|
+
import { prefetch_path, prefetch_withSpinner } from '../lib/prefetch.js';
|
|
33
|
+
import { bootFlags_compute } from './bootFlags.js';
|
|
34
|
+
import { context_getSingle, procCache_refresh, procTopology_warmup } from '@fnndsc/salsa';
|
|
35
|
+
import { chrisContext, Context } from '@fnndsc/cumin';
|
|
36
|
+
import { command_handle, stopOnError_set } from './dispatch.js';
|
|
37
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
38
|
+
const __dirname = path.dirname(__filename);
|
|
39
|
+
/**
|
|
40
|
+
* Loads a dependency's package.json via node module resolution, so it works
|
|
41
|
+
* whether the dep is nested or hoisted to a workspace-root node_modules. In
|
|
42
|
+
* the bundled binary it falls back to the versions inlined at build time.
|
|
43
|
+
*
|
|
44
|
+
* @param name - The package name (e.g. `@fnndsc/cumin`).
|
|
45
|
+
* @returns The parsed package.json, or a fallback `{ name, version }`.
|
|
46
|
+
*/
|
|
47
|
+
function depPackageJson_load(name) {
|
|
48
|
+
try {
|
|
49
|
+
const req = createRequire(import.meta.url);
|
|
50
|
+
return req(`${name}/package.json`);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
const version = typeof __CHELL_DEP_VERSIONS__ !== 'undefined'
|
|
54
|
+
? (__CHELL_DEP_VERSIONS__[name] ?? 'unknown')
|
|
55
|
+
: 'unknown';
|
|
56
|
+
return { name, version };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Reads chell's own package.json, or — in the bundled binary, where that file
|
|
61
|
+
* is not present on disk — uses the version injected at build time.
|
|
62
|
+
*
|
|
63
|
+
* @returns The parsed package.json (or a `{ name, version }` fallback).
|
|
64
|
+
*/
|
|
65
|
+
function selfPackageJson_load() {
|
|
66
|
+
try {
|
|
67
|
+
return JSON.parse(readFileSync(path.resolve(__dirname, '../../package.json'), 'utf-8'));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
const version = typeof __CHELL_VERSION__ !== 'undefined' ? __CHELL_VERSION__ : 'unknown';
|
|
71
|
+
return { name: '@fnndsc/chell', version };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const packageJson = selfPackageJson_load();
|
|
75
|
+
const cuminJson = depPackageJson_load('@fnndsc/cumin');
|
|
76
|
+
const salsaJson = depPackageJson_load('@fnndsc/salsa');
|
|
77
|
+
const chiliJson = depPackageJson_load('@fnndsc/chili');
|
|
78
|
+
/**
|
|
79
|
+
* Builds the multi-line version report shown by `--version`: chell itself
|
|
80
|
+
* plus the sandwich layers (chili, salsa, cumin) it is running with.
|
|
81
|
+
*
|
|
82
|
+
* @returns The version report string.
|
|
83
|
+
*/
|
|
84
|
+
function versionReport_build() {
|
|
85
|
+
return [
|
|
86
|
+
`chell ${packageJson.version}`,
|
|
87
|
+
` chili ${chiliJson.version}`,
|
|
88
|
+
` salsa ${salsaJson.version}`,
|
|
89
|
+
` cumin ${cuminJson.version}`,
|
|
90
|
+
].join('\n');
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Prompts the user for a password without echoing input.
|
|
94
|
+
*
|
|
95
|
+
* @param user - The username.
|
|
96
|
+
* @param url - The CUBE URL.
|
|
97
|
+
* @returns A Promise resolving to the password string.
|
|
98
|
+
*/
|
|
99
|
+
async function password_prompt(user, url) {
|
|
100
|
+
return new Promise((resolve) => {
|
|
101
|
+
const mutableStdout = new Writable({
|
|
102
|
+
write: function (chunk, encoding, callback) {
|
|
103
|
+
if (!this.muted)
|
|
104
|
+
process.stdout.write(chunk, encoding);
|
|
105
|
+
callback();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
const rl = readline.createInterface({
|
|
109
|
+
input: process.stdin,
|
|
110
|
+
output: mutableStdout,
|
|
111
|
+
terminal: true
|
|
112
|
+
});
|
|
113
|
+
mutableStdout.muted = false;
|
|
114
|
+
process.stdout.write(`Password for ${user}@${url}: `);
|
|
115
|
+
mutableStdout.muted = true;
|
|
116
|
+
rl.question('', (password) => {
|
|
117
|
+
rl.close();
|
|
118
|
+
console.log(''); // Add newline after entry
|
|
119
|
+
resolve(password);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Warm the VFS cache for plugins, feeds, and jobs.
|
|
125
|
+
*
|
|
126
|
+
* @param flags - Which resource types to prefetch.
|
|
127
|
+
* @param user - Authenticated ChRIS username (for feed path construction).
|
|
128
|
+
* @param isInteractive - Whether to show spinners vs plain log lines.
|
|
129
|
+
* @param boot - Boot logger; null in non-interactive modes.
|
|
130
|
+
* @returns Counts for each prefetched resource type.
|
|
131
|
+
*/
|
|
132
|
+
async function cache_prefetch(flags, user, isInteractive, boot) {
|
|
133
|
+
const result = {};
|
|
134
|
+
// --- Plugins & Pipelines ---
|
|
135
|
+
if (!session.offline && flags.plugins) {
|
|
136
|
+
const r = await prefetch_withSpinner('Plugins', 'Prefetching /bin for completions', isInteractive, async () => {
|
|
137
|
+
const vfsResult = await vfs.data_get('/bin');
|
|
138
|
+
if (vfsResult.ok) {
|
|
139
|
+
return {
|
|
140
|
+
ok: true,
|
|
141
|
+
count: vfsResult.value.filter((i) => i.type === 'plugin').length,
|
|
142
|
+
pipelineCount: vfsResult.value.filter((i) => i.type === 'pipeline').length,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
const err = errorStack.stack_pop();
|
|
146
|
+
return { ok: false, message: err ? error_stripDebugPrefix(err.message) : 'Failed to prefetch /bin' };
|
|
147
|
+
});
|
|
148
|
+
if (r.ok) {
|
|
149
|
+
result.plugins = r.count;
|
|
150
|
+
result.pipelines = r.pipelineCount;
|
|
151
|
+
boot?.log('ok', 'Plugins', `Cached ${r.count ?? 0} plugin(s)`);
|
|
152
|
+
boot?.log('ok', 'Pipelines', `Cached ${r.pipelineCount ?? 0} pipeline(s)`);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
boot?.log('fail', 'Plugins', r.message || 'Failed to prefetch /bin');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else if (!session.offline) {
|
|
159
|
+
boot?.log('skip', 'Plugins', 'Prefetch disabled');
|
|
160
|
+
boot?.log('skip', 'Pipelines', 'Prefetch disabled');
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
boot?.log('skip', 'Plugins', 'Offline mode');
|
|
164
|
+
boot?.log('skip', 'Pipelines', 'Offline mode');
|
|
165
|
+
}
|
|
166
|
+
// --- Feeds ---
|
|
167
|
+
if (!session.offline && flags.feeds) {
|
|
168
|
+
const feedPath = user ? `/home/${user}/feeds` : undefined;
|
|
169
|
+
if (feedPath) {
|
|
170
|
+
const r = await prefetch_withSpinner('Feeds', 'Prefetching user feeds', isInteractive, () => prefetch_path(feedPath));
|
|
171
|
+
if (r.ok) {
|
|
172
|
+
result.feeds = r.count;
|
|
173
|
+
boot?.log('ok', 'Feeds', `Cached ${r.count ?? 0} item(s) from ${feedPath}`);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
boot?.log('fail', 'Feeds', r.message || `Prefetch failed for ${feedPath}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
boot?.log('skip', 'Feeds', 'No user context');
|
|
181
|
+
}
|
|
182
|
+
if (flags.publicFeeds) {
|
|
183
|
+
const r = await prefetch_withSpinner('Public', 'Prefetching public feeds', isInteractive, () => prefetch_path('/PUBLIC'));
|
|
184
|
+
if (r.ok) {
|
|
185
|
+
result.public = r.count;
|
|
186
|
+
boot?.log('ok', 'Public', `Cached ${r.count ?? 0} item(s) from /PUBLIC`);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
boot?.log('fail', 'Public', r.message || 'Prefetch failed for /PUBLIC');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else if (!session.offline) {
|
|
194
|
+
boot?.log('skip', 'Feeds', 'Prefetch disabled');
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
boot?.log('skip', 'Feeds', 'Offline mode');
|
|
198
|
+
}
|
|
199
|
+
// --- Jobs ---
|
|
200
|
+
if (!session.offline && flags.jobs) {
|
|
201
|
+
const r = await prefetch_withSpinner('Jobs', 'Indexing /proc/jobs (feed list)...', isInteractive, async () => {
|
|
202
|
+
try {
|
|
203
|
+
await procCache_refresh();
|
|
204
|
+
const { procCache_get } = await import('@fnndsc/cumin');
|
|
205
|
+
return { ok: true, count: procCache_get().feedIDs_get().length };
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
209
|
+
return { ok: false, message: msg };
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
if (r.ok) {
|
|
213
|
+
boot?.log('ok', 'Jobs', `Indexed ${r.count ?? 0} feed(s) — topology warming in background`);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
boot?.log('fail', 'Jobs', r.message || 'Failed to index /proc/jobs');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else if (!session.offline) {
|
|
220
|
+
boot?.log('skip', 'Jobs', 'Prefetch disabled');
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
boot?.log('skip', 'Jobs', 'Offline mode');
|
|
224
|
+
}
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Assemble and render the Neofetch-style boot info panels.
|
|
229
|
+
*
|
|
230
|
+
* @param context - Current ChRIS session context.
|
|
231
|
+
* @param mode - Shell mode string (e.g. 'interactive').
|
|
232
|
+
* @param cache - Prefetch counts for the panel's ChRIS section.
|
|
233
|
+
* @param useAsciiBoot - Render ASCII box-drawing instead of Unicode.
|
|
234
|
+
*/
|
|
235
|
+
function bootPanels_render(context, mode, cache, useAsciiBoot) {
|
|
236
|
+
const headerItems = [
|
|
237
|
+
{ app: 'chell', name: 'ChELL Executes Layered Logic', version: packageJson.version },
|
|
238
|
+
{ app: 'chili', name: 'ChILI handles Intelligent Line Interactions', version: chiliJson.version },
|
|
239
|
+
{ app: 'salsa', name: 'Salsa Abstracts Logic Service Assets', version: salsaJson.version },
|
|
240
|
+
{ app: 'cumin', name: 'Cumin Underpins Management Infrastructure Needs', version: cuminJson.version },
|
|
241
|
+
];
|
|
242
|
+
const localItems = [
|
|
243
|
+
{ label: 'System', value: `${os.platform()} ${os.release()} (${os.arch()})` },
|
|
244
|
+
{ label: 'User', value: `${os.userInfo().username}@${os.hostname()}` },
|
|
245
|
+
...(localIPv4_get() ? [{ label: 'Local', value: localIPv4_get() }] : []),
|
|
246
|
+
{ label: 'Time', value: localTime_withOffset() },
|
|
247
|
+
];
|
|
248
|
+
const maxItemLen = Math.max(30, (process.stdout.columns || 100) - 20);
|
|
249
|
+
const str_truncate = (s) => s.length > maxItemLen ? `…${s.slice(-(maxItemLen - 1))}` : s;
|
|
250
|
+
const chrisItems = [
|
|
251
|
+
{ label: 'ChRIS', value: str_truncate(context.URL || 'offline') },
|
|
252
|
+
{ label: 'User', value: context.user || 'offline' },
|
|
253
|
+
{ label: 'Mode', value: mode },
|
|
254
|
+
];
|
|
255
|
+
if (typeof cache.plugins === 'number')
|
|
256
|
+
chrisItems.push({ label: 'Plugins', value: `${cache.plugins}` });
|
|
257
|
+
if (typeof cache.pipelines === 'number')
|
|
258
|
+
chrisItems.push({ label: 'Pipelines', value: `${cache.pipelines}` });
|
|
259
|
+
if (context.plugin)
|
|
260
|
+
chrisItems.push({ label: 'Active Plugin', value: context.plugin });
|
|
261
|
+
if (typeof cache.feeds === 'number')
|
|
262
|
+
chrisItems.push({ label: 'User Feeds', value: `${cache.feeds}` });
|
|
263
|
+
if (context.feed)
|
|
264
|
+
chrisItems.push({ label: 'Active Feed', value: `${context.feed}` });
|
|
265
|
+
if (typeof cache.public === 'number')
|
|
266
|
+
chrisItems.push({ label: 'Public Feeds', value: `${cache.public}` });
|
|
267
|
+
if (context.pacsserver)
|
|
268
|
+
chrisItems.push({ label: 'PACS Server', value: context.pacsserver });
|
|
269
|
+
chrisItems.push({ label: 'Path', value: str_truncate(context.folder ?? '/') });
|
|
270
|
+
const panels = { header: headerItems, local: localItems, chris: chrisItems };
|
|
271
|
+
bootsequence_printIntroPanelsStacked([], panels, !useAsciiBoot, useAsciiBoot);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Returns the first non-internal IPv4 address of the local machine, or null if none found.
|
|
275
|
+
*/
|
|
276
|
+
function localIPv4_get() {
|
|
277
|
+
const interfaces = os.networkInterfaces();
|
|
278
|
+
for (const key of Object.keys(interfaces)) {
|
|
279
|
+
const iface = interfaces[key];
|
|
280
|
+
if (!iface)
|
|
281
|
+
continue;
|
|
282
|
+
for (const entry of iface) {
|
|
283
|
+
if (entry.family === 'IPv4' && !entry.internal && entry.address) {
|
|
284
|
+
return entry.address;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Returns the current local date/time as `YYYY-MM-DD HH:MM:SS ±HH:MM`.
|
|
292
|
+
*/
|
|
293
|
+
function localTime_withOffset() {
|
|
294
|
+
const now = new Date();
|
|
295
|
+
const offsetMinutes = now.getTimezoneOffset();
|
|
296
|
+
const sign = offsetMinutes <= 0 ? '+' : '-';
|
|
297
|
+
const absMinutes = Math.abs(offsetMinutes);
|
|
298
|
+
const hours = Math.floor(absMinutes / 60);
|
|
299
|
+
const minutes = absMinutes % 60;
|
|
300
|
+
const pad = (n) => n.toString().padStart(2, '0');
|
|
301
|
+
const offsetStr = `${sign}${pad(hours)}:${pad(minutes)}`;
|
|
302
|
+
const dateStr = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;
|
|
303
|
+
const timeStr = `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;
|
|
304
|
+
return `${dateStr} ${timeStr} ${offsetStr}`;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Executes a chell script file.
|
|
308
|
+
* Reads the file line by line, ignoring comments and blank lines.
|
|
309
|
+
* Supports shebang (#!) on first line.
|
|
310
|
+
*
|
|
311
|
+
* @param scriptPath - Path to the script file.
|
|
312
|
+
* @param stopOnError - Whether to stop execution on first error (default: false).
|
|
313
|
+
* @returns A Promise that resolves when script execution completes.
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
* ```typescript
|
|
317
|
+
* await script_execute('/path/to/script.chell', false);
|
|
318
|
+
* ```
|
|
319
|
+
*/
|
|
320
|
+
async function script_execute(scriptPath, stopOnError = false) {
|
|
321
|
+
if (!existsSync(scriptPath)) {
|
|
322
|
+
console.error(chalk.red(`Error: Script file not found: ${scriptPath}`));
|
|
323
|
+
process.exit(1);
|
|
324
|
+
}
|
|
325
|
+
// Set global stop-on-error flag
|
|
326
|
+
stopOnError_set(stopOnError);
|
|
327
|
+
const scriptContent = readFileSync(scriptPath, 'utf8');
|
|
328
|
+
const lines = scriptContent.split('\n');
|
|
329
|
+
for (let i = 0; i < lines.length; i++) {
|
|
330
|
+
let line = lines[i].trim();
|
|
331
|
+
// Skip shebang on first line
|
|
332
|
+
if (i === 0 && line.startsWith('#!')) {
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
// Skip comment lines and blank lines
|
|
336
|
+
if (line.startsWith('#') || line === '') {
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
// Execute the line
|
|
340
|
+
try {
|
|
341
|
+
await command_handle(line);
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
345
|
+
console.error(chalk.red(`Error on line ${i + 1}: ${msg}`));
|
|
346
|
+
if (stopOnError) {
|
|
347
|
+
console.error(chalk.red('Stopping execution due to error (use without -e to continue on error)'));
|
|
348
|
+
process.exit(1);
|
|
349
|
+
}
|
|
350
|
+
// Otherwise continue to next line
|
|
351
|
+
}
|
|
352
|
+
// Builtins report failure through process.exitCode rather than throwing.
|
|
353
|
+
if (stopOnError && process.exitCode) {
|
|
354
|
+
console.error(chalk.red(`Stopping execution: command on line ${i + 1} failed (use without -e to continue on error)`));
|
|
355
|
+
process.exit(1);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Reset flag; a failed command's exit code survives to process exit.
|
|
359
|
+
stopOnError_set(false);
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Connect using explicit CLI credentials. Returns Err() on unrecoverable failure.
|
|
363
|
+
*/
|
|
364
|
+
async function connection_fromArgs(config, boot) {
|
|
365
|
+
let { user, password, url } = config.connectConfig;
|
|
366
|
+
if (!user) {
|
|
367
|
+
console.error(chalk.red('Error: Username required when connecting via CLI args.'));
|
|
368
|
+
return Err();
|
|
369
|
+
}
|
|
370
|
+
if (!password && url && config.mode !== 'execute' && config.mode !== 'script') {
|
|
371
|
+
password = await password_prompt(user, url);
|
|
372
|
+
}
|
|
373
|
+
if (!password && config.mode === 'execute') {
|
|
374
|
+
console.error(chalk.red('Error: Password required for connection in execute mode.'));
|
|
375
|
+
return Err();
|
|
376
|
+
}
|
|
377
|
+
if (!url || !password) {
|
|
378
|
+
return Ok(await context_getSingle());
|
|
379
|
+
}
|
|
380
|
+
spinner.start(`Establishing uplink to ${url}`);
|
|
381
|
+
try {
|
|
382
|
+
await session.connection.connection_connect({ user: user, password, url, debug: false });
|
|
383
|
+
session.offline = false;
|
|
384
|
+
await chrisContext.current_set(Context.ChRISuser, user);
|
|
385
|
+
await chrisContext.current_set(Context.ChRISURL, url);
|
|
386
|
+
await chrisContext.current_set(Context.ChRISfolder, '/');
|
|
387
|
+
await chrisContext.current_set(Context.ChRISfeed, '');
|
|
388
|
+
await chrisContext.current_set(Context.ChRISplugin, '');
|
|
389
|
+
spinner.stop();
|
|
390
|
+
if (config.mode !== 'execute' && config.mode !== 'script') {
|
|
391
|
+
console.log(chalk.green('[+] Connection established.'));
|
|
392
|
+
}
|
|
393
|
+
boot?.log('ok', 'Connect', `Connected to ${url}`);
|
|
394
|
+
return Ok(await context_getSingle());
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
spinner.stop();
|
|
398
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
399
|
+
console.error(chalk.red(`[!] Connection failed: ${errorMessage}`));
|
|
400
|
+
boot?.log('fail', 'Connect', errorMessage);
|
|
401
|
+
return Err();
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Restore a saved session from disk. Always succeeds — falls back to offline mode.
|
|
406
|
+
*/
|
|
407
|
+
async function connection_fromSavedSession(config, boot) {
|
|
408
|
+
spinner.start('Checking for previous context');
|
|
409
|
+
spinner.stop();
|
|
410
|
+
const ctx = await context_getSingle();
|
|
411
|
+
if (!ctx.user || !ctx.URL) {
|
|
412
|
+
if (config.mode !== 'execute' && config.mode !== 'script') {
|
|
413
|
+
console.log(chalk.yellow('[!] No previous context found'));
|
|
414
|
+
}
|
|
415
|
+
return ctx;
|
|
416
|
+
}
|
|
417
|
+
if (config.mode !== 'execute' && config.mode !== 'script') {
|
|
418
|
+
console.log(chalk.green('[+] Previous context detected'));
|
|
419
|
+
console.log(chalk.gray(` User: ${chalk.cyan(ctx.user)}`));
|
|
420
|
+
console.log(chalk.gray(` URL: ${chalk.cyan(ctx.URL)}`));
|
|
421
|
+
}
|
|
422
|
+
spinner.start('Validating existing token');
|
|
423
|
+
const token = await session.connection.authToken_get(true);
|
|
424
|
+
spinner.stop();
|
|
425
|
+
if (!token) {
|
|
426
|
+
console.log(chalk.yellow('[!] No token found'));
|
|
427
|
+
console.log(chalk.yellow('[!] Running in disconnected mode'));
|
|
428
|
+
session.offline = true;
|
|
429
|
+
console.log(chalk.gray(` Use: connect --user ${ctx.user} --password <pwd> ${ctx.URL}`));
|
|
430
|
+
boot?.log('skip', 'Session', 'No saved token; offline');
|
|
431
|
+
return ctx;
|
|
432
|
+
}
|
|
433
|
+
spinner.start(`Testing connection to ${ctx.URL}`);
|
|
434
|
+
try {
|
|
435
|
+
const client = await session.connection.client_get();
|
|
436
|
+
if (!client) {
|
|
437
|
+
spinner.stop();
|
|
438
|
+
console.log(chalk.yellow('[!] Failed to create client'));
|
|
439
|
+
console.log(chalk.yellow('[!] Running in disconnected mode'));
|
|
440
|
+
session.offline = true;
|
|
441
|
+
console.log(chalk.gray(` Use: connect --user ${ctx.user} --password <pwd> ${ctx.URL}`));
|
|
442
|
+
return ctx;
|
|
443
|
+
}
|
|
444
|
+
await client.getUser();
|
|
445
|
+
spinner.stop();
|
|
446
|
+
if (config.mode !== 'execute' && config.mode !== 'script') {
|
|
447
|
+
console.log(chalk.green('[+] Token validated with server'));
|
|
448
|
+
console.log(chalk.green('[+] Session restored'));
|
|
449
|
+
boot?.log('ok', 'Session', `Restored ${ctx.user}@${ctx.URL}`);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
catch (error) {
|
|
453
|
+
spinner.stop();
|
|
454
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
455
|
+
console.log(chalk.yellow('[!] Token expired or invalid'));
|
|
456
|
+
console.log(chalk.gray(` Error: ${msg}`));
|
|
457
|
+
console.log(chalk.yellow('[!] Running in disconnected mode'));
|
|
458
|
+
session.offline = true;
|
|
459
|
+
console.log(chalk.gray(` Use: connect --user ${ctx.user} --password <pwd> ${ctx.URL}`));
|
|
460
|
+
}
|
|
461
|
+
return ctx;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Establish a ChRIS connection: explicit CLI args or saved session restore.
|
|
465
|
+
*
|
|
466
|
+
* @param config - Parsed CLI config.
|
|
467
|
+
* @param boot - Boot logger; null in non-interactive modes.
|
|
468
|
+
* @returns Ok(context) on success; Err() on unrecoverable failure (caller should exit).
|
|
469
|
+
*/
|
|
470
|
+
async function connection_establish(config, boot) {
|
|
471
|
+
if (config.connectConfig) {
|
|
472
|
+
return await connection_fromArgs(config, boot);
|
|
473
|
+
}
|
|
474
|
+
const ctx = await connection_fromSavedSession(config, boot);
|
|
475
|
+
if (!ctx.user || !ctx.URL) {
|
|
476
|
+
if (!session.offline) {
|
|
477
|
+
console.log(chalk.yellow('[!] Running in disconnected mode.'));
|
|
478
|
+
session.offline = true;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
return Ok(ctx);
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Registers the static VFS providers and the logical→physical path resolver
|
|
485
|
+
* hook on the shared salsa vfsDispatcher.
|
|
486
|
+
*/
|
|
487
|
+
async function vfsProviders_register() {
|
|
488
|
+
const { vfsDispatcher } = await import('@fnndsc/salsa');
|
|
489
|
+
const { StaticVfsProvider } = await import('../lib/vfs/providers/static.js');
|
|
490
|
+
vfsDispatcher.provider_register(new StaticVfsProvider('/bin'));
|
|
491
|
+
vfsDispatcher.provider_register(new StaticVfsProvider('/usr'));
|
|
492
|
+
vfsDispatcher.provider_register(new StaticVfsProvider('/usr/bin'));
|
|
493
|
+
vfsDispatcher.pathResolver_register(async (logicalPath) => {
|
|
494
|
+
if (session.physicalMode_get()) {
|
|
495
|
+
return logicalPath;
|
|
496
|
+
}
|
|
497
|
+
const { logical_toPhysical } = await import('@fnndsc/chili/utils');
|
|
498
|
+
const res = await logical_toPhysical(logicalPath);
|
|
499
|
+
if (res.ok) {
|
|
500
|
+
return res.value;
|
|
501
|
+
}
|
|
502
|
+
throw new Error(`Logical-to-physical resolution failed for path: ${logicalPath}`);
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Runs the interactive session: prefetches the boot cache, renders the boot
|
|
507
|
+
* panels and greeting, kicks off non-blocking topology warm-up, and enters the
|
|
508
|
+
* REPL loop.
|
|
509
|
+
*
|
|
510
|
+
* @param config - The parsed CLI config.
|
|
511
|
+
* @param currentContext - The resolved session context.
|
|
512
|
+
* @param flags - Prefetch/interactivity boot flags.
|
|
513
|
+
* @param boot - The boot logger, or null when non-interactive.
|
|
514
|
+
*/
|
|
515
|
+
async function interactiveSession_run(config, currentContext, flags, boot) {
|
|
516
|
+
const cache = await cache_prefetch({ plugins: flags.prefetchPlugins, feeds: flags.prefetchFeeds, publicFeeds: flags.prefetchPublicFeeds, jobs: flags.prefetchJobs }, currentContext.user ?? undefined, flags.isInteractiveSession, boot);
|
|
517
|
+
if (flags.isInteractiveSession) {
|
|
518
|
+
logo_animateStop();
|
|
519
|
+
bootPanels_render(currentContext, config.mode, cache, flags.useAsciiBoot);
|
|
520
|
+
}
|
|
521
|
+
console.log(chalk.yellow('Order up! Your Taco Chell is ready! Filled with chili, salsa, and cumin goodness! 🌮'));
|
|
522
|
+
console.log('');
|
|
523
|
+
if (flags.isInteractiveSession) {
|
|
524
|
+
if (session.offline) {
|
|
525
|
+
console.log(chalk.yellow('You are currently disconnected. Use: connect --user <user> --password <pwd> <url>'));
|
|
526
|
+
}
|
|
527
|
+
console.log(chalk.gray("Tip: type 'help' for available commands."));
|
|
528
|
+
console.log('');
|
|
529
|
+
}
|
|
530
|
+
// Fire instance topology warm-up — does NOT block the REPL.
|
|
531
|
+
// Progress is shown in the prompt as [proc: N/total] until complete.
|
|
532
|
+
if (!session.offline && flags.prefetchJobs) {
|
|
533
|
+
procTopology_warmup().catch(() => { });
|
|
534
|
+
}
|
|
535
|
+
const repl = new REPL();
|
|
536
|
+
await repl.start(command_handle);
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Starts the ChELL REPL.
|
|
540
|
+
* Initializes connection and enters the command loop.
|
|
541
|
+
*
|
|
542
|
+
* @returns A Promise that resolves when the shell exits.
|
|
543
|
+
*/
|
|
544
|
+
export async function chell_start() {
|
|
545
|
+
const config = await cli_parse(process.argv, versionReport_build());
|
|
546
|
+
const { isInteractiveSession, useAsciiBoot, prefetchPlugins, prefetchFeeds, prefetchPublicFeeds, prefetchJobs, showLogo, } = bootFlags_compute(config, !!process.stdout.isTTY);
|
|
547
|
+
const boot = isInteractiveSession ? bootLogger_create('ChELL Boot', useAsciiBoot) : null;
|
|
548
|
+
if (config.mode === 'help' || config.mode === 'version') {
|
|
549
|
+
if (config.output)
|
|
550
|
+
console.log(config.output);
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
// --- Common Initialization ---
|
|
554
|
+
if (isInteractiveSession) {
|
|
555
|
+
logo_print(showLogo && !useAsciiBoot);
|
|
556
|
+
}
|
|
557
|
+
await settings_load();
|
|
558
|
+
spinner.start('Initializing session components');
|
|
559
|
+
await session.init();
|
|
560
|
+
spinner.stop();
|
|
561
|
+
await vfsProviders_register();
|
|
562
|
+
if (isInteractiveSession) {
|
|
563
|
+
console.log(chalk.green('[+] Session initialized.'));
|
|
564
|
+
boot?.log('ok', 'Session', 'Components initialized');
|
|
565
|
+
}
|
|
566
|
+
// Set physical filesystem mode if requested
|
|
567
|
+
if (config.physicalFS) {
|
|
568
|
+
session.physicalMode_set(true);
|
|
569
|
+
if (config.mode !== 'execute' && config.mode !== 'script') {
|
|
570
|
+
console.log(chalk.yellow('[!] Physical filesystem mode enabled - logical-to-physical mapping disabled'));
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
const ctxResult = await connection_establish(config, boot);
|
|
574
|
+
if (!ctxResult.ok)
|
|
575
|
+
process.exit(1);
|
|
576
|
+
let currentContext = ctxResult.value;
|
|
577
|
+
if (!currentContext.folder) {
|
|
578
|
+
currentContext = { ...currentContext, folder: '/' };
|
|
579
|
+
}
|
|
580
|
+
// Login phase complete — start the brain activity animation now
|
|
581
|
+
if (isInteractiveSession && showLogo && !useAsciiBoot) {
|
|
582
|
+
logo_animatePulse();
|
|
583
|
+
}
|
|
584
|
+
// --- Execution Mode ---
|
|
585
|
+
if (config.mode === 'execute' && config.commandToExecute) {
|
|
586
|
+
// Set stop-on-error flag if requested
|
|
587
|
+
if (config.stopOnError) {
|
|
588
|
+
stopOnError_set(true);
|
|
589
|
+
}
|
|
590
|
+
await command_handle(config.commandToExecute);
|
|
591
|
+
process.exit(process.exitCode ?? 0);
|
|
592
|
+
}
|
|
593
|
+
// --- Script Mode ---
|
|
594
|
+
if (config.mode === 'script' && config.scriptFile) {
|
|
595
|
+
await script_execute(config.scriptFile, config.stopOnError || false);
|
|
596
|
+
process.exit(0);
|
|
597
|
+
}
|
|
598
|
+
// --- Interactive Mode ---
|
|
599
|
+
await interactiveSession_run(config, currentContext, { prefetchPlugins, prefetchFeeds, prefetchPublicFeeds, prefetchJobs, isInteractiveSession, useAsciiBoot }, boot);
|
|
600
|
+
}
|
|
601
|
+
//# sourceMappingURL=boot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../../src/core/boot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAU,UAAU,EAAE,EAAE,EAAE,GAAG,EAAwB,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAIL,iBAAiB,EACjB,oCAAoC,EACrC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAkB,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAkB,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAkB,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,OAAO,EAAiB,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAYhE,MAAM,UAAU,GAAW,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1D,MAAM,SAAS,GAAW,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAUnD;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,GAAG,CAAC,GAAG,IAAI,eAAe,CAAgB,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,OAAO,GACX,OAAO,sBAAsB,KAAK,WAAW;YAC3C,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAC;QAChB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAUD;;;;;GAKG;AACH,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAgB,CAAC;IACzG,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,OAAO,GACX,OAAO,iBAAiB,KAAK,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAgB,oBAAoB,EAAE,CAAC;AACxD,MAAM,SAAS,GAAgB,mBAAmB,CAAC,eAAe,CAAC,CAAC;AACpE,MAAM,SAAS,GAAgB,mBAAmB,CAAC,eAAe,CAAC,CAAC;AACpE,MAAM,SAAS,GAAgB,mBAAmB,CAAC,eAAe,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,SAAS,mBAAmB;IAC1B,OAAO;QACL,SAAS,WAAW,CAAC,OAAO,EAAE;QAC9B,WAAW,SAAS,CAAC,OAAO,EAAE;QAC9B,WAAW,SAAS,CAAC,OAAO,EAAE;QAC9B,WAAW,SAAS,CAAC,OAAO,EAAE;KAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AASD;;;;;;GAMG;AACH,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,GAAW;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,aAAa,GAAoB,IAAI,QAAQ,CAAC;YAClD,KAAK,EAAE,UAAS,KAAK,EAAE,QAAQ,EAAE,QAAQ;gBACvC,IAAI,CAAE,IAAwB,CAAC,KAAK;oBAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACxC,QAAQ,EAAE,CAAC;YACb,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAuB,QAAQ,CAAC,eAAe,CAAC;YACtD,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC;QACtD,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC;QAE3B,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAgB,EAAE,EAAE;YACnC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,0BAA0B;YAC3C,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAgBD;;;;;;;;GAQG;AACH,KAAK,UAAU,cAAc,CAC3B,KAAoB,EACpB,IAAwB,EACxB,aAAsB,EACtB,IAAuB;IAEvB,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,8BAA8B;IAC9B,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,CAAC,GAAmB,MAAM,oBAAoB,CAAC,SAAS,EAAE,kCAAkC,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE;YAC5H,MAAM,SAAS,GAA0B,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpE,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM;oBAClF,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,MAAM;iBAC7F,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,GAA6B,UAAU,CAAC,SAAS,EAAE,CAAC;YAC7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC;QACvG,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACT,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC;YACzB,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAI,UAAU,CAAC,CAAC,KAAK,IAAY,CAAC,YAAY,CAAC,CAAC;YACzE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,aAAa,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,IAAI,yBAAyB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAI,mBAAmB,CAAC,CAAC;QACpD,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAI,cAAc,CAAC,CAAC;QAC/C,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IACjD,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAuB,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,GAAmB,MAAM,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtI,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;gBACT,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBACvB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAI,OAAO,EAAE,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACN,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,uBAAuB,QAAQ,EAAE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,CAAC,GAAmB,MAAM,oBAAoB,CAAC,QAAQ,EAAE,0BAA0B,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAC1I,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;gBACT,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;gBACxB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAI,QAAQ,EAAE,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,6BAA6B,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAC7C,CAAC;IAED,eAAe;IACf,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,CAAC,GAAmB,MAAM,oBAAoB,CAAC,MAAM,EAAE,oCAAoC,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE;YAC3H,IAAI,CAAC;gBACH,MAAM,iBAAiB,EAAE,CAAC;gBAC1B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;gBACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC;YACnE,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YACrC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACT,IAAI,EAAE,GAAG,CAAC,IAAI,EAAI,MAAM,EAAE,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAChG,CAAC;aAAM,CAAC;YACN,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,IAAI,4BAA4B,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB,CACxB,OAAsB,EACtB,IAAY,EACZ,KAAgB,EAChB,YAAqB;IAErB,MAAM,WAAW,GAAoB;QACnC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,8BAA8B,EAAqB,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE;QACvG,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,6CAA6C,EAAM,OAAO,EAAE,SAAS,CAAC,OAAO,EAAI;QACvG,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,sCAAsC,EAAa,OAAO,EAAE,SAAS,CAAC,OAAO,EAAI;QACvG,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,iDAAiD,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAI;KACxG,CAAC;IAEF,MAAM,UAAU,GAAmB;QACjC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;QAC7E,EAAE,KAAK,EAAE,MAAM,EAAI,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE;QACxE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAY,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,EAAE,KAAK,EAAE,MAAM,EAAI,KAAK,EAAE,oBAAoB,EAAE,EAAE;KACnD,CAAC;IAEF,MAAM,UAAU,GAAW,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9E,MAAM,YAAY,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzG,MAAM,UAAU,GAAmB;QACjC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,EAAE;QACjE,EAAE,KAAK,EAAE,MAAM,EAAG,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS,EAAE;QACpD,EAAE,KAAK,EAAE,MAAM,EAAG,KAAK,EAAE,IAAI,EAAE;KAChC,CAAC;IAEF,IAAI,OAAO,KAAK,CAAC,OAAO,KAAO,QAAQ;QAAE,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAO,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,EAAI,CAAC,CAAC;IACjH,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QAAE,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAK,KAAK,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACjH,IAAI,OAAO,CAAC,MAAM;QAAuB,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAQ,CAAC,CAAC;IAClH,IAAI,OAAO,KAAK,CAAC,KAAK,KAAS,QAAQ;QAAE,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAI,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,EAAM,CAAC,CAAC;IACjH,IAAI,OAAO,CAAC,IAAI;QAAyB,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAG,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,EAAK,CAAC,CAAC;IACjH,IAAI,OAAO,KAAK,CAAC,MAAM,KAAQ,QAAQ;QAAE,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,EAAK,CAAC,CAAC;IACjH,IAAI,OAAO,CAAC,UAAU;QAAmB,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAG,KAAK,EAAE,OAAO,CAAC,UAAU,EAAI,CAAC,CAAC;IAEjH,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;IAE/E,MAAM,MAAM,GAAe,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IACzF,oCAAoC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAChF,CAAC;AAED;;GAEG;AACH,SAAS,aAAa;IACpB,MAAM,UAAU,GAA2C,EAAE,CAAC,iBAAiB,EAAE,CAAC;IAClF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,MAAM,KAAK,GAA0C,UAAU,CAAC,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChE,OAAO,KAAK,CAAC,OAAO,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB;IAC3B,MAAM,GAAG,GAAS,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,aAAa,GAAW,GAAG,CAAC,iBAAiB,EAAE,CAAC;IACtD,MAAM,IAAI,GAAW,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,MAAM,UAAU,GAAW,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,KAAK,GAAW,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,GAAW,UAAU,GAAG,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjE,MAAM,SAAS,GAAW,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;IACjE,MAAM,OAAO,GAAW,GAAG,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IAChG,MAAM,OAAO,GAAW,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;IACnG,OAAO,GAAG,OAAO,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,cAAuB,KAAK;IAC5E,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,UAAU,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gCAAgC;IAChC,eAAe,CAAC,WAAW,CAAC,CAAC;IAE7B,MAAM,aAAa,GAAW,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAa,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElD,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,IAAI,IAAI,GAAW,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEnC,6BAA6B;QAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,SAAS;QACX,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,GAAG,GAAW,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;YAE3D,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC,CAAC;gBAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,kCAAkC;QACpC,CAAC;QAED,yEAAyE;QACzE,IAAI,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;YACtH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,eAAe,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAID;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAChC,MAAsB,EACtB,IAAuB;IAEvB,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,aAAc,CAAC;IAEpD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACnF,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9E,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC,CAAC;QACrF,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;IAED,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;QACxB,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,IAAK,CAAC,CAAC;QACzD,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO,EAAE,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,YAAY,GAAW,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC,CAAC;QACnE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAC3C,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,2BAA2B,CACxC,MAAsB,EACtB,IAAuB;IAEvB,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,MAAM,GAAG,GAAkB,MAAM,iBAAiB,EAAE,CAAC;IAErD,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAkB,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1E,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,IAAI,qBAAqB,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3F,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAkB,MAAM,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QACpE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,IAAI,qBAAqB,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC3F,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACjD,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,GAAG,GAAW,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,IAAI,qBAAqB,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,oBAAoB,CACjC,MAAsB,EACtB,IAAuB;IAEvB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,MAAM,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,GAAG,GAAkB,MAAM,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3E,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,qBAAqB;IAClC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IACxD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAC7E,aAAa,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,aAAa,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,aAAa,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;IAEnE,aAAa,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAmB,EAAmB,EAAE;QACjF,IAAI,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC/B,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACnE,MAAM,GAAG,GAAmB,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAClE,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,KAAK,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mDAAmD,WAAW,EAAE,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,sBAAsB,CACnC,MAAsB,EACtB,cAA6B,EAC7B,KAA8I,EAC9I,IAAiD;IAEjD,MAAM,KAAK,GAAc,MAAM,cAAc,CAC3C,EAAE,OAAO,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,EAChI,cAAc,CAAC,IAAI,IAAI,SAAS,EAChC,KAAK,CAAC,oBAAoB,EAC1B,IAAI,CACL,CAAC;IAEF,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC/B,gBAAgB,EAAE,CAAC;QACnB,iBAAiB,CACf,cAAc,EACd,MAAM,CAAC,IAAI,EACX,KAAK,EACL,KAAK,CAAC,YAAY,CACnB,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sFAAsF,CAAC,CAAC,CAAC;IAClH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mFAAmF,CAAC,CAAC,CAAC;QACjH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,4DAA4D;IAC5D,qEAAqE;IACrE,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QAC3C,mBAAmB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAmB,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,IAAI,GAAS,IAAI,IAAI,EAAE,CAAC;IAC9B,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAmB,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;IACpF,MAAM,EACJ,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,QAAQ,GACT,GAAc,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,IAAI,GAAgD,oBAAoB,CAAC,CAAC,CAAC,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEtI,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxD,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,gCAAgC;IAEhC,IAAI,oBAAoB,EAAE,CAAC;QACzB,UAAU,CAAC,QAAQ,IAAI,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,aAAa,EAAE,CAAC;IAEtB,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjD,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,MAAM,qBAAqB,EAAE,CAAC;IAE9B,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACrD,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,wBAAwB,CAAC,CAAC;IACvD,CAAC;IAED,4CAA4C;IAC5C,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6EAA6E,CAAC,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAA0B,MAAM,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClF,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,cAAc,GAAkB,SAAS,CAAC,KAAK,CAAC;IACpD,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QAC3B,cAAc,GAAG,EAAE,GAAG,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACtD,CAAC;IAED,gEAAgE;IAChE,IAAI,oBAAoB,IAAI,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;QACtD,iBAAiB,EAAE,CAAC;IACtB,CAAC;IAGD,yBAAyB;IAEzB,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACzD,sCAAsC;QACtC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,eAAe,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,MAAM,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,sBAAsB;IAEtB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAClD,MAAM,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2BAA2B;IAE3B,MAAM,sBAAsB,CAC1B,MAAM,EACN,cAAc,EACd,EAAE,eAAe,EAAE,aAAa,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,EACzG,IAAI,CACL,CAAC;AACJ,CAAC"}
|