@timmeck/brain-core 2.36.57 → 2.36.59

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 (154) hide show
  1. package/README.md +6 -0
  2. package/command-center.html +133 -2
  3. package/dist/action/__tests__/adjust-parameter-handler.test.d.ts +1 -0
  4. package/dist/action/__tests__/adjust-parameter-handler.test.js +138 -0
  5. package/dist/action/__tests__/adjust-parameter-handler.test.js.map +1 -0
  6. package/dist/action/__tests__/content-handler.test.d.ts +1 -0
  7. package/dist/action/__tests__/content-handler.test.js +100 -0
  8. package/dist/action/__tests__/content-handler.test.js.map +1 -0
  9. package/dist/action/__tests__/creative-seed-handler.test.d.ts +1 -0
  10. package/dist/action/__tests__/creative-seed-handler.test.js +96 -0
  11. package/dist/action/__tests__/creative-seed-handler.test.js.map +1 -0
  12. package/dist/action/__tests__/trade-handler.test.d.ts +1 -0
  13. package/dist/action/__tests__/trade-handler.test.js +165 -0
  14. package/dist/action/__tests__/trade-handler.test.js.map +1 -0
  15. package/dist/action/action-bridge.d.ts +2 -2
  16. package/dist/action/action-bridge.js +1 -0
  17. package/dist/action/action-bridge.js.map +1 -1
  18. package/dist/action/handlers/adjust-parameter-handler.d.ts +28 -0
  19. package/dist/action/handlers/adjust-parameter-handler.js +44 -0
  20. package/dist/action/handlers/adjust-parameter-handler.js.map +1 -0
  21. package/dist/action/handlers/content-handler.d.ts +23 -0
  22. package/dist/action/handlers/content-handler.js +30 -0
  23. package/dist/action/handlers/content-handler.js.map +1 -0
  24. package/dist/action/handlers/creative-seed-handler.d.ts +24 -0
  25. package/dist/action/handlers/creative-seed-handler.js +34 -0
  26. package/dist/action/handlers/creative-seed-handler.js.map +1 -0
  27. package/dist/action/handlers/index.d.ts +8 -0
  28. package/dist/action/handlers/index.js +5 -0
  29. package/dist/action/handlers/index.js.map +1 -0
  30. package/dist/action/handlers/trade-handler.d.ts +43 -0
  31. package/dist/action/handlers/trade-handler.js +43 -0
  32. package/dist/action/handlers/trade-handler.js.map +1 -0
  33. package/dist/action/index.d.ts +2 -0
  34. package/dist/action/index.js +1 -0
  35. package/dist/action/index.js.map +1 -1
  36. package/dist/agent-training/__tests__/agent-trainer.test.d.ts +1 -0
  37. package/dist/agent-training/__tests__/agent-trainer.test.js +158 -0
  38. package/dist/agent-training/__tests__/agent-trainer.test.js.map +1 -0
  39. package/dist/agent-training/__tests__/sub-agent-factory.test.d.ts +1 -0
  40. package/dist/agent-training/__tests__/sub-agent-factory.test.js +100 -0
  41. package/dist/agent-training/__tests__/sub-agent-factory.test.js.map +1 -0
  42. package/dist/agent-training/__tests__/sub-agent.test.d.ts +1 -0
  43. package/dist/agent-training/__tests__/sub-agent.test.js +102 -0
  44. package/dist/agent-training/__tests__/sub-agent.test.js.map +1 -0
  45. package/dist/agent-training/index.d.ts +4 -0
  46. package/dist/agent-training/index.js +2 -0
  47. package/dist/agent-training/index.js.map +1 -1
  48. package/dist/agent-training/sub-agent-factory.d.ts +36 -0
  49. package/dist/agent-training/sub-agent-factory.js +128 -0
  50. package/dist/agent-training/sub-agent-factory.js.map +1 -0
  51. package/dist/agent-training/sub-agent.d.ts +57 -0
  52. package/dist/agent-training/sub-agent.js +135 -0
  53. package/dist/agent-training/sub-agent.js.map +1 -0
  54. package/dist/chat/__tests__/chat-engine.test.d.ts +1 -0
  55. package/dist/chat/__tests__/chat-engine.test.js +209 -0
  56. package/dist/chat/__tests__/chat-engine.test.js.map +1 -0
  57. package/dist/chat/chat-engine.d.ts +55 -0
  58. package/dist/chat/chat-engine.js +222 -0
  59. package/dist/chat/chat-engine.js.map +1 -0
  60. package/dist/chat/index.d.ts +2 -0
  61. package/dist/chat/index.js +2 -0
  62. package/dist/chat/index.js.map +1 -0
  63. package/dist/codegen/codegen-server.js +2 -2
  64. package/dist/codegen/codegen-server.js.map +1 -1
  65. package/dist/content/__tests__/auto-publisher.test.d.ts +1 -0
  66. package/dist/content/__tests__/auto-publisher.test.js +125 -0
  67. package/dist/content/__tests__/auto-publisher.test.js.map +1 -0
  68. package/dist/content/auto-publisher.d.ts +51 -0
  69. package/dist/content/auto-publisher.js +147 -0
  70. package/dist/content/auto-publisher.js.map +1 -0
  71. package/dist/content/content-forge.d.ts +2 -0
  72. package/dist/content/content-forge.js +19 -0
  73. package/dist/content/content-forge.js.map +1 -1
  74. package/dist/content/index.d.ts +2 -0
  75. package/dist/content/index.js +1 -0
  76. package/dist/content/index.js.map +1 -1
  77. package/dist/creative/__tests__/creative-engine.test.d.ts +1 -0
  78. package/dist/creative/__tests__/creative-engine.test.js +151 -0
  79. package/dist/creative/__tests__/creative-engine.test.js.map +1 -0
  80. package/dist/cross-brain/__tests__/signal-router.test.d.ts +1 -0
  81. package/dist/cross-brain/__tests__/signal-router.test.js +218 -0
  82. package/dist/cross-brain/__tests__/signal-router.test.js.map +1 -0
  83. package/dist/cross-brain/signal-router.d.ts +57 -0
  84. package/dist/cross-brain/signal-router.js +148 -0
  85. package/dist/cross-brain/signal-router.js.map +1 -0
  86. package/dist/dashboard/__tests__/command-center-server.test.js +31 -0
  87. package/dist/dashboard/__tests__/command-center-server.test.js.map +1 -1
  88. package/dist/dashboard/command-center-server.d.ts +11 -0
  89. package/dist/dashboard/command-center-server.js +72 -0
  90. package/dist/dashboard/command-center-server.js.map +1 -1
  91. package/dist/dream/__tests__/dream-engine.test.d.ts +1 -0
  92. package/dist/dream/__tests__/dream-engine.test.js +184 -0
  93. package/dist/dream/__tests__/dream-engine.test.js.map +1 -0
  94. package/dist/feedback/__tests__/feedback-router.test.d.ts +1 -0
  95. package/dist/feedback/__tests__/feedback-router.test.js +173 -0
  96. package/dist/feedback/__tests__/feedback-router.test.js.map +1 -0
  97. package/dist/feedback/feedback-router.d.ts +53 -0
  98. package/dist/feedback/feedback-router.js +193 -0
  99. package/dist/feedback/feedback-router.js.map +1 -0
  100. package/dist/feedback/index.d.ts +2 -0
  101. package/dist/feedback/index.js +1 -0
  102. package/dist/feedback/index.js.map +1 -1
  103. package/dist/goals/__tests__/goal-engine.test.d.ts +1 -0
  104. package/dist/goals/__tests__/goal-engine.test.js +203 -0
  105. package/dist/goals/__tests__/goal-engine.test.js.map +1 -0
  106. package/dist/guardrails/__tests__/guardrail-engine.test.d.ts +1 -0
  107. package/dist/guardrails/__tests__/guardrail-engine.test.js +343 -0
  108. package/dist/guardrails/__tests__/guardrail-engine.test.js.map +1 -0
  109. package/dist/index.d.ts +14 -6
  110. package/dist/index.js +8 -3
  111. package/dist/index.js.map +1 -1
  112. package/dist/metacognition/__tests__/auto-experiment-engine.test.d.ts +1 -0
  113. package/dist/metacognition/__tests__/auto-experiment-engine.test.js +218 -0
  114. package/dist/metacognition/__tests__/auto-experiment-engine.test.js.map +1 -0
  115. package/dist/metacognition/__tests__/evolution-engine.test.d.ts +1 -0
  116. package/dist/metacognition/__tests__/evolution-engine.test.js +473 -0
  117. package/dist/metacognition/__tests__/evolution-engine.test.js.map +1 -0
  118. package/dist/metacognition/__tests__/parameter-registry.test.d.ts +1 -0
  119. package/dist/metacognition/__tests__/parameter-registry.test.js +223 -0
  120. package/dist/metacognition/__tests__/parameter-registry.test.js.map +1 -0
  121. package/dist/prediction/__tests__/prediction-engine.test.d.ts +1 -0
  122. package/dist/prediction/__tests__/prediction-engine.test.js +244 -0
  123. package/dist/prediction/__tests__/prediction-engine.test.js.map +1 -0
  124. package/dist/research/research-orchestrator.js +3 -2
  125. package/dist/research/research-orchestrator.js.map +1 -1
  126. package/dist/sandbox/__tests__/code-sandbox.test.d.ts +1 -0
  127. package/dist/sandbox/__tests__/code-sandbox.test.js +182 -0
  128. package/dist/sandbox/__tests__/code-sandbox.test.js.map +1 -0
  129. package/dist/scanner/__tests__/signal-scanner.test.d.ts +1 -0
  130. package/dist/scanner/__tests__/signal-scanner.test.js +142 -0
  131. package/dist/scanner/__tests__/signal-scanner.test.js.map +1 -0
  132. package/dist/self-modification/__tests__/self-modification-engine.test.d.ts +1 -0
  133. package/dist/self-modification/__tests__/self-modification-engine.test.js +313 -0
  134. package/dist/self-modification/__tests__/self-modification-engine.test.js.map +1 -0
  135. package/dist/self-modification/self-modification-engine.d.ts +4 -1
  136. package/dist/self-modification/self-modification-engine.js +41 -3
  137. package/dist/self-modification/self-modification-engine.js.map +1 -1
  138. package/dist/strategy/__tests__/strategy-forge.test.js +69 -0
  139. package/dist/strategy/__tests__/strategy-forge.test.js.map +1 -1
  140. package/dist/strategy/__tests__/strategy-mutator.test.d.ts +1 -0
  141. package/dist/strategy/__tests__/strategy-mutator.test.js +141 -0
  142. package/dist/strategy/__tests__/strategy-mutator.test.js.map +1 -0
  143. package/dist/strategy/index.d.ts +2 -0
  144. package/dist/strategy/index.js +1 -0
  145. package/dist/strategy/index.js.map +1 -1
  146. package/dist/strategy/strategy-forge.d.ts +4 -1
  147. package/dist/strategy/strategy-forge.js +34 -2
  148. package/dist/strategy/strategy-forge.js.map +1 -1
  149. package/dist/strategy/strategy-mutator.d.ts +42 -0
  150. package/dist/strategy/strategy-mutator.js +140 -0
  151. package/dist/strategy/strategy-mutator.js.map +1 -0
  152. package/dist/unified/unified-server.js +2 -2
  153. package/dist/unified/unified-server.js.map +1 -1
  154. package/package.json +1 -1
