@lovelybunch/core 1.0.3
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.
- package/dist/change-proposal.d.ts +71 -0
- package/dist/change-proposal.d.ts.map +1 -0
- package/dist/change-proposal.js +205 -0
- package/dist/change-proposal.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown-storage.d.ts +34 -0
- package/dist/markdown-storage.d.ts.map +1 -0
- package/dist/markdown-storage.js +356 -0
- package/dist/markdown-storage.js.map +1 -0
- package/dist/migration.d.ts +57 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +250 -0
- package/dist/migration.js.map +1 -0
- package/dist/storage.d.ts +57 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +403 -0
- package/dist/storage.js.map +1 -0
- package/dist/unified-storage.d.ts +59 -0
- package/dist/unified-storage.d.ts.map +1 -0
- package/dist/unified-storage.js +199 -0
- package/dist/unified-storage.js.map +1 -0
- package/dist/validation.d.ts +62 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +500 -0
- package/dist/validation.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import matter from 'gray-matter';
|
|
4
|
+
export class MarkdownStorageAdapter {
|
|
5
|
+
basePath;
|
|
6
|
+
proposalsPath;
|
|
7
|
+
configPath;
|
|
8
|
+
agentsPath;
|
|
9
|
+
constructor(basePath = '.gait') {
|
|
10
|
+
this.basePath = basePath;
|
|
11
|
+
this.proposalsPath = path.join(basePath, 'proposals');
|
|
12
|
+
this.configPath = path.join(basePath, 'config.json');
|
|
13
|
+
this.agentsPath = path.join(basePath, 'agents');
|
|
14
|
+
}
|
|
15
|
+
async init() {
|
|
16
|
+
// Create .gait directory structure
|
|
17
|
+
await fs.mkdir(this.basePath, { recursive: true });
|
|
18
|
+
await fs.mkdir(this.proposalsPath, { recursive: true });
|
|
19
|
+
await fs.mkdir(this.agentsPath, { recursive: true });
|
|
20
|
+
// Create default config if it doesn't exist
|
|
21
|
+
const configExists = await this.fileExists(this.configPath);
|
|
22
|
+
if (!configExists) {
|
|
23
|
+
const defaultConfig = {
|
|
24
|
+
version: '1.0.0',
|
|
25
|
+
repository: {
|
|
26
|
+
name: path.basename(process.cwd()),
|
|
27
|
+
description: 'GAIT-managed repository'
|
|
28
|
+
},
|
|
29
|
+
policies: {
|
|
30
|
+
requireApproval: true,
|
|
31
|
+
minApprovers: 1,
|
|
32
|
+
allowSelfApproval: false,
|
|
33
|
+
autoMerge: false
|
|
34
|
+
},
|
|
35
|
+
storage: {
|
|
36
|
+
type: 'file',
|
|
37
|
+
path: this.basePath
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
await this.saveConfig(defaultConfig);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async saveProposal(proposal) {
|
|
44
|
+
const filePath = path.join(this.proposalsPath, `${proposal.id}.md`);
|
|
45
|
+
// Create frontmatter (filter out undefined values)
|
|
46
|
+
const frontmatter = {
|
|
47
|
+
id: proposal.id,
|
|
48
|
+
intent: proposal.intent,
|
|
49
|
+
author: {
|
|
50
|
+
name: proposal.author.name,
|
|
51
|
+
role: this.getAuthorRole(proposal.author),
|
|
52
|
+
type: proposal.author.type
|
|
53
|
+
},
|
|
54
|
+
status: proposal.status,
|
|
55
|
+
createdAt: proposal.metadata.createdAt.toISOString(),
|
|
56
|
+
updatedAt: proposal.metadata.updatedAt.toISOString()
|
|
57
|
+
};
|
|
58
|
+
// Add optional fields only if they have values
|
|
59
|
+
if (proposal.author.email) {
|
|
60
|
+
frontmatter.author.email = proposal.author.email;
|
|
61
|
+
}
|
|
62
|
+
if (proposal.featureFlags.length > 0) {
|
|
63
|
+
frontmatter.featureFlags = proposal.featureFlags.map(f => f.name);
|
|
64
|
+
}
|
|
65
|
+
if (proposal.experiments.length > 0) {
|
|
66
|
+
frontmatter.experiments = proposal.experiments.map(e => e.name);
|
|
67
|
+
}
|
|
68
|
+
if (proposal.metadata.reviewers && proposal.metadata.reviewers.length > 0) {
|
|
69
|
+
frontmatter.reviewers = proposal.metadata.reviewers;
|
|
70
|
+
}
|
|
71
|
+
if (proposal.metadata.tags && proposal.metadata.tags.length > 0) {
|
|
72
|
+
frontmatter.tags = proposal.metadata.tags;
|
|
73
|
+
}
|
|
74
|
+
if (proposal.metadata.priority) {
|
|
75
|
+
frontmatter.priority = proposal.metadata.priority;
|
|
76
|
+
}
|
|
77
|
+
if (proposal.productSpecRef) {
|
|
78
|
+
frontmatter.productSpecRef = proposal.productSpecRef;
|
|
79
|
+
}
|
|
80
|
+
// Create markdown content
|
|
81
|
+
const content = this.generateMarkdownContent(proposal);
|
|
82
|
+
// Combine frontmatter and content
|
|
83
|
+
const fileContent = matter.stringify(content, frontmatter);
|
|
84
|
+
await fs.writeFile(filePath, fileContent, 'utf-8');
|
|
85
|
+
}
|
|
86
|
+
async loadProposal(id) {
|
|
87
|
+
const filePath = path.join(this.proposalsPath, `${id}.md`);
|
|
88
|
+
if (!(await this.fileExists(filePath))) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const fileContent = await fs.readFile(filePath, 'utf-8');
|
|
92
|
+
const parsed = matter(fileContent);
|
|
93
|
+
const frontmatter = parsed.data;
|
|
94
|
+
// Parse the markdown content to extract structured data
|
|
95
|
+
const structuredData = this.parseMarkdownContent(parsed.content);
|
|
96
|
+
const proposal = {
|
|
97
|
+
id: frontmatter.id,
|
|
98
|
+
intent: frontmatter.intent,
|
|
99
|
+
author: {
|
|
100
|
+
type: frontmatter.author.type,
|
|
101
|
+
id: frontmatter.author.email || `${frontmatter.author.name}@local`,
|
|
102
|
+
name: frontmatter.author.name,
|
|
103
|
+
email: frontmatter.author.email
|
|
104
|
+
},
|
|
105
|
+
productSpecRef: frontmatter.productSpecRef,
|
|
106
|
+
planSteps: structuredData.planSteps,
|
|
107
|
+
evidence: structuredData.evidence,
|
|
108
|
+
policies: structuredData.policies,
|
|
109
|
+
featureFlags: structuredData.featureFlags,
|
|
110
|
+
experiments: structuredData.experiments,
|
|
111
|
+
telemetryContracts: structuredData.telemetryContracts,
|
|
112
|
+
releasePlan: structuredData.releasePlan,
|
|
113
|
+
status: frontmatter.status,
|
|
114
|
+
metadata: {
|
|
115
|
+
createdAt: new Date(frontmatter.createdAt),
|
|
116
|
+
updatedAt: new Date(frontmatter.updatedAt),
|
|
117
|
+
reviewers: frontmatter.reviewers || [],
|
|
118
|
+
aiInteractions: structuredData.aiInteractions,
|
|
119
|
+
tags: frontmatter.tags,
|
|
120
|
+
priority: frontmatter.priority
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
return proposal;
|
|
124
|
+
}
|
|
125
|
+
async loadAllProposals() {
|
|
126
|
+
const files = await fs.readdir(this.proposalsPath);
|
|
127
|
+
const proposals = [];
|
|
128
|
+
for (const file of files) {
|
|
129
|
+
if (file.endsWith('.md')) {
|
|
130
|
+
const id = path.basename(file, '.md');
|
|
131
|
+
const proposal = await this.loadProposal(id);
|
|
132
|
+
if (proposal) {
|
|
133
|
+
proposals.push(proposal);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return proposals;
|
|
138
|
+
}
|
|
139
|
+
async deleteProposal(id) {
|
|
140
|
+
const filePath = path.join(this.proposalsPath, `${id}.md`);
|
|
141
|
+
if (!(await this.fileExists(filePath))) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
await fs.unlink(filePath);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
async saveConfig(config) {
|
|
148
|
+
const data = JSON.stringify(config, null, 2);
|
|
149
|
+
await fs.writeFile(this.configPath, data, 'utf-8');
|
|
150
|
+
}
|
|
151
|
+
async loadConfig() {
|
|
152
|
+
if (!(await this.fileExists(this.configPath))) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
const data = await fs.readFile(this.configPath, 'utf-8');
|
|
156
|
+
return JSON.parse(data);
|
|
157
|
+
}
|
|
158
|
+
async fileExists(filePath) {
|
|
159
|
+
try {
|
|
160
|
+
await fs.access(filePath);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
getAuthorRole(author) {
|
|
168
|
+
// Try to infer role from email domain or default to generic role
|
|
169
|
+
if (author.email?.includes('@')) {
|
|
170
|
+
const domain = author.email.split('@')[1];
|
|
171
|
+
if (domain.includes('product') || domain.includes('pm'))
|
|
172
|
+
return 'Product Manager';
|
|
173
|
+
if (domain.includes('design'))
|
|
174
|
+
return 'Designer';
|
|
175
|
+
if (domain.includes('eng') || domain.includes('dev'))
|
|
176
|
+
return 'Engineer';
|
|
177
|
+
}
|
|
178
|
+
return author.type === 'agent' ? 'AI Agent' : 'Team Member';
|
|
179
|
+
}
|
|
180
|
+
generateMarkdownContent(proposal) {
|
|
181
|
+
let content = `# ${proposal.intent}\n\n`;
|
|
182
|
+
// Problem Statement
|
|
183
|
+
content += `## Problem Statement\n`;
|
|
184
|
+
content += `*Describe the problem this change proposal aims to solve.*\n\n`;
|
|
185
|
+
// Success Criteria
|
|
186
|
+
content += `## Success Criteria\n`;
|
|
187
|
+
if (proposal.planSteps.length > 0) {
|
|
188
|
+
proposal.planSteps.forEach(step => {
|
|
189
|
+
const checked = step.status === 'completed' ? 'x' : ' ';
|
|
190
|
+
content += `- [${checked}] ${step.description}\n`;
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
content += `- [ ] Define success criteria for this proposal\n`;
|
|
195
|
+
}
|
|
196
|
+
content += `\n`;
|
|
197
|
+
// Implementation Plan
|
|
198
|
+
content += `## Implementation Plan\n`;
|
|
199
|
+
if (proposal.planSteps.length > 0) {
|
|
200
|
+
proposal.planSteps.forEach((step, index) => {
|
|
201
|
+
content += `${index + 1}. **${step.description}**\n`;
|
|
202
|
+
if (step.command) {
|
|
203
|
+
content += ` - Command: \`${step.command}\`\n`;
|
|
204
|
+
}
|
|
205
|
+
if (step.expectedOutcome) {
|
|
206
|
+
content += ` - Expected: ${step.expectedOutcome}\n`;
|
|
207
|
+
}
|
|
208
|
+
if (step.status !== 'pending') {
|
|
209
|
+
content += ` - Status: ${step.status}\n`;
|
|
210
|
+
}
|
|
211
|
+
content += `\n`;
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
content += `1. **Define implementation steps** - Break down the work into actionable steps\n`;
|
|
216
|
+
content += `2. **Execute plan** - Implement the changes\n`;
|
|
217
|
+
content += `3. **Validate results** - Ensure the changes work as expected\n\n`;
|
|
218
|
+
}
|
|
219
|
+
// Design Artifacts
|
|
220
|
+
content += `## Design Artifacts\n`;
|
|
221
|
+
content += `*Links to design files, mockups, or other relevant artifacts*\n\n`;
|
|
222
|
+
// Evidence
|
|
223
|
+
if (proposal.evidence.length > 0) {
|
|
224
|
+
content += `## Evidence\n`;
|
|
225
|
+
proposal.evidence.forEach(evidence => {
|
|
226
|
+
content += `### ${evidence.type.toUpperCase()}: ${evidence.description}\n`;
|
|
227
|
+
content += `*Collected on ${evidence.timestamp.toLocaleDateString()}*\n\n`;
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
// Feature Flags
|
|
231
|
+
if (proposal.featureFlags.length > 0) {
|
|
232
|
+
content += `## Feature Flags\n`;
|
|
233
|
+
proposal.featureFlags.forEach(flag => {
|
|
234
|
+
content += `- **${flag.name}**: ${flag.description}\n`;
|
|
235
|
+
});
|
|
236
|
+
content += `\n`;
|
|
237
|
+
}
|
|
238
|
+
// Experiments
|
|
239
|
+
if (proposal.experiments.length > 0) {
|
|
240
|
+
content += `## Experiments\n`;
|
|
241
|
+
proposal.experiments.forEach(exp => {
|
|
242
|
+
content += `- **${exp.name}**: ${exp.hypothesis}\n`;
|
|
243
|
+
});
|
|
244
|
+
content += `\n`;
|
|
245
|
+
}
|
|
246
|
+
// AI Suggestions
|
|
247
|
+
content += `## AI Suggestions\n`;
|
|
248
|
+
content += `*Last updated by AI Assistant on ${new Date().toLocaleDateString()}*\n\n`;
|
|
249
|
+
if (proposal.metadata.aiInteractions.length > 0) {
|
|
250
|
+
const lastInteraction = proposal.metadata.aiInteractions[proposal.metadata.aiInteractions.length - 1];
|
|
251
|
+
content += `${lastInteraction.response}\n\n`;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
content += `*No AI suggestions yet. Use \`gait ask\` to get AI assistance with this proposal.*\n\n`;
|
|
255
|
+
}
|
|
256
|
+
return content;
|
|
257
|
+
}
|
|
258
|
+
parseMarkdownContent(_content) {
|
|
259
|
+
// For now, return empty structures - this would be enhanced to parse the markdown
|
|
260
|
+
// and extract structured data from the content sections
|
|
261
|
+
return {
|
|
262
|
+
planSteps: [],
|
|
263
|
+
evidence: [],
|
|
264
|
+
policies: [],
|
|
265
|
+
featureFlags: [],
|
|
266
|
+
experiments: [],
|
|
267
|
+
telemetryContracts: [],
|
|
268
|
+
releasePlan: { strategy: 'immediate' },
|
|
269
|
+
aiInteractions: []
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Check if GAIT is initialized in the current directory
|
|
274
|
+
*/
|
|
275
|
+
async isInitialized() {
|
|
276
|
+
return this.fileExists(this.configPath);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get the base path for storage
|
|
280
|
+
*/
|
|
281
|
+
getBasePath() {
|
|
282
|
+
return this.basePath;
|
|
283
|
+
}
|
|
284
|
+
// Agent Management Methods
|
|
285
|
+
async saveAgent(agent) {
|
|
286
|
+
const filePath = path.join(this.agentsPath, `${agent.id}.md`);
|
|
287
|
+
// Create frontmatter for agent
|
|
288
|
+
const frontmatter = {
|
|
289
|
+
name: agent.name,
|
|
290
|
+
description: agent.description
|
|
291
|
+
};
|
|
292
|
+
// Add optional fields if they exist
|
|
293
|
+
if (agent.tools && agent.tools.length > 0) {
|
|
294
|
+
frontmatter.tools = agent.tools;
|
|
295
|
+
}
|
|
296
|
+
if (agent.metadata) {
|
|
297
|
+
frontmatter.createdAt = agent.metadata.createdAt.toISOString();
|
|
298
|
+
frontmatter.updatedAt = agent.metadata.updatedAt.toISOString();
|
|
299
|
+
if (agent.metadata.version) {
|
|
300
|
+
frontmatter.version = agent.metadata.version;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Create markdown content with frontmatter
|
|
304
|
+
const content = agent.content || '';
|
|
305
|
+
const fileContent = matter.stringify(content, frontmatter);
|
|
306
|
+
await fs.writeFile(filePath, fileContent, 'utf-8');
|
|
307
|
+
}
|
|
308
|
+
async loadAgent(id) {
|
|
309
|
+
const filePath = path.join(this.agentsPath, `${id}.md`);
|
|
310
|
+
if (!(await this.fileExists(filePath))) {
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
const fileContent = await fs.readFile(filePath, 'utf-8');
|
|
314
|
+
const parsed = matter(fileContent);
|
|
315
|
+
const frontmatter = parsed.data;
|
|
316
|
+
const agent = {
|
|
317
|
+
id,
|
|
318
|
+
name: frontmatter.name || '',
|
|
319
|
+
description: frontmatter.description || '',
|
|
320
|
+
tools: frontmatter.tools,
|
|
321
|
+
content: parsed.content.trim() || undefined,
|
|
322
|
+
metadata: {
|
|
323
|
+
createdAt: frontmatter.createdAt ? new Date(frontmatter.createdAt) : new Date(),
|
|
324
|
+
updatedAt: frontmatter.updatedAt ? new Date(frontmatter.updatedAt) : new Date(),
|
|
325
|
+
author: { type: 'human', id: 'current-user', name: 'Current User' },
|
|
326
|
+
version: frontmatter.version
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
return agent;
|
|
330
|
+
}
|
|
331
|
+
async loadAllAgents() {
|
|
332
|
+
const files = await fs.readdir(this.agentsPath);
|
|
333
|
+
const agents = [];
|
|
334
|
+
for (const file of files) {
|
|
335
|
+
if (file.endsWith('.md')) {
|
|
336
|
+
const id = path.basename(file, '.md');
|
|
337
|
+
const agent = await this.loadAgent(id);
|
|
338
|
+
if (agent) {
|
|
339
|
+
agents.push(agent);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return agents;
|
|
344
|
+
}
|
|
345
|
+
async deleteAgent(id) {
|
|
346
|
+
const filePath = path.join(this.agentsPath, `${id}.md`);
|
|
347
|
+
if (!(await this.fileExists(filePath))) {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
await fs.unlink(filePath);
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// Export a singleton instance
|
|
355
|
+
export const markdownStorage = new MarkdownStorageAdapter();
|
|
356
|
+
//# sourceMappingURL=markdown-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-storage.js","sourceRoot":"","sources":["../src/markdown-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface MigrationOptions {
|
|
2
|
+
basePath?: string;
|
|
3
|
+
backupOriginals?: boolean;
|
|
4
|
+
dryRun?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface MigrationResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
migratedCount: number;
|
|
9
|
+
errors: Array<{
|
|
10
|
+
id: string;
|
|
11
|
+
error: string;
|
|
12
|
+
}>;
|
|
13
|
+
backupPath?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class MigrationManager {
|
|
16
|
+
private jsonStorage;
|
|
17
|
+
private markdownStorage;
|
|
18
|
+
constructor(basePath?: string);
|
|
19
|
+
/**
|
|
20
|
+
* Migrate all JSON proposals to markdown format
|
|
21
|
+
*/
|
|
22
|
+
migrateToMarkdown(options?: MigrationOptions): Promise<MigrationResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Migrate from markdown back to JSON (rollback)
|
|
25
|
+
*/
|
|
26
|
+
migrateToJson(options?: MigrationOptions): Promise<MigrationResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Check what format is currently being used
|
|
29
|
+
*/
|
|
30
|
+
detectCurrentFormat(): Promise<'json' | 'markdown' | 'mixed' | 'none'>;
|
|
31
|
+
/**
|
|
32
|
+
* Validate that all proposals can be successfully migrated
|
|
33
|
+
*/
|
|
34
|
+
validateMigration(): Promise<{
|
|
35
|
+
valid: boolean;
|
|
36
|
+
issues: string[];
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Create a backup of all JSON proposals
|
|
40
|
+
*/
|
|
41
|
+
private createBackup;
|
|
42
|
+
/**
|
|
43
|
+
* Create a backup of all markdown proposals
|
|
44
|
+
*/
|
|
45
|
+
private createMarkdownBackup;
|
|
46
|
+
/**
|
|
47
|
+
* Get migration statistics
|
|
48
|
+
*/
|
|
49
|
+
getMigrationStats(): Promise<{
|
|
50
|
+
format: 'json' | 'markdown' | 'mixed' | 'none';
|
|
51
|
+
jsonCount: number;
|
|
52
|
+
markdownCount: number;
|
|
53
|
+
totalCount: number;
|
|
54
|
+
}>;
|
|
55
|
+
}
|
|
56
|
+
export declare const migrationManager: MigrationManager;
|
|
57
|
+
//# sourceMappingURL=migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,eAAe,CAAyB;gBAEpC,QAAQ,GAAE,MAAgB;IAKtC;;OAEG;IACG,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAgEjF;;OAEG;IACG,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAgE7E;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IAsB5E;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAoCxE;;OAEG;YACW,YAAY;IAmB1B;;OAEG;YACW,oBAAoB;IAmBlC;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC;QACjC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;QAC/C,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CAwBH;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
|