@router-agent/runtime 0.0.0-stage → 0.3.31

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.
Files changed (124) hide show
  1. package/dist/agents/claude.d.ts +51 -0
  2. package/dist/agents/claude.js +270 -0
  3. package/dist/agents/claude.js.map +1 -0
  4. package/dist/agents/codex.d.ts +36 -0
  5. package/dist/agents/codex.js +292 -0
  6. package/dist/agents/codex.js.map +1 -0
  7. package/dist/agents/profile.d.ts +39 -0
  8. package/dist/agents/profile.js +2 -0
  9. package/dist/agents/profile.js.map +1 -0
  10. package/dist/agents/registry.d.ts +21 -0
  11. package/dist/agents/registry.js +78 -0
  12. package/dist/agents/registry.js.map +1 -0
  13. package/dist/errors.d.ts +4 -0
  14. package/dist/errors.js +9 -0
  15. package/dist/errors.js.map +1 -0
  16. package/dist/evidence-gate.d.ts +78 -0
  17. package/dist/evidence-gate.js +196 -0
  18. package/dist/evidence-gate.js.map +1 -0
  19. package/dist/index.d.ts +22 -0
  20. package/dist/index.js +21 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/naming.d.ts +23 -0
  23. package/dist/naming.js +40 -0
  24. package/dist/naming.js.map +1 -0
  25. package/dist/orca/commands.js +60 -0
  26. package/dist/orca/commands.js.map +1 -0
  27. package/dist/orca/index.js +452 -0
  28. package/dist/orca/index.js.map +1 -0
  29. package/dist/orca/options.js +33 -0
  30. package/dist/orca/options.js.map +1 -0
  31. package/dist/orca/report-poller.js +143 -0
  32. package/dist/orca/report-poller.js.map +1 -0
  33. package/dist/permissions/acp.d.ts +21 -0
  34. package/dist/permissions/acp.js +73 -0
  35. package/dist/permissions/acp.js.map +1 -0
  36. package/dist/permissions.d.ts +1 -0
  37. package/dist/permissions.js +2 -0
  38. package/dist/permissions.js.map +1 -0
  39. package/dist/plugins/loader.d.ts +46 -0
  40. package/dist/plugins/loader.js +117 -0
  41. package/dist/plugins/loader.js.map +1 -0
  42. package/dist/plugins/types.d.ts +52 -0
  43. package/dist/plugins/types.js +2 -0
  44. package/dist/plugins/types.js.map +1 -0
  45. package/dist/port.d.ts +295 -0
  46. package/dist/port.js +17 -0
  47. package/dist/port.js.map +1 -0
  48. package/dist/registry.d.ts +13 -0
  49. package/dist/registry.js +35 -0
  50. package/dist/registry.js.map +1 -0
  51. package/dist/report-poller.d.ts +58 -0
  52. package/dist/report-poller.js +130 -0
  53. package/dist/report-poller.js.map +1 -0
  54. package/dist/resume.d.ts +52 -0
  55. package/dist/resume.js +109 -0
  56. package/dist/resume.js.map +1 -0
  57. package/dist/runtimes/acp/admin.js +470 -0
  58. package/dist/runtimes/acp/admin.js.map +1 -0
  59. package/dist/runtimes/acp/agents.js +167 -0
  60. package/dist/runtimes/acp/agents.js.map +1 -0
  61. package/dist/runtimes/acp/detect.js +379 -0
  62. package/dist/runtimes/acp/detect.js.map +1 -0
  63. package/dist/runtimes/acp/index.js +633 -0
  64. package/dist/runtimes/acp/index.js.map +1 -0
  65. package/dist/runtimes/acp/install.js +264 -0
  66. package/dist/runtimes/acp/install.js.map +1 -0
  67. package/dist/runtimes/acp/permissions.js +83 -0
  68. package/dist/runtimes/acp/permissions.js.map +1 -0
  69. package/dist/runtimes/acp/protocol.js +207 -0
  70. package/dist/runtimes/acp/protocol.js.map +1 -0
  71. package/dist/runtimes/acp-agents.d.ts +85 -0
  72. package/dist/runtimes/acp-agents.js +167 -0
  73. package/dist/runtimes/acp-agents.js.map +1 -0
  74. package/dist/runtimes/acp-detect-utils.d.ts +4 -0
  75. package/dist/runtimes/acp-detect-utils.js +35 -0
  76. package/dist/runtimes/acp-detect-utils.js.map +1 -0
  77. package/dist/runtimes/builtin-options.d.ts +3 -0
  78. package/dist/runtimes/builtin-options.js +44 -0
  79. package/dist/runtimes/builtin-options.js.map +1 -0
  80. package/dist/runtimes/catalog.d.ts +31 -0
  81. package/dist/runtimes/catalog.js +75 -0
  82. package/dist/runtimes/catalog.js.map +1 -0
  83. package/dist/runtimes/claude-code/index.js +544 -0
  84. package/dist/runtimes/claude-code/index.js.map +1 -0
  85. package/dist/runtimes/claude-code/inject.js +71 -0
  86. package/dist/runtimes/claude-code/inject.js.map +1 -0
  87. package/dist/runtimes/codex/client.js +203 -0
  88. package/dist/runtimes/codex/client.js.map +1 -0
  89. package/dist/runtimes/codex/detect.js +240 -0
  90. package/dist/runtimes/codex/detect.js.map +1 -0
  91. package/dist/runtimes/codex/index.js +1066 -0
  92. package/dist/runtimes/codex/index.js.map +1 -0
  93. package/dist/runtimes/herdr/agents.js +38 -0
  94. package/dist/runtimes/herdr/agents.js.map +1 -0
  95. package/dist/runtimes/herdr/commands.js +68 -0
  96. package/dist/runtimes/herdr/commands.js.map +1 -0
  97. package/dist/runtimes/herdr/index.js +712 -0
  98. package/dist/runtimes/herdr/index.js.map +1 -0
  99. package/dist/runtimes/herdr/options.js +29 -0
  100. package/dist/runtimes/herdr/options.js.map +1 -0
  101. package/dist/runtimes/herdr/server.js +75 -0
  102. package/dist/runtimes/herdr/server.js.map +1 -0
  103. package/dist/runtimes/options.d.ts +60 -0
  104. package/dist/runtimes/options.js +89 -0
  105. package/dist/runtimes/options.js.map +1 -0
  106. package/dist/spec/contract.md +120 -0
  107. package/dist/spec/index.d.ts +35 -0
  108. package/dist/spec/index.js +59 -0
  109. package/dist/spec/index.js.map +1 -0
  110. package/dist/spec/prompt-mode.md +176 -0
  111. package/dist/spec/reader.d.ts +5 -0
  112. package/dist/spec/reader.js +32 -0
  113. package/dist/spec/reader.js.map +1 -0
  114. package/dist/status.d.ts +8 -0
  115. package/dist/status.js +22 -0
  116. package/dist/status.js.map +1 -0
  117. package/dist/workspaces/git-worktree.d.ts +44 -0
  118. package/dist/workspaces/git-worktree.js +183 -0
  119. package/dist/workspaces/git-worktree.js.map +1 -0
  120. package/dist/workspaces/overview.d.ts +66 -0
  121. package/dist/workspaces/overview.js +12 -0
  122. package/dist/workspaces/overview.js.map +1 -0
  123. package/package.json +36 -4
  124. package/README.md +0 -3