@@ -0,0 +1,473 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import Database from 'better-sqlite3';
3
+ vi.mock('../../utils/logger.js', () => ({
4
+ getLogger: () => ({
5
+ info: vi.fn(),
6
+ warn: vi.fn(),
7
+ error: vi.fn(),
8
+ debug: vi.fn(),
9
+ }),
10
+ }));
11
+ import { ParameterRegistry } from '../parameter-registry.js';
12
+ import { EvolutionEngine, runEvolutionMigration, } from '../evolution-engine.js';
13
+ /* ------------------------------------------------------------------ */
14
+ /* Helpers */
15
+ /* ------------------------------------------------------------------ */
16
+ function makeConfig(overrides = {}) {
17
+ return {
18
+ brainName: 'test-brain',
19
+ populationSize: 5,
20
+ mutationRate: 0.15,
21
+ eliteCount: 1,
22
+ tournamentSize: 2,
23
+ generationEvery: 10,
24
+ ...overrides,
25
+ };
26
+ }
27
+ function registerTestParameters(registry) {
28
+ registry.registerAll([
29
+ { engine: 'scoring', name: 'threshold', value: 0.5, min: 0, max: 1, description: 'Score threshold' },
30
+ { engine: 'scoring', name: 'weight', value: 0.8, min: 0, max: 2, description: 'Score weight' },
31
+ { engine: 'learning', name: 'rate', value: 0.01, min: 0.001, max: 0.1, description: 'Learning rate' },
32
+ ]);
33
+ }
34
+ function makeMockDataSources(overrides = {}) {
35
+ return {
36
+ getReportCards: () => [
37
+ { engine: 'scoring', combined_score: 0.7 },
38
+ { engine: 'learning', combined_score: 0.6 },
39
+ ],
40
+ getGoalProgress: () => 0.5,
41
+ getPredictionAccuracy: () => 0.4,
42
+ getPrincipleCount: () => 20,
43
+ getHypothesisCount: () => 30,
44
+ ...overrides,
45
+ };
46
+ }
47
+ function makeIndividual(overrides = {}) {
48
+ return {
49
+ id: 1,
50
+ generation: 0,
51
+ genome: { 'scoring:threshold': 0.5, 'scoring:weight': 0.8, 'learning:rate': 0.01 },
52
+ fitness: 0.5,
53
+ rank: 1,
54
+ isActive: false,
55
+ parentAId: null,
56
+ parentBId: null,
57
+ mutationCount: 0,
58
+ ...overrides,
59
+ };
60
+ }
61
+ /* ------------------------------------------------------------------ */
62
+ /* Tests */
63
+ /* ------------------------------------------------------------------ */
64
+ describe('EvolutionEngine', () => {
65
+ let db;
66
+ let registry;
67
+ let engine;
68
+ beforeEach(() => {
69
+ db = new Database(':memory:');
70
+ registry = new ParameterRegistry(db);
71
+ registerTestParameters(registry);
72
+ engine = new EvolutionEngine(db, registry, makeConfig());
73
+ });
74
+ afterEach(() => {
75
+ db.close();
76
+ });
77
+ /* ---------- creation ---------- */
78
+ it('creates evolution tables on construction', () => {
79
+ const tables = db
80
+ .prepare("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name")
81
+ .all();
82
+ const names = tables.map((t) => t.name);
83
+ expect(names).toContain('evolution_generations');
84
+ expect(names).toContain('evolution_individuals');
85
+ expect(names).toContain('evolution_lineage');
86
+ });
87
+ it('runEvolutionMigration() is idempotent', () => {
88
+ expect(() => runEvolutionMigration(db)).not.toThrow();
89
+ expect(() => runEvolutionMigration(db)).not.toThrow();
90
+ });
91
+ it('restores currentGeneration from DB on construction', () => {
92
+ // Insert a generation record to simulate prior history
93
+ db.prepare(`
94
+ INSERT INTO evolution_generations (generation, best_fitness, avg_fitness, worst_fitness, population_size, diversity)
95
+ VALUES (7, 0.9, 0.5, 0.1, 5, 0.3)
96
+ `).run();
97
+ const engine2 = new EvolutionEngine(db, registry, makeConfig());
98
+ const status = engine2.getStatus();
99
+ expect(status.currentGeneration).toBe(7);
100
+ });
101
+ /* ---------- getStatus (initial) ---------- */
102
+ it('getStatus() returns correct initial state', () => {
103
+ const status = engine.getStatus();
104
+ expect(status.currentGeneration).toBe(0);
105
+ expect(status.populationSize).toBe(5);
106
+ expect(status.bestFitness).toBe(0);
107
+ expect(status.avgFitness).toBe(0);
108
+ expect(status.totalIndividuals).toBe(0);
109
+ expect(status.isInitialized).toBe(false);
110
+ expect(status.champion).toBeNull();
111
+ expect(status.config).toEqual({
112
+ populationSize: 5,
113
+ mutationRate: 0.15,
114
+ eliteCount: 1,
115
+ tournamentSize: 2,
116
+ generationEvery: 10,
117
+ });
118
+ });
119
+ /* ---------- initializePopulation ---------- */
120
+ it('initializePopulation() creates the configured number of individuals', () => {
121
+ engine.initializePopulation();
122
+ const status = engine.getStatus();
123
+ expect(status.totalIndividuals).toBe(5);
124
+ expect(status.isInitialized).toBe(true);
125
+ const pop = engine.getPopulation(0);
126
+ expect(pop.length).toBe(5);
127
+ // All individuals should have genomes with 3 keys
128
+ for (const ind of pop) {
129
+ expect(Object.keys(ind.genome)).toHaveLength(3);
130
+ expect(ind.generation).toBe(0);
131
+ }
132
+ });
133
+ it('initializePopulation() is idempotent — second call does nothing', () => {
134
+ engine.initializePopulation();
135
+ engine.initializePopulation();
136
+ const status = engine.getStatus();
137
+ expect(status.totalIndividuals).toBe(5);
138
+ });
139
+ it('initializePopulation() does nothing when registry has no parameters', () => {
140
+ const emptyDb = new Database(':memory:');
141
+ const emptyRegistry = new ParameterRegistry(emptyDb);
142
+ const emptyEngine = new EvolutionEngine(emptyDb, emptyRegistry, makeConfig());
143
+ emptyEngine.initializePopulation();
144
+ const status = emptyEngine.getStatus();
145
+ expect(status.totalIndividuals).toBe(0);
146
+ expect(status.isInitialized).toBe(false);
147
+ emptyDb.close();
148
+ });
149
+ /* ---------- evaluateFitness ---------- */
150
+ it('evaluateFitness() returns 0 when no data sources are set', () => {
151
+ const individual = makeIndividual();
152
+ const fitness = engine.evaluateFitness(individual);
153
+ expect(fitness).toBe(0);
154
+ });
155
+ it('evaluateFitness() computes a weighted fitness score from data sources', () => {
156
+ engine.setDataSources(makeMockDataSources());
157
+ engine.initializePopulation();
158
+ const individual = makeIndividual();
159
+ const fitness = engine.evaluateFitness(individual);
160
+ // fitness should be between 0 and 1
161
+ expect(fitness).toBeGreaterThanOrEqual(0);
162
+ expect(fitness).toBeLessThanOrEqual(1);
163
+ // With our mock data: metaCog=0.65, goal=0.5, pred=0.4, knowledge=0.5, novelty varies
164
+ // 0.65*0.4 + 0.5*0.2 + 0.4*0.2 + 0.5*0.1 + novelty*0.1
165
+ // = 0.26 + 0.10 + 0.08 + 0.05 + novelty*0.1
166
+ // Should be roughly 0.49 + novelty*0.1
167
+ expect(fitness).toBeGreaterThan(0.3);
168
+ });
169
+ it('evaluateFitness() handles data source errors gracefully', () => {
170
+ engine.setDataSources({
171
+ getReportCards: () => { throw new Error('DB error'); },
172
+ getGoalProgress: () => { throw new Error('DB error'); },
173
+ getPredictionAccuracy: () => { throw new Error('DB error'); },
174
+ getPrincipleCount: () => { throw new Error('DB error'); },
175
+ getHypothesisCount: () => { throw new Error('DB error'); },
176
+ });
177
+ engine.initializePopulation();
178
+ const individual = makeIndividual();
179
+ // Should not throw — all errors are caught internally
180
+ const fitness = engine.evaluateFitness(individual);
181
+ expect(fitness).toBeGreaterThanOrEqual(0);
182
+ expect(fitness).toBeLessThanOrEqual(1);
183
+ });
184
+ /* ---------- tournamentSelect ---------- */
185
+ it('tournamentSelect() returns the fittest contestant', () => {
186
+ const population = [
187
+ makeIndividual({ id: 1, fitness: 0.1 }),
188
+ makeIndividual({ id: 2, fitness: 0.9 }),
189
+ makeIndividual({ id: 3, fitness: 0.5 }),
190
+ makeIndividual({ id: 4, fitness: 0.3 }),
191
+ makeIndividual({ id: 5, fitness: 0.7 }),
192
+ ];
193
+ // Run many selections — the result should always be one of the population
194
+ const selections = new Set();
195
+ for (let i = 0; i < 50; i++) {
196
+ const selected = engine.tournamentSelect(population, 3);
197
+ expect(selected.fitness).toBeGreaterThanOrEqual(0);
198
+ expect(selected.fitness).toBeLessThanOrEqual(1);
199
+ selections.add(selected.id);
200
+ }
201
+ // Over 50 tries, tournament selection should have selected multiple individuals
202
+ expect(selections.size).toBeGreaterThanOrEqual(1);
203
+ });
204
+ it('tournamentSelect() works with tournament size larger than population', () => {
205
+ const population = [
206
+ makeIndividual({ id: 1, fitness: 0.2 }),
207
+ makeIndividual({ id: 2, fitness: 0.8 }),
208
+ ];
209
+ // Tournament size 10 > population size 2 — should clamp via Math.min
210
+ const selected = engine.tournamentSelect(population, 10);
211
+ expect(selected).toBeDefined();
212
+ // Selection picks with replacement, so result is one of the two individuals
213
+ expect([0.2, 0.8]).toContain(selected.fitness);
214
+ });
215
+ /* ---------- crossover ---------- */
216
+ it('crossover() produces a child with genes from both parents', () => {
217
+ const parentA = makeIndividual({
218
+ genome: { 'scoring:threshold': 0.1, 'scoring:weight': 0.2, 'learning:rate': 0.03 },
219
+ });
220
+ const parentB = makeIndividual({
221
+ genome: { 'scoring:threshold': 0.9, 'scoring:weight': 1.8, 'learning:rate': 0.09 },
222
+ });
223
+ // Run crossover many times to check both parents can contribute
224
+ const seenFromA = new Set();
225
+ const seenFromB = new Set();
226
+ for (let i = 0; i < 100; i++) {
227
+ const { child, crossoverPoints } = engine.crossover(parentA, parentB);
228
+ // Child should have all 3 keys
229
+ expect(Object.keys(child)).toHaveLength(3);
230
+ for (const key of Object.keys(child)) {
231
+ if (child[key] === parentA.genome[key])
232
+ seenFromA.add(key);
233
+ if (child[key] === parentB.genome[key])
234
+ seenFromB.add(key);
235
+ }
236
+ // crossoverPoints should only contain keys taken from parentB
237
+ for (const point of crossoverPoints) {
238
+ expect(child[point]).toBe(parentB.genome[point]);
239
+ }
240
+ }
241
+ // Over 100 iterations, both parents should contribute at least one gene
242
+ expect(seenFromA.size).toBeGreaterThan(0);
243
+ expect(seenFromB.size).toBeGreaterThan(0);
244
+ });
245
+ it('crossover() handles disjoint genome keys (union of both)', () => {
246
+ const parentA = makeIndividual({
247
+ genome: { 'scoring:threshold': 0.5, 'unique:paramA': 0.3 },
248
+ });
249
+ const parentB = makeIndividual({
250
+ genome: { 'scoring:threshold': 0.7, 'unique:paramB': 0.6 },
251
+ });
252
+ const { child } = engine.crossover(parentA, parentB);
253
+ // Child should have the union of all keys
254
+ const keys = Object.keys(child);
255
+ expect(keys).toContain('scoring:threshold');
256
+ expect(keys).toContain('unique:paramA');
257
+ expect(keys).toContain('unique:paramB');
258
+ });
259
+ /* ---------- mutateGenome ---------- */
260
+ it('mutateGenome() with rate=0 produces no mutations', () => {
261
+ const genome = { 'scoring:threshold': 0.5, 'scoring:weight': 0.8, 'learning:rate': 0.01 };
262
+ const { genome: mutated, mutations } = engine.mutateGenome(genome, 0);
263
+ expect(mutations).toBe(0);
264
+ expect(mutated['scoring:threshold']).toBe(0.5);
265
+ expect(mutated['scoring:weight']).toBe(0.8);
266
+ expect(mutated['learning:rate']).toBe(0.01);
267
+ });
268
+ it('mutateGenome() with rate=1 mutates all genes (within bounds)', () => {
269
+ const genome = { 'scoring:threshold': 0.5, 'scoring:weight': 0.8, 'learning:rate': 0.01 };
270
+ // Run multiple times — with rate=1, all 3 genes should be mutated each time
271
+ let totalMutations = 0;
272
+ for (let i = 0; i < 20; i++) {
273
+ const { genome: mutated, mutations } = engine.mutateGenome(genome, 1.0);
274
+ totalMutations += mutations;
275
+ // Values must stay within registered bounds
276
+ expect(mutated['scoring:threshold']).toBeGreaterThanOrEqual(0);
277
+ expect(mutated['scoring:threshold']).toBeLessThanOrEqual(1);
278
+ expect(mutated['scoring:weight']).toBeGreaterThanOrEqual(0);
279
+ expect(mutated['scoring:weight']).toBeLessThanOrEqual(2);
280
+ expect(mutated['learning:rate']).toBeGreaterThanOrEqual(0.001);
281
+ expect(mutated['learning:rate']).toBeLessThanOrEqual(0.1);
282
+ }
283
+ // With rate=1.0, every call should mutate all 3 genes → 60 total
284
+ expect(totalMutations).toBe(60);
285
+ });
286
+ it('mutateGenome() does not mutate the original genome object', () => {
287
+ const genome = { 'scoring:threshold': 0.5, 'scoring:weight': 0.8 };
288
+ engine.mutateGenome(genome, 1.0);
289
+ // Original should be untouched
290
+ expect(genome['scoring:threshold']).toBe(0.5);
291
+ expect(genome['scoring:weight']).toBe(0.8);
292
+ });
293
+ /* ---------- runGeneration ---------- */
294
+ it('runGeneration() produces a new generation with correct stats', () => {
295
+ engine.setDataSources(makeMockDataSources());
296
+ engine.initializePopulation();
297
+ const gen = engine.runGeneration();
298
+ expect(gen.generation).toBe(1);
299
+ expect(gen.populationSize).toBe(5);
300
+ expect(gen.bestFitness).toBeGreaterThanOrEqual(0);
301
+ expect(gen.avgFitness).toBeGreaterThanOrEqual(0);
302
+ expect(gen.worstFitness).toBeGreaterThanOrEqual(0);
303
+ expect(gen.bestFitness).toBeGreaterThanOrEqual(gen.avgFitness);
304
+ expect(gen.avgFitness).toBeGreaterThanOrEqual(gen.worstFitness);
305
+ expect(gen.diversity).toBeGreaterThanOrEqual(0);
306
+ // Population for generation 1 should exist
307
+ const pop = engine.getPopulation(1);
308
+ expect(pop.length).toBe(5);
309
+ // Status should reflect the new generation
310
+ const status = engine.getStatus();
311
+ expect(status.currentGeneration).toBe(1);
312
+ expect(status.isInitialized).toBe(true);
313
+ });
314
+ it('runGeneration() applies best genome to parameter registry', () => {
315
+ engine.setDataSources(makeMockDataSources());
316
+ engine.initializePopulation();
317
+ const origThreshold = registry.get('scoring', 'threshold');
318
+ const origWeight = registry.get('scoring', 'weight');
319
+ const origRate = registry.get('learning', 'rate');
320
+ engine.runGeneration();
321
+ // At least one parameter should be potentially different
322
+ // (elites could keep original, but mutations change others)
323
+ const newThreshold = registry.get('scoring', 'threshold');
324
+ const newWeight = registry.get('scoring', 'weight');
325
+ const newRate = registry.get('learning', 'rate');
326
+ // Values must remain within bounds regardless
327
+ expect(newThreshold).toBeGreaterThanOrEqual(0);
328
+ expect(newThreshold).toBeLessThanOrEqual(1);
329
+ expect(newWeight).toBeGreaterThanOrEqual(0);
330
+ expect(newWeight).toBeLessThanOrEqual(2);
331
+ expect(newRate).toBeGreaterThanOrEqual(0.001);
332
+ expect(newRate).toBeLessThanOrEqual(0.1);
333
+ });
334
+ it('runGeneration() records lineage for offspring', () => {
335
+ engine.setDataSources(makeMockDataSources());
336
+ engine.initializePopulation();
337
+ engine.runGeneration();
338
+ // Check that lineage records exist
339
+ const lineageRows = db.prepare('SELECT COUNT(*) AS cnt FROM evolution_lineage').get();
340
+ expect(lineageRows.cnt).toBeGreaterThan(0);
341
+ });
342
+ it('runGeneration() can run multiple generations consecutively', () => {
343
+ engine.setDataSources(makeMockDataSources());
344
+ engine.initializePopulation();
345
+ engine.runGeneration();
346
+ engine.runGeneration();
347
+ const gen3 = engine.runGeneration();
348
+ expect(gen3.generation).toBe(3);
349
+ const status = engine.getStatus();
350
+ expect(status.currentGeneration).toBe(3);
351
+ // Total individuals should be gen0 (5) + gen1 (5) + gen2 (5) + gen3 (5)
352
+ expect(status.totalIndividuals).toBe(20);
353
+ });
354
+ /* ---------- getHistory ---------- */
355
+ it('getHistory() returns generation records in descending order', () => {
356
+ engine.setDataSources(makeMockDataSources());
357
+ engine.initializePopulation();
358
+ engine.runGeneration();
359
+ engine.runGeneration();
360
+ engine.runGeneration();
361
+ const history = engine.getHistory();
362
+ expect(history.length).toBe(3);
363
+ // Descending order by generation number
364
+ expect(history[0].generation).toBe(3);
365
+ expect(history[1].generation).toBe(2);
366
+ expect(history[2].generation).toBe(1);
367
+ for (const gen of history) {
368
+ expect(gen.populationSize).toBe(5);
369
+ expect(gen.bestFitness).toBeGreaterThanOrEqual(0);
370
+ expect(gen.diversity).toBeGreaterThanOrEqual(0);
371
+ }
372
+ });
373
+ it('getHistory() returns empty array when no generations have run', () => {
374
+ const history = engine.getHistory();
375
+ expect(history).toEqual([]);
376
+ });
377
+ it('getHistory() respects the limit parameter', () => {
378
+ engine.setDataSources(makeMockDataSources());
379
+ engine.initializePopulation();
380
+ engine.runGeneration();
381
+ engine.runGeneration();
382
+ engine.runGeneration();
383
+ const limited = engine.getHistory(2);
384
+ expect(limited.length).toBe(2);
385
+ expect(limited[0].generation).toBe(3);
386
+ expect(limited[1].generation).toBe(2);
387
+ });
388
+ /* ---------- getBestIndividual ---------- */
389
+ it('getBestIndividual() returns null when no individuals exist', () => {
390
+ const best = engine.getBestIndividual();
391
+ expect(best).toBeNull();
392
+ });
393
+ it('getBestIndividual() returns the highest-fitness individual', () => {
394
+ engine.setDataSources(makeMockDataSources());
395
+ engine.initializePopulation();
396
+ engine.runGeneration();
397
+ const best = engine.getBestIndividual();
398
+ expect(best).not.toBeNull();
399
+ expect(best.id).toBeDefined();
400
+ expect(best.genome).toBeDefined();
401
+ expect(Object.keys(best.genome).length).toBeGreaterThan(0);
402
+ expect(best.fitness).toBeGreaterThanOrEqual(0);
403
+ // Verify it is truly the highest-fitness individual
404
+ const allRows = db.prepare('SELECT fitness FROM evolution_individuals ORDER BY fitness DESC').all();
405
+ expect(best.fitness).toBe(allRows[0].fitness);
406
+ });
407
+ /* ---------- getPopulation ---------- */
408
+ it('getPopulation() returns individuals for the specified generation', () => {
409
+ engine.initializePopulation();
410
+ const pop0 = engine.getPopulation(0);
411
+ expect(pop0.length).toBe(5);
412
+ for (const ind of pop0) {
413
+ expect(ind.generation).toBe(0);
414
+ expect(ind.genome).toBeDefined();
415
+ expect(typeof ind.fitness).toBe('number');
416
+ expect(typeof ind.isActive).toBe('boolean');
417
+ }
418
+ });
419
+ it('getPopulation() defaults to current generation', () => {
420
+ engine.setDataSources(makeMockDataSources());
421
+ engine.initializePopulation();
422
+ engine.runGeneration();
423
+ const pop = engine.getPopulation();
424
+ expect(pop.length).toBe(5);
425
+ for (const ind of pop) {
426
+ expect(ind.generation).toBe(1);
427
+ }
428
+ });
429
+ it('getPopulation() returns empty array for non-existent generation', () => {
430
+ const pop = engine.getPopulation(999);
431
+ expect(pop).toEqual([]);
432
+ });
433
+ /* ---------- getLineage ---------- */
434
+ it('getLineage() returns parent records for a child individual', () => {
435
+ engine.setDataSources(makeMockDataSources());
436
+ engine.initializePopulation();
437
+ engine.runGeneration();
438
+ // Find an individual with parents (non-elite offspring from gen 1)
439
+ const offspring = db.prepare('SELECT id FROM evolution_individuals WHERE generation = 1 AND parent_b_id IS NOT NULL LIMIT 1').get();
440
+ if (offspring) {
441
+ const lineage = engine.getLineage(offspring.id);
442
+ expect(lineage.length).toBeGreaterThanOrEqual(1);
443
+ for (const entry of lineage) {
444
+ expect(entry.childId).toBe(offspring.id);
445
+ expect(entry.parentId).toBeGreaterThan(0);
446
+ expect(typeof entry.crossoverPoint).toBe('string');
447
+ }
448
+ }
449
+ });
450
+ /* ---------- activate ---------- */
451
+ it('activate() applies genome values to the parameter registry', () => {
452
+ const genome = {
453
+ 'scoring:threshold': 0.75,
454
+ 'scoring:weight': 1.5,
455
+ 'learning:rate': 0.05,
456
+ };
457
+ engine.activate(genome);
458
+ expect(registry.get('scoring', 'threshold')).toBe(0.75);
459
+ expect(registry.get('scoring', 'weight')).toBe(1.5);
460
+ expect(registry.get('learning', 'rate')).toBe(0.05);
461
+ });
462
+ /* ---------- config defaults ---------- */
463
+ it('uses default config values when not specified', () => {
464
+ const minimalEngine = new EvolutionEngine(db, registry, { brainName: 'minimal' });
465
+ const status = minimalEngine.getStatus();
466
+ expect(status.config.populationSize).toBe(15);
467
+ expect(status.config.mutationRate).toBe(0.15);
468
+ expect(status.config.eliteCount).toBe(2);
469
+ expect(status.config.tournamentSize).toBe(3);
470
+ expect(status.config.generationEvery).toBe(20);
471
+ });
472
+ });
473
+ //# sourceMappingURL=evolution-engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evolution-engine.test.js","sourceRoot":"","sources":["../../../src/metacognition/__tests__/evolution-engine.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChB,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACf,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EACL,eAAe,EACf,qBAAqB,GAKtB,MAAM,wBAAwB,CAAC;AAEhC,wEAAwE;AACxE,wEAAwE;AACxE,wEAAwE;AAExE,SAAS,UAAU,CAAC,YAAsC,EAAE;IAC1D,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,CAAC;QACb,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,EAAE;QACnB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,QAA2B;IACzD,QAAQ,CAAC,WAAW,CAAC;QACnB,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE;QACpG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE;QAC9F,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,eAAe,EAAE;KACtG,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,YAA2C,EAAE;IACxE,OAAO;QACL,cAAc,EAAE,GAAG,EAAE,CAAC;YACpB,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,EAAE;YAC1C,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE;SAC5C;QACD,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG;QAC1B,qBAAqB,EAAE,GAAG,EAAE,CAAC,GAAG;QAChC,iBAAiB,EAAE,GAAG,EAAE,CAAC,EAAE;QAC3B,kBAAkB,EAAE,GAAG,EAAE,CAAC,EAAE;QAC5B,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,YAAiC,EAAE;IACzD,OAAO;QACL,EAAE,EAAE,CAAC;QACL,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,EAAE,mBAAmB,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;QAClF,OAAO,EAAE,GAAG;QACZ,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,CAAC;QAChB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,wEAAwE;AACxE,wEAAwE;AAExE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,EAAqB,CAAC;IAC1B,IAAI,QAA2B,CAAC;IAChC,IAAI,MAAuB,CAAC;IAE5B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9B,QAAQ,GAAG,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACrC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,oCAAoC;IAEpC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CAAC,mEAAmE,CAAC;aAC5E,GAAG,EAAwB,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,uDAAuD;QACvD,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,EAAE,CAAC;QAET,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAE/C,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAElC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YAC5B,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,gDAAgD;IAEhD,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3B,kDAAkD;QAClD,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAC9B,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAE9E,WAAW,CAAC,oBAAoB,EAAE,CAAC;QAEnC,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzC,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAE3C,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAEnD,oCAAoC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QACvC,sFAAsF;QACtF,uDAAuD;QACvD,4CAA4C;QAC5C,uCAAuC;QACvC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,cAAc,CAAC;YACpB,cAAc,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACtD,eAAe,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACvD,qBAAqB,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7D,iBAAiB,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACzD,kBAAkB,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SAC3D,CAAC,CAAC;QACH,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,sDAAsD;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,4CAA4C;IAE5C,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,UAAU,GAAiB;YAC/B,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YACvC,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YACvC,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YACvC,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YACvC,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;SACxC,CAAC;QAEF,0EAA0E;QAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAChD,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAG,CAAC,CAAC;QAC/B,CAAC;QAED,gFAAgF;QAChF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,UAAU,GAAiB;YAC/B,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YACvC,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;SACxC,CAAC;QAEF,qEAAqE;QACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,4EAA4E;QAC5E,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,qCAAqC;IAErC,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,OAAO,GAAG,cAAc,CAAC;YAC7B,MAAM,EAAE,EAAE,mBAAmB,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;SACnF,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,CAAC;YAC7B,MAAM,EAAE,EAAE,mBAAmB,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;SACnF,CAAC,CAAC;QAEH,gEAAgE;QAChE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEtE,+BAA+B;YAC/B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAE3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;oBAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC3D,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;oBAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7D,CAAC;YAED,8DAA8D;YAC9D,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;gBACpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,OAAO,GAAG,cAAc,CAAC;YAC7B,MAAM,EAAE,EAAE,mBAAmB,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE;SAC3D,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,CAAC;YAC7B,MAAM,EAAE,EAAE,mBAAmB,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE;SAC3D,CAAC,CAAC;QAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrD,0CAA0C;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,wCAAwC;IAExC,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAW,EAAE,mBAAmB,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QAClG,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAEtE,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAW,EAAE,mBAAmB,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QAElG,4EAA4E;QAC5E,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACxE,cAAc,IAAI,SAAS,CAAC;YAE5B,4CAA4C;YAC5C,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC;QAED,iEAAiE;QACjE,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAW,EAAE,mBAAmB,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC;QAC3E,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAEjC,+BAA+B;QAC/B,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,yCAAyC;IAEzC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAEnC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAEhD,2CAA2C;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3B,2CAA2C;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAElD,MAAM,CAAC,aAAa,EAAE,CAAC;QAEvB,yDAAyD;QACzD,4DAA4D;QAC5D,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAEjD,8CAA8C;QAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAa,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAU,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAQ,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,CAAC,aAAa,EAAE,CAAC;QAEvB,mCAAmC;QACnC,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,EAAqB,CAAC;QACzG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAEpC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzC,wEAAwE;QACxE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,sCAAsC;IAEtC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,CAAC,aAAa,EAAE,CAAC;QAEvB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE/B,wCAAwC;QACxC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEtC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,CAAC,aAAa,EAAE,CAAC;QAEvB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,6CAA6C;IAE7C,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,IAAI,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAC9B,MAAM,CAAC,aAAa,EAAE,CAAC;QAEvB,MAAM,IAAI,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAK,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAK,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAEhD,oDAAoD;QACpD,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,iEAAiE,CAClE,CAAC,GAAG,EAA2B,CAAC;QACjC,MAAM,CAAC,IAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,yCAAyC;IAEzC,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAE9B,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAC9B,MAAM,CAAC,aAAa,EAAE,CAAC;QAEvB,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,sCAAsC;IAEtC,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAC9B,MAAM,CAAC,aAAa,EAAE,CAAC;QAEvB,mEAAmE;QACnE,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,+FAA+F,CAChG,CAAC,GAAG,EAAgC,CAAC;QAEtC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YACjD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAC1C,MAAM,CAAC,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,oCAAoC;IAEpC,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,MAAM,GAAW;YACrB,mBAAmB,EAAE,IAAI;YACzB,gBAAgB,EAAE,GAAG;YACrB,eAAe,EAAE,IAAI;SACtB,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAE3C,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,aAAa,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;QAEzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}