@hedgehog-finance/hedgehog-plugin 1.0.12 → 1.0.13

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 (44) hide show
  1. package/dist/index.d.ts +10 -0
  2. package/dist/index.js +24 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/src/channel.d.ts +6 -0
  5. package/dist/src/channel.js +620 -0
  6. package/dist/src/channel.js.map +1 -0
  7. package/dist/src/core/database.d.ts +2 -0
  8. package/dist/src/core/database.js +220 -0
  9. package/dist/src/core/database.js.map +1 -0
  10. package/dist/src/core/logger.d.ts +3 -0
  11. package/dist/src/core/logger.js +20 -0
  12. package/dist/src/core/logger.js.map +1 -0
  13. package/dist/src/features/index.d.ts +22 -0
  14. package/dist/src/features/index.js +8 -0
  15. package/dist/src/features/index.js.map +1 -0
  16. package/dist/src/features/watchlist/logic.d.ts +48 -0
  17. package/dist/src/features/watchlist/logic.js +607 -0
  18. package/dist/src/features/watchlist/logic.js.map +1 -0
  19. package/dist/src/features/watchlist/schema.d.ts +85 -0
  20. package/dist/src/features/watchlist/schema.js +29 -0
  21. package/dist/src/features/watchlist/schema.js.map +1 -0
  22. package/dist/src/features/watchlist/store.d.ts +1 -0
  23. package/dist/src/features/watchlist/store.js +2 -0
  24. package/dist/src/features/watchlist/store.js.map +1 -0
  25. package/dist/src/features/watchlist/tools.d.ts +135 -0
  26. package/dist/src/features/watchlist/tools.js +572 -0
  27. package/dist/src/features/watchlist/tools.js.map +1 -0
  28. package/dist/src/runtime.d.ts +5 -0
  29. package/dist/src/runtime.js +40 -0
  30. package/dist/src/runtime.js.map +1 -0
  31. package/dist/src/types.d.ts +99 -0
  32. package/dist/src/types.js +16 -0
  33. package/dist/src/types.js.map +1 -0
  34. package/index.ts +4 -4
  35. package/package.json +23 -6
  36. package/src/channel.ts +26 -4
  37. package/src/core/database.ts +90 -3
  38. package/src/features/index.ts +2 -1
  39. package/src/features/watchlist/logic.ts +503 -128
  40. package/src/features/watchlist/schema.ts +1 -6
  41. package/src/features/watchlist/tools.ts +248 -103
  42. package/src/runtime.ts +3 -3
  43. package/src/types.ts +1 -1
  44. package/tsconfig.json +0 -16
