@bolloon/bolloon-agent 0.4.31 → 0.4.32

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 (40) hide show
  1. package/dist/agents/chain/chain-config.js +504 -0
  2. package/dist/agents/chain/chain-index-query.js +135 -0
  3. package/dist/agents/chain/chain-indexer.js +1045 -0
  4. package/dist/agents/chain/chain-settlement.js +284 -0
  5. package/dist/agents/chain/chain-state-store.js +245 -0
  6. package/dist/agents/chain/chain-wallet.js +198 -0
  7. package/dist/agents/chain/escrow-client.js +433 -0
  8. package/dist/agents/chain/index.js +20 -0
  9. package/dist/agents/chain/onchain-trade.js +691 -0
  10. package/dist/agents/network-pulse.js +464 -2
  11. package/dist/agents/task/task-onchain-runner.js +284 -0
  12. package/dist/agents/x402/paid-info-store.js +75 -6
  13. package/dist/cli/commands/chain.js +926 -0
  14. package/dist/cli/commands/index.js +10 -2
  15. package/dist/cli/mcp/server.js +4 -1
  16. package/dist/cli/mcp/tools.js +348 -5
  17. package/dist/cli/protocol-envelope.js +12 -0
  18. package/dist/cli-entry.js +5 -0
  19. package/dist/electron-build/agents/chain/chain-config.js +556 -0
  20. package/dist/electron-build/agents/chain/chain-config.js.map +1 -0
  21. package/dist/electron-build/agents/chain/chain-index-query.js +145 -0
  22. package/dist/electron-build/agents/chain/chain-index-query.js.map +1 -0
  23. package/dist/electron-build/agents/chain/chain-indexer.js +1095 -0
  24. package/dist/electron-build/agents/chain/chain-indexer.js.map +1 -0
  25. package/dist/electron-build/agents/chain/chain-settlement.js +291 -0
  26. package/dist/electron-build/agents/chain/chain-settlement.js.map +1 -0
  27. package/dist/electron-build/agents/chain/escrow-client.js +443 -0
  28. package/dist/electron-build/agents/chain/escrow-client.js.map +1 -0
  29. package/dist/electron-build/agents/network-pulse.js +478 -3
  30. package/dist/electron-build/agents/network-pulse.js.map +1 -1
  31. package/dist/electron-build/agents/x402/paid-info-store.js +76 -6
  32. package/dist/electron-build/agents/x402/paid-info-store.js.map +1 -1
  33. package/dist/web/chain-explorer.js +617 -0
  34. package/dist/web/explorer.html +163 -0
  35. package/dist/web/index.html +5 -0
  36. package/dist/web/routes-chain-index.js +108 -0
  37. package/dist/web/routes-onchain-trade.js +99 -0
  38. package/dist/web/server.js +13 -0
  39. package/package.json +2 -1
  40. package/scripts/build-web.ts +20 -1