@@ -0,0 +1,167 @@
1
+ /**
2
+ * ACP Agent 静态目录。
3
+ *
4
+ * 这里只放纯常量与纯函数,不能依赖任何 Node 内置模块 —— Web 面板会把它
5
+ * 一起打进前端包。探测、安装、spawn 等 Node-only 逻辑放在 detect.ts / install.ts。
6
+ */
7
+ export const ACP_AGENTS = [
8
+ {
9
+ id: 'claude',
10
+ runtimeId: 'acp-claude',
11
+ name: 'Claude Code',
12
+ label: 'Claude Code (ACP)',
13
+ hint: '通过 claude-agent-acp 接入,支持断线后 session/load 恢复',
14
+ command: 'claude-agent-acp',
15
+ args: [],
16
+ package: { name: '@agentclientprotocol/claude-agent-acp', version: '0.101.0' },
17
+ packageUrl: 'https://www.npmjs.com/package/@agentclientprotocol/claude-agent-acp',
18
+ cli: {
19
+ command: 'claude',
20
+ label: 'Claude Code CLI',
21
+ installUrl: 'https://docs.claude.com/en/docs/claude-code/setup',
22
+ },
23
+ probeArgs: ['--version'],
24
+ env: { CLAUDE_AGENT_ACP_PROTOCOL: 'v1' },
25
+ login: { command: 'claude', args: [], hint: '先完成 Claude Code 登录(claude 能正常对话)' },
26
+ loadSession: true,
27
+ // 已有 claude-code 内置运行时,Web 面板不再把它作为可选项展示。
28
+ deprecated: true,
29
+ },
30
+ {
31
+ id: 'codex',
32
+ runtimeId: 'acp-codex',
33
+ name: 'Codex',
34
+ label: 'Codex (ACP)',
35
+ hint: 'baldaworks codex-acp;依赖本机 codex CLI,不支持断线恢复',
36
+ command: 'codex-acp',
37
+ args: ['--message-streaming'],
38
+ package: { name: 'codex-acp', version: '1.11.0' },
39
+ packageUrl: 'https://www.npmjs.com/package/codex-acp',
40
+ cli: {
41
+ command: 'codex',
42
+ label: 'OpenAI Codex CLI',
43
+ installUrl: 'https://github.com/openai/codex',
44
+ },
45
+ probeArgs: ['version'],
46
+ requires: [
47
+ {
48
+ command: 'codex',
49
+ label: 'Codex CLI',
50
+ capabilityArgs: ['app-server', '--help'],
51
+ hint: '需要本机安装 codex CLI,且版本包含 app-server 子命令',
52
+ },
53
+ ],
54
+ login: {
55
+ command: 'codex-acp',
56
+ args: ['login'],
57
+ hint: '先运行 codex-acp login',
58
+ check: { command: 'codex', args: ['login', 'status'] },
59
+ },
60
+ loadSession: false,
61
+ // 已有 codex-app 内置运行时,Web 面板不再把它作为可选项展示。
62
+ deprecated: true,
63
+ },
64
+ {
65
+ id: 'opencode',
66
+ runtimeId: 'acp-opencode',
67
+ name: 'OpenCode',
68
+ label: 'OpenCode',
69
+ hint: 'opencode acp 原生 ACP 模式',
70
+ command: 'opencode',
71
+ args: ['acp'],
72
+ probeArgs: ['--version'],
73
+ installHint: 'brew install opencode(或参考 opencode 官方安装说明)',
74
+ installUrl: 'https://opencode.ai/docs/',
75
+ cli: { command: 'opencode', label: 'OpenCode CLI', installUrl: 'https://opencode.ai/docs/' },
76
+ verifyRequired: true,
77
+ loadSession: true,
78
+ },
79
+ {
80
+ id: 'gemini',
81
+ runtimeId: 'acp-gemini',
82
+ name: 'Gemini CLI',
83
+ label: 'Gemini CLI',
84
+ hint: 'gemini --acp 实验性 ACP 模式',
85
+ command: 'gemini',
86
+ args: ['--acp'],
87
+ probeArgs: ['--version'],
88
+ installHint: 'npm i -g @google/gemini-cli',
89
+ installUrl: 'https://github.com/google-gemini/gemini-cli',
90
+ cli: { command: 'gemini', label: 'Gemini CLI', installUrl: 'https://github.com/google-gemini/gemini-cli' },
91
+ verifyRequired: true,
92
+ },
93
+ {
94
+ id: 'copilot',
95
+ runtimeId: 'acp-copilot',
96
+ name: 'GitHub Copilot CLI',
97
+ label: 'GitHub Copilot CLI',
98
+ hint: 'copilot --acp --stdio',
99
+ command: 'copilot',
100
+ args: ['--acp', '--stdio'],
101
+ probeArgs: ['--version'],
102
+ installHint: '参考 GitHub Copilot CLI 官方安装说明',
103
+ installUrl: 'https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli',
104
+ cli: {
105
+ command: 'copilot',
106
+ label: 'GitHub Copilot CLI',
107
+ installUrl: 'https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli',
108
+ },
109
+ verifyRequired: true,
110
+ },
111
+ {
112
+ id: 'cursor',
113
+ runtimeId: 'acp-cursor',
114
+ name: 'Cursor CLI',
115
+ label: 'Cursor CLI',
116
+ hint: 'cursor-agent acp;旧版本可能没有 acp 子命令',
117
+ command: 'cursor-agent',
118
+ args: ['acp'],
119
+ probeArgs: ['--version'],
120
+ installHint: '升级 cursor-agent 到支持 acp 子命令的版本',
121
+ installUrl: 'https://cursor.com/cli',
122
+ cli: { command: 'cursor-agent', label: 'Cursor CLI', installUrl: 'https://cursor.com/cli' },
123
+ verifyRequired: true,
124
+ },
125
+ {
126
+ id: 'goose',
127
+ runtimeId: 'acp-goose',
128
+ name: 'Goose',
129
+ label: 'Goose',
130
+ hint: 'goose acp 原生 ACP 模式',
131
+ command: 'goose',
132
+ args: ['acp'],
133
+ probeArgs: ['--version'],
134
+ installHint: 'brew install block-goose-cli(或参考 Goose 官方安装说明)',
135
+ installUrl: 'https://block.github.io/goose/docs/getting-started/installation',
136
+ cli: {
137
+ command: 'goose',
138
+ label: 'Goose CLI',
139
+ installUrl: 'https://block.github.io/goose/docs/getting-started/installation',
140
+ },
141
+ verifyRequired: true,
142
+ },
143
+ ];
144
+ /** 按 agent id 或 runtime id 查目录项。 */
145
+ export function acpAgentOf(idOrRuntimeId) {
146
+ const value = idOrRuntimeId.trim();
147
+ return ACP_AGENTS.find(agent => agent.id === value || agent.runtimeId === value);
148
+ }
149
+ /** 是否是目录内的动态 ACP 运行时 id(不含旧的通用 `acp`)。 */
150
+ export function isAcpRuntimeId(id) {
151
+ const value = id.trim();
152
+ return ACP_AGENTS.some(agent => agent.runtimeId === value);
153
+ }
154
+ /**
155
+ * 是否是已有原生运行时替代品的 ACP 运行时(Claude Code / Codex)。
156
+ *
157
+ * 这类运行时 id 依旧合法、依旧能派工,只是 Web 面板不再把它们列为可选项。
158
+ */
159
+ export function isDeprecatedAcpRuntimeId(id) {
160
+ const value = id.trim();
161
+ return ACP_AGENTS.some(agent => agent.runtimeId === value && agent.deprecated === true);
162
+ }
163
+ /** agent id → runtime id;未知 id 返回 null。 */
164
+ export function acpRuntimeIdOf(idOrRuntimeId) {
165
+ return acpAgentOf(idOrRuntimeId)?.runtimeId ?? null;
166
+ }
167
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../../../../packages/runtime/src/runtimes/acp/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,379 @@
1
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { delimiter, isAbsolute, join } from 'node:path';
4
+ import { realRunner } from '@router-agent/infra/process.js';
5
+ import { acpAgentOf, ACP_AGENTS } from './agents.js';
6
+ import { AcpConnection, AcpProtocolError } from './protocol.js';
7
+ const DEFAULT_TIMEOUT_MS = 2_500;
8
+ const REQUIRE_TIMEOUT_MS = 1_500;
9
+ /** 运行时目录根:~/.router-agent/runtimes */
10
+ export function acpRuntimesRoot(home) {
11
+ return join(home, 'runtimes');
12
+ }
13
+ /** 某个 Agent 的 managed 安装目录:~/.router-agent/runtimes/<agentId> */
14
+ export function managedAgentDir(home, agentId) {
15
+ return join(acpRuntimesRoot(home), agentId);
16
+ }
17
+ /** 在 PATH 里解析命令;支持 Windows 的 PATHEXT。返回绝对路径。 */
18
+ export function resolveExecutable(command, env) {
19
+ const value = command.trim();
20
+ if (!value)
21
+ return undefined;
22
+ if (isAbsolute(value) || value.includes('/') || value.includes('\\')) {
23
+ return existsSync(value) ? value : undefined;
24
+ }
25
+ const pathValue = env.PATH ?? env.Path ?? '';
26
+ const extensions = process.platform === 'win32'
27
+ ? ['', '.cmd', '.exe', '.bat']
28
+ : [''];
29
+ for (const dir of pathValue.split(delimiter)) {
30
+ if (!dir)
31
+ continue;
32
+ for (const ext of extensions) {
33
+ const candidate = join(dir, `${value}${ext}`);
34
+ if (existsSync(candidate))
35
+ return candidate;
36
+ }
37
+ }
38
+ return undefined;
39
+ }
40
+ function managedBin(agent, home) {
41
+ const dir = join(managedAgentDir(home, agent.id), 'node_modules', '.bin');
42
+ const names = process.platform === 'win32'
43
+ ? [`${agent.command}.cmd`, `${agent.command}.exe`, agent.command]
44
+ : [agent.command];
45
+ for (const name of names) {
46
+ const candidate = join(dir, name);
47
+ if (existsSync(candidate))
48
+ return candidate;
49
+ }
50
+ return undefined;
51
+ }
52
+ function optionRecordOf(config, runtimeId) {
53
+ const value = config.runtime.options?.[runtimeId];
54
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
55
+ }
56
+ /** 读取某个 ACP 运行时的 args/env 覆盖。registry 与探测共用。 */
57
+ export function acpRuntimeConfig(agent, config) {
58
+ const options = optionRecordOf(config, agent.runtimeId);
59
+ const args = Array.isArray(options.args)
60
+ ? options.args.filter((item) => typeof item === 'string')
61
+ : [...agent.args];
62
+ const env = { ...(agent.env ?? {}) };
63
+ if (options.env && typeof options.env === 'object' && !Array.isArray(options.env)) {
64
+ for (const [key, value] of Object.entries(options.env)) {
65
+ if (typeof value === 'string')
66
+ env[key] = value;
67
+ }
68
+ }
69
+ return { args, env };
70
+ }
71
+ export function installHintOf(agent) {
72
+ return agent.package ? `ra runtime install ${agent.runtimeId}` : agent.installHint;
73
+ }
74
+ /**
75
+ * 同步解析 Agent 命令,不 spawn 任何进程。
76
+ *
77
+ * 优先级:runtime.options.<id>.command → ~/.router-agent/runtimes/<agent>/node_modules/.bin
78
+ * → PATH。找不到时返回 reason,registry 会把它变成 start() 的 runtime:unavailable。
79
+ */
80
+ export function resolveAgentCommand(agent, opts) {
81
+ const options = optionRecordOf(opts.config, agent.runtimeId);
82
+ const override = typeof options.command === 'string' ? options.command.trim() : '';
83
+ if (override) {
84
+ const resolved = resolveExecutable(override, opts.env);
85
+ return resolved
86
+ ? { command: resolved, source: 'config' }
87
+ : { source: 'config', reason: `runtime.options.${agent.runtimeId}.command 指向的文件不存在:${override}` };
88
+ }
89
+ const managed = managedBin(agent, opts.home);
90
+ if (managed)
91
+ return { command: managed, source: 'managed' };
92
+ const onPath = resolveExecutable(agent.command, opts.env);
93
+ if (onPath)
94
+ return { command: onPath, source: 'path' };
95
+ return { reason: `未找到 ${agent.command},也没有 managed 安装` };
96
+ }
97
+ export function parseVersion(text) {
98
+ const match = /(\d+)\.(\d+)\.(\d+)/.exec(text);
99
+ return match ? `${match[1]}.${match[2]}.${match[3]}` : undefined;
100
+ }
101
+ function compareVersion(a, b) {
102
+ const pa = a.split('.').map(Number);
103
+ const pb = b.split('.').map(Number);
104
+ for (let i = 0; i < 3; i += 1) {
105
+ const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
106
+ if (diff !== 0)
107
+ return diff;
108
+ }
109
+ return 0;
110
+ }
111
+ function tail(text, max = 300) {
112
+ const value = text.trim().replace(/\s+/g, ' ');
113
+ return value.length <= max ? value : `…${value.slice(-max)}`;
114
+ }
115
+ async function probe(runner, bin, args, opts) {
116
+ try {
117
+ return await runner(bin).run([...args], {
118
+ cwd: opts.cwd,
119
+ env: { ...process.env, ...opts.env },
120
+ timeoutMs: opts.timeoutMs,
121
+ });
122
+ }
123
+ catch (error) {
124
+ return { code: 127, stdout: '', stderr: error instanceof Error ? error.message : String(error) };
125
+ }
126
+ }
127
+ async function detectOne(agent, opts) {
128
+ const runner = opts.runner ?? realRunner;
129
+ const base = {
130
+ id: agent.runtimeId,
131
+ name: agent.name,
132
+ label: agent.label,
133
+ hint: agent.hint,
134
+ status: 'not-installed',
135
+ installable: Boolean(agent.package),
136
+ ...(agent.package ? { packageName: agent.package.name } : {}),
137
+ ...(installHintOf(agent) ? { installHint: installHintOf(agent) } : {}),
138
+ ...(agent.login ? { loginHint: agent.login.hint } : {}),
139
+ ...(agent.loadSession !== undefined ? { loadSession: agent.loadSession } : {}),
140
+ ...(agent.verifyRequired ? { verifyRequired: true } : {}),
141
+ ...(agent.deprecated ? { deprecated: true } : {}),
142
+ };
143
+ const resolved = resolveAgentCommand(agent, { home: opts.home, env: opts.env, config: opts.config });
144
+ // CLI 与 ACP 扩展分开探测:例如 claude 已安装但 claude-agent-acp 还没装,
145
+ // 卡片应该只显示「安装 ACP 扩展」,而不是笼统的「未安装」。
146
+ const cliCommand = agent.cli?.command ?? agent.command;
147
+ const cliBin = cliCommand === agent.command && resolved.command
148
+ ? resolved.command
149
+ : resolveExecutable(cliCommand, opts.env);
150
+ let cliVersion;
151
+ if (cliBin && cliCommand !== agent.command) {
152
+ const cliProbe = await probe(runner, cliBin, ['--version'], {
153
+ cwd: opts.home,
154
+ env: opts.env,
155
+ timeoutMs: REQUIRE_TIMEOUT_MS,
156
+ });
157
+ if (cliProbe.code === 0)
158
+ cliVersion = parseVersion(cliProbe.stdout) ?? parseVersion(cliProbe.stderr);
159
+ }
160
+ const installUrl = agent.cli?.installUrl ?? agent.installUrl;
161
+ const cli = {
162
+ command: cliCommand,
163
+ label: agent.cli?.label ?? agent.label,
164
+ installed: Boolean(cliBin),
165
+ ...(cliVersion ? { version: cliVersion } : {}),
166
+ ...(installUrl ? { installUrl } : {}),
167
+ };
168
+ base.cli = cli;
169
+ if (agent.package) {
170
+ base.extension = {
171
+ packageName: agent.package.name,
172
+ installed: Boolean(resolved.command),
173
+ installable: true,
174
+ ...(agent.packageUrl ? { installUrl: agent.packageUrl } : {}),
175
+ };
176
+ }
177
+ if (!resolved.command) {
178
+ return { ...base, source: resolved.source, reason: resolved.reason };
179
+ }
180
+ const command = resolved.command;
181
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
182
+ const probeArgs = agent.probeArgs ?? ['--version'];
183
+ const versionResult = await probe(runner, command, probeArgs, { cwd: opts.home, env: opts.env, timeoutMs });
184
+ if (versionResult.code !== 0) {
185
+ return {
186
+ ...base,
187
+ status: 'incompatible',
188
+ command,
189
+ source: resolved.source,
190
+ reason: `版本探测失败(${probeArgs.join(' ')}):${tail(versionResult.stderr || versionResult.stdout)}`,
191
+ };
192
+ }
193
+ const version = parseVersion(versionResult.stdout) ?? parseVersion(versionResult.stderr);
194
+ if (version && cli.command === agent.command)
195
+ cli.version = version;
196
+ const requirements = [];
197
+ let failure;
198
+ for (const requirement of agent.requires ?? []) {
199
+ const bin = resolveExecutable(requirement.command, opts.env);
200
+ if (!bin) {
201
+ const reason = `未找到 ${requirement.label}(${requirement.command})`;
202
+ requirements.push({ label: requirement.label, ok: false, reason });
203
+ failure ??= `${reason};${requirement.hint}`;
204
+ continue;
205
+ }
206
+ const versionProbe = await probe(runner, bin, ['--version'], { cwd: opts.home, env: opts.env, timeoutMs: REQUIRE_TIMEOUT_MS });
207
+ const requiredVersion = versionProbe.code === 0 ? parseVersion(versionProbe.stdout || versionProbe.stderr) : undefined;
208
+ if (requirement.minVersion && requiredVersion && compareVersion(requiredVersion, requirement.minVersion) < 0) {
209
+ const reason = `${requirement.label} ${requiredVersion} 低于要求 ${requirement.minVersion}`;
210
+ requirements.push({ label: requirement.label, ok: false, version: requiredVersion, reason });
211
+ failure ??= `${reason};${requirement.hint}`;
212
+ continue;
213
+ }
214
+ if (requirement.capabilityArgs) {
215
+ const capability = await probe(runner, bin, requirement.capabilityArgs, { cwd: opts.home, env: opts.env, timeoutMs: REQUIRE_TIMEOUT_MS });
216
+ if (capability.code !== 0) {
217
+ const reason = `${requirement.label} 缺少 ${requirement.capabilityArgs.join(' ')} 能力(可能是版本过旧)`;
218
+ requirements.push({ label: requirement.label, ok: false, version: requiredVersion, reason });
219
+ failure ??= `${reason};${requirement.hint}`;
220
+ continue;
221
+ }
222
+ }
223
+ requirements.push({ label: requirement.label, ok: true, ...(requiredVersion ? { version: requiredVersion } : {}) });
224
+ }
225
+ if (failure) {
226
+ return {
227
+ ...base,
228
+ status: 'incompatible',
229
+ command,
230
+ source: resolved.source,
231
+ ...(version ? { version } : {}),
232
+ reason: failure,
233
+ ...(requirements.length > 0 ? { requires: requirements } : {}),
234
+ };
235
+ }
236
+ if (agent.login?.check) {
237
+ const login = await probe(runner, resolveExecutable(agent.login.check.command, opts.env) ?? agent.login.check.command, agent.login.check.args, {
238
+ cwd: opts.home,
239
+ env: opts.env,
240
+ timeoutMs: REQUIRE_TIMEOUT_MS,
241
+ });
242
+ if (login.code !== 0) {
243
+ return {
244
+ ...base,
245
+ status: 'needs-auth',
246
+ command,
247
+ source: resolved.source,
248
+ ...(version ? { version } : {}),
249
+ reason: agent.login.hint,
250
+ ...(requirements.length > 0 ? { requires: requirements } : {}),
251
+ };
252
+ }
253
+ }
254
+ if (agent.verifyRequired) {
255
+ return {
256
+ ...base,
257
+ status: 'unverified',
258
+ command,
259
+ source: resolved.source,
260
+ ...(version ? { version } : {}),
261
+ reason: '版本探测通过,建议运行 ra runtime check 做完整 ACP 握手',
262
+ ...(requirements.length > 0 ? { requires: requirements } : {}),
263
+ };
264
+ }
265
+ return {
266
+ ...base,
267
+ status: 'ready',
268
+ command,
269
+ source: resolved.source,
270
+ ...(version ? { version } : {}),
271
+ ...(requirements.length > 0 ? { requires: requirements } : {}),
272
+ };
273
+ }
274
+ /** 并行探测全部 ACP Agent;单个失败不抛,只体现在 status/reason。 */
275
+ export async function detectAcpAgents(opts) {
276
+ const choices = await Promise.all(ACP_AGENTS.map(agent => detectOne(agent, opts)));
277
+ return { detectedAt: new Date().toISOString(), choices };
278
+ }
279
+ /** 只探测一个 Agent;未知 id 返回 null。 */
280
+ export async function detectAcpAgent(idOrRuntimeId, opts) {
281
+ const agent = acpAgentOf(idOrRuntimeId);
282
+ return agent ? detectOne(agent, opts) : null;
283
+ }
284
+ function detectCachePath(home) {
285
+ return join(acpRuntimesRoot(home), 'detect.json');
286
+ }
287
+ export function readDetectionSnapshot(home) {
288
+ try {
289
+ const parsed = JSON.parse(readFileSync(detectCachePath(home), 'utf8'));
290
+ return Array.isArray(parsed?.choices) ? parsed : null;
291
+ }
292
+ catch {
293
+ return null;
294
+ }
295
+ }
296
+ export function writeDetectionSnapshot(home, snapshot) {
297
+ const path = detectCachePath(home);
298
+ mkdirSync(acpRuntimesRoot(home), { recursive: true });
299
+ const tmp = `${path}.tmp`;
300
+ writeFileSync(tmp, `${JSON.stringify(snapshot, null, 2)}\n`, 'utf8');
301
+ renameSync(tmp, path);
302
+ }
303
+ /**
304
+ * L2 完整握手:initialize + session/new(临时 cwd),随后关闭。
305
+ * 只在 `ra runtime check` / Web「检查」时调用。
306
+ */
307
+ export async function checkAcpAgent(idOrRuntimeId, opts) {
308
+ const agent = acpAgentOf(idOrRuntimeId);
309
+ if (!agent)
310
+ return { ok: false, status: 'not-installed', detail: `未知 ACP Agent: ${idOrRuntimeId}` };
311
+ const resolved = resolveAgentCommand(agent, { home: opts.home, env: opts.env, config: opts.config });
312
+ if (!resolved.command) {
313
+ return { ok: false, status: 'not-installed', detail: resolved.reason ?? '未找到可执行文件' };
314
+ }
315
+ const { args, env } = acpRuntimeConfig(agent, opts.config);
316
+ const timeoutMs = opts.timeoutMs ?? 10_000;
317
+ const cwd = mkdtempSync(join(tmpdir(), 'ra-acp-check-'));
318
+ const connection = new AcpConnection({
319
+ command: resolved.command,
320
+ args,
321
+ cwd,
322
+ env: { ...process.env, ...opts.env, ...env },
323
+ onNotification: () => { },
324
+ onRequest: async (method) => {
325
+ if (method === 'session/request_permission')
326
+ return { outcome: { outcome: 'cancelled' } };
327
+ throw new AcpProtocolError(-32601, `ra runtime check 不处理该请求: ${method}`);
328
+ },
329
+ onExit: () => { },
330
+ });
331
+ let protocolVersion;
332
+ let agentInfo;
333
+ let loadSession;
334
+ try {
335
+ const init = await connection.request('initialize', {
336
+ protocolVersion: 1,
337
+ clientCapabilities: { fs: { readTextFile: false, writeTextFile: false }, terminal: false },
338
+ clientInfo: { name: 'router-agent', title: 'Router Agent', version: '0.1.0' },
339
+ }, timeoutMs);
340
+ protocolVersion = init?.protocolVersion;
341
+ agentInfo = init?.agentInfo;
342
+ loadSession = init?.agentCapabilities?.loadSession;
343
+ if (Number(protocolVersion) !== 1) {
344
+ return {
345
+ ok: false,
346
+ status: 'incompatible',
347
+ detail: `协议版本不兼容: ${protocolVersion ?? 'unknown'}`,
348
+ ...(protocolVersion !== undefined ? { protocolVersion } : {}),
349
+ ...(agentInfo ? { agentInfo } : {}),
350
+ ...(loadSession !== undefined ? { loadSession } : {}),
351
+ };
352
+ }
353
+ await connection.request('session/new', { cwd, mcpServers: [] }, timeoutMs);
354
+ return {
355
+ ok: true,
356
+ status: 'ready',
357
+ detail: `initialize + session/new 成功(协议 v1${loadSession ? ',支持 session/load' : ''})`,
358
+ ...(protocolVersion !== undefined ? { protocolVersion } : {}),
359
+ ...(agentInfo ? { agentInfo } : {}),
360
+ ...(loadSession !== undefined ? { loadSession } : {}),
361
+ };
362
+ }
363
+ catch (error) {
364
+ const detail = error instanceof Error ? error.message : String(error);
365
+ return {
366
+ ok: false,
367
+ status: 'incompatible',
368
+ detail,
369
+ ...(protocolVersion !== undefined ? { protocolVersion } : {}),
370
+ ...(agentInfo ? { agentInfo } : {}),
371
+ ...(loadSession !== undefined ? { loadSession } : {}),
372
+ };
373
+ }
374
+ finally {
375
+ await connection.close().catch(() => { });
376
+ rmSync(cwd, { recursive: true, force: true });
377
+ }
378
+ }
379
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../../../../packages/runtime/src/runtimes/acp/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC7G,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEvD,OAAO,EAAE,UAAU,EAAsB,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAyE/D,MAAM,kBAAkB,GAAG,KAAK,CAAA;AAChC,MAAM,kBAAkB,GAAG,KAAK,CAAA;AAEhC,sCAAsC;AACtC,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;AAC/B,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAe;IAC3D,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;AAC7C,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,GAAsB;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IAC9C,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC7C,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC9B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACR,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,GAAG;YAAE,SAAQ;QAClB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,CAAA;YAC7C,IAAI,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAA;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,KAAmB,EAAE,IAAY;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,CAAA;IACzE,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QACxC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;QACjE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACjC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;IAC7C,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,MAAyB,EAAE,SAAiB;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAA;IACjD,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC5G,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,KAAmB,EAAE,MAAyB;IAC7E,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACtC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;QACzE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;IACnB,MAAM,GAAG,GAAsB,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAA;IACvD,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;YAClF,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACjD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAA;AACpF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAmB,EAAE,IAIxD;IACC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IAC5D,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAClF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QACtD,OAAO,QAAQ;YACb,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;YACzC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,KAAK,CAAC,SAAS,qBAAqB,QAAQ,EAAE,EAAE,CAAA;IACrG,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5C,IAAI,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC3D,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IACzD,IAAI,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IACtD,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC,OAAO,iBAAiB,EAAE,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,CAAS,EAAE,CAAS;IAC1C,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACxC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;IAC7B,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,GAAG,GAAG,GAAG;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC9C,OAAO,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAA;AAC9D,CAAC;AAQD,KAAK,UAAU,KAAK,CAClB,MAAsC,EACtC,GAAW,EACX,IAAuB,EACvB,IAAgE;IAEhE,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE;YACtC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;YACpC,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IAClG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAAmB,EAAE,IAAmB;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAA;IACxC,MAAM,IAAI,GAAkB;QAC1B,EAAE,EAAE,KAAK,CAAC,SAAS;QACnB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,eAAe;QACvB,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QACnC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAA;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IAEpG,wDAAwD;IACxD,kCAAkC;IAClC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAA;IACtD,MAAM,MAAM,GAAG,UAAU,KAAK,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;QAC7D,CAAC,CAAC,QAAQ,CAAC,OAAO;QAClB,CAAC,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3C,IAAI,UAA8B,CAAA;IAClC,IAAI,MAAM,IAAI,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE;YAC1D,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,kBAAkB;SAC9B,CAAC,CAAA;QACF,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;YAAE,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACtG,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,UAAU,IAAI,KAAK,CAAC,UAAU,CAAA;IAC5D,MAAM,GAAG,GAAmB;QAC1B,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,IAAI,KAAK,CAAC,KAAK;QACtC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;QAC1B,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAA;IACD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IACd,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG;YACf,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;YAC/B,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YACpC,WAAW,EAAE,IAAI;YACjB,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAA;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAA;IACtE,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAA;IACtD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,CAAA;IAClD,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;IAC3G,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,GAAG,IAAI;YACP,MAAM,EAAE,cAAc;YACtB,OAAO;YACP,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,MAAM,EAAE,UAAU,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE;SAC/F,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IACxF,IAAI,OAAO,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAA;IAEnE,MAAM,YAAY,GAAyB,EAAE,CAAA;IAC7C,IAAI,OAA2B,CAAA;IAC/B,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,iBAAiB,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,OAAO,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,OAAO,GAAG,CAAA;YACjE,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAClE,OAAO,KAAK,GAAG,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAA;YAC3C,SAAQ;QACV,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAA;QAC9H,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACtH,IAAI,WAAW,CAAC,UAAU,IAAI,eAAe,IAAI,cAAc,CAAC,eAAe,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7G,MAAM,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,IAAI,eAAe,SAAS,WAAW,CAAC,UAAU,EAAE,CAAA;YACvF,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAA;YAC5F,OAAO,KAAK,GAAG,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAA;YAC3C,SAAQ;QACV,CAAC;QACD,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAA;YACzI,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,OAAO,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAA;gBAC5F,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAA;gBAC5F,OAAO,KAAK,GAAG,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAA;gBAC3C,SAAQ;YACV,CAAC;QACH,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACrH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,GAAG,IAAI;YACP,MAAM,EAAE,cAAc;YACtB,OAAO;YACP,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM,EAAE,OAAO;YACf,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAA;IACH,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;YAC7I,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,kBAAkB;SAC9B,CAAC,CAAA;QACF,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO;gBACL,GAAG,IAAI;gBACP,MAAM,EAAE,YAAY;gBACpB,OAAO;gBACP,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;gBACxB,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,OAAO;YACL,GAAG,IAAI;YACP,MAAM,EAAE,YAAY;YACpB,OAAO;YACP,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM,EAAE,yCAAyC;YACjD,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAA;IACH,CAAC;IAED,OAAO;QACL,GAAG,IAAI;QACP,MAAM,EAAE,OAAO;QACf,OAAO;QACP,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAA;AACH,CAAC;AAED,kDAAkD;AAClD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAmB;IACvD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IAClF,OAAO,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAA;AAC1D,CAAC;AAED,iCAAiC;AACjC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,aAAqB,EAAE,IAAmB;IAC7E,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IACvC,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAqB,CAAA;QAC1F,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,QAA0B;IAC7E,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IAClC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrD,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAA;IACzB,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACpE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AACvB,CAAC;AAWD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,aAAqB,EAAE,IAM1D;IACC,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,iBAAiB,aAAa,EAAE,EAAE,CAAA;IACnG,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IACpG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,UAAU,EAAE,CAAA;IACtF,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAA;IAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAA;IACxD,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC;QACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,IAAI;QACJ,GAAG;QACH,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE;QAC5C,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;QACxB,SAAS,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;YAClC,IAAI,MAAM,KAAK,4BAA4B;gBAAE,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAA;YACzF,MAAM,IAAI,gBAAgB,CAAC,CAAC,KAAK,EAAE,4BAA4B,MAAM,EAAE,CAAC,CAAA;QAC1E,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;KACjB,CAAC,CAAA;IACF,IAAI,eAAmC,CAAA;IACvC,IAAI,SAA0D,CAAA;IAC9D,IAAI,WAAgC,CAAA;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAIlC,YAAY,EAAE;YACf,eAAe,EAAE,CAAC;YAClB,kBAAkB,EAAE,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC1F,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE;SAC9E,EAAE,SAAS,CAAC,CAAA;QACb,eAAe,GAAG,IAAI,EAAE,eAAe,CAAA;QACvC,SAAS,GAAG,IAAI,EAAE,SAAS,CAAA;QAC3B,WAAW,GAAG,IAAI,EAAE,iBAAiB,EAAE,WAAW,CAAA;QAClD,IAAI,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,cAAc;gBACtB,MAAM,EAAE,YAAY,eAAe,IAAI,SAAS,EAAE;gBAClD,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,CAAA;QACH,CAAC;QACD,MAAM,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;QAC3E,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,oCAAoC,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,GAAG;YACpF,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,cAAc;YACtB,MAAM;YACN,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAA;IACH,CAAC;YAAS,CAAC;QACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACxC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC"}