@tursodatabase/sync-react-native 0.5.0-pre.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.
Files changed (72) hide show
  1. package/README.md +117 -0
  2. package/android/CMakeLists.txt +53 -0
  3. package/android/build.gradle +84 -0
  4. package/android/cpp-adapter.cpp +49 -0
  5. package/android/src/main/AndroidManifest.xml +2 -0
  6. package/android/src/main/java/com/turso/sync/reactnative/TursoBridge.java +44 -0
  7. package/android/src/main/java/com/turso/sync/reactnative/TursoModule.java +82 -0
  8. package/android/src/main/java/com/turso/sync/reactnative/TursoPackage.java +29 -0
  9. package/cpp/TursoConnectionHostObject.cpp +179 -0
  10. package/cpp/TursoConnectionHostObject.h +52 -0
  11. package/cpp/TursoDatabaseHostObject.cpp +98 -0
  12. package/cpp/TursoDatabaseHostObject.h +49 -0
  13. package/cpp/TursoHostObject.cpp +561 -0
  14. package/cpp/TursoHostObject.h +24 -0
  15. package/cpp/TursoStatementHostObject.cpp +414 -0
  16. package/cpp/TursoStatementHostObject.h +65 -0
  17. package/cpp/TursoSyncChangesHostObject.cpp +41 -0
  18. package/cpp/TursoSyncChangesHostObject.h +52 -0
  19. package/cpp/TursoSyncDatabaseHostObject.cpp +328 -0
  20. package/cpp/TursoSyncDatabaseHostObject.h +61 -0
  21. package/cpp/TursoSyncIoItemHostObject.cpp +304 -0
  22. package/cpp/TursoSyncIoItemHostObject.h +52 -0
  23. package/cpp/TursoSyncOperationHostObject.cpp +168 -0
  24. package/cpp/TursoSyncOperationHostObject.h +53 -0
  25. package/ios/TursoModule.h +8 -0
  26. package/ios/TursoModule.mm +95 -0
  27. package/lib/commonjs/Database.js +445 -0
  28. package/lib/commonjs/Database.js.map +1 -0
  29. package/lib/commonjs/Statement.js +339 -0
  30. package/lib/commonjs/Statement.js.map +1 -0
  31. package/lib/commonjs/index.js +229 -0
  32. package/lib/commonjs/index.js.map +1 -0
  33. package/lib/commonjs/internal/asyncOperation.js +124 -0
  34. package/lib/commonjs/internal/asyncOperation.js.map +1 -0
  35. package/lib/commonjs/internal/ioProcessor.js +315 -0
  36. package/lib/commonjs/internal/ioProcessor.js.map +1 -0
  37. package/lib/commonjs/package.json +1 -0
  38. package/lib/commonjs/types.js +133 -0
  39. package/lib/commonjs/types.js.map +1 -0
  40. package/lib/module/Database.js +441 -0
  41. package/lib/module/Database.js.map +1 -0
  42. package/lib/module/Statement.js +335 -0
  43. package/lib/module/Statement.js.map +1 -0
  44. package/lib/module/index.js +205 -0
  45. package/lib/module/index.js.map +1 -0
  46. package/lib/module/internal/asyncOperation.js +116 -0
  47. package/lib/module/internal/asyncOperation.js.map +1 -0
  48. package/lib/module/internal/ioProcessor.js +309 -0
  49. package/lib/module/internal/ioProcessor.js.map +1 -0
  50. package/lib/module/package.json +1 -0
  51. package/lib/module/types.js +163 -0
  52. package/lib/module/types.js.map +1 -0
  53. package/lib/typescript/Database.d.ts +140 -0
  54. package/lib/typescript/Database.d.ts.map +1 -0
  55. package/lib/typescript/Statement.d.ts +105 -0
  56. package/lib/typescript/Statement.d.ts.map +1 -0
  57. package/lib/typescript/index.d.ts +175 -0
  58. package/lib/typescript/index.d.ts.map +1 -0
  59. package/lib/typescript/internal/asyncOperation.d.ts +39 -0
  60. package/lib/typescript/internal/asyncOperation.d.ts.map +1 -0
  61. package/lib/typescript/internal/ioProcessor.d.ts +48 -0
  62. package/lib/typescript/internal/ioProcessor.d.ts.map +1 -0
  63. package/lib/typescript/types.d.ts +316 -0
  64. package/lib/typescript/types.d.ts.map +1 -0
  65. package/package.json +97 -0
  66. package/src/Database.ts +480 -0
  67. package/src/Statement.ts +372 -0
  68. package/src/index.ts +240 -0
  69. package/src/internal/asyncOperation.ts +147 -0
  70. package/src/internal/ioProcessor.ts +328 -0
  71. package/src/types.ts +391 -0
  72. package/turso-sync-react-native.podspec +56 -0
