@mmnto/totem 1.109.0 → 1.111.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/config-schema.d.ts +22 -0
  2. package/dist/config-schema.d.ts.map +1 -1
  3. package/dist/config-schema.js +6 -0
  4. package/dist/config-schema.js.map +1 -1
  5. package/dist/config-schema.test.js +21 -0
  6. package/dist/config-schema.test.js.map +1 -1
  7. package/dist/embedders/embedder.d.ts +29 -0
  8. package/dist/embedders/embedder.d.ts.map +1 -1
  9. package/dist/embedders/embedder.js +26 -3
  10. package/dist/embedders/embedder.js.map +1 -1
  11. package/dist/embedders/embedder.test.js +51 -0
  12. package/dist/embedders/embedder.test.js.map +1 -1
  13. package/dist/embedders/gemini-embedder.d.ts +18 -1
  14. package/dist/embedders/gemini-embedder.d.ts.map +1 -1
  15. package/dist/embedders/gemini-embedder.js +98 -5
  16. package/dist/embedders/gemini-embedder.js.map +1 -1
  17. package/dist/embedders/gemini-embedder.test.js +153 -1
  18. package/dist/embedders/gemini-embedder.test.js.map +1 -1
  19. package/dist/embedders/openai-embedder.d.ts +2 -1
  20. package/dist/embedders/openai-embedder.d.ts.map +1 -1
  21. package/dist/embedders/openai-embedder.js +21 -4
  22. package/dist/embedders/openai-embedder.js.map +1 -1
  23. package/dist/embedders/openai-embedder.test.d.ts +2 -0
  24. package/dist/embedders/openai-embedder.test.d.ts.map +1 -0
  25. package/dist/embedders/openai-embedder.test.js +102 -0
  26. package/dist/embedders/openai-embedder.test.js.map +1 -0
  27. package/dist/embedders/pacing.d.ts +11 -0
  28. package/dist/embedders/pacing.d.ts.map +1 -0
  29. package/dist/embedders/pacing.js +23 -0
  30. package/dist/embedders/pacing.js.map +1 -0
  31. package/dist/embedders/pacing.test.d.ts +2 -0
  32. package/dist/embedders/pacing.test.d.ts.map +1 -0
  33. package/dist/embedders/pacing.test.js +50 -0
  34. package/dist/embedders/pacing.test.js.map +1 -0
  35. package/dist/index.d.ts +2 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -2
  38. package/dist/index.js.map +1 -1
  39. package/dist/ingest/file-resolver.d.ts +14 -0
  40. package/dist/ingest/file-resolver.d.ts.map +1 -1
  41. package/dist/ingest/file-resolver.js +27 -9
  42. package/dist/ingest/file-resolver.js.map +1 -1
  43. package/dist/ingest/pipeline.d.ts +9 -0
  44. package/dist/ingest/pipeline.d.ts.map +1 -1
  45. package/dist/ingest/pipeline.js +356 -33
  46. package/dist/ingest/pipeline.js.map +1 -1
  47. package/dist/ingest/pipeline.test.js +456 -0
  48. package/dist/ingest/pipeline.test.js.map +1 -1
  49. package/dist/ingest/sync.d.ts +2 -2
  50. package/dist/ingest/sync.d.ts.map +1 -1
  51. package/dist/ingest/sync.js +2 -2
  52. package/dist/ingest/sync.js.map +1 -1
  53. package/dist/ledger.d.ts +4 -4
  54. package/dist/lock.d.ts +55 -6
  55. package/dist/lock.d.ts.map +1 -1
  56. package/dist/lock.js +180 -39
  57. package/dist/lock.js.map +1 -1
  58. package/dist/lock.test.js +201 -1
  59. package/dist/lock.test.js.map +1 -1
  60. package/dist/types.d.ts +45 -0
  61. package/dist/types.d.ts.map +1 -1
  62. package/dist/types.js.map +1 -1
  63. package/package.json +1 -1
@@ -11,6 +11,15 @@ import type { SyncOptions } from '../types.js';
11
11
  * Throws TotemDatabaseError if the provider has changed.
12
12
  */
13
13
  export declare function verifyIndexMeta(totemDir: string, config: TotemConfig): void;
