centaurus-cli 2.9.9 → 3.0.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 (61) hide show
  1. package/dist/cli-adapter.d.ts +10 -0
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +376 -170
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/context/handlers/docker-handler.d.ts.map +1 -1
  6. package/dist/context/handlers/docker-handler.js +2 -2
  7. package/dist/context/handlers/docker-handler.js.map +1 -1
  8. package/dist/context/handlers/ssh-handler.d.ts.map +1 -1
  9. package/dist/context/handlers/ssh-handler.js +3 -0
  10. package/dist/context/handlers/ssh-handler.js.map +1 -1
  11. package/dist/context/handlers/wsl-handler.d.ts.map +1 -1
  12. package/dist/context/handlers/wsl-handler.js +9 -3
  13. package/dist/context/handlers/wsl-handler.js.map +1 -1
  14. package/dist/index.js +49 -7
  15. package/dist/index.js.map +1 -1
  16. package/dist/mcp/mcp-server-manager.d.ts.map +1 -1
  17. package/dist/mcp/mcp-server-manager.js +17 -3
  18. package/dist/mcp/mcp-server-manager.js.map +1 -1
  19. package/dist/services/api-client.d.ts +4 -0
  20. package/dist/services/api-client.d.ts.map +1 -1
  21. package/dist/services/api-client.js +27 -18
  22. package/dist/services/api-client.js.map +1 -1
  23. package/dist/services/checkpoint-manager.d.ts +81 -44
  24. package/dist/services/checkpoint-manager.d.ts.map +1 -1
  25. package/dist/services/checkpoint-manager.js +1219 -693
  26. package/dist/services/checkpoint-manager.js.map +1 -1
  27. package/dist/services/conversation-manager.d.ts.map +1 -1
  28. package/dist/services/conversation-manager.js +3 -2
  29. package/dist/services/conversation-manager.js.map +1 -1
  30. package/dist/tools/enter-remote-session.d.ts +35 -0
  31. package/dist/tools/enter-remote-session.d.ts.map +1 -1
  32. package/dist/tools/enter-remote-session.js +5 -5
  33. package/dist/tools/enter-remote-session.js.map +1 -1
  34. package/dist/tools/file-ops.d.ts.map +1 -1
  35. package/dist/tools/file-ops.js +39 -0
  36. package/dist/tools/file-ops.js.map +1 -1
  37. package/dist/tools/get-diff.js +8 -2
  38. package/dist/tools/get-diff.js.map +1 -1
  39. package/dist/ui/components/App.d.ts +2 -0
  40. package/dist/ui/components/App.d.ts.map +1 -1
  41. package/dist/ui/components/App.js +71 -50
  42. package/dist/ui/components/App.js.map +1 -1
  43. package/dist/ui/components/ToolExecutionMessage.js +1 -1
  44. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  45. package/dist/utils/shell.d.ts.map +1 -1
  46. package/dist/utils/shell.js +12 -1
  47. package/dist/utils/shell.js.map +1 -1
  48. package/dist/utils/syntax-checker.d.ts.map +1 -1
  49. package/dist/utils/syntax-checker.js +26 -0
  50. package/dist/utils/syntax-checker.js.map +1 -1
  51. package/dist/utils/terminal-output.d.ts.map +1 -1
  52. package/dist/utils/terminal-output.js +10 -8
  53. package/dist/utils/terminal-output.js.map +1 -1
  54. package/dist/utils/text-clipboard.d.ts.map +1 -1
  55. package/dist/utils/text-clipboard.js +21 -8
  56. package/dist/utils/text-clipboard.js.map +1 -1
  57. package/package.json +6 -2
  58. package/dist/config/ConfigManager.d.ts +0 -62
  59. package/dist/config/ConfigManager.d.ts.map +0 -1
  60. package/dist/config/ConfigManager.js +0 -234
  61. package/dist/config/ConfigManager.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "centaurus-cli",
3
- "version": "2.9.9",
3
+ "version": "3.0.1",
4
4
  "description": "A powerful command-line AI coding assistant with Google Gemini support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -14,7 +14,8 @@
14
14
  "start": "node dist/index.js",
15
15
  "prepublishOnly": "npm run build",
16
16
  "postinstall": "node postinstall.js || true",
17
- "test": "echo \"Error: no test specified\" \u0026\u0026 exit 1"
17
+ "test": "node --experimental-vm-modules node_modules/.bin/jest --config jest.config.cjs",
18
+ "test:ci": "node --experimental-vm-modules node_modules/.bin/jest --config jest.config.cjs --ci --forceExit"
18
19
  },
