@yuaone/core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/agent-loop.d.ts +40 -0
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +182 -4
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/benchmark-runner.d.ts +141 -0
  6. package/dist/benchmark-runner.d.ts.map +1 -0
  7. package/dist/benchmark-runner.js +526 -0
  8. package/dist/benchmark-runner.js.map +1 -0
  9. package/dist/codebase-context.d.ts +49 -0
  10. package/dist/codebase-context.d.ts.map +1 -1
  11. package/dist/codebase-context.js +146 -0
  12. package/dist/codebase-context.js.map +1 -1
  13. package/dist/cost-optimizer.d.ts +159 -0
  14. package/dist/cost-optimizer.d.ts.map +1 -0
  15. package/dist/cost-optimizer.js +406 -0
  16. package/dist/cost-optimizer.js.map +1 -0
  17. package/dist/execution-policy-engine.d.ts +133 -0
  18. package/dist/execution-policy-engine.d.ts.map +1 -0
  19. package/dist/execution-policy-engine.js +367 -0
  20. package/dist/execution-policy-engine.js.map +1 -0
  21. package/dist/failure-recovery.d.ts +228 -0
  22. package/dist/failure-recovery.d.ts.map +1 -0
  23. package/dist/failure-recovery.js +664 -0
  24. package/dist/failure-recovery.js.map +1 -0
  25. package/dist/hierarchical-planner.d.ts +69 -1
  26. package/dist/hierarchical-planner.d.ts.map +1 -1
  27. package/dist/hierarchical-planner.js +117 -0
  28. package/dist/hierarchical-planner.js.map +1 -1
  29. package/dist/impact-analyzer.d.ts +92 -0
  30. package/dist/impact-analyzer.d.ts.map +1 -0
  31. package/dist/impact-analyzer.js +615 -0
  32. package/dist/impact-analyzer.js.map +1 -0
  33. package/dist/index.d.ts +14 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +13 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/world-state.d.ts +87 -0
  38. package/dist/world-state.d.ts.map +1 -0
  39. package/dist/world-state.js +435 -0
  40. package/dist/world-state.js.map +1 -0
  41. package/package.json +11 -21
