@interocitor/core 0.0.0-beta.3 → 0.0.0-beta.4
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.
- package/README.md +445 -91
- package/dist/adapters/cloudflare.d.ts +8 -9
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +38 -12
- package/dist/adapters/google-drive.d.ts +1 -1
- package/dist/adapters/google-drive.js +1 -2
- package/dist/adapters/memory.d.ts +4 -1
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +13 -2
- package/dist/adapters/webdav.d.ts +5 -0
- package/dist/adapters/webdav.d.ts.map +1 -1
- package/dist/adapters/webdav.js +18 -1
- package/dist/core/codec.d.ts +1 -1
- package/dist/core/codec.d.ts.map +1 -1
- package/dist/core/codec.js +39 -3
- package/dist/core/compaction.d.ts +8 -1
- package/dist/core/compaction.d.ts.map +1 -1
- package/dist/core/compaction.js +13 -5
- package/dist/core/crdt.d.ts +6 -3
- package/dist/core/crdt.d.ts.map +1 -1
- package/dist/core/crdt.js +38 -60
- package/dist/core/errors.d.ts +47 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +61 -0
- package/dist/core/flush.d.ts +3 -3
- package/dist/core/flush.d.ts.map +1 -1
- package/dist/core/flush.js +64 -7
- package/dist/core/hlc.js +0 -1
- package/dist/core/ids.d.ts +49 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/ids.js +132 -0
- package/dist/core/internals.d.ts +10 -2
- package/dist/core/internals.d.ts.map +1 -1
- package/dist/core/internals.js +27 -9
- package/dist/core/manifest.d.ts +20 -5
- package/dist/core/manifest.d.ts.map +1 -1
- package/dist/core/manifest.js +65 -11
- package/dist/core/pull.d.ts +1 -1
- package/dist/core/pull.d.ts.map +1 -1
- package/dist/core/pull.js +21 -6
- package/dist/core/row-id.js +0 -1
- package/dist/core/schema-types.d.ts +22 -11
- package/dist/core/schema-types.d.ts.map +1 -1
- package/dist/core/schema-types.js +18 -9
- package/dist/core/schema-types.type-test.js +59 -5
- package/dist/core/sync-engine.d.ts +163 -12
- package/dist/core/sync-engine.d.ts.map +1 -1
- package/dist/core/sync-engine.js +1521 -219
- package/dist/core/table.d.ts +217 -17
- package/dist/core/table.d.ts.map +1 -1
- package/dist/core/table.js +376 -24
- package/dist/core/types.d.ts +382 -17
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +0 -1
- package/dist/crypto/encryption.d.ts.map +1 -1
- package/dist/crypto/encryption.js +6 -1
- package/dist/crypto/keys.js +0 -1
- package/dist/handshake/channel.js +0 -1
- package/dist/handshake/index.d.ts +5 -2
- package/dist/handshake/index.d.ts.map +1 -1
- package/dist/handshake/index.js +19 -2
- package/dist/handshake/qr.js +0 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -6
- package/dist/storage/credential-store.d.ts +25 -2
- package/dist/storage/credential-store.d.ts.map +1 -1
- package/dist/storage/credential-store.js +55 -8
- package/dist/storage/local-store.d.ts +4 -1
- package/dist/storage/local-store.d.ts.map +1 -1
- package/dist/storage/local-store.js +37 -21
- package/package.json +3 -3
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/adapters/google-drive.js.map +0 -1
- package/dist/adapters/memory.js.map +0 -1
- package/dist/adapters/webdav.js.map +0 -1
- package/dist/core/codec.js.map +0 -1
- package/dist/core/compaction.js.map +0 -1
- package/dist/core/crdt.js.map +0 -1
- package/dist/core/flush.js.map +0 -1
- package/dist/core/hlc.js.map +0 -1
- package/dist/core/internals.js.map +0 -1
- package/dist/core/manifest.js.map +0 -1
- package/dist/core/pull.js.map +0 -1
- package/dist/core/row-id.js.map +0 -1
- package/dist/core/schema-types.js.map +0 -1
- package/dist/core/schema-types.type-test.js.map +0 -1
- package/dist/core/sync-engine.js.map +0 -1
- package/dist/core/table.js.map +0 -1
- package/dist/core/types.js.map +0 -1
- package/dist/crypto/encryption.js.map +0 -1
- package/dist/crypto/keys.js.map +0 -1
- package/dist/handshake/channel.js.map +0 -1
- package/dist/handshake/index.js.map +0 -1
- package/dist/handshake/qr.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/storage/credential-store.js.map +0 -1
- package/dist/storage/local-store.js.map +0 -1
|
@@ -9,26 +9,43 @@
|
|
|
9
9
|
* Network is never required for reads or local writes.
|
|
10
10
|
* All data operations hit IndexedDB first; cloud sync is async.
|
|
11
11
|
*/
|
|
12
|
-
import type { StorageAdapter, SyncConfig, LocalStoreAdapter, Manifest, SyncEventListener, WhereClause } from './types.ts';
|
|
12
|
+
import type { StorageAdapter, SyncConfig, LocalStoreAdapter, Manifest, Row, SyncEventListener, WhereClause, SyncInitialState, QueryDescriptor, QueryExecutionOptions, QueryCacheSnapshot, ReadinessAwareQueryExecutor, RowDescriptor, RowCacheSnapshot } from './types.ts';
|
|
13
13
|
import { Table } from './table.ts';
|
|
14
14
|
/**
|
|
15
15
|
* Typed sync engine. `S` is your database shape — inferred automatically
|
|
16
16
|
* from `InferSchemaType<typeof schema>`. No default: either typed or `any`.
|
|
17
17
|
*
|
|
18
|
+
* Initialization is automatic — just construct and use. No `await engine.init()` needed.
|
|
19
|
+
*
|
|
18
20
|
* @example
|
|
19
21
|
* const schema = { version: 1, tables: { tasks: { fields: { title: types.string } } } }
|
|
20
22
|
* satisfies DatabaseSchemaDefinition;
|
|
21
23
|
*
|
|
22
24
|
* type DB = InferSchemaType<typeof schema>;
|
|
23
|
-
* const engine = new SyncEngine<DB>(adapter, { schema, remotePath: '/App', appName: 'App' });
|
|
24
25
|
*
|
|
25
|
-
* //
|
|
26
|
-
* const
|
|
26
|
+
* // Local-only (no adapter):
|
|
27
|
+
* const db = new Interocitor<DB>({ schema, dbName: 'myapp', appName: 'My App' });
|
|
28
|
+
* const tasks = await db.table('tasks').query(); // ready immediately
|
|
29
|
+
*
|
|
30
|
+
* // With remote sync:
|
|
31
|
+
* const db = new Interocitor<DB>(adapter, { schema, remotePath: '/App', appName: 'App' });
|
|
32
|
+
* await db.connect(); // authenticate + sync
|
|
27
33
|
*
|
|
28
|
-
*
|
|
29
|
-
* engine.table('other'); // TS error — 'other' is not keyof DB
|
|
34
|
+
* db.table('other'); // TS error — 'other' is not keyof DB
|
|
30
35
|
*/
|
|
31
|
-
export
|
|
36
|
+
export interface InterocitorInitContext<S extends Record<string, Record<string, unknown>>> extends ReadinessAwareQueryExecutor {
|
|
37
|
+
put<K extends keyof S & string>(table: K, rowId: string, columns: Partial<S[K]>, userId?: string): Promise<S[K]>;
|
|
38
|
+
delete<K extends keyof S & string>(table: K, rowId: string, userId?: string): Promise<void>;
|
|
39
|
+
query<K extends keyof S & string>(table: K): Promise<S[K][]>;
|
|
40
|
+
queryWhere<K extends keyof S & string>(table: K, clause: WhereClause): Promise<S[K][]>;
|
|
41
|
+
table<K extends keyof S & string>(name: K): Table<S[K]>;
|
|
42
|
+
on(listener: SyncEventListener): () => void;
|
|
43
|
+
getDeviceId(): string;
|
|
44
|
+
getMeshId(): string | undefined;
|
|
45
|
+
isEncrypted(): boolean;
|
|
46
|
+
}
|
|
47
|
+
export declare class Interocitor<S extends Record<string, Record<string, unknown>>> implements ReadinessAwareQueryExecutor {
|
|
48
|
+
readonly InitContext: InterocitorInitContext<S>;
|
|
32
49
|
private adapter;
|
|
33
50
|
private config;
|
|
34
51
|
private serverId;
|
|
@@ -44,12 +61,28 @@ export declare class SyncEngine<S extends Record<string, Record<string, unknown>
|
|
|
44
61
|
private knownTables;
|
|
45
62
|
private flushTimer;
|
|
46
63
|
private pendingCount;
|
|
64
|
+
private compactWarningEmitted;
|
|
65
|
+
private compactInFlight;
|
|
66
|
+
private compactScheduleVersion;
|
|
67
|
+
private compactCheckTimer;
|
|
68
|
+
private compactRunTimer;
|
|
69
|
+
private batchTimer;
|
|
70
|
+
private pendingBatch;
|
|
47
71
|
private pollTimer;
|
|
72
|
+
private unsubscribeRemoteInvalidations;
|
|
48
73
|
private initialized;
|
|
49
74
|
private connected;
|
|
75
|
+
private initPromise;
|
|
76
|
+
private connectPromise;
|
|
77
|
+
private readonly logLevel;
|
|
50
78
|
private listeners;
|
|
51
79
|
private readonly schema?;
|
|
52
80
|
private readonly credentialStore;
|
|
81
|
+
private readonly dbName;
|
|
82
|
+
private queryCache;
|
|
83
|
+
private queryCacheByTable;
|
|
84
|
+
private rowCache;
|
|
85
|
+
private rowCacheByTable;
|
|
53
86
|
/**
|
|
54
87
|
* Create a sync engine.
|
|
55
88
|
*
|
|
@@ -61,31 +94,107 @@ export declare class SyncEngine<S extends Record<string, Record<string, unknown>
|
|
|
61
94
|
* config — no manual type parameter needed:
|
|
62
95
|
*
|
|
63
96
|
* @example
|
|
64
|
-
* const engine = new
|
|
97
|
+
* const engine = new Interocitor(adapter, { schema, remotePath: '/App', appName: 'App' });
|
|
65
98
|
* const tasks = engine.table('tasks'); // Table<{ title: string; status: 'open' | 'done' }>
|
|
66
99
|
*/
|
|
67
100
|
constructor(config: SyncConfig<S>);
|
|
68
101
|
constructor(adapter: StorageAdapter | null, config: SyncConfig<S>);
|
|
102
|
+
private log;
|
|
103
|
+
private supportsRemoteInvalidations;
|
|
104
|
+
/** Await this before any storage operation. Returns the shared init promise. */
|
|
105
|
+
private ensureReady;
|
|
106
|
+
private putNow;
|
|
107
|
+
private deleteNow;
|
|
108
|
+
/**
|
|
109
|
+
* Append the op to the in-flight batch. If we are inside a `batch()` block,
|
|
110
|
+
* the op stays buffered until the block ends. Otherwise it joins an
|
|
111
|
+
* implicit window of `batchWindowMs`. Either way the result is one
|
|
112
|
+
* ChangeEntry per batch instead of one per write.
|
|
113
|
+
*/
|
|
114
|
+
private queueOpForBatchedFlush;
|
|
115
|
+
private queryNow;
|
|
116
|
+
private queryWhereNow;
|
|
117
|
+
/** Public readiness signal. Used by render-time consumers to decide
|
|
118
|
+
* between sync cache reads and awaiting a load. */
|
|
119
|
+
isReady(): boolean;
|
|
120
|
+
/** Stable cache key for a descriptor. Owned by core. */
|
|
121
|
+
getQueryCacheKey(descriptor: QueryDescriptor): string;
|
|
122
|
+
/** Sync cache snapshot. Never starts a load. Empty/pending/ready/error. */
|
|
123
|
+
readQueryCache(descriptor: QueryDescriptor): QueryCacheSnapshot;
|
|
124
|
+
/**
|
|
125
|
+
* Load rows through the cache.
|
|
126
|
+
*
|
|
127
|
+
* - If a snapshot exists and `bypassCache` is not set, dedupes to the
|
|
128
|
+
* in-flight promise (when pending) or starts a refresh that keeps the
|
|
129
|
+
* stale rows visible until it resolves.
|
|
130
|
+
* - When the engine is not yet ready, falls through `ensureReady()`; if
|
|
131
|
+
* `bypassCache` is set, never returns the cached rows.
|
|
132
|
+
*/
|
|
133
|
+
loadQueryRows(descriptor: QueryDescriptor, options?: QueryExecutionOptions): Promise<Row[]>;
|
|
134
|
+
private runQuery;
|
|
135
|
+
private indexCacheByTable;
|
|
136
|
+
/**
|
|
137
|
+
* Mark all cached queries against `table` as stale and refresh them in the
|
|
138
|
+
* background. Stale rows stay visible. Called from local mutations.
|
|
139
|
+
*/
|
|
140
|
+
private invalidateQueryCacheForTable;
|
|
141
|
+
/** Stable cache key for a row descriptor. Owned by core. */
|
|
142
|
+
getRowCacheKey(descriptor: RowDescriptor): string;
|
|
143
|
+
/** Sync row cache snapshot. Never starts a load. */
|
|
144
|
+
readRowCache(descriptor: RowDescriptor): RowCacheSnapshot;
|
|
145
|
+
/**
|
|
146
|
+
* Load a row through the cache. Same dedupe + stale-while-revalidate
|
|
147
|
+
* semantics as `loadQueryRows`.
|
|
148
|
+
*/
|
|
149
|
+
loadRow(descriptor: RowDescriptor, options?: QueryExecutionOptions): Promise<Row | undefined>;
|
|
150
|
+
private runRow;
|
|
151
|
+
private indexRowCacheByTable;
|
|
152
|
+
/**
|
|
153
|
+
* Refresh all cached rows for a table. Called from emit() alongside the
|
|
154
|
+
* query cache invalidation. Keeps prior row visible while in-flight.
|
|
155
|
+
*
|
|
156
|
+
* Table-wide invalidation is intentional: Interocitor targets rare-update
|
|
157
|
+
* workloads, not realtime state streams. The over-fetch on a write is a
|
|
158
|
+
* fixed-cost reload of cached rows for that one table — cheap, simple,
|
|
159
|
+
* and matches the query cache strategy. Finer-grained per-rowId
|
|
160
|
+
* invalidation can be added later without changing this contract.
|
|
161
|
+
*/
|
|
162
|
+
private invalidateRowCacheForTable;
|
|
163
|
+
private get initContext();
|
|
69
164
|
private requireAdapter;
|
|
165
|
+
private requireRemotePath;
|
|
70
166
|
private get codecState();
|
|
71
167
|
private get manifestContext();
|
|
72
168
|
private clearScheduledFlush;
|
|
169
|
+
private clearCompactTimers;
|
|
170
|
+
private jitterDelay;
|
|
73
171
|
private stopPolling;
|
|
74
172
|
private startPolling;
|
|
75
|
-
private
|
|
173
|
+
private stopRemoteInvalidations;
|
|
174
|
+
private startRemoteInvalidations;
|
|
76
175
|
private getRowHlc;
|
|
77
176
|
private rowToSyncOp;
|
|
78
|
-
private buildChangeEntry;
|
|
79
|
-
private rebuildOutboxFromLocalState;
|
|
80
177
|
private loadLocalState;
|
|
81
178
|
private ensureRowsCached;
|
|
82
179
|
private poisonRemote;
|
|
83
180
|
on(listener: SyncEventListener): () => void;
|
|
84
181
|
private emit;
|
|
85
182
|
private persistCredentials;
|
|
183
|
+
/**
|
|
184
|
+
* Compare the persisted credential record against the live meshId.
|
|
185
|
+
*
|
|
186
|
+
* Throws `MeshCredentialMismatchError` (and emits `credentials:meshMismatch`)
|
|
187
|
+
* when the credential store has a record under this `dbName` whose meshId
|
|
188
|
+
* disagrees with `manifest.meshId`. The remote is NOT poisoned — the local
|
|
189
|
+
* credential store has stale data from a previous mesh that shared the
|
|
190
|
+
* same dbName.
|
|
191
|
+
*/
|
|
192
|
+
private assertCredentialMeshParity;
|
|
86
193
|
private loadPersistedCredentials;
|
|
87
194
|
private clearPersistedCredentials;
|
|
88
195
|
private resolveEncryption;
|
|
196
|
+
private applyInitialState;
|
|
197
|
+
configureMesh(state: SyncInitialState): void;
|
|
89
198
|
/**
|
|
90
199
|
* Set the mesh encryption passphrase.
|
|
91
200
|
* Call before init() or between disconnect() and init().
|
|
@@ -126,25 +235,67 @@ export declare class SyncEngine<S extends Record<string, Record<string, unknown>
|
|
|
126
235
|
*/
|
|
127
236
|
setEncryptionKey(key: CryptoKey): void;
|
|
128
237
|
init(): Promise<void>;
|
|
238
|
+
private doInit;
|
|
129
239
|
/**
|
|
130
240
|
* Silent credential restore from the primary store only.
|
|
131
241
|
* Used during normal init(). No biometric prompt.
|
|
132
242
|
*/
|
|
133
243
|
private restoreCredentials;
|
|
134
244
|
connect(): Promise<void>;
|
|
245
|
+
private tryConnectFastPath;
|
|
246
|
+
private doConnect;
|
|
135
247
|
disconnect(): Promise<void>;
|
|
136
248
|
setRemoteStorage(adapter: StorageAdapter | null): Promise<void>;
|
|
137
249
|
setLocalStorage(local: LocalStoreAdapter): Promise<void>;
|
|
250
|
+
/**
|
|
251
|
+
* Load the mesh manifest, optionally short-circuiting via the in-memory
|
|
252
|
+
* cache.
|
|
253
|
+
*
|
|
254
|
+
* `reason` is a free-form caller tag used by `trace:manifest` events so
|
|
255
|
+
* developers can answer "why is my manifest being re-read every flush?".
|
|
256
|
+
*
|
|
257
|
+
* `force=true` bypasses the cache. Required after poison, after compaction
|
|
258
|
+
* advances generation, or whenever the caller explicitly needs disk state.
|
|
259
|
+
* Cached path emits `trace:manifest { op: 'cache-hit' }` so test/devtools
|
|
260
|
+
* can assert that the steady-state pipeline does ZERO GETs on flush/pull.
|
|
261
|
+
*/
|
|
262
|
+
/**
|
|
263
|
+
* Returns whether the manifest was bootstrapped (freshly minted) on this
|
|
264
|
+
* call. Callers (connect()) use this to skip the device-metadata GET when
|
|
265
|
+
* we know no prior device record can exist.
|
|
266
|
+
*/
|
|
138
267
|
private doLoadOrCreateManifest;
|
|
139
268
|
put<K extends keyof S & string>(table: K, rowId: string, columns: Partial<S[K]>, userId?: string): Promise<S[K]>;
|
|
140
269
|
delete<K extends keyof S & string>(table: K, rowId: string, userId?: string): Promise<void>;
|
|
141
|
-
get<K extends keyof S & string>(table: K, rowId: string): Promise<S[K] | undefined>;
|
|
142
270
|
query<K extends keyof S & string>(table: K): Promise<S[K][]>;
|
|
143
271
|
queryWhere<K extends keyof S & string>(table: K, clause: WhereClause): Promise<S[K][]>;
|
|
144
272
|
tableNames(): Promise<string[]>;
|
|
145
273
|
table<K extends keyof S & string>(name: K): Table<S[K]>;
|
|
274
|
+
private batchDepth;
|
|
275
|
+
/**
|
|
276
|
+
* Group a sequence of writes into a single ChangeEntry. The entry
|
|
277
|
+
* carries every op as one atomic unit, producing one remote file
|
|
278
|
+
* instead of one per write.
|
|
279
|
+
*
|
|
280
|
+
* Nested batch() calls join the outer batch.
|
|
281
|
+
*/
|
|
282
|
+
batch<R>(fn: () => Promise<R> | R): Promise<R>;
|
|
283
|
+
private isBatching;
|
|
284
|
+
private clearBatchTimer;
|
|
285
|
+
private appendOpToPendingBatch;
|
|
286
|
+
private armImplicitBatchTimer;
|
|
287
|
+
private flushPendingBatch;
|
|
146
288
|
private scheduleFlush;
|
|
289
|
+
private maybeEmitCompactWarning;
|
|
290
|
+
private resetCompactWarning;
|
|
291
|
+
private maybeAutoCompact;
|
|
292
|
+
private armDelayedCompactAfterChange;
|
|
293
|
+
private runDelayedCompactCheck;
|
|
294
|
+
private runDelayedCompact;
|
|
295
|
+
/** Public flush — waits for init. Safe to call from user code. */
|
|
147
296
|
flush(): Promise<void>;
|
|
297
|
+
/** Internal flush — no ensureReady guard (called from connect, pull, doInit). */
|
|
298
|
+
private doFlush;
|
|
148
299
|
pull(): Promise<void>;
|
|
149
300
|
rehydrate(): Promise<void>;
|
|
150
301
|
compact(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/core/sync-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,iBAAiB,EAEjB,QAAQ,
|
|
1
|
+
{"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/core/sync-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,iBAAiB,EAEjB,QAAQ,EACR,GAAG,EAIH,iBAAiB,EAEjB,WAAW,EAGX,gBAAgB,EAEhB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,aAAa,EACb,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,KAAK,EAAmB,MAAM,YAAY,CAAC;AA2DpD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CACvF,SAAQ,2BAA2B;IACnC,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjH,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7D,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvF,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,EAAE,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAAC;IAC5C,WAAW,IAAI,MAAM,CAAC;IACtB,SAAS,IAAI,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,IAAI,OAAO,CAAC;CACxB;AAmCD,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CACxE,YAAW,2BAA2B;IACtC,SAAiB,WAAW,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAuB;IAGzC,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,iBAAiB,CAAsB;IAG/C,OAAO,CAAC,WAAW,CAA0B;IAG7C,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,YAAY,CAA4B;IAGhD,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,8BAA8B,CAA6B;IAGnE,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAA8B;IAMjD,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAGpC,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAGhC,OAAO,CAAC,UAAU,CAA2C;IAE7D,OAAO,CAAC,iBAAiB,CAAuC;IAIhE,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,eAAe,CAAuC;IAE9D;;;;;;;;;;;;;OAaG;gBACS,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;gBACrB,OAAO,EAAE,cAAc,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAuDjE,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,2BAA2B;IAInC,gFAAgF;IAChF,OAAO,CAAC,WAAW;YAML,MAAM;YAwCN,SAAS;IAiBvB;;;;;OAKG;YACW,sBAAsB;YAUtB,QAAQ;YAIR,aAAa;IAM3B;wDACoD;IACpD,OAAO,IAAI,OAAO;IAIlB,wDAAwD;IACxD,gBAAgB,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM;IAIrD,2EAA2E;IAC3E,cAAc,CAAC,UAAU,EAAE,eAAe,GAAG,kBAAkB;IAY/D;;;;;;;;OAQG;IACH,aAAa,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAgB3F,OAAO,CAAC,QAAQ;IAiDhB,OAAO,CAAC,iBAAiB;IASzB;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IAcpC,4DAA4D;IAC5D,cAAc,CAAC,UAAU,EAAE,aAAa,GAAG,MAAM;IAIjD,oDAAoD;IACpD,YAAY,CAAC,UAAU,EAAE,aAAa,GAAG,gBAAgB;IAYzD;;;OAGG;IACH,OAAO,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;IAc7F,OAAO,CAAC,MAAM;IAoCd,OAAO,CAAC,oBAAoB;IAS5B;;;;;;;;;OASG;IACH,OAAO,CAAC,0BAA0B;IAUlC,OAAO,KAAK,WAAW,GAwBtB;IAID,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,KAAK,UAAU,GAMrB;IAED,OAAO,KAAK,eAAe,GAW1B;IAID,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,wBAAwB;IAyChC,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,WAAW;YAeL,cAAc;YAad,gBAAgB;YAWhB,YAAY;IAsC1B,EAAE,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAK3C,OAAO,CAAC,IAAI;YAgBE,kBAAkB;IAuChC;;;;;;;;OAQG;YACW,0BAA0B;YAsB1B,wBAAwB;YAKxB,yBAAyB;YAKzB,iBAAiB;IA8C/B,OAAO,CAAC,iBAAiB;IAuBzB,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAc5C;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvC;;;;OAIG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B;;;;OAIG;IACG,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI9C;;;;;;;;;;;OAWG;IACG,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IA4B/C;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvC;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAOhC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,MAAM;IAgCpB;;;OAGG;YACW,kBAAkB;IAgI1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YA+DhB,kBAAkB;YAiDlB,SAAS;IA6IjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3B,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAmF/D,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB9D;;;;;;;;;;;OAWG;IACH;;;;OAIG;YACW,sBAAsB;IA4B9B,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAClC,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAKV,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3F,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAK5D,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAKtF,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKrC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IASvD,OAAO,CAAC,UAAU,CAAK;IAEvB;;;;;;OAMG;IACG,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAYpD,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,qBAAqB;YASf,iBAAiB;IAW/B,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,mBAAmB;YAKb,gBAAgB;IAwE9B,OAAO,CAAC,4BAA4B;YAuBtB,sBAAsB;YAoDtB,iBAAiB;IAqF/B,kEAAkE;IAC5D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,iFAAiF;YACnE,OAAO;IA2Ef,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBrB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B,WAAW,IAAI,QAAQ,GAAG,IAAI;IAI9B,WAAW,IAAI,MAAM;IAIrB,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACG,gBAAgB,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAItD"}
|