@@ -0,0 +1,441 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Database
5
+ *
6
+ * Unified high-level API for both local and sync databases.
7
+ * Constructor determines whether to use local-only or sync mode based on config.
8
+ */
9
+
10
+ import { Statement } from './Statement';
11
+ import { driveVoidOperation, driveConnectionOperation, driveChangesOperation, driveStatsOperation } from './internal/asyncOperation';
12
+ import { drainSyncIo } from './internal/ioProcessor';
13
+
14
+ /**
15
+ * Check if config has sync properties (url field)
16
+ */
17
+ function isSyncConfig(opts) {
18
+ return opts.url !== undefined && opts.url !== null;
19
+ }
20
+
21
+ /**
22
+ * Calculate reserved bytes based on encryption cipher.
23
+ * These values match the Turso Cloud encryption settings.
24
+ */
25
+ function getReservedBytesForCipher(encryption) {
26
+ if (!encryption) {
27
+ return 0;
28
+ }
29
+ switch (encryption.cipher) {
30
+ case 'aes256gcm':
31
+ case 'aes128gcm':
32
+ case 'chacha20poly1305':
33
+ return 28;
34
+ case 'aegis128l':
35
+ case 'aegis128x2':
36
+ case 'aegis128x4':
37
+ return 32;
38
+ case 'aegis256':
39
+ case 'aegis256x2':
40
+ case 'aegis256x4':
41
+ return 48;
42
+ default:
43
+ return 0;
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Database class - works for both local-only and sync databases
49
+ *
50
+ * All database operations are async to properly handle IO requirements:
51
+ * - For local databases: async allows yielding to JS event loop
52
+ * - For sync databases: async required for network operations
53
+ * - For partial sync: async required to load missing pages on-demand
54
+ */
55
+ export class Database {
56
+ _nativeDb = null;
57
+ _nativeSyncDb = null;
58
+ _connection = null;
59
+ _isSync = false;
60
+ _connected = false;
61
+ _closed = false;
62
+ /**
63
+ * Create a new database (doesn't connect yet - call connect())
64
+ *
65
+ * @param opts - Database options
66
+ */
67
+ constructor(opts) {
68
+ this._opts = opts;
69
+ this._isSync = isSyncConfig(opts);
70
+ }
71
+
72
+ /**
73
+ * Connect to the database (matches JavaScript bindings)
74
+ * For local databases: opens immediately
75
+ * For sync databases: bootstraps if needed
76
+ */
77
+ async connect() {
78
+ if (this._connected) {
79
+ return;
80
+ }
81
+ if (this._isSync) {
82
+ await this.initSyncDatabase();
83
+ } else {
84
+ this.initLocalDatabase();
85
+ }
86
+ this._connected = true;
87
+ }
88
+
89
+ /**
90
+ * Initialize local-only database
91
+ */
92
+ initLocalDatabase() {
93
+ if (typeof __TursoProxy === 'undefined') {
94
+ throw new Error('Turso native module not loaded');
95
+ }
96
+ const dbConfig = {
97
+ path: this._opts.path,
98
+ async_io: true // Always use async IO in React Native
99
+ };
100
+
101
+ // Create native database (path normalization happens in C++ JSI layer)
102
+ this._nativeDb = __TursoProxy.newDatabase(this._opts.path, dbConfig);
103
+
104
+ // Open database
105
+ this._nativeDb.open();
106
+
107
+ // Get connection
108
+ this._connection = this._nativeDb.connect();
109
+ }
110
+
111
+ /**
112
+ * Initialize sync database
113
+ */
114
+ async initSyncDatabase() {
115
+ if (typeof __TursoProxy === 'undefined') {
116
+ throw new Error('Turso native module not loaded');
117
+ }
118
+
119
+ // Get URL (can be string or function)
120
+ let url = null;
121
+ if (typeof this._opts.url === 'function') {
122
+ url = this._opts.url();
123
+ } else if (typeof this._opts.url === 'string') {
124
+ url = this._opts.url;
125
+ }
126
+ if (!url) {
127
+ throw new Error('Sync database requires a URL');
128
+ }
129
+
130
+ // Build dbConfig (path normalization happens in C++ JSI layer)
131
+ const dbConfig = {
132
+ path: this._opts.path,
133
+ async_io: true // Always use async IO in React Native
134
+ };
135
+
136
+ // Calculate reserved bytes from cipher
137
+ const reservedBytes = getReservedBytesForCipher(this._opts.remoteEncryption);
138
+
139
+ // Build syncConfig with all options
140
+ const syncConfig = {
141
+ remoteUrl: url,
142
+ clientName: this._opts.clientName || 'turso-sync-react-native',
143
+ longPollTimeoutMs: this._opts.longPollTimeoutMs,
144
+ bootstrapIfEmpty: this._opts.bootstrapIfEmpty ?? true,
145
+ reservedBytes: reservedBytes,
146
+ // Remote encryption options (key is passed to sync engine for HTTP headers)
147
+ remoteEncryptionKey: this._opts.remoteEncryption?.key,
148
+ remoteEncryptionCipher: this._opts.remoteEncryption?.cipher
149
+ };
150
+
151
+ // Add partial sync options if present
152
+ if (this._opts.partialSyncExperimental) {
153
+ const partial = this._opts.partialSyncExperimental;
154
+ if (partial.bootstrapStrategy.kind === 'prefix') {
155
+ syncConfig.partialBootstrapStrategyPrefix = partial.bootstrapStrategy.length;
156
+ } else if (partial.bootstrapStrategy.kind === 'query') {
157
+ syncConfig.partialBootstrapStrategyQuery = partial.bootstrapStrategy.query;
158
+ }
159
+ syncConfig.partialBootstrapSegmentSize = partial.segmentSize;
160
+ syncConfig.partialBootstrapPrefetch = partial.prefetch;
161
+ }
162
+
163
+ // Create native sync database
164
+ this._nativeSyncDb = __TursoProxy.newSyncDatabase(dbConfig, syncConfig);
165
+
166
+ // Create IO context with auth token and base URL
167
+ this._ioContext = {
168
+ authToken: this._opts.authToken,
169
+ baseUrl: url
170
+ };
171
+
172
+ // Create extraIo callback for partial sync support
173
+ // This callback drains the sync engine's IO queue during statement execution
174
+ this._extraIo = async () => {
175
+ if (this._nativeSyncDb && this._ioContext) {
176
+ await drainSyncIo(this._nativeSyncDb, this._ioContext);
177
+ }
178
+ };
179
+
180
+ // Bootstrap/open database
181
+ const operation = this._nativeSyncDb.create();
182
+ await driveVoidOperation(operation, this._nativeSyncDb, this._ioContext);
183
+
184
+ // Get connection
185
+ const connOperation = this._nativeSyncDb.connect();
186
+ this._connection = await driveConnectionOperation(connOperation, this._nativeSyncDb, this._ioContext);
187
+ }
188
+
189
+ /**
190
+ * Prepare a SQL statement
191
+ *
192
+ * @param sql - SQL statement to prepare
193
+ * @returns Prepared statement
194
+ */
195
+ prepare(sql) {
196
+ this.checkOpen();
197
+ if (!this._connection) {
198
+ throw new Error('No connection available');
199
+ }
200
+ const nativeStmt = this._connection.prepareSingle(sql);
201
+ // Pass extraIo callback for partial sync support
202
+ return new Statement(nativeStmt, this._extraIo);
203
+ }
204
+
205
+ /**
206
+ * Execute SQL without returning results (for DDL, multi-statement SQL)
207
+ *
208
+ * @param sql - SQL to execute
209
+ */
210
+ async exec(sql) {
211
+ this.checkOpen();
212
+ if (!this._connection) {
213
+ throw new Error('No connection available');
214
+ }
215
+
216
+ // Use prepareFirst to handle multiple statements
217
+ let remaining = sql.trim();
218
+ while (remaining.length > 0) {
219
+ const result = this._connection.prepareFirst(remaining);
220
+ if (!result.statement) {
221
+ break; // No more statements
222
+ }
223
+
224
+ // Wrap in Statement to get IO handling
225
+ const stmt = new Statement(result.statement, this._extraIo);
226
+ try {
227
+ // Execute - will handle IO if needed
228
+ await stmt.run();
229
+ } finally {
230
+ stmt.finalize();
231
+ }
232
+
233
+ // Move to next statement
234
+ remaining = sql.substring(result.tailIdx).trim();
235
+ }
236
+ }
237
+
238
+ /**
239
+ * Execute statement and return result info
240
+ *
241
+ * @param sql - SQL statement
242
+ * @param params - Bind parameters
243
+ * @returns Run result with changes and lastInsertRowid
244
+ */
245
+ async run(sql, ...params) {
246
+ const stmt = this.prepare(sql);
247
+ try {
248
+ return await stmt.run(...params);
249
+ } finally {
250
+ stmt.finalize();
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Execute query and return first row
256
+ *
257
+ * @param sql - SQL query
258
+ * @param params - Bind parameters
259
+ * @returns First row or undefined
260
+ */
261
+ async get(sql, ...params) {
262
+ const stmt = this.prepare(sql);
263
+ try {
264
+ return await stmt.get(...params);
265
+ } finally {
266
+ stmt.finalize();
267
+ }
268
+ }
269
+
270
+ /**
271
+ * Execute query and return all rows
272
+ *
273
+ * @param sql - SQL query
274
+ * @param params - Bind parameters
275
+ * @returns All rows
276
+ */
277
+ async all(sql, ...params) {
278
+ const stmt = this.prepare(sql);
279
+ try {
280
+ return await stmt.all(...params);
281
+ } finally {
282
+ stmt.finalize();
283
+ }
284
+ }
285
+
286
+ /**
287
+ * Execute function within a transaction
288
+ *
289
+ * @param fn - Function to execute
290
+ * @returns Function result
291
+ */
292
+ async transaction(fn) {
293
+ this.checkOpen();
294
+ await this.exec('BEGIN');
295
+ try {
296
+ const result = await fn();
297
+ await this.exec('COMMIT');
298
+ return result;
299
+ } catch (error) {
300
+ await this.exec('ROLLBACK');
301
+ throw error;
302
+ }
303
+ }
304
+
305
+ /**
306
+ * Push local changes to remote (sync databases only)
307
+ */
308
+ async push() {
309
+ if (!this._isSync || !this._nativeSyncDb || !this._ioContext) {
310
+ throw new Error('push() is only available for sync databases');
311
+ }
312
+ const operation = this._nativeSyncDb.pushChanges();
313
+ await driveVoidOperation(operation, this._nativeSyncDb, this._ioContext);
314
+ }
315
+
316
+ /**
317
+ * Pull remote changes and apply locally (sync databases only)
318
+ *
319
+ * @returns true if changes were applied, false if no changes
320
+ */
321
+ async pull() {
322
+ if (!this._isSync || !this._nativeSyncDb || !this._ioContext) {
323
+ throw new Error('pull() is only available for sync databases');
324
+ }
325
+
326
+ // Wait for changes
327
+ const waitOperation = this._nativeSyncDb.waitChanges();
328
+ const changes = await driveChangesOperation(waitOperation, this._nativeSyncDb, this._ioContext);
329
+
330
+ // If no changes, return false
331
+ if (!changes) {
332
+ return false;
333
+ }
334
+
335
+ // Apply changes
336
+ const applyOperation = this._nativeSyncDb.applyChanges(changes);
337
+ await driveVoidOperation(applyOperation, this._nativeSyncDb, this._ioContext);
338
+ return true;
339
+ }
340
+
341
+ /**
342
+ * Get sync statistics (sync databases only)
343
+ *
344
+ * @returns Sync stats
345
+ */
346
+ async stats() {
347
+ if (!this._isSync || !this._nativeSyncDb || !this._ioContext) {
348
+ throw new Error('stats() is only available for sync databases');
349
+ }
350
+ const operation = this._nativeSyncDb.stats();
351
+ return driveStatsOperation(operation, this._nativeSyncDb, this._ioContext);
352
+ }
353
+
354
+ /**
355
+ * Checkpoint database (sync databases only)
356
+ */
357
+ async checkpoint() {
358
+ if (!this._isSync || !this._nativeSyncDb || !this._ioContext) {
359
+ throw new Error('checkpoint() is only available for sync databases');
360
+ }
361
+ const operation = this._nativeSyncDb.checkpoint();
362
+ await driveVoidOperation(operation, this._nativeSyncDb, this._ioContext);
363
+ }
364
+
365
+ /**
366
+ * Close the database
367
+ */
368
+ close() {
369
+ if (this._closed) {
370
+ return;
371
+ }
372
+ if (this._connection) {
373
+ this._connection.close();
374
+ this._connection = null;
375
+ }
376
+ if (this._nativeDb) {
377
+ this._nativeDb.close();
378
+ this._nativeDb = null;
379
+ }
380
+ if (this._nativeSyncDb) {
381
+ this._nativeSyncDb.close();
382
+ this._nativeSyncDb = null;
383
+ }
384
+ this._connected = false;
385
+ this._closed = true;
386
+ }
387
+
388
+ /**
389
+ * Get database path
390
+ */
391
+ get path() {
392
+ return this._opts.path;
393
+ }
394
+
395
+ /**
396
+ * Check if database is a sync database
397
+ */
398
+ get isSync() {
399
+ return this._isSync;
400
+ }
401
+
402
+ /**
403
+ * Check if database is open
404
+ */
405
+ get open() {
406
+ return !this._closed && this._connection !== null;
407
+ }
408
+
409
+ /**
410
+ * Check if in transaction
411
+ */
412
+ get inTransaction() {
413
+ if (!this._connection) {
414
+ return false;
415
+ }
416
+ return !this._connection.getAutocommit();
417
+ }
418
+
419
+ /**
420
+ * Get last insert rowid
421
+ */
422
+ get lastInsertRowid() {
423
+ if (!this._connection) {
424
+ return 0;
425
+ }
426
+ return this._connection.lastInsertRowid();
427
+ }
428
+
429
+ /**
430
+ * Check if open and throw if not
431
+ */
432
+ checkOpen() {
433
+ if (this._closed) {
434
+ throw new Error('Database is closed');
435
+ }
436
+ if (!this._connected || !this._connection) {
437
+ throw new Error('Database not connected. Call connect() first.');
438
+ }
439
+ }
440
+ }
441
+ //# sourceMappingURL=Database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Statement","driveVoidOperation","driveConnectionOperation","driveChangesOperation","driveStatsOperation","drainSyncIo","isSyncConfig","opts","url","undefined","getReservedBytesForCipher","encryption","cipher","Database","_nativeDb","_nativeSyncDb","_connection","_isSync","_connected","_closed","constructor","_opts","connect","initSyncDatabase","initLocalDatabase","__TursoProxy","Error","dbConfig","path","async_io","newDatabase","open","reservedBytes","remoteEncryption","syncConfig","remoteUrl","clientName","longPollTimeoutMs","bootstrapIfEmpty","remoteEncryptionKey","key","remoteEncryptionCipher","partialSyncExperimental","partial","bootstrapStrategy","kind","partialBootstrapStrategyPrefix","length","partialBootstrapStrategyQuery","query","partialBootstrapSegmentSize","segmentSize","partialBootstrapPrefetch","prefetch","newSyncDatabase","_ioContext","authToken","baseUrl","_extraIo","operation","create","connOperation","prepare","sql","checkOpen","nativeStmt","prepareSingle","exec","remaining","trim","result","prepareFirst","statement","stmt","run","finalize","substring","tailIdx","params","get","all","transaction","fn","error","push","pushChanges","pull","waitOperation","waitChanges","changes","applyOperation","applyChanges","stats","checkpoint","close","isSync","inTransaction","getAutocommit","lastInsertRowid"],"sourceRoot":"../../src","sources":["Database.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,QAAQ,aAAa;AAavC,SACEC,kBAAkB,EAClBC,wBAAwB,EACxBC,qBAAqB,EACrBC,mBAAmB,QACd,2BAA2B;AAClC,SAASC,WAAW,QAAQ,wBAAwB;;AAEpD;AACA;AACA;AACA,SAASC,YAAYA,CAACC,IAAkB,EAAW;EACjD,OAAOA,IAAI,CAACC,GAAG,KAAKC,SAAS,IAAIF,IAAI,CAACC,GAAG,KAAK,IAAI;AACpD;;AAEA;AACA;AACA;AACA;AACA,SAASE,yBAAyBA,CAACC,UAAsC,EAAU;EACjF,IAAI,CAACA,UAAU,EAAE;IACf,OAAO,CAAC;EACV;EAEA,QAAQA,UAAU,CAACC,MAAM;IACvB,KAAK,WAAW;IAChB,KAAK,WAAW;IAChB,KAAK,kBAAkB;MACrB,OAAO,EAAE;IACX,KAAK,WAAW;IAChB,KAAK,YAAY;IACjB,KAAK,YAAY;MACf,OAAO,EAAE;IACX,KAAK,UAAU;IACf,KAAK,YAAY;IACjB,KAAK,YAAY;MACf,OAAO,EAAE;IACX;MACE,OAAO,CAAC;EACZ;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,QAAQ,CAAC;EAEZC,SAAS,GAA0B,IAAI;EACvCC,aAAa,GAA8B,IAAI;EAC/CC,WAAW,GAA4B,IAAI;EAC3CC,OAAO,GAAG,KAAK;EACfC,UAAU,GAAG,KAAK;EAClBC,OAAO,GAAG,KAAK;EAOvB;AACF;AACA;AACA;AACA;EACEC,WAAWA,CAACb,IAAkB,EAAE;IAC9B,IAAI,CAACc,KAAK,GAAGd,IAAI;IACjB,IAAI,CAACU,OAAO,GAAGX,YAAY,CAACC,IAAI,CAAC;EACnC;;EAEA;AACF;AACA;AACA;AACA;EACE,MAAMe,OAAOA,CAAA,EAAkB;IAC7B,IAAI,IAAI,CAACJ,UAAU,EAAE;MACnB;IACF;IAEA,IAAI,IAAI,CAACD,OAAO,EAAE;MAChB,MAAM,IAAI,CAACM,gBAAgB,CAAC,CAAC;IAC/B,CAAC,MAAM;MACL,IAAI,CAACC,iBAAiB,CAAC,CAAC;IAC1B;IAEA,IAAI,CAACN,UAAU,GAAG,IAAI;EACxB;;EAEA;AACF;AACA;EACUM,iBAAiBA,CAAA,EAAS;IAChC,IAAI,OAAOC,YAAY,KAAK,WAAW,EAAE;MACvC,MAAM,IAAIC,KAAK,CAAC,gCAAgC,CAAC;IACnD;IAEA,MAAMC,QAAQ,GAAG;MACfC,IAAI,EAAE,IAAI,CAACP,KAAK,CAACO,IAAI;MACrBC,QAAQ,EAAE,IAAI,CAAE;IAClB,CAAC;;IAED;IACA,IAAI,CAACf,SAAS,GAAGW,YAAY,CAACK,WAAW,CAAC,IAAI,CAACT,KAAK,CAACO,IAAI,EAAED,QAAQ,CAAC;;IAEpE;IACA,IAAI,CAACb,SAAS,CAACiB,IAAI,CAAC,CAAC;;IAErB;IACA,IAAI,CAACf,WAAW,GAAG,IAAI,CAACF,SAAS,CAACQ,OAAO,CAAC,CAAC;EAC7C;;EAEA;AACF;AACA;EACE,MAAcC,gBAAgBA,CAAA,EAAkB;IAC9C,IAAI,OAAOE,YAAY,KAAK,WAAW,EAAE;MACvC,MAAM,IAAIC,KAAK,CAAC,gCAAgC,CAAC;IACnD;;IAEA;IACA,IAAIlB,GAAkB,GAAG,IAAI;IAC7B,IAAI,OAAO,IAAI,CAACa,KAAK,CAACb,GAAG,KAAK,UAAU,EAAE;MACxCA,GAAG,GAAG,IAAI,CAACa,KAAK,CAACb,GAAG,CAAC,CAAC;IACxB,CAAC,MAAM,IAAI,OAAO,IAAI,CAACa,KAAK,CAACb,GAAG,KAAK,QAAQ,EAAE;MAC7CA,GAAG,GAAG,IAAI,CAACa,KAAK,CAACb,GAAG;IACtB;IAEA,IAAI,CAACA,GAAG,EAAE;MACR,MAAM,IAAIkB,KAAK,CAAC,8BAA8B,CAAC;IACjD;;IAEA;IACA,MAAMC,QAAQ,GAAG;MACfC,IAAI,EAAE,IAAI,CAACP,KAAK,CAACO,IAAI;MACrBC,QAAQ,EAAE,IAAI,CAAE;IAClB,CAAC;;IAED;IACA,MAAMG,aAAa,GAAGtB,yBAAyB,CAAC,IAAI,CAACW,KAAK,CAACY,gBAAgB,CAAC;;IAE5E;IACA,MAAMC,UAAe,GAAG;MACtBC,SAAS,EAAE3B,GAAG;MACd4B,UAAU,EAAE,IAAI,CAACf,KAAK,CAACe,UAAU,IAAI,yBAAyB;MAC9DC,iBAAiB,EAAE,IAAI,CAAChB,KAAK,CAACgB,iBAAiB;MAC/CC,gBAAgB,EAAE,IAAI,CAACjB,KAAK,CAACiB,gBAAgB,IAAI,IAAI;MACrDN,aAAa,EAAEA,aAAa;MAC5B;MACAO,mBAAmB,EAAE,IAAI,CAAClB,KAAK,CAACY,gBAAgB,EAAEO,GAAG;MACrDC,sBAAsB,EAAE,IAAI,CAACpB,KAAK,CAACY,gBAAgB,EAAErB;IACvD,CAAC;;IAED;IACA,IAAI,IAAI,CAACS,KAAK,CAACqB,uBAAuB,EAAE;MACtC,MAAMC,OAAO,GAAG,IAAI,CAACtB,KAAK,CAACqB,uBAAuB;MAClD,IAAIC,OAAO,CAACC,iBAAiB,CAACC,IAAI,KAAK,QAAQ,EAAE;QAC/CX,UAAU,CAACY,8BAA8B,GAAGH,OAAO,CAACC,iBAAiB,CAACG,MAAM;MAC9E,CAAC,MAAM,IAAIJ,OAAO,CAACC,iBAAiB,CAACC,IAAI,KAAK,OAAO,EAAE;QACrDX,UAAU,CAACc,6BAA6B,GAAGL,OAAO,CAACC,iBAAiB,CAACK,KAAK;MAC5E;MACAf,UAAU,CAACgB,2BAA2B,GAAGP,OAAO,CAACQ,WAAW;MAC5DjB,UAAU,CAACkB,wBAAwB,GAAGT,OAAO,CAACU,QAAQ;IACxD;;IAEA;IACA,IAAI,CAACtC,aAAa,GAAGU,YAAY,CAAC6B,eAAe,CAAC3B,QAAQ,EAAEO,UAAU,CAAC;;IAEvE;IACA,IAAI,CAACqB,UAAU,GAAG;MAChBC,SAAS,EAAE,IAAI,CAACnC,KAAK,CAACmC,SAAS;MAC/BC,OAAO,EAAEjD;IACX,CAAC;;IAED;IACA;IACA,IAAI,CAACkD,QAAQ,GAAG,YAAY;MAC1B,IAAI,IAAI,CAAC3C,aAAa,IAAI,IAAI,CAACwC,UAAU,EAAE;QACzC,MAAMlD,WAAW,CAAC,IAAI,CAACU,aAAa,EAAE,IAAI,CAACwC,UAAU,CAAC;MACxD;IACF,CAAC;;IAED;IACA,MAAMI,SAAS,GAAG,IAAI,CAAC5C,aAAa,CAAC6C,MAAM,CAAC,CAAC;IAC7C,MAAM3D,kBAAkB,CAAC0D,SAAS,EAAE,IAAI,CAAC5C,aAAa,EAAE,IAAI,CAACwC,UAAU,CAAC;;IAExE;IACA,MAAMM,aAAa,GAAG,IAAI,CAAC9C,aAAa,CAACO,OAAO,CAAC,CAAC;IAClD,IAAI,CAACN,WAAW,GAAG,MAAMd,wBAAwB,CAAC2D,aAAa,EAAE,IAAI,CAAC9C,aAAa,EAAE,IAAI,CAACwC,UAAU,CAAC;EACvG;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEO,OAAOA,CAACC,GAAW,EAAa;IAC9B,IAAI,CAACC,SAAS,CAAC,CAAC;IAEhB,IAAI,CAAC,IAAI,CAAChD,WAAW,EAAE;MACrB,MAAM,IAAIU,KAAK,CAAC,yBAAyB,CAAC;IAC5C;IAEA,MAAMuC,UAAU,GAAG,IAAI,CAACjD,WAAW,CAACkD,aAAa,CAACH,GAAG,CAAC;IACtD;IACA,OAAO,IAAI/D,SAAS,CAACiE,UAAU,EAAE,IAAI,CAACP,QAAQ,CAAC;EACjD;;EAEA;AACF;AACA;AACA;AACA;EACE,MAAMS,IAAIA,CAACJ,GAAW,EAAiB;IACrC,IAAI,CAACC,SAAS,CAAC,CAAC;IAEhB,IAAI,CAAC,IAAI,CAAChD,WAAW,EAAE;MACrB,MAAM,IAAIU,KAAK,CAAC,yBAAyB,CAAC;IAC5C;;IAEA;IACA,IAAI0C,SAAS,GAAGL,GAAG,CAACM,IAAI,CAAC,CAAC;IAE1B,OAAOD,SAAS,CAACrB,MAAM,GAAG,CAAC,EAAE;MAC3B,MAAMuB,MAAM,GAAG,IAAI,CAACtD,WAAW,CAACuD,YAAY,CAACH,SAAS,CAAC;MAEvD,IAAI,CAACE,MAAM,CAACE,SAAS,EAAE;QACrB,MAAM,CAAC;MACT;;MAEA;MACA,MAAMC,IAAI,GAAG,IAAIzE,SAAS,CAACsE,MAAM,CAACE,SAAS,EAAE,IAAI,CAACd,QAAQ,CAAC;MAC3D,IAAI;QACF;QACA,MAAMe,IAAI,CAACC,GAAG,CAAC,CAAC;MAClB,CAAC,SAAS;QACRD,IAAI,CAACE,QAAQ,CAAC,CAAC;MACjB;;MAEA;MACAP,SAAS,GAAGL,GAAG,CAACa,SAAS,CAACN,MAAM,CAACO,OAAO,CAAC,CAACR,IAAI,CAAC,CAAC;IAClD;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,MAAMK,GAAGA,CAACX,GAAW,EAAE,GAAGe,MAAoB,EAAsB;IAClE,MAAML,IAAI,GAAG,IAAI,CAACX,OAAO,CAACC,GAAG,CAAC;IAC9B,IAAI;MACF,OAAO,MAAMU,IAAI,CAACC,GAAG,CAAC,GAAGI,MAAM,CAAC;IAClC,CAAC,SAAS;MACRL,IAAI,CAACE,QAAQ,CAAC,CAAC;IACjB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,MAAMI,GAAGA,CAAChB,GAAW,EAAE,GAAGe,MAAoB,EAA4B;IACxE,MAAML,IAAI,GAAG,IAAI,CAACX,OAAO,CAACC,GAAG,CAAC;IAC9B,IAAI;MACF,OAAO,MAAMU,IAAI,CAACM,GAAG,CAAC,GAAGD,MAAM,CAAC;IAClC,CAAC,SAAS;MACRL,IAAI,CAACE,QAAQ,CAAC,CAAC;IACjB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,MAAMK,GAAGA,CAACjB,GAAW,EAAE,GAAGe,MAAoB,EAAkB;IAC9D,MAAML,IAAI,GAAG,IAAI,CAACX,OAAO,CAACC,GAAG,CAAC;IAC9B,IAAI;MACF,OAAO,MAAMU,IAAI,CAACO,GAAG,CAAC,GAAGF,MAAM,CAAC;IAClC,CAAC,SAAS;MACRL,IAAI,CAACE,QAAQ,CAAC,CAAC;IACjB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,MAAMM,WAAWA,CAAIC,EAAwB,EAAc;IACzD,IAAI,CAAClB,SAAS,CAAC,CAAC;IAChB,MAAM,IAAI,CAACG,IAAI,CAAC,OAAO,CAAC;IACxB,IAAI;MACF,MAAMG,MAAM,GAAG,MAAMY,EAAE,CAAC,CAAC;MACzB,MAAM,IAAI,CAACf,IAAI,CAAC,QAAQ,CAAC;MACzB,OAAOG,MAAM;IACf,CAAC,CAAC,OAAOa,KAAK,EAAE;MACd,MAAM,IAAI,CAAChB,IAAI,CAAC,UAAU,CAAC;MAC3B,MAAMgB,KAAK;IACb;EACF;;EAEA;AACF;AACA;EACE,MAAMC,IAAIA,CAAA,EAAkB;IAC1B,IAAI,CAAC,IAAI,CAACnE,OAAO,IAAI,CAAC,IAAI,CAACF,aAAa,IAAI,CAAC,IAAI,CAACwC,UAAU,EAAE;MAC5D,MAAM,IAAI7B,KAAK,CAAC,6CAA6C,CAAC;IAChE;IAEA,MAAMiC,SAAS,GAAG,IAAI,CAAC5C,aAAa,CAACsE,WAAW,CAAC,CAAC;IAClD,MAAMpF,kBAAkB,CAAC0D,SAAS,EAAE,IAAI,CAAC5C,aAAa,EAAE,IAAI,CAACwC,UAAU,CAAC;EAC1E;;EAEA;AACF;AACA;AACA;AACA;EACE,MAAM+B,IAAIA,CAAA,EAAqB;IAC7B,IAAI,CAAC,IAAI,CAACrE,OAAO,IAAI,CAAC,IAAI,CAACF,aAAa,IAAI,CAAC,IAAI,CAACwC,UAAU,EAAE;MAC5D,MAAM,IAAI7B,KAAK,CAAC,6CAA6C,CAAC;IAChE;;IAEA;IACA,MAAM6D,aAAa,GAAG,IAAI,CAACxE,aAAa,CAACyE,WAAW,CAAC,CAAC;IACtD,MAAMC,OAAO,GAAG,MAAMtF,qBAAqB,CAACoF,aAAa,EAAE,IAAI,CAACxE,aAAa,EAAE,IAAI,CAACwC,UAAU,CAAC;;IAE/F;IACA,IAAI,CAACkC,OAAO,EAAE;MACZ,OAAO,KAAK;IACd;;IAEA;IACA,MAAMC,cAAc,GAAG,IAAI,CAAC3E,aAAa,CAAC4E,YAAY,CAACF,OAAO,CAAC;IAC/D,MAAMxF,kBAAkB,CAACyF,cAAc,EAAE,IAAI,CAAC3E,aAAa,EAAE,IAAI,CAACwC,UAAU,CAAC;IAE7E,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;EACE,MAAMqC,KAAKA,CAAA,EAAuB;IAChC,IAAI,CAAC,IAAI,CAAC3E,OAAO,IAAI,CAAC,IAAI,CAACF,aAAa,IAAI,CAAC,IAAI,CAACwC,UAAU,EAAE;MAC5D,MAAM,IAAI7B,KAAK,CAAC,8CAA8C,CAAC;IACjE;IAEA,MAAMiC,SAAS,GAAG,IAAI,CAAC5C,aAAa,CAAC6E,KAAK,CAAC,CAAC;IAC5C,OAAOxF,mBAAmB,CAACuD,SAAS,EAAE,IAAI,CAAC5C,aAAa,EAAE,IAAI,CAACwC,UAAU,CAAC;EAC5E;;EAEA;AACF;AACA;EACE,MAAMsC,UAAUA,CAAA,EAAkB;IAChC,IAAI,CAAC,IAAI,CAAC5E,OAAO,IAAI,CAAC,IAAI,CAACF,aAAa,IAAI,CAAC,IAAI,CAACwC,UAAU,EAAE;MAC5D,MAAM,IAAI7B,KAAK,CAAC,mDAAmD,CAAC;IACtE;IAEA,MAAMiC,SAAS,GAAG,IAAI,CAAC5C,aAAa,CAAC8E,UAAU,CAAC,CAAC;IACjD,MAAM5F,kBAAkB,CAAC0D,SAAS,EAAE,IAAI,CAAC5C,aAAa,EAAE,IAAI,CAACwC,UAAU,CAAC;EAC1E;;EAEA;AACF;AACA;EACEuC,KAAKA,CAAA,EAAS;IACZ,IAAI,IAAI,CAAC3E,OAAO,EAAE;MAChB;IACF;IAEA,IAAI,IAAI,CAACH,WAAW,EAAE;MACpB,IAAI,CAACA,WAAW,CAAC8E,KAAK,CAAC,CAAC;MACxB,IAAI,CAAC9E,WAAW,GAAG,IAAI;IACzB;IAEA,IAAI,IAAI,CAACF,SAAS,EAAE;MAClB,IAAI,CAACA,SAAS,CAACgF,KAAK,CAAC,CAAC;MACtB,IAAI,CAAChF,SAAS,GAAG,IAAI;IACvB;IAEA,IAAI,IAAI,CAACC,aAAa,EAAE;MACtB,IAAI,CAACA,aAAa,CAAC+E,KAAK,CAAC,CAAC;MAC1B,IAAI,CAAC/E,aAAa,GAAG,IAAI;IAC3B;IAEA,IAAI,CAACG,UAAU,GAAG,KAAK;IACvB,IAAI,CAACC,OAAO,GAAG,IAAI;EACrB;;EAEA;AACF;AACA;EACE,IAAIS,IAAIA,CAAA,EAAW;IACjB,OAAO,IAAI,CAACP,KAAK,CAACO,IAAI;EACxB;;EAEA;AACF;AACA;EACE,IAAImE,MAAMA,CAAA,EAAY;IACpB,OAAO,IAAI,CAAC9E,OAAO;EACrB;;EAEA;AACF;AACA;EACE,IAAIc,IAAIA,CAAA,EAAY;IAClB,OAAO,CAAC,IAAI,CAACZ,OAAO,IAAI,IAAI,CAACH,WAAW,KAAK,IAAI;EACnD;;EAEA;AACF;AACA;EACE,IAAIgF,aAAaA,CAAA,EAAY;IAC3B,IAAI,CAAC,IAAI,CAAChF,WAAW,EAAE;MACrB,OAAO,KAAK;IACd;IACA,OAAO,CAAC,IAAI,CAACA,WAAW,CAACiF,aAAa,CAAC,CAAC;EAC1C;;EAEA;AACF;AACA;EACE,IAAIC,eAAeA,CAAA,EAAW;IAC5B,IAAI,CAAC,IAAI,CAAClF,WAAW,EAAE;MACrB,OAAO,CAAC;IACV;IACA,OAAO,IAAI,CAACA,WAAW,CAACkF,eAAe,CAAC,CAAC;EAC3C;;EAEA;AACF;AACA;EACUlC,SAASA,CAAA,EAAS;IACxB,IAAI,IAAI,CAAC7C,OAAO,EAAE;MAChB,MAAM,IAAIO,KAAK,CAAC,oBAAoB,CAAC;IACvC;IACA,IAAI,CAAC,IAAI,CAACR,UAAU,IAAI,CAAC,IAAI,CAACF,WAAW,EAAE;MACzC,MAAM,IAAIU,KAAK,CAAC,+CAA+C,CAAC;IAClE;EACF;AACF","ignoreList":[]}