@kodus/cli 0.0.12 → 0.1.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 (151) hide show
  1. package/README.md +387 -0
  2. package/dist/cli.d.ts +4 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +26 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/auth/index.d.ts +3 -0
  7. package/dist/commands/auth/index.d.ts.map +1 -0
  8. package/dist/commands/auth/index.js +36 -0
  9. package/dist/commands/auth/index.js.map +1 -0
  10. package/dist/commands/auth/login.d.ts +7 -0
  11. package/dist/commands/auth/login.d.ts.map +1 -0
  12. package/dist/commands/auth/login.js +97 -0
  13. package/dist/commands/auth/login.js.map +1 -0
  14. package/dist/commands/auth/logout.d.ts +2 -0
  15. package/dist/commands/auth/logout.d.ts.map +1 -0
  16. package/dist/commands/auth/logout.js +24 -0
  17. package/dist/commands/auth/logout.js.map +1 -0
  18. package/dist/commands/auth/signup.d.ts +2 -0
  19. package/dist/commands/auth/signup.d.ts.map +1 -0
  20. package/dist/commands/auth/signup.js +74 -0
  21. package/dist/commands/auth/signup.js.map +1 -0
  22. package/dist/commands/auth/status.d.ts +2 -0
  23. package/dist/commands/auth/status.d.ts.map +1 -0
  24. package/dist/commands/auth/status.js +91 -0
  25. package/dist/commands/auth/status.js.map +1 -0
  26. package/dist/commands/auth/team-key.d.ts +5 -0
  27. package/dist/commands/auth/team-key.d.ts.map +1 -0
  28. package/dist/commands/auth/team-key.js +59 -0
  29. package/dist/commands/auth/team-key.js.map +1 -0
  30. package/dist/commands/auth/token.d.ts +2 -0
  31. package/dist/commands/auth/token.d.ts.map +1 -0
  32. package/dist/commands/auth/token.js +31 -0
  33. package/dist/commands/auth/token.js.map +1 -0
  34. package/dist/commands/config.d.ts +3 -0
  35. package/dist/commands/config.d.ts.map +1 -0
  36. package/dist/commands/config.js +47 -0
  37. package/dist/commands/config.js.map +1 -0
  38. package/dist/commands/pr.d.ts +3 -0
  39. package/dist/commands/pr.d.ts.map +1 -0
  40. package/dist/commands/pr.js +75 -0
  41. package/dist/commands/pr.js.map +1 -0
  42. package/dist/commands/review.d.ts +3 -0
  43. package/dist/commands/review.d.ts.map +1 -0
  44. package/dist/commands/review.js +245 -0
  45. package/dist/commands/review.js.map +1 -0
  46. package/dist/commands/telemetry.d.ts +3 -0
  47. package/dist/commands/telemetry.d.ts.map +1 -0
  48. package/dist/commands/telemetry.js +76 -0
  49. package/dist/commands/telemetry.js.map +1 -0
  50. package/dist/commands/upgrade.d.ts +3 -0
  51. package/dist/commands/upgrade.d.ts.map +1 -0
  52. package/dist/commands/upgrade.js +35 -0
  53. package/dist/commands/upgrade.js.map +1 -0
  54. package/dist/constants.d.ts +3 -0
  55. package/dist/constants.d.ts.map +1 -0
  56. package/dist/constants.js +3 -0
  57. package/dist/constants.js.map +1 -0
  58. package/dist/formatters/json.d.ts +7 -0
  59. package/dist/formatters/json.d.ts.map +1 -0
  60. package/dist/formatters/json.js +7 -0
  61. package/dist/formatters/json.js.map +1 -0
  62. package/dist/formatters/markdown.d.ts +7 -0
  63. package/dist/formatters/markdown.d.ts.map +1 -0
  64. package/dist/formatters/markdown.js +93 -0
  65. package/dist/formatters/markdown.js.map +1 -0
  66. package/dist/formatters/prompt.d.ts +12 -0
  67. package/dist/formatters/prompt.d.ts.map +1 -0
  68. package/dist/formatters/prompt.js +90 -0
  69. package/dist/formatters/prompt.js.map +1 -0
  70. package/dist/formatters/terminal.d.ts +7 -0
  71. package/dist/formatters/terminal.d.ts.map +1 -0
  72. package/dist/formatters/terminal.js +127 -0
  73. package/dist/formatters/terminal.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +4 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/services/api/api.interface.d.ts +46 -0
  79. package/dist/services/api/api.interface.d.ts.map +1 -0
  80. package/dist/services/api/api.interface.js +2 -0
  81. package/dist/services/api/api.interface.js.map +1 -0
  82. package/dist/services/api/api.mock.d.ts +8 -0
  83. package/dist/services/api/api.mock.d.ts.map +1 -0
  84. package/dist/services/api/api.mock.js +249 -0
  85. package/dist/services/api/api.mock.js.map +1 -0
  86. package/dist/services/api/api.real.d.ts +8 -0
  87. package/dist/services/api/api.real.d.ts.map +1 -0
  88. package/dist/services/api/api.real.js +253 -0
  89. package/dist/services/api/api.real.js.map +1 -0
  90. package/dist/services/api/index.d.ts +4 -0
  91. package/dist/services/api/index.d.ts.map +1 -0
  92. package/dist/services/api/index.js +9 -0
  93. package/dist/services/api/index.js.map +1 -0
  94. package/dist/services/auth.service.d.ts +19 -0
  95. package/dist/services/auth.service.d.ts.map +1 -0
  96. package/dist/services/auth.service.js +90 -0
  97. package/dist/services/auth.service.js.map +1 -0
  98. package/dist/services/context.service.d.ts +22 -0
  99. package/dist/services/context.service.d.ts.map +1 -0
  100. package/dist/services/context.service.js +104 -0
  101. package/dist/services/context.service.js.map +1 -0
  102. package/dist/services/fix.service.d.ts +31 -0
  103. package/dist/services/fix.service.d.ts.map +1 -0
  104. package/dist/services/fix.service.js +120 -0
  105. package/dist/services/fix.service.js.map +1 -0
  106. package/dist/services/git.service.d.ts +32 -0
  107. package/dist/services/git.service.d.ts.map +1 -0
  108. package/dist/services/git.service.js +261 -0
  109. package/dist/services/git.service.js.map +1 -0
  110. package/dist/services/review.service.d.ts +26 -0
  111. package/dist/services/review.service.d.ts.map +1 -0
  112. package/dist/services/review.service.js +82 -0
  113. package/dist/services/review.service.js.map +1 -0
  114. package/dist/services/telemetry.service.d.ts +73 -0
  115. package/dist/services/telemetry.service.d.ts.map +1 -0
  116. package/dist/services/telemetry.service.js +229 -0
  117. package/dist/services/telemetry.service.js.map +1 -0
  118. package/dist/types/index.d.ts +143 -0
  119. package/dist/types/index.d.ts.map +1 -0
  120. package/dist/types/index.js +15 -0
  121. package/dist/types/index.js.map +1 -0
  122. package/dist/ui/interactive.d.ts +26 -0
  123. package/dist/ui/interactive.d.ts.map +1 -0
  124. package/dist/ui/interactive.js +365 -0
  125. package/dist/ui/interactive.js.map +1 -0
  126. package/dist/utils/config.d.ts +10 -0
  127. package/dist/utils/config.d.ts.map +1 -0
  128. package/dist/utils/config.js +54 -0
  129. package/dist/utils/config.js.map +1 -0
  130. package/dist/utils/credentials.d.ts +6 -0
  131. package/dist/utils/credentials.d.ts.map +1 -0
  132. package/dist/utils/credentials.js +54 -0
  133. package/dist/utils/credentials.js.map +1 -0
  134. package/dist/utils/rate-limit.d.ts +5 -0
  135. package/dist/utils/rate-limit.d.ts.map +1 -0
  136. package/dist/utils/rate-limit.js +47 -0
  137. package/dist/utils/rate-limit.js.map +1 -0
  138. package/dist/utils/review-loading.d.ts +19 -0
  139. package/dist/utils/review-loading.d.ts.map +1 -0
  140. package/dist/utils/review-loading.js +140 -0
  141. package/dist/utils/review-loading.js.map +1 -0
  142. package/package.json +39 -33
  143. package/index.js +0 -15
  144. package/license.md +0 -21
  145. package/readme.md +0 -128
  146. package/scripts/setup-db.sh +0 -77
  147. package/src/commands/install.js +0 -357
  148. package/src/config/default.js +0 -66
  149. package/src/utils/helpers.js +0 -128
  150. package/templates/.env.example +0 -142
  151. package/templates/docker-compose.yml +0 -139
