convex-batch-processor 0.5.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.
- package/LICENSE +21 -0
- package/README.md +395 -0
- package/dist/client/index.d.ts +212 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +78 -0
- package/dist/client/index.js.map +1 -0
- package/dist/component/_generated/api.d.ts +34 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +80 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +4 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/lib.d.ts +351 -0
- package/dist/component/lib.d.ts.map +1 -0
- package/dist/component/lib.js +879 -0
- package/dist/component/lib.js.map +1 -0
- package/dist/component/schema.d.ts +118 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +61 -0
- package/dist/component/schema.js.map +1 -0
- package/package.json +63 -0
- package/src/client/index.test.ts +123 -0
- package/src/client/index.ts +336 -0
- package/src/component/_generated/api.ts +50 -0
- package/src/component/_generated/component.ts +140 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +156 -0
- package/src/component/convex.config.ts +4 -0
- package/src/component/lib.ts +1082 -0
- package/src/component/schema.ts +70 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
export declare const addItems: import("convex/server").RegisteredMutation<"public", {
|
|
2
|
+
items: any[];
|
|
3
|
+
batchId: string;
|
|
4
|
+
config: {
|
|
5
|
+
maxBatchSize: number;
|
|
6
|
+
flushIntervalMs: number;
|
|
7
|
+
processBatchHandle: string;
|
|
8
|
+
};
|
|
9
|
+
}, Promise<{
|
|
10
|
+
batchId: string;
|
|
11
|
+
itemCount: number;
|
|
12
|
+
flushed: boolean;
|
|
13
|
+
status: string;
|
|
14
|
+
}>>;
|
|
15
|
+
export declare const flushBatch: import("convex/server").RegisteredMutation<"public", {
|
|
16
|
+
batchId: string;
|
|
17
|
+
}, Promise<{
|
|
18
|
+
batchId: string;
|
|
19
|
+
itemCount: number;
|
|
20
|
+
flushed: boolean;
|
|
21
|
+
reason: string;
|
|
22
|
+
status?: undefined;
|
|
23
|
+
} | {
|
|
24
|
+
batchId: string;
|
|
25
|
+
itemCount: number;
|
|
26
|
+
flushed: boolean;
|
|
27
|
+
status: string;
|
|
28
|
+
reason?: undefined;
|
|
29
|
+
}>>;
|
|
30
|
+
export declare const getBatchStatus: import("convex/server").RegisteredQuery<"public", {
|
|
31
|
+
batchId: string;
|
|
32
|
+
}, Promise<{
|
|
33
|
+
batchId: string;
|
|
34
|
+
batches: {
|
|
35
|
+
status: "accumulating" | "flushing";
|
|
36
|
+
itemCount: number;
|
|
37
|
+
createdAt: number;
|
|
38
|
+
lastUpdatedAt: number;
|
|
39
|
+
}[];
|
|
40
|
+
config: {
|
|
41
|
+
maxBatchSize: number;
|
|
42
|
+
flushIntervalMs: number;
|
|
43
|
+
};
|
|
44
|
+
} | null>>;
|
|
45
|
+
export declare const getAllBatchesForBaseId: import("convex/server").RegisteredQuery<"public", {
|
|
46
|
+
baseBatchId: string;
|
|
47
|
+
}, Promise<{
|
|
48
|
+
batchId: string;
|
|
49
|
+
baseBatchId: string;
|
|
50
|
+
sequence: number;
|
|
51
|
+
itemCount: number;
|
|
52
|
+
status: "accumulating" | "flushing" | "completed";
|
|
53
|
+
createdAt: number;
|
|
54
|
+
lastUpdatedAt: number;
|
|
55
|
+
}[]>>;
|
|
56
|
+
export declare const getFlushHistory: import("convex/server").RegisteredQuery<"public", {
|
|
57
|
+
limit?: number | undefined;
|
|
58
|
+
batchId: string;
|
|
59
|
+
}, Promise<{
|
|
60
|
+
_id: import("convex/values").GenericId<"flushHistory">;
|
|
61
|
+
_creationTime: number;
|
|
62
|
+
errorMessage?: string | undefined;
|
|
63
|
+
batchId: string;
|
|
64
|
+
itemCount: number;
|
|
65
|
+
flushedAt: number;
|
|
66
|
+
durationMs: number;
|
|
67
|
+
success: boolean;
|
|
68
|
+
}[]>>;
|
|
69
|
+
export declare const deleteBatch: import("convex/server").RegisteredMutation<"public", {
|
|
70
|
+
batchId: string;
|
|
71
|
+
}, Promise<{
|
|
72
|
+
deleted: boolean;
|
|
73
|
+
reason: string;
|
|
74
|
+
} | {
|
|
75
|
+
deleted: boolean;
|
|
76
|
+
reason?: undefined;
|
|
77
|
+
}>>;
|
|
78
|
+
export declare const getBatch: import("convex/server").RegisteredQuery<"internal", {
|
|
79
|
+
batchId: string;
|
|
80
|
+
}, Promise<{
|
|
81
|
+
_id: import("convex/values").GenericId<"batches">;
|
|
82
|
+
_creationTime: number;
|
|
83
|
+
scheduledFlushId?: import("convex/values").GenericId<"_scheduled_functions"> | undefined;
|
|
84
|
+
flushStartedAt?: number | undefined;
|
|
85
|
+
batchId: string;
|
|
86
|
+
config: {
|
|
87
|
+
maxBatchSize: number;
|
|
88
|
+
flushIntervalMs: number;
|
|
89
|
+
processBatchHandle: string;
|
|
90
|
+
};
|
|
91
|
+
baseBatchId: string;
|
|
92
|
+
status: "accumulating" | "flushing" | "completed";
|
|
93
|
+
sequence: number;
|
|
94
|
+
createdAt: number;
|
|
95
|
+
lastUpdatedAt: number;
|
|
96
|
+
} | null>>;
|
|
97
|
+
export declare const collectBatchItems: import("convex/server").RegisteredQuery<"internal", {
|
|
98
|
+
batchDocId: import("convex/values").GenericId<"batches">;
|
|
99
|
+
}, Promise<{
|
|
100
|
+
items: never[];
|
|
101
|
+
flushStartedAt: undefined;
|
|
102
|
+
} | {
|
|
103
|
+
items: unknown[];
|
|
104
|
+
flushStartedAt: number;
|
|
105
|
+
}>>;
|
|
106
|
+
type FlushTransitionResult = {
|
|
107
|
+
flushed: true;
|
|
108
|
+
itemCount: number;
|
|
109
|
+
} | {
|
|
110
|
+
flushed: false;
|
|
111
|
+
reason: string;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* maybeFlush - Attempts to transition a batch from "accumulating" to "flushing" state.
|
|
115
|
+
*
|
|
116
|
+
* This is an internal action scheduled by addItems (when threshold is reached) or
|
|
117
|
+
* flushBatch (for manual flushes). It serves as a lightweight coordinator that
|
|
118
|
+
* delegates the actual state transition to doFlushTransition (a mutation).
|
|
119
|
+
*
|
|
120
|
+
* ## Why this architecture?
|
|
121
|
+
*
|
|
122
|
+
* 1. **OCC is handled automatically by Convex**: When doFlushTransition (a mutation)
|
|
123
|
+
* encounters an OCC conflict, Convex automatically retries it. We don't need
|
|
124
|
+
* external retry logic like ActionRetrier for database operations.
|
|
125
|
+
*
|
|
126
|
+
* 2. **Race conditions are handled gracefully**: Multiple maybeFlush calls can be
|
|
127
|
+
* scheduled concurrently (e.g., rapid addItems calls all hitting threshold).
|
|
128
|
+
* The first one to execute wins the race and transitions the batch to "flushing".
|
|
129
|
+
* Subsequent calls see status !== "accumulating" and return early with
|
|
130
|
+
* reason: "not_accumulating". This is expected behavior, not an error.
|
|
131
|
+
*
|
|
132
|
+
* 3. **Mutations can't call actions directly**: Convex mutations are deterministic
|
|
133
|
+
* and can't have side effects. To execute the user's processBatchHandle (an action),
|
|
134
|
+
* we need this action layer. The flow is:
|
|
135
|
+
* mutation (addItems) → schedules action (maybeFlush)
|
|
136
|
+
* action (maybeFlush) → calls mutation (doFlushTransition)
|
|
137
|
+
* mutation (doFlushTransition) → schedules action (executeFlush)
|
|
138
|
+
*
|
|
139
|
+
* 4. **Non-blocking for callers**: addItems returns immediately after scheduling
|
|
140
|
+
* maybeFlush. Users don't wait for the flush to complete.
|
|
141
|
+
*
|
|
142
|
+
* ## Failure scenarios
|
|
143
|
+
*
|
|
144
|
+
* - If maybeFlush fails completely (rare), the batch stays in "accumulating" state.
|
|
145
|
+
* The next addItems call that hits threshold will schedule another maybeFlush.
|
|
146
|
+
* - If a scheduled interval flush exists, it will also attempt the transition.
|
|
147
|
+
*
|
|
148
|
+
* @param batchDocId - The batch document ID to potentially flush
|
|
149
|
+
* @param force - If true, flush regardless of threshold (used by manual flush and interval timer)
|
|
150
|
+
*/
|
|
151
|
+
export declare const maybeFlush: import("convex/server").RegisteredAction<"internal", {
|
|
152
|
+
force?: boolean | undefined;
|
|
153
|
+
batchDocId: import("convex/values").GenericId<"batches">;
|
|
154
|
+
}, Promise<void>>;
|
|
155
|
+
/**
|
|
156
|
+
* doFlushTransition - The actual state machine transition from "accumulating" to "flushing".
|
|
157
|
+
*
|
|
158
|
+
* This mutation is the source of truth for batch state transitions. It's designed to be
|
|
159
|
+
* idempotent and race-condition safe:
|
|
160
|
+
*
|
|
161
|
+
* - Returns early if batch is already flushing/completed (another caller won the race)
|
|
162
|
+
* - Returns early if batch is empty or below threshold (unless force=true)
|
|
163
|
+
* - On success, atomically updates status and schedules executeFlush
|
|
164
|
+
*
|
|
165
|
+
* OCC (Optimistic Concurrency Control) note:
|
|
166
|
+
* If two doFlushTransition calls race, Convex detects the conflict when both try to
|
|
167
|
+
* patch the same batch document. One succeeds, the other is auto-retried by Convex.
|
|
168
|
+
* On retry, it sees status="flushing" and returns { flushed: false, reason: "not_accumulating" }.
|
|
169
|
+
*/
|
|
170
|
+
export declare const doFlushTransition: import("convex/server").RegisteredMutation<"internal", {
|
|
171
|
+
force?: boolean | undefined;
|
|
172
|
+
batchDocId: import("convex/values").GenericId<"batches">;
|
|
173
|
+
}, Promise<FlushTransitionResult>>;
|
|
174
|
+
export declare const executeFlush: import("convex/server").RegisteredAction<"internal", {
|
|
175
|
+
processBatchHandle: string;
|
|
176
|
+
batchDocId: import("convex/values").GenericId<"batches">;
|
|
177
|
+
}, Promise<{
|
|
178
|
+
success: boolean;
|
|
179
|
+
durationMs: number;
|
|
180
|
+
errorMessage?: undefined;
|
|
181
|
+
} | {
|
|
182
|
+
success: boolean;
|
|
183
|
+
errorMessage: string | undefined;
|
|
184
|
+
durationMs: number;
|
|
185
|
+
}>>;
|
|
186
|
+
export declare const recordFlushResult: import("convex/server").RegisteredMutation<"internal", {
|
|
187
|
+
flushStartedAt?: number | undefined;
|
|
188
|
+
errorMessage?: string | undefined;
|
|
189
|
+
batchDocId: import("convex/values").GenericId<"batches">;
|
|
190
|
+
itemCount: number;
|
|
191
|
+
durationMs: number;
|
|
192
|
+
success: boolean;
|
|
193
|
+
}, Promise<void>>;
|
|
194
|
+
/**
|
|
195
|
+
* scheduledIntervalFlush - Timer-triggered flush that runs after flushIntervalMs.
|
|
196
|
+
*
|
|
197
|
+
* Scheduled once when a batch is created (if flushIntervalMs > 0). Uses force=true
|
|
198
|
+
* to flush regardless of whether the batch has reached maxBatchSize threshold.
|
|
199
|
+
* This ensures batches don't sit indefinitely waiting for more items.
|
|
200
|
+
*/
|
|
201
|
+
export declare const scheduledIntervalFlush: import("convex/server").RegisteredAction<"internal", {
|
|
202
|
+
batchDocId: import("convex/values").GenericId<"batches">;
|
|
203
|
+
}, Promise<void>>;
|
|
204
|
+
export declare const startIteratorJob: import("convex/server").RegisteredMutation<"public", {
|
|
205
|
+
jobId: string;
|
|
206
|
+
config: {
|
|
207
|
+
delayBetweenBatchesMs?: number | undefined;
|
|
208
|
+
onCompleteHandle?: string | undefined;
|
|
209
|
+
maxRetries?: number | undefined;
|
|
210
|
+
batchSize: number;
|
|
211
|
+
processBatchHandle: string;
|
|
212
|
+
getNextBatchHandle: string;
|
|
213
|
+
};
|
|
214
|
+
}, Promise<{
|
|
215
|
+
jobId: string;
|
|
216
|
+
status: string;
|
|
217
|
+
}>>;
|
|
218
|
+
export declare const pauseIteratorJob: import("convex/server").RegisteredMutation<"public", {
|
|
219
|
+
jobId: string;
|
|
220
|
+
}, Promise<{
|
|
221
|
+
jobId: string;
|
|
222
|
+
status: string;
|
|
223
|
+
}>>;
|
|
224
|
+
export declare const resumeIteratorJob: import("convex/server").RegisteredMutation<"public", {
|
|
225
|
+
jobId: string;
|
|
226
|
+
}, Promise<{
|
|
227
|
+
jobId: string;
|
|
228
|
+
status: string;
|
|
229
|
+
}>>;
|
|
230
|
+
export declare const cancelIteratorJob: import("convex/server").RegisteredMutation<"public", {
|
|
231
|
+
jobId: string;
|
|
232
|
+
}, Promise<{
|
|
233
|
+
jobId: string;
|
|
234
|
+
status: "completed" | "failed";
|
|
235
|
+
reason: string;
|
|
236
|
+
} | {
|
|
237
|
+
jobId: string;
|
|
238
|
+
status: string;
|
|
239
|
+
reason?: undefined;
|
|
240
|
+
}>>;
|
|
241
|
+
export declare const getIteratorJobStatus: import("convex/server").RegisteredQuery<"public", {
|
|
242
|
+
jobId: string;
|
|
243
|
+
}, Promise<{
|
|
244
|
+
jobId: string;
|
|
245
|
+
status: "completed" | "pending" | "running" | "paused" | "failed";
|
|
246
|
+
processedCount: number;
|
|
247
|
+
cursor: string | undefined;
|
|
248
|
+
retryCount: number;
|
|
249
|
+
errorMessage: string | undefined;
|
|
250
|
+
createdAt: number;
|
|
251
|
+
lastRunAt: number | undefined;
|
|
252
|
+
config: {
|
|
253
|
+
batchSize: number;
|
|
254
|
+
delayBetweenBatchesMs: number;
|
|
255
|
+
};
|
|
256
|
+
} | null>>;
|
|
257
|
+
export declare const listIteratorJobs: import("convex/server").RegisteredQuery<"public", {
|
|
258
|
+
limit?: number | undefined;
|
|
259
|
+
status?: "completed" | "pending" | "running" | "paused" | "failed" | undefined;
|
|
260
|
+
}, Promise<{
|
|
261
|
+
jobId: string;
|
|
262
|
+
status: "completed" | "pending" | "running" | "paused" | "failed";
|
|
263
|
+
processedCount: number;
|
|
264
|
+
createdAt: number;
|
|
265
|
+
lastRunAt: number | undefined;
|
|
266
|
+
errorMessage: string | undefined;
|
|
267
|
+
}[]>>;
|
|
268
|
+
export declare const deleteIteratorJob: import("convex/server").RegisteredMutation<"public", {
|
|
269
|
+
jobId: string;
|
|
270
|
+
}, Promise<{
|
|
271
|
+
deleted: boolean;
|
|
272
|
+
reason: string;
|
|
273
|
+
} | {
|
|
274
|
+
deleted: boolean;
|
|
275
|
+
reason?: undefined;
|
|
276
|
+
}>>;
|
|
277
|
+
export declare const getIteratorJob: import("convex/server").RegisteredQuery<"internal", {
|
|
278
|
+
jobId: string;
|
|
279
|
+
}, Promise<{
|
|
280
|
+
_id: import("convex/values").GenericId<"iteratorJobs">;
|
|
281
|
+
_creationTime: number;
|
|
282
|
+
cursor?: string | undefined;
|
|
283
|
+
errorMessage?: string | undefined;
|
|
284
|
+
lastRunAt?: number | undefined;
|
|
285
|
+
jobId: string;
|
|
286
|
+
processedCount: number;
|
|
287
|
+
config: {
|
|
288
|
+
onCompleteHandle?: string | undefined;
|
|
289
|
+
maxRetries?: number | undefined;
|
|
290
|
+
batchSize: number;
|
|
291
|
+
processBatchHandle: string;
|
|
292
|
+
delayBetweenBatchesMs: number;
|
|
293
|
+
getNextBatchHandle: string;
|
|
294
|
+
};
|
|
295
|
+
status: "completed" | "pending" | "running" | "paused" | "failed";
|
|
296
|
+
createdAt: number;
|
|
297
|
+
retryCount: number;
|
|
298
|
+
} | null>>;
|
|
299
|
+
export declare const getIteratorJobById: import("convex/server").RegisteredQuery<"internal", {
|
|
300
|
+
jobDocId: import("convex/values").GenericId<"iteratorJobs">;
|
|
301
|
+
}, Promise<{
|
|
302
|
+
_id: import("convex/values").GenericId<"iteratorJobs">;
|
|
303
|
+
_creationTime: number;
|
|
304
|
+
cursor?: string | undefined;
|
|
305
|
+
errorMessage?: string | undefined;
|
|
306
|
+
lastRunAt?: number | undefined;
|
|
307
|
+
jobId: string;
|
|
308
|
+
processedCount: number;
|
|
309
|
+
config: {
|
|
310
|
+
onCompleteHandle?: string | undefined;
|
|
311
|
+
maxRetries?: number | undefined;
|
|
312
|
+
batchSize: number;
|
|
313
|
+
processBatchHandle: string;
|
|
314
|
+
delayBetweenBatchesMs: number;
|
|
315
|
+
getNextBatchHandle: string;
|
|
316
|
+
};
|
|
317
|
+
status: "completed" | "pending" | "running" | "paused" | "failed";
|
|
318
|
+
createdAt: number;
|
|
319
|
+
retryCount: number;
|
|
320
|
+
} | null>>;
|
|
321
|
+
export declare const processNextBatch: import("convex/server").RegisteredAction<"internal", {
|
|
322
|
+
jobDocId: import("convex/values").GenericId<"iteratorJobs">;
|
|
323
|
+
}, Promise<{
|
|
324
|
+
processed: boolean;
|
|
325
|
+
done?: boolean;
|
|
326
|
+
processedCount?: number;
|
|
327
|
+
reason?: string;
|
|
328
|
+
error?: string;
|
|
329
|
+
retryCount?: number;
|
|
330
|
+
}>>;
|
|
331
|
+
export declare const updateJobProgress: import("convex/server").RegisteredMutation<"internal", {
|
|
332
|
+
cursor?: string | undefined;
|
|
333
|
+
processedCount: number;
|
|
334
|
+
jobDocId: import("convex/values").GenericId<"iteratorJobs">;
|
|
335
|
+
}, Promise<void>>;
|
|
336
|
+
export declare const markJobCompleted: import("convex/server").RegisteredMutation<"internal", {
|
|
337
|
+
processedCount: number;
|
|
338
|
+
jobDocId: import("convex/values").GenericId<"iteratorJobs">;
|
|
339
|
+
}, Promise<void>>;
|
|
340
|
+
export declare const markJobFailed: import("convex/server").RegisteredMutation<"internal", {
|
|
341
|
+
retryCount: number;
|
|
342
|
+
errorMessage: string;
|
|
343
|
+
jobDocId: import("convex/values").GenericId<"iteratorJobs">;
|
|
344
|
+
}, Promise<void>>;
|
|
345
|
+
export declare const incrementRetryCount: import("convex/server").RegisteredMutation<"internal", {
|
|
346
|
+
retryCount: number;
|
|
347
|
+
errorMessage: string;
|
|
348
|
+
jobDocId: import("convex/values").GenericId<"iteratorJobs">;
|
|
349
|
+
}, Promise<void>>;
|
|
350
|
+
export {};
|
|
351
|
+
//# sourceMappingURL=lib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;GA8FnB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;GAwDrB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;gBA6CE,cAAc,GAAG,UAAU;;;;;;;;;UAiBtD,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;KAiCjC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;KAiB1B,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;GAuCtB,CAAC;AAMH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;UAQnB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;GA0B5B,CAAC;AAGH,KAAK,qBAAqB,GACvB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,UAAU;;;iBAcrB,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB;;;kCAqD5B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;GA+CvB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;iBAgH5B,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;iBASjC,CAAC;AAMH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;GA8C3B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;GAsB3B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;GAyB5B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;GAuB5B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;UA2B/B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;KAmC3B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;GAmB5B,CAAC;AAMH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;UAQzB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;UAK7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;eAGhB,OAAO;WACX,OAAO;qBACG,MAAM;aACd,MAAM;YACP,MAAM;iBACD,MAAM;GA+FnB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;iBAc5B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;iBAY3B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;iBAcxB,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;iBAa9B,CAAC"}
|