@transactional-reducer/core 0.0.1 → 0.0.2

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"Transaction.d.ts","sourceRoot":"","sources":["../src/Transaction.ts"],"names":[],"mappings":"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"}
@@ -1,408 +0,0 @@
1
- export function _generateId() {
2
- return `tx_${Date.now()}_${Math.random().toString(36).slice(2)}`;
3
- }
4
- export function _getAllDescendants(txId, transactions) {
5
- const result = [];
6
- for (const [, tx] of transactions) {
7
- if (tx.parentId === txId) {
8
- result.push(tx.id, ..._getAllDescendants(tx.id, transactions));
9
- }
10
- }
11
- return result;
12
- }
13
- export function _isDescendantOf(candidateTxId, ancestorTxId, transactions) {
14
- if (candidateTxId === null)
15
- return false;
16
- let current = candidateTxId;
17
- while (current !== null) {
18
- if (current === ancestorTxId)
19
- return true;
20
- const record = transactions.get(current);
21
- current = record?.parentId ?? null;
22
- }
23
- return false;
24
- }
25
- export function _cleanupCommittedDescendants(parentId, transactions) {
26
- for (const [id, tx] of transactions) {
27
- if (tx.parentId === parentId && tx.status === "committed") {
28
- transactions.delete(id);
29
- _cleanupCommittedDescendants(id, transactions);
30
- }
31
- }
32
- }
33
- // ─── Transaction ────────────────────────────────────────────────────────────
34
- //
35
- // 每个 Transaction 对象是一个句柄,闭包绑定到其 id 和 generation。
36
- // 当 createTx 用相同 id 替换活跃事务时(去重机制),旧句柄变为"过期"——
37
- // 其 generation 不再匹配 generationRef,transactionsRef 中该 id 对应的
38
- // 对象也已替换。对过期句柄的所有操作会被静默忽略或抛出错误,防止过期
39
- // 的异步回调干扰新事务。
40
- //
41
- // parentId 是故意可变的(非 readonly)。当父事务回滚且 onError:"commit"
42
- // 的子事务被保留时,子事务的 parentId 被设为 null——它成为独立的根事务,
43
- // 因为它的父事务已不存在。
44
- // ────────────────────────────────────────────────────────────────────────────
45
- export class Transaction {
46
- id;
47
- parentId;
48
- onError;
49
- generation;
50
- snapshot;
51
- snapshotIndex;
52
- status = "active";
53
- cancelCallbacks = [];
54
- engine;
55
- constructor(engine, id, parentId, onError, generation, snapshot, snapshotIndex) {
56
- this.engine = engine;
57
- this.id = id;
58
- this.parentId = parentId;
59
- this.onError = onError;
60
- this.generation = generation;
61
- this.snapshot = snapshot;
62
- this.snapshotIndex = snapshotIndex;
63
- }
64
- // 句柄过期的条件:
65
- // 1. transactionsRef 中该 id 对应的是不同的对象(被 createTx 替换),
66
- // 2. 或该句柄的 status 不再是 "active"(已提交/已回滚)。
67
- // 两个条件都必须检查——回滚后句柄从 transactionsRef 中删除,
68
- // 所以 `current !== this` 为 true;提交后 status 变化,
69
- // 所以 `this.status !== "active"` 为 true。
70
- isStale() {
71
- const current = this.engine.transactionsRef.current.get(this.id);
72
- return current !== this || this.status !== "active";
73
- }
74
- onCancel(callback) {
75
- if (this.isStale()) {
76
- callback();
77
- return;
78
- }
79
- this.cancelCallbacks.push(callback);
80
- }
81
- dispatch(action) {
82
- if (this.isStale())
83
- return;
84
- this.engine.actionLogRef.current.push({
85
- action,
86
- txId: this.id,
87
- generation: this.generation,
88
- });
89
- this.engine._applyAction(action);
90
- }
91
- // spawn 在创建子事务前执行三重过期检查:
92
- // 1. 身份检查:transactionsRef 中该 id 必须持有此对象本身
93
- // 2. 状态检查:此句柄的 status 必须仍为 "active"
94
- // 3. generation 检查:此句柄的 generation 必须匹配 generationRef
95
- // generation 检查至关重要:当 createTx 用相同 id 替换事务时,
96
- // 旧句柄的 generation 不匹配 generationRef 中的新 generation。
97
- // 没有此检查,过期句柄可能在新事务下派生子事务。
98
- spawn(task, options) {
99
- const current = this.engine.transactionsRef.current.get(this.id);
100
- if (current !== this ||
101
- this.status !== "active" ||
102
- this.generation !== this.engine.generationRef.current.get(this.id)) {
103
- throw new Error(`Cannot spawn from transaction "${this.id}": parent is no longer active`);
104
- }
105
- // 子事务 id 就是用户传入的值——不与父事务 id 自动拼接。
106
- // 这意味着用户控制完整 id,并负责避免意外冲突。
107
- // 去重机制(createTx 回滚相同 id 的活跃事务)提供了
108
- // 有意的取消功能:例如 start({id:"validate_name"}) 会取消
109
- // 之前的 validate_name 任务。
110
- const childId = options?.id ?? _generateId();
111
- const childOnError = options?.onError ?? "rollback";
112
- const childOnDuplicate = options?.onDuplicate ?? this.engine.options?.onDuplicate ?? "rollback";
113
- if (childOnDuplicate === "reuse" && options?.id) {
114
- const existingChild = this.engine.transactionsRef.current.get(options.id);
115
- if (existingChild?.status === "active") {
116
- throw new Error(`Cannot spawn: transaction "${options.id}" is already active`);
117
- }
118
- }
119
- const childTx = this.engine._createTx(childId, this.id, childOnError, childOnDuplicate);
120
- return this.engine._runWithTx(childTx, task);
121
- }
122
- commit() {
123
- if (this.isStale())
124
- return;
125
- this._commit();
126
- }
127
- rollback() {
128
- if (this.isStale())
129
- return;
130
- this._rollback();
131
- }
132
- // ─── _commit ──────────────────────────────────────────────────────────
133
- //
134
- // 子事务提交:仅将 status 标记为 "committed"。记录保留在
135
- // transactionsRef 中,父事务仍可管理它(父事务回滚也会回滚
136
- // 已提交的子事务)。父事务的 _commit 或 _rollback 最终会
137
- // 清理已提交子事务的记录。
138
- //
139
- // 根事务提交:通过以下步骤完成事务:
140
- // 1. 将此事务(及其后代)的所有 action log 条目重新标记为
141
- // 普通 dispatch(txId: null)。这使它们成为永久性的——
142
- // 在任何未来的回滚重放中都会保留。
143
- // 2. 从 transactionsRef 中删除根事务记录。
144
- // 3. 清理已提交的后代记录(根事务已消失,这些记录不再有意义)。
145
- // 4. 如果没有活跃事务剩余,清空整个 action log 和事务映射——
146
- // 不可能再发生回滚,日志是不必要的开销。
147
- // ────────────────────────────────────────────────────────────────────────
148
- _commit() {
149
- if (this.parentId !== null) {
150
- this.status = "committed";
151
- }
152
- else {
153
- this.status = "committed";
154
- for (let i = this.snapshotIndex; i < this.engine.actionLogRef.current.length; i++) {
155
- const entry = this.engine.actionLogRef.current[i];
156
- if (entry.skipped)
157
- continue;
158
- if (entry.txId === this.id ||
159
- _isDescendantOf(entry.txId, this.id, this.engine.transactionsRef.current)) {
160
- this.engine.actionLogRef.current[i] = {
161
- action: entry.action,
162
- txId: null,
163
- generation: 0,
164
- };
165
- }
166
- }
167
- this.engine.transactionsRef.current.delete(this.id);
168
- _cleanupCommittedDescendants(this.id, this.engine.transactionsRef.current);
169
- if (!this._hasActiveTransactions()) {
170
- this.engine.actionLogRef.current = [];
171
- this.engine.transactionsRef.current.clear();
172
- this.engine.generationRef.current.clear();
173
- }
174
- }
175
- }
176
- // ─── _rollback ────────────────────────────────────────────────────────
177
- //
178
- // 回滚不是简单的"恢复快照"——而是快照 + 重放。
179
- // 这确保回滚仅撤销目标事务的变更,同时保留以下变更:
180
- // - 事务期间发生的普通(非事务)dispatch
181
- // - 并发兄弟事务的 action
182
- // - onError:"commit" 的后代(提交边界)
183
- //
184
- // 算法步骤:
185
- // 阶段 1:将后代分类为 preserveSet 和 rollbackSet
186
- // 阶段 2:在 action log 中将 rollbackSet 的 action 标记为 skipped
187
- // 阶段 3:将 preserveSet 的 action 重新标记为普通 dispatch(txId: null)
188
- // 阶段 4:从快照重放,跳过已回滚的 action
189
- // 阶段 5:更新状态、删除记录、分离保留的事务
190
- // 阶段 6:若无活跃事务剩余则最终清理
191
- //
192
- // ── 阶段 1:preserveSet 分类 ──────────────────────────────────────
193
- //
194
- // onError:"commit" 创建"提交边界"——其下的整个子树被保留。
195
- // 不能选择性回滚提交子树内的后代,因为它们的 dispatch 是基于
196
- // 父事务中间状态计算的;移除父事务的 action 会使后代的 dispatch
197
- // 不一致。
198
- //
199
- // `underPreserve` 遍历防止双重保留:如果 onError:"commit" 的后代
200
- // 有一个祖先已在 preserveSet 中,它已被该祖先的提交边界覆盖,
201
- // 不需要单独保留。这在菱形事务层级中很重要,同一后代可能通过
202
- // 多条路径到达。
203
- //
204
- // ── 阶段 3:重新标记 preserveSet ──────────────────────────────────
205
- //
206
- // 仅将已提交的保留子事务的 action 重新标记为普通 dispatch(txId: null)。
207
- // 活跃的保留子事务保持原 txId,以便后续回滚/提交时能识别自己的 action。
208
- // 已提交的保留子事务即将被删除,其 action 需变为永久性的。
209
- //
210
- // 必须在阶段 2 之后执行,以免保留的 action(txId 变为 null 后)
211
- // 被 rollbackSet 检查意外捕获。
212
- //
213
- // ── 阶段 5:分离保留的事务 ────────────────────────────────────────
214
- //
215
- // 回滚后,保留的事务需要变为独立的:
216
- // - 已提交的保留事务:删除(其工作已完成,action 已成为日志中的
217
- // 普通 dispatch)
218
- // - 活跃的保留事务:parentId 设为 null(成为根事务,
219
- // 因为已回滚的父事务不再存在),并更新 snapshot 为不含自身
220
- // action 的正确基础状态(从回滚事务的 snapshot 重放,
221
- // 跳过 rollbackSet 和子事务自己的 action)
222
- //
223
- // 然后对每个活跃保留事务调用 _cleanupCommittedDescendants,
224
- // 清理其子树中已提交的子事务。现在安全了,因为保留事务已是独立根。
225
- // ────────────────────────────────────────────────────────────────────────
226
- _rollback() {
227
- if (this.isStale())
228
- return;
229
- const descendants = _getAllDescendants(this.id, this.engine.transactionsRef.current);
230
- // 阶段 1:分类后代
231
- const preserveSet = new Set();
232
- const visited = new Set();
233
- for (const descId of descendants) {
234
- if (visited.has(descId))
235
- continue;
236
- const descTx = this.engine.transactionsRef.current.get(descId);
237
- if (descTx?.onError === "commit") {
238
- // 从 descTx 向上遍历到 this.id,检查是否有中间祖先
239
- // 已在 preserveSet 中。如果有,descTx 已被该祖先的
240
- // 提交边界覆盖。
241
- let underPreserve = false;
242
- let current = descTx.parentId;
243
- while (current !== null && current !== this.id) {
244
- if (preserveSet.has(current)) {
245
- underPreserve = true;
246
- break;
247
- }
248
- current =
249
- this.engine.transactionsRef.current.get(current)?.parentId ?? null;
250
- }
251
- if (!underPreserve) {
252
- // 此后代是提交边界。保留它及其整个子树
253
- // (不能部分保留子树)。
254
- preserveSet.add(descId);
255
- const subDescendants = _getAllDescendants(descId, this.engine.transactionsRef.current);
256
- for (const subId of subDescendants) {
257
- preserveSet.add(subId);
258
- visited.add(subId);
259
- }
260
- }
261
- }
262
- visited.add(descId);
263
- }
264
- const rollbackSet = new Set();
265
- rollbackSet.add(this.id);
266
- for (const descId of descendants) {
267
- if (!preserveSet.has(descId)) {
268
- rollbackSet.add(descId);
269
- }
270
- }
271
- // 阶段 2:将回滚 action 标记为 skipped
272
- for (let i = this.snapshotIndex; i < this.engine.actionLogRef.current.length; i++) {
273
- const entry = this.engine.actionLogRef.current[i];
274
- if (entry.txId !== null && rollbackSet.has(entry.txId)) {
275
- entry.skipped = true;
276
- }
277
- }
278
- // 阶段 3:将保留的 action 重新标记为普通 dispatch
279
- // 必须在阶段 2 之后执行,以免保留的 action(txId 变为 null 后)
280
- // 被 rollbackSet 检查意外捕获。
281
- for (let i = this.snapshotIndex; i < this.engine.actionLogRef.current.length; i++) {
282
- const entry = this.engine.actionLogRef.current[i];
283
- if (!entry.skipped && entry.txId !== null && preserveSet.has(entry.txId)) {
284
- const preservedTx = this.engine.transactionsRef.current.get(entry.txId);
285
- if (preservedTx?.status === "committed") {
286
- this.engine.actionLogRef.current[i] = {
287
- action: entry.action,
288
- txId: null,
289
- generation: 0,
290
- };
291
- }
292
- }
293
- }
294
- // 阶段 4:从快照重放,跳过已回滚的 action
295
- let replayState = this.snapshot;
296
- for (let i = this.snapshotIndex; i < this.engine.actionLogRef.current.length; i++) {
297
- const entry = this.engine.actionLogRef.current[i];
298
- if (entry.skipped)
299
- continue;
300
- replayState = this.engine.reducer(replayState, entry.action);
301
- }
302
- // 在删除前将回滚记录标记为 rolledback(可能被尚未完成的
303
- // 异步回调引用)
304
- for (const id of rollbackSet) {
305
- const record = this.engine.transactionsRef.current.get(id);
306
- if (record)
307
- record.status = "rolledback";
308
- }
309
- this.engine.stateRef.current = replayState;
310
- this.engine._notify();
311
- // 触发 rollbackSet 中每个事务的 onCancel 回调。
312
- // 使用 copy-and-clear 模式防止双重触发和重入注册。
313
- for (const id of rollbackSet) {
314
- const record = this.engine.transactionsRef.current.get(id);
315
- if (record?.cancelCallbacks.length) {
316
- const callbacks = [...record.cancelCallbacks];
317
- record.cancelCallbacks = [];
318
- for (const cb of callbacks)
319
- cb();
320
- }
321
- }
322
- // 从 transactionsRef 中删除已回滚的记录
323
- for (const id of rollbackSet) {
324
- this.engine.transactionsRef.current.delete(id);
325
- }
326
- // 阶段 5:分离保留的事务
327
- for (const id of preserveSet) {
328
- const record = this.engine.transactionsRef.current.get(id);
329
- if (record) {
330
- if (record.status === "committed") {
331
- this.engine.transactionsRef.current.delete(id);
332
- }
333
- else if (record.status === "active") {
334
- const needsDetach = record.parentId !== null && rollbackSet.has(record.parentId);
335
- if (needsDetach) {
336
- record.parentId = null;
337
- const childDescendants = _getAllDescendants(id, this.engine.transactionsRef.current);
338
- const childOwnSet = new Set();
339
- childOwnSet.add(id);
340
- for (const descId of childDescendants) {
341
- childOwnSet.add(descId);
342
- }
343
- let newSnapshot = this.snapshot;
344
- for (let i = this.snapshotIndex; i < this.engine.actionLogRef.current.length; i++) {
345
- const entry = this.engine.actionLogRef.current[i];
346
- if (entry.skipped)
347
- continue;
348
- if (entry.txId !== null && (rollbackSet.has(entry.txId) || childOwnSet.has(entry.txId)))
349
- continue;
350
- newSnapshot = this.engine.reducer(newSnapshot, entry.action);
351
- }
352
- record.snapshot = newSnapshot;
353
- }
354
- }
355
- }
356
- }
357
- // 清理每个活跃保留子树中已提交的后代。
358
- // 现在安全了,因为保留事务已是独立根。
359
- for (const id of preserveSet) {
360
- const record = this.engine.transactionsRef.current.get(id);
361
- if (record?.status === "active") {
362
- _cleanupCommittedDescendants(id, this.engine.transactionsRef.current);
363
- }
364
- }
365
- // 阶段 6:若无活跃事务剩余,清空所有内容。
366
- // action log 仅用于回滚重放;没有活跃事务就不可能回滚,
367
- // 日志纯属开销。
368
- if (!this._hasActiveTransactions()) {
369
- this.engine.actionLogRef.current = [];
370
- this.engine.transactionsRef.current.clear();
371
- this.engine.generationRef.current.clear();
372
- }
373
- }
374
- // 仅回滚直接的活跃子事务,而非所有后代。
375
- // 每个子事务的 _rollback() 递归处理自己的子树,
376
- // 包括自己的 onError:"commit" 边界。
377
- _rollbackActiveDescendants() {
378
- const activeChildren = [];
379
- for (const [, tx] of this.engine.transactionsRef.current) {
380
- if (tx.parentId === this.id && tx.status === "active") {
381
- activeChildren.push(tx.id);
382
- }
383
- }
384
- for (const id of activeChildren) {
385
- const tx = this.engine.transactionsRef.current.get(id);
386
- if (tx?.status === "active") {
387
- tx._rollback();
388
- }
389
- }
390
- let replayState = this.snapshot;
391
- for (let i = this.snapshotIndex; i < this.engine.actionLogRef.current.length; i++) {
392
- const entry = this.engine.actionLogRef.current[i];
393
- if (entry.skipped)
394
- continue;
395
- replayState = this.engine.reducer(replayState, entry.action);
396
- }
397
- this.engine.stateRef.current = replayState;
398
- this.engine._notify();
399
- }
400
- _hasActiveTransactions() {
401
- for (const tx of this.engine.transactionsRef.current.values()) {
402
- if (tx.status === "active")
403
- return true;
404
- }
405
- return false;
406
- }
407
- }
408
- //# sourceMappingURL=Transaction.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Transaction.js","sourceRoot":"","sources":["../src/Transaction.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { Transaction, type Ref, type ActionLogEntry, type OnErrorStrategy, type OnDuplicateStrategy, type TransactionOptions, type TransactionHandle, type TransactionalReducerOptions, type TransactionEngine } from "./Transaction";
2
- export type { Ref, ActionLogEntry, OnErrorStrategy, OnDuplicateStrategy, TransactionOptions, TransactionHandle, TransactionalReducerOptions, };
3
- export type { Transaction };
4
- export declare class TransactionalReducer<S, A> implements TransactionEngine<S, A> {
5
- readonly reducer: (state: S, action: A) => S;
6
- readonly options: TransactionalReducerOptions<S> | undefined;
7
- readonly stateRef: Ref<S>;
8
- readonly actionLogRef: Ref<ActionLogEntry<A>[]>;
9
- readonly transactionsRef: Ref<Map<string, Transaction<S, A>>>;
10
- readonly generationRef: Ref<Map<string, number>>;
11
- private _listeners;
12
- constructor(reducer: (state: S, action: A) => S, initialState: S, options?: TransactionalReducerOptions<S>);
13
- get state(): S;
14
- subscribe(listener: (state: S) => void): () => void;
15
- _notify(): void;
16
- dispatch(action: A): void;
17
- run<R>(task: (tx: TransactionHandle<A>) => R, options?: TransactionOptions): R;
18
- create(options?: TransactionOptions): TransactionHandle<A>;
19
- getTransaction(id: string): TransactionHandle<A> | undefined;
20
- _applyAction(action: A): void;
21
- _createTx(id: string | undefined, parentId: string | null, onError: OnErrorStrategy, onDuplicate: OnDuplicateStrategy): Transaction<S, A>;
22
- _runWithTx<R>(tx: Transaction<S, A>, task: (tx: TransactionHandle<A>) => R): R;
23
- private _nextGeneration;
24
- private _hasActiveTransactions;
25
- }
26
- //# sourceMappingURL=TransactionalReducer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TransactionalReducer.d.ts","sourceRoot":"","sources":["../src/TransactionalReducer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAIX,KAAK,GAAG,EACR,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAA;AAEtB,YAAY,EACV,GAAG,EACH,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,2BAA2B,GAC5B,CAAA;AAED,YAAY,EAAE,WAAW,EAAE,CAAA;AAE3B,qBAAa,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAE,YAAW,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;IAC5D,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IACzB,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC/C,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7D,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAEhD,OAAO,CAAC,UAAU,CAAgC;gBAGhD,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EACnC,YAAY,EAAE,CAAC,EACf,OAAO,CAAC,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAU1C,IAAI,KAAK,IAAI,CAAC,CAEb;IAED,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAKnD,OAAO,IAAI,IAAI;IAUf,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;IAOzB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,CAAC;IAmB9E,MAAM,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAc1D,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS;IAI5D,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;IA0B7B,SAAS,CACP,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,mBAAmB,GAC/B,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IA4EpB,UAAU,CAAC,CAAC,EACV,EAAE,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EACrB,IAAI,EAAE,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,GACpC,CAAC;IAgDJ,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,sBAAsB;CAM/B"}