@nahisaho/musubix-codegraph 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +187 -0
  2. package/dist/codegraph.d.ts +218 -0
  3. package/dist/codegraph.d.ts.map +1 -0
  4. package/dist/codegraph.js +429 -0
  5. package/dist/codegraph.js.map +1 -0
  6. package/dist/events/event-emitter.d.ts +93 -0
  7. package/dist/events/event-emitter.d.ts.map +1 -0
  8. package/dist/events/event-emitter.js +152 -0
  9. package/dist/events/event-emitter.js.map +1 -0
  10. package/dist/events/index.d.ts +8 -0
  11. package/dist/events/index.d.ts.map +1 -0
  12. package/dist/events/index.js +8 -0
  13. package/dist/events/index.js.map +1 -0
  14. package/dist/graph/graph-engine.d.ts +97 -0
  15. package/dist/graph/graph-engine.d.ts.map +1 -0
  16. package/dist/graph/graph-engine.js +341 -0
  17. package/dist/graph/graph-engine.js.map +1 -0
  18. package/dist/graph/index.d.ts +8 -0
  19. package/dist/graph/index.d.ts.map +1 -0
  20. package/dist/graph/index.js +8 -0
  21. package/dist/graph/index.js.map +1 -0
  22. package/dist/graphrag/graphrag-search.d.ts +67 -0
  23. package/dist/graphrag/graphrag-search.d.ts.map +1 -0
  24. package/dist/graphrag/graphrag-search.js +297 -0
  25. package/dist/graphrag/graphrag-search.js.map +1 -0
  26. package/dist/graphrag/index.d.ts +8 -0
  27. package/dist/graphrag/index.d.ts.map +1 -0
  28. package/dist/graphrag/index.js +8 -0
  29. package/dist/graphrag/index.js.map +1 -0
  30. package/dist/index.d.ts +18 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +20 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/indexer/index.d.ts +8 -0
  35. package/dist/indexer/index.d.ts.map +1 -0
  36. package/dist/indexer/index.js +8 -0
  37. package/dist/indexer/index.js.map +1 -0
  38. package/dist/indexer/indexer.d.ts +58 -0
  39. package/dist/indexer/indexer.d.ts.map +1 -0
  40. package/dist/indexer/indexer.js +206 -0
  41. package/dist/indexer/indexer.js.map +1 -0
  42. package/dist/parser/ast-parser.d.ts +79 -0
  43. package/dist/parser/ast-parser.d.ts.map +1 -0
  44. package/dist/parser/ast-parser.js +489 -0
  45. package/dist/parser/ast-parser.js.map +1 -0
  46. package/dist/parser/index.d.ts +8 -0
  47. package/dist/parser/index.d.ts.map +1 -0
  48. package/dist/parser/index.js +8 -0
  49. package/dist/parser/index.js.map +1 -0
  50. package/dist/storage/index.d.ts +9 -0
  51. package/dist/storage/index.d.ts.map +1 -0
  52. package/dist/storage/index.js +10 -0
  53. package/dist/storage/index.js.map +1 -0
  54. package/dist/storage/memory-storage.d.ts +102 -0
  55. package/dist/storage/memory-storage.d.ts.map +1 -0
  56. package/dist/storage/memory-storage.js +263 -0
  57. package/dist/storage/memory-storage.js.map +1 -0
  58. package/dist/storage/sqlite-storage.d.ts +90 -0
  59. package/dist/storage/sqlite-storage.d.ts.map +1 -0
  60. package/dist/storage/sqlite-storage.js +344 -0
  61. package/dist/storage/sqlite-storage.js.map +1 -0
  62. package/dist/types.d.ts +539 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +99 -0
  65. package/dist/types.js.map +1 -0
  66. package/package.json +85 -0
