memgrid 0.5.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 (96) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/LICENSE +21 -0
  3. package/README.md +251 -0
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +2 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/learn/index.d.ts +44 -0
  9. package/dist/learn/index.d.ts.map +1 -0
  10. package/dist/learn/index.js +234 -0
  11. package/dist/learn/index.js.map +1 -0
  12. package/dist/memgrid.d.ts +50 -0
  13. package/dist/memgrid.d.ts.map +1 -0
  14. package/dist/memgrid.js +175 -0
  15. package/dist/memgrid.js.map +1 -0
  16. package/dist/retrieve/index.d.ts +27 -0
  17. package/dist/retrieve/index.d.ts.map +1 -0
  18. package/dist/retrieve/index.js +209 -0
  19. package/dist/retrieve/index.js.map +1 -0
  20. package/dist/retrieve/semantic.d.ts +67 -0
  21. package/dist/retrieve/semantic.d.ts.map +1 -0
  22. package/dist/retrieve/semantic.js +240 -0
  23. package/dist/retrieve/semantic.js.map +1 -0
  24. package/dist/scanner/composite.d.ts +27 -0
  25. package/dist/scanner/composite.d.ts.map +1 -0
  26. package/dist/scanner/composite.js +58 -0
  27. package/dist/scanner/composite.js.map +1 -0
  28. package/dist/scanner/config.d.ts +15 -0
  29. package/dist/scanner/config.d.ts.map +1 -0
  30. package/dist/scanner/config.js +167 -0
  31. package/dist/scanner/config.js.map +1 -0
  32. package/dist/scanner/golang.d.ts +19 -0
  33. package/dist/scanner/golang.d.ts.map +1 -0
  34. package/dist/scanner/golang.js +190 -0
  35. package/dist/scanner/golang.js.map +1 -0
  36. package/dist/scanner/index.d.ts +11 -0
  37. package/dist/scanner/index.d.ts.map +1 -0
  38. package/dist/scanner/index.js +10 -0
  39. package/dist/scanner/index.js.map +1 -0
  40. package/dist/scanner/javascript.d.ts +20 -0
  41. package/dist/scanner/javascript.d.ts.map +1 -0
  42. package/dist/scanner/javascript.js +167 -0
  43. package/dist/scanner/javascript.js.map +1 -0
  44. package/dist/scanner/markdown.d.ts +17 -0
  45. package/dist/scanner/markdown.d.ts.map +1 -0
  46. package/dist/scanner/markdown.js +106 -0
  47. package/dist/scanner/markdown.js.map +1 -0
  48. package/dist/scanner/python.d.ts +19 -0
  49. package/dist/scanner/python.d.ts.map +1 -0
  50. package/dist/scanner/python.js +177 -0
  51. package/dist/scanner/python.js.map +1 -0
  52. package/dist/scanner/rules.d.ts +15 -0
  53. package/dist/scanner/rules.d.ts.map +1 -0
  54. package/dist/scanner/rules.js +86 -0
  55. package/dist/scanner/rules.js.map +1 -0
  56. package/dist/scanner/rust.d.ts +18 -0
  57. package/dist/scanner/rust.d.ts.map +1 -0
  58. package/dist/scanner/rust.js +178 -0
  59. package/dist/scanner/rust.js.map +1 -0
  60. package/dist/scanner/scanner.d.ts +33 -0
  61. package/dist/scanner/scanner.d.ts.map +1 -0
  62. package/dist/scanner/scanner.js +2 -0
  63. package/dist/scanner/scanner.js.map +1 -0
  64. package/dist/scanner/typescript.d.ts +28 -0
  65. package/dist/scanner/typescript.d.ts.map +1 -0
  66. package/dist/scanner/typescript.js +522 -0
  67. package/dist/scanner/typescript.js.map +1 -0
  68. package/dist/serve/cli.d.ts +3 -0
  69. package/dist/serve/cli.d.ts.map +1 -0
  70. package/dist/serve/cli.js +145 -0
  71. package/dist/serve/cli.js.map +1 -0
  72. package/dist/serve/mcp-server.d.ts +11 -0
  73. package/dist/serve/mcp-server.d.ts.map +1 -0
  74. package/dist/serve/mcp-server.js +276 -0
  75. package/dist/serve/mcp-server.js.map +1 -0
  76. package/dist/shared/constants.d.ts +2 -0
  77. package/dist/shared/constants.d.ts.map +1 -0
  78. package/dist/shared/constants.js +2 -0
  79. package/dist/shared/constants.js.map +1 -0
  80. package/dist/shared/types.d.ts +99 -0
  81. package/dist/shared/types.d.ts.map +1 -0
  82. package/dist/shared/types.js +3 -0
  83. package/dist/shared/types.js.map +1 -0
  84. package/dist/store/file-store.d.ts +62 -0
  85. package/dist/store/file-store.d.ts.map +1 -0
  86. package/dist/store/file-store.js +241 -0
  87. package/dist/store/file-store.js.map +1 -0
  88. package/dist/store/index.d.ts +3 -0
  89. package/dist/store/index.d.ts.map +1 -0
  90. package/dist/store/index.js +2 -0
  91. package/dist/store/index.js.map +1 -0
  92. package/dist/sync/index.d.ts +56 -0
  93. package/dist/sync/index.d.ts.map +1 -0
  94. package/dist/sync/index.js +580 -0
  95. package/dist/sync/index.js.map +1 -0
  96. package/package.json +51 -0