@@ -0,0 +1,556 @@
1
+ "use strict";
2
+ /**
3
+ * chain-config.ts — 链桥配置 (P3: Bolloon 链桥)
4
+ *
5
+ * 这个文件只做一件事: 把「链在哪 / 合约在哪 / 要几个确认 / 用哪个钱包」这四类
6
+ * **可配置事实**从确定的地方读出来, 并且**绝不硬编码任何密钥**。
7
+ *
8
+ * 读取优先级 (不可颠倒; 这是硬规则):
9
+ * ① 环境变量 — 进程显式给的最优先
10
+ * ② 本地安全配置文件 — `~/.bolloon/chain.json` (0600, 只放公开事实 + 可选 RPC/地址)
11
+ * ③ 仓库部署 manifest — `contracts/deployments/<network>.json` (按 chainId / networkName
12
+ * 等**锚**匹配; 详见下面「第 ③ 层」一节), 只填 ①② 没给的字段
13
+ * ④ 报错 — 取不到就抛错, 不许猜、不许 fallback 到某个内置地址
14
+ *
15
+ * 第 ③ 层不是"猜地址": manifest 是部署脚本写进仓库的**部署事实** (chainId + 地址 +
16
+ * 部署块 + bytecodeHash)。它让"换个 HOME / CI 上跑"也能拿到同一台机器刚部署的合约,
17
+ * 而不是把「本机没写 chain.json」错报成「链没配置」。选中它必须有**锚**, 有歧义就报错。
18
+ *
19
+ * 钱包私钥单独一条链 (同样 ①②③), 且**显式拒绝**任何看起来像别的 agent 的钱包目录
20
+ * (例如 `~/.hermes/wallets/...`) —— 那不属于本进程, 读了就是越权。
21
+ *
22
+ * 确认数口径 (写成配置, 不硬编码在逻辑里):
23
+ * confirmed = 1 — 至少被 1 个区块压住, 才允许说「链上结算了」
24
+ * finalized = 12 — 12 个确认, 才允许说「最终确定」
25
+ * 两档都可以用 env / chain.json 覆盖, 但**只能调大不能调小到 0**
26
+ * (0 确认 = 只要交易在内存池就算数, 那不是结算, 是幻觉)。
27
+ */
28
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ var desc = Object.getOwnPropertyDescriptor(m, k);
31
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
32
+ desc = { enumerable: true, get: function() { return m[k]; } };
33
+ }
34
+ Object.defineProperty(o, k2, desc);
35
+ }) : (function(o, m, k, k2) {
36
+ if (k2 === undefined) k2 = k;
37
+ o[k2] = m[k];
38
+ }));
39
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
40
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
41
+ }) : function(o, v) {
42
+ o["default"] = v;
43
+ });
44
+ var __importStar = (this && this.__importStar) || (function () {
45
+ var ownKeys = function(o) {
46
+ ownKeys = Object.getOwnPropertyNames || function (o) {
47
+ var ar = [];
48
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
49
+ return ar;
50
+ };
51
+ return ownKeys(o);
52
+ };
53
+ return function (mod) {
54
+ if (mod && mod.__esModule) return mod;
55
+ var result = {};
56
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
57
+ __setModuleDefault(result, mod);
58
+ return result;
59
+ };
60
+ })();
61
+ Object.defineProperty(exports, "__esModule", { value: true });
62
+ exports.DEPLOYMENTS_DIR_ENV = exports.ChainConfigError = exports.DEFAULT_CONFIRMATIONS = exports.DEFAULT_TOKEN_DECIMALS = exports.LOCAL_DEV_CHAIN_ID = void 0;
63
+ exports.bolloonHome = bolloonHome;
64
+ exports.chainConfigPath = chainConfigPath;
65
+ exports.walletFilePath = walletFilePath;
66
+ exports.assertNotForeignWalletPath = assertNotForeignWalletPath;
67
+ exports.isAddress = isAddress;
68
+ exports.deploymentsDir = deploymentsDir;
69
+ exports.parseDeploymentManifest = parseDeploymentManifest;
70
+ exports.listDeploymentManifests = listDeploymentManifests;
71
+ exports.selectDeploymentManifest = selectDeploymentManifest;
72
+ exports.tokenAddressGuidance = tokenAddressGuidance;
73
+ exports.loadChainConfig = loadChainConfig;
74
+ exports.meetsConfirmations = meetsConfirmations;
75
+ exports.readWalletPrivateKey = readWalletPrivateKey;
76
+ exports.walletAvailable = walletAvailable;
77
+ const fs = __importStar(require("fs"));
78
+ const os = __importStar(require("os"));
79
+ const path = __importStar(require("path"));
80
+ /** anvil / hardhat 默认本地链 */
81
+ exports.LOCAL_DEV_CHAIN_ID = 31337;
82
+ /** USDC 标准精度 (公开事实, 不是密钥) */
83
+ exports.DEFAULT_TOKEN_DECIMALS = 6;
84
+ /**
85
+ * 确认数默认值 —— **配置**, 不是逻辑里的魔法数字。
86
+ * 改这里 / 用 env / 用 chain.json 都能覆盖。
87
+ */
88
+ exports.DEFAULT_CONFIRMATIONS = Object.freeze({
89
+ /** 低于这个数一律不许说「已结算」 */
90
+ confirmed: 1,
91
+ /** 达到这个数才允许说「最终确定」 */
92
+ finalized: 12,
93
+ });
94
+ class ChainConfigError extends Error {
95
+ missing;
96
+ constructor(message, missing) {
97
+ super(message);
98
+ this.missing = missing;
99
+ this.name = 'ChainConfigError';
100
+ }
101
+ }
102
+ exports.ChainConfigError = ChainConfigError;
103
+ // ── 路径 ────────────────────────────────────────────────────────────────────
104
+ function bolloonHome(home) {
105
+ return path.join(home || process.env.HOME || os.homedir(), '.bolloon');
106
+ }
107
+ /** 本地安全配置 (公开事实 + 可选 RPC/地址; 私钥**不**放这里) */
108
+ function chainConfigPath(home) {
109
+ return path.join(bolloonHome(home), 'chain.json');
110
+ }
111
+ /** 本机钱包文件 (与 x402 路径同一份; 0600) */
112
+ function walletFilePath(home) {
113
+ return path.join(bolloonHome(home), 'wallet.json');
114
+ }
115
+ /**
116
+ * 别的 agent / 别的框架的钱包目录绝不许被本模块读取。
117
+ * 这里不是"建议", 是拒绝执行。
118
+ */
119
+ const FOREIGN_WALLET_MARKERS = [
120
+ `${path.sep}.hermes${path.sep}wallets`,
121
+ `${path.sep}.claude${path.sep}wallets`,
122
+ `${path.sep}.codex${path.sep}wallets`,
123
+ ];
124
+ function assertNotForeignWalletPath(p) {
125
+ const abs = path.resolve(p);
126
+ for (const marker of FOREIGN_WALLET_MARKERS) {
127
+ if (abs.includes(marker)) {
128
+ throw new ChainConfigError(`拒绝读取其它 agent 的钱包目录: ${abs} (只允许 ~/.bolloon/wallet.json 或本进程环境变量)`, ['wallet.privateKey']);
129
+ }
130
+ }
131
+ }
132
+ // ── 读取辅助 ────────────────────────────────────────────────────────────────
133
+ function readLocalChainJson(home) {
134
+ const p = chainConfigPath(home);
135
+ if (!fs.existsSync(p))
136
+ return null;
137
+ try {
138
+ return JSON.parse(fs.readFileSync(p, 'utf8'));
139
+ }
140
+ catch {
141
+ return null; // 坏文件 = 当作没有 (但下面每个字段都会落到报错, 不会静默给默认值)
142
+ }
143
+ }
144
+ /** 正整数解析; 非法 / 0 / 负数 → null */
145
+ function posInt(v) {
146
+ if (v === undefined || v === null || v === '')
147
+ return null;
148
+ const n = Number(v);
149
+ return Number.isInteger(n) && n > 0 ? n : null;
150
+ }
151
+ const ADDR_RE = /^0x[0-9a-fA-F]{40}$/;
152
+ function isAddress(v) {
153
+ return typeof v === 'string' && ADDR_RE.test(v);
154
+ }
155
+ // ── 第 ③ 层: 仓库里的部署 manifest ──────────────────────────────────────────
156
+ //
157
+ // 为什么有这一层 (2026-09-22 修「靠环境巧合才绿的门」):
158
+ // 链上地址是**部署事实**, 已经逐字写在仓库的 `contracts/deployments/*.json` 里
159
+ // (部署脚本自己写的: chainId / 合约地址 / 部署块 / bytecodeHash / 构造参数)。
160
+ // 只认 env 与 `~/.bolloon/chain.json` 的后果是: 换个 HOME (CI、别的机器、验收用的
161
+ // 临时 HOME) 就没有链配置 → `chain status` 报 CHAIN_NOT_CONFIGURED, 而**同一份仓库里
162
+ // 刚刚部署出的合约地址其实就在手边**。那不是"链没配置", 是"配置读的层太少"。
163
+ //
164
+ // 口径 (与 chain-indexer 解析 deployment block 同源, 不另立第二套):
165
+ // ① env (`BOLLOON_*`) → ② `~/.bolloon/chain.json` → ③ 仓库 manifest → ④ 报错
166
+ // ③ 必须**有锚**才允许被选中: 锚 = ① ② 里已知的 chainId / networkName / rpcUrl /
167
+ // escrowAddress 任一。没有锚就说不出"这是哪条链的部署" → 一律不选 (**不猜**)。
168
+ // 多份 manifest 同时匹配 → 歧义 → 不选 (报错里列出候选, 让人说清是哪份)。
169
+ // 文件名 `<networkName>.json` 与已知 networkName 一致时**优先** (仓库约定: 一个网络一份)。
170
+ // ③ 只能**填 ① ② 没给的字段** —— 优先级不可颠倒。
171
+ // 合约地址在 manifest 里可能记在两处: `.token.address` (自部署替身) 或
172
+ // `.externalToken.address` (外部真 token, 如 USDC) —— 两个都认, 后者是回退。
173
+ exports.DEPLOYMENTS_DIR_ENV = 'BOLLOON_DEPLOYMENTS_DIR';
174
+ /** 部署 manifest 目录: env → 从 cwd 往上找 `contracts/deployments` → cwd 下的默认位置 */
175
+ function deploymentsDir(env = process.env) {
176
+ const fromEnv = env[exports.DEPLOYMENTS_DIR_ENV];
177
+ if (fromEnv)
178
+ return path.resolve(String(fromEnv));
179
+ let dir = path.resolve(process.cwd());
180
+ for (let i = 0; i < 8; i++) {
181
+ const candidate = path.join(dir, 'contracts', 'deployments');
182
+ if (fs.existsSync(candidate))
183
+ return candidate;
184
+ const parent = path.dirname(dir);
185
+ if (parent === dir)
186
+ break;
187
+ dir = parent;
188
+ }
189
+ return path.resolve(process.cwd(), 'contracts', 'deployments');
190
+ }
191
+ /** 解析一份 manifest (形状不对 → null; 绝不猜)。**只读**, 不含任何密钥。 */
192
+ function parseDeploymentManifest(file, raw) {
193
+ const escrow = (raw?.contracts || []).find((c) => c?.name === 'AgentEscrow');
194
+ if (!escrow || !isAddress(escrow.address))
195
+ return null;
196
+ const tokenField = isAddress(raw?.token?.address)
197
+ ? '.token'
198
+ : (isAddress(raw?.externalToken?.address) ? '.externalToken' : null);
199
+ const tokenRaw = tokenField ? raw[tokenField.slice(1)] : null;
200
+ const blk = Number(escrow.blockNumber);
201
+ const rel = path.relative(process.cwd(), file);
202
+ return {
203
+ path: file,
204
+ label: rel && !rel.startsWith('..') ? rel : file,
205
+ chainId: posInt(raw?.chainId),
206
+ networkName: typeof raw?.networkName === 'string' && raw.networkName ? String(raw.networkName) : null,
207
+ rpcUrl: typeof raw?.rpcUrl === 'string' && raw.rpcUrl ? String(raw.rpcUrl) : null,
208
+ escrowAddress: String(escrow.address),
209
+ escrowBlockNumber: Number.isInteger(blk) && blk >= 0 ? blk : null,
210
+ tokenAddress: tokenField ? String(tokenRaw.address) : null,
211
+ tokenDecimals: posInt(tokenRaw?.decimals),
212
+ tokenField,
213
+ };
214
+ }
215
+ /** 列出目录里所有能认的 manifest (读不了 / 形状不对的一律跳过, 不静默当空) */
216
+ function listDeploymentManifests(opts = {}) {
217
+ const dir = opts.deploymentsDir || deploymentsDir();
218
+ let files = [];
219
+ try {
220
+ files = fs.readdirSync(dir).filter((f) => f.endsWith('.json'));
221
+ }
222
+ catch {
223
+ return [];
224
+ }
225
+ const out = [];
226
+ for (const f of files.sort()) {
227
+ const p = path.join(dir, f);
228
+ try {
229
+ const man = parseDeploymentManifest(p, JSON.parse(fs.readFileSync(p, 'utf8')));
230
+ if (man)
231
+ out.push(man);
232
+ }
233
+ catch { /* 坏文件跳过 */ }
234
+ }
235
+ return out;
236
+ }
237
+ /** 归一化比较用的 rpcUrl (去尾斜杠 + 小写 host 部分原样) */
238
+ function normRpc(u) {
239
+ if (!u)
240
+ return null;
241
+ return String(u).trim().replace(/\/+$/, '').toLowerCase();
242
+ }
243
+ /**
244
+ * 按**已知的锚**从 manifest 目录里选一份部署事实。
245
+ *
246
+ * 锚 = chainId / networkName / rpcUrl / escrowAddress (调用方给的都算"必须匹配")。
247
+ * 没有锚 → 不选 (说不出是哪条链); 多份匹配 → 不选 (歧义)。**任何情况下都不猜。**
248
+ */
249
+ function selectDeploymentManifest(opts = {}) {
250
+ const dir = opts.deploymentsDir || deploymentsDir();
251
+ const candidates = listDeploymentManifests({ deploymentsDir: dir });
252
+ const wantChain = opts.chainId ?? null;
253
+ const wantName = opts.networkName && opts.networkName !== 'unknown' ? String(opts.networkName) : null;
254
+ const wantRpc = normRpc(opts.rpcUrl);
255
+ const wantEscrow = isAddress(opts.escrowAddress) ? String(opts.escrowAddress).toLowerCase() : null;
256
+ const anchors = [
257
+ wantChain !== null ? `chainId=${wantChain}` : null,
258
+ wantName ? `networkName=${wantName}` : null,
259
+ wantRpc ? `rpcUrl=${wantRpc}` : null,
260
+ wantEscrow ? `escrowAddress=${wantEscrow}` : null,
261
+ ].filter((x) => !!x);
262
+ const hits = (m) => (wantChain === null || m.chainId === wantChain) &&
263
+ (wantName === null || m.networkName === wantName) &&
264
+ (wantRpc === null || normRpc(m.rpcUrl) === wantRpc) &&
265
+ (wantEscrow === null || m.escrowAddress.toLowerCase() === wantEscrow);
266
+ if (!anchors.length) {
267
+ return {
268
+ manifest: null, candidates, deploymentsDir: dir,
269
+ reason: `没有锚 (chainId / networkName / rpcUrl / escrowAddress 一个都没有) → 说不出是哪条链的部署, 不选${candidates.length ? ` (目录里有 ${candidates.length} 份候选: ${candidates.map((c) => path.basename(c.path)).join(', ')})` : ` (目录 ${dir} 里没有可认的 manifest)`}`,
270
+ };
271
+ }
272
+ // ① 文件名约定优先: <networkName>.json (一个网络一份 manifest)
273
+ if (wantName) {
274
+ const byFile = candidates.filter((m) => path.basename(m.path) === `${wantName}.json`);
275
+ if (byFile.length === 1) {
276
+ const m = byFile[0];
277
+ if (wantChain !== null && m.chainId !== null && m.chainId !== wantChain) {
278
+ return { manifest: null, candidates, deploymentsDir: dir, reason: `文件名 ${path.basename(m.path)} 是 networkName=${wantName} 的部署, 但它记的 chainId=${m.chainId} ≠ 你要的 ${wantChain} → 拒绝跨链取地址` };
279
+ }
280
+ return { manifest: m, candidates, deploymentsDir: dir, reason: `networkName=${wantName} → 文件名 ${path.basename(m.path)} (锚: ${anchors.join(', ')})` };
281
+ }
282
+ }
283
+ // ② 所有给出的锚都必须匹配同一份
284
+ const matched = candidates.filter(hits);
285
+ if (matched.length === 1) {
286
+ return { manifest: matched[0], candidates, deploymentsDir: dir, reason: `锚 ${anchors.join(', ')} 唯一匹配 ${path.basename(matched[0].path)}` };
287
+ }
288
+ if (matched.length === 0) {
289
+ return {
290
+ manifest: null, candidates, deploymentsDir: dir,
291
+ reason: `锚 ${anchors.join(', ')} 在 ${dir} 里一份都匹配不上${candidates.length ? ` (候选: ${candidates.map((c) => `${path.basename(c.path)}(chainId=${c.chainId}, network=${c.networkName}, escrow=${c.escrowAddress})`).join(', ')})` : ' (目录里没有可认的 manifest)'} → 拒绝猜`,
292
+ };
293
+ }
294
+ return {
295
+ manifest: null, candidates, deploymentsDir: dir,
296
+ reason: `锚 ${anchors.join(', ')} 同时匹配 ${matched.length} 份 manifest (${matched.map((c) => path.basename(c.path)).join(', ')}) → 歧义, 拒绝猜; 请用 BOLLOON_NETWORK_NAME 或 BOLLOON_ESCROW_ADDRESS 说清是哪一份, 或用 BOLLOON_DEPLOYMENTS_DIR 指向只放一份 manifest 的目录`,
297
+ };
298
+ }
299
+ /**
300
+ * 「拿不到 token 地址」的可操作报错文案 (真写 createEscrow 必须有它)。
301
+ * 只说**怎么修**, 不含任何密钥; 三层来源逐个点名。
302
+ */
303
+ function tokenAddressGuidance(opts = {}) {
304
+ const env = opts.env || process.env;
305
+ const dir = deploymentsDir(env);
306
+ return (`真写 (createEscrow) 需要**付款资产** (token) 地址, 但三层都拿不到:` +
307
+ ` ① env BOLLOON_TOKEN_ADDRESS(未设)` +
308
+ ` ② ${chainConfigPath(opts.home)}(无 tokenAddress)` +
309
+ ` ③ 仓库部署 manifest ${dir} 里 networkName=${opts.networkName || 'unknown'} 那份的 .token.address / .externalToken.address` +
310
+ `。怎么修: (a) export BOLLOON_TOKEN_ADDRESS=0x…(真 USDC 或本地 MockERC20);` +
311
+ ` (b) 或在 ${chainConfigPath(opts.home)} 写 {"tokenAddress":"0x…","tokenDecimals":6};` +
312
+ ` (c) 或让部署 manifest 记录 token 地址 (并给出能唯一定位它的锚: BOLLOON_CHAIN_ID / BOLLOON_NETWORK_NAME);` +
313
+ ` (d) 本次只调用也可以显式传 --asset 0x…。本模块**不猜** token 地址 —— 猜错资产地址比报错危险得多。`);
314
+ }
315
+ /**
316
+ * 读链配置。取不到必需项 → 抛 `ChainConfigError` 并列出缺哪些。
317
+ * **不猜地址, 不给默认合约地址** —— 猜错的地址比报错危险得多。
318
+ */
319
+ function loadChainConfig(opts = {}) {
320
+ const env = opts.env || process.env;
321
+ const home = opts.home;
322
+ const file = readLocalChainJson(home);
323
+ const sources = {};
324
+ const missing = [];
325
+ // ① RPC
326
+ let rpcUrl = null;
327
+ if (env.BOLLOON_CHAIN_RPC_URL) {
328
+ rpcUrl = String(env.BOLLOON_CHAIN_RPC_URL);
329
+ sources.rpcUrl = 'env BOLLOON_CHAIN_RPC_URL';
330
+ }
331
+ else if (env.BOLLOON_RPC_URL) {
332
+ rpcUrl = String(env.BOLLOON_RPC_URL);
333
+ sources.rpcUrl = 'env BOLLOON_RPC_URL';
334
+ }
335
+ else if (env.RPC_URL) {
336
+ rpcUrl = String(env.RPC_URL);
337
+ sources.rpcUrl = 'env RPC_URL';
338
+ }
339
+ else if (file?.rpcUrl) {
340
+ rpcUrl = String(file.rpcUrl);
341
+ sources.rpcUrl = `${chainConfigPath(home)} .rpcUrl`;
342
+ }
343
+ else
344
+ missing.push('rpcUrl');
345
+ // ② chainId
346
+ let chainId = null;
347
+ if (posInt(env.BOLLOON_CHAIN_ID) !== null) {
348
+ chainId = posInt(env.BOLLOON_CHAIN_ID);
349
+ sources.chainId = 'env BOLLOON_CHAIN_ID';
350
+ }
351
+ else if (posInt(file?.chainId) !== null) {
352
+ chainId = posInt(file?.chainId);
353
+ sources.chainId = `${chainConfigPath(home)} .chainId`;
354
+ }
355
+ else
356
+ missing.push('chainId');
357
+ // ③ escrow 地址
358
+ let escrowAddress = null;
359
+ if (env.BOLLOON_ESCROW_ADDRESS) {
360
+ if (!isAddress(env.BOLLOON_ESCROW_ADDRESS))
361
+ throw new ChainConfigError(`BOLLOON_ESCROW_ADDRESS 不是合法地址: ${env.BOLLOON_ESCROW_ADDRESS}`, ['escrowAddress']);
362
+ escrowAddress = env.BOLLOON_ESCROW_ADDRESS;
363
+ sources.escrowAddress = 'env BOLLOON_ESCROW_ADDRESS';
364
+ }
365
+ else if (file?.escrowAddress) {
366
+ if (!isAddress(file.escrowAddress))
367
+ throw new ChainConfigError(`${chainConfigPath(home)} .escrowAddress 不是合法地址`, ['escrowAddress']);
368
+ escrowAddress = file.escrowAddress;
369
+ sources.escrowAddress = `${chainConfigPath(home)} .escrowAddress`;
370
+ }
371
+ else
372
+ missing.push('escrowAddress');
373
+ // ④ token 地址 (可空 — 只做 escrow 操作时不必给)
374
+ let tokenAddress = null;
375
+ if (isAddress(env.BOLLOON_TOKEN_ADDRESS)) {
376
+ tokenAddress = env.BOLLOON_TOKEN_ADDRESS;
377
+ sources.tokenAddress = 'env BOLLOON_TOKEN_ADDRESS';
378
+ }
379
+ else if (isAddress(file?.tokenAddress)) {
380
+ tokenAddress = file.tokenAddress;
381
+ sources.tokenAddress = `${chainConfigPath(home)} .tokenAddress`;
382
+ }
383
+ else
384
+ sources.tokenAddress = '未配置 (只做 escrow 读/写时不需要)';
385
+ // ⑤ token decimals
386
+ let tokenDecimals = exports.DEFAULT_TOKEN_DECIMALS;
387
+ sources.tokenDecimals = '默认 (USDC=6)';
388
+ const envDec = posInt(env.BOLLOON_TOKEN_DECIMALS);
389
+ const fileDec = posInt(file?.tokenDecimals);
390
+ if (envDec !== null) {
391
+ tokenDecimals = envDec;
392
+ sources.tokenDecimals = 'env BOLLOON_TOKEN_DECIMALS';
393
+ }
394
+ else if (fileDec !== null) {
395
+ tokenDecimals = fileDec;
396
+ sources.tokenDecimals = `${chainConfigPath(home)} .tokenDecimals`;
397
+ }
398
+ // ⑥ 确认数 (配置值; 非法/0 一律落到默认值而不是"0 确认")
399
+ const envConfirmed = posInt(env.BOLLOON_CONFIRMATIONS_CONFIRMED);
400
+ const envFinalized = posInt(env.BOLLOON_CONFIRMATIONS_FINALIZED);
401
+ const fileConfirmed = posInt(file?.confirmations?.confirmed);
402
+ const fileFinalized = posInt(file?.confirmations?.finalized);
403
+ let confirmed = exports.DEFAULT_CONFIRMATIONS.confirmed;
404
+ let finalized = exports.DEFAULT_CONFIRMATIONS.finalized;
405
+ if (fileConfirmed !== null)
406
+ confirmed = fileConfirmed;
407
+ if (fileFinalized !== null)
408
+ finalized = fileFinalized;
409
+ if (envConfirmed !== null)
410
+ confirmed = envConfirmed;
411
+ if (envFinalized !== null)
412
+ finalized = envFinalized;
413
+ sources.confirmations = envConfirmed !== null || envFinalized !== null
414
+ ? 'env BOLLOON_CONFIRMATIONS_*'
415
+ : (fileConfirmed !== null || fileFinalized !== null ? `${chainConfigPath(home)} .confirmations` : '默认 (confirmed=1, finalized=12)');
416
+ // finalized 不能比 confirmed 还低 —— 静默修正是不允许的, 这是配置自洽性检查
417
+ if (finalized < confirmed) {
418
+ throw new ChainConfigError(`确认数配置不自洽: finalized(${finalized}) < confirmed(${confirmed})`, ['confirmations']);
419
+ }
420
+ // ⑦ networkName
421
+ let networkName = 'unknown';
422
+ let networkNameUpper = null;
423
+ if (env.BOLLOON_NETWORK_NAME) {
424
+ networkNameUpper = String(env.BOLLOON_NETWORK_NAME);
425
+ sources.networkName = 'env BOLLOON_NETWORK_NAME';
426
+ }
427
+ else if (file?.networkName) {
428
+ networkNameUpper = String(file.networkName);
429
+ sources.networkName = `${chainConfigPath(home)} .networkName`;
430
+ }
431
+ else
432
+ sources.networkName = '默认 unknown';
433
+ if (networkNameUpper)
434
+ networkName = networkNameUpper;
435
+ // ⑧ ★ 第 ③ 层: 仓库里的部署 manifest —— 只在 ①② 拿不全时读,
436
+ // 且**只填 ①② 没给的字段** (优先级不可颠倒)。选不中就说清为什么 (不猜)。
437
+ let manSel = null;
438
+ const needManifest = !rpcUrl || chainId === null || !escrowAddress || !tokenAddress || !networkNameUpper;
439
+ if (needManifest) {
440
+ manSel = selectDeploymentManifest({
441
+ chainId, networkName: networkNameUpper, rpcUrl, escrowAddress,
442
+ deploymentsDir: env[exports.DEPLOYMENTS_DIR_ENV],
443
+ });
444
+ const man = manSel.manifest;
445
+ if (man) {
446
+ if (!escrowAddress) {
447
+ escrowAddress = man.escrowAddress;
448
+ sources.escrowAddress = `manifest ${man.label} .contracts[AgentEscrow].address`;
449
+ }
450
+ if (chainId === null && man.chainId !== null) {
451
+ chainId = man.chainId;
452
+ sources.chainId = `manifest ${man.label} .chainId`;
453
+ }
454
+ if (!rpcUrl && man.rpcUrl) {
455
+ rpcUrl = man.rpcUrl;
456
+ sources.rpcUrl = `manifest ${man.label} .rpcUrl (部署时记下的 RPC)`;
457
+ }
458
+ if (!tokenAddress && man.tokenAddress) {
459
+ tokenAddress = man.tokenAddress;
460
+ sources.tokenAddress = `manifest ${man.label} ${man.tokenField}.address`;
461
+ }
462
+ // ★ decimals 只在"token 也是从这份 manifest 来的"时才跟着它走 ——
463
+ // 否则会拿 A token 的精度去解释 B token 的金额 (env 给了 token 但没给精度时尤其危险)。
464
+ const tokenFromManifest = !!man.tokenAddress && tokenAddress === man.tokenAddress;
465
+ if (tokenFromManifest && man.tokenDecimals !== null && sources.tokenDecimals === '默认 (USDC=6)') {
466
+ tokenDecimals = man.tokenDecimals;
467
+ sources.tokenDecimals = `manifest ${man.label} ${man.tokenField}.decimals`;
468
+ }
469
+ if (!networkNameUpper && man.networkName) {
470
+ networkName = man.networkName;
471
+ sources.networkName = `manifest ${man.label} .networkName`;
472
+ }
473
+ }
474
+ }
475
+ sources.deploymentManifest = manSel
476
+ ? (manSel.manifest ? `${manSel.manifest.label} — ${manSel.reason}` : `未选中 — ${manSel.reason}`)
477
+ : '未读 (①② 已给全必需字段)';
478
+ sources.deploymentsDir = manSel?.deploymentsDir ?? deploymentsDir(env);
479
+ // ★ 重算「还缺什么」—— 第 ③ 层可能刚把 ①② 没给的字段补齐了。
480
+ // missing 是各 pass 里 push 的"上层缺口", 到这里必须按**最终值**过滤一遍,
481
+ // 否则会把"manifest 已经补上了"错报成"缺配置"。
482
+ const missingFinal = missing.filter((k) => (k === 'rpcUrl' && !rpcUrl) || (k === 'chainId' && chainId === null) || (k === 'escrowAddress' && !escrowAddress));
483
+ if (missingFinal.length) {
484
+ throw new ChainConfigError(`链配置缺失: ${missingFinal.join(', ')}。读取优先级 = 环境变量 → ${chainConfigPath(home)} → 仓库部署 manifest → 报错; ` +
485
+ `本模块不猜合约地址。manifest 层: ${manSel ? manSel.reason : `未读 (缺的字段: ${missingFinal.join(', ')})`}。` +
486
+ `怎么修: ① 设 BOLLOON_CHAIN_RPC_URL / BOLLOON_CHAIN_ID / BOLLOON_ESCROW_ADDRESS; ` +
487
+ `② 或写 ${chainConfigPath(home)} (rpcUrl / chainId / escrowAddress / tokenAddress / tokenDecimals); ` +
488
+ `③ 或给出能**唯一定位** manifest 的锚 (BOLLOON_CHAIN_ID 或 BOLLOON_NETWORK_NAME, 也可用 ${exports.DEPLOYMENTS_DIR_ENV} 指向只放一份 manifest 的目录)。`, missingFinal);
489
+ }
490
+ // ★ 真写需要付款资产: 拿不到就报**可操作**的错, 而不是让调用方看到含糊的"缺少参数"
491
+ if (opts.requireToken && !tokenAddress) {
492
+ throw new ChainConfigError(tokenAddressGuidance({ home, networkName, env }), ['tokenAddress']);
493
+ }
494
+ const cfg = {
495
+ chainId: chainId, networkName, rpcUrl: rpcUrl,
496
+ escrowAddress: escrowAddress, tokenAddress, tokenDecimals,
497
+ confirmations: Object.freeze({ confirmed, finalized }),
498
+ sources,
499
+ };
500
+ return { ...cfg, ...(opts.overrides || {}), sources };
501
+ }
502
+ /**
503
+ * 确认数门槛判定 (纯函数, 单一实现 —— 所有"够不够确认"的判断都走这里)。
504
+ * `finalizedAt >= confirmedAt` 由配置保证; 这里只做数值比较, 不修状态。
505
+ */
506
+ function meetsConfirmations(confirmations, gate, cfg = exports.DEFAULT_CONFIRMATIONS) {
507
+ const need = gate === 'finalized' ? cfg.finalized : cfg.confirmed;
508
+ return Number.isFinite(confirmations) && confirmations >= need;
509
+ }
510
+ /**
511
+ * 读本机钱包私钥 (唯一的密钥读取入口)。
512
+ * ① 环境变量 ② `~/.bolloon/wallet.json` ③ 报错。
513
+ * 返回值里的 `privateKey` **只许在调用栈的局部变量里存在** —— 调用方不得打印/落盘/进审计。
514
+ */
515
+ function readWalletPrivateKey(opts = {}) {
516
+ const env = opts.env || process.env;
517
+ const fromEnv = env.BOLLOON_WALLET_PRIVATE_KEY || env.BOLLOON_LOCAL_DEV_PRIVATE_KEY;
518
+ const envName = env.BOLLOON_WALLET_PRIVATE_KEY ? 'BOLLOON_WALLET_PRIVATE_KEY' : 'BOLLOON_LOCAL_DEV_PRIVATE_KEY';
519
+ if (fromEnv) {
520
+ if (!/^0x[0-9a-fA-F]{64}$/.test(String(fromEnv))) {
521
+ throw new ChainConfigError(`${envName} 格式不对 (要 0x + 64 hex)`, ['wallet.privateKey']);
522
+ }
523
+ return { privateKey: String(fromEnv), source: `env ${envName}` };
524
+ }
525
+ const wf = walletFilePath(opts.home);
526
+ assertNotForeignWalletPath(wf);
527
+ if (!fs.existsSync(wf)) {
528
+ throw new ChainConfigError(`本机没有可用钱包: ${wf} 不存在, 且未设 BOLLOON_WALLET_PRIVATE_KEY。` +
529
+ `读取优先级 = 环境变量 → ~/.bolloon/wallet.json → 报错 (绝不硬编码密钥, 也不读别的 agent 的钱包目录)。`, ['wallet.privateKey']);
530
+ }
531
+ let raw;
532
+ try {
533
+ raw = JSON.parse(fs.readFileSync(wf, 'utf8'));
534
+ }
535
+ catch {
536
+ throw new ChainConfigError(`${wf} 读不出来 / 不是合法 JSON`, ['wallet.privateKey']);
537
+ }
538
+ const pk = String(raw?.privateKey || '');
539
+ if (!/^0x[0-9a-fA-F]{64}$/.test(pk)) {
540
+ throw new ChainConfigError(`${wf} 里没有可用的 privateKey 字段 (要 0x + 64 hex)`, ['wallet.privateKey']);
541
+ }
542
+ return { privateKey: pk, source: '~/.bolloon/wallet.json' };
543
+ }
544
+ /**
545
+ * 只探测钱包是否可用 (绝不返回私钥)。给"要不要签名"的判据用。
546
+ */
547
+ function walletAvailable(opts = {}) {
548
+ try {
549
+ const r = readWalletPrivateKey(opts);
550
+ return { available: r.privateKey.length === 66, source: r.source };
551
+ }
552
+ catch (e) {
553
+ return { available: false, source: 'none', reason: String(e?.message || e).slice(0, 200) };
554
+ }
555
+ }
556
+ //# sourceMappingURL=chain-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-config.js","sourceRoot":"","sources":["../../../../src/agents/chain/chain-config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,MAAY,EAAE,+BAAW;AACzB,MAAY,EAAE,+BAAW;AACzB,MAAY,IAAI,iCAAa;AAE7B,4BAA4B;AACf,QAAA,kBAAkB,GAAG,KAAK,CAAC;AAExC,6BAA6B;AAChB,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAExC;;;GAGG;AACU,QAAA,qBAAqB,GAAuB,MAAM,CAAC,MAAM,CAAC;IACrE,sBAAsB;IACtB,SAAS,EAAE,CAAC;IACZ,sBAAsB;IACtB,SAAS,EAAE,EAAE;CACd,CAAC,CAAC;AAmBH,sBAA8B,SAAQ,KAAK;IACI,OAAO;IAApD,YAAY,OAAe,EAAkB,OAAiB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;uBAD4B,OAAO;QAElD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;;AAED,6EAA6E;AAE7E,qBAA4B,IAAa;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACzE,CAAC;AAED,4CAA4C;AAC5C,yBAAgC,IAAa;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC;AAED,kCAAkC;AAClC,wBAA+B,IAAa;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,sBAAsB,GAAG;IAC7B,GAAG,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,SAAS;IACtC,GAAG,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,SAAS;IACtC,GAAG,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,GAAG,SAAS;CACtC,CAAC;AAEF,oCAA2C,CAAS;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,sBAAsB,EAAE,CAAC;QAC5C,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,gBAAgB,CACxB,uBAAuB,GAAG,wCAAwC,EAClE,CAAC,mBAAmB,CAAC,CACtB,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,2EAA2E;AAE3E,SAAS,kBAAkB,CAAC,IAAa;IACvC,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,uCAAuC;IACtD,CAAC;AACH,CAAC;AAED,gCAAgC;AAChC,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,MAAM,OAAO,GAAG,qBAAqB,CAAC;AACtC,mBAA0B,CAAU;IAClC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,uEAAuE;AACvE,EAAE;AACF,qCAAqC;AACrC,8DAA8D;AAC9D,4DAA4D;AAC5D,iEAAiE;AACjE,uEAAuE;AACvE,8CAA8C;AAC9C,EAAE;AACF,uDAAuD;AACvD,2EAA2E;AAC3E,oEAAoE;AACpE,0DAA0D;AAC1D,mDAAmD;AACnD,uEAAuE;AACvE,oCAAoC;AACpC,uDAAuD;AACvD,iEAAiE;AAEpD,QAAA,mBAAmB,GAAG,yBAAyB,CAAC;AAE7D,2EAA2E;AAC3E,wBAA+B,GAAG,GAAsB,OAAO,CAAC,GAAG;IACjE,MAAM,OAAO,GAAG,GAAG,CAAC,QAAA,mBAAmB,CAAC,CAAC;IACzC,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AACjE,CAAC;AAkBD,uDAAuD;AACvD,iCAAwC,IAAY,EAAE,GAAQ;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,aAAa,CAAC,CAAC;IAClF,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,UAAU,GAAqC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;QACjF,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/C,OAAO;QACL,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;QAChD,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC;QAC7B,WAAW,EAAE,OAAO,GAAG,EAAE,WAAW,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;QACrG,MAAM,EAAE,OAAO,GAAG,EAAE,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QACjF,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QACrC,iBAAiB,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;QACjE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1D,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACzC,UAAU;KACX,CAAC;AACJ,CAAC;AAED,mDAAmD;AACnD,iCAAwC,IAAI,GAAgC,EAAE;IAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,IAAI,cAAc,EAAE,CAAC;IACpD,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC;QAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAC5F,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/E,IAAI,GAAG;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAWD,2CAA2C;AAC3C,SAAS,OAAO,CAAC,CAA4B;IAC3C,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,kCAAyC,IAAI,GAMzC,EAAE;IACJ,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,IAAI,cAAc,EAAE,CAAC;IACpD,MAAM,UAAU,GAAG,uBAAuB,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtG,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnG,MAAM,OAAO,GAAG;QACd,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;QAClD,QAAQ,CAAC,CAAC,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;QAC3C,OAAO,CAAC,CAAC,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;QACpC,UAAU,CAAC,CAAC,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI;KAClD,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElC,MAAM,IAAI,GAAG,CAAC,CAAqB,EAAW,EAAE,CAC9C,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC;QAC/C,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC;QACjD,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC;QACnD,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IAExE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO;YACL,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG;YAC/C,MAAM,EAAE,8EAA8E,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,MAAM,SAAS,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,mBAAmB,EAAE;SAC5O,CAAC;IACJ,CAAC;IAED,kDAAkD;IAClD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,OAAO,CAAC,CAAC;QACtF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACxE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,QAAQ,sBAAsB,CAAC,CAAC,OAAO,UAAU,SAAS,YAAY,EAAE,CAAC;YAC3L,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,QAAQ,UAAU,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACvJ,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7I,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG;YAC/C,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,WAAW,YAAY,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,QAAQ;SAC7P,CAAC;IACJ,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG;QAC/C,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,gBAAgB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,sHAAsH;KACjP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,8BAAqC,IAAI,GAA4E,EAAE;IACrH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,CACL,mDAAmD;QACnD,kCAAkC;QAClC,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB;QAClD,oBAAoB,GAAG,kBAAkB,IAAI,CAAC,WAAW,IAAI,SAAS,8CAA8C;QACpH,mEAAmE;QACnE,WAAW,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,8CAA8C;QACnF,wFAAwF;QACxF,mEAAmE,CACpE,CAAC;AACJ,CAAC;AAiBD;;;GAGG;AACH,yBAAgC,IAAI,GAA2B,EAAE;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,QAAQ;IACR,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAAC,OAAO,CAAC,MAAM,GAAG,2BAA2B,CAAC;IAAC,CAAC;SACvH,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAAC,OAAO,CAAC,MAAM,GAAG,qBAAqB,CAAC;IAAC,CAAC;SAC1G,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAAC,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC;IAAC,CAAC;SAClF,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;IAAC,CAAC;;QACxG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE5B,YAAY;IACZ,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAAC,OAAO,CAAC,OAAO,GAAG,sBAAsB,CAAC;IAAC,CAAC;SAC3H,IAAI,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAAC,OAAO,CAAC,OAAO,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;IAAC,CAAC;;QAC/H,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE7B,cAAc;IACd,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,GAAG,CAAC,sBAAsB,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,kCAAkC,GAAG,CAAC,sBAAsB,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;QAC1J,aAAa,GAAG,GAAG,CAAC,sBAAsB,CAAC;QAAC,OAAO,CAAC,aAAa,GAAG,4BAA4B,CAAC;IACnG,CAAC;SAAM,IAAI,IAAI,EAAE,aAAa,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;QACpI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAAC,OAAO,CAAC,aAAa,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACxG,CAAC;;QAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAErC,qCAAqC;IACrC,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAAC,YAAY,GAAG,GAAG,CAAC,qBAAqB,CAAC;QAAC,OAAO,CAAC,YAAY,GAAG,2BAA2B,CAAC;IAAC,CAAC;SACtI,IAAI,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;QAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAAC,OAAO,CAAC,YAAY,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAAC,CAAC;;QACzI,OAAO,CAAC,YAAY,GAAG,yBAAyB,CAAC;IAEtD,mBAAmB;IACnB,IAAI,aAAa,GAAG,QAAA,sBAAsB,CAAC;IAC3C,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAAC,aAAa,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,aAAa,GAAG,4BAA4B,CAAC;IAAC,CAAC;SACjG,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAAC,aAAa,GAAG,OAAO,CAAC;QAAC,OAAO,CAAC,aAAa,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAAC,CAAC;IAE1H,qCAAqC;IACrC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAC7D,IAAI,SAAS,GAAG,QAAA,qBAAqB,CAAC,SAAS,CAAC;IAChD,IAAI,SAAS,GAAG,QAAA,qBAAqB,CAAC,SAAS,CAAC;IAChD,IAAI,aAAa,KAAK,IAAI;QAAE,SAAS,GAAG,aAAa,CAAC;IACtD,IAAI,aAAa,KAAK,IAAI;QAAE,SAAS,GAAG,aAAa,CAAC;IACtD,IAAI,YAAY,KAAK,IAAI;QAAE,SAAS,GAAG,YAAY,CAAC;IACpD,IAAI,YAAY,KAAK,IAAI;QAAE,SAAS,GAAG,YAAY,CAAC;IACpD,OAAO,CAAC,aAAa,GAAG,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI;QACpE,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,CAAC,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC;IACtI,qDAAqD;IACrD,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,gBAAgB,CAAC,uBAAuB,SAAS,iBAAiB,SAAS,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAC/G,CAAC;IAED,gBAAgB;IAChB,IAAI,WAAW,GAAG,SAAS,CAAC;IAC5B,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,IAAI,GAAG,CAAC,oBAAoB,EAAE,CAAC;QAAC,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAAC,OAAO,CAAC,WAAW,GAAG,0BAA0B,CAAC;IAAC,CAAC;SACnI,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC;QAAC,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAAC,OAAO,CAAC,WAAW,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC;IAAC,CAAC;;QACtI,OAAO,CAAC,WAAW,GAAG,YAAY,CAAC;IACxC,IAAI,gBAAgB;QAAE,WAAW,GAAG,gBAAgB,CAAC;IAErD,6CAA6C;IAC7C,gDAAgD;IAChD,IAAI,MAAM,GAAuC,IAAI,CAAC;IACtD,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,IAAI,CAAC,gBAAgB,CAAC;IACzG,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,GAAG,wBAAwB,CAAC;YAChC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa;YAC7D,cAAc,EAAE,GAAG,CAAC,QAAA,mBAAmB,CAAC;SACzC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC5B,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;gBAClC,OAAO,CAAC,aAAa,GAAG,YAAY,GAAG,CAAC,KAAK,kCAAkC,CAAC;YAClF,CAAC;YACD,IAAI,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC7C,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;gBACtB,OAAO,CAAC,OAAO,GAAG,YAAY,GAAG,CAAC,KAAK,WAAW,CAAC;YACrD,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;gBACpB,OAAO,CAAC,MAAM,GAAG,YAAY,GAAG,CAAC,KAAK,uBAAuB,CAAC;YAChE,CAAC;YACD,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACtC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;gBAChC,OAAO,CAAC,YAAY,GAAG,YAAY,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,UAAU,CAAC;YAC3E,CAAC;YACD,kDAAkD;YAClD,+DAA+D;YAC/D,MAAM,iBAAiB,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,IAAI,YAAY,KAAK,GAAG,CAAC,YAAY,CAAC;YAClF,IAAI,iBAAiB,IAAI,GAAG,CAAC,aAAa,KAAK,IAAI,IAAI,OAAO,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;gBAC/F,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;gBAClC,OAAO,CAAC,aAAa,GAAG,YAAY,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,WAAW,CAAC;YAC7E,CAAC;YACD,IAAI,CAAC,gBAAgB,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBACzC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;gBAC9B,OAAO,CAAC,WAAW,GAAG,YAAY,GAAG,CAAC,KAAK,eAAe,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,kBAAkB,GAAG,MAAM;QACjC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9F,CAAC,CAAC,iBAAiB,CAAC;IACtB,OAAO,CAAC,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IAEvE,sCAAsC;IACtC,uDAAuD;IACvD,kCAAkC;IAClC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACxC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,eAAe,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAErH,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,gBAAgB,CACxB,UAAU,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,eAAe,CAAC,IAAI,CAAC,yBAAyB;YAClG,yBAAyB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG;YAC5F,8EAA8E;YAC9E,QAAQ,eAAe,CAAC,IAAI,CAAC,sEAAsE;YACnG,4EAA4E,QAAA,mBAAmB,wBAAwB,EACvH,YAAY,CACb,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,GAAG,GAAgB;QACvB,OAAO,EAAE,OAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAO;QAC/C,aAAa,EAAE,aAAc,EAAE,YAAY,EAAE,aAAa;QAC1D,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAuB;QAC5E,OAAO;KACR,CAAC;IACF,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,4BACE,aAAqB,EACrB,IAA+B,EAC/B,GAAG,GAAuB,QAAA,qBAAqB;IAE/C,MAAM,IAAI,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;IAClE,OAAO,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,IAAI,IAAI,CAAC;AACjE,CAAC;AAeD;;;;GAIG;AACH,8BAAqC,IAAI,GAAyB,EAAE;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,IAAI,GAAG,CAAC,6BAA6B,CAAC;IACpF,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,+BAA+B,CAAC;IAChH,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,gBAAgB,CAAC,GAAG,OAAO,uBAAuB,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,OAAO,EAAE,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,gBAAgB,CACxB,aAAa,EAAE,uCAAuC;YACtD,0EAA0E,EAC1E,CAAC,mBAAmB,CAAC,CACtB,CAAC;IACJ,CAAC;IACD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,gBAAgB,CAAC,GAAG,EAAE,uCAAuC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,yBAAgC,IAAI,GAAyB,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IACrE,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAC7F,CAAC;AACH,CAAC"}