oc-pilot 0.0.0-stage → 0.5.1

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 (123) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/CONTRIBUTING.md +43 -0
  3. package/Dockerfile +32 -0
  4. package/LICENSE +21 -0
  5. package/README.md +665 -2
  6. package/README.ru.md +523 -0
  7. package/SECURITY.md +42 -0
  8. package/action.yml +68 -0
  9. package/dist/cli.js +120 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/cli.test.js +559 -0
  12. package/dist/cli.test.js.map +1 -0
  13. package/dist/commands/custom.js +87 -0
  14. package/dist/commands/custom.js.map +1 -0
  15. package/dist/commands/docgen.js +256 -0
  16. package/dist/commands/docgen.js.map +1 -0
  17. package/dist/commands/doctor.js +334 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/fix.js +282 -0
  20. package/dist/commands/fix.js.map +1 -0
  21. package/dist/commands/init.js +59 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/commands/review.js +77 -0
  24. package/dist/commands/review.js.map +1 -0
  25. package/dist/commands/scan.js +102 -0
  26. package/dist/commands/scan.js.map +1 -0
  27. package/dist/commands/setup.js +443 -0
  28. package/dist/commands/setup.js.map +1 -0
  29. package/dist/commands/test-fix.js +181 -0
  30. package/dist/commands/test-fix.js.map +1 -0
  31. package/dist/core/command.js +69 -0
  32. package/dist/core/command.js.map +1 -0
  33. package/dist/core/config.js +277 -0
  34. package/dist/core/config.js.map +1 -0
  35. package/dist/core/config.test.js +145 -0
  36. package/dist/core/config.test.js.map +1 -0
  37. package/dist/core/diff-source.js +98 -0
  38. package/dist/core/diff-source.js.map +1 -0
  39. package/dist/core/diff.js +168 -0
  40. package/dist/core/diff.js.map +1 -0
  41. package/dist/core/diff.test.js +94 -0
  42. package/dist/core/diff.test.js.map +1 -0
  43. package/dist/core/engine.js +179 -0
  44. package/dist/core/engine.js.map +1 -0
  45. package/dist/core/engine.test.js +143 -0
  46. package/dist/core/engine.test.js.map +1 -0
  47. package/dist/core/errors.js +21 -0
  48. package/dist/core/errors.js.map +1 -0
  49. package/dist/core/file-context.js +58 -0
  50. package/dist/core/file-context.js.map +1 -0
  51. package/dist/core/file-context.test.js +58 -0
  52. package/dist/core/file-context.test.js.map +1 -0
  53. package/dist/core/findings.js +110 -0
  54. package/dist/core/findings.js.map +1 -0
  55. package/dist/core/findings.test.js +62 -0
  56. package/dist/core/findings.test.js.map +1 -0
  57. package/dist/core/format.js +31 -0
  58. package/dist/core/format.js.map +1 -0
  59. package/dist/core/format.test.js +26 -0
  60. package/dist/core/format.test.js.map +1 -0
  61. package/dist/core/git.js +137 -0
  62. package/dist/core/git.js.map +1 -0
  63. package/dist/core/io.js +57 -0
  64. package/dist/core/io.js.map +1 -0
  65. package/dist/core/lang.js +17 -0
  66. package/dist/core/lang.js.map +1 -0
  67. package/dist/core/log.js +40 -0
  68. package/dist/core/log.js.map +1 -0
  69. package/dist/core/opencode.js +345 -0
  70. package/dist/core/opencode.js.map +1 -0
  71. package/dist/core/opencode.test.js +59 -0
  72. package/dist/core/opencode.test.js.map +1 -0
  73. package/dist/core/options.js +142 -0
  74. package/dist/core/options.js.map +1 -0
  75. package/dist/core/parse.js +54 -0
  76. package/dist/core/parse.js.map +1 -0
  77. package/dist/core/patch.js +155 -0
  78. package/dist/core/patch.js.map +1 -0
  79. package/dist/core/patch.test.js +70 -0
  80. package/dist/core/patch.test.js.map +1 -0
  81. package/dist/core/process.js +27 -0
  82. package/dist/core/process.js.map +1 -0
  83. package/dist/core/project.js +191 -0
  84. package/dist/core/project.js.map +1 -0
  85. package/dist/core/project.test.js +75 -0
  86. package/dist/core/project.test.js.map +1 -0
  87. package/dist/core/prompt.js +255 -0
  88. package/dist/core/prompt.js.map +1 -0
  89. package/dist/core/prompt.test.js +106 -0
  90. package/dist/core/prompt.test.js.map +1 -0
  91. package/dist/core/rules.js +64 -0
  92. package/dist/core/rules.js.map +1 -0
  93. package/dist/core/rules.test.js +72 -0
  94. package/dist/core/rules.test.js.map +1 -0
  95. package/dist/core/run.js +255 -0
  96. package/dist/core/run.js.map +1 -0
  97. package/dist/core/secrets.js +331 -0
  98. package/dist/core/secrets.js.map +1 -0
  99. package/dist/core/secrets.test.js +121 -0
  100. package/dist/core/secrets.test.js.map +1 -0
  101. package/dist/core/snippets.js +130 -0
  102. package/dist/core/snippets.js.map +1 -0
  103. package/dist/core/snippets.test.js +55 -0
  104. package/dist/core/snippets.test.js.map +1 -0
  105. package/dist/mcp-http.test.js +146 -0
  106. package/dist/mcp-http.test.js.map +1 -0
  107. package/dist/mcp.js +913 -0
  108. package/dist/mcp.js.map +1 -0
  109. package/dist/mcp.test.js +128 -0
  110. package/dist/mcp.test.js.map +1 -0
  111. package/dist/setup.test.js +215 -0
  112. package/dist/setup.test.js.map +1 -0
  113. package/dist/types.js +2 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/version.js +2 -0
  116. package/dist/version.js.map +1 -0
  117. package/docker-compose.yml +18 -0
  118. package/docs/integrations.md +467 -0
  119. package/package.json +76 -4
  120. package/prompts/oc-pilot.en.md +104 -0
  121. package/prompts/oc-pilot.ru.md +106 -0
  122. package/server.json +21 -0
  123. package/skills/oc-pilot/SKILL.md +47 -0