14
+ /**
15
+ * Whether a full re-index epoch is in progress (its dirty marker exists) for
16
+ * the given totem dir (#2562). Exposed for callers that spawn or gate syncs
17
+ * under bounded budgets — e.g. the MCP add-lesson tool's 60s-killed
18
+ * convenience sync, which a promoted paced resume can never finish
19
+ * (falsification round 3, MAJOR 1): such callers should skip and defer to the
20
+ * running epoch instead of timing out against it.
21
+ */
22
+ export declare function hasFullSyncCheckpoint(totemDir: string): boolean;
14
23
  /**
15
24
  * One entry in the index-manifest `documents[]` array.
16
25
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/ingest/pipeline.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQvD,OAAO,KAAK,EAAS,WAAW,EAAa,MAAM,aAAa,CAAC;AAyCjE;;;GAGG;AACH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAuB3E;AAmCD;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,+FAA+F;IAC/F,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,2EAA2E;AAC3E,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC;CACjB,GAAG,aAAa,CAUhB;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IACT,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAUD;AAYD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,MAAM,EAAE,EACzB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,MAAM,EAAE,CAGV;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAIhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,iBAAiB,EAAE,MAAM,EAAE,EAC3B,eAAe,EAAE,MAAM,EAAE,GACxB,MAAM,EAAE,CAGV"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/ingest/pipeline.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AASvD,OAAO,KAAK,EAA6B,WAAW,EAAa,MAAM,aAAa,CAAC;AA+CrF;;;GAGG;AACH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAuB3E;AAuFD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/D;AAkBD;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,+FAA+F;IAC/F,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,2EAA2E;AAC3E,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC;CACjB,GAAG,aAAa,CAUhB;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IACT,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAWD;AA6BD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,MAAM,EAAE,EACzB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,MAAM,EAAE,CAGV;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAIhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,iBAAiB,EAAE,MAAM,EAAE,EAC3B,eAAe,EAAE,MAAM,EAAE,GACxB,MAAM,EAAE,CAGV"}
@@ -4,15 +4,16 @@ import { calculateDeterministicHash } from '../artifacts/hash.js';
4
4
  import { createChunker } from '../chunkers/chunker.js';
5
5
  import { requireEmbedding } from '../config-schema.js';
6
6
  import { createEmbedder } from '../embedders/embedder.js';
7
- import { TotemDatabaseError } from '../errors.js';
7
+ import { TotemDatabaseError, TotemError } from '../errors.js';
8
8
  import { withLock } from '../lock.js';
9
9
  import { sanitizeForIngestion } from '../sanitize.js';
10
10
  import { LanceStore } from '../store/lance-store.js';
11
11
  import { sanitizeForTerminal } from '../terminal-sanitize.js';
12
- import { getChangedFiles, getHeadSha, resolveFiles } from './file-resolver.js';
12
+ import { getChangedFiles, getChangedFilesDetailed, getHeadSha, resolveFiles, } from './file-resolver.js';
13
13
  const EMBED_BATCH_SIZE = 100;
14
14
  const SYNC_STATE_FILE = 'cache/sync-state.json';
15
15
  const INDEX_META_FILE = 'cache/index-meta.json';
16
+ const FULL_SYNC_CHECKPOINT_FILE = 'cache/full-sync-checkpoint.json';
16
17
  function readIndexMeta(totemDir) {
17
18
  const metaPath = path.join(totemDir, INDEX_META_FILE);
18
19
  try {
@@ -83,11 +84,79 @@ function readSyncState(totemDir, onProgress) {
83
84
  return null;
84
85
  }
85
86
  }
87
+ /**
88
+ * Atomic JSON write (tmp + rename): a crash mid-write must never leave a torn
89
+ * state file — sync state and the full-sync checkpoint are both trusted by the
90
+ * NEXT run's control flow (#2562), matching the index-manifest write pattern.
91
+ */
92
+ function writeJsonAtomic(filePath, value) {
93
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
94
+ // PID-unique tmp name: two writers racing under a stolen stale lock must
95
+ // not interleave through one tmp path (falsification round 1, MINOR 6).
96
+ const tmpPath = `${filePath}.${process.pid}.tmp`;
97
+ fs.writeFileSync(tmpPath, JSON.stringify(value, null, 2) + '\n', 'utf-8');
98
+ fs.renameSync(tmpPath, filePath);
99
+ }
86
100
  function writeSyncState(totemDir, state) {
87
- const statePath = path.join(totemDir, SYNC_STATE_FILE);
88
- const dir = path.dirname(statePath);
89
- fs.mkdirSync(dir, { recursive: true });
90
- fs.writeFileSync(statePath, JSON.stringify(state, null, 2) + '\n', 'utf-8');
101
+ writeJsonAtomic(path.join(totemDir, SYNC_STATE_FILE), state);
102
+ }
103
+ /**
104
+ * Read the full-sync checkpoint (#2562). The caller has already established
105
+ * the file EXISTS (existence = the dirty marker); a parse/shape failure here
106
+ * means "dirty but unusable" — the caller restarts the full re-index from
107
+ * zero. A present-but-corrupt checkpoint is never treated as a clean state.
108
+ */
109
+ function readFullSyncCheckpoint(totemDir, onProgress) {
110
+ const cpPath = path.join(totemDir, FULL_SYNC_CHECKPOINT_FILE);
111
+ try {
112
+ const parsed = JSON.parse(fs.readFileSync(cpPath, 'utf-8'));
113
+ if (parsed &&
114
+ (parsed.startedHeadSha === null || typeof parsed.startedHeadSha === 'string') &&
115
+ typeof parsed.startedAt === 'number' &&
116
+ typeof parsed.indexExclusionHash === 'string' &&
117
+ typeof parsed.embedder?.provider === 'string' &&
118
+ typeof parsed.embedder?.model === 'string' &&
119
+ typeof parsed.embedder?.dimensions === 'number' &&
120
+ Array.isArray(parsed.completedFiles) &&
121
+ parsed.completedFiles.every((f) => typeof f === 'string')) {
122
+ return parsed;
123
+ }
124
+ onProgress?.(`Warning: malformed full-sync checkpoint at ${cpPath} — ignoring its progress.`);
125
+ return null;
126
+ // totem-context: intentional warn+null on an unreadable checkpoint (mmnto-ai/totem#2562) — dirty-but-unusable restarts the full re-index from zero; failing the sync over a torn checkpoint would wedge every subsequent run.
127
+ }
128
+ catch (err) {
129
+ onProgress?.(`Warning: failed to read full-sync checkpoint: ${err instanceof Error ? err.message : String(err)}`);
130
+ return null;
131
+ }
132
+ }
133
+ function writeFullSyncCheckpoint(totemDir, checkpoint) {
134
+ writeJsonAtomic(path.join(totemDir, FULL_SYNC_CHECKPOINT_FILE), checkpoint);
135
+ }
136
+ /**
137
+ * Whether a full re-index epoch is in progress (its dirty marker exists) for
138
+ * the given totem dir (#2562). Exposed for callers that spawn or gate syncs
139
+ * under bounded budgets — e.g. the MCP add-lesson tool's 60s-killed
140
+ * convenience sync, which a promoted paced resume can never finish
141
+ * (falsification round 3, MAJOR 1): such callers should skip and defer to the
142
+ * running epoch instead of timing out against it.
143
+ */
144
+ export function hasFullSyncCheckpoint(totemDir) {
145
+ return fs.existsSync(path.join(totemDir, FULL_SYNC_CHECKPOINT_FILE));
146
+ }
147
+ /**
148
+ * Best-effort marker delete at successful completion. A failed delete is loud
149
+ * but non-fatal: the next run resumes-full as a near-noop and retries the
150
+ * delete, so correctness converges (#2562).
151
+ */
152
+ function deleteFullSyncCheckpoint(totemDir, onProgress) {
153
+ try {
154
+ fs.rmSync(path.join(totemDir, FULL_SYNC_CHECKPOINT_FILE), { force: true });
155
+ // totem-context: intentional best-effort delete (mmnto-ai/totem#2562) — a failed marker delete only makes the next run resume-full as a near-noop and retry it; aborting a fully-successful sync over it would be the drift.
156
+ }
157
+ catch (err) {
158
+ onProgress?.(`Warning: failed to delete full-sync checkpoint: ${err instanceof Error ? err.message : String(err)}`);
159
+ }
91
160
  }
92
161
  /** Current schema identifier persisted to `.totem/index-manifest.json`. */
93
162
  export const INDEX_MANIFEST_SCHEMA = 'totem-index-manifest-v0.2';
@@ -119,7 +188,19 @@ export async function runSync(config, options) {
119
188
  const { projectRoot, onProgress } = options;
120
189
  const log = onProgress ?? (() => { });
121
190
  const totemDir = path.join(projectRoot, config.totemDir);
122
- return withLock(totemDir, () => runSyncInner(config, options), (msg) => log(msg));
191
+ return withLock(totemDir, (lock) => runSyncInner(config, options, lock), (msg) => log(msg), options.lockOptions);
192
+ }
193
+ /**
194
+ * #2564: the checkpoint invariant stands on mutual exclusion. Once the
195
+ * heartbeat observed the lock stolen, another sync may be mutating the store
196
+ * or the checkpoint under its own epoch — abort loudly before writing
197
+ * anything more. The marker stays on disk, so the next sync resumes this
198
+ * epoch (ADR-115: a mutating degraded path fails loud and preserves state).
199
+ */
200
+ function assertLockHeld(lock) {
201
+ if (lock?.isLost() === true) {
202
+ throw new TotemError('SYNC_FAILED', 'Sync lock was lost mid-run — another process took it over.', 'The interrupted re-index resumes from its checkpoint on the next totem sync.');
203
+ }
123
204
  }