@@ -0,0 +1,229 @@
1
+ import machineId from 'node-machine-id';
2
+ import fs from 'fs/promises';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ const { machineIdSync } = machineId;
6
+ /**
7
+ * Telemetry Service - Analytics via Kodus API
8
+ *
9
+ * Security:
10
+ * - Does NOT expose PostHog API key to users
11
+ * - Sends events to Kodus API which forwards to PostHog
12
+ * - API key stays secure on the server
13
+ *
14
+ * Features:
15
+ * - User can opt-out via `kodus telemetry disable`
16
+ * - Anonymous user ID (machine ID hash)
17
+ * - No sensitive data (file names, code, etc)
18
+ * - Graceful degradation (never breaks the CLI)
19
+ */
20
+ class TelemetryService {
21
+ userId = null;
22
+ enabled = true;
23
+ configPath;
24
+ apiUrl;
25
+ constructor() {
26
+ this.configPath = path.join(os.homedir(), '.kodus', 'telemetry.json');
27
+ this.apiUrl = process.env.KODUS_API_URL || 'https://api.kodus.io';
28
+ this.initialize();
29
+ }
30
+ async initialize() {
31
+ try {
32
+ // Check if telemetry is enabled
33
+ this.enabled = await this.isEnabled();
34
+ if (!this.enabled) {
35
+ return;
36
+ }
37
+ // Get or create anonymous user ID
38
+ this.userId = await this.getUserId();
39
+ }
40
+ catch (error) {
41
+ // Silent fail - telemetry should never break the CLI
42
+ this.enabled = false;
43
+ }
44
+ }
45
+ /**
46
+ * Get anonymous user ID (machine ID)
47
+ */
48
+ async getUserId() {
49
+ try {
50
+ // Use machine ID for consistent anonymous tracking
51
+ const machineId = machineIdSync();
52
+ return `anon_${machineId}`;
53
+ }
54
+ catch {
55
+ // Fallback to random ID
56
+ return `anon_${Math.random().toString(36).substring(7)}`;
57
+ }
58
+ }
59
+ /**
60
+ * Check if telemetry is enabled
61
+ */
62
+ async isEnabled() {
63
+ try {
64
+ // Check env var first
65
+ if (process.env.KODUS_TELEMETRY === 'false' || process.env.DO_NOT_TRACK === '1') {
66
+ return false;
67
+ }
68
+ // Check config file
69
+ const config = await this.readConfig();
70
+ return config.enabled !== false; // Enabled by default
71
+ }
72
+ catch {
73
+ return true; // Default to enabled
74
+ }
75
+ }
76
+ /**
77
+ * Read telemetry config
78
+ */
79
+ async readConfig() {
80
+ try {
81
+ const content = await fs.readFile(this.configPath, 'utf-8');
82
+ return JSON.parse(content);
83
+ }
84
+ catch {
85
+ return { enabled: true };
86
+ }
87
+ }
88
+ /**
89
+ * Write telemetry config
90
+ */
91
+ async writeConfig(config) {
92
+ try {
93
+ const dir = path.dirname(this.configPath);
94
+ await fs.mkdir(dir, { recursive: true });
95
+ await fs.writeFile(this.configPath, JSON.stringify(config, null, 2));
96
+ }
97
+ catch {
98
+ // Silent fail
99
+ }
100
+ }
101
+ /**
102
+ * Track an event
103
+ */
104
+ async track(eventName, properties) {
105
+ if (!this.enabled || !this.userId) {
106
+ return;
107
+ }
108
+ try {
109
+ // Add common properties
110
+ const enrichedProperties = {
111
+ ...properties,
112
+ cli_version: '0.1.0',
113
+ node_version: process.version,
114
+ platform: process.platform,
115
+ arch: process.arch,
116
+ timestamp: new Date().toISOString(),
117
+ };
118
+ // Remove any potentially sensitive data
119
+ const sanitized = this.sanitizeProperties(enrichedProperties);
120
+ // Send to Kodus API (which forwards to PostHog securely)
121
+ await this.sendEvent({
122
+ distinctId: this.userId,
123
+ event: eventName,
124
+ properties: sanitized,
125
+ });
126
+ }
127
+ catch {
128
+ // Silent fail - telemetry should never break the CLI
129
+ }
130
+ }
131
+ /**
132
+ * Send event to Kodus API
133
+ */
134
+ async sendEvent(payload) {
135
+ try {
136
+ const response = await fetch(`${this.apiUrl}/v1/telemetry/events`, {
137
+ method: 'POST',
138
+ headers: {
139
+ 'Content-Type': 'application/json',
140
+ },
141
+ body: JSON.stringify(payload),
142
+ });
143
+ // Don't throw on failure - telemetry is best-effort
144
+ if (!response.ok) {
145
+ if (process.env.KODUS_VERBOSE) {
146
+ console.error('Telemetry event failed:', response.statusText);
147
+ }
148
+ }
149
+ }
150
+ catch (error) {
151
+ // Silent fail
152
+ if (process.env.KODUS_VERBOSE) {
153
+ console.error('Telemetry error:', error);
154
+ }
155
+ }
156
+ }
157
+ /**
158
+ * Sanitize properties to remove sensitive data
159
+ */
160
+ sanitizeProperties(properties) {
161
+ const sanitized = {};
162
+ for (const [key, value] of Object.entries(properties)) {
163
+ // Skip potentially sensitive keys
164
+ if (key.toLowerCase().includes('password') ||
165
+ key.toLowerCase().includes('token') ||
166
+ key.toLowerCase().includes('secret') ||
167
+ key.toLowerCase().includes('key')) {
168
+ continue;
169
+ }
170
+ // Sanitize file paths (keep only basename)
171
+ if (typeof value === 'string' && (value.includes('/') || value.includes('\\'))) {
172
+ sanitized[key] = path.basename(value);
173
+ }
174
+ else {
175
+ sanitized[key] = value;
176
+ }
177
+ }
178
+ return sanitized;
179
+ }
180
+ /**
181
+ * Enable telemetry
182
+ */
183
+ async enable() {
184
+ await this.writeConfig({ enabled: true });
185
+ this.enabled = true;
186
+ await this.initialize();
187
+ }
188
+ /**
189
+ * Disable telemetry (opt-out)
190
+ */
191
+ async disable() {
192
+ await this.writeConfig({ enabled: false });
193
+ this.enabled = false;
194
+ }
195
+ /**
196
+ * Check if telemetry is currently enabled
197
+ */
198
+ async status() {
199
+ return this.enabled;
200
+ }
201
+ /**
202
+ * Identify user (when authenticated)
203
+ */
204
+ async identify(userId, traits) {
205
+ if (!this.enabled) {
206
+ return;
207
+ }
208
+ try {
209
+ await this.sendEvent({
210
+ distinctId: userId,
211
+ event: '$identify',
212
+ properties: {
213
+ $set: traits,
214
+ },
215
+ });
216
+ }
217
+ catch {
218
+ // Silent fail
219
+ }
220
+ }
221
+ /**
222
+ * Shutdown (cleanup)
223
+ */
224
+ async shutdown() {
225
+ // No cleanup needed with HTTP-based telemetry
226
+ }
227
+ }
228
+ export const telemetryService = new TelemetryService();
229
+ //# sourceMappingURL=telemetry.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.service.js","sourceRoot":"","sources":["../../src/services/telemetry.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ export type Severity = 'info' | 'warning' | 'error' | 'critical';
2
+ export type OutputFormat = 'terminal' | 'json' | 'markdown' | 'prompt';
3
+ export type IssueCategory = 'security_vulnerability' | 'performance' | 'code_quality' | 'best_practices' | 'style' | 'bug' | 'complexity' | 'maintainability';
4
+ export interface AuthResponse {
5
+ accessToken: string;
6
+ refreshToken: string;
7
+ expiresIn: number;
8
+ user: UserInfo;
9
+ }
10
+ export interface UserInfo {
11
+ id: string;
12
+ email: string;
13
+ orgs: string[];
14
+ }
15
+ export interface StoredCredentials {
16
+ accessToken: string;
17
+ refreshToken: string;
18
+ expiresAt: number;
19
+ user: UserInfo;
20
+ }
21
+ export interface ReviewConfig {
22
+ org?: string;
23
+ repo?: string;
24
+ severity?: Severity;
25
+ rules?: {
26
+ security?: boolean;
27
+ performance?: boolean;
28
+ style?: boolean;
29
+ bestPractices?: boolean;
30
+ };
31
+ rulesOnly?: boolean;
32
+ fast?: boolean;
33
+ files?: FileContent[];
34
+ }
35
+ export interface CodeFix {
36
+ type: 'replace' | 'insert' | 'delete';
37
+ startLine: number;
38
+ endLine: number;
39
+ oldCode: string;
40
+ newCode: string;
41
+ }
42
+ export interface ReviewIssue {
43
+ file: string;
44
+ line: number;
45
+ endLine?: number;
46
+ severity: Severity;
47
+ category?: IssueCategory;
48
+ message: string;
49
+ suggestion?: string;
50
+ recommendation?: string;
51
+ ruleId?: string;
52
+ fixable?: boolean;
53
+ fix?: CodeFix;
54
+ }
55
+ export interface ReviewResult {
56
+ summary: string;
57
+ issues: ReviewIssue[];
58
+ filesAnalyzed: number;
59
+ duration: number;
60
+ }
61
+ export interface PullRequestSuggestionsResponse {
62
+ summary?: string;
63
+ issues?: ReviewIssue[];
64
+ suggestions?: ReviewIssue[];
65
+ filesAnalyzed?: number;
66
+ duration?: number;
67
+ markdown?: string;
68
+ deliveryStatus?: string;
69
+ }
70
+ export interface TrialReviewResult extends ReviewResult {
71
+ trialInfo: {
72
+ reviewsUsed: number;
73
+ reviewsLimit: number;
74
+ resetsAt: string;
75
+ };
76
+ }
77
+ export interface RemoteConfig {
78
+ language: string;
79
+ severity: Severity;
80
+ rules: {
81
+ security: boolean;
82
+ performance: boolean;
83
+ style: boolean;
84
+ bestPractices: boolean;
85
+ };
86
+ ignore: string[];
87
+ llmProvider: 'kodus' | 'byok';
88
+ }
89
+ export interface TrialStatus {
90
+ fingerprint: string;
91
+ reviewsUsed: number;
92
+ reviewsLimit: number;
93
+ filesLimit: number;
94
+ linesLimit: number;
95
+ resetsAt: string;
96
+ isLimited: boolean;
97
+ }
98
+ export interface FileDiff {
99
+ file: string;
100
+ status: 'added' | 'modified' | 'deleted' | 'renamed';
101
+ additions: number;
102
+ deletions: number;
103
+ diff: string;
104
+ }
105
+ export interface FileContent {
106
+ path: string;
107
+ content: string;
108
+ status: 'added' | 'modified' | 'deleted' | 'renamed';
109
+ diff: string;
110
+ }
111
+ export interface ProjectContext {
112
+ cursorRules?: string;
113
+ claudeRules?: string;
114
+ kodusRules?: string;
115
+ customContext?: string;
116
+ }
117
+ export interface GlobalOptions {
118
+ format: OutputFormat;
119
+ output?: string;
120
+ verbose: boolean;
121
+ quiet: boolean;
122
+ org?: string;
123
+ repo?: string;
124
+ interactive?: boolean;
125
+ promptOnly?: boolean;
126
+ fix?: boolean;
127
+ context?: string;
128
+ }
129
+ export declare class ApiError extends Error {
130
+ statusCode: number;
131
+ constructor(statusCode: number, message: string);
132
+ }
133
+ export declare class AuthError extends Error {
134
+ constructor(message: string);
135
+ }
136
+ export interface GitInfo {
137
+ userEmail?: string;
138
+ remote?: string | null;
139
+ branch?: string;
140
+ commitSha?: string;
141
+ }
142
+ export type PlatformType = 'GITHUB' | 'GITLAB' | 'BITBUCKET' | 'AZURE_REPOS' | undefined;
143
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export class ApiError extends Error {
2
+ statusCode;
3
+ constructor(statusCode, message) {
4
+ super(message);
5
+ this.statusCode = statusCode;
6
+ this.name = 'ApiError';
7
+ }
8
+ }
9
+ export class AuthError extends Error {
10
+ constructor(message) {
11
+ super(message);
12
+ this.name = 'AuthError';
13
+ }
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAwJA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAExB;IADT,YACS,UAAkB,EACzB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,eAAU,GAAV,UAAU,CAAQ;QAIzB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import type { ReviewResult } from '../types/index.js';
2
+ /**
3
+ * Interactive UI - Navigable interface for reviewing issues
4
+ */
5
+ declare class InteractiveUI {
6
+ private getSeverityColor;
7
+ private getSeverityIcon;
8
+ private formatIssueTitle;
9
+ private displayIssueDetails;
10
+ private showFixPreview;
11
+ private groupIssuesByFile;
12
+ private getFileStats;
13
+ private formatCategoryBadge;
14
+ private formatFileChoice;
15
+ run(result: ReviewResult): Promise<void>;
16
+ private generateFixPrompt;
17
+ private copyToClipboard;
18
+ private reviewFileIssues;
19
+ /**
20
+ * Quick fix mode - applies all fixable issues automatically
21
+ */
22
+ runQuickFix(result: ReviewResult): Promise<void>;
23
+ }
24
+ export declare const interactiveUI: InteractiveUI;
25
+ export {};
26
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/ui/interactive.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAGnE;;GAEG;AACH,cAAM,aAAa;IACjB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,mBAAmB;YAyCb,cAAc;IA2B5B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,gBAAgB;IAqBlB,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAiF9C,OAAO,CAAC,iBAAiB;YAyBX,eAAe;YAef,gBAAgB;IAsG9B;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAsCvD;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}