@@ -0,0 +1,559 @@
1
+ import assert from "node:assert/strict";
2
+ import { chmodSync, mkdirSync, mkdtempSync, rmSync, writeFileSync, existsSync, readFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { delimiter, join, resolve } from "node:path";
5
+ import { spawnSync } from "node:child_process";
6
+ import { test } from "node:test";
7
+ const CLI = resolve("dist/cli.js");
8
+ const AWS_KEY = ["AKIA", "IOSFODNN7EXAMPLE"].join("");
9
+ function runCli(args, cwd, extraEnv = {}) {
10
+ const result = spawnSync(process.execPath, [CLI, ...args], {
11
+ cwd: cwd ?? process.cwd(),
12
+ encoding: "utf8",
13
+ env: { ...process.env, NO_COLOR: "1", ...extraEnv },
14
+ maxBuffer: 16 * 1024 * 1024,
15
+ });
16
+ return {
17
+ status: result.status,
18
+ stdout: result.stdout ?? "",
19
+ stderr: result.stderr ?? "",
20
+ };
21
+ }
22
+ function installFakeOpenCode(dir) {
23
+ const script = join(dir, "fake-opencode.js");
24
+ writeFileSync(script, [
25
+ 'let data = "";',
26
+ 'process.stdin.on("data", (chunk) => { data += chunk; });',
27
+ 'process.stdin.on("end", () => {',
28
+ ' if (process.env.FAKE_FAIL === "1") {',
29
+ ' console.log(JSON.stringify({ type: "error", error: "fake provider failure" }));',
30
+ " process.exit(1);",
31
+ " }",
32
+ ' if (process.env.FAKE_REQUIRE_CONFIG === "1") {',
33
+ ' const cfg = JSON.parse(process.env.OPENCODE_CONFIG_CONTENT || "{}");',
34
+ ' const def = cfg.agents && cfg.agents["oc-pilot"];',
35
+ ' if (!def || def.steps !== 8 || !def.permissions.some((p) => p.action === "read" && p.effect === "allow")) {',
36
+ ' console.log(JSON.stringify({ type: "error", error: "missing repo agent config" }));',
37
+ " process.exit(1);",
38
+ " }",
39
+ " }",
40
+ ' if (process.env.FAKE_REQUIRE_ISOLATED === "1") {',
41
+ ' if (process.env.OPENCODE_CONFIG_CONTENT || !process.cwd().includes("oc-pilot-")) {',
42
+ ' console.log(JSON.stringify({ type: "error", error: "expected isolated temp project" }));',
43
+ " process.exit(1);",
44
+ " }",
45
+ " }",
46
+ ' console.log(JSON.stringify({ type: "step_start", sessionID: "ses_fake" }));',
47
+ ' const lang = process.env.FAKE_LANG === "ru" ? "ru" : "en";',
48
+ ' let body = process.env.FAKE_CRITICAL === "1"',
49
+ ' ? (lang === "ru" ? "### Анализ: Критическая проблема.\\n\\n#### Замечания / Действия\\n- **🔴 Critical `wallet.go:10`**: nil pointer.\\n\\n#### Решение\\n```go\\nfix\\n```" : "### Analysis: Critical issue.\\n\\n#### Findings / Actions\\n- **🔴 Critical `wallet.go:10`**: nil pointer.\\n\\n#### Solution\\n```go\\nfix\\n```")',
50
+ ' : (lang === "ru" ? "### Анализ: OK\\n\\n#### Замечания / Действия\\n- **🔵 Note**: test\\n\\n#### Решение\\n```go\\nfunc f() {}\\n```" : "### Analysis: OK\\n\\n#### Findings / Actions\\n- **🔵 Note**: test\\n\\n#### Solution\\n```go\\nfunc f() {}\\n```");',
51
+ ' if (process.env.FAKE_PATCH_TEXT) {',
52
+ ' const fence = String.fromCharCode(96, 96, 96);',
53
+ ' body = ["### Analysis: patch.", "", "#### Findings / Actions", "- **🔵 Note**: test", "", "#### Solution", fence + "diff", process.env.FAKE_PATCH_TEXT, fence].join("\\n");',
54
+ " }",
55
+ ' console.log(JSON.stringify({ type: "text", part: { text: body } }));',
56
+ ' console.log(JSON.stringify({ type: "step_finish", part: { cost: 0 } }));',
57
+ "});",
58
+ "",
59
+ ].join("\n"));
60
+ const cli = join(dir, process.platform === "win32" ? "opencode.cmd" : "opencode");
61
+ const content = process.platform === "win32"
62
+ ? `@echo off\r\nnode "${script}"\r\n`
63
+ : `#!/bin/sh\nexec node "${script}"\n`;
64
+ writeFileSync(cli, content);
65
+ if (process.platform !== "win32")
66
+ chmodSync(cli, 0o755);
67
+ const pathKey = Object.keys(process.env).find((key) => key.toLowerCase() === "path") ?? "PATH";
68
+ return {
69
+ [pathKey]: `${dir}${delimiter}${process.env[pathKey] ?? ""}`,
70
+ };
71
+ }
72
+ function fixtureDiff() {
73
+ return [
74
+ "diff --git a/wallet.go b/wallet.go",
75
+ "--- a/wallet.go",
76
+ "+++ b/wallet.go",
77
+ "@@ -10,2 +10,3 @@ func DeductBalance(u *User, amount int) error {",
78
+ " }",
79
+ `+ apiKey := "${AWS_KEY}"`,
80
+ " return nil",
81
+ "",
82
+ ].join("\n");
83
+ }
84
+ test("review --dry-run composes the prompt without calling the model", () => {
85
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
86
+ try {
87
+ const diffPath = join(dir, "changes.diff");
88
+ writeFileSync(diffPath, fixtureDiff());
89
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--dry-run"]);
90
+ assert.equal(result.status, 0, result.stderr);
91
+ assert.ok(result.stdout.includes("PROJECT_TYPE: Go"));
92
+ assert.ok(result.stdout.includes("RECIPE: review"));
93
+ assert.ok(result.stdout.includes("[REDACTED:AWS Access Key ID]"));
94
+ assert.ok(!result.stdout.includes(AWS_KEY));
95
+ assert.match(result.stderr, /Найдено потенциальных секретов: 1/);
96
+ assert.match(result.stderr, /AWS Access Key ID/);
97
+ }
98
+ finally {
99
+ rmSync(dir, { recursive: true, force: true });
100
+ }
101
+ });
102
+ test("review --engine openai dry-run uses full-file context without OpenCode", () => {
103
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
104
+ try {
105
+ const diffPath = join(dir, "changes.diff");
106
+ writeFileSync(diffPath, fixtureDiff());
107
+ writeFileSync(join(dir, "wallet.go"), "package wallet\n\nfunc DeductBalance() {}\n");
108
+ const result = runCli([
109
+ "review",
110
+ "--diff",
111
+ diffPath,
112
+ "--cwd",
113
+ dir,
114
+ "--dry-run",
115
+ "--json",
116
+ "--engine",
117
+ "openai",
118
+ "--model",
119
+ "test-model",
120
+ "--base-url",
121
+ "https://api.example.com/v1",
122
+ ]);
123
+ assert.equal(result.status, 0, result.stderr);
124
+ const payload = JSON.parse(result.stdout);
125
+ assert.equal(payload.engine, "openai");
126
+ assert.equal(payload.baseUrl, "https://api.example.com/v1");
127
+ assert.equal(payload.repoContext, false);
128
+ assert.equal(payload.fileContext, 1);
129
+ assert.match(payload.input, /REPO_CONTEXT: disabled/);
130
+ assert.match(payload.input, /FULL_FILE_CONTEXT/);
131
+ }
132
+ finally {
133
+ rmSync(dir, { recursive: true, force: true });
134
+ }
135
+ });
136
+ test("review --dry-run includes project rules", () => {
137
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
138
+ try {
139
+ const diffPath = join(dir, "changes.diff");
140
+ writeFileSync(diffPath, fixtureDiff());
141
+ mkdirSync(join(dir, ".oc-pilot"));
142
+ writeFileSync(join(dir, ".oc-pilot", "rules.md"), "Always mention the retry policy.");
143
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--dry-run"]);
144
+ assert.equal(result.status, 0, result.stderr);
145
+ assert.ok(result.stdout.includes("PROJECT_RULES"));
146
+ assert.ok(result.stdout.includes("Always mention the retry policy."));
147
+ }
148
+ finally {
149
+ rmSync(dir, { recursive: true, force: true });
150
+ }
151
+ });
152
+ test("review fails when an explicit rules file is missing", () => {
153
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
154
+ try {
155
+ const diffPath = join(dir, "changes.diff");
156
+ writeFileSync(diffPath, fixtureDiff());
157
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--rules", "missing.md"]);
158
+ assert.equal(result.status, 2);
159
+ assert.match(result.stderr, /Файл правил не найден/);
160
+ }
161
+ finally {
162
+ rmSync(dir, { recursive: true, force: true });
163
+ }
164
+ });
165
+ test("review --dry-run --fail-on-secrets exits 3 and explains why", () => {
166
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
167
+ try {
168
+ const diffPath = join(dir, "changes.diff");
169
+ writeFileSync(diffPath, fixtureDiff());
170
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--dry-run", "--fail-on-secrets"]);
171
+ assert.equal(result.status, 3);
172
+ assert.match(result.stderr, /--fail-on-secrets: обнаружено critical-секретов: 1/);
173
+ }
174
+ finally {
175
+ rmSync(dir, { recursive: true, force: true });
176
+ }
177
+ });
178
+ test("review parses OpenCode JSON events and returns structured output", () => {
179
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
180
+ try {
181
+ writeFileSync(join(dir, ".oc-pilot.json"), "{}");
182
+ const diffPath = join(dir, "changes.diff");
183
+ writeFileSync(diffPath, [
184
+ "diff --git a/wallet.go b/wallet.go",
185
+ "--- a/wallet.go",
186
+ "+++ b/wallet.go",
187
+ "@@ -1,1 +1,2 @@",
188
+ " package wallet",
189
+ "+func f() {}",
190
+ "",
191
+ ].join("\n"));
192
+ const env = installFakeOpenCode(dir);
193
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--json"], dir, env);
194
+ assert.equal(result.status, 0, result.stderr);
195
+ const payload = JSON.parse(result.stdout);
196
+ assert.equal(payload.projectType, "Go");
197
+ assert.match(payload.analysis, /### Analysis:/);
198
+ assert.equal(payload.meta.sessionID, "ses_fake");
199
+ assert.equal(payload.meta.agent, "oc-pilot");
200
+ assert.equal(payload.meta.formatValid, true);
201
+ assert.equal(payload.meta.cost, 0);
202
+ }
203
+ finally {
204
+ rmSync(dir, { recursive: true, force: true });
205
+ }
206
+ });
207
+ test("--lang ru uses the Russian prompt and accepts Russian output", () => {
208
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
209
+ try {
210
+ writeFileSync(join(dir, ".oc-pilot.json"), "{}");
211
+ const diffPath = join(dir, "changes.diff");
212
+ writeFileSync(diffPath, [
213
+ "diff --git a/wallet.go b/wallet.go",
214
+ "--- a/wallet.go",
215
+ "+++ b/wallet.go",
216
+ "@@ -1,1 +1,2 @@",
217
+ " package wallet",
218
+ "+func f() {}",
219
+ "",
220
+ ].join("\n"));
221
+ const env = installFakeOpenCode(dir);
222
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--lang", "ru", "--json"], dir, { ...env, FAKE_LANG: "ru" });
223
+ assert.equal(result.status, 0, result.stderr);
224
+ const payload = JSON.parse(result.stdout);
225
+ assert.match(payload.analysis, /### Анализ:/);
226
+ assert.doesNotMatch(payload.analysis, /### Analysis:/);
227
+ }
228
+ finally {
229
+ rmSync(dir, { recursive: true, force: true });
230
+ }
231
+ });
232
+ test("review propagates OpenCode error events", () => {
233
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
234
+ try {
235
+ writeFileSync(join(dir, ".oc-pilot.json"), "{}");
236
+ const diffPath = join(dir, "changes.diff");
237
+ writeFileSync(diffPath, [
238
+ "diff --git a/wallet.go b/wallet.go",
239
+ "--- a/wallet.go",
240
+ "+++ b/wallet.go",
241
+ "@@ -1,1 +1,2 @@",
242
+ " package wallet",
243
+ "+func f() {}",
244
+ "",
245
+ ].join("\n"));
246
+ const env = installFakeOpenCode(dir);
247
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--json"], dir, { ...env, FAKE_FAIL: "1" });
248
+ assert.equal(result.status, 1);
249
+ assert.match(result.stderr, /fake provider failure/);
250
+ }
251
+ finally {
252
+ rmSync(dir, { recursive: true, force: true });
253
+ }
254
+ });
255
+ test("review passes a read-only repo agent config to OpenCode", () => {
256
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
257
+ try {
258
+ const diffPath = join(dir, "changes.diff");
259
+ writeFileSync(diffPath, fixtureDiff());
260
+ const env = installFakeOpenCode(dir);
261
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--json"], dir, {
262
+ ...env,
263
+ FAKE_REQUIRE_CONFIG: "1",
264
+ });
265
+ assert.equal(result.status, 0, result.stderr);
266
+ const payload = JSON.parse(result.stdout);
267
+ assert.equal(payload.meta.repoContext, true);
268
+ }
269
+ finally {
270
+ rmSync(dir, { recursive: true, force: true });
271
+ }
272
+ });
273
+ test("--no-repo-context includes full changed files in the prompt", () => {
274
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
275
+ try {
276
+ writeFileSync(join(dir, "wallet.go"), "package wallet\n\nfunc helper() {}\n");
277
+ const diffPath = join(dir, "changes.diff");
278
+ writeFileSync(diffPath, fixtureDiff());
279
+ const result = runCli([
280
+ "review",
281
+ "--diff",
282
+ diffPath,
283
+ "--cwd",
284
+ dir,
285
+ "--dry-run",
286
+ "--no-repo-context",
287
+ ]);
288
+ assert.equal(result.status, 0, result.stderr);
289
+ assert.ok(result.stdout.includes("FULL_FILE_CONTEXT"));
290
+ assert.ok(result.stdout.includes("func helper() {}"));
291
+ assert.ok(result.stdout.includes("REPO_CONTEXT: disabled"));
292
+ }
293
+ finally {
294
+ rmSync(dir, { recursive: true, force: true });
295
+ }
296
+ });
297
+ test("--no-repo-context uses the isolated diff-only agent", () => {
298
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
299
+ try {
300
+ const diffPath = join(dir, "changes.diff");
301
+ writeFileSync(diffPath, fixtureDiff());
302
+ const env = installFakeOpenCode(dir);
303
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--json", "--no-repo-context"], dir, {
304
+ ...env,
305
+ FAKE_REQUIRE_ISOLATED: "1",
306
+ });
307
+ assert.equal(result.status, 0, result.stderr);
308
+ const payload = JSON.parse(result.stdout);
309
+ assert.equal(payload.meta.repoContext, false);
310
+ }
311
+ finally {
312
+ rmSync(dir, { recursive: true, force: true });
313
+ }
314
+ });
315
+ test("--fail-on critical exits 3 and exposes structured findings", () => {
316
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
317
+ try {
318
+ const diffPath = join(dir, "changes.diff");
319
+ writeFileSync(diffPath, fixtureDiff());
320
+ const env = installFakeOpenCode(dir);
321
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--json", "--fail-on", "critical"], dir, { ...env, FAKE_CRITICAL: "1" });
322
+ assert.equal(result.status, 3, result.stderr);
323
+ const payload = JSON.parse(result.stdout);
324
+ assert.equal(payload.findings.length, 1);
325
+ assert.equal(payload.findings[0]?.severity, "critical");
326
+ assert.equal(payload.findings[0]?.location, "wallet.go:10");
327
+ assert.equal(payload.meta.findings.critical, 1);
328
+ assert.match(result.stderr, /--fail-on critical/);
329
+ }
330
+ finally {
331
+ rmSync(dir, { recursive: true, force: true });
332
+ }
333
+ });
334
+ test("--fail-on warning does not fail on style-only output", () => {
335
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
336
+ try {
337
+ const diffPath = join(dir, "changes.diff");
338
+ writeFileSync(diffPath, fixtureDiff());
339
+ const env = installFakeOpenCode(dir);
340
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--json", "--fail-on", "warning"], dir, env);
341
+ assert.equal(result.status, 0, result.stderr);
342
+ }
343
+ finally {
344
+ rmSync(dir, { recursive: true, force: true });
345
+ }
346
+ });
347
+ test("scan --json finds secrets, redacts them and exits 1", () => {
348
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
349
+ try {
350
+ const diffPath = join(dir, "changes.diff");
351
+ writeFileSync(diffPath, fixtureDiff());
352
+ const result = runCli(["scan", "--diff", diffPath, "--cwd", dir, "--json"]);
353
+ assert.equal(result.status, 1, result.stderr);
354
+ const payload = JSON.parse(result.stdout);
355
+ assert.equal(payload.findings.length, 1);
356
+ assert.equal(payload.findings[0]?.kind, "AWS Access Key ID");
357
+ assert.equal(payload.findings[0]?.line, 11);
358
+ assert.equal(payload.meta.critical, 1);
359
+ assert.ok(!result.stdout.includes(AWS_KEY));
360
+ }
361
+ finally {
362
+ rmSync(dir, { recursive: true, force: true });
363
+ }
364
+ });
365
+ test("review with an empty diff is a successful no-op", () => {
366
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
367
+ try {
368
+ const diffPath = join(dir, "empty.diff");
369
+ writeFileSync(diffPath, "");
370
+ const result = runCli(["review", "--diff", diffPath, "--cwd", dir, "--dry-run"]);
371
+ assert.equal(result.status, 0, result.stderr);
372
+ assert.equal(result.stdout, "");
373
+ assert.match(result.stderr, /Изменений нет/);
374
+ }
375
+ finally {
376
+ rmSync(dir, { recursive: true, force: true });
377
+ }
378
+ });
379
+ test("--help and version work", () => {
380
+ const help = runCli(["--help"]);
381
+ assert.equal(help.status, 0);
382
+ assert.match(help.stdout, /oc-pilot/);
383
+ assert.match(help.stdout, /scan/);
384
+ assert.match(help.stdout, /mcp/);
385
+ assert.match(help.stdout, /doctor/);
386
+ const mcpHelp = runCli(["mcp", "--help"]);
387
+ assert.equal(mcpHelp.status, 0);
388
+ assert.match(mcpHelp.stdout, /--read-only/);
389
+ const version = runCli(["--version"]);
390
+ assert.equal(version.status, 0);
391
+ assert.match(version.stdout, /^oc-pilot \d+\.\d+\.\d+/);
392
+ });
393
+ test("init writes a config file", () => {
394
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-"));
395
+ try {
396
+ const result = runCli(["init", "--cwd", dir, "--json"]);
397
+ assert.equal(result.status, 0, result.stderr);
398
+ const path = join(dir, ".oc-pilot.json");
399
+ assert.ok(existsSync(path));
400
+ assert.match(readFileSync(path, "utf8"), /"agent": "oc-pilot"/);
401
+ }
402
+ finally {
403
+ rmSync(dir, { recursive: true, force: true });
404
+ }
405
+ });
406
+ test("fix --keep-on-test-failure keeps a failing patch", () => {
407
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-fix-"));
408
+ try {
409
+ spawnSync("git", ["init", "-q"], { cwd: dir });
410
+ writeFileSync(join(dir, "file.txt"), "a\n", "utf8");
411
+ spawnSync("git", ["add", "file.txt"], { cwd: dir });
412
+ spawnSync("git", ["-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-qm", "init"], { cwd: dir });
413
+ const patch = [
414
+ "diff --git a/file.txt b/file.txt",
415
+ "--- a/file.txt",
416
+ "+++ b/file.txt",
417
+ "@@ -1 +1 @@",
418
+ "-a",
419
+ "+b",
420
+ "",
421
+ ].join("\n");
422
+ const diffPath = join(dir, "changes.diff");
423
+ writeFileSync(diffPath, patch);
424
+ const fake = installFakeOpenCode(dir);
425
+ const result = runCli([
426
+ "fix",
427
+ "--diff",
428
+ diffPath,
429
+ "--apply",
430
+ "--command",
431
+ "node -e \"process.exit(1)\"",
432
+ "--keep-on-test-failure",
433
+ "--rounds",
434
+ "1",
435
+ "--cwd",
436
+ dir,
437
+ "--json",
438
+ ], dir, { ...fake, FAKE_PATCH_TEXT: patch });
439
+ assert.equal(result.status, 1, result.stderr);
440
+ const payload = JSON.parse(result.stdout);
441
+ assert.equal(payload.applied, true);
442
+ assert.equal(payload.tests.exitCode, 1);
443
+ assert.match(payload.error, /patch kept/);
444
+ assert.equal(readFileSync(join(dir, "file.txt"), "utf8").replace(/\r\n/g, "\n"), "b\n");
445
+ }
446
+ finally {
447
+ rmSync(dir, { recursive: true, force: true });
448
+ }
449
+ });
450
+ test("fix rejects a patch that touches files outside the diff", () => {
451
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-fix-scope-"));
452
+ try {
453
+ spawnSync("git", ["init", "-q"], { cwd: dir });
454
+ writeFileSync(join(dir, "file.txt"), "a\n", "utf8");
455
+ writeFileSync(join(dir, "other.txt"), "keep\n", "utf8");
456
+ spawnSync("git", ["add", "file.txt", "other.txt"], { cwd: dir });
457
+ spawnSync("git", ["-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-qm", "init"], { cwd: dir });
458
+ const diff = [
459
+ "diff --git a/file.txt b/file.txt",
460
+ "--- a/file.txt",
461
+ "+++ b/file.txt",
462
+ "@@ -1 +1 @@",
463
+ "-a",
464
+ "+b",
465
+ "",
466
+ ].join("\n");
467
+ const patch = [
468
+ "diff --git a/other.txt b/other.txt",
469
+ "--- a/other.txt",
470
+ "+++ b/other.txt",
471
+ "@@ -1 +1 @@",
472
+ "-keep",
473
+ "+changed",
474
+ "",
475
+ ].join("\n");
476
+ const diffPath = join(dir, "changes.diff");
477
+ writeFileSync(diffPath, diff);
478
+ const fake = installFakeOpenCode(dir);
479
+ const result = runCli(["fix", "--diff", diffPath, "--apply", "--no-tests", "--cwd", dir, "--json"], dir, { ...fake, FAKE_PATCH_TEXT: patch });
480
+ assert.equal(result.status, 1, result.stderr);
481
+ assert.match(result.stderr, /вне diff/);
482
+ assert.equal(readFileSync(join(dir, "other.txt"), "utf8").replace(/\r\n/g, "\n"), "keep\n");
483
+ assert.equal(readFileSync(join(dir, "file.txt"), "utf8").replace(/\r\n/g, "\n"), "a\n");
484
+ }
485
+ finally {
486
+ rmSync(dir, { recursive: true, force: true });
487
+ }
488
+ });
489
+ test("fix allows a patch that only removes a secret", () => {
490
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-cli-fix-secret-"));
491
+ try {
492
+ spawnSync("git", ["init", "-q"], { cwd: dir });
493
+ writeFileSync(join(dir, "file.txt"), `token = "${AWS_KEY}"\na\n`, "utf8");
494
+ spawnSync("git", ["add", "file.txt"], { cwd: dir });
495
+ spawnSync("git", ["-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-qm", "init"], { cwd: dir });
496
+ const diff = [
497
+ "diff --git a/file.txt b/file.txt",
498
+ "--- a/file.txt",
499
+ "+++ b/file.txt",
500
+ "@@ -2 +2 @@",
501
+ "-a",
502
+ "+b",
503
+ "",
504
+ ].join("\n");
505
+ const patch = [
506
+ "diff --git a/file.txt b/file.txt",
507
+ "--- a/file.txt",
508
+ "+++ b/file.txt",
509
+ "@@ -1,2 +1 @@",
510
+ `-token = "${AWS_KEY}"`,
511
+ "-a",
512
+ "+b",
513
+ "",
514
+ ].join("\n");
515
+ const diffPath = join(dir, "changes.diff");
516
+ writeFileSync(diffPath, diff);
517
+ const fake = installFakeOpenCode(dir);
518
+ const result = runCli(["fix", "--diff", diffPath, "--cwd", dir, "--json"], dir, { ...fake, FAKE_PATCH_TEXT: patch });
519
+ assert.equal(result.status, 0, result.stderr);
520
+ const payload = JSON.parse(result.stdout);
521
+ assert.equal(payload.applied, false);
522
+ assert.match(payload.patch, /AKIA/);
523
+ }
524
+ finally {
525
+ rmSync(dir, { recursive: true, force: true });
526
+ }
527
+ });
528
+ test("doctor reports a local OpenAI-compatible setup", () => {
529
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-doctor-"));
530
+ try {
531
+ const result = runCli([
532
+ "doctor",
533
+ "--cwd",
534
+ dir,
535
+ "--json",
536
+ "--engine",
537
+ "openai",
538
+ "--model",
539
+ "test-model",
540
+ "--base-url",
541
+ "http://localhost:9/v1",
542
+ ]);
543
+ assert.equal(result.status, 0, result.stderr);
544
+ const report = JSON.parse(result.stdout);
545
+ assert.equal(report.engine, "openai");
546
+ assert.equal(report.summary.error, 0);
547
+ assert.equal(report.checks.find((check) => check.id === "model")?.status, "ok");
548
+ assert.equal(report.checks.find((check) => check.id === "credentials")?.status, "ok");
549
+ }
550
+ finally {
551
+ rmSync(dir, { recursive: true, force: true });
552
+ }
553
+ });
554
+ test("unknown commands return a usage error", () => {
555
+ const result = runCli(["nope"]);
556
+ assert.equal(result.status, 2);
557
+ assert.match(result.stderr, /Неизвестная команда/);
558
+ });
559
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7G,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAQtD,SAAS,MAAM,CAAC,IAAc,EAAE,GAAY,EAAE,WAAmC,EAAE;IACjF,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE;QACzD,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QACzB,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE;QACnD,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAC;IACH,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC7C,aAAa,CACX,MAAM,EACN;QACE,gBAAgB;QAChB,0DAA0D;QAC1D,iCAAiC;QACjC,wCAAwC;QACxC,qFAAqF;QACrF,sBAAsB;QACtB,KAAK;QACL,kDAAkD;QAClD,0EAA0E;QAC1E,uDAAuD;QACvD,iHAAiH;QACjH,2FAA2F;QAC3F,wBAAwB;QACxB,OAAO;QACP,KAAK;QACL,oDAAoD;QACpD,wFAAwF;QACxF,gGAAgG;QAChG,wBAAwB;QACxB,OAAO;QACP,KAAK;QACL,+EAA+E;QAC/E,8DAA8D;QAC9D,gDAAgD;QAChD,0UAA0U;QAC1U,qQAAqQ;QACrQ,sCAAsC;QACtC,oDAAoD;QACpD,iLAAiL;QACjL,KAAK;QACL,wEAAwE;QACxE,4EAA4E;QAC5E,KAAK;QACL,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAClF,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC1B,CAAC,CAAC,sBAAsB,MAAM,OAAO;QACrC,CAAC,CAAC,yBAAyB,MAAM,KAAK,CAAC;IAC3C,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC;IAC/F,OAAO;QACL,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE;KAC7D,CAAC;AACJ,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;QACL,oCAAoC;QACpC,iBAAiB;QACjB,iBAAiB;QACjB,mEAAmE;QACnE,QAAQ;QACR,mBAAmB,OAAO,GAAG;QAC7B,iBAAiB;QACjB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC1E,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;IAClF,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACvC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,6CAA6C,CAAC,CAAC;QAErF,MAAM,MAAM,GAAG,MAAM,CAAC;YACpB,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR,OAAO;YACP,GAAG;YACH,WAAW;YACX,QAAQ;YACR,UAAU;YACV,QAAQ;YACR,SAAS;YACT,YAAY;YACZ,YAAY;YACZ,4BAA4B;SAC7B,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAMvC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACvC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QAClC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,kCAAkC,CAAC,CAAC;QAEtF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QAC7F,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACvD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACtG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,oDAAoD,CAAC,CAAC;IACpF,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAC5E,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CACX,QAAQ,EACR;YACE,oCAAoC;YACpC,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,cAAc;YACd,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEF,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACxF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAIvC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;IACxE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CACX,QAAQ,EACR;YACE,oCAAoC;YACpC,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,cAAc;YACd,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEF,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CACnB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,EACtE,GAAG,EACH,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAC5B,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAyB,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACzD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CACX,QAAQ,EACR;YACE,oCAAoC;YACpC,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,cAAc;YACd,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QAEF,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CACnB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,EACtD,GAAG,EACH,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAC3B,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACvD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE;YACjF,GAAG,GAAG;YACN,mBAAmB,EAAE,GAAG;SACzB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAuC,CAAC;QAChF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,sCAAsC,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,CAAC;YACpB,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR,OAAO;YACP,GAAG;YACH,WAAW;YACX,mBAAmB;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC9D,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,mBAAmB,CAAC,EAAE,GAAG,EAAE;YACtG,GAAG,GAAG;YACN,qBAAqB,EAAE,GAAG;SAC3B,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAuC,CAAC;QAChF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4DAA4D,EAAE,GAAG,EAAE;IACtE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,CACnB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,EAC/E,GAAG,EACH,EAAE,GAAG,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,CAC/B,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAGvC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACpD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,CACnB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,EAC9E,GAAG,EACH,GAAG,CACJ,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAGvC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC3D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACrC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC5D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,SAAS,CACP,KAAK,EACL,CAAC,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,EACtF,EAAE,GAAG,EAAE,GAAG,EAAE,CACb,CAAC;QAEF,MAAM,KAAK,GAAG;YACZ,kCAAkC;YAClC,gBAAgB;YAChB,gBAAgB;YAChB,aAAa;YACb,IAAI;YACJ,IAAI;YACJ,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAE/B,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,CACnB;YACE,KAAK;YACL,QAAQ;YACR,QAAQ;YACR,SAAS;YACT,WAAW;YACX,6BAA6B;YAC7B,wBAAwB;YACxB,UAAU;YACV,GAAG;YACH,OAAO;YACP,GAAG;YACH,QAAQ;SACT,EACD,GAAG,EACH,EAAE,GAAG,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CACpC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAIvC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1F,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC;QACH,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxD,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,SAAS,CACP,KAAK,EACL,CAAC,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,EACtF,EAAE,GAAG,EAAE,GAAG,EAAE,CACb,CAAC;QAEF,MAAM,IAAI,GAAG;YACX,kCAAkC;YAClC,gBAAgB;YAChB,gBAAgB;YAChB,aAAa;YACb,IAAI;YACJ,IAAI;YACJ,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,KAAK,GAAG;YACZ,oCAAoC;YACpC,iBAAiB;YACjB,iBAAiB;YACjB,aAAa;YACb,OAAO;YACP,UAAU;YACV,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE9B,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,CACnB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,EAC5E,GAAG,EACH,EAAE,GAAG,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CACpC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC5F,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1F,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;IACzD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,YAAY,OAAO,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1E,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,SAAS,CACP,KAAK,EACL,CAAC,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,EACtF,EAAE,GAAG,EAAE,GAAG,EAAE,CACb,CAAC;QAEF,MAAM,IAAI,GAAG;YACX,kCAAkC;YAClC,gBAAgB;YAChB,gBAAgB;YAChB,aAAa;YACb,IAAI;YACJ,IAAI;YACJ,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,KAAK,GAAG;YACZ,kCAAkC;YAClC,gBAAgB;YAChB,gBAAgB;YAChB,eAAe;YACf,aAAa,OAAO,GAAG;YACvB,IAAI;YACJ,IAAI;YACJ,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE9B,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,CACnB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,EACnD,GAAG,EACH,EAAE,GAAG,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CACpC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAwC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC;YACpB,QAAQ;YACR,OAAO;YACP,GAAG;YACH,QAAQ;YACR,UAAU;YACV,QAAQ;YACR,SAAS;YACT,YAAY;YACZ,YAAY;YACZ,uBAAuB;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAItC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAChF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACxF,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC"}