124
205
  /**
125
206
  * Normalize a path separator to forward slashes for orphan COMPARISON only.
@@ -169,21 +250,44 @@ export function computeNewlyEligiblePaths(liveRelativePaths, indexedRawPaths) {
169
250
  const indexed = new Set(indexedRawPaths.map(normalizeRel));
170
251
  return liveRelativePaths.filter((rel) => !indexed.has(normalizeRel(rel)));
171
252
  }
172
- async function runSyncInner(config, options) {
253
+ async function runSyncInner(config, options, lock) {
173
254
  const { projectRoot, onProgress } = options;
174
255
  let incremental = options.incremental;
175
256
  const log = onProgress ?? (() => { });
176
257
  // 0. Capture HEAD SHA early — before any async work that might race with new commits
177
258
  const headSha = getHeadSha(projectRoot, log);
178
- // 1. Create embedder
259
+ // 1. Create embedder (or take the injected one — tests / embedding hosts).
260
+ // `log` is threaded through so a LazyEmbedder Ollama fallback is AUDIBLE —
261
+ // a silent vector-space switch mid-sync is sensor degradation (#2562).
179
262
  const embedding = requireEmbedding(config);
180
263
  log('Initializing embedding provider...');
181
- const embedder = createEmbedder(embedding);
264
+ const embedder = options.embedder ?? createEmbedder(embedding, log);
265
+ // Resume-compatibility fingerprint (#2562): a checkpointed epoch may only
266
+ // continue under the embedder configuration that started it — vectors from
267
+ // two configurations must never mix in one store. Mirrors writeIndexMeta.
268
+ const embedderFingerprint = {
269
+ provider: embedding.provider,
270
+ model: embedding.model ?? 'default',
271
+ dimensions: embedder.dimensions,
272
+ };
182
273
  // 2. Connect to store
183
274
  const storePath = path.join(projectRoot, config.lanceDir);
184
275
  const store = new LanceStore(storePath, embedder, { absolutePathRoot: projectRoot });
185
276
  await store.connect();
186
- // 2b. Auto-heal: force full sync when incremental is requested but DB is empty
277
+ const totemDir = path.join(projectRoot, config.totemDir);
278
+ // 2b (#2562). A live checkpoint marks an unfinished full re-index. It takes
279
+ // precedence over the requested mode — the partial store must complete
280
+ // before any incremental diff can be trusted again — and it subsumes the
281
+ // empty-store heal below (an interrupted full that never flushed).
282
+ let resumeFrom = null;
283
+ if (hasFullSyncCheckpoint(totemDir)) {
284
+ incremental = false;
285
+ resumeFrom = readFullSyncCheckpoint(totemDir, log);
286
+ log(resumeFrom
287
+ ? `Previous full re-index did not complete — resuming it (${resumeFrom.completedFiles.length} file(s) checkpointed).`
288
+ : 'Previous full re-index did not complete — restarting it from zero.');
289
+ }
290
+ // 2c. Auto-heal: force full sync when incremental is requested but DB is empty
187
291
  if (incremental && (await store.isEmpty())) {
188
292
  log('Empty database detected. Forcing full sync...');
189
293
  incremental = false;
@@ -191,7 +295,6 @@ async function runSyncInner(config, options) {
191
295
  // 3. Resolve files to process. Index exclusion unions both keys:
192
296
  // `ignorePatterns` (legacy dual-scope) + `indexIgnorePatterns` (index-only,
193
297
  // mmnto-ai/totem#1748) — only the former also gates lint/shield scope.
194
- const totemDir = path.join(projectRoot, config.totemDir);
195
298
  const exclusionPatterns = [...config.ignorePatterns, ...config.indexIgnorePatterns];
196
299
  const allFiles = resolveFiles(config.targets, projectRoot, exclusionPatterns, log);
197
300
  // Order-normalized hash of the effective exclusion set — persisted below and
@@ -199,6 +302,30 @@ async function runSyncInner(config, options) {
199
302
  const indexExclusionHash = hashIndexExclusionSet(exclusionPatterns);
200
303
  let filesToProcess;
201
304
  let deletedPaths = [];
305
+ // #2562: active-epoch checkpoint (full mode only) — written before the store
306
+ // is destroyed, appended after each successful flush, deleted on success.
307
+ let checkpoint = null;
308
+ let resumedWithoutReset = false;
309
+ const freshCheckpoint = () => ({
310
+ startedHeadSha: headSha,
311
+ startedAt: Date.now(),
312
+ indexExclusionHash,
313
+ embedder: embedderFingerprint,
314
+ completedFiles: [],
315
+ });
316
+ // The dirty marker MUST hit disk before the store is destroyed: a marker
317
+ // write failure aborts loudly with the store intact, so no window exists in
318
+ // which a reset store is unmarked (#2562).
319
+ async function beginFullSync(cp) {
320
+ // #2564 (leg MAJOR-3): never overwrite the marker or reset the store
321
+ // after this hold's exclusion is known-lost — both would destroy the
322
+ // thief's epoch, the exact mutation #2564 names.
323
+ assertLockHeld(lock);
324
+ writeFullSyncCheckpoint(totemDir, cp);
325
+ checkpoint = cp;
326
+ log('Full sync: resetting index...');
327
+ await store.reset();
328
+ }
202
329
  if (incremental) {
203
330
  // Persisted sync state carries both the diff baseline (lastSyncSha) and the
204
331
  // exclusion-set hash used for removal reconciliation (mmnto-ai/totem#2366).
@@ -212,7 +339,7 @@ async function runSyncInner(config, options) {
212
339
  const changedPaths = options.changedFiles ?? getChangedFiles(projectRoot, sinceRef, log);
213
340
  if (changedPaths === null) {
214
341
  log('Git diff failed, falling back to full sync...');
215
- await store.reset();
342
+ await beginFullSync(freshCheckpoint());
216
343
  filesToProcess = allFiles;
217
344
  log(`Full sync (fallback): ${filesToProcess.length} files to process`);
218
345
  }
@@ -261,9 +388,129 @@ async function runSyncInner(config, options) {
261
388
  ` (of ${allFiles.length} total)`);
262
389
  }
263
390
  }
391
+ else if (resumeFrom) {
392
+ // #2562 resume: NO reset — the interrupted epoch continues. Already-done
393
+ // derives from FOUR signals, not the checkpoint alone:
394
+ // 1. checkpointed (the epoch flushed it);
395
+ // 2. ∩ live (still resolved by the current target set);
396
+ // 3. ∩ actually-in-the-store — the store is ground truth: a store
397
+ // healed/nuked under a live checkpoint must not be trusted from
398
+ // paper (falsification round 1, MAJOR 1);
399
+ // 4. − moved-since-epoch: anything in git's tracked diff against
400
+ // startedHeadSha, PLUS anything whose mtime postdates the epoch
401
+ // start. The mtime arm applies to EVERY file, not only untracked
402
+ // ones (falsification round 2, F3: submodule and assume-unchanged
403
+ // files appear in neither git list, so an untracked-only mtime arm
404
+ // silently kept them stale) — a false-positive eviction is just a
405
+ // harmless re-embed. Untracked files are deliberately NOT evicted by
406
+ // git-list membership (it is permanent — round 1, MAJOR 2), and a
407
+ // non-git epoch (null startedHeadSha) has an empty tracked set, so
408
+ // the mtime arm carries it alone (MAJOR 4).
409
+ // The epoch diff never derives from options.changedFiles — a caller's
410
+ // diff window says nothing about what the crashed epoch covered.
411
+ const detailed = resumeFrom.startedHeadSha
412
+ ? getChangedFilesDetailed(projectRoot, resumeFrom.startedHeadSha, log)
413
+ : { tracked: [], untracked: [] };
414
+ if (detailed === null) {
415
+ log('Cannot diff against the interrupted epoch — restarting the full re-index from zero.');
416
+ await beginFullSync(freshCheckpoint());
417
+ filesToProcess = allFiles;
418
+ log(`Full sync: ${filesToProcess.length} files to process`);
419
+ }
420
+ else {
421
+ let indexedRaw = null;
422
+ try {
423
+ indexedRaw = await store.getDistinctPaths();
424
+ // totem-context: intentional warn+degrade on a getDistinctPaths failure (mmnto-ai/totem#2562, falsification round 2 F7 + round 3 MINOR 9a) — the completed set collapses to EMPTY below (every file re-embeds via delete-first, same cost as a reset-restart) but the table is NOT destroyed over a possibly-transient read failure, and the checkpoint's paper progress is RETAINED untrusted so a second crash does not erase a prior epoch's flushed work.
425
+ }
426
+ catch (err) {
427
+ log(`Warning: cannot verify the checkpoint against the store (getDistinctPaths failed: ${err instanceof Error ? err.message : String(err)}) — re-embedding everything without trusting the checkpoint.`);
428
+ }
429
+ const epochStart = resumeFrom.startedAt;
430
+ const byRel = new Map(allFiles.map((f) => [normalizeRel(f.relativePath), f]));
431
+ const tracked = new Set(detailed.tracked.map(normalizeRel));
432
+ const movedSinceEpoch = (rel) => {
433
+ if (tracked.has(rel))
434
+ return true;
435
+ const file = byRel.get(rel);
436
+ if (!file)
437
+ return true;
438
+ try {
439
+ return fs.statSync(file.absolutePath).mtimeMs > epochStart;
440
+ // totem-context: intentional treat-as-moved on a stat failure (mmnto-ai/totem#2562) — the file re-embeds (idempotent via delete-first) or the read site skips a vanished file loudly.
441
+ }
442
+ catch {
443
+ return true;
444
+ }
445
+ };
446
+ const indexed = indexedRaw === null ? null : new Set(indexedRaw.map(normalizeRel));
447
+ const completed = new Set(indexed === null
448
+ ? []
449
+ : resumeFrom.completedFiles
450
+ .map(normalizeRel)
451
+ .filter((rel) => byRel.has(rel) && indexed.has(rel) && !movedSinceEpoch(rel)));
452
+ filesToProcess = allFiles.filter((f) => !completed.has(normalizeRel(f.relativePath)));
453
+ // EFFECTIVE-vs-effective identity gate (falsification rounds 2–4). The
454
+ // epoch may only continue under the embedder identity that will
455
+ // ACTUALLY serve this run's embeds — config-vs-stamped is wrong in both
456
+ // directions (a silent fallback would mix vector spaces at the first
457
+ // insert; a persistent fallback would restart-loop forever). The
458
+ // exemption is RESOLUTION FAILURE with zero work remaining (round 3
459
+ // MINOR 10: an epoch that merely needs its marker cleared must not
460
+ // wedge behind a missing embedder) — NOT zero work itself: a resolvable
461
+ // mismatch must restart even with nothing left, or clearing the marker
462
+ // would rewrite index-meta to the new identity and launder the
463
+ // DATABASE_MISMATCH evidence the next incremental needs (round 4,
464
+ // MAJOR 1 — probed: dimension change + zero-work resume ⇒ silent mixed
465
+ // store).
466
+ let identityOk = true;
467
+ let effectiveNow = null;
468
+ try {
469
+ effectiveNow = (await embedder.resolveEffective?.()) ?? embedderFingerprint;
470
+ }
471
+ catch (err) {
472
+ if (filesToProcess.length > 0)
473
+ throw err; // work remains ⇒ fail loud, state intact
474
+ log(`Nothing left to embed and no embedder resolved (${err instanceof Error ? err.message : String(err)}) — clearing the marker unverified.`);
475
+ }
476
+ if (effectiveNow !== null) {
477
+ const fp = resumeFrom.embedder;
478
+ if (fp.provider !== effectiveNow.provider ||
479
+ fp.model !== effectiveNow.model ||
480
+ fp.dimensions !== effectiveNow.dimensions) {
481
+ log(`The embedder serving this run (${effectiveNow.provider}/${effectiveNow.model}) differs from the interrupted epoch's (${fp.provider}/${fp.model}) — its progress is unusable; restarting from zero.`);
482
+ identityOk = false;
483
+ }
484
+ }
485
+ if (!identityOk) {
486
+ await beginFullSync(freshCheckpoint());
487
+ filesToProcess = allFiles;
488
+ log(`Full sync: ${filesToProcess.length} files to process`);
489
+ }
490
+ else {
491
+ // Carry forward the verified entries, re-keyed to the current run's
492
+ // resolved paths — EXCEPT when the store was unreadable: then the
493
+ // paper progress is retained untrusted (round 3, MINOR 9a) so a
494
+ // second crash does not erase a prior epoch's flushed work; the next
495
+ // resume re-verifies it against a hopefully-readable store.
496
+ // startedHeadSha stays the ORIGINAL epoch SHA so every later resume
497
+ // re-diffs the full window (superset-safe).
498
+ const carried = indexed === null
499
+ ? [...resumeFrom.completedFiles]
500
+ : allFiles.map((f) => f.relativePath).filter((rel) => completed.has(normalizeRel(rel)));
501
+ checkpoint = { ...resumeFrom, indexExclusionHash, completedFiles: carried };
502
+ // #2564 (leg MINOR-R2): same class as the beginFullSync probe — never
503
+ // overwrite a marker that may belong to a thief's epoch.
504
+ assertLockHeld(lock);
505
+ writeFullSyncCheckpoint(totemDir, checkpoint);
506
+ resumedWithoutReset = true;
507
+ log(`Resuming full re-index: ${filesToProcess.length} file(s) remaining of ${allFiles.length} ` +
508
+ `(${completed.size} verified already embedded). Delete ${config.totemDir}/${FULL_SYNC_CHECKPOINT_FILE} to restart from scratch.`);
509
+ }
510
+ }
511
+ }
264
512
  else {
265
- log('Full sync: resetting index...');
266
- await store.reset();
513
+ await beginFullSync(freshCheckpoint());
267
514
  filesToProcess = allFiles;
268
515
  log(`Full sync: ${filesToProcess.length} files to process`);
269
516
  }
@@ -288,28 +535,86 @@ async function runSyncInner(config, options) {
288
535
  // 4. Chunk files and stream to LanceDB in batches (bounded memory)
289
536
  let totalChunks = 0;
290
537
  let buffer = [];
538
+ let pendingFiles = [];
291
539
  async function flushBuffer() {
540
+ // Probe BEFORE the empty-buffer return so the final flush always checks
541
+ // mutual exclusion, even when nothing is left to write (#2564).
542
+ assertLockHeld(lock);
292
543
  if (buffer.length === 0)
293
544
  return;
294
545
  await store.insert(buffer);
546
+ // Re-probe after the insert: the embed inside it is exactly the
547
+ // multi-minute paced/throttled window a theft happens in (#2564), and
548
+ // the next entry probe may be a whole batch away.
549
+ assertLockHeld(lock);
295
550
  totalChunks += buffer.length;
296
551
  log(` Embedded ${totalChunks} chunks so far`);
297
552
  buffer = [];
553
+ // #2562: chunks buffer at whole-file boundaries and store.insert embeds
554
+ // before any row lands, so a successful flush means every pending file is
555
+ // complete in the store — checkpoint them. An append failure is
556
+ // survivable: the file re-embeds on resume via the delete-first path.
557
+ const cp = checkpoint;
558
+ if (cp && pendingFiles.length > 0) {
559
+ cp.completedFiles.push(...pendingFiles);
560
+ // Persist the EFFECTIVE embedder identity once known (falsification
561
+ // round 1, MAJOR 3): a LazyEmbedder that silently fell back to Ollama
562
+ // must not leave a checkpoint fingerprinted as the configured provider,
563
+ // or the next resume would mix vector spaces across the epoch.
564
+ const effective = embedder.describeEffective?.();
565
+ if (effective)
566
+ cp.embedder = effective;
567
+ try {
568
+ writeFullSyncCheckpoint(totemDir, cp);
569
+ // totem-context: intentional warn+continue on a checkpoint-append failure (mmnto-ai/totem#2562) — the flushed chunks are safe in the store; worst case the file re-embeds on resume via the delete-first path.
570
+ }
571
+ catch (err) {
572
+ log(` Warning: failed to update full-sync checkpoint: ${err instanceof Error ? err.message : String(err)}`);
573
+ }
574
+ }
575
+ pendingFiles = [];
298
576
  }
299
577
  for (const file of filesToProcess) {
300
578
  const safeRel = sanitizeForTerminal(file.relativePath);
301
579
  log(`Chunking ${safeRel}...`);
580
+ // A file whose CURRENT state legitimately yields no rows (emptied of
581
+ // chunkable content, or swapped to a symlink the guard refuses) must
582
+ // still purge its OLD rows when re-processing in place — the baseline
583
+ // advances past the change at the end of this run, so no later
584
+ // incremental diff revisits it and the stale rows would be searchable
585
+ // forever (#2569 Greptile round: stale-rows-on-skip). The transient
586
+ // read-error skip below deliberately does NOT purge: deleting on a
587
+ // maybe-transient failure would LOSE good rows, worse than stale ones.
588
+ const purgeStaleRows = async () => {
589
+ if (incremental || resumedWithoutReset) {
590
+ await store.deleteByFile(file.relativePath);
591
+ }
592
+ };
593
+ // Symlink guard at the READ site (mmnto-ai/totem#2354, #2356 review):
594
+ // resolveFiles skips symlinks at discovery, but this read happens later,
595
+ // so a path swapped to a symlink after resolution would still be followed
596
+ // by readFileSync. Re-check here and skip — closes the discovery→read
597
+ // TOCTOU gap. The purge runs OUTSIDE the read-error catches (#2569 CR
598
+ // round 2): caught there, a purge failure would be mislabeled a read
599
+ // error and silently downgraded to a skip — permanent staleness. Outside
600
+ // them it fails loud and CONVERGES: the marker/stale baseline makes the
601
+ // next run re-evict the file and retry the delete.
602
+ let isSymlink;
603
+ try {
604
+ isSymlink = fs.lstatSync(file.absolutePath).isSymbolicLink();
605
+ // totem-context: intentional skip — a per-file stat failure (vanished/raced file, permission) logs and skips just that file so sync continues over the rest; aborting the whole sync over one unreadable file would be the drift, not the skip.
606
+ }
607
+ catch (err) {
608
+ log(` Skipping (read error: ${sanitizeForTerminal(err instanceof Error ? err.message : String(err))}): ${safeRel}`);
609
+ continue;
610
+ }
611
+ if (isSymlink) {
612
+ log(` Skipping symlink (not indexed): ${safeRel}`);
613
+ await purgeStaleRows();
614
+ continue;
615
+ }
302
616
  let content;
303
617
  try {
304
- // Symlink guard at the READ site (mmnto-ai/totem#2354, #2356 review):
305
- // resolveFiles skips symlinks at discovery, but this read happens later,
306
- // so a path swapped to a symlink after resolution would still be followed
307
- // by readFileSync. Re-check here and skip — closes the discovery→read
308
- // TOCTOU gap.
309
- if (fs.lstatSync(file.absolutePath).isSymbolicLink()) {
310
- log(` Skipping symlink (not indexed): ${safeRel}`);
311
- continue;
312
- }
313
618
  content = fs.readFileSync(file.absolutePath, 'utf-8');
314
619
  // totem-context: intentional skip — a per-file read failure (vanished/raced file, permission, decode) logs and skips just that file so sync continues over the rest; aborting the whole sync over one unreadable file would be the drift, not the skip.
315
620
  }
@@ -321,12 +626,14 @@ async function runSyncInner(config, options) {
321
626
  const chunks = chunker.chunk(content, file.relativePath, file.target.type);
322
627
  if (chunks.length === 0) {
323
628
  log(` No chunks extracted from ${file.relativePath}`);
629
+ await purgeStaleRows();
324
630
  continue;
325
631
  }
326
- // For incremental: delete old chunks for this file before inserting new ones
327
- if (incremental) {
328
- await store.deleteByFile(file.relativePath);
329
- }
632
+ // Delete old chunks for this file before inserting new ones — incremental
633
+ // re-embeds in place, and a #2562 resume (no reset) can hold this file's
634
+ // chunks already (changed-since-epoch, or a flush whose checkpoint append
635
+ // failed). Idempotent either way.
636
+ await purgeStaleRows();
330
637
  // Sanitize chunk content before embedding (adversarial ingestion scrubbing)
331
638
  // Deduplicate warnings per file to avoid log spam on files with widespread issues
332
639
  const warnedMessages = new Set();
@@ -346,6 +653,7 @@ async function runSyncInner(config, options) {
346
653
  chunk.contextPrefix = sanitizeForIngestion(chunk.contextPrefix, sanitizeOpts);
347
654
  }
348
655
  buffer.push(...chunks);
656
+ pendingFiles.push(file.relativePath);
349
657
  log(` ${chunks.length} chunks from ${file.relativePath}`);
350
658
  // Flush when buffer reaches batch size to keep memory bounded
351
659
  if (buffer.length >= EMBED_BATCH_SIZE) {
@@ -369,10 +677,28 @@ async function runSyncInner(config, options) {
369
677
  }
370
678
  // Persist sync state so the next incremental sync knows where to diff from and
371
679
  // can detect an ignore-pattern change (including a removal) via the hash (#2366).
680
+ // #2564: not under a lost lock — a completion-claiming baseline must not land
681
+ // while another process's epoch owns the store.
682
+ assertLockHeld(lock);
372
683
  if (headSha) {
373
684
  writeSyncState(totemDir, { lastSyncSha: headSha, timestamp: Date.now(), indexExclusionHash });
374
685
  }
375
- // Persist index metadata for dimension mismatch detection
686
+ // #2562: the epoch is complete clear the dirty marker only AFTER the fresh
687
+ // baseline is on disk. A crash between the two writes leaves marker + fresh
688
+ // baseline, which the next run resumes as a near-noop; the reverse order
689
+ // would leave a clean-claiming baseline over a still-marked store.
690
+ if (checkpoint) {
691
+ // #2564: after a theft, the on-disk marker may already belong to the
692
+ // thief's epoch — deleting it would erase THAT run's crash safety.
693
+ assertLockHeld(lock);
694
+ deleteFullSyncCheckpoint(totemDir, log);
695
+ }
696
+ // Persist index metadata for dimension mismatch detection.
697
+ // #2564 (leg MINOR-R3): index-meta is DATABASE_MISMATCH evidence, not a
698
+ // freely-regenerable cache — writing it under a thief running a different
699
+ // embedder identity would launder the very signal the next incremental
700
+ // needs (the #2562 round-4 reasoning).
701
+ assertLockHeld(lock);
376
702
  writeIndexMeta(totemDir, {
377
703
  provider: embedding.provider,
378
704
  model: embedding.model ?? 'default',
@@ -386,10 +712,7 @@ async function runSyncInner(config, options) {
386
712
  const writtenAt = new Date();
387
713
  const docs = await store.manifestDocuments(writtenAt);
388
714
  const manifest = buildIndexManifest({ documents: docs, headSha, writtenAt });
389
- const manifestPath = path.join(totemDir, 'index-manifest.json');
390
- const tmpManifestPath = manifestPath + '.tmp';
391
- fs.writeFileSync(tmpManifestPath, JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
392
- fs.renameSync(tmpManifestPath, manifestPath);
715
+ writeJsonAtomic(path.join(totemDir, 'index-manifest.json'), manifest);
393
716
  }
394
717
  catch (err) {
395
718
  const detail = err instanceof Error ? err.message : typeof err === 'string' ? err : 'unknown error';
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/ingest/pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/ingest/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,UAAU,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAChD,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAChD,MAAM,yBAAyB,GAAG,iCAAiC,CAAC;AASpE,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAc,CAAC;QAC3E,IACE,MAAM;YACN,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YACnC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;YAChC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YACrC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EACnC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,IAAe;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,MAAmB;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,iCAAiC;IAEzD,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,2CAA2C;IAE9D,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,IAAI,kBAAkB,CAC1B,wBAAwB,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,UAAU,0BAA0B,SAAS,CAAC,QAAQ,GAAG,EACxG,+CAA+C,EAC/C,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,IAAI,SAAS,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;QACrE,MAAM,IAAI,kBAAkB,CAC1B,wBAAwB,IAAI,CAAC,UAAU,sCAAsC,SAAS,CAAC,UAAU,IAAI,EACrG,+CAA+C,EAC/C,mBAAmB,CACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,UAAkC;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QAC5C,IACE,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;YACtC,MAAM,CAAC,WAAW;YAClB,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EACpC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,UAAU,EAAE,CAAC,kDAAkD,SAAS,GAAG,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,+CAA+C;QAC/C,IAAI,GAAG,YAAY,KAAK,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,UAAU,EAAE,CACV,uCAAuC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC1F,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,QAAgB,EAAE,KAAc;IACvD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,yEAAyE;IACzE,wEAAwE;IACxE,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACjD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1E,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,KAAgB;IACxD,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAC7B,QAAgB,EAChB,UAAkC;IAElC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAuB,CAAC;QAClF,IACE,MAAM;YACN,CAAC,MAAM,CAAC,cAAc,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,CAAC;YAC7E,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YACpC,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ;YAC7C,OAAO,MAAM,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ;YAC7C,OAAO,MAAM,CAAC,QAAQ,EAAE,KAAK,KAAK,QAAQ;YAC1C,OAAO,MAAM,CAAC,QAAQ,EAAE,UAAU,KAAK,QAAQ;YAC/C,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;YACpC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EACzD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,UAAU,EAAE,CAAC,8CAA8C,MAAM,2BAA2B,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC;QACZ,8NAA8N;IAChO,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,EAAE,CACV,iDAAiD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpG,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB,EAAE,UAA8B;IAC/E,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,EAAE,UAAU,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,QAAgB,EAAE,UAAkC;IACpF,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,6NAA6N;IAC/N,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,EAAE,CACV,mDAAmD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACtG,CAAC;IACJ,CAAC;AACH,CAAC;AA2CD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAIlC;IACC,MAAM,QAAQ,GAAkB;QAC9B,MAAM,EAAE,qBAAqB;QAC7B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;QACxC,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;IACF,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,QAAQ,CAAC,SAAS,GAAG,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAmB,EACnB,OAAoB;IAOpB,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC5C,MAAM,GAAG,GAAG,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEzD,OAAO,QAAQ,CACb,QAAQ,EACR,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAC7C,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EACjB,OAAO,CAAC,WAAW,CACpB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,IAA6B;IACnD,IAAI,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,aAAa,EACb,4DAA4D,EAC5D,8EAA8E,CAC/E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,eAAyB,EACzB,iBAA2B;IAE3B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1D,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAkB;IACtD,6EAA6E;IAC7E,sEAAsE;IACtE,OAAO,0BAA0B,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,iBAA2B,EAC3B,eAAyB;IAEzB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3D,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,MAAmB,EACnB,OAAoB,EACpB,IAAkB;IAOlB,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC5C,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACtC,MAAM,GAAG,GAAG,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAErC,qFAAqF;IACrF,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAE7C,2EAA2E;IAC3E,2EAA2E;IAC3E,uEAAuE;IACvE,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAEpE,0EAA0E;IAC1E,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,mBAAmB,GAAG;QAC1B,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,SAAS;QACnC,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;IAEF,sBAAsB;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;IACrF,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEzD,4EAA4E;IAC5E,uEAAuE;IACvE,yEAAyE;IACzE,mEAAmE;IACnE,IAAI,UAAU,GAA8B,IAAI,CAAC;IACjD,IAAI,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,WAAW,GAAG,KAAK,CAAC;QACpB,UAAU,GAAG,sBAAsB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACnD,GAAG,CACD,UAAU;YACR,CAAC,CAAC,0DAA0D,UAAU,CAAC,cAAc,CAAC,MAAM,yBAAyB;YACrH,CAAC,CAAC,oEAAoE,CACzE,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,IAAI,WAAW,IAAI,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,+CAA+C,CAAC,CAAC;QACrD,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,iEAAiE;IACjE,4EAA4E;IAC5E,uEAAuE;IACvE,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACnF,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;IACpE,IAAI,cAA8B,CAAC;IACnC,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,6EAA6E;IAC7E,0EAA0E;IAC1E,IAAI,UAAU,GAA8B,IAAI,CAAC;IACjD,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAEhC,MAAM,eAAe,GAAG,GAAuB,EAAE,CAAC,CAAC;QACjD,cAAc,EAAE,OAAO;QACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,kBAAkB;QAClB,QAAQ,EAAE,mBAAmB;QAC7B,cAAc,EAAE,EAAE;KACnB,CAAC,CAAC;IAEH,yEAAyE;IACzE,4EAA4E;IAC5E,2CAA2C;IAC3C,KAAK,UAAU,aAAa,CAAC,EAAsB;QACjD,qEAAqE;QACrE,qEAAqE;QACrE,iDAAiD;QACjD,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,uBAAuB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,UAAU,GAAG,EAAE,CAAC;QAChB,GAAG,CAAC,+BAA+B,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,4EAA4E;QAC5E,4EAA4E;QAC5E,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAE/C,wEAAwE;QACxE,IAAI,QAAQ,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,SAAS,EAAE,CAAC;YACvC,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC;YACjC,GAAG,CAAC,8BAA8B,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,eAAe,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACzF,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,GAAG,CAAC,+CAA+C,CAAC,CAAC;YACrD,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;YACvC,cAAc,GAAG,QAAQ,CAAC;YAC1B,GAAG,CAAC,yBAAyB,cAAc,CAAC,MAAM,mBAAmB,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;YACzC,IAAI,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;YAEtC,4EAA4E;YAC5E,yEAAyE;YACzE,sEAAsE;YACtE,2EAA2E;YAC3E,+DAA+D;YAC/D,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAEzD,yEAAyE;gBACzE,iEAAiE;gBACjE,0EAA0E;gBAC1E,QAAQ;gBACR,YAAY,GAAG,kBAAkB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBAE9D,yEAAyE;gBACzE,oEAAoE;gBACpE,0EAA0E;gBAC1E,wEAAwE;gBACxE,oEAAoE;gBACpE,mEAAmE;gBACnE,wEAAwE;gBACxE,4CAA4C;gBAC5C,IAAI,SAAS,EAAE,kBAAkB,KAAK,kBAAkB,EAAE,CAAC;oBACzD,aAAa,GAAG,IAAI,GAAG,CAAC,yBAAyB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;gBACjF,CAAC;gBACD,8NAA8N;YAChO,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CACD,uEAAuE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC1H,CAAC;YACJ,CAAC;YAED,2EAA2E;YAC3E,yEAAyE;YACzE,sDAAsD;YACtD,cAAc,GAAG,QAAQ,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAC3E,CAAC;YAEF,2EAA2E;YAC3E,gFAAgF;YAChF,MAAM,eAAe,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAExF,GAAG,CACD,qBAAqB,cAAc,CAAC,MAAM,qBAAqB;gBAC7D,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,eAAe,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,QAAQ,QAAQ,CAAC,MAAM,SAAS,CACnC,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,yEAAyE;QACzE,uDAAuD;QACvD,4CAA4C;QAC5C,0DAA0D;QAC1D,oEAAoE;QACpE,qEAAqE;QACrE,+CAA+C;QAC/C,mEAAmE;QACnE,qEAAqE;QACrE,sEAAsE;QACtE,uEAAuE;QACvE,wEAAwE;QACxE,uEAAuE;QACvE,0EAA0E;QAC1E,uEAAuE;QACvE,wEAAwE;QACxE,iDAAiD;QACjD,sEAAsE;QACtE,iEAAiE;QACjE,MAAM,QAAQ,GAAsD,UAAU,CAAC,cAAc;YAC3F,CAAC,CAAC,uBAAuB,CAAC,WAAW,EAAE,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC;YACtE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAEnC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,GAAG,CAAC,qFAAqF,CAAC,CAAC;YAC3F,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;YACvC,cAAc,GAAG,QAAQ,CAAC;YAC1B,GAAG,CAAC,cAAc,cAAc,CAAC,MAAM,mBAAmB,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,IAAI,UAAU,GAAoB,IAAI,CAAC;YACvC,IAAI,CAAC;gBACH,UAAU,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBAC5C,8bAA8b;YAChc,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CACD,qFAAqF,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,8DAA8D,CACpM,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YAC5D,MAAM,eAAe,GAAG,CAAC,GAAW,EAAW,EAAE;gBAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAClC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,CAAC,IAAI;oBAAE,OAAO,IAAI,CAAC;gBACvB,IAAI,CAAC;oBACH,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,GAAG,UAAU,CAAC;oBAC3D,sLAAsL;gBACxL,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YACnF,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,OAAO,KAAK,IAAI;gBACd,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,UAAU,CAAC,cAAc;qBACtB,GAAG,CAAC,YAAY,CAAC;qBACjB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CACpF,CAAC;YACF,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEtF,uEAAuE;YACvE,gEAAgE;YAChE,wEAAwE;YACxE,qEAAqE;YACrE,iEAAiE;YACjE,oEAAoE;YACpE,mEAAmE;YACnE,wEAAwE;YACxE,uEAAuE;YACvE,+DAA+D;YAC/D,kEAAkE;YAClE,uEAAuE;YACvE,UAAU;YACV,IAAI,UAAU,GAAG,IAAI,CAAC;YACtB,IAAI,YAAY,GAAmE,IAAI,CAAC;YACxF,IAAI,CAAC;gBACH,YAAY,GAAG,CAAC,MAAM,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC;YAC9E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC;oBAAE,MAAM,GAAG,CAAC,CAAC,yCAAyC;gBACnF,GAAG,CACD,mDAAmD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,CACzI,CAAC;YACJ,CAAC;YACD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC1B,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC;gBAC/B,IACE,EAAE,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ;oBACrC,EAAE,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK;oBAC/B,EAAE,CAAC,UAAU,KAAK,YAAY,CAAC,UAAU,EACzC,CAAC;oBACD,GAAG,CACD,kCAAkC,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,KAAK,2CAA2C,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,KAAK,qDAAqD,CACrM,CAAC;oBACF,UAAU,GAAG,KAAK,CAAC;gBACrB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;gBACvC,cAAc,GAAG,QAAQ,CAAC;gBAC1B,GAAG,CAAC,cAAc,cAAc,CAAC,MAAM,mBAAmB,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,oEAAoE;gBACpE,kEAAkE;gBAClE,gEAAgE;gBAChE,qEAAqE;gBACrE,4DAA4D;gBAC5D,oEAAoE;gBACpE,4CAA4C;gBAC5C,MAAM,OAAO,GACX,OAAO,KAAK,IAAI;oBACd,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,cAAc,CAAC;oBAChC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC5F,UAAU,GAAG,EAAE,GAAG,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;gBAC5E,sEAAsE;gBACtE,yDAAyD;gBACzD,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,uBAAuB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAC9C,mBAAmB,GAAG,IAAI,CAAC;gBAC3B,GAAG,CACD,2BAA2B,cAAc,CAAC,MAAM,yBAAyB,QAAQ,CAAC,MAAM,GAAG;oBACzF,IAAI,SAAS,CAAC,IAAI,uCAAuC,MAAM,CAAC,QAAQ,IAAI,yBAAyB,2BAA2B,CACnI,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;QACvC,cAAc,GAAG,QAAQ,CAAC;QAC1B,GAAG,CAAC,cAAc,cAAc,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAC9D,CAAC;IAED,+EAA+E;IAC/E,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACtC,aAAa,EAAE,CAAC;YAChB,GAAG,CAAC,sCAAsC,WAAW,EAAE,CAAC,CAAC;YACzD,0EAA0E;YAC1E,+EAA+E;YAC/E,oEAAoE;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CACD,8BAA8B,WAAW,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACjG,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,UAAU,aAAa,mCAAmC,CAAC,CAAC;IAClE,CAAC;IAED,mEAAmE;IACnE,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,MAAM,GAAY,EAAE,CAAC;IACzB,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,KAAK,UAAU,WAAW;QACxB,wEAAwE;QACxE,gEAAgE;QAChE,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,gEAAgE;QAChE,sEAAsE;QACtE,kDAAkD;QAClD,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC;QAC7B,GAAG,CAAC,cAAc,WAAW,gBAAgB,CAAC,CAAC;QAC/C,MAAM,GAAG,EAAE,CAAC;QACZ,wEAAwE;QACxE,0EAA0E;QAC1E,gEAAgE;QAChE,sEAAsE;QACtE,MAAM,EAAE,GAAG,UAAU,CAAC;QACtB,IAAI,EAAE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YACxC,oEAAoE;YACpE,sEAAsE;YACtE,wEAAwE;YACxE,+DAA+D;YAC/D,MAAM,SAAS,GAAG,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACjD,IAAI,SAAS;gBAAE,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC;YACvC,IAAI,CAAC;gBACH,uBAAuB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACtC,+MAA+M;YACjN,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CACD,qDAAqD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxG,CAAC;YACJ,CAAC;QACH,CAAC;QACD,YAAY,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,GAAG,CAAC,YAAY,OAAO,KAAK,CAAC,CAAC;QAE9B,qEAAqE;QACrE,qEAAqE;QACrE,sEAAsE;QACtE,+DAA+D;QAC/D,sEAAsE;QACtE,oEAAoE;QACpE,mEAAmE;QACnE,uEAAuE;QACvE,MAAM,cAAc,GAAG,KAAK,IAAmB,EAAE;YAC/C,IAAI,WAAW,IAAI,mBAAmB,EAAE,CAAC;gBACvC,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC;QAEF,sEAAsE;QACtE,yEAAyE;QACzE,0EAA0E;QAC1E,sEAAsE;QACtE,sEAAsE;QACtE,qEAAqE;QACrE,yEAAyE;QACzE,wEAAwE;QACxE,mDAAmD;QACnD,IAAI,SAAkB,CAAC;QACvB,IAAI,CAAC;YACH,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,CAAC;YAC7D,gPAAgP;QAClP,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CACD,2BAA2B,mBAAmB,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,OAAO,EAAE,CAChH,CAAC;YACF,SAAS;QACX,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,GAAG,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAC;YACpD,MAAM,cAAc,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QAED,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACtD,wPAAwP;QAC1P,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CACD,2BAA2B,mBAAmB,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,OAAO,EAAE,CAChH,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,8BAA8B,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YACvD,MAAM,cAAc,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QAED,0EAA0E;QAC1E,yEAAyE;QACzE,0EAA0E;QAC1E,kCAAkC;QAClC,MAAM,cAAc,EAAE,CAAC;QAEvB,4EAA4E;QAC5E,kFAAkF;QAClF,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;YACjC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACxB,GAAG,CAAC,GAAG,CAAC,CAAC;YACX,CAAC;QACH,CAAC,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,YAAY,GAAG;gBACnB,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,QAAQ,EAAE,IAAI,CAAC,YAAY;gBAC3B,MAAM,EAAE,UAAU;aACnB,CAAC;YACF,KAAK,CAAC,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAClE,KAAK,CAAC,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACvB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,gBAAgB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAE3D,8DAA8D;QAC9D,IAAI,MAAM,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;YACtC,MAAM,WAAW,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,EAAE,CAAC;IAEpB,GAAG,CAAC,kBAAkB,WAAW,gBAAgB,cAAc,CAAC,MAAM,QAAQ,CAAC,CAAC;IAEhF,8EAA8E;IAC9E,2EAA2E;IAC3E,oEAAoE;IACpE,4EAA4E;IAC5E,8EAA8E;IAC9E,IAAI,WAAW,GAAG,aAAa,GAAG,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC/C,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;QAC7B,GAAG,CACD,KAAK,CAAC,aAAa;YACjB,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,yDAAyD,CAC9D,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,kFAAkF;IAClF,8EAA8E;IAC9E,gDAAgD;IAChD,cAAc,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,OAAO,EAAE,CAAC;QACZ,cAAc,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,yEAAyE;IACzE,mEAAmE;IACnE,IAAI,UAAU,EAAE,CAAC;QACf,qEAAqE;QACrE,mEAAmE;QACnE,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,wBAAwB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,2DAA2D;IAC3D,wEAAwE;IACxE,0EAA0E;IAC1E,uEAAuE;IACvE,uCAAuC;IACvC,cAAc,CAAC,IAAI,CAAC,CAAC;IACrB,cAAc,CAAC,QAAQ,EAAE;QACvB,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,SAAS;QACnC,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACnC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,IAAI,CAAC;QACH,oFAAoF;QACpF,0EAA0E;QAC1E,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7E,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GACV,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;QACvF,GAAG,CAAC,iDAAiD,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,6FAA6F;IAC7F,IAAI,iBAAiB,GAAG,WAAW,CAAC;IACpC,IAAI,CAAC;QACH,iBAAiB,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,+EAA+E;IACjF,CAAC;IAED,OAAO;QACL,eAAe,EAAE,WAAW;QAC5B,cAAc,EAAE,cAAc,CAAC,MAAM;QACrC,WAAW,EAAE,iBAAiB;QAC9B,aAAa;KACd,CAAC;AACJ,CAAC"}