@@ -0,0 +1,62 @@
1
+ import type { MemoryUnit, MemoryGrid, MemoryUnitType } from '../shared/types.js';
2
+ export interface ListFilter {
3
+ type?: MemoryUnitType;
4
+ includeArchived?: boolean;
5
+ }
6
+ /**
7
+ * File-based store with in-memory index cache.
8
+ *
9
+ * Units stored as JSON (not YAML) for maximum read/write performance.
10
+ * First init/load: all JSON files read → JSON.parse → cached in Map.
11
+ * After that: listUnits()/getUnit() are O(1) memory lookups.
12
+ * saveUnit() writes to disk + updates cache instantly.
13
+ */
14
+ export declare class FileStore {
15
+ private projectRoot;
16
+ private cache;
17
+ private archiveCache;
18
+ private gridCache;
19
+ private loaded;
20
+ private dirtyUsage;
21
+ constructor(projectRoot: string);
22
+ get gridDir(): string;
23
+ get unitsDir(): string;
24
+ get archiveDir(): string;
25
+ get meshPath(): string;
26
+ unitPath(id: string): string;
27
+ archivePath(id: string): string;
28
+ ensureDirs(): void;
29
+ /**
30
+ * Load all JSON unit files into memory cache.
31
+ * Supports both .json (new) and .yaml (legacy) for migration.
32
+ */
33
+ load(): {
34
+ total: number;
35
+ loadedMs: number;
36
+ };
37
+ reload(): void;
38
+ listUnits(filter?: ListFilter): Promise<MemoryUnit[]>;
39
+ getUnit(id: string): MemoryUnit | null;
40
+ saveUnit(unit: MemoryUnit): void;
41
+ deleteUnit(id: string): void;
42
+ archiveUnit(id: string): void;
43
+ touch(id: string): void;
44
+ flushUsage(): {
45
+ synced: number;
46
+ };
47
+ saveUnits(units: MemoryUnit[]): {
48
+ written: number;
49
+ skipped: number;
50
+ };
51
+ getGrid(): MemoryGrid | null;
52
+ saveGrid(grid: MemoryGrid): void;
53
+ getStats(): {
54
+ totalUnits: number;
55
+ activeUnits: number;
56
+ archivedUnits: number;
57
+ typeDistribution: Record<string, number>;
58
+ };
59
+ private ensureLoaded;
60
+ private unitsEqual;
61
+ }
62
+ //# sourceMappingURL=file-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/store/file-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAOjF,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAA0B;gBAEhC,WAAW,EAAE,MAAM;IAM/B,IAAI,OAAO,IAAI,MAAM,CAAkD;IACvE,IAAI,QAAQ,IAAI,MAAM,CAA+C;IACrE,IAAI,UAAU,IAAI,MAAM,CAAiD;IACzE,IAAI,QAAQ,IAAI,MAAM,CAA+C;IAErE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAI5B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAS/B,UAAU,IAAI,IAAI;IAKlB;;;OAGG;IACH,IAAI,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAkD3C,MAAM,IAAI,IAAI;IAIR,SAAS,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAiB3D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAOtC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAehC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ5B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAmB7B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IASvB,UAAU,IAAI;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAkBhC,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAmBpE,OAAO,IAAI,UAAU,GAAG,IAAI;IAO5B,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAOhC,QAAQ;;;;;;IAkBR,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;CASnB"}
@@ -0,0 +1,241 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ const GRID_DIR = '.claude/memory-grid';
4
+ const UNITS_DIR = 'units';
5
+ const ARCHIVE_DIR = 'archive';
6
+ const MESH_FILE = 'mesh.json';
7
+ /**
8
+ * File-based store with in-memory index cache.
9
+ *
10
+ * Units stored as JSON (not YAML) for maximum read/write performance.
11
+ * First init/load: all JSON files read → JSON.parse → cached in Map.
12
+ * After that: listUnits()/getUnit() are O(1) memory lookups.
13
+ * saveUnit() writes to disk + updates cache instantly.
14
+ */
15
+ export class FileStore {
16
+ projectRoot;
17
+ // In-memory cache
18
+ cache = new Map();
19
+ archiveCache = new Map();
20
+ gridCache = null;
21
+ loaded = false;
22
+ dirtyUsage = new Set();
23
+ constructor(projectRoot) {
24
+ this.projectRoot = projectRoot;
25
+ }
26
+ // ===== Path helpers =====
27
+ get gridDir() { return path.join(this.projectRoot, GRID_DIR); }
28
+ get unitsDir() { return path.join(this.gridDir, UNITS_DIR); }
29
+ get archiveDir() { return path.join(this.gridDir, ARCHIVE_DIR); }
30
+ get meshPath() { return path.join(this.gridDir, MESH_FILE); }
31
+ unitPath(id) {
32
+ return path.join(this.unitsDir, `${id}.json`);
33
+ }
34
+ archivePath(id) {
35
+ const year = new Date().getFullYear();
36
+ const dir = path.join(this.archiveDir, String(year));
37
+ fs.mkdirSync(dir, { recursive: true });
38
+ return path.join(dir, `${id}.json`);
39
+ }
40
+ // ===== Initialization =====
41
+ ensureDirs() {
42
+ fs.mkdirSync(this.unitsDir, { recursive: true });
43
+ fs.mkdirSync(this.archiveDir, { recursive: true });
44
+ }
45
+ /**
46
+ * Load all JSON unit files into memory cache.
47
+ * Supports both .json (new) and .yaml (legacy) for migration.
48
+ */
49
+ load() {
50
+ const start = Date.now();
51
+ this.ensureDirs();
52
+ const parseUnit = (filePath) => {
53
+ try {
54
+ const content = fs.readFileSync(filePath, 'utf-8');
55
+ return JSON.parse(content);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ };
61
+ // Load active units
62
+ this.cache.clear();
63
+ if (fs.existsSync(this.unitsDir)) {
64
+ for (const file of fs.readdirSync(this.unitsDir)) {
65
+ if (!file.endsWith('.json') && !file.endsWith('.yaml'))
66
+ continue;
67
+ const unit = parseUnit(path.join(this.unitsDir, file));
68
+ if (unit)
69
+ this.cache.set(unit.id, unit);
70
+ }
71
+ }
72
+ // Load archived units
73
+ this.archiveCache.clear();
74
+ if (fs.existsSync(this.archiveDir)) {
75
+ const walkArchive = (dir) => {
76
+ if (!fs.existsSync(dir))
77
+ return;
78
+ for (const entry of fs.readdirSync(dir)) {
79
+ const full = path.join(dir, entry);
80
+ if (fs.statSync(full).isDirectory()) {
81
+ walkArchive(full);
82
+ }
83
+ else if (entry.endsWith('.json') || entry.endsWith('.yaml')) {
84
+ const unit = parseUnit(full);
85
+ if (unit)
86
+ this.archiveCache.set(unit.id, unit);
87
+ }
88
+ }
89
+ };
90
+ walkArchive(this.archiveDir);
91
+ }
92
+ this.loaded = true;
93
+ this.dirtyUsage.clear();
94
+ return {
95
+ total: this.cache.size + this.archiveCache.size,
96
+ loadedMs: Date.now() - start,
97
+ };
98
+ }
99
+ reload() { this.load(); }
100
+ // ===== Unit read (from cache) =====
101
+ async listUnits(filter) {
102
+ this.ensureLoaded();
103
+ const results = [];
104
+ for (const unit of this.cache.values()) {
105
+ if (!filter?.type || unit.type === filter.type)
106
+ results.push(unit);
107
+ }
108
+ if (filter?.includeArchived) {
109
+ for (const unit of this.archiveCache.values()) {
110
+ if (!filter?.type || unit.type === filter.type)
111
+ results.push(unit);
112
+ }
113
+ }
114
+ return results;
115
+ }
116
+ getUnit(id) {
117
+ this.ensureLoaded();
118
+ return this.cache.get(id) || this.archiveCache.get(id) || null;
119
+ }
120
+ // ===== Unit write (JSON → disk + cache) =====
121
+ saveUnit(unit) {
122
+ this.ensureLoaded();
123
+ const filePath = this.unitPath(unit.id);
124
+ const jsonStr = JSON.stringify(unit, null, 2);
125
+ fs.writeFileSync(filePath, jsonStr, 'utf-8');
126
+ // Update cache
127
+ if (unit.meta.status === 'archived') {
128
+ this.cache.delete(unit.id);
129
+ this.archiveCache.set(unit.id, unit);
130
+ }
131
+ else {
132
+ this.cache.set(unit.id, unit);
133
+ }
134
+ }
135
+ deleteUnit(id) {
136
+ this.ensureLoaded();
137
+ const filePath = this.unitPath(id);
138
+ if (fs.existsSync(filePath))
139
+ fs.unlinkSync(filePath);
140
+ this.cache.delete(id);
141
+ this.archiveCache.delete(id);
142
+ }
143
+ archiveUnit(id) {
144
+ this.ensureLoaded();
145
+ const unit = this.cache.get(id);
146
+ if (!unit)
147
+ return;
148
+ const fromPath = this.unitPath(id);
149
+ const toPath = this.archivePath(id);
150
+ unit.meta.status = 'archived';
151
+ unit.meta.updated = new Date().toISOString();
152
+ const jsonStr = JSON.stringify(unit, null, 2);
153
+ fs.writeFileSync(toPath, jsonStr, 'utf-8');
154
+ if (fs.existsSync(fromPath))
155
+ fs.unlinkSync(fromPath);
156
+ this.cache.delete(id);
157
+ this.archiveCache.set(id, unit);
158
+ }
159
+ touch(id) {
160
+ this.ensureLoaded();
161
+ const unit = this.cache.get(id) || this.archiveCache.get(id);
162
+ if (unit) {
163
+ unit.meta.usage_count++;
164
+ this.dirtyUsage.add(id);
165
+ }
166
+ }
167
+ flushUsage() {
168
+ let synced = 0;
169
+ for (const id of this.dirtyUsage) {
170
+ const unit = this.cache.get(id) || this.archiveCache.get(id);
171
+ if (unit) {
172
+ const filePath = unit.meta.status === 'archived'
173
+ ? this.archivePath(id)
174
+ : this.unitPath(id);
175
+ if (fs.existsSync(filePath)) {
176
+ fs.writeFileSync(filePath, JSON.stringify(unit, null, 2), 'utf-8');
177
+ synced++;
178
+ }
179
+ }
180
+ }
181
+ this.dirtyUsage.clear();
182
+ return { synced };
183
+ }
184
+ saveUnits(units) {
185
+ this.ensureLoaded();
186
+ let written = 0, skipped = 0;
187
+ for (const unit of units) {
188
+ const existing = this.cache.get(unit.id);
189
+ if (existing && this.unitsEqual(existing, unit)) {
190
+ skipped++;
191
+ }
192
+ else {
193
+ this.saveUnit(unit);
194
+ written++;
195
+ }
196
+ }
197
+ return { written, skipped };
198
+ }
199
+ // ===== Grid =====
200
+ getGrid() {
201
+ if (this.gridCache)
202
+ return this.gridCache;
203
+ if (!fs.existsSync(this.meshPath))
204
+ return null;
205
+ this.gridCache = JSON.parse(fs.readFileSync(this.meshPath, 'utf-8'));
206
+ return this.gridCache;
207
+ }
208
+ saveGrid(grid) {
209
+ this.gridCache = grid;
210
+ fs.writeFileSync(this.meshPath, JSON.stringify(grid, null, 2), 'utf-8');
211
+ }
212
+ // ===== Stats =====
213
+ getStats() {
214
+ this.ensureLoaded();
215
+ const typeDistribution = {};
216
+ let active = 0;
217
+ for (const unit of this.cache.values()) {
218
+ typeDistribution[unit.type] = (typeDistribution[unit.type] || 0) + 1;
219
+ if (unit.meta.status === 'active')
220
+ active++;
221
+ }
222
+ return {
223
+ totalUnits: this.cache.size,
224
+ activeUnits: active,
225
+ archivedUnits: this.archiveCache.size,
226
+ typeDistribution,
227
+ };
228
+ }
229
+ ensureLoaded() {
230
+ if (!this.loaded)
231
+ this.load();
232
+ }
233
+ unitsEqual(a, b) {
234
+ return (a.summary === b.summary &&
235
+ a.meta.status === b.meta.status &&
236
+ a.meta.updated === b.meta.updated &&
237
+ a.associations.length === b.associations.length &&
238
+ a.content.description === b.content.description);
239
+ }
240
+ }
241
+ //# sourceMappingURL=file-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/store/file-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { FileStore } from './file-store.js';
2
+ export type { ListFilter } from './file-store.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { FileStore } from './file-store.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { SyncResult, SyncOptions } from '../shared/types.js';
2
+ import type { FileStore } from '../store/file-store.js';
3
+ import type { Scanner } from '../scanner/scanner.js';
4
+ export declare class SyncEngine {
5
+ private store;
6
+ private scanner;
7
+ private projectRoot;
8
+ constructor(store: FileStore, scanner: Scanner, projectRoot: string);
9
+ /**
10
+ * Incremental sync: detect changed files → re-scan only those → repair associations.
11
+ *
12
+ * Phases:
13
+ * 1. Hash compare — compute current hashes vs fileSnapshot
14
+ * 2. Re-scan changed files → add/update units
15
+ * 3. Remove units from deleted files → mark stale
16
+ * 4. Repair broken associations via fuzzy match
17
+ * 5. Write updated mesh.json and fileSnapshot
18
+ */
19
+ sync(options: SyncOptions): Promise<SyncResult>;
20
+ /**
21
+ * Partial scan — only re-scan changed TypeScript/markdown files.
22
+ * Uses ts-morph for .ts files, inline parsing for .md / config.
23
+ */
24
+ private scanChangedFiles;
25
+ /**
26
+ * Fuzzy-match a newly scanned unit against an existing stale unit.
27
+ * Returns the matching stale unit or null.
28
+ *
29
+ * Matching signals:
30
+ * 1. Same source file + high signature overlap (jaccard ≥ threshold)
31
+ * 2. Same source file + high summary similarity (dice ≥ threshold)
32
+ * 3. Same unit id (method was renamed but we kept same id pattern)
33
+ */
34
+ private fuzzyMatchUnit;
35
+ /**
36
+ * Repair broken associations across all units.
37
+ *
38
+ * For each association whose target unit is stale/archived/missing:
39
+ * 1. Try fuzzy match against active units by signature
40
+ * 2. If match found → repair the link
41
+ * 3. If no match → reduce weight, mark for eventual removal
42
+ */
43
+ private repairAssociations;
44
+ /**
45
+ * Find a replacement unit for a broken association.
46
+ * Strategy:
47
+ * 1. Search signature index for the original unit's summary keywords
48
+ * 2. Fuzzy match summaries against active units
49
+ * 3. Return best match above threshold
50
+ */
51
+ private findReplacementAssociation;
52
+ private updateGrid;
53
+ private sanitizeId;
54
+ private extractJsDoc;
55
+ }
56
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAwC,UAAU,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAC;AACrH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAgErD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM;IAMnE;;;;;;;;;OASG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAiLrD;;;OAGG;YACW,gBAAgB;IAwL9B;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IAsDtB;;;;;;;OAOG;YACW,kBAAkB;IAwDhC;;;;;;OAMG;IACH,OAAO,CAAC,0BAA0B;IA+BlC,OAAO,CAAC,UAAU;IA+BlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;CAOrB"}