@claude-flow/memory 3.0.0-alpha.1 → 3.0.0-alpha.7

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 (156) hide show
  1. package/README.md +356 -18
  2. package/dist/agent-memory-scope.d.ts +131 -0
  3. package/dist/agent-memory-scope.d.ts.map +1 -0
  4. package/dist/agent-memory-scope.js +215 -0
  5. package/dist/agent-memory-scope.js.map +1 -0
  6. package/dist/agent-memory-scope.test.d.ts +8 -0
  7. package/dist/agent-memory-scope.test.d.ts.map +1 -0
  8. package/dist/agent-memory-scope.test.js +463 -0
  9. package/dist/agent-memory-scope.test.js.map +1 -0
  10. package/dist/agentdb-adapter.d.ts +22 -3
  11. package/dist/agentdb-adapter.d.ts.map +1 -1
  12. package/dist/agentdb-adapter.js +135 -8
  13. package/dist/agentdb-adapter.js.map +1 -1
  14. package/dist/auto-memory-bridge.d.ts +226 -0
  15. package/dist/auto-memory-bridge.d.ts.map +1 -0
  16. package/dist/auto-memory-bridge.js +709 -0
  17. package/dist/auto-memory-bridge.js.map +1 -0
  18. package/dist/auto-memory-bridge.test.d.ts +8 -0
  19. package/dist/auto-memory-bridge.test.d.ts.map +1 -0
  20. package/dist/auto-memory-bridge.test.js +754 -0
  21. package/dist/auto-memory-bridge.test.js.map +1 -0
  22. package/dist/benchmark.test.d.ts +2 -0
  23. package/dist/benchmark.test.d.ts.map +1 -0
  24. package/dist/benchmark.test.js +277 -0
  25. package/dist/benchmark.test.js.map +1 -0
  26. package/dist/index.d.ts +8 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +8 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/learning-bridge.d.ts +137 -0
  31. package/dist/learning-bridge.d.ts.map +1 -0
  32. package/dist/learning-bridge.js +335 -0
  33. package/dist/learning-bridge.js.map +1 -0
  34. package/dist/learning-bridge.test.d.ts +8 -0
  35. package/dist/learning-bridge.test.d.ts.map +1 -0
  36. package/dist/learning-bridge.test.js +578 -0
  37. package/dist/learning-bridge.test.js.map +1 -0
  38. package/dist/memory-graph.d.ts +100 -0
  39. package/dist/memory-graph.d.ts.map +1 -0
  40. package/dist/memory-graph.js +333 -0
  41. package/dist/memory-graph.js.map +1 -0
  42. package/dist/memory-graph.test.d.ts +8 -0
  43. package/dist/memory-graph.test.d.ts.map +1 -0
  44. package/dist/memory-graph.test.js +609 -0
  45. package/dist/memory-graph.test.js.map +1 -0
  46. package/dist/types.d.ts +3 -0
  47. package/dist/types.d.ts.map +1 -1
  48. package/package.json +19 -4
  49. package/.agentic-flow/intelligence.json +0 -16
  50. package/__tests__/coverage/base.css +0 -224
  51. package/__tests__/coverage/block-navigation.js +0 -87
  52. package/__tests__/coverage/coverage-final.json +0 -19
  53. package/__tests__/coverage/favicon.png +0 -0
  54. package/__tests__/coverage/index.html +0 -206
  55. package/__tests__/coverage/lcov-report/base.css +0 -224
  56. package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
  57. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  58. package/__tests__/coverage/lcov-report/index.html +0 -206
  59. package/__tests__/coverage/lcov-report/prettify.css +0 -1
  60. package/__tests__/coverage/lcov-report/prettify.js +0 -2
  61. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  62. package/__tests__/coverage/lcov-report/sorter.js +0 -210
  63. package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +0 -2737
  64. package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +0 -3130
  65. package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +0 -601
  66. package/__tests__/coverage/lcov-report/src/application/commands/index.html +0 -131
  67. package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +0 -394
  68. package/__tests__/coverage/lcov-report/src/application/queries/index.html +0 -116
  69. package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +0 -796
  70. package/__tests__/coverage/lcov-report/src/application/services/index.html +0 -116
  71. package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +0 -793
  72. package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +0 -1633
  73. package/__tests__/coverage/lcov-report/src/database-provider.ts.html +0 -1618
  74. package/__tests__/coverage/lcov-report/src/domain/entities/index.html +0 -116
  75. package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +0 -952
  76. package/__tests__/coverage/lcov-report/src/domain/services/index.html +0 -116
  77. package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +0 -1294
  78. package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +0 -3124
  79. package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +0 -2167
  80. package/__tests__/coverage/lcov-report/src/index.html +0 -266
  81. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  82. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +0 -116
  83. package/__tests__/coverage/lcov-report/src/migration.ts.html +0 -2092
  84. package/__tests__/coverage/lcov-report/src/query-builder.ts.html +0 -1711
  85. package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +0 -2281
  86. package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +0 -2374
  87. package/__tests__/coverage/lcov-report/src/types.ts.html +0 -2266
  88. package/__tests__/coverage/lcov.info +0 -10238
  89. package/__tests__/coverage/prettify.css +0 -1
  90. package/__tests__/coverage/prettify.js +0 -2
  91. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  92. package/__tests__/coverage/sorter.js +0 -210
  93. package/__tests__/coverage/src/agentdb-adapter.ts.html +0 -2737
  94. package/__tests__/coverage/src/agentdb-backend.ts.html +0 -3130
  95. package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +0 -601
  96. package/__tests__/coverage/src/application/commands/index.html +0 -131
  97. package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +0 -394
  98. package/__tests__/coverage/src/application/queries/index.html +0 -116
  99. package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +0 -796
  100. package/__tests__/coverage/src/application/services/index.html +0 -116
  101. package/__tests__/coverage/src/application/services/memory-application-service.ts.html +0 -793
  102. package/__tests__/coverage/src/cache-manager.ts.html +0 -1633
  103. package/__tests__/coverage/src/database-provider.ts.html +0 -1618
  104. package/__tests__/coverage/src/domain/entities/index.html +0 -116
  105. package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +0 -952
  106. package/__tests__/coverage/src/domain/services/index.html +0 -116
  107. package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +0 -1294
  108. package/__tests__/coverage/src/hnsw-index.ts.html +0 -3124
  109. package/__tests__/coverage/src/hybrid-backend.ts.html +0 -2167
  110. package/__tests__/coverage/src/index.html +0 -266
  111. package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  112. package/__tests__/coverage/src/infrastructure/repositories/index.html +0 -116
  113. package/__tests__/coverage/src/migration.ts.html +0 -2092
  114. package/__tests__/coverage/src/query-builder.ts.html +0 -1711
  115. package/__tests__/coverage/src/sqlite-backend.ts.html +0 -2281
  116. package/__tests__/coverage/src/sqljs-backend.ts.html +0 -2374
  117. package/__tests__/coverage/src/types.ts.html +0 -2266
  118. package/benchmarks/cache-hit-rate.bench.ts +0 -535
  119. package/benchmarks/hnsw-indexing.bench.ts +0 -552
  120. package/benchmarks/memory-write.bench.ts +0 -469
  121. package/benchmarks/vector-search.bench.ts +0 -449
  122. package/docs/AGENTDB-INTEGRATION.md +0 -388
  123. package/docs/CROSS_PLATFORM.md +0 -505
  124. package/docs/WINDOWS_SUPPORT.md +0 -422
  125. package/examples/agentdb-example.ts +0 -345
  126. package/examples/cross-platform-usage.ts +0 -326
  127. package/framework/benchmark.ts +0 -112
  128. package/src/agentdb-adapter.ts +0 -884
  129. package/src/agentdb-backend.test.ts +0 -339
  130. package/src/agentdb-backend.ts +0 -1016
  131. package/src/application/commands/delete-memory.command.ts +0 -172
  132. package/src/application/commands/store-memory.command.ts +0 -103
  133. package/src/application/index.ts +0 -36
  134. package/src/application/queries/search-memory.query.ts +0 -237
  135. package/src/application/services/memory-application-service.ts +0 -236
  136. package/src/cache-manager.ts +0 -516
  137. package/src/database-provider.test.ts +0 -364
  138. package/src/database-provider.ts +0 -511
  139. package/src/domain/entities/memory-entry.ts +0 -289
  140. package/src/domain/index.ts +0 -35
  141. package/src/domain/repositories/memory-repository.interface.ts +0 -120
  142. package/src/domain/services/memory-domain-service.ts +0 -403
  143. package/src/hnsw-index.ts +0 -1013
  144. package/src/hybrid-backend.test.ts +0 -399
  145. package/src/hybrid-backend.ts +0 -694
  146. package/src/index.ts +0 -515
  147. package/src/infrastructure/index.ts +0 -23
  148. package/src/infrastructure/repositories/hybrid-memory-repository.ts +0 -516
  149. package/src/migration.ts +0 -669
  150. package/src/query-builder.ts +0 -542
  151. package/src/sqlite-backend.ts +0 -732
  152. package/src/sqljs-backend.ts +0 -763
  153. package/src/types.ts +0 -727
  154. package/tsconfig.json +0 -9
  155. package/tsconfig.tsbuildinfo +0 -1
  156. package/verify-cross-platform.ts +0 -170
