botmux 2.85.1 → 2.86.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/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +209 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +7 -106
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +240 -2
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/role-resolver.d.ts +1 -0
- package/dist/core/role-resolver.d.ts.map +1 -1
- package/dist/core/role-resolver.js +14 -0
- package/dist/core/role-resolver.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +15 -4
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +116 -0
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/groups.d.ts +2 -0
- package/dist/dashboard/web/groups.d.ts.map +1 -1
- package/dist/dashboard/web/groups.js +419 -3
- package/dist/dashboard/web/groups.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +617 -3
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/insights.d.ts +2 -0
- package/dist/dashboard/web/insights.d.ts.map +1 -0
- package/dist/dashboard/web/insights.js +1523 -0
- package/dist/dashboard/web/insights.js.map +1 -0
- package/dist/dashboard/web/role-profile-match.d.ts +31 -0
- package/dist/dashboard/web/role-profile-match.d.ts.map +1 -0
- package/dist/dashboard/web/role-profile-match.js +58 -0
- package/dist/dashboard/web/role-profile-match.js.map +1 -0
- package/dist/dashboard/web/roles.d.ts +1 -0
- package/dist/dashboard/web/roles.d.ts.map +1 -1
- package/dist/dashboard/web/roles.js +520 -27
- package/dist/dashboard/web/roles.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +84 -0
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard-web/app.js +1243 -831
- package/dist/dashboard-web/index.html +2 -1
- package/dist/dashboard-web/style.css +1085 -3
- package/dist/dashboard.js +215 -3
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +34 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +34 -1
- package/dist/i18n/zh.js.map +1 -1
- package/dist/services/group-creator.d.ts +6 -0
- package/dist/services/group-creator.d.ts.map +1 -1
- package/dist/services/group-creator.js +54 -5
- package/dist/services/group-creator.js.map +1 -1
- package/dist/services/insight/antigravity-span-reader.d.ts +3 -0
- package/dist/services/insight/antigravity-span-reader.d.ts.map +1 -0
- package/dist/services/insight/antigravity-span-reader.js +249 -0
- package/dist/services/insight/antigravity-span-reader.js.map +1 -0
- package/dist/services/insight/classify.d.ts +7 -0
- package/dist/services/insight/classify.d.ts.map +1 -0
- package/dist/services/insight/classify.js +46 -0
- package/dist/services/insight/classify.js.map +1 -0
- package/dist/services/insight/claude-span-reader.d.ts +3 -0
- package/dist/services/insight/claude-span-reader.d.ts.map +1 -0
- package/dist/services/insight/claude-span-reader.js +257 -0
- package/dist/services/insight/claude-span-reader.js.map +1 -0
- package/dist/services/insight/codex-span-reader.d.ts +3 -0
- package/dist/services/insight/codex-span-reader.d.ts.map +1 -0
- package/dist/services/insight/codex-span-reader.js +290 -0
- package/dist/services/insight/codex-span-reader.js.map +1 -0
- package/dist/services/insight/intent.d.ts +5 -0
- package/dist/services/insight/intent.d.ts.map +1 -0
- package/dist/services/insight/intent.js +145 -0
- package/dist/services/insight/intent.js.map +1 -0
- package/dist/services/insight/jsonl.d.ts +10 -0
- package/dist/services/insight/jsonl.d.ts.map +1 -0
- package/dist/services/insight/jsonl.js +36 -0
- package/dist/services/insight/jsonl.js.map +1 -0
- package/dist/services/insight/prompt.d.ts +3 -0
- package/dist/services/insight/prompt.d.ts.map +1 -0
- package/dist/services/insight/prompt.js +99 -0
- package/dist/services/insight/prompt.js.map +1 -0
- package/dist/services/insight/redact.d.ts +4 -0
- package/dist/services/insight/redact.d.ts.map +1 -0
- package/dist/services/insight/redact.js +67 -0
- package/dist/services/insight/redact.js.map +1 -0
- package/dist/services/insight/report.d.ts +29 -0
- package/dist/services/insight/report.d.ts.map +1 -0
- package/dist/services/insight/report.js +1126 -0
- package/dist/services/insight/report.js.map +1 -0
- package/dist/services/insight/safe-detail.d.ts +5 -0
- package/dist/services/insight/safe-detail.d.ts.map +1 -0
- package/dist/services/insight/safe-detail.js +59 -0
- package/dist/services/insight/safe-detail.js.map +1 -0
- package/dist/services/insight/scrub.d.ts +22 -0
- package/dist/services/insight/scrub.d.ts.map +1 -0
- package/dist/services/insight/scrub.js +70 -0
- package/dist/services/insight/scrub.js.map +1 -0
- package/dist/services/insight/types.d.ts +394 -0
- package/dist/services/insight/types.d.ts.map +1 -0
- package/dist/services/insight/types.js +2 -0
- package/dist/services/insight/types.js.map +1 -0
- package/dist/services/role-profile-store.d.ts +25 -0
- package/dist/services/role-profile-store.d.ts.map +1 -0
- package/dist/services/role-profile-store.js +171 -0
- package/dist/services/role-profile-store.js.map +1 -0
- package/dist/services/transcript-resolver.d.ts +26 -0
- package/dist/services/transcript-resolver.d.ts.map +1 -0
- package/dist/services/transcript-resolver.js +111 -0
- package/dist/services/transcript-resolver.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { createCliAdapterSync } from '../adapters/cli/registry.js';
|
|
5
|
+
import { expandHome } from '../core/working-dir.js';
|
|
6
|
+
import { findCodexRolloutBySessionId, findCodexSessionIdByBotmuxSessionId } from './codex-transcript.js';
|
|
7
|
+
import { cocoEventsPathForSession } from './coco-transcript.js';
|
|
8
|
+
import { findCursorTranscriptByChatId } from './cursor-transcript.js';
|
|
9
|
+
import { findTraexRolloutBySessionId } from './traex-transcript.js';
|
|
10
|
+
const sessionPathCache = new Map();
|
|
11
|
+
const SESSION_PATH_CACHE_MAX_ENTRIES = 1024;
|
|
12
|
+
/** A missed lookup (transcript not on disk yet) is retried only after this
|
|
13
|
+
* window — fresh sessions otherwise trigger a directory scan per row render. */
|
|
14
|
+
const PATH_MISS_RETRY_MS = 30_000;
|
|
15
|
+
export function __resetTranscriptResolverCacheForTest() {
|
|
16
|
+
sessionPathCache.clear();
|
|
17
|
+
}
|
|
18
|
+
/** Memoize a transcript-path lookup. `hitTtlMs === null` means a found path
|
|
19
|
+
* is trusted forever (rollout/transcript files never move); misses are
|
|
20
|
+
* retried after PATH_MISS_RETRY_MS — or immediately when `retryMiss` is set
|
|
21
|
+
* (ledger reads must see lazily created transcripts at turn boundaries). */
|
|
22
|
+
export function cachedTranscriptPathLookup(key, hitTtlMs, lookup, opts) {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
const cached = sessionPathCache.get(key);
|
|
25
|
+
if (cached) {
|
|
26
|
+
if (cached.path !== null) {
|
|
27
|
+
if (!opts?.refreshHit && (hitTtlMs === null || now - cached.atMs < hitTtlMs))
|
|
28
|
+
return cached.path;
|
|
29
|
+
}
|
|
30
|
+
else if (!opts?.retryMiss && now - cached.atMs < PATH_MISS_RETRY_MS) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (sessionPathCache.size >= SESSION_PATH_CACHE_MAX_ENTRIES && !sessionPathCache.has(key)) {
|
|
35
|
+
const oldest = sessionPathCache.keys().next().value;
|
|
36
|
+
if (oldest !== undefined)
|
|
37
|
+
sessionPathCache.delete(oldest);
|
|
38
|
+
}
|
|
39
|
+
const path = lookup();
|
|
40
|
+
sessionPathCache.set(key, { path, atMs: now });
|
|
41
|
+
return path;
|
|
42
|
+
}
|
|
43
|
+
export function getClaudeSessionJsonlPath(sessionId, cwd, dataDir) {
|
|
44
|
+
const resolvedCwd = resolve(expandHome(cwd));
|
|
45
|
+
// Claude stores sessions at ~/.claude/projects/<project-key>/<sessionId>.jsonl
|
|
46
|
+
// where project-key = absolute path with non [A-Za-z0-9-] chars replaced by -
|
|
47
|
+
const projectKey = resolvedCwd.replace(/[^A-Za-z0-9-]/g, '-');
|
|
48
|
+
const jsonlPath = join(dataDir, 'projects', projectKey, `${sessionId}.jsonl`);
|
|
49
|
+
return existsSync(jsonlPath) ? jsonlPath : null;
|
|
50
|
+
}
|
|
51
|
+
/** Resolve a Claude-family fork's (seed / relay) data root EXACTLY as the worker
|
|
52
|
+
* does, so usage/insight reads hit the same transcript the CLI wrote. */
|
|
53
|
+
const claudeForkDataDirCache = new Map();
|
|
54
|
+
function claudeForkDataDir(cliId) {
|
|
55
|
+
const cached = claudeForkDataDirCache.get(cliId);
|
|
56
|
+
if (cached)
|
|
57
|
+
return cached;
|
|
58
|
+
const dir = createCliAdapterSync(cliId).claudeDataDir ?? join(homedir(), '.claude-runtime');
|
|
59
|
+
claudeForkDataDirCache.set(cliId, dir);
|
|
60
|
+
return dir;
|
|
61
|
+
}
|
|
62
|
+
export function resolveSessionTranscriptPath(q) {
|
|
63
|
+
const sid = q.cliSessionId || q.sessionId;
|
|
64
|
+
switch (q.cliId) {
|
|
65
|
+
case 'claude-code': {
|
|
66
|
+
const path = q.cwd ? getClaudeSessionJsonlPath(sid, q.cwd, join(homedir(), '.claude')) : null;
|
|
67
|
+
return path ? { path, kind: 'claude' } : null;
|
|
68
|
+
}
|
|
69
|
+
case 'aiden': {
|
|
70
|
+
const path = q.cwd ? getClaudeSessionJsonlPath(sid, q.cwd, join(homedir(), '.claude')) : null;
|
|
71
|
+
return path ? { path, kind: 'claude' } : null;
|
|
72
|
+
}
|
|
73
|
+
case 'seed':
|
|
74
|
+
case 'relay': {
|
|
75
|
+
const path = q.cwd ? getClaudeSessionJsonlPath(sid, q.cwd, claudeForkDataDir(q.cliId)) : null;
|
|
76
|
+
return path ? { path, kind: 'claude' } : null;
|
|
77
|
+
}
|
|
78
|
+
case 'codex': {
|
|
79
|
+
const path = cachedTranscriptPathLookup(`codex:${q.sessionId}:${q.cliSessionId ?? ''}`, null, () => {
|
|
80
|
+
const codexSid = q.cliSessionId || findCodexSessionIdByBotmuxSessionId(q.sessionId) || q.sessionId;
|
|
81
|
+
return findCodexRolloutBySessionId(codexSid) ?? null;
|
|
82
|
+
}, { retryMiss: q.fresh });
|
|
83
|
+
return path ? { path, kind: 'codex' } : null;
|
|
84
|
+
}
|
|
85
|
+
case 'coco': {
|
|
86
|
+
const path = cocoEventsPathForSession(sid);
|
|
87
|
+
return path ? { path, kind: 'coco' } : null;
|
|
88
|
+
}
|
|
89
|
+
case 'cursor': {
|
|
90
|
+
const path = cachedTranscriptPathLookup(`cursor:${sid}`, null, () => findCursorTranscriptByChatId(sid) ?? null, { retryMiss: q.fresh });
|
|
91
|
+
return path ? { path, kind: 'cursor' } : null;
|
|
92
|
+
}
|
|
93
|
+
case 'traex': {
|
|
94
|
+
const path = cachedTranscriptPathLookup(`traex:${sid}`, null, () => findTraexRolloutBySessionId(sid) ?? null, { retryMiss: q.fresh });
|
|
95
|
+
return path ? { path, kind: 'traex' } : null;
|
|
96
|
+
}
|
|
97
|
+
case 'antigravity': {
|
|
98
|
+
// Validate the CLI session id before interpolating it into a path (every
|
|
99
|
+
// other branch resolves by scanning a data dir; this one builds the path
|
|
100
|
+
// directly). Conservative charset rules out traversal / separators, and
|
|
101
|
+
// existsSync keeps the null-when-absent contract the other branches honor.
|
|
102
|
+
if (!q.cliSessionId || !/^[A-Za-z0-9._-]+$/.test(q.cliSessionId))
|
|
103
|
+
return null;
|
|
104
|
+
const p = join(homedir(), '.gemini', 'antigravity-cli', 'brain', q.cliSessionId, '.system_generated', 'logs', 'transcript.jsonl');
|
|
105
|
+
return existsSync(p) ? { path: p, kind: 'antigravity' } : null;
|
|
106
|
+
}
|
|
107
|
+
default:
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=transcript-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-resolver.js","sourceRoot":"","sources":["../../src/services/transcript-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,mCAAmC,EAAE,MAAM,uBAAuB,CAAC;AACzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAkBpE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAiD,CAAC;AAClF,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAC5C;iFACiF;AACjF,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,UAAU,qCAAqC;IACnD,gBAAgB,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED;;;6EAG6E;AAC7E,MAAM,UAAU,0BAA0B,CACxC,GAAW,EACX,QAAuB,EACvB,MAA2B,EAC3B,IAAoD;IAEpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC;QACnG,CAAC;aAAM,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI,GAAG,kBAAkB,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,gBAAgB,CAAC,IAAI,IAAI,8BAA8B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1F,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,MAAM,KAAK,SAAS;YAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC;IACtB,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAAiB,EAAE,GAAW,EAAE,OAAe;IACvF,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,+EAA+E;IAC/E,8EAA8E;IAC9E,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;IAC9E,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED;0EAC0E;AAC1E,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAkB,CAAC;AACzD,SAAS,iBAAiB,CAAC,KAAuB;IAChD,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAC5F,sBAAsB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,CAAsB;IACjE,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,SAAS,CAAC;IAC1C,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9F,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9F,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9F,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;gBACjG,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,IAAI,mCAAmC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;gBACnG,OAAO,2BAA2B,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;YACvD,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9C,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,0BAA0B,CAAC,UAAU,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,4BAA4B,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACxI,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,0BAA0B,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,2BAA2B,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACtI,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,yEAAyE;YACzE,yEAAyE;YACzE,wEAAwE;YACxE,2EAA2E;YAC3E,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC9E,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC,YAAY,EAAE,mBAAmB,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;YAClI,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,CAAC;QACD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|