@@ -0,0 +1,344 @@
1
+ /**
2
+ * @nahisaho/musubix-codegraph - SQLite Storage Implementation
3
+ *
4
+ * Persistent SQLite-based storage adapter for CodeGraph
5
+ *
6
+ * @see REQ-CG-API-005
7
+ * @see DES-CG-006
8
+ * @see TSK-CG-052
9
+ */
10
+ import * as fs from 'fs/promises';
11
+ import * as path from 'path';
12
+ /**
13
+ * SQLite storage adapter
14
+ *
15
+ * Stores entities and relations in SQLite database for persistence.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const storage = new SQLiteStorage('.codegraph/index.db');
20
+ * await storage.initialize();
21
+ *
22
+ * await storage.saveEntity(entity);
23
+ * const retrieved = await storage.getEntity(entity.id);
24
+ * ```
25
+ */
26
+ export class SQLiteStorage {
27
+ dbPath;
28
+ db = null;
29
+ initialized = false;
30
+ constructor(dbPath = '.codegraph/index.db') {
31
+ this.dbPath = dbPath;
32
+ }
33
+ /**
34
+ * Initialize the database
35
+ */
36
+ async initialize() {
37
+ if (this.initialized)
38
+ return;
39
+ // Ensure directory exists
40
+ const dir = path.dirname(this.dbPath);
41
+ await fs.mkdir(dir, { recursive: true });
42
+ // Dynamic import of better-sqlite3
43
+ try {
44
+ const BetterSqlite3 = (await import('better-sqlite3')).default;
45
+ this.db = new BetterSqlite3(this.dbPath);
46
+ // Create tables
47
+ this.db.exec(`
48
+ CREATE TABLE IF NOT EXISTS entities (
49
+ id TEXT PRIMARY KEY,
50
+ name TEXT NOT NULL,
51
+ type TEXT NOT NULL,
52
+ language TEXT,
53
+ file_path TEXT,
54
+ start_line INTEGER,
55
+ end_line INTEGER,
56
+ source_code TEXT,
57
+ docstring TEXT,
58
+ signature TEXT,
59
+ qualified_name TEXT,
60
+ namespace TEXT,
61
+ community_id TEXT,
62
+ metadata TEXT,
63
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
64
+ updated_at TEXT DEFAULT CURRENT_TIMESTAMP
65
+ );
66
+
67
+ CREATE TABLE IF NOT EXISTS relations (
68
+ id TEXT PRIMARY KEY,
69
+ source_id TEXT NOT NULL,
70
+ target_id TEXT NOT NULL,
71
+ type TEXT NOT NULL,
72
+ weight REAL DEFAULT 1.0,
73
+ metadata TEXT,
74
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
75
+ FOREIGN KEY (source_id) REFERENCES entities(id) ON DELETE CASCADE,
76
+ FOREIGN KEY (target_id) REFERENCES entities(id) ON DELETE CASCADE
77
+ );
78
+
79
+ CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
80
+ CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(type);
81
+ CREATE INDEX IF NOT EXISTS idx_entities_file_path ON entities(file_path);
82
+ CREATE INDEX IF NOT EXISTS idx_relations_source ON relations(source_id);
83
+ CREATE INDEX IF NOT EXISTS idx_relations_target ON relations(target_id);
84
+ CREATE INDEX IF NOT EXISTS idx_relations_type ON relations(type);
85
+ `);
86
+ this.initialized = true;
87
+ }
88
+ catch (error) {
89
+ throw new Error(`Failed to initialize SQLite: ${error instanceof Error ? error.message : String(error)}`);
90
+ }
91
+ }
92
+ /**
93
+ * Close the database connection
94
+ */
95
+ async close() {
96
+ if (this.db) {
97
+ this.db.close();
98
+ this.db = null;
99
+ }
100
+ this.initialized = false;
101
+ }
102
+ // =========================================================================
103
+ // Entity Operations
104
+ // =========================================================================
105
+ /**
106
+ * Save an entity
107
+ */
108
+ async saveEntity(entity) {
109
+ this.ensureInitialized();
110
+ const stmt = this.db.prepare(`
111
+ INSERT OR REPLACE INTO entities (
112
+ id, name, type, language, file_path, start_line, end_line,
113
+ source_code, docstring, signature, qualified_name, namespace,
114
+ community_id, metadata, updated_at
115
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
116
+ `);
117
+ stmt.run(entity.id, entity.name, entity.type, entity.language ?? null, entity.filePath ?? null, entity.startLine ?? null, entity.endLine ?? null, entity.sourceCode ?? null, entity.docstring ?? null, entity.signature ?? null, entity.qualifiedName ?? null, entity.namespace ?? null, entity.communityId ?? null, entity.metadata ? JSON.stringify(entity.metadata) : '{}');
118
+ }
119
+ /**
120
+ * Get an entity by ID
121
+ */
122
+ async getEntity(id) {
123
+ this.ensureInitialized();
124
+ const stmt = this.db.prepare('SELECT * FROM entities WHERE id = ?');
125
+ const row = stmt.get(id);
126
+ return row ? this.rowToEntity(row) : null;
127
+ }
128
+ /**
129
+ * Query entities
130
+ */
131
+ async queryEntities(query) {
132
+ this.ensureInitialized();
133
+ const conditions = ['1=1'];
134
+ const params = [];
135
+ // Filter by entity types
136
+ if (query.entityTypes && query.entityTypes.length > 0) {
137
+ const placeholders = query.entityTypes.map(() => '?').join(',');
138
+ conditions.push(`type IN (${placeholders})`);
139
+ params.push(...query.entityTypes);
140
+ }
141
+ // Filter by file path
142
+ if (query.filePath) {
143
+ conditions.push('LOWER(file_path) = LOWER(?)');
144
+ params.push(query.filePath);
145
+ }
146
+ // Filter by namespace
147
+ if (query.namespace) {
148
+ conditions.push('namespace = ?');
149
+ params.push(query.namespace);
150
+ }
151
+ // Filter by name pattern
152
+ if (query.namePattern) {
153
+ conditions.push('name GLOB ?');
154
+ params.push(query.namePattern);
155
+ }
156
+ // Text search
157
+ if (query.textSearch) {
158
+ conditions.push(`(
159
+ name LIKE ? OR
160
+ id LIKE ? OR
161
+ docstring LIKE ?
162
+ )`);
163
+ const searchPattern = `%${query.textSearch}%`;
164
+ params.push(searchPattern, searchPattern, searchPattern);
165
+ }
166
+ let sql = `SELECT * FROM entities WHERE ${conditions.join(' AND ')}`;
167
+ // Apply limit
168
+ if (query.limit && query.limit > 0) {
169
+ sql += ` LIMIT ?`;
170
+ params.push(query.limit);
171
+ }
172
+ // Apply offset
173
+ if (query.offset && query.offset > 0) {
174
+ sql += ` OFFSET ?`;
175
+ params.push(query.offset);
176
+ }
177
+ const stmt = this.db.prepare(sql);
178
+ const rows = stmt.all(...params);
179
+ return rows.map(row => this.rowToEntity(row));
180
+ }
181
+ /**
182
+ * Delete an entity
183
+ */
184
+ async deleteEntity(id) {
185
+ this.ensureInitialized();
186
+ // Delete relations first (SQLite CASCADE should handle this, but be explicit)
187
+ const deleteRelations = this.db.prepare('DELETE FROM relations WHERE source_id = ? OR target_id = ?');
188
+ deleteRelations.run(id, id);
189
+ // Delete entity
190
+ const deleteEntity = this.db.prepare('DELETE FROM entities WHERE id = ?');
191
+ deleteEntity.run(id);
192
+ }
193
+ // =========================================================================
194
+ // Relation Operations
195
+ // =========================================================================
196
+ /**
197
+ * Save a relation
198
+ */
199
+ async saveRelation(relation) {
200
+ this.ensureInitialized();
201
+ const stmt = this.db.prepare(`
202
+ INSERT OR REPLACE INTO relations (id, source_id, target_id, type, weight, metadata)
203
+ VALUES (?, ?, ?, ?, ?, ?)
204
+ `);
205
+ stmt.run(relation.id, relation.sourceId, relation.targetId, relation.type, relation.weight, relation.metadata ? JSON.stringify(relation.metadata) : '{}');
206
+ }
207
+ /**
208
+ * Get relations for an entity
209
+ */
210
+ async getRelations(entityId, direction = 'both') {
211
+ this.ensureInitialized();
212
+ let sql;
213
+ let params;
214
+ switch (direction) {
215
+ case 'out':
216
+ sql = 'SELECT * FROM relations WHERE source_id = ?';
217
+ params = [entityId];
218
+ break;
219
+ case 'in':
220
+ sql = 'SELECT * FROM relations WHERE target_id = ?';
221
+ params = [entityId];
222
+ break;
223
+ default:
224
+ sql = 'SELECT * FROM relations WHERE source_id = ? OR target_id = ?';
225
+ params = [entityId, entityId];
226
+ }
227
+ const stmt = this.db.prepare(sql);
228
+ const rows = stmt.all(...params);
229
+ return rows.map(row => this.rowToRelation(row));
230
+ }
231
+ /**
232
+ * Delete a relation
233
+ */
234
+ async deleteRelation(id) {
235
+ this.ensureInitialized();
236
+ const stmt = this.db.prepare('DELETE FROM relations WHERE id = ?');
237
+ stmt.run(id);
238
+ }
239
+ // =========================================================================
240
+ // Bulk Operations
241
+ // =========================================================================
242
+ /**
243
+ * Bulk save entities and relations
244
+ */
245
+ async bulkSave(entities, relations) {
246
+ this.ensureInitialized();
247
+ const saveEntitiesAndRelations = this.db.transaction(() => {
248
+ for (const entity of entities) {
249
+ const stmt = this.db.prepare(`
250
+ INSERT OR REPLACE INTO entities (
251
+ id, name, type, language, file_path, start_line, end_line,
252
+ source_code, docstring, signature, qualified_name, namespace,
253
+ community_id, metadata, updated_at
254
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
255
+ `);
256
+ stmt.run(entity.id, entity.name, entity.type, entity.language ?? null, entity.filePath ?? null, entity.startLine ?? null, entity.endLine ?? null, entity.sourceCode ?? null, entity.docstring ?? null, entity.signature ?? null, entity.qualifiedName ?? null, entity.namespace ?? null, entity.communityId ?? null, entity.metadata ? JSON.stringify(entity.metadata) : '{}');
257
+ }
258
+ for (const relation of relations) {
259
+ const stmt = this.db.prepare(`
260
+ INSERT OR REPLACE INTO relations (id, source_id, target_id, type, weight, metadata)
261
+ VALUES (?, ?, ?, ?, ?, ?)
262
+ `);
263
+ stmt.run(relation.id, relation.sourceId, relation.targetId, relation.type, relation.weight, relation.metadata ? JSON.stringify(relation.metadata) : '{}');
264
+ }
265
+ });
266
+ saveEntitiesAndRelations();
267
+ }
268
+ /**
269
+ * Clear all data
270
+ */
271
+ async clear() {
272
+ this.ensureInitialized();
273
+ this.db.exec(`
274
+ DELETE FROM relations;
275
+ DELETE FROM entities;
276
+ `);
277
+ }
278
+ // =========================================================================
279
+ // Statistics
280
+ // =========================================================================
281
+ /**
282
+ * Get storage statistics
283
+ */
284
+ async getStats() {
285
+ this.ensureInitialized();
286
+ const entityCount = this.db.prepare('SELECT COUNT(*) as count FROM entities').get();
287
+ const relationCount = this.db.prepare('SELECT COUNT(*) as count FROM relations').get();
288
+ const fileCount = this.db.prepare('SELECT COUNT(DISTINCT file_path) as count FROM entities WHERE file_path IS NOT NULL').get();
289
+ return {
290
+ entityCount: entityCount.count,
291
+ relationCount: relationCount.count,
292
+ fileCount: fileCount.count,
293
+ };
294
+ }
295
+ // =========================================================================
296
+ // Helper Methods
297
+ // =========================================================================
298
+ ensureInitialized() {
299
+ if (!this.initialized || !this.db) {
300
+ throw new Error('SQLite storage not initialized. Call initialize() first.');
301
+ }
302
+ }
303
+ rowToEntity(row) {
304
+ return {
305
+ id: row.id,
306
+ name: row.name,
307
+ type: row.type,
308
+ language: row.language ?? undefined,
309
+ filePath: row.file_path ?? undefined,
310
+ startLine: row.start_line ?? undefined,
311
+ endLine: row.end_line ?? undefined,
312
+ sourceCode: row.source_code ?? undefined,
313
+ docstring: row.docstring ?? undefined,
314
+ signature: row.signature ?? undefined,
315
+ qualifiedName: row.qualified_name ?? undefined,
316
+ namespace: row.namespace ?? undefined,
317
+ communityId: row.community_id ?? undefined,
318
+ metadata: row.metadata ? JSON.parse(row.metadata) : {},
319
+ };
320
+ }
321
+ rowToRelation(row) {
322
+ return {
323
+ id: row.id,
324
+ sourceId: row.source_id,
325
+ targetId: row.target_id,
326
+ type: row.type,
327
+ weight: row.weight ?? 1.0,
328
+ metadata: row.metadata ? JSON.parse(row.metadata) : {},
329
+ };
330
+ }
331
+ /**
332
+ * Check if storage is initialized
333
+ */
334
+ isInitialized() {
335
+ return this.initialized;
336
+ }
337
+ /**
338
+ * Get database path
339
+ */
340
+ getDatabasePath() {
341
+ return this.dbPath;
342
+ }
343
+ }
344
+ //# sourceMappingURL=sqlite-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-storage.js","sourceRoot":"","sources":["../../src/storage/sqlite-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAgB7B;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAS;IACf,EAAE,GAAoB,IAAI,CAAC;IAC3B,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,SAAiB,qBAAqB;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,0BAA0B;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzC,mCAAmC;QACnC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/D,IAAI,CAAC,EAAE,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAwB,CAAC;YAEhE,gBAAgB;YAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCZ,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,4EAA4E;IAC5E,oBAAoB;IACpB,4EAA4E;IAE5E;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC;;;;;;KAM7B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,QAAQ,IAAI,IAAI,EACvB,MAAM,CAAC,QAAQ,IAAI,IAAI,EACvB,MAAM,CAAC,SAAS,IAAI,IAAI,EACxB,MAAM,CAAC,OAAO,IAAI,IAAI,EACtB,MAAM,CAAC,UAAU,IAAI,IAAI,EACzB,MAAM,CAAC,SAAS,IAAI,IAAI,EACxB,MAAM,CAAC,SAAS,IAAI,IAAI,EACxB,MAAM,CAAC,aAAa,IAAI,IAAI,EAC5B,MAAM,CAAC,SAAS,IAAI,IAAI,EACxB,MAAM,CAAC,WAAW,IAAI,IAAI,EAC1B,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CACzD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAA0B,CAAC;QAElD,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,KAAiB;QACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,UAAU,GAAa,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,yBAAyB;QACzB,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChE,UAAU,CAAC,IAAI,CAAC,YAAY,YAAY,GAAG,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QAED,sBAAsB;QACtB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,sBAAsB;QACtB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QAED,yBAAyB;QACzB,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAED,cAAc;QACd,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC;;;;QAId,CAAC,CAAC;YACJ,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,GAAG,GAAG,gCAAgC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAErE,cAAc;QACd,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACnC,GAAG,IAAI,UAAU,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,eAAe;QACf,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,GAAG,IAAI,WAAW,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAgB,CAAC;QAEhD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,8EAA8E;QAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CACtC,4DAA4D,CAC7D,CAAC;QACF,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5B,gBAAgB;QAChB,MAAM,YAAY,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAC3E,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,4EAA4E;IAC5E,sBAAsB;IACtB,4EAA4E;IAE5E;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAAkB;QACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC;;;KAG7B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,QAAQ,CAAC,EAAE,EACX,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAC7D,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,QAAgB,EAChB,YAAmC,MAAM;QAEzC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,GAAW,CAAC;QAChB,IAAI,MAAgB,CAAC;QAErB,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,KAAK;gBACR,GAAG,GAAG,6CAA6C,CAAC;gBACpD,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACpB,MAAM;YACR,KAAK,IAAI;gBACP,GAAG,GAAG,6CAA6C,CAAC;gBACpD,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACpB,MAAM;YACR;gBACE,GAAG,GAAG,8DAA8D,CAAC;gBACrE,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAkB,CAAC;QAElD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,4EAA4E;IAC5E,kBAAkB;IAClB,4EAA4E;IAE5E;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAkB,EAAE,SAAqB;QACtD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,wBAAwB,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,GAAG,EAAE;YACzD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC;;;;;;SAM7B,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,QAAQ,IAAI,IAAI,EACvB,MAAM,CAAC,QAAQ,IAAI,IAAI,EACvB,MAAM,CAAC,SAAS,IAAI,IAAI,EACxB,MAAM,CAAC,OAAO,IAAI,IAAI,EACtB,MAAM,CAAC,UAAU,IAAI,IAAI,EACzB,MAAM,CAAC,SAAS,IAAI,IAAI,EACxB,MAAM,CAAC,SAAS,IAAI,IAAI,EACxB,MAAM,CAAC,aAAa,IAAI,IAAI,EAC5B,MAAM,CAAC,SAAS,IAAI,IAAI,EACxB,MAAM,CAAC,WAAW,IAAI,IAAI,EAC1B,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CACzD,CAAC;YACJ,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC;;;SAG7B,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CACN,QAAQ,CAAC,EAAE,EACX,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAC7D,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,wBAAwB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC;;;KAGb,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,aAAa;IACb,4EAA4E;IAE5E;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,EAAuB,CAAC;QAC1G,MAAM,aAAa,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAAuB,CAAC;QAC7G,MAAM,SAAS,GAAG,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,qFAAqF,CAAC,CAAC,GAAG,EAAuB,CAAC;QAErJ,OAAO;YACL,WAAW,EAAE,WAAW,CAAC,KAAK;YAC9B,aAAa,EAAE,aAAa,CAAC,KAAK;YAClC,SAAS,EAAE,SAAS,CAAC,KAAK;SAC3B,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAEpE,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,GAAc;QAChC,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAsB;YAChC,QAAQ,EAAE,GAAG,CAAC,QAA8B,IAAI,SAAS;YACzD,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;YACpC,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;YACtC,OAAO,EAAE,GAAG,CAAC,QAAQ,IAAI,SAAS;YAClC,UAAU,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;YACxC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;YACrC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;YACrC,aAAa,EAAE,GAAG,CAAC,cAAc,IAAI,SAAS;YAC9C,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;YACrC,WAAW,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;YAC1C,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;SACvD,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,GAAgB;QACpC,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,IAAI,EAAE,GAAG,CAAC,IAAoB;YAC9B,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG;YACzB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;SACvD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}