@@ -0,0 +1,609 @@
1
+ /**
2
+ * Tests for MemoryGraph - Knowledge Graph Module
3
+ *
4
+ * TDD London School (mock-first) tests for graph construction,
5
+ * PageRank computation, community detection, and graph-aware ranking.
6
+ */
7
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
8
+ import { MemoryGraph } from './memory-graph.js';
9
+ import { createDefaultEntry } from './types.js';
10
+ // ===== Test Helpers =====
11
+ function makeEntry(id, refs = [], meta) {
12
+ const entry = createDefaultEntry({
13
+ key: id,
14
+ content: `content-${id}`,
15
+ references: refs,
16
+ metadata: meta,
17
+ });
18
+ // Override the auto-generated id with a deterministic one for testing
19
+ return { ...entry, id };
20
+ }
21
+ function createMockBackend(entries) {
22
+ return {
23
+ initialize: vi.fn().mockResolvedValue(undefined),
24
+ shutdown: vi.fn().mockResolvedValue(undefined),
25
+ store: vi.fn().mockResolvedValue(undefined),
26
+ get: vi.fn().mockImplementation(async (id) => {
27
+ return entries.find((e) => e.id === id) || null;
28
+ }),
29
+ getByKey: vi.fn().mockResolvedValue(null),
30
+ update: vi.fn().mockImplementation(async (id, _update) => {
31
+ return entries.find((e) => e.id === id) || null;
32
+ }),
33
+ delete: vi.fn().mockResolvedValue(true),
34
+ query: vi.fn().mockResolvedValue(entries),
35
+ search: vi.fn().mockResolvedValue([]),
36
+ bulkInsert: vi.fn().mockResolvedValue(undefined),
37
+ bulkDelete: vi.fn().mockResolvedValue(0),
38
+ count: vi.fn().mockResolvedValue(entries.length),
39
+ listNamespaces: vi.fn().mockResolvedValue(['default']),
40
+ clearNamespace: vi.fn().mockResolvedValue(0),
41
+ getStats: vi.fn().mockResolvedValue({
42
+ totalEntries: entries.length,
43
+ entriesByNamespace: {},
44
+ entriesByType: {},
45
+ memoryUsage: 0,
46
+ avgQueryTime: 0,
47
+ avgSearchTime: 0,
48
+ }),
49
+ healthCheck: vi.fn().mockResolvedValue({
50
+ status: 'healthy',
51
+ components: {
52
+ storage: { status: 'healthy', latency: 0 },
53
+ index: { status: 'healthy', latency: 0 },
54
+ cache: { status: 'healthy', latency: 0 },
55
+ },
56
+ timestamp: Date.now(),
57
+ issues: [],
58
+ recommendations: [],
59
+ }),
60
+ };
61
+ }
62
+ // ===== Tests =====
63
+ describe('MemoryGraph', () => {
64
+ let graph;
65
+ beforeEach(() => {
66
+ graph = new MemoryGraph();
67
+ });
68
+ // ===== Constructor =====
69
+ describe('constructor', () => {
70
+ it('should create with default configuration', () => {
71
+ const g = new MemoryGraph();
72
+ const stats = g.getStats();
73
+ expect(stats.nodeCount).toBe(0);
74
+ expect(stats.edgeCount).toBe(0);
75
+ });
76
+ it('should accept custom configuration', () => {
77
+ const config = {
78
+ pageRankDamping: 0.9,
79
+ maxNodes: 100,
80
+ similarityThreshold: 0.5,
81
+ };
82
+ const g = new MemoryGraph(config);
83
+ const stats = g.getStats();
84
+ expect(stats.nodeCount).toBe(0);
85
+ });
86
+ });
87
+ // ===== addNode / removeNode =====
88
+ describe('addNode', () => {
89
+ it('should add a node from a MemoryEntry', () => {
90
+ const entry = makeEntry('node-1');
91
+ graph.addNode(entry);
92
+ expect(graph.getStats().nodeCount).toBe(1);
93
+ });
94
+ it('should extract category from metadata', () => {
95
+ const entry = makeEntry('node-1', [], { category: 'security' });
96
+ graph.addNode(entry);
97
+ // Verify through getTopNodes after computing pagerank
98
+ graph.computePageRank();
99
+ const top = graph.getTopNodes(1);
100
+ expect(top.length).toBe(1);
101
+ expect(top[0].id).toBe('node-1');
102
+ });
103
+ it('should ignore when at maxNodes capacity', () => {
104
+ const g = new MemoryGraph({ maxNodes: 2 });
105
+ g.addNode(makeEntry('a'));
106
+ g.addNode(makeEntry('b'));
107
+ g.addNode(makeEntry('c'));
108
+ expect(g.getStats().nodeCount).toBe(2);
109
+ });
110
+ it('should allow re-adding an existing node without counting toward capacity', () => {
111
+ const g = new MemoryGraph({ maxNodes: 2 });
112
+ g.addNode(makeEntry('a'));
113
+ g.addNode(makeEntry('b'));
114
+ // Re-add existing node should succeed
115
+ g.addNode(makeEntry('a'));
116
+ expect(g.getStats().nodeCount).toBe(2);
117
+ });
118
+ it('should mark graph as dirty', () => {
119
+ graph.addNode(makeEntry('node-1'));
120
+ expect(graph.getStats().pageRankComputed).toBe(false);
121
+ });
122
+ });
123
+ describe('removeNode', () => {
124
+ it('should remove a node and clean up edges', () => {
125
+ const a = makeEntry('a');
126
+ const b = makeEntry('b');
127
+ graph.addNode(a);
128
+ graph.addNode(b);
129
+ graph.addEdge('a', 'b', 'reference');
130
+ expect(graph.getStats().edgeCount).toBe(1);
131
+ graph.removeNode('a');
132
+ expect(graph.getStats().nodeCount).toBe(1);
133
+ expect(graph.getStats().edgeCount).toBe(0);
134
+ });
135
+ it('should remove incoming edges to the deleted node', () => {
136
+ graph.addNode(makeEntry('a'));
137
+ graph.addNode(makeEntry('b'));
138
+ graph.addNode(makeEntry('c'));
139
+ graph.addEdge('a', 'b', 'reference');
140
+ graph.addEdge('c', 'b', 'reference');
141
+ expect(graph.getStats().edgeCount).toBe(2);
142
+ graph.removeNode('b');
143
+ expect(graph.getStats().edgeCount).toBe(0);
144
+ });
145
+ it('should handle removing a non-existent node gracefully', () => {
146
+ expect(() => graph.removeNode('does-not-exist')).not.toThrow();
147
+ });
148
+ it('should clean up pageRank and community entries', () => {
149
+ graph.addNode(makeEntry('a'));
150
+ graph.computePageRank();
151
+ graph.detectCommunities();
152
+ graph.removeNode('a');
153
+ const top = graph.getTopNodes(10);
154
+ expect(top.length).toBe(0);
155
+ });
156
+ });
157
+ // ===== addEdge =====
158
+ describe('addEdge', () => {
159
+ beforeEach(() => {
160
+ graph.addNode(makeEntry('a'));
161
+ graph.addNode(makeEntry('b'));
162
+ graph.addNode(makeEntry('c'));
163
+ });
164
+ it('should add an edge between existing nodes', () => {
165
+ graph.addEdge('a', 'b', 'reference');
166
+ expect(graph.getStats().edgeCount).toBe(1);
167
+ });
168
+ it('should update weight to max when edge already exists', () => {
169
+ graph.addEdge('a', 'b', 'reference', 0.5);
170
+ graph.addEdge('a', 'b', 'reference', 0.8);
171
+ expect(graph.getStats().edgeCount).toBe(1);
172
+ // The weight should now be 0.8 (max of 0.5 and 0.8)
173
+ });
174
+ it('should not downgrade weight when adding with lower value', () => {
175
+ graph.addEdge('a', 'b', 'reference', 0.9);
176
+ graph.addEdge('a', 'b', 'reference', 0.3);
177
+ // Edge count should remain 1 (updated, not duplicated)
178
+ expect(graph.getStats().edgeCount).toBe(1);
179
+ });
180
+ it('should skip when source node is missing', () => {
181
+ graph.addEdge('missing', 'b', 'reference');
182
+ expect(graph.getStats().edgeCount).toBe(0);
183
+ });
184
+ it('should skip when target node is missing', () => {
185
+ graph.addEdge('a', 'missing', 'reference');
186
+ expect(graph.getStats().edgeCount).toBe(0);
187
+ });
188
+ it('should create reverse edge entry', () => {
189
+ graph.addEdge('a', 'b', 'reference');
190
+ // Verify via getNeighbors traversal (reverse edges are used internally)
191
+ // If we remove 'a', 'b' should lose its incoming edge
192
+ graph.removeNode('a');
193
+ expect(graph.getStats().edgeCount).toBe(0);
194
+ });
195
+ it('should support multiple edge types', () => {
196
+ graph.addEdge('a', 'b', 'reference');
197
+ graph.addEdge('a', 'c', 'similar', 0.9);
198
+ expect(graph.getStats().edgeCount).toBe(2);
199
+ });
200
+ });
201
+ // ===== buildFromBackend =====
202
+ describe('buildFromBackend', () => {
203
+ it('should build graph from backend entries with references', async () => {
204
+ const entries = [
205
+ makeEntry('a', ['b', 'c']),
206
+ makeEntry('b', ['c']),
207
+ makeEntry('c', []),
208
+ ];
209
+ const backend = createMockBackend(entries);
210
+ await graph.buildFromBackend(backend);
211
+ expect(graph.getStats().nodeCount).toBe(3);
212
+ // a->b, a->c, b->c = 3 edges
213
+ expect(graph.getStats().edgeCount).toBe(3);
214
+ });
215
+ it('should handle an empty backend', async () => {
216
+ const backend = createMockBackend([]);
217
+ await graph.buildFromBackend(backend);
218
+ expect(graph.getStats().nodeCount).toBe(0);
219
+ expect(graph.getStats().edgeCount).toBe(0);
220
+ });
221
+ it('should respect maxNodes limit', async () => {
222
+ const g = new MemoryGraph({ maxNodes: 2 });
223
+ const entries = [makeEntry('a'), makeEntry('b'), makeEntry('c')];
224
+ const backend = createMockBackend(entries);
225
+ await g.buildFromBackend(backend);
226
+ expect(g.getStats().nodeCount).toBe(2);
227
+ });
228
+ it('should skip reference edges to nodes not in graph', async () => {
229
+ // 'a' references 'z' which is not in the entries
230
+ const entries = [makeEntry('a', ['z']), makeEntry('b', [])];
231
+ const backend = createMockBackend(entries);
232
+ await graph.buildFromBackend(backend);
233
+ expect(graph.getStats().nodeCount).toBe(2);
234
+ // a->z should be skipped because 'z' is not a node
235
+ expect(graph.getStats().edgeCount).toBe(0);
236
+ });
237
+ it('should emit graph:built event', async () => {
238
+ const handler = vi.fn();
239
+ graph.on('graph:built', handler);
240
+ const backend = createMockBackend([makeEntry('a')]);
241
+ await graph.buildFromBackend(backend);
242
+ expect(handler).toHaveBeenCalledWith({ nodeCount: 1 });
243
+ });
244
+ });
245
+ // ===== computePageRank =====
246
+ describe('computePageRank', () => {
247
+ it('should return empty map for empty graph', () => {
248
+ const ranks = graph.computePageRank();
249
+ expect(ranks.size).toBe(0);
250
+ });
251
+ it('should compute rank of 1.0 for a single node', () => {
252
+ graph.addNode(makeEntry('a'));
253
+ const ranks = graph.computePageRank();
254
+ expect(ranks.size).toBe(1);
255
+ expect(ranks.get('a')).toBeCloseTo(1.0, 5);
256
+ });
257
+ it('should converge for two connected nodes', () => {
258
+ graph.addNode(makeEntry('a'));
259
+ graph.addNode(makeEntry('b'));
260
+ graph.addEdge('a', 'b', 'reference');
261
+ const ranks = graph.computePageRank();
262
+ expect(ranks.size).toBe(2);
263
+ // Both should have positive values that sum close to 1
264
+ const total = (ranks.get('a') || 0) + (ranks.get('b') || 0);
265
+ expect(total).toBeCloseTo(1.0, 2);
266
+ });
267
+ it('should give higher rank to node with more incoming edges', () => {
268
+ graph.addNode(makeEntry('a'));
269
+ graph.addNode(makeEntry('b'));
270
+ graph.addNode(makeEntry('c'));
271
+ graph.addEdge('a', 'c', 'reference');
272
+ graph.addEdge('b', 'c', 'reference');
273
+ const ranks = graph.computePageRank();
274
+ const rankC = ranks.get('c') || 0;
275
+ const rankA = ranks.get('a') || 0;
276
+ const rankB = ranks.get('b') || 0;
277
+ expect(rankC).toBeGreaterThan(rankA);
278
+ expect(rankC).toBeGreaterThan(rankB);
279
+ });
280
+ it('should respect damping factor', () => {
281
+ const g = new MemoryGraph({ pageRankDamping: 0.5 });
282
+ g.addNode(makeEntry('a'));
283
+ g.addNode(makeEntry('b'));
284
+ g.addEdge('a', 'b', 'reference');
285
+ const ranks = g.computePageRank();
286
+ // With damping 0.5, the influence of links is reduced
287
+ expect(ranks.get('a')).toBeDefined();
288
+ expect(ranks.get('b')).toBeDefined();
289
+ });
290
+ it('should converge within maxIterations', () => {
291
+ const handler = vi.fn();
292
+ graph.on('pagerank:computed', handler);
293
+ graph.addNode(makeEntry('a'));
294
+ graph.addNode(makeEntry('b'));
295
+ graph.addEdge('a', 'b', 'reference');
296
+ graph.computePageRank();
297
+ expect(handler).toHaveBeenCalledTimes(1);
298
+ const { iterations } = handler.mock.calls[0][0];
299
+ expect(iterations).toBeLessThanOrEqual(50);
300
+ expect(iterations).toBeGreaterThan(0);
301
+ });
302
+ it('should handle disconnected components', () => {
303
+ graph.addNode(makeEntry('a'));
304
+ graph.addNode(makeEntry('b'));
305
+ graph.addNode(makeEntry('c'));
306
+ graph.addNode(makeEntry('d'));
307
+ graph.addEdge('a', 'b', 'reference');
308
+ graph.addEdge('c', 'd', 'reference');
309
+ const ranks = graph.computePageRank();
310
+ expect(ranks.size).toBe(4);
311
+ // Each component should have similar rank distribution
312
+ const total = [...ranks.values()].reduce((s, v) => s + v, 0);
313
+ expect(total).toBeCloseTo(1.0, 2);
314
+ });
315
+ it('should mark graph as not dirty after computation', () => {
316
+ graph.addNode(makeEntry('a'));
317
+ expect(graph.getStats().pageRankComputed).toBe(false);
318
+ graph.computePageRank();
319
+ expect(graph.getStats().pageRankComputed).toBe(true);
320
+ });
321
+ it('should emit pagerank:computed event', () => {
322
+ const handler = vi.fn();
323
+ graph.on('pagerank:computed', handler);
324
+ graph.computePageRank();
325
+ expect(handler).toHaveBeenCalledTimes(1);
326
+ });
327
+ });
328
+ // ===== detectCommunities =====
329
+ describe('detectCommunities', () => {
330
+ it('should assign isolated nodes to individual communities', () => {
331
+ graph.addNode(makeEntry('a'));
332
+ graph.addNode(makeEntry('b'));
333
+ graph.addNode(makeEntry('c'));
334
+ const communities = graph.detectCommunities();
335
+ const unique = new Set(communities.values());
336
+ expect(unique.size).toBe(3);
337
+ });
338
+ it('should group connected nodes into the same community', () => {
339
+ graph.addNode(makeEntry('a'));
340
+ graph.addNode(makeEntry('b'));
341
+ graph.addEdge('a', 'b', 'reference');
342
+ graph.addEdge('b', 'a', 'reference');
343
+ const communities = graph.detectCommunities();
344
+ // With bidirectional edges, they should converge
345
+ expect(communities.get('a')).toBe(communities.get('b'));
346
+ });
347
+ it('should detect two disconnected clusters', () => {
348
+ // Cluster 1: a <-> b
349
+ graph.addNode(makeEntry('a'));
350
+ graph.addNode(makeEntry('b'));
351
+ graph.addEdge('a', 'b', 'reference');
352
+ graph.addEdge('b', 'a', 'reference');
353
+ // Cluster 2: c <-> d
354
+ graph.addNode(makeEntry('c'));
355
+ graph.addNode(makeEntry('d'));
356
+ graph.addEdge('c', 'd', 'reference');
357
+ graph.addEdge('d', 'c', 'reference');
358
+ const communities = graph.detectCommunities();
359
+ expect(communities.get('a')).toBe(communities.get('b'));
360
+ expect(communities.get('c')).toBe(communities.get('d'));
361
+ expect(communities.get('a')).not.toBe(communities.get('c'));
362
+ });
363
+ it('should emit communities:detected event', () => {
364
+ const handler = vi.fn();
365
+ graph.on('communities:detected', handler);
366
+ graph.addNode(makeEntry('a'));
367
+ graph.detectCommunities();
368
+ expect(handler).toHaveBeenCalledTimes(1);
369
+ expect(handler.mock.calls[0][0].communityCount).toBe(1);
370
+ });
371
+ it('should handle empty graph', () => {
372
+ const communities = graph.detectCommunities();
373
+ expect(communities.size).toBe(0);
374
+ });
375
+ });
376
+ // ===== rankWithGraph =====
377
+ describe('rankWithGraph', () => {
378
+ it('should blend vector score and pagerank', () => {
379
+ graph.addNode(makeEntry('a'));
380
+ graph.addNode(makeEntry('b'));
381
+ graph.addNode(makeEntry('c'));
382
+ graph.addEdge('a', 'c', 'reference');
383
+ graph.addEdge('b', 'c', 'reference');
384
+ const searchResults = [
385
+ { entry: makeEntry('a'), score: 0.9, distance: 0.1 },
386
+ { entry: makeEntry('c'), score: 0.7, distance: 0.3 },
387
+ ];
388
+ const ranked = graph.rankWithGraph(searchResults);
389
+ expect(ranked.length).toBe(2);
390
+ // Each result should have all fields
391
+ expect(ranked[0].score).toBeDefined();
392
+ expect(ranked[0].pageRank).toBeDefined();
393
+ expect(ranked[0].combinedScore).toBeDefined();
394
+ });
395
+ it('should respect alpha parameter', () => {
396
+ graph.addNode(makeEntry('a'));
397
+ graph.addNode(makeEntry('b'));
398
+ graph.addEdge('a', 'b', 'reference');
399
+ const results = [
400
+ { entry: makeEntry('a'), score: 0.5, distance: 0.5 },
401
+ { entry: makeEntry('b'), score: 0.5, distance: 0.5 },
402
+ ];
403
+ // With alpha=1.0, only vector score matters
404
+ const ranked1 = graph.rankWithGraph(results, 1.0);
405
+ expect(ranked1[0].combinedScore).toBeCloseTo(0.5, 3);
406
+ // With alpha=0.0, only pagerank matters
407
+ const ranked0 = graph.rankWithGraph(results, 0.0);
408
+ // Node b has an incoming edge so should rank higher
409
+ expect(ranked0[0].entry.id).toBe('b');
410
+ });
411
+ it('should handle entries not in graph', () => {
412
+ graph.addNode(makeEntry('a'));
413
+ graph.computePageRank();
414
+ const results = [
415
+ { entry: makeEntry('a'), score: 0.8, distance: 0.2 },
416
+ { entry: makeEntry('unknown'), score: 0.9, distance: 0.1 },
417
+ ];
418
+ const ranked = graph.rankWithGraph(results);
419
+ expect(ranked.length).toBe(2);
420
+ // Unknown entry should have pageRank of 0
421
+ const unknownResult = ranked.find((r) => r.entry.id === 'unknown');
422
+ expect(unknownResult?.pageRank).toBe(0);
423
+ });
424
+ it('should sort results by combinedScore descending', () => {
425
+ graph.addNode(makeEntry('a'));
426
+ graph.addNode(makeEntry('b'));
427
+ graph.addNode(makeEntry('c'));
428
+ graph.addEdge('a', 'c', 'reference');
429
+ graph.addEdge('b', 'c', 'reference');
430
+ const results = [
431
+ { entry: makeEntry('a'), score: 0.5, distance: 0.5 },
432
+ { entry: makeEntry('b'), score: 0.5, distance: 0.5 },
433
+ { entry: makeEntry('c'), score: 0.5, distance: 0.5 },
434
+ ];
435
+ const ranked = graph.rankWithGraph(results, 0.5);
436
+ for (let i = 0; i < ranked.length - 1; i++) {
437
+ expect(ranked[i].combinedScore).toBeGreaterThanOrEqual(ranked[i + 1].combinedScore);
438
+ }
439
+ });
440
+ it('should include community info when communities are detected', () => {
441
+ graph.addNode(makeEntry('a'));
442
+ graph.addNode(makeEntry('b'));
443
+ graph.addEdge('a', 'b', 'reference');
444
+ graph.detectCommunities();
445
+ const results = [
446
+ { entry: makeEntry('a'), score: 0.8, distance: 0.2 },
447
+ ];
448
+ const ranked = graph.rankWithGraph(results);
449
+ expect(ranked[0].community).toBeDefined();
450
+ });
451
+ });
452
+ // ===== getTopNodes =====
453
+ describe('getTopNodes', () => {
454
+ it('should return top N nodes by pageRank', () => {
455
+ graph.addNode(makeEntry('a'));
456
+ graph.addNode(makeEntry('b'));
457
+ graph.addNode(makeEntry('c'));
458
+ graph.addEdge('a', 'c', 'reference');
459
+ graph.addEdge('b', 'c', 'reference');
460
+ const top = graph.getTopNodes(1);
461
+ expect(top.length).toBe(1);
462
+ expect(top[0].id).toBe('c');
463
+ });
464
+ it('should handle requesting more nodes than available', () => {
465
+ graph.addNode(makeEntry('a'));
466
+ graph.addNode(makeEntry('b'));
467
+ const top = graph.getTopNodes(10);
468
+ expect(top.length).toBe(2);
469
+ });
470
+ it('should return empty array for empty graph', () => {
471
+ const top = graph.getTopNodes(5);
472
+ expect(top.length).toBe(0);
473
+ });
474
+ it('should include community label', () => {
475
+ graph.addNode(makeEntry('a'));
476
+ graph.detectCommunities();
477
+ const top = graph.getTopNodes(1);
478
+ expect(top[0].community).toBeDefined();
479
+ });
480
+ });
481
+ // ===== getNeighbors =====
482
+ describe('getNeighbors', () => {
483
+ beforeEach(() => {
484
+ graph.addNode(makeEntry('a'));
485
+ graph.addNode(makeEntry('b'));
486
+ graph.addNode(makeEntry('c'));
487
+ graph.addNode(makeEntry('d'));
488
+ graph.addEdge('a', 'b', 'reference');
489
+ graph.addEdge('b', 'c', 'reference');
490
+ graph.addEdge('c', 'd', 'reference');
491
+ });
492
+ it('should return direct neighbors at depth 1', () => {
493
+ const neighbors = graph.getNeighbors('a', 1);
494
+ expect(neighbors.size).toBe(1);
495
+ expect(neighbors.has('b')).toBe(true);
496
+ });
497
+ it('should return extended neighbors at depth 2', () => {
498
+ const neighbors = graph.getNeighbors('a', 2);
499
+ expect(neighbors.size).toBe(2);
500
+ expect(neighbors.has('b')).toBe(true);
501
+ expect(neighbors.has('c')).toBe(true);
502
+ });
503
+ it('should return all reachable nodes at depth 3', () => {
504
+ const neighbors = graph.getNeighbors('a', 3);
505
+ expect(neighbors.size).toBe(3);
506
+ expect(neighbors.has('b')).toBe(true);
507
+ expect(neighbors.has('c')).toBe(true);
508
+ expect(neighbors.has('d')).toBe(true);
509
+ });
510
+ it('should handle node with no neighbors', () => {
511
+ const neighbors = graph.getNeighbors('d', 1);
512
+ expect(neighbors.size).toBe(0);
513
+ });
514
+ it('should not include the start node in results', () => {
515
+ const neighbors = graph.getNeighbors('a', 10);
516
+ expect(neighbors.has('a')).toBe(false);
517
+ });
518
+ it('should default to depth 1', () => {
519
+ const neighbors = graph.getNeighbors('a');
520
+ expect(neighbors.size).toBe(1);
521
+ expect(neighbors.has('b')).toBe(true);
522
+ });
523
+ });
524
+ // ===== addSimilarityEdges =====
525
+ describe('addSimilarityEdges', () => {
526
+ it('should add edges for similar entries above threshold', async () => {
527
+ const embedding = new Float32Array([1, 0, 0]);
528
+ const entryA = { ...makeEntry('a'), embedding };
529
+ const entryB = makeEntry('b');
530
+ graph.addNode(entryA);
531
+ graph.addNode(entryB);
532
+ const searchResults = [
533
+ { entry: entryB, score: 0.9, distance: 0.1 },
534
+ ];
535
+ const backend = createMockBackend([entryA, entryB]);
536
+ backend.search.mockResolvedValue(searchResults);
537
+ const added = await graph.addSimilarityEdges(backend, 'a');
538
+ expect(added).toBe(1);
539
+ expect(graph.getStats().edgeCount).toBe(1);
540
+ });
541
+ it('should return 0 if entry has no embedding', async () => {
542
+ const entry = makeEntry('a');
543
+ graph.addNode(entry);
544
+ const backend = createMockBackend([entry]);
545
+ const added = await graph.addSimilarityEdges(backend, 'a');
546
+ expect(added).toBe(0);
547
+ });
548
+ it('should return 0 if entry does not exist', async () => {
549
+ const backend = createMockBackend([]);
550
+ const added = await graph.addSimilarityEdges(backend, 'missing');
551
+ expect(added).toBe(0);
552
+ });
553
+ it('should skip self-references in search results', async () => {
554
+ const embedding = new Float32Array([1, 0, 0]);
555
+ const entryA = { ...makeEntry('a'), embedding };
556
+ graph.addNode(entryA);
557
+ const searchResults = [
558
+ { entry: entryA, score: 1.0, distance: 0.0 },
559
+ ];
560
+ const backend = createMockBackend([entryA]);
561
+ backend.search.mockResolvedValue(searchResults);
562
+ const added = await graph.addSimilarityEdges(backend, 'a');
563
+ expect(added).toBe(0);
564
+ });
565
+ });
566
+ // ===== getStats =====
567
+ describe('getStats', () => {
568
+ it('should return correct initial stats', () => {
569
+ const stats = graph.getStats();
570
+ expect(stats.nodeCount).toBe(0);
571
+ expect(stats.edgeCount).toBe(0);
572
+ expect(stats.avgDegree).toBe(0);
573
+ expect(stats.communityCount).toBe(0);
574
+ expect(stats.pageRankComputed).toBe(false);
575
+ expect(stats.maxPageRank).toBe(0);
576
+ expect(stats.minPageRank).toBe(0);
577
+ });
578
+ it('should reflect graph state after adding nodes and edges', () => {
579
+ graph.addNode(makeEntry('a'));
580
+ graph.addNode(makeEntry('b'));
581
+ graph.addNode(makeEntry('c'));
582
+ graph.addEdge('a', 'b', 'reference');
583
+ graph.addEdge('a', 'c', 'reference');
584
+ const stats = graph.getStats();
585
+ expect(stats.nodeCount).toBe(3);
586
+ expect(stats.edgeCount).toBe(2);
587
+ expect(stats.avgDegree).toBeCloseTo(2 / 3, 5);
588
+ });
589
+ it('should report pageRank min/max after computation', () => {
590
+ graph.addNode(makeEntry('a'));
591
+ graph.addNode(makeEntry('b'));
592
+ graph.addEdge('a', 'b', 'reference');
593
+ graph.computePageRank();
594
+ const stats = graph.getStats();
595
+ expect(stats.pageRankComputed).toBe(true);
596
+ expect(stats.maxPageRank).toBeGreaterThan(0);
597
+ expect(stats.minPageRank).toBeGreaterThan(0);
598
+ expect(stats.maxPageRank).toBeGreaterThanOrEqual(stats.minPageRank);
599
+ });
600
+ it('should count communities after detection', () => {
601
+ graph.addNode(makeEntry('a'));
602
+ graph.addNode(makeEntry('b'));
603
+ graph.detectCommunities();
604
+ const stats = graph.getStats();
605
+ expect(stats.communityCount).toBe(2);
606
+ });
607
+ });
608
+ });
609
+ //# sourceMappingURL=memory-graph.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-graph.test.js","sourceRoot":"","sources":["../src/memory-graph.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,2BAA2B;AAE3B,SAAS,SAAS,CAAC,EAAU,EAAE,OAAiB,EAAE,EAAE,IAA8B;IAChF,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,GAAG,EAAE,EAAE;QACP,OAAO,EAAE,WAAW,EAAE,EAAE;QACxB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,sEAAsE;IACtE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAsB;IAC/C,OAAO;QACL,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAChD,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC9C,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC3C,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;YACnD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;QAClD,CAAC,CAAC;QACF,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;QACzC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAU,EAAE,OAA0B,EAAE,EAAE;YAClF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;QAClD,CAAC,CAAC;QACF,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;QACvC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC;QACzC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrC,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAChD,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACxC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC;QAChD,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC;QACtD,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC5C,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAClC,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,kBAAkB,EAAE,EAAE;YACtB,aAAa,EAAE,EAAE;YACjB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;SACjB,CAAC;QACF,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACrC,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;gBAC1C,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;gBACxC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;aACzC;YACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,EAAE;YACV,eAAe,EAAE,EAAE;SACpB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,oBAAoB;AAEpB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,KAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACd,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAE1B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAsB;gBAChC,eAAe,EAAE,GAAG;gBACpB,QAAQ,EAAE,GAAG;gBACb,mBAAmB,EAAE,GAAG;aACzB,CAAC;YACF,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,mCAAmC;IAEnC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAClC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YAChE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrB,sDAAsD;YACtD,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,sCAAsC;YACtC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjB,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE3C,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE3C,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC1B,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,sBAAsB;IAEtB,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YAC1C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,oDAAoD;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YAC1C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YAC1C,uDAAuD;YACvD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,wEAAwE;YACxE,sDAAsD;YACtD,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+BAA+B;IAE/B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,OAAO,GAAG;gBACd,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC1B,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBACrB,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC;aACnB,CAAC;YACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE3C,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,6BAA6B;YAC7B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,OAAO,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,iDAAiD;YACjD,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,mDAAmD;YACnD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAEpD,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAE9B,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,uDAAuD;YACvD,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;YACpD,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAEjC,MAAM,KAAK,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC;YAClC,sDAAsD;YACtD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YAEvC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,eAAe,EAAE,CAAC;YAExB,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,UAAU,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,uDAAuD;YACvD,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YACvC,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAEhC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAE9B,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC9C,iDAAiD;YACjD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,qBAAqB;YACrB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,qBAAqB;YACrB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,EAAE,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;YAC1C,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAE5B,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,MAAM,aAAa,GAAmB;gBACpC,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;gBACpD,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;aACrD,CAAC;YAEF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,qCAAqC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,MAAM,OAAO,GAAmB;gBAC9B,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;gBACpD,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;aACrD,CAAC;YAEF,4CAA4C;YAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAErD,wCAAwC;YACxC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClD,oDAAoD;YACpD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,eAAe,EAAE,CAAC;YAExB,MAAM,OAAO,GAAmB;gBAC9B,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;gBACpD,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;aAC3D,CAAC;YAEF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,0CAA0C;YAC1C,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;YACnE,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,MAAM,OAAO,GAAmB;gBAC9B,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;gBACpD,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;gBACpD,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;aACrD,CAAC;YAEF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YACtF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAE1B,MAAM,OAAO,GAAmB;gBAC9B,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;aACrD,CAAC;YAEF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAE1B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAE9B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAE3B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,iCAAiC;IAEjC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEtB,MAAM,aAAa,GAAmB;gBACpC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;aAC7C,CAAC;YACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,MAAmC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAE9E,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAE3C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,OAAO,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACjE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC;YAChD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEtB,MAAM,aAAa,GAAmB;gBACpC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;aAC7C,CAAC;YACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,MAAmC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAE9E,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,uBAAuB;IAEvB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAErC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,eAAe,EAAE,CAAC;YAExB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAE1B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}