19
20
  "keywords": [
20
21
  "ai",
@@ -77,10 +78,13 @@
77
78
  },
78
79
  "devDependencies": {
79
80
  "@types/inquirer": "^9.0.9",
81
+ "@types/jest": "^30.0.0",
80
82
  "@types/node": "^24.7.2",
81
83
  "@types/react": "^18.3.26",
82
84
  "@types/ssh2": "^1.15.0",
85
+ "jest": "^30.2.0",
83
86
  "prettier": "^3.6.2",
87
+ "ts-jest": "^29.4.6",
84
88
  "ts-node": "^10.9.2"
85
89
  }
86
90
  }
@@ -1,62 +0,0 @@
1
- /**
2
- * Configuration Manager
3
- * Handles user preferences, API keys, and settings
4
- * Syncs with backend API when authenticated
5
- */
6
- import { CentaurusConfig } from './defaultConfig.js';
7
- export declare class ConfigManager {
8
- private static instance;
9
- private configPath;
10
- private config;
11
- private encryptionKey;
12
- private useBackendSync;
13
- private migrationPerformed;
14
- private constructor();
15
- static getInstance(): ConfigManager;
16
- initialize(): Promise<void>;
17
- /**
18
- * Enable backend synchronization
19
- */
20
- enableBackendSync(): void;
21
- /**
22
- * Disable backend synchronization
23
- */
24
- disableBackendSync(): void;
25
- /**
26
- * Sync settings from backend
27
- */
28
- private syncFromBackend;
29
- /**
30
- * Sync settings to backend
31
- */
32
- private syncToBackend;
33
- private ensureConfigDir;
34
- load(): Promise<void>;
35
- save(): Promise<void>;
36
- get(key: keyof CentaurusConfig): any;
37
- getAll(): CentaurusConfig;
38
- getModel(): string;
39
- isAutoAcceptEnabled(): boolean;
40
- getTheme(): string;
41
- set<K extends keyof CentaurusConfig>(key: K, value: CentaurusConfig[K]): Promise<void>;
42
- setModel(model: string): Promise<void>;
43
- setAutoAccept(enabled: boolean): Promise<void>;
44
- setTheme(theme: string): Promise<void>;
45
- validateConfig(): {
46
- valid: boolean;
47
- errors: string[];
48
- };
49
- reset(): Promise<void>;
50
- exportConfig(): object;
51
- /**
52
- * Check if configuration migration was performed
53
- * This is used to show a one-time migration message to users
54
- */
55
- wasMigrationPerformed(): boolean;
56
- /**
57
- * Reset migration flag (after showing migration message)
58
- */
59
- resetMigrationFlag(): void;
60
- }
61
- export default ConfigManager;
62
- //# sourceMappingURL=ConfigManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAiB,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKpE,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,kBAAkB,CAAkB;IAE5C,OAAO;IAOP,MAAM,CAAC,WAAW,IAAI,aAAa;IAQ7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAIzB;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;YACW,eAAe;IA2B7B;;OAEG;YACW,aAAa;YAiBb,eAAe;IASvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,GAAG,CAAC,GAAG,EAAE,MAAM,eAAe,GAAG,GAAG;IAIpC,MAAM,IAAI,eAAe;IAKzB,QAAQ,IAAI,MAAM;IAIlB,mBAAmB,IAAI,OAAO;IAI9B,QAAQ,IAAI,MAAM;IAKZ,GAAG,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C,cAAc,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAchD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACH,qBAAqB,IAAI,OAAO;IAIhC;;OAEG;IACH,kBAAkB,IAAI,IAAI;CAG3B;AAED,eAAe,aAAa,CAAC"}
@@ -1,234 +0,0 @@
1
- /**
2
- * Configuration Manager
3
- * Handles user preferences, API keys, and settings
4
- * Syncs with backend API when authenticated
5
- */
6
- import * as fs from 'fs/promises';
7
- import * as path from 'path';
8
- import * as os from 'os';
9
- import { defaultConfig } from './defaultConfig.js';
10
- import { apiClient } from '../services/api-client.js';
11
- import { isValidModel, getInvalidModelError } from './models.js';
12
- import { logError } from '../utils/logger.js';
13
- export class ConfigManager {
14
- static instance;
15
- configPath;
16
- config;
17
- encryptionKey;
18
- useBackendSync = false;
19
- migrationPerformed = false;
20
- constructor() {
21
- const configDir = path.join(os.homedir(), '.centaurus');
22
- this.configPath = path.join(configDir, 'config.json');
23
- this.config = { ...defaultConfig };
24
- this.encryptionKey = ''; // No longer needed but kept for compatibility
25
- }
26
- static getInstance() {
27
- if (!ConfigManager.instance) {
28
- ConfigManager.instance = new ConfigManager();
29
- }
30
- return ConfigManager.instance;
31
- }
32
- async initialize() {
33
- try {
34
- await this.load();
35
- // Check if user is authenticated and enable backend sync
36
- if (apiClient.isAuthenticated()) {
37
- this.useBackendSync = true;
38
- await this.syncFromBackend();
39
- }
40
- }
41
- catch (error) {
42
- // If loading fails, create config directory and use defaults
43
- await this.ensureConfigDir();
44
- await this.save();
45
- }
46
- }
47
- /**
48
- * Enable backend synchronization
49
- */
50
- enableBackendSync() {
51
- this.useBackendSync = true;
52
- }
53
- /**
54
- * Disable backend synchronization
55
- */
56
- disableBackendSync() {
57
- this.useBackendSync = false;
58
- }
59
- /**
60
- * Sync settings from backend
61
- */
62
- async syncFromBackend() {
63
- if (!this.useBackendSync || !apiClient.isAuthenticated()) {
64
- return;
65
- }
66
- try {
67
- const settings = await apiClient.getSettings();
68
- // Merge backend settings with local config
69
- if (settings.defaultModel) {
70
- this.config.model = settings.defaultModel;
71
- }
72
- if (settings.theme) {
73
- this.config.theme = settings.theme;
74
- }
75
- if (settings.autoSave !== undefined) {
76
- this.config.autoAccept = settings.autoSave;
77
- }
78
- // Save merged config locally
79
- await this.save();
80
- }
81
- catch (error) {
82
- // If sync fails, continue with local config
83
- logError('Failed to sync settings from backend', error);
84
- }
85
- }
86
- /**
87
- * Sync settings to backend
88
- */
89
- async syncToBackend() {
90
- if (!this.useBackendSync || !apiClient.isAuthenticated()) {
91
- return;
92
- }
93
- try {
94
- await apiClient.updateSettings({
95
- defaultModel: this.config.model,
96
- theme: this.config.theme,
97
- autoSave: this.config.autoAccept,
98
- });
99
- }
100
- catch (error) {
101
- // If sync fails, continue with local save
102
- logError('Failed to sync settings to backend', error);
103
- }
104
- }
105
- async ensureConfigDir() {
106
- const configDir = path.dirname(this.configPath);
107
- try {
108
- await fs.access(configDir);
109
- }
110
- catch {
111
- await fs.mkdir(configDir, { recursive: true });
112
- }
113
- }
114
- async load() {
115
- try {
116
- const data = await fs.readFile(this.configPath, 'utf-8');
117
- const loadedConfig = JSON.parse(data);
118
- // Detect if old config format exists (migration needed)
119
- const hasDeprecatedFields = 'googleApiKey' in loadedConfig ||
120
- 'openrouterApiKey' in loadedConfig ||
121
- 'openRouterApiKey' in loadedConfig ||
122
- 'anthropicApiKey' in loadedConfig ||
123
- 'provider' in loadedConfig;
124
- if (hasDeprecatedFields) {
125
- this.migrationPerformed = true;
126
- // Remove deprecated fields
127
- delete loadedConfig.googleApiKey;
128
- delete loadedConfig.openrouterApiKey;
129
- delete loadedConfig.openRouterApiKey;
130
- delete loadedConfig.anthropicApiKey;
131
- delete loadedConfig.provider;
132
- // Preserve model preference and other settings
133
- this.config = { ...defaultConfig, ...loadedConfig };
134
- // Save the migrated config immediately
135
- await this.save();
136
- }
137
- else {
138
- // Merge with defaults to ensure all fields exist
139
- this.config = { ...defaultConfig, ...loadedConfig };
140
- }
141
- }
142
- catch (error) {
143
- if (error.code !== 'ENOENT') {
144
- throw error;
145
- }
146
- // File doesn't exist, use defaults
147
- this.config = { ...defaultConfig };
148
- }
149
- }
150
- async save() {
151
- await this.ensureConfigDir();
152
- await fs.writeFile(this.configPath, JSON.stringify(this.config, null, 2), 'utf-8');
153
- }
154
- // Getters
155
- get(key) {
156
- return this.config[key];
157
- }
158
- getAll() {
159
- // Return a copy to prevent direct modification
160
- return { ...this.config };
161
- }
162
- getModel() {
163
- return this.config.model;
164
- }
165
- isAutoAcceptEnabled() {
166
- return this.config.autoAccept;
167
- }
168
- getTheme() {
169
- return this.config.theme;
170
- }
171
- // Setters
172
- async set(key, value) {
173
- this.config[key] = value;
174
- await this.save();
175
- await this.syncToBackend();
176
- }
177
- async setModel(model) {
178
- // Validate model before setting (async)
179
- if (!(await isValidModel(model))) {
180
- throw new Error(await getInvalidModelError(model));
181
- }
182
- this.config.model = model;
183
- await this.save();
184
- await this.syncToBackend();
185
- }
186
- async setAutoAccept(enabled) {
187
- this.config.autoAccept = enabled;
188
- await this.save();
189
- await this.syncToBackend();
190
- }
191
- async setTheme(theme) {
192
- if (!['default', 'dark', 'light', 'ocean', 'forest'].includes(theme)) {
193
- throw new Error(`Invalid theme: ${theme}`);
194
- }
195
- this.config.theme = theme;
196
- await this.save();
197
- await this.syncToBackend();
198
- }
199
- // Validation
200
- validateConfig() {
201
- const errors = [];
202
- if (!this.config.model) {
203
- errors.push('Model is not set');
204
- }
205
- return {
206
- valid: errors.length === 0,
207
- errors
208
- };
209
- }
210
- // Reset to defaults
211
- async reset() {
212
- this.config = { ...defaultConfig };
213
- await this.save();
214
- }
215
- // Export configuration (without sensitive data)
216
- exportConfig() {
217
- return { ...this.config };
218
- }
219
- /**
220
- * Check if configuration migration was performed
221
- * This is used to show a one-time migration message to users
222
- */
223
- wasMigrationPerformed() {
224
- return this.migrationPerformed;
225
- }
226
- /**
227
- * Reset migration flag (after showing migration message)
228
- */
229
- resetMigrationFlag() {
230
- this.migrationPerformed = false;
231
- }
232
- }
233
- export default ConfigManager;
234
- //# sourceMappingURL=ConfigManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,aAAa,EAAmB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,CAAgB;IAC/B,UAAU,CAAS;IACnB,MAAM,CAAkB;IACxB,aAAa,CAAS;IACtB,cAAc,GAAY,KAAK,CAAC;IAChC,kBAAkB,GAAY,KAAK,CAAC;IAE5C;QACE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,8CAA8C;IACzE,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAGD,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAElB,yDAAyD;YACzD,IAAI,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC;gBAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6DAA6D;YAC7D,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC;YACzD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC;YAE/C,2CAA2C;YAC3C,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;YAC5C,CAAC;YACD,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YACrC,CAAC;YACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAC7C,CAAC;YAED,6BAA6B;YAC7B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4CAA4C;YAC5C,QAAQ,CAAC,sCAAsC,EAAE,KAAc,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC;YACzD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,cAAc,CAAC;gBAC7B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;gBAC/B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;aACjC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0CAA0C;YAC1C,QAAQ,CAAC,oCAAoC,EAAE,KAAc,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEtC,wDAAwD;YACxD,MAAM,mBAAmB,GACvB,cAAc,IAAI,YAAY;gBAC9B,kBAAkB,IAAI,YAAY;gBAClC,kBAAkB,IAAI,YAAY;gBAClC,iBAAiB,IAAI,YAAY;gBACjC,UAAU,IAAI,YAAY,CAAC;YAE7B,IAAI,mBAAmB,EAAE,CAAC;gBACxB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAE/B,2BAA2B;gBAC3B,OAAO,YAAY,CAAC,YAAY,CAAC;gBACjC,OAAO,YAAY,CAAC,gBAAgB,CAAC;gBACrC,OAAO,YAAY,CAAC,gBAAgB,CAAC;gBACrC,OAAO,YAAY,CAAC,eAAe,CAAC;gBACpC,OAAO,YAAY,CAAC,QAAQ,CAAC;gBAE7B,+CAA+C;gBAC/C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,YAAY,EAAE,CAAC;gBAEpD,uCAAuC;gBACvC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,iDAAiD;gBACjD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,YAAY,EAAE,CAAC;YACtD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAAa,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,mCAAmC;YACnC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE7B,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EACpC,OAAO,CACR,CAAC;IACJ,CAAC;IAED,UAAU;IACV,GAAG,CAAC,GAA0B;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM;QACJ,+CAA+C;QAC/C,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAChC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,UAAU;IACV,KAAK,CAAC,GAAG,CAAkC,GAAM,EAAE,KAAyB;QAC1E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,wCAAwC;QACxC,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAgB;QAClC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC;QACjC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,aAAa;IACb,cAAc;QACZ,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;SACP,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,gDAAgD;IAChD,YAAY;QACV,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,qBAAqB;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}