@@ -0,0 +1,607 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { completeSimple } from "@mariozechner/pi-ai";
3
+ import { extractAssistantText, prepareSimpleCompletionModel } from "openclaw/plugin-sdk/simple-completion-runtime";
4
+ import { getDB } from "../../core/database.js";
5
+ import { logger } from "../../core/logger.js";
6
+ import { StockClassificationSchema } from "../../types.js";
7
+ const MAIN_AGENT_ID = "hedgehog-finance";
8
+ const SINGLE_CLASSIFICATION_TIMEOUT_MS = 180000;
9
+ const SMART_SORT_TIMEOUT_MS = 180000;
10
+ const BATCH_CLASSIFICATION_BASE_TIMEOUT_MS = 300000;
11
+ const BATCH_CLASSIFICATION_PER_STOCK_TIMEOUT_MS = 30000;
12
+ const BATCH_CLASSIFICATION_MAX_TIMEOUT_MS = 600000;
13
+ const CLASSIFIER_OUTPUT_BASE_TOKENS = 1000;
14
+ const CLASSIFIER_OUTPUT_PER_STOCK_TOKENS = 260;
15
+ const CLASSIFIER_OUTPUT_MAX_TOKENS = 4096;
16
+ const CLASSIFIER_SYSTEM_PROMPT = [
17
+ "你是一个股票行业/主题分类器,只能完成当前 JSON 分类任务。",
18
+ "禁止检查、加载、调用或提及任何技能、工具、外部数据源或工作区文件。",
19
+ "禁止输出推理过程、解释、Markdown 或代码块。",
20
+ "只允许根据用户消息中提供的行业/主题分类字典和股票列表输出纯 JSON 数组。"
21
+ ].join("\n");
22
+ function nowMs() {
23
+ return Date.now();
24
+ }
25
+ function resolveModelRef(modelConfig) {
26
+ if (typeof modelConfig === "string" && modelConfig.trim())
27
+ return modelConfig.trim();
28
+ if (!modelConfig || typeof modelConfig !== "object" || Array.isArray(modelConfig))
29
+ return undefined;
30
+ const primary = modelConfig.primary;
31
+ return typeof primary === "string" && primary.trim() ? primary.trim() : undefined;
32
+ }
33
+ function getConfiguredProviderConfig(cfg, provider) {
34
+ const providerConfigs = cfg.models?.providers;
35
+ if (!providerConfigs)
36
+ return undefined;
37
+ const exact = providerConfigs[provider];
38
+ if (exact)
39
+ return exact;
40
+ const normalized = provider.trim().toLowerCase();
41
+ return Object.entries(providerConfigs).find(([key]) => key.trim().toLowerCase() === normalized)?.[1];
42
+ }
43
+ function resolveClassifierModelSelection(cfg, defaultProvider, defaultModel) {
44
+ const agentEntry = (cfg.agents?.list || []).find((agent) => agent?.id === MAIN_AGENT_ID);
45
+ const primary = resolveModelRef(agentEntry?.model)
46
+ || resolveModelRef(cfg.agents?.defaults?.model)
47
+ || `${defaultProvider}/${defaultModel}`;
48
+ const slash = primary.indexOf("/");
49
+ if (slash > 0) {
50
+ return {
51
+ provider: primary.slice(0, slash),
52
+ model: primary.slice(slash + 1)
53
+ };
54
+ }
55
+ return {
56
+ provider: defaultProvider,
57
+ model: primary
58
+ };
59
+ }
60
+ function normalizeStockCodeForCache(stockCode, exchange) {
61
+ const code = String(stockCode || "")
62
+ .trim()
63
+ .toUpperCase();
64
+ if (/\.(SH|SS|SZ|HK|US)$/i.test(code)) {
65
+ return code.replace(/\.SS$/i, ".SH");
66
+ }
67
+ switch (exchange) {
68
+ case "SSE":
69
+ return `${code}.SH`;
70
+ case "SZSE":
71
+ return `${code}.SZ`;
72
+ case "HKEX":
73
+ return `${code}.HK`;
74
+ default:
75
+ return code;
76
+ }
77
+ }
78
+ function legacyStockCodeWithoutSuffix(stockCode) {
79
+ return String(stockCode || "")
80
+ .trim()
81
+ .toUpperCase()
82
+ .replace(/\.(SH|SS|SZ|HK|US)$/i, "");
83
+ }
84
+ function getCachedClassificationRow(db, stockCode, exchange) {
85
+ const cacheCode = normalizeStockCodeForCache(stockCode, exchange);
86
+ const legacyCode = legacyStockCodeWithoutSuffix(stockCode);
87
+ const stmt = db.prepare(`
88
+ SELECT industryJson, themeJson FROM global_stock_metadata
89
+ WHERE stockCode = ? AND exchange = ?
90
+ `);
91
+ return (stmt.get(cacheCode, exchange) || (legacyCode !== cacheCode ? stmt.get(legacyCode, exchange) : undefined));
92
+ }
93
+ function resolveBatchClassificationTimeoutMs(stockCount) {
94
+ return Math.min(BATCH_CLASSIFICATION_MAX_TIMEOUT_MS, BATCH_CLASSIFICATION_BASE_TIMEOUT_MS + Math.max(0, stockCount - 1) * BATCH_CLASSIFICATION_PER_STOCK_TIMEOUT_MS);
95
+ }
96
+ function estimateClassifierStockCount(prompt) {
97
+ const codeMatches = prompt.match(/\b\d{6}\.(?:SH|SS|SZ|HK|US)\b/gi);
98
+ return Math.max(1, codeMatches?.length ?? 1);
99
+ }
100
+ function resolveClassifierOutputMaxTokens(prompt) {
101
+ return Math.min(CLASSIFIER_OUTPUT_MAX_TOKENS, CLASSIFIER_OUTPUT_BASE_TOKENS + estimateClassifierStockCount(prompt) * CLASSIFIER_OUTPUT_PER_STOCK_TOKENS);
102
+ }
103
+ function normalizeCategoryMatchKey(value) {
104
+ return String(value || "")
105
+ .trim()
106
+ .toLowerCase()
107
+ .replace(/[\s\u00a0\u3000_\-—–·・,,、//||]+/g, "");
108
+ }
109
+ function disableClassifierReasoningPayload(payload, model) {
110
+ if (!payload || typeof payload !== "object" || Array.isArray(payload))
111
+ return payload;
112
+ const next = { ...payload };
113
+ delete next.reasoning_effort;
114
+ delete next.reasoningEffort;
115
+ if (next.reasoning && typeof next.reasoning === "object" && !Array.isArray(next.reasoning)) {
116
+ next.reasoning = { ...next.reasoning, effort: "none" };
117
+ }
118
+ else {
119
+ delete next.reasoning;
120
+ }
121
+ const modelInfo = (model && typeof model === "object" ? model : {});
122
+ const provider = String(modelInfo.provider || "").toLowerCase();
123
+ const baseUrl = String(modelInfo.baseUrl || "").toLowerCase();
124
+ const compat = modelInfo.compat && typeof modelInfo.compat === "object"
125
+ ? modelInfo.compat
126
+ : {};
127
+ const thinkingFormat = String(compat.thinkingFormat || "").toLowerCase();
128
+ const usesBooleanThinkingToggle = thinkingFormat === "qwen"
129
+ || thinkingFormat === "qwen-chat-template"
130
+ || thinkingFormat === "zai"
131
+ || provider === "qwen"
132
+ || provider === "modelstudio"
133
+ || provider === "zai"
134
+ || baseUrl.includes("dashscope.aliyuncs.com")
135
+ || baseUrl.includes("api.z.ai")
136
+ || "enable_thinking" in next
137
+ || "chat_template_kwargs" in next;
138
+ if (usesBooleanThinkingToggle) {
139
+ next.enable_thinking = false;
140
+ next.chat_template_kwargs = {
141
+ ...(next.chat_template_kwargs && typeof next.chat_template_kwargs === "object" && !Array.isArray(next.chat_template_kwargs)
142
+ ? next.chat_template_kwargs
143
+ : {}),
144
+ enable_thinking: false
145
+ };
146
+ }
147
+ return next;
148
+ }
149
+ function extractJsonArray(text) {
150
+ const trimmed = text.trim();
151
+ const fenced = trimmed.match(/```(?:json)?\s*([\s\S]*?)\s*```/i);
152
+ const source = fenced?.[1]?.trim() || trimmed;
153
+ const start = source.indexOf("[");
154
+ const end = source.lastIndexOf("]");
155
+ if (start < 0 || end < start) {
156
+ throw new Error("AI 未返回有效分类 JSON");
157
+ }
158
+ const parsed = JSON.parse(source.slice(start, end + 1));
159
+ if (!Array.isArray(parsed)) {
160
+ throw new Error("AI 分类结果不是数组");
161
+ }
162
+ return parsed;
163
+ }
164
+ /**
165
+ * 智能分类元数据引擎
166
+ */
167
+ export const watchlistLogic = {
168
+ _normalizeStockCodeForCache: normalizeStockCodeForCache,
169
+ /**
170
+ * 获取单只股票的分类与权重(带全局缓存)
171
+ */
172
+ async getStockClassification(rt, stockName, stockCode, exchange, _userId) {
173
+ const db = getDB();
174
+ // 1. 尝试从全局缓存读取
175
+ const cached = getCachedClassificationRow(db, stockCode, exchange);
176
+ if (cached && cached.industryJson) {
177
+ try {
178
+ logger.info({
179
+ stockCode,
180
+ cacheCode: normalizeStockCodeForCache(stockCode, exchange),
181
+ exchange
182
+ }, "[Watchlist] classification cache hit");
183
+ return watchlistLogic._normalizeCachedClassification({
184
+ industry: JSON.parse(cached.industryJson),
185
+ theme: JSON.parse(cached.themeJson || '[]'),
186
+ weight: 50
187
+ });
188
+ }
189
+ catch (e) {
190
+ // 容错
191
+ }
192
+ }
193
+ // 2. 缓存未命中,调用 AI 进行推断
194
+ const classification = await watchlistLogic._autoClassifyWithAI(rt, stockName, stockCode, exchange);
195
+ return classification;
196
+ },
197
+ /**
198
+ * 批量获取股票分类
199
+ */
200
+ async classifyStocksTogether(rt, stocks, _userId) {
201
+ const db = getDB();
202
+ const results = new Array(stocks.length).fill(null);
203
+ const pendingStocks = [];
204
+ stocks.forEach((stock, idx) => {
205
+ const cached = getCachedClassificationRow(db, stock.stockCode, stock.exchange);
206
+ if (cached && cached.industryJson) {
207
+ try {
208
+ logger.info({
209
+ stockCode: stock.stockCode,
210
+ cacheCode: normalizeStockCodeForCache(stock.stockCode, stock.exchange),
211
+ exchange: stock.exchange
212
+ }, "[Watchlist] classification cache hit");
213
+ results[idx] = watchlistLogic._normalizeCachedClassification({
214
+ industry: JSON.parse(cached.industryJson),
215
+ theme: JSON.parse(cached.themeJson || '[]'),
216
+ weight: 50
217
+ });
218
+ return;
219
+ }
220
+ catch {
221
+ // 缓存损坏时重新分析
222
+ }
223
+ }
224
+ pendingStocks.push({
225
+ idx,
226
+ stockName: stock.stockName,
227
+ stockCode: stock.stockCode,
228
+ exchange: stock.exchange
229
+ });
230
+ });
231
+ logger.info({
232
+ total: stocks.length,
233
+ cached: stocks.length - pendingStocks.length,
234
+ pending: pendingStocks.length,
235
+ pendingCodes: pendingStocks.map(stock => stock.stockCode)
236
+ }, "[Watchlist] batch add classification input");
237
+ if (pendingStocks.length === 0) {
238
+ return results;
239
+ }
240
+ const cats = watchlistLogic._getKnownCategories(db);
241
+ if (cats.industries.length === 0) {
242
+ throw new Error("行业分类字典为空,无法分析行业/主题关系");
243
+ }
244
+ const stocksList = pendingStocks.map(s => `- ${s.stockName} (${s.stockCode})`).join("\n");
245
+ const prompt = watchlistLogic._buildAiPrompt(cats.industries, cats.themes, stocksList, true);
246
+ const sessionId = `classify-batch-${randomUUID()}`;
247
+ const aiText = await watchlistLogic._callClassifierAi(rt, sessionId, prompt, resolveBatchClassificationTimeoutMs(pendingStocks.length));
248
+ let parsed;
249
+ try {
250
+ parsed = extractJsonArray(aiText);
251
+ }
252
+ catch (e) {
253
+ logger.warn({
254
+ err: e instanceof Error ? e.message : String(e),
255
+ pendingCodes: pendingStocks.map(stock => stock.stockCode),
256
+ aiTextLength: aiText.length,
257
+ aiText
258
+ }, "[Watchlist] batch classification AI parse failed");
259
+ throw e;
260
+ }
261
+ const parsedByCode = new Map();
262
+ parsed.forEach((raw) => {
263
+ if (raw?.code)
264
+ parsedByCode.set(String(raw.code), raw);
265
+ });
266
+ let parsedResults;
267
+ try {
268
+ parsedResults = pendingStocks.map((stock, i) => {
269
+ const raw = parsedByCode.get(String(stock.stockCode)) || parsed[i];
270
+ return {
271
+ stock,
272
+ data: watchlistLogic._parseClassification(raw, cats, stock.stockName || stock.stockCode)
273
+ };
274
+ });
275
+ }
276
+ catch (e) {
277
+ logger.warn({
278
+ err: e instanceof Error ? e.message : String(e),
279
+ pendingCodes: pendingStocks.map(stock => stock.stockCode),
280
+ aiTextLength: aiText.length,
281
+ aiText
282
+ }, "[Watchlist] batch classification AI semantic parse failed");
283
+ throw e;
284
+ }
285
+ for (const { stock, data } of parsedResults) {
286
+ results[stock.idx] = data;
287
+ }
288
+ const missing = stocks.find((_, i) => !results[i]);
289
+ if (missing) {
290
+ throw new Error(`行业/主题关系分析失败: ${missing.stockName || missing.stockCode}`);
291
+ }
292
+ return results;
293
+ },
294
+ async getBatchStockClassification(rt, stocks, _userId, options = {}) {
295
+ const db = getDB();
296
+ const results = new Array(stocks.length).fill(null);
297
+ const pendingStocks = [];
298
+ stocks.forEach((s, i) => {
299
+ const cached = options.forceRefresh
300
+ ? undefined
301
+ : getCachedClassificationRow(db, s.stockCode, s.exchange);
302
+ if (cached && cached.industryJson) {
303
+ try {
304
+ results[i] = watchlistLogic._normalizeCachedClassification({
305
+ industry: JSON.parse(cached.industryJson),
306
+ theme: JSON.parse(cached.themeJson || '[]'),
307
+ weight: 50
308
+ });
309
+ }
310
+ catch (e) {
311
+ pendingStocks.push({ idx: i, name: s.stockName, code: s.stockCode, exchange: s.exchange });
312
+ }
313
+ }
314
+ else {
315
+ pendingStocks.push({ idx: i, name: s.stockName, code: s.stockCode, exchange: s.exchange });
316
+ }
317
+ });
318
+ logger.info({
319
+ total: stocks.length,
320
+ cached: stocks.length - pendingStocks.length,
321
+ pending: pendingStocks.length,
322
+ pendingCodes: pendingStocks.map(s => s.code)
323
+ }, "[Watchlist] batch classification input");
324
+ if (pendingStocks.length > 0) {
325
+ const cats = watchlistLogic._getKnownCategories(db);
326
+ if (cats.industries.length === 0)
327
+ return results;
328
+ const stocksList = pendingStocks.map(s => `- ${s.name} (${s.code})`).join("\n");
329
+ const prompt = watchlistLogic._buildAiPrompt(cats.industries, cats.themes, stocksList, true);
330
+ try {
331
+ const aiText = await watchlistLogic._callClassifierAi(rt, `classify-batch-${randomUUID()}`, prompt, resolveBatchClassificationTimeoutMs(pendingStocks.length));
332
+ const parsed = extractJsonArray(aiText);
333
+ const parsedByCode = new Map();
334
+ parsed.forEach((raw) => {
335
+ if (raw?.code)
336
+ parsedByCode.set(String(raw.code), raw);
337
+ });
338
+ const parsedResults = pendingStocks.map((ps, i) => {
339
+ const raw = parsedByCode.get(String(ps.code)) || parsed[i];
340
+ return {
341
+ stock: ps,
342
+ data: watchlistLogic._parseClassification(raw, cats, ps.name || ps.code)
343
+ };
344
+ });
345
+ for (const { stock, data } of parsedResults) {
346
+ results[stock.idx] = data;
347
+ }
348
+ }
349
+ catch (e) {
350
+ logger.error({
351
+ err: e instanceof Error ? e.message : String(e),
352
+ pendingCodes: pendingStocks.map(stock => stock.code)
353
+ }, "[Watchlist] batch AI classification failed");
354
+ if (options.requireComplete)
355
+ throw e;
356
+ }
357
+ }
358
+ if (options.requireComplete) {
359
+ const missing = stocks.find((_, i) => !results[i]);
360
+ if (missing) {
361
+ throw new Error(`行业/主题关系分析失败: ${missing.stockName || missing.stockCode}`);
362
+ }
363
+ }
364
+ return results;
365
+ },
366
+ _getKnownCategories(db) {
367
+ const industries = db.prepare("SELECT name FROM watchlist_categories WHERE type = 'industry'").all();
368
+ const themes = db.prepare("SELECT name FROM watchlist_categories WHERE type = 'theme'").all();
369
+ return {
370
+ industries: industries.map(i => i.name),
371
+ themes: themes.map(t => t.name)
372
+ };
373
+ },
374
+ /**
375
+ * 内部 AI 实现 (适配新协议)
376
+ */
377
+ async _autoClassifyWithAI(rt, stockName, stockCode, exchange) {
378
+ const db = getDB();
379
+ const cats = watchlistLogic._getKnownCategories(db);
380
+ if (cats.industries.length === 0) {
381
+ return null;
382
+ }
383
+ const prompt = watchlistLogic._buildAiPrompt(cats.industries, cats.themes, `${stockName} (${stockCode})`, false);
384
+ const aiText = await watchlistLogic._callClassifierAi(rt, `classify-${stockCode}`, prompt, SINGLE_CLASSIFICATION_TIMEOUT_MS);
385
+ try {
386
+ const parsed = extractJsonArray(aiText);
387
+ const raw = parsed[0]; // 单只股票也是数组格式
388
+ if (raw) {
389
+ return watchlistLogic._parseClassification(raw, cats, stockName || stockCode);
390
+ }
391
+ }
392
+ catch (e) {
393
+ logger.warn({ err: e instanceof Error ? e.message : String(e), stockCode, stockName }, "[Watchlist] AI 分类解析异常");
394
+ }
395
+ return null;
396
+ },
397
+ async _callClassifierCompletion(rt, sessionId, prompt, timeoutMs) {
398
+ const cfg = rt.config.loadConfig();
399
+ const { provider, model } = resolveClassifierModelSelection(cfg, rt.agent.defaults.provider, rt.agent.defaults.model);
400
+ const maxTokens = resolveClassifierOutputMaxTokens(prompt);
401
+ const providerAuth = await rt.modelAuth.resolveApiKeyForProvider({ provider, cfg });
402
+ if (!providerAuth.apiKey) {
403
+ throw new Error(`No API key found for provider "${provider}".`);
404
+ }
405
+ const providerConfigs = cfg.models?.providers;
406
+ const providerConfig = getConfiguredProviderConfig(cfg, provider);
407
+ if (!providerConfig) {
408
+ throw new Error(`No model provider config found for "${provider}".`);
409
+ }
410
+ const embeddedCfg = {
411
+ ...cfg,
412
+ agents: {
413
+ ...cfg.agents,
414
+ defaults: {
415
+ ...cfg.agents?.defaults,
416
+ systemPromptOverride: CLASSIFIER_SYSTEM_PROMPT
417
+ }
418
+ },
419
+ models: {
420
+ ...cfg.models,
421
+ providers: {
422
+ ...providerConfigs,
423
+ [provider]: {
424
+ ...providerConfig,
425
+ auth: "api-key",
426
+ apiKey: providerAuth.apiKey
427
+ }
428
+ }
429
+ }
430
+ };
431
+ const startedAt = nowMs();
432
+ const prepared = await prepareSimpleCompletionModel({
433
+ cfg: embeddedCfg,
434
+ provider,
435
+ modelId: model
436
+ });
437
+ const preparedAt = nowMs();
438
+ if ("error" in prepared) {
439
+ throw new Error(prepared.error);
440
+ }
441
+ const abortController = new AbortController();
442
+ const abortTimer = setTimeout(() => {
443
+ abortController.abort(new Error(`classifier completion timed out after ${timeoutMs}ms`));
444
+ }, timeoutMs);
445
+ try {
446
+ logger.info({
447
+ sessionId,
448
+ provider,
449
+ model,
450
+ maxTokens
451
+ }, "[Watchlist] classifier simple completion start");
452
+ const result = await completeSimple(prepared.model, {
453
+ systemPrompt: CLASSIFIER_SYSTEM_PROMPT,
454
+ messages: [{
455
+ role: "user",
456
+ content: prompt,
457
+ timestamp: Date.now()
458
+ }]
459
+ }, {
460
+ apiKey: prepared.auth.apiKey,
461
+ maxTokens,
462
+ signal: abortController.signal,
463
+ onPayload: disableClassifierReasoningPayload
464
+ });
465
+ const completedAt = nowMs();
466
+ const aiText = extractAssistantText(result)?.trim() || "";
467
+ if (!aiText) {
468
+ throw new Error("AI 分类分析未返回内容");
469
+ }
470
+ extractJsonArray(aiText);
471
+ logger.info({
472
+ sessionId,
473
+ responseId: result.responseId,
474
+ usage: result.usage,
475
+ stopReason: result.stopReason,
476
+ contentBlocks: Array.isArray(result.content)
477
+ ? result.content.map((block) => block?.type || typeof block)
478
+ : [],
479
+ timingMs: {
480
+ prepare: preparedAt - startedAt,
481
+ complete: completedAt - preparedAt,
482
+ total: completedAt - startedAt
483
+ },
484
+ aiTextLength: aiText.length,
485
+ aiText
486
+ }, "[Watchlist] classifier simple completion completed");
487
+ return aiText;
488
+ }
489
+ finally {
490
+ clearTimeout(abortTimer);
491
+ }
492
+ },
493
+ async _callClassifierAi(rt, sessionId, prompt, timeoutMs) {
494
+ try {
495
+ return await watchlistLogic._callClassifierCompletion(rt, sessionId, prompt, timeoutMs);
496
+ }
497
+ catch (e) {
498
+ logger.warn({
499
+ err: e instanceof Error ? e.message : String(e),
500
+ sessionId
501
+ }, "[Watchlist] classifier simple completion failed");
502
+ throw e;
503
+ }
504
+ },
505
+ _ensureCategory(db, name, type, userId) {
506
+ const existing = db.prepare("SELECT id FROM watchlist_categories WHERE userId = ? AND name = ? AND type = ?").get(userId, name, type);
507
+ if (existing)
508
+ return existing.id;
509
+ const maxOrderRow = db.prepare("SELECT MAX(sortOrder) as max FROM watchlist_categories WHERE userId = ?").get(userId);
510
+ const nextOrder = (maxOrderRow?.max || 0) + 10;
511
+ const id = randomUUID();
512
+ db.prepare(`INSERT INTO watchlist_categories (id, userId, name, type, sortOrder, weight) VALUES (?, ?, ?, ?, ?, 0)`).run(id, userId, name, type, nextOrder);
513
+ return id;
514
+ },
515
+ _buildSmartSortPrompt(stocks) {
516
+ return JSON.stringify({
517
+ cw_content: `# 股票智能排序\n## 股票列表\n${JSON.stringify(stocks)}\n## 指令和要求\n根据股票被提及的热度(30%)、总市值(30%)、用户记忆中近两周提及该股票的次数(30%)、最近一周该股票的波动性(10%)进行加权综合排序,总权重(最高100分)高的排在前面。\n`,
518
+ cw_output: `严格按照JSON格式输出:\n\n[\n { "code": "000000", \n "name": "xxxx",\n "weight": 0\n }\n]\n`
519
+ }, null, 2);
520
+ },
521
+ async applySmartSort(rt, sessionId, stocks) {
522
+ const prompt = watchlistLogic._buildSmartSortPrompt(stocks);
523
+ const aiText = await watchlistLogic._callClassifierAi(rt, `smart-sort-${sessionId}`, prompt, SMART_SORT_TIMEOUT_MS);
524
+ const jsonMatch = aiText.match(/\[.*\]/s);
525
+ if (jsonMatch) {
526
+ try {
527
+ return JSON.parse(jsonMatch[0]);
528
+ }
529
+ catch (e) {
530
+ return [];
531
+ }
532
+ }
533
+ return [];
534
+ },
535
+ _parseClassification(raw, cats, label) {
536
+ if (!raw || !Array.isArray(raw.category)) {
537
+ throw new Error(`行业/主题关系分析失败: ${label}`);
538
+ }
539
+ const industryItem = raw.category.find((c) => cats.industries.includes(watchlistLogic._anchorToCategory(c.name, cats.industries)));
540
+ if (!industryItem) {
541
+ throw new Error(`行业分类分析失败: ${label}`);
542
+ }
543
+ const industryName = watchlistLogic._anchorToCategory(industryItem.name, cats.industries);
544
+ const themesItems = raw.category.filter((c) => c !== industryItem);
545
+ return {
546
+ industry: {
547
+ name: industryName,
548
+ weight: industryItem.weight || 100
549
+ },
550
+ theme: themesItems
551
+ .map((t) => ({
552
+ name: watchlistLogic._anchorToCategory(t.name, cats.themes),
553
+ weight: t.weight || 0
554
+ }))
555
+ .filter((t) => cats.themes.includes(t.name)),
556
+ weight: 50
557
+ };
558
+ },
559
+ _normalizeCachedClassification(value) {
560
+ const parsed = StockClassificationSchema.safeParse(value);
561
+ if (!parsed.success || !parsed.data.industry?.name) {
562
+ throw new Error("缓存分类缺少行业");
563
+ }
564
+ return parsed.data;
565
+ },
566
+ _buildAiPrompt(industries, themes, input, isBatch) {
567
+ let stocksJson = input;
568
+ if (isBatch) {
569
+ const stocks = input.split('\n').filter(line => line.trim()).map(line => {
570
+ const match = line.match(/-\s*(.*?)\s*\((.*?)\)/);
571
+ return match ? { name: match[1], code: match[2] } : null;
572
+ }).filter(Boolean);
573
+ stocksJson = JSON.stringify(stocks);
574
+ }
575
+ else {
576
+ const match = input.match(/(.*?)\s*\((.*?)\)/);
577
+ stocksJson = JSON.stringify([match ? { name: match[1], code: match[2] } : { name: input, code: "" }]);
578
+ }
579
+ return JSON.stringify({
580
+ cw_context: `**行业分类**: [${industries.join(", ")}]\n**主题分类**: [${themes.join(", ")}]\n`,
581
+ cw_content: `# 股票智能分类\n## 股票列表\n${stocksJson}\n## 指令和要求\n根据其基本面和金融市场知识,把上面\`股票列表\`中的每个股票归属的行业分类和主题分类提取出来,并根据相关性给出权重值(0-100的整数,相关性越高分数越高)。\n\`行业分类\`和\`主题分类\`必须在上下文中提供的列表内选择,不得自己创建词汇。每个股票只能且必须选择一个行业分类,每个股票可以选择0~2个主题分类,不是必选的,不要刻意去选择相关性不高的主题分类。\n股票的\`行业分类\`和\`主题分类\`统称为\`分类Category\`,输出时可以放在一个Category数组中。\n`,
582
+ cw_output: `严格按照JSON格式输出:\n\n[\n { "code": "000000", \n "name": "xxxx",\n "category": [{"name": "xxx", "weight": 80}, {"name": "xxx", "weight": 0}]\n }\n]\n`
583
+ }, null, 2);
584
+ },
585
+ _anchorToCategory(value, categories) {
586
+ if (!value || categories.length === 0)
587
+ return "其他";
588
+ const trimmed = value.trim();
589
+ const exact = categories.find(c => c === trimmed);
590
+ if (exact)
591
+ return exact;
592
+ const normalized = normalizeCategoryMatchKey(trimmed);
593
+ const normalizedExact = categories.find(c => normalizeCategoryMatchKey(c) === normalized);
594
+ if (normalizedExact)
595
+ return normalizedExact;
596
+ const candidates = categories.filter(c => {
597
+ const categoryKey = normalizeCategoryMatchKey(c);
598
+ return c.includes(trimmed)
599
+ || trimmed.includes(c)
600
+ || (normalized.length > 0 && (categoryKey.includes(normalized) || normalized.includes(categoryKey)));
601
+ });
602
+ if (candidates.length === 1)
603
+ return candidates[0];
604
+ return "其他";
605
+ }
606
+ };
607
+ //# sourceMappingURL=logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logic.js","sourceRoot":"","sources":["../../../../src/features/watchlist/logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EACN,oBAAoB,EACpB,4BAA4B,EAC5B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAuB,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAShF,MAAM,aAAa,GAAG,kBAAkB,CAAC;AACzC,MAAM,gCAAgC,GAAG,MAAM,CAAC;AAChD,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,oCAAoC,GAAG,MAAM,CAAC;AACpD,MAAM,yCAAyC,GAAG,KAAK,CAAC;AACxD,MAAM,mCAAmC,GAAG,MAAM,CAAC;AACnD,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAC3C,MAAM,kCAAkC,GAAG,GAAG,CAAC;AAC/C,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAC1C,MAAM,wBAAwB,GAAG;IAChC,kCAAkC;IAClC,mCAAmC;IACnC,4BAA4B;IAC5B,yCAAyC;CACzC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,KAAK;IACb,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,WAAoB;IAC5C,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE;QAAE,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC;IACrF,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IACpG,MAAM,OAAO,GAAI,WAAqC,CAAC,OAAO,CAAC;IAC/D,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACnF,CAAC;AAED,SAAS,2BAA2B,CAAC,GAAQ,EAAE,QAAgB;IAC9D,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;IAC9C,IAAI,CAAC,eAAe;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjD,OAAO,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,+BAA+B,CACvC,GAAQ,EACR,eAAuB,EACvB,YAAoB;IAEpB,MAAM,UAAU,GAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,aAAa,CAAC,CAAC;IACpG,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC;WAC9C,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC;WAC5C,GAAG,eAAe,IAAI,YAAY,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACf,OAAO;YACN,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;SAC/B,CAAC;IACH,CAAC;IACD,OAAO;QACN,QAAQ,EAAE,eAAe;QACzB,KAAK,EAAE,OAAO;KACd,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,SAAiB,EAAE,QAAiB;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;SAClC,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IAChB,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,QAAQ,QAAQ,EAAE,CAAC;QAClB,KAAK,KAAK;YACT,OAAO,GAAG,IAAI,KAAK,CAAC;QACrB,KAAK,MAAM;YACV,OAAO,GAAG,IAAI,KAAK,CAAC;QACrB,KAAK,MAAM;YACV,OAAO,GAAG,IAAI,KAAK,CAAC;QACrB;YACC,OAAO,IAAI,CAAC;IACd,CAAC;AACF,CAAC;AAED,SAAS,4BAA4B,CAAC,SAAiB;IACtD,OAAO,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;SAC5B,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,0BAA0B,CAAC,EAAO,EAAE,SAAiB,EAAE,QAAgB;IAC/E,MAAM,SAAS,GAAG,0BAA0B,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,4BAA4B,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;EAGvB,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAuC,CAAC;AACzJ,CAAC;AAED,SAAS,mCAAmC,CAAC,UAAkB;IAC9D,OAAO,IAAI,CAAC,GAAG,CACd,mCAAmC,EACnC,oCAAoC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,GAAG,yCAAyC,CAC9G,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,MAAc;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,gCAAgC,CAAC,MAAc;IACvD,OAAO,IAAI,CAAC,GAAG,CACd,4BAA4B,EAC5B,6BAA6B,GAAG,4BAA4B,CAAC,MAAM,CAAC,GAAG,kCAAkC,CACzG,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAa;IAC/C,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACxB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,iCAAiC,CAAC,OAAgB,EAAE,KAAc;IAC1E,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACtF,MAAM,IAAI,GAAG,EAAE,GAAI,OAAmC,EAAE,CAAC;IACzD,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC7B,OAAO,IAAI,CAAC,eAAe,CAAC;IAC5B,IAAI,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5F,IAAI,CAAC,SAAS,GAAG,EAAE,GAAI,IAAI,CAAC,SAAqC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACrF,CAAC;SAAM,CAAC;QACP,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAA4B,CAAC;IAC/F,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ;QACtE,CAAC,CAAC,SAAS,CAAC,MAAiC;QAC7C,CAAC,CAAC,EAAE,CAAC;IACN,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACzE,MAAM,yBAAyB,GAC9B,cAAc,KAAK,MAAM;WACtB,cAAc,KAAK,oBAAoB;WACvC,cAAc,KAAK,KAAK;WACxB,QAAQ,KAAK,MAAM;WACnB,QAAQ,KAAK,aAAa;WAC1B,QAAQ,KAAK,KAAK;WAClB,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC;WAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;WAC5B,iBAAiB,IAAI,IAAI;WACzB,sBAAsB,IAAI,IAAI,CAAC;IAEnC,IAAI,yBAAyB,EAAE,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,oBAAoB,GAAG;YAC3B,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,OAAO,IAAI,CAAC,oBAAoB,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC;gBAC1H,CAAC,CAAC,IAAI,CAAC,oBAA+C;gBACtD,CAAC,CAAC,EAAE,CAAC;YACN,eAAe,EAAE,KAAK;SACtB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,2BAA2B,EAAE,0BAA0B;IAEvD;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAC3B,EAAiB,EACjB,SAAiB,EACjB,SAAiB,EACjB,QAAgB,EAChB,OAAe;QAEf,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QAEnB,eAAe;QACf,MAAM,MAAM,GAAG,0BAA0B,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEnE,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACnC,IAAI,CAAC;gBACJ,MAAM,CAAC,IAAI,CAAC;oBACX,SAAS;oBACT,SAAS,EAAE,0BAA0B,CAAC,SAAS,EAAE,QAAQ,CAAC;oBAC1D,QAAQ;iBACR,EAAE,sCAAsC,CAAC,CAAC;gBAC3C,OAAO,cAAc,CAAC,8BAA8B,CAAC;oBACpD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;oBACzC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;oBAC3C,MAAM,EAAE,EAAE;iBACV,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,KAAK;YACN,CAAC;QACF,CAAC;QAED,sBAAsB;QACtB,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEpG,OAAO,cAAc,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAC3B,EAAiB,EACjB,MAAa,EACb,OAAe;QAEf,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,KAAK,CAA6B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF,MAAM,aAAa,GAA8E,EAAE,CAAC;QAEpG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,0BAA0B,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE/E,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACJ,MAAM,CAAC,IAAI,CAAC;wBACX,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,SAAS,EAAE,0BAA0B,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC;wBACtE,QAAQ,EAAE,KAAK,CAAC,QAAQ;qBACxB,EAAE,sCAAsC,CAAC,CAAC;oBAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,8BAA8B,CAAC;wBAC5D,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;wBACzC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;wBAC3C,MAAM,EAAE,EAAE;qBACV,CAAC,CAAC;oBACH,OAAO;gBACR,CAAC;gBAAC,MAAM,CAAC;oBACR,YAAY;gBACb,CAAC;YACF,CAAC;YAED,aAAa,CAAC,IAAI,CAAC;gBAClB,GAAG;gBACH,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACxB,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC;YACX,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;YAC5C,OAAO,EAAE,aAAa,CAAC,MAAM;YAC7B,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;SACzD,EAAE,4CAA4C,CAAC,CAAC;QAEjD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,OAAgC,CAAC;QACzC,CAAC;QAED,MAAM,IAAI,GAAG,cAAc,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC7F,MAAM,SAAS,GAAG,kBAAkB,UAAU,EAAE,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,mCAAmC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACxI,IAAI,MAAiB,CAAC;QACtB,IAAI,CAAC;YACJ,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC;gBACX,GAAG,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/C,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;gBACzD,YAAY,EAAE,MAAM,CAAC,MAAM;gBAC3B,MAAM;aACN,EAAE,kDAAkD,CAAC,CAAC;YACvD,MAAM,CAAC,CAAC;QACT,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAe,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;YAC3B,IAAI,GAAG,EAAE,IAAI;gBAAE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,IAAI,aAAmF,CAAC;QACxF,IAAI,CAAC;YACJ,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;gBACnE,OAAO;oBACN,KAAK;oBACL,IAAI,EAAE,cAAc,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;iBACxF,CAAC;YACH,CAAC,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC;gBACX,GAAG,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/C,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;gBACzD,YAAY,EAAE,MAAM,CAAC,MAAM;gBAC3B,MAAM;aACN,EAAE,2DAA2D,CAAC,CAAC;YAChE,MAAM,CAAC,CAAC;QACT,CAAC;QAED,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,aAAa,EAAE,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,gBAAgB,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,OAAgC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,2BAA2B,CAChC,EAAiB,EACjB,MAAa,EACb,OAAe,EACf,UAAiE,EAAE;QAEnE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,aAAa,GAAoE,EAAE,CAAC;QAC1F,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY;gBAClC,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,0BAA0B,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACJ,OAAO,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,8BAA8B,CAAC;wBAC1D,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;wBACzC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;wBAC3C,MAAM,EAAE,EAAE;qBACV,CAAC,CAAC;gBACJ,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACZ,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5F,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5F,CAAC;QACF,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC;YACX,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;YAC5C,OAAO,EAAE,aAAa,CAAC,MAAM;YAC7B,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC5C,EAAE,wCAAwC,CAAC,CAAC;QAE7C,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,cAAc,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YACpD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC;YAEjD,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAE7F,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,EAAE,EAAE,kBAAkB,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,mCAAmC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/J,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBACxC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAe,CAAC;gBAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;oBAC3B,IAAI,GAAG,EAAE,IAAI;wBAAE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;gBACxD,CAAC,CAAC,CAAC;gBAEH,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;oBACjD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC3D,OAAO;wBACN,KAAK,EAAE,EAAE;wBACT,IAAI,EAAE,cAAc,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC;qBACxE,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,aAAa,EAAE,CAAC;oBAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAC3B,CAAC;YACF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,MAAM,CAAC,KAAK,CAAC;oBACZ,GAAG,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC/C,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;iBACpD,EAAE,4CAA4C,CAAC,CAAC;gBACjD,IAAI,OAAO,CAAC,eAAe;oBAAE,MAAM,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;QACD,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,gBAAgB,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAC3E,CAAC;QACF,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,mBAAmB,CAAC,EAAO;QAC1B,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC,GAAG,EAAW,CAAC;QAC9G,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC,GAAG,EAAW,CAAC;QACvG,OAAO;YACN,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACvC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACxB,EAAiB,EACjB,SAAiB,EACjB,SAAiB,EACjB,QAAgB;QAEhB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,cAAc,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAEpD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,KAAK,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QACjH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,EAAE,EAAE,YAAY,SAAS,EAAE,EAAE,MAAM,EAAE,gCAAgC,CAAC,CAAC;QAE7H,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;YACpC,IAAI,GAAG,EAAE,CAAC;gBACT,OAAO,cAAc,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC;YAC/E,CAAC;QACF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACjH,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,EAAiB,EAAE,SAAiB,EAAE,MAAc,EAAE,SAAiB;QACtG,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACnC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,+BAA+B,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtH,MAAM,SAAS,GAAG,gCAAgC,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,wBAAwB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,IAAI,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;QAC9C,MAAM,cAAc,GAAG,2BAA2B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,cAAc,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,WAAW,GAAG;YACnB,GAAG,GAAG;YACN,MAAM,EAAE;gBACP,GAAG,GAAG,CAAC,MAAM;gBACb,QAAQ,EAAE;oBACT,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ;oBACvB,oBAAoB,EAAE,wBAAwB;iBAC9C;aACD;YACD,MAAM,EAAE;gBACP,GAAG,GAAG,CAAC,MAAM;gBACb,SAAS,EAAE;oBACV,GAAG,eAAe;oBAClB,CAAC,QAAQ,CAAC,EAAE;wBACX,GAAG,cAAc;wBACjB,IAAI,EAAE,SAAkB;wBACxB,MAAM,EAAE,YAAY,CAAC,MAAM;qBAC3B;iBACD;aACD;SACD,CAAC;QACF,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC;YACnD,GAAG,EAAE,WAAW;YAChB,QAAQ;YACR,OAAO,EAAE,KAAK;SACd,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,KAAK,EAAE,CAAC;QAC3B,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;YAClC,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,yCAAyC,SAAS,IAAI,CAAC,CAAC,CAAC;QAC1F,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,IAAI,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC;gBACX,SAAS;gBACT,QAAQ;gBACR,KAAK;gBACL,SAAS;aACT,EAAE,gDAAgD,CAAC,CAAC;YAErD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE;gBACnD,YAAY,EAAE,wBAAwB;gBACtC,QAAQ,EAAE,CAAC;wBACV,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,MAAM;wBACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACrB,CAAC;aACF,EAAE;gBACF,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM;gBAC5B,SAAS;gBACT,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,SAAS,EAAE,iCAAiC;aAC5C,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YACjC,CAAC;YACD,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC;gBACX,SAAS;gBACT,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;oBAC3C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,IAAI,OAAO,KAAK,CAAC;oBACjE,CAAC,CAAC,EAAE;gBACL,QAAQ,EAAE;oBACT,OAAO,EAAE,UAAU,GAAG,SAAS;oBAC/B,QAAQ,EAAE,WAAW,GAAG,UAAU;oBAClC,KAAK,EAAE,WAAW,GAAG,SAAS;iBAC9B;gBACD,YAAY,EAAE,MAAM,CAAC,MAAM;gBAC3B,MAAM;aACN,EAAE,oDAAoD,CAAC,CAAC;YACzD,OAAO,MAAM,CAAC;QACf,CAAC;gBAAS,CAAC;YACV,YAAY,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,EAAiB,EAAE,SAAiB,EAAE,MAAc,EAAE,SAAiB;QAC9F,IAAI,CAAC;YACJ,OAAO,MAAM,cAAc,CAAC,yBAAyB,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACzF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC;gBACX,GAAG,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/C,SAAS;aACT,EAAE,iDAAiD,CAAC,CAAC;YACtD,MAAM,CAAC,CAAC;QACT,CAAC;IACF,CAAC;IAED,eAAe,CAAC,EAAO,EAAE,IAAY,EAAE,IAA0B,EAAE,MAAc;QAChF,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,gFAAgF,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAA+B,CAAC;QACpK,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAgC,CAAC;QACrJ,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/C,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,EAAE,CAAC,OAAO,CAAC,wGAAwG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAC5J,OAAO,EAAE,CAAC;IACX,CAAC;IAED,qBAAqB,CAAC,MAAwC;QAC7D,OAAO,IAAI,CAAC,SAAS,CAAC;YACrB,UAAU,EAAE,sBAAsB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,0GAA0G;YAClK,SAAS,EAAE,4FAA4F;SACvG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACb,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAiB,EAAE,SAAiB,EAAE,MAAwC;QAClG,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,EAAE,EAAE,cAAc,SAAS,EAAE,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACpH,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,SAAS,EAAE,CAAC;YACf,IAAI,CAAC;gBAAC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,OAAO,EAAE,CAAC;YAAC,CAAC;QAClE,CAAC;QACD,OAAO,EAAE,CAAC;IACX,CAAC;IAED,oBAAoB,CAAC,GAAQ,EAAE,IAAgD,EAAE,KAAa;QAC7F,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACxI,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,YAAY,GAAG,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1F,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;QACxE,OAAO;YACN,QAAQ,EAAE;gBACT,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,GAAG;aAClC;YACD,KAAK,EAAE,WAAW;iBAChB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBACjB,IAAI,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;gBAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;aACrB,CAAC,CAAC;iBACF,MAAM,CAAC,CAAC,CAAmC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/E,MAAM,EAAE,EAAE;SACV,CAAC;IACH,CAAC;IAED,8BAA8B,CAAC,KAA0B;QACxD,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,cAAc,CAAC,UAAoB,EAAE,MAAgB,EAAE,KAAa,EAAE,OAAgB;QACrF,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,OAAO,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAClD,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1D,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnB,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACP,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC/C,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;YACrB,UAAU,EAAE,cAAc,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YACtF,UAAU,EAAE,sBAAsB,UAAU,oQAAoQ;YAChT,SAAS,EAAE,0JAA0J;SACrK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACb,CAAC;IAED,iBAAiB,CAAC,KAAa,EAAE,UAAoB;QACpD,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACnD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;QAClD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,UAAU,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;QAC1F,IAAI,eAAe;YAAE,OAAO,eAAe,CAAC;QAC5C,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACxC,MAAM,WAAW,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;mBACtB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;mBACnB,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACvG,CAAC,CAAC,CAAC;QACH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC"}