@@ -0,0 +1,615 @@
1
+ /**
2
+ * @module impact-analyzer
3
+ * @description Impact Analysis Engine — analyzes the impact of code changes,
4
+ * determines which files are affected, which tests should run, and whether
5
+ * changes are breaking.
6
+ *
7
+ * Uses regex-based analysis consistent with the rest of yuan-core.
8
+ * Integrates with CodebaseContext, TestIntelligence, and CrossFileRefactor.
9
+ */
10
+ import { readFile } from "node:fs/promises";
11
+ import { join, basename, dirname, extname, relative } from "node:path";
12
+ import { execFile } from "node:child_process";
13
+ import { promisify } from "node:util";
14
+ const execFileAsync = promisify(execFile);
15
+ // ─── Patterns ───
16
+ const EXPORT_PATTERN = /export\s+(?:default\s+)?(?:async\s+)?(?:function|class|const|let|var|type|interface|enum)\s+(\w+)/g;
17
+ const IMPORT_FROM_PATTERN = /(?:import|from)\s+['"]([^'"]+)['"]/g;
18
+ const TEST_FILE_PATTERNS = [
19
+ /\.test\.[jt]sx?$/,
20
+ /\.spec\.[jt]sx?$/,
21
+ /__tests__\//,
22
+ ];
23
+ const CONFIG_FILE_PATTERNS = [
24
+ /\.config\.[jt]s$/,
25
+ /tsconfig.*\.json$/,
26
+ /package\.json$/,
27
+ /\.env/,
28
+ /\.eslintrc/,
29
+ ];
30
+ const DOC_FILE_PATTERNS = [/\.md$/, /\.mdx$/, /\.txt$/, /CHANGELOG/];
31
+ const API_ENDPOINT_PATTERN = /\.(get|post|put|patch|delete|all|use)\s*\(\s*['"`]([^'"`]+)['"`]/g;
32
+ const FUNCTION_SIGNATURE_PATTERN = /export\s+(?:default\s+)?(?:async\s+)?function\s+(\w+)\s*\(([^)]*)\)/g;
33
+ // ─── Helpers ───
34
+ function classifyFile(filePath) {
35
+ if (TEST_FILE_PATTERNS.some((p) => p.test(filePath)))
36
+ return "test";
37
+ if (CONFIG_FILE_PATTERNS.some((p) => p.test(filePath)))
38
+ return "config";
39
+ if (DOC_FILE_PATTERNS.some((p) => p.test(filePath)))
40
+ return "doc";
41
+ return "source";
42
+ }
43
+ function fileNameWithoutExt(filePath) {
44
+ const base = basename(filePath);
45
+ const ext = extname(base);
46
+ return base.slice(0, -ext.length);
47
+ }
48
+ function extractExports(content) {
49
+ const exports = [];
50
+ const re = new RegExp(EXPORT_PATTERN.source, "g");
51
+ let m;
52
+ while ((m = re.exec(content)) !== null) {
53
+ exports.push(m[1]);
54
+ }
55
+ return exports;
56
+ }
57
+ function extractImportPaths(content) {
58
+ const paths = [];
59
+ const re = new RegExp(IMPORT_FROM_PATTERN.source, "g");
60
+ let m;
61
+ while ((m = re.exec(content)) !== null) {
62
+ paths.push(m[1]);
63
+ }
64
+ return paths;
65
+ }
66
+ function extractAPIs(content, filePath) {
67
+ const apis = [];
68
+ const re = new RegExp(API_ENDPOINT_PATTERN.source, "g");
69
+ let m;
70
+ while ((m = re.exec(content)) !== null) {
71
+ apis.push({
72
+ endpoint: `${m[1].toUpperCase()} ${m[2]}`,
73
+ functionName: m[1],
74
+ file: filePath,
75
+ changeType: "behavior",
76
+ });
77
+ }
78
+ return apis;
79
+ }
80
+ async function readFileSafe(filePath) {
81
+ try {
82
+ return await readFile(filePath, "utf-8");
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ async function gitDiff(projectPath, filePath) {
89
+ try {
90
+ const { stdout } = await execFileAsync("git", ["diff", "HEAD", "--", filePath], {
91
+ cwd: projectPath,
92
+ });
93
+ return stdout || null;
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ async function walkDir(dir, maxFiles = 5000) {
100
+ const { readdir } = await import("node:fs/promises");
101
+ const files = [];
102
+ const queue = [dir];
103
+ while (queue.length > 0 && files.length < maxFiles) {
104
+ const current = queue.shift();
105
+ try {
106
+ const entries = await readdir(current, { withFileTypes: true });
107
+ for (const entry of entries) {
108
+ if (entry.name.startsWith(".") || entry.name === "node_modules" || entry.name === "dist") {
109
+ continue;
110
+ }
111
+ const fullPath = join(current, entry.name);
112
+ if (entry.isDirectory()) {
113
+ queue.push(fullPath);
114
+ }
115
+ else if (/\.[jt]sx?$|\.json$/.test(entry.name)) {
116
+ files.push(fullPath);
117
+ }
118
+ }
119
+ }
120
+ catch {
121
+ // skip inaccessible directories
122
+ }
123
+ }
124
+ return files;
125
+ }
126
+ // ─── ImpactAnalyzer ───
127
+ export class ImpactAnalyzer {
128
+ projectPath;
129
+ maxDepth;
130
+ includeTests;
131
+ includeAPIs;
132
+ strictMode;
133
+ constructor(config) {
134
+ this.projectPath = config.projectPath;
135
+ this.maxDepth = config.maxDepth ?? 3;
136
+ this.includeTests = config.includeTests ?? true;
137
+ this.includeAPIs = config.includeAPIs ?? true;
138
+ this.strictMode = config.strictMode ?? false;
139
+ }
140
+ /**
141
+ * Full impact analysis for a set of changed files.
142
+ */
143
+ async analyzeChanges(changedFiles) {
144
+ try {
145
+ const [affectedFiles, affectedTests, affectedAPIs, breakingChanges] = await Promise.all([
146
+ this.collectAffectedFiles(changedFiles),
147
+ this.includeTests ? this.suggestTests(changedFiles) : Promise.resolve([]),
148
+ this.includeAPIs ? this.collectAffectedAPIs(changedFiles) : Promise.resolve([]),
149
+ this.detectBreaking(changedFiles),
150
+ ]);
151
+ const riskLevel = this.estimateRisk({
152
+ files: changedFiles,
153
+ linesChanged: affectedFiles.length * 20, // rough estimate
154
+ });
155
+ const summary = this.buildSummary(changedFiles, affectedFiles, affectedTests, breakingChanges, riskLevel);
156
+ const suggestedActions = this.buildSuggestedActions(affectedTests, breakingChanges, riskLevel);
157
+ return {
158
+ changedFiles,
159
+ affectedFiles,
160
+ affectedTests,
161
+ affectedAPIs,
162
+ breakingChanges,
163
+ riskLevel,
164
+ summary,
165
+ suggestedActions,
166
+ };
167
+ }
168
+ catch {
169
+ return {
170
+ changedFiles,
171
+ affectedFiles: [],
172
+ affectedTests: [],
173
+ affectedAPIs: [],
174
+ breakingChanges: [],
175
+ riskLevel: "minimal",
176
+ summary: "Impact analysis could not be completed.",
177
+ suggestedActions: [],
178
+ };
179
+ }
180
+ }
181
+ /**
182
+ * Find all files affected by changes to a specific file.
183
+ */
184
+ async findAffectedFiles(filePath) {
185
+ try {
186
+ const content = await readFileSafe(filePath);
187
+ if (!content)
188
+ return [];
189
+ const exports = extractExports(content);
190
+ const changedName = fileNameWithoutExt(filePath);
191
+ const projectFiles = await walkDir(this.projectPath);
192
+ const affected = [];
193
+ const seen = new Set();
194
+ // BFS through import graph
195
+ const queue = [];
196
+ // Find direct importers
197
+ for (const pf of projectFiles) {
198
+ if (pf === filePath)
199
+ continue;
200
+ const pfContent = await readFileSafe(pf);
201
+ if (!pfContent)
202
+ continue;
203
+ const importPaths = extractImportPaths(pfContent);
204
+ const importsChanged = importPaths.some((ip) => {
205
+ const importBase = basename(ip).replace(/\.[jt]sx?$/, "");
206
+ return (ip.includes(changedName) ||
207
+ importBase === changedName ||
208
+ ip.endsWith(relative(this.projectPath, filePath).replace(/\.[jt]sx?$/, "")));
209
+ });
210
+ if (importsChanged) {
211
+ queue.push({
212
+ file: pf,
213
+ depth: 1,
214
+ reason: `imports changed module "${changedName}"`,
215
+ confidence: 0.95,
216
+ });
217
+ }
218
+ }
219
+ // Process queue up to maxDepth
220
+ while (queue.length > 0) {
221
+ const { file, depth, reason, confidence } = queue.shift();
222
+ if (seen.has(file))
223
+ continue;
224
+ seen.add(file);
225
+ const fileType = classifyFile(file);
226
+ affected.push({
227
+ path: file,
228
+ reason,
229
+ confidence: Math.round(confidence * 100) / 100,
230
+ type: fileType,
231
+ });
232
+ if (depth < this.maxDepth) {
233
+ const transitiveName = fileNameWithoutExt(file);
234
+ for (const pf of projectFiles) {
235
+ if (seen.has(pf) || pf === file)
236
+ continue;
237
+ const pfContent = await readFileSafe(pf);
238
+ if (!pfContent)
239
+ continue;
240
+ const importPaths = extractImportPaths(pfContent);
241
+ if (importPaths.some((ip) => ip.includes(transitiveName))) {
242
+ queue.push({
243
+ file: pf,
244
+ depth: depth + 1,
245
+ reason: `transitively affected via "${transitiveName}" (depth ${depth + 1})`,
246
+ confidence: confidence * 0.7,
247
+ });
248
+ }
249
+ }
250
+ }
251
+ }
252
+ // If an export is a function/class used in test files, flag those too
253
+ if (this.includeTests) {
254
+ for (const pf of projectFiles) {
255
+ if (seen.has(pf) || !TEST_FILE_PATTERNS.some((p) => p.test(pf)))
256
+ continue;
257
+ const pfContent = await readFileSafe(pf);
258
+ if (!pfContent)
259
+ continue;
260
+ const usesExport = exports.some((exp) => pfContent.includes(exp));
261
+ if (usesExport) {
262
+ affected.push({
263
+ path: pf,
264
+ reason: `test for changed file "${changedName}"`,
265
+ confidence: 0.8,
266
+ type: "test",
267
+ });
268
+ }
269
+ }
270
+ }
271
+ return affected;
272
+ }
273
+ catch {
274
+ return [];
275
+ }
276
+ }
277
+ /**
278
+ * Estimate risk level for a set of changes.
279
+ */
280
+ estimateRisk(changes) {
281
+ let score = 0;
282
+ score += changes.files.length * 2;
283
+ score += changes.linesChanged / 100;
284
+ for (const file of changes.files) {
285
+ if (/config|package\.json|tsconfig/.test(file))
286
+ score += 5;
287
+ if (/index\.[jt]sx?$|main\.[jt]sx?$|app\.[jt]sx?$/.test(file))
288
+ score += 3;
289
+ }
290
+ if (changes.files.length > 10)
291
+ score += 5;
292
+ if (this.strictMode) {
293
+ score *= 1.3;
294
+ }
295
+ if (score <= 3)
296
+ return "minimal";
297
+ if (score <= 6)
298
+ return "low";
299
+ if (score <= 10)
300
+ return "moderate";
301
+ if (score <= 15)
302
+ return "high";
303
+ return "critical";
304
+ }
305
+ /**
306
+ * Suggest which tests should run for the given changed files.
307
+ */
308
+ async suggestTests(changedFiles) {
309
+ try {
310
+ const projectFiles = await walkDir(this.projectPath);
311
+ const testFiles = projectFiles.filter((f) => TEST_FILE_PATTERNS.some((p) => p.test(f)));
312
+ const tests = [];
313
+ const seen = new Set();
314
+ for (const changedFile of changedFiles) {
315
+ const changedName = fileNameWithoutExt(changedFile);
316
+ const changedDir = dirname(changedFile);
317
+ for (const tf of testFiles) {
318
+ if (seen.has(tf))
319
+ continue;
320
+ const testName = basename(tf);
321
+ // Direct test file by naming convention
322
+ if (testName === `${changedName}.test.ts` ||
323
+ testName === `${changedName}.test.tsx` ||
324
+ testName === `${changedName}.spec.ts` ||
325
+ testName === `${changedName}.spec.tsx`) {
326
+ seen.add(tf);
327
+ tests.push({
328
+ path: tf,
329
+ reason: `direct test for "${changedName}"`,
330
+ priority: "must_run",
331
+ });
332
+ continue;
333
+ }
334
+ // __tests__ directory convention
335
+ if (tf.includes("__tests__") &&
336
+ basename(tf).startsWith(changedName)) {
337
+ seen.add(tf);
338
+ tests.push({
339
+ path: tf,
340
+ reason: `__tests__ convention for "${changedName}"`,
341
+ priority: "must_run",
342
+ });
343
+ continue;
344
+ }
345
+ // Test imports the changed module
346
+ const tfContent = await readFileSafe(tf);
347
+ if (!tfContent)
348
+ continue;
349
+ const importPaths = extractImportPaths(tfContent);
350
+ if (importPaths.some((ip) => ip.includes(changedName))) {
351
+ seen.add(tf);
352
+ tests.push({
353
+ path: tf,
354
+ reason: `imports changed module "${changedName}"`,
355
+ priority: "should_run",
356
+ });
357
+ continue;
358
+ }
359
+ // Nearby test in same directory
360
+ if (dirname(tf) === changedDir && !seen.has(tf)) {
361
+ seen.add(tf);
362
+ tests.push({
363
+ path: tf,
364
+ reason: `nearby test in same directory`,
365
+ priority: "optional",
366
+ });
367
+ }
368
+ }
369
+ }
370
+ // Sort: must_run first, then should_run, then optional
371
+ const priorityOrder = { must_run: 0, should_run: 1, optional: 2 };
372
+ tests.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
373
+ return tests;
374
+ }
375
+ catch {
376
+ return [];
377
+ }
378
+ }
379
+ /**
380
+ * Detect breaking changes in the given files.
381
+ * If diffs are provided, analyzes them; otherwise attempts git diff.
382
+ */
383
+ async detectBreaking(changedFiles, diffs) {
384
+ try {
385
+ const breaking = [];
386
+ for (let i = 0; i < changedFiles.length; i++) {
387
+ const file = changedFiles[i];
388
+ const diff = diffs?.[i] ?? (await gitDiff(this.projectPath, file));
389
+ if (!diff)
390
+ continue;
391
+ const lines = diff.split("\n");
392
+ for (const line of lines) {
393
+ // Removed export
394
+ if (/^-\s*export\s+/.test(line) && !line.startsWith("---")) {
395
+ const exportMatch = line.match(/^-\s*export\s+(?:default\s+)?(?:async\s+)?(?:function|class|const|let|var|type|interface|enum)\s+(\w+)/);
396
+ if (exportMatch) {
397
+ // Check if it was renamed (corresponding + line with same kind)
398
+ const exportName = exportMatch[1];
399
+ const hasReplacement = lines.some((l) => new RegExp(`^\\+\\s*export\\s+.*\\b${exportName}\\b`).test(l));
400
+ if (!hasReplacement) {
401
+ breaking.push({
402
+ file,
403
+ description: `Removed export "${exportName}"`,
404
+ severity: "critical",
405
+ suggestion: `Restore the export or add a deprecation notice and re-export from a compatibility module.`,
406
+ });
407
+ }
408
+ }
409
+ }
410
+ // Changed function signature (removed params)
411
+ if (/^-\s*export\s+(?:default\s+)?(?:async\s+)?function\s+\w+\s*\(/.test(line) &&
412
+ !line.startsWith("---")) {
413
+ const oldSigMatch = line.match(/^-\s*export\s+(?:default\s+)?(?:async\s+)?function\s+(\w+)\s*\(([^)]*)\)/);
414
+ if (oldSigMatch) {
415
+ const fnName = oldSigMatch[1];
416
+ const oldParams = oldSigMatch[2]
417
+ .split(",")
418
+ .map((p) => p.trim())
419
+ .filter(Boolean);
420
+ // Find the new signature
421
+ const newSigLine = lines.find((l) => new RegExp(`^\\+\\s*export\\s+(?:default\\s+)?(?:async\\s+)?function\\s+${fnName}\\s*\\(`).test(l));
422
+ if (newSigLine) {
423
+ const newSigMatch = newSigLine.match(/function\s+\w+\s*\(([^)]*)\)/);
424
+ if (newSigMatch) {
425
+ const newParams = newSigMatch[1]
426
+ .split(",")
427
+ .map((p) => p.trim())
428
+ .filter(Boolean);
429
+ if (newParams.length < oldParams.length) {
430
+ breaking.push({
431
+ file,
432
+ description: `Function "${fnName}" lost parameters (${oldParams.length} → ${newParams.length})`,
433
+ severity: "high",
434
+ suggestion: `Make removed parameters optional or provide default values to maintain backward compatibility.`,
435
+ });
436
+ }
437
+ else if (newParams.length > oldParams.length) {
438
+ // Check if new params are optional
439
+ const addedParams = newParams.slice(oldParams.length);
440
+ const allOptional = addedParams.every((p) => p.includes("?") || p.includes("="));
441
+ if (!allOptional) {
442
+ breaking.push({
443
+ file,
444
+ description: `Function "${fnName}" added required parameters`,
445
+ severity: "high",
446
+ suggestion: `Make new parameters optional or provide default values.`,
447
+ });
448
+ }
449
+ }
450
+ }
451
+ }
452
+ }
453
+ }
454
+ }
455
+ // Check for renamed exports (export existed before, now different name)
456
+ const removedExports = lines
457
+ .filter((l) => /^-\s*export\s+/.test(l) && !l.startsWith("---"))
458
+ .map((l) => {
459
+ const m = l.match(/(?:function|class|const|let|var|type|interface|enum)\s+(\w+)/);
460
+ return m?.[1];
461
+ })
462
+ .filter(Boolean);
463
+ const addedExports = lines
464
+ .filter((l) => /^\+\s*export\s+/.test(l) && !l.startsWith("+++"))
465
+ .map((l) => {
466
+ const m = l.match(/(?:function|class|const|let|var|type|interface|enum)\s+(\w+)/);
467
+ return m?.[1];
468
+ })
469
+ .filter(Boolean);
470
+ // If same number removed & added, likely renames
471
+ if (removedExports.length > 0 && removedExports.length === addedExports.length) {
472
+ for (let j = 0; j < removedExports.length; j++) {
473
+ if (removedExports[j] !== addedExports[j]) {
474
+ // Already reported as removed? Skip duplication
475
+ if (!breaking.some((b) => b.description.includes(removedExports[j]))) {
476
+ breaking.push({
477
+ file,
478
+ description: `Export renamed: "${removedExports[j]}" → "${addedExports[j]}"`,
479
+ severity: "medium",
480
+ suggestion: `Add a re-export alias: export { ${addedExports[j]} as ${removedExports[j]} }`,
481
+ });
482
+ }
483
+ }
484
+ }
485
+ }
486
+ }
487
+ return breaking;
488
+ }
489
+ catch {
490
+ return [];
491
+ }
492
+ }
493
+ /**
494
+ * Format an impact report as compact markdown for LLM context injection.
495
+ */
496
+ formatForPrompt(report) {
497
+ const lines = [];
498
+ lines.push("## Impact Analysis");
499
+ lines.push(`**Risk Level:** ${report.riskLevel}`);
500
+ lines.push(`**Changed Files:** ${report.changedFiles.length}`);
501
+ lines.push(`**Affected Files:** ${report.affectedFiles.length}`);
502
+ lines.push("");
503
+ lines.push(report.summary);
504
+ if (report.breakingChanges.length > 0) {
505
+ lines.push("");
506
+ lines.push("### Breaking Changes");
507
+ for (const bc of report.breakingChanges) {
508
+ lines.push(`- **[${bc.severity}]** ${bc.description} (${bc.file})`);
509
+ lines.push(` → ${bc.suggestion}`);
510
+ }
511
+ }
512
+ if (report.affectedTests.length > 0) {
513
+ lines.push("");
514
+ lines.push("### Tests to Run");
515
+ const mustRun = report.affectedTests.filter((t) => t.priority === "must_run");
516
+ const shouldRun = report.affectedTests.filter((t) => t.priority === "should_run");
517
+ if (mustRun.length > 0) {
518
+ lines.push("**Must run:**");
519
+ for (const t of mustRun)
520
+ lines.push(`- ${t.path}`);
521
+ }
522
+ if (shouldRun.length > 0) {
523
+ lines.push("**Should run:**");
524
+ for (const t of shouldRun)
525
+ lines.push(`- ${t.path}`);
526
+ }
527
+ }
528
+ if (report.affectedAPIs.length > 0) {
529
+ lines.push("");
530
+ lines.push("### Affected APIs");
531
+ for (const api of report.affectedAPIs) {
532
+ lines.push(`- ${api.endpoint ?? api.functionName} (${api.changeType}) in ${api.file}`);
533
+ }
534
+ }
535
+ if (report.suggestedActions.length > 0) {
536
+ lines.push("");
537
+ lines.push("### Suggested Actions");
538
+ for (const action of report.suggestedActions) {
539
+ lines.push(`- ${action}`);
540
+ }
541
+ }
542
+ return lines.join("\n");
543
+ }
544
+ // ─── Private Helpers ───
545
+ async collectAffectedFiles(changedFiles) {
546
+ const all = [];
547
+ const seen = new Set();
548
+ for (const file of changedFiles) {
549
+ const affected = await this.findAffectedFiles(file);
550
+ for (const af of affected) {
551
+ if (!seen.has(af.path) && !changedFiles.includes(af.path)) {
552
+ seen.add(af.path);
553
+ all.push(af);
554
+ }
555
+ }
556
+ }
557
+ return all;
558
+ }
559
+ async collectAffectedAPIs(changedFiles) {
560
+ const apis = [];
561
+ for (const file of changedFiles) {
562
+ const content = await readFileSafe(file);
563
+ if (!content)
564
+ continue;
565
+ const fileAPIs = extractAPIs(content, file);
566
+ apis.push(...fileAPIs);
567
+ // Also extract exported functions as potential API surface
568
+ const exports = extractExports(content);
569
+ for (const exp of exports) {
570
+ if (!apis.some((a) => a.functionName === exp && a.file === file)) {
571
+ apis.push({
572
+ functionName: exp,
573
+ file,
574
+ changeType: "behavior",
575
+ });
576
+ }
577
+ }
578
+ }
579
+ return apis;
580
+ }
581
+ buildSummary(changedFiles, affectedFiles, affectedTests, breakingChanges, riskLevel) {
582
+ const parts = [];
583
+ parts.push(`${changedFiles.length} file(s) changed, affecting ${affectedFiles.length} other file(s).`);
584
+ if (affectedTests.length > 0) {
585
+ const mustRun = affectedTests.filter((t) => t.priority === "must_run").length;
586
+ parts.push(`${affectedTests.length} test(s) identified (${mustRun} must run).`);
587
+ }
588
+ if (breakingChanges.length > 0) {
589
+ const critical = breakingChanges.filter((b) => b.severity === "critical").length;
590
+ parts.push(`${breakingChanges.length} breaking change(s) detected${critical > 0 ? ` (${critical} critical)` : ""}.`);
591
+ }
592
+ parts.push(`Risk level: ${riskLevel}.`);
593
+ return parts.join(" ");
594
+ }
595
+ buildSuggestedActions(affectedTests, breakingChanges, riskLevel) {
596
+ const actions = [];
597
+ const mustRun = affectedTests.filter((t) => t.priority === "must_run");
598
+ if (mustRun.length > 0) {
599
+ actions.push(`Run ${mustRun.length} critical test(s) before merging.`);
600
+ }
601
+ for (const bc of breakingChanges) {
602
+ if (bc.severity === "critical" || bc.severity === "high") {
603
+ actions.push(bc.suggestion);
604
+ }
605
+ }
606
+ if (riskLevel === "high" || riskLevel === "critical") {
607
+ actions.push("Request a thorough code review before merging.");
608
+ }
609
+ if (riskLevel === "critical") {
610
+ actions.push("Consider splitting this change into smaller, incremental PRs.");
611
+ }
612
+ return actions;
613
+ }
614
+ }
615
+ //# sourceMappingURL=impact-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact-analyzer.js","sourceRoot":"","sources":["../src/impact-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAqD1C,mBAAmB;AAEnB,MAAM,cAAc,GAClB,oGAAoG,CAAC;AAEvG,MAAM,mBAAmB,GAAG,qCAAqC,CAAC;AAElE,MAAM,kBAAkB,GAAG;IACzB,kBAAkB;IAClB,kBAAkB;IAClB,aAAa;CACd,CAAC;AAEF,MAAM,oBAAoB,GAAG;IAC3B,kBAAkB;IAClB,mBAAmB;IACnB,gBAAgB;IAChB,OAAO;IACP,YAAY;CACb,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AAErE,MAAM,oBAAoB,GACxB,mEAAmE,CAAC;AAEtE,MAAM,0BAA0B,GAC9B,sEAAsE,CAAC;AAEzE,kBAAkB;AAElB,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACpE,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxE,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClD,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvD,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAClB,OAAe,EACf,QAAgB;IAEhB,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC;YACR,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;YACzC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,WAAmB,EACnB,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE;YAC9E,GAAG,EAAE,WAAW;SACjB,CAAC,CAAC;QACH,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,QAAQ,GAAG,IAAI;IACjD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;IAEpB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzF,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;qBAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yBAAyB;AAEzB,MAAM,OAAO,cAAc;IACR,WAAW,CAAS;IACpB,QAAQ,CAAS;IACjB,YAAY,CAAU;IACtB,WAAW,CAAU;IACrB,UAAU,CAAU;IAErC,YAAY,MAA4B;QACtC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,YAAsB;QACzC,IAAI,CAAC;YACH,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,CAAC,GACjE,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChB,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC;gBACvC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/E,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;aAClC,CAAC,CAAC;YAEL,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;gBAClC,KAAK,EAAE,YAAY;gBACnB,YAAY,EAAE,aAAa,CAAC,MAAM,GAAG,EAAE,EAAE,iBAAiB;aAC3D,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAC/B,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,EACf,SAAS,CACV,CAAC;YACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CACjD,aAAa,EACb,eAAe,EACf,SAAS,CACV,CAAC;YAEF,OAAO;gBACL,YAAY;gBACZ,aAAa;gBACb,aAAa;gBACb,YAAY;gBACZ,eAAe;gBACf,SAAS;gBACT,OAAO;gBACP,gBAAgB;aACjB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,YAAY;gBACZ,aAAa,EAAE,EAAE;gBACjB,aAAa,EAAE,EAAE;gBACjB,YAAY,EAAE,EAAE;gBAChB,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,yCAAyC;gBAClD,gBAAgB,EAAE,EAAE;aACrB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,QAAgB;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YAExB,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAmB,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAE/B,2BAA2B;YAC3B,MAAM,KAAK,GAA+E,EAAE,CAAC;YAE7F,wBAAwB;YACxB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;gBAC9B,IAAI,EAAE,KAAK,QAAQ;oBAAE,SAAS;gBAC9B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,CAAC,SAAS;oBAAE,SAAS;gBAEzB,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAClD,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;oBAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;oBAC1D,OAAO,CACL,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;wBACxB,UAAU,KAAK,WAAW;wBAC1B,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAC5E,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,IAAI,cAAc,EAAE,CAAC;oBACnB,KAAK,CAAC,IAAI,CAAC;wBACT,IAAI,EAAE,EAAE;wBACR,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,2BAA2B,WAAW,GAAG;wBACjD,UAAU,EAAE,IAAI;qBACjB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,+BAA+B;YAC/B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;gBAC3D,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEf,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBACpC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,IAAI;oBACV,MAAM;oBACN,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG;oBAC9C,IAAI,EAAE,QAAQ;iBACf,CAAC,CAAC;gBAEH,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC1B,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;oBAChD,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;wBAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI;4BAAE,SAAS;wBAC1C,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;wBACzC,IAAI,CAAC,SAAS;4BAAE,SAAS;wBAEzB,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;wBAClD,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;4BAC1D,KAAK,CAAC,IAAI,CAAC;gCACT,IAAI,EAAE,EAAE;gCACR,KAAK,EAAE,KAAK,GAAG,CAAC;gCAChB,MAAM,EAAE,8BAA8B,cAAc,YAAY,KAAK,GAAG,CAAC,GAAG;gCAC5E,UAAU,EAAE,UAAU,GAAG,GAAG;6BAC7B,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,sEAAsE;YACtE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;oBAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAAE,SAAS;oBAC1E,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;oBACzC,IAAI,CAAC,SAAS;wBAAE,SAAS;oBAEzB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;oBAClE,IAAI,UAAU,EAAE,CAAC;wBACf,QAAQ,CAAC,IAAI,CAAC;4BACZ,IAAI,EAAE,EAAE;4BACR,MAAM,EAAE,0BAA0B,WAAW,GAAG;4BAChD,UAAU,EAAE,GAAG;4BACf,IAAI,EAAE,MAAM;yBACb,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAkD;QAC7D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,KAAK,IAAI,OAAO,CAAC,YAAY,GAAG,GAAG,CAAC;QAEpC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;YAC3D,IAAI,8CAA8C,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;YAAE,KAAK,IAAI,CAAC,CAAC;QAE1C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,KAAK,IAAI,GAAG,CAAC;QACf,CAAC;QAED,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QACjC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,UAAU,CAAC;QACnC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,MAAM,CAAC;QAC/B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,YAAsB;QACvC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1C,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC1C,CAAC;YACF,MAAM,KAAK,GAAmB,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAE/B,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvC,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;gBACpD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;gBAExC,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;oBAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;wBAAE,SAAS;oBAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAE9B,wCAAwC;oBACxC,IACE,QAAQ,KAAK,GAAG,WAAW,UAAU;wBACrC,QAAQ,KAAK,GAAG,WAAW,WAAW;wBACtC,QAAQ,KAAK,GAAG,WAAW,UAAU;wBACrC,QAAQ,KAAK,GAAG,WAAW,WAAW,EACtC,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACb,KAAK,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,EAAE;4BACR,MAAM,EAAE,oBAAoB,WAAW,GAAG;4BAC1C,QAAQ,EAAE,UAAU;yBACrB,CAAC,CAAC;wBACH,SAAS;oBACX,CAAC;oBAED,iCAAiC;oBACjC,IACE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;wBACxB,QAAQ,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,EACpC,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACb,KAAK,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,EAAE;4BACR,MAAM,EAAE,6BAA6B,WAAW,GAAG;4BACnD,QAAQ,EAAE,UAAU;yBACrB,CAAC,CAAC;wBACH,SAAS;oBACX,CAAC;oBAED,kCAAkC;oBAClC,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;oBACzC,IAAI,CAAC,SAAS;wBAAE,SAAS;oBAEzB,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;oBAClD,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;wBACvD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACb,KAAK,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,EAAE;4BACR,MAAM,EAAE,2BAA2B,WAAW,GAAG;4BACjD,QAAQ,EAAE,YAAY;yBACvB,CAAC,CAAC;wBACH,SAAS;oBACX,CAAC;oBAED,gCAAgC;oBAChC,IAAI,OAAO,CAAC,EAAE,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;wBAChD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACb,KAAK,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,EAAE;4BACR,MAAM,EAAE,+BAA+B;4BACvC,QAAQ,EAAE,UAAU;yBACrB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,uDAAuD;YACvD,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE5E,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,YAAsB,EACtB,KAAgB;QAEhB,IAAI,CAAC;YACH,MAAM,QAAQ,GAA2B,EAAE,CAAC;YAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;gBACnE,IAAI,CAAC,IAAI;oBAAE,SAAS;gBAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,iBAAiB;oBACjB,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,wGAAwG,CACzG,CAAC;wBACF,IAAI,WAAW,EAAE,CAAC;4BAChB,gEAAgE;4BAChE,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;4BAClC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACtC,IAAI,MAAM,CAAC,0BAA0B,UAAU,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC9D,CAAC;4BAEF,IAAI,CAAC,cAAc,EAAE,CAAC;gCACpB,QAAQ,CAAC,IAAI,CAAC;oCACZ,IAAI;oCACJ,WAAW,EAAE,mBAAmB,UAAU,GAAG;oCAC7C,QAAQ,EAAE,UAAU;oCACpB,UAAU,EAAE,2FAA2F;iCACxG,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,8CAA8C;oBAC9C,IACE,+DAA+D,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC1E,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EACvB,CAAC;wBACD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,0EAA0E,CAC3E,CAAC;wBACF,IAAI,WAAW,EAAE,CAAC;4BAChB,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;4BAC9B,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC;iCAC7B,KAAK,CAAC,GAAG,CAAC;iCACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iCACpB,MAAM,CAAC,OAAO,CAAC,CAAC;4BAEnB,yBAAyB;4BACzB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAClC,IAAI,MAAM,CACR,+DAA+D,MAAM,SAAS,CAC/E,CAAC,IAAI,CAAC,CAAC,CAAC,CACV,CAAC;4BAEF,IAAI,UAAU,EAAE,CAAC;gCACf,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAClC,8BAA8B,CAC/B,CAAC;gCACF,IAAI,WAAW,EAAE,CAAC;oCAChB,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC;yCAC7B,KAAK,CAAC,GAAG,CAAC;yCACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;yCACpB,MAAM,CAAC,OAAO,CAAC,CAAC;oCAEnB,IAAI,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;wCACxC,QAAQ,CAAC,IAAI,CAAC;4CACZ,IAAI;4CACJ,WAAW,EAAE,aAAa,MAAM,sBAAsB,SAAS,CAAC,MAAM,MAAM,SAAS,CAAC,MAAM,GAAG;4CAC/F,QAAQ,EAAE,MAAM;4CAChB,UAAU,EAAE,gGAAgG;yCAC7G,CAAC,CAAC;oCACL,CAAC;yCAAM,IAAI,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;wCAC/C,mCAAmC;wCACnC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;wCACtD,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAC1C,CAAC;wCACF,IAAI,CAAC,WAAW,EAAE,CAAC;4CACjB,QAAQ,CAAC,IAAI,CAAC;gDACZ,IAAI;gDACJ,WAAW,EAAE,aAAa,MAAM,6BAA6B;gDAC7D,QAAQ,EAAE,MAAM;gDAChB,UAAU,EAAE,yDAAyD;6CACtE,CAAC,CAAC;wCACL,CAAC;oCACH,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,wEAAwE;gBACxE,MAAM,cAAc,GAAG,KAAK;qBACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;qBAC/D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACT,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;oBAClF,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChB,CAAC,CAAC;qBACD,MAAM,CAAC,OAAO,CAAa,CAAC;gBAE/B,MAAM,YAAY,GAAG,KAAK;qBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;qBAChE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACT,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;oBAClF,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChB,CAAC,CAAC;qBACD,MAAM,CAAC,OAAO,CAAa,CAAC;gBAE/B,iDAAiD;gBACjD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;oBAC/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC/C,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC1C,gDAAgD;4BAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gCACrE,QAAQ,CAAC,IAAI,CAAC;oCACZ,IAAI;oCACJ,WAAW,EAAE,oBAAoB,cAAc,CAAC,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,CAAC,GAAG;oCAC5E,QAAQ,EAAE,QAAQ;oCAClB,UAAU,EAAE,mCAAmC,YAAY,CAAC,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,IAAI;iCAC3F,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,MAAoB;QAClC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE3B,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnC,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,OAAO,EAAE,CAAC,WAAW,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;gBACpE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;YAC9E,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC;YAClF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC5B,KAAK,MAAM,CAAC,IAAI,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAC9B,KAAK,MAAM,CAAC,IAAI,SAAS;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC,UAAU,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACpC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,0BAA0B;IAElB,KAAK,CAAC,oBAAoB,CAChC,YAAsB;QAEtB,MAAM,GAAG,GAAmB,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACpD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBAClB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,YAAsB;QAEtB,MAAM,IAAI,GAAkB,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YAEvB,2DAA2D;YAC3D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YACxC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBACjE,IAAI,CAAC,IAAI,CAAC;wBACR,YAAY,EAAE,GAAG;wBACjB,IAAI;wBACJ,UAAU,EAAE,UAAU;qBACvB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,YAAY,CAClB,YAAsB,EACtB,aAA6B,EAC7B,aAA6B,EAC7B,eAAuC,EACvC,SAAoB;QAEpB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CACR,GAAG,YAAY,CAAC,MAAM,+BAA+B,aAAa,CAAC,MAAM,iBAAiB,CAC3F,CAAC;QAEF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;YAC9E,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,wBAAwB,OAAO,aAAa,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;YACjF,KAAK,CAAC,IAAI,CACR,GAAG,eAAe,CAAC,MAAM,+BAA+B,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CACzG,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,GAAG,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAEO,qBAAqB,CAC3B,aAA6B,EAC7B,eAAuC,EACvC,SAAoB;QAEpB,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,MAAM,mCAAmC,CAAC,CAAC;QACzE,CAAC;QAED,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;YACjC,IAAI,EAAE,CAAC,QAAQ,KAAK,UAAU,IAAI,EAAE,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAChF,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}