@soulbatical/tetra-core 0.1.36 → 0.1.38
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.
|
@@ -4,20 +4,9 @@
|
|
|
4
4
|
* Wraps a SupabaseClient so that every insert/update/upsert/delete on .from()
|
|
5
5
|
* also fires a fire-and-forget RPC to the Stella daemon's RuVectorStore.
|
|
6
6
|
*
|
|
7
|
-
* The proxy is transparent: it returns the same SupabaseClient interface,
|
|
8
|
-
* same return types, same behavior. RuVector sync failures are silently logged.
|
|
9
|
-
*
|
|
10
7
|
* Activation: set DUAL_WRITE=1 or STELLA_STORES=supabase,ruvector
|
|
11
8
|
*/
|
|
12
9
|
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
13
|
-
/**
|
|
14
|
-
* Check if dual-write is enabled via environment.
|
|
15
|
-
*/
|
|
16
10
|
export declare function isDualWriteEnabled(): boolean;
|
|
17
|
-
/**
|
|
18
|
-
* Wrap a SupabaseClient with dual-write proxy.
|
|
19
|
-
* Returns the same interface — all reads go to Supabase only,
|
|
20
|
-
* all writes go to both Supabase and RuVector daemon.
|
|
21
|
-
*/
|
|
22
11
|
export declare function withDualWrite(client: SupabaseClient): SupabaseClient;
|
|
23
12
|
//# sourceMappingURL=dualWriteProxy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualWriteProxy.d.ts","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dualWriteProxy.d.ts","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AA+R3D,wBAAgB,kBAAkB,IAAI,OAAO,CAI5C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CASpE"}
|
|
@@ -4,14 +4,10 @@
|
|
|
4
4
|
* Wraps a SupabaseClient so that every insert/update/upsert/delete on .from()
|
|
5
5
|
* also fires a fire-and-forget RPC to the Stella daemon's RuVectorStore.
|
|
6
6
|
*
|
|
7
|
-
* The proxy is transparent: it returns the same SupabaseClient interface,
|
|
8
|
-
* same return types, same behavior. RuVector sync failures are silently logged.
|
|
9
|
-
*
|
|
10
7
|
* Activation: set DUAL_WRITE=1 or STELLA_STORES=supabase,ruvector
|
|
11
8
|
*/
|
|
12
9
|
import { connect } from 'node:net';
|
|
13
10
|
const SOCKET_PATH = '/tmp/stella-daemon.sock';
|
|
14
|
-
const RPC_TIMEOUT_MS = 5_000;
|
|
15
11
|
// ─── Daemon RPC (lightweight, no dependency on stella) ──────
|
|
16
12
|
let daemonSocket = null;
|
|
17
13
|
let daemonConnected = false;
|
|
@@ -28,7 +24,7 @@ function connectDaemon() {
|
|
|
28
24
|
const timeout = setTimeout(() => {
|
|
29
25
|
sock.destroy();
|
|
30
26
|
daemonConnecting = false;
|
|
31
|
-
resolve();
|
|
27
|
+
resolve();
|
|
32
28
|
}, 2000);
|
|
33
29
|
sock.on('connect', () => {
|
|
34
30
|
clearTimeout(timeout);
|
|
@@ -46,11 +42,10 @@ function connectDaemon() {
|
|
|
46
42
|
daemonConnected = false;
|
|
47
43
|
daemonSocket = null;
|
|
48
44
|
daemonConnecting = false;
|
|
49
|
-
resolve();
|
|
45
|
+
resolve();
|
|
50
46
|
});
|
|
51
47
|
});
|
|
52
48
|
}
|
|
53
|
-
/** Fire-and-forget RPC to daemon. Never throws, never blocks. */
|
|
54
49
|
function daemonRpc(method, params) {
|
|
55
50
|
connectDaemon().then(() => {
|
|
56
51
|
if (!daemonSocket || !daemonConnected)
|
|
@@ -60,160 +55,215 @@ function daemonRpc(method, params) {
|
|
|
60
55
|
daemonSocket.write(JSON.stringify({ jsonrpc: '2.0', id, method, params }) + '\n');
|
|
61
56
|
}
|
|
62
57
|
catch {
|
|
63
|
-
// Socket write failed — daemon probably died, will reconnect next time
|
|
64
58
|
daemonConnected = false;
|
|
65
59
|
daemonSocket = null;
|
|
66
60
|
}
|
|
67
61
|
}).catch(() => { });
|
|
68
62
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
// Pass through everything else (select, rpc, etc.)
|
|
85
|
-
if (typeof value === 'function') {
|
|
86
|
-
return value.bind(target);
|
|
87
|
-
}
|
|
88
|
-
return value;
|
|
63
|
+
// ─── Mirror logic ───────────────────────────────────────────
|
|
64
|
+
function mirrorInsert(table, data) {
|
|
65
|
+
if (Array.isArray(data)) {
|
|
66
|
+
daemonRpc('store.seed', { table, records: data });
|
|
67
|
+
}
|
|
68
|
+
else if (data) {
|
|
69
|
+
daemonRpc('store.insert', { table, record: data });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function mirrorUpsert(table, data, onConflict) {
|
|
73
|
+
if (Array.isArray(data)) {
|
|
74
|
+
for (const record of data) {
|
|
75
|
+
daemonRpc('store.upsert', { table, record, onConflict });
|
|
89
76
|
}
|
|
90
|
-
}
|
|
77
|
+
}
|
|
78
|
+
else if (data) {
|
|
79
|
+
daemonRpc('store.upsert', { table, record: data, onConflict });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function mirrorUpdate(table, changes, filters) {
|
|
83
|
+
if (filters.length && changes) {
|
|
84
|
+
daemonRpc('store.update', { table, filters, changes });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function mirrorDelete(table, filters) {
|
|
88
|
+
if (filters.length) {
|
|
89
|
+
daemonRpc('store.delete', { table, filters });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
class DualWriteQueryBuilder {
|
|
93
|
+
original;
|
|
94
|
+
table;
|
|
95
|
+
constructor(original, table) {
|
|
96
|
+
this.original = original;
|
|
97
|
+
this.table = table;
|
|
98
|
+
}
|
|
99
|
+
// ─── Write methods with dual-write ───
|
|
100
|
+
insert(data, options) {
|
|
101
|
+
const result = this.original.insert(data, options);
|
|
102
|
+
return this.wrapResult(result, () => mirrorInsert(this.table, data));
|
|
103
|
+
}
|
|
104
|
+
upsert(data, options) {
|
|
105
|
+
const result = this.original.upsert(data, options);
|
|
106
|
+
const onConflict = options?.onConflict || 'id';
|
|
107
|
+
return this.wrapResult(result, () => mirrorUpsert(this.table, data, onConflict));
|
|
108
|
+
}
|
|
109
|
+
update(changes, options) {
|
|
110
|
+
const result = this.original.update(changes, options);
|
|
111
|
+
return this.wrapFilteredResult(result, (filters) => mirrorUpdate(this.table, changes, filters));
|
|
112
|
+
}
|
|
113
|
+
delete(options) {
|
|
114
|
+
const result = this.original.delete(options);
|
|
115
|
+
return this.wrapFilteredResult(result, (filters) => mirrorDelete(this.table, filters));
|
|
116
|
+
}
|
|
117
|
+
// ─── Read methods (pass-through) ───
|
|
118
|
+
select(...args) { return this.original.select(...args); }
|
|
119
|
+
// ─── Wrap a write result to trigger mirror on success ───
|
|
120
|
+
wrapResult(builder, onSuccess) {
|
|
121
|
+
return new DualWriteResultBuilder(builder, onSuccess);
|
|
122
|
+
}
|
|
123
|
+
wrapFilteredResult(builder, onSuccess) {
|
|
124
|
+
return new DualWriteFilterBuilder(builder, onSuccess);
|
|
125
|
+
}
|
|
91
126
|
}
|
|
92
127
|
/**
|
|
93
|
-
* Wraps
|
|
94
|
-
*
|
|
128
|
+
* Wraps a PostgREST result builder (after insert/upsert).
|
|
129
|
+
* Intercepts await/.then() to trigger the daemon mirror on success.
|
|
95
130
|
*/
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
131
|
+
class DualWriteResultBuilder {
|
|
132
|
+
builder;
|
|
133
|
+
onSuccess;
|
|
134
|
+
constructor(builder, onSuccess) {
|
|
135
|
+
this.builder = builder;
|
|
136
|
+
this.onSuccess = onSuccess;
|
|
137
|
+
}
|
|
138
|
+
// Chain methods — delegate to original, keep wrapping
|
|
139
|
+
select(...args) {
|
|
140
|
+
this.builder = this.builder.select(...args);
|
|
141
|
+
return this;
|
|
142
|
+
}
|
|
143
|
+
single() {
|
|
144
|
+
this.builder = this.builder.single();
|
|
145
|
+
return this;
|
|
146
|
+
}
|
|
147
|
+
maybeSingle() {
|
|
148
|
+
this.builder = this.builder.maybeSingle();
|
|
149
|
+
return this;
|
|
150
|
+
}
|
|
151
|
+
order(...args) {
|
|
152
|
+
this.builder = this.builder.order(...args);
|
|
153
|
+
return this;
|
|
154
|
+
}
|
|
155
|
+
limit(...args) {
|
|
156
|
+
this.builder = this.builder.limit(...args);
|
|
157
|
+
return this;
|
|
158
|
+
}
|
|
159
|
+
eq(...args) {
|
|
160
|
+
this.builder = this.builder.eq(...args);
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
// Thenable — this is what await calls
|
|
164
|
+
then(onFulfilled, onRejected) {
|
|
165
|
+
return this.builder.then((result) => {
|
|
166
|
+
if (!result?.error) {
|
|
167
|
+
try {
|
|
168
|
+
this.onSuccess();
|
|
169
|
+
}
|
|
170
|
+
catch { /* never fail */ }
|
|
135
171
|
}
|
|
136
|
-
return
|
|
137
|
-
}
|
|
138
|
-
}
|
|
172
|
+
return onFulfilled ? onFulfilled(result) : result;
|
|
173
|
+
}, onRejected);
|
|
174
|
+
}
|
|
139
175
|
}
|
|
140
176
|
/**
|
|
141
|
-
*
|
|
177
|
+
* Wraps update/delete result builders. Captures .eq() filter calls
|
|
178
|
+
* to pass to the daemon mirror.
|
|
142
179
|
*/
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
180
|
+
class DualWriteFilterBuilder {
|
|
181
|
+
builder;
|
|
182
|
+
onSuccess;
|
|
183
|
+
filters = [];
|
|
184
|
+
constructor(builder, onSuccess) {
|
|
185
|
+
this.builder = builder;
|
|
186
|
+
this.onSuccess = onSuccess;
|
|
187
|
+
}
|
|
188
|
+
// Filter methods — capture and delegate
|
|
189
|
+
eq(column, value) {
|
|
190
|
+
this.filters.push({ column, op: 'eq', value });
|
|
191
|
+
this.builder = this.builder.eq(column, value);
|
|
192
|
+
return this;
|
|
193
|
+
}
|
|
194
|
+
neq(column, value) {
|
|
195
|
+
this.filters.push({ column, op: 'neq', value });
|
|
196
|
+
this.builder = this.builder.neq(column, value);
|
|
197
|
+
return this;
|
|
198
|
+
}
|
|
199
|
+
gt(column, value) {
|
|
200
|
+
this.filters.push({ column, op: 'gt', value });
|
|
201
|
+
this.builder = this.builder.gt(column, value);
|
|
202
|
+
return this;
|
|
203
|
+
}
|
|
204
|
+
gte(column, value) {
|
|
205
|
+
this.filters.push({ column, op: 'gte', value });
|
|
206
|
+
this.builder = this.builder.gte(column, value);
|
|
207
|
+
return this;
|
|
208
|
+
}
|
|
209
|
+
lt(column, value) {
|
|
210
|
+
this.filters.push({ column, op: 'lt', value });
|
|
211
|
+
this.builder = this.builder.lt(column, value);
|
|
212
|
+
return this;
|
|
213
|
+
}
|
|
214
|
+
lte(column, value) {
|
|
215
|
+
this.filters.push({ column, op: 'lte', value });
|
|
216
|
+
this.builder = this.builder.lte(column, value);
|
|
217
|
+
return this;
|
|
218
|
+
}
|
|
219
|
+
in(column, values) {
|
|
220
|
+
this.filters.push({ column, op: 'in', value: values });
|
|
221
|
+
this.builder = this.builder.in(column, values);
|
|
222
|
+
return this;
|
|
223
|
+
}
|
|
224
|
+
is(column, value) {
|
|
225
|
+
this.filters.push({ column, op: 'is', value });
|
|
226
|
+
this.builder = this.builder.is(column, value);
|
|
227
|
+
return this;
|
|
228
|
+
}
|
|
229
|
+
// Chain methods
|
|
230
|
+
select(...args) {
|
|
231
|
+
this.builder = this.builder.select(...args);
|
|
232
|
+
return this;
|
|
233
|
+
}
|
|
234
|
+
single() {
|
|
235
|
+
this.builder = this.builder.single();
|
|
236
|
+
return this;
|
|
237
|
+
}
|
|
238
|
+
maybeSingle() {
|
|
239
|
+
this.builder = this.builder.maybeSingle();
|
|
240
|
+
return this;
|
|
241
|
+
}
|
|
242
|
+
// Thenable
|
|
243
|
+
then(onFulfilled, onRejected) {
|
|
244
|
+
return this.builder.then((result) => {
|
|
245
|
+
if (!result?.error) {
|
|
246
|
+
try {
|
|
247
|
+
this.onSuccess(this.filters);
|
|
188
248
|
}
|
|
189
|
-
|
|
249
|
+
catch { /* never fail */ }
|
|
190
250
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
catch {
|
|
194
|
-
// Never let daemon sync errors affect the main flow
|
|
251
|
+
return onFulfilled ? onFulfilled(result) : result;
|
|
252
|
+
}, onRejected);
|
|
195
253
|
}
|
|
196
254
|
}
|
|
197
255
|
// ─── Public API ─────────────────────────────────────────────
|
|
198
|
-
/**
|
|
199
|
-
* Check if dual-write is enabled via environment.
|
|
200
|
-
*/
|
|
201
256
|
export function isDualWriteEnabled() {
|
|
202
257
|
if (process.env.DUAL_WRITE === '1')
|
|
203
258
|
return true;
|
|
204
259
|
const stores = process.env.STELLA_STORES || '';
|
|
205
260
|
return stores.includes('ruvector');
|
|
206
261
|
}
|
|
207
|
-
/**
|
|
208
|
-
* Wrap a SupabaseClient with dual-write proxy.
|
|
209
|
-
* Returns the same interface — all reads go to Supabase only,
|
|
210
|
-
* all writes go to both Supabase and RuVector daemon.
|
|
211
|
-
*/
|
|
212
262
|
export function withDualWrite(client) {
|
|
213
263
|
const originalFrom = client.from.bind(client);
|
|
214
264
|
client.from = function proxiedFrom(table) {
|
|
215
265
|
const queryBuilder = originalFrom(table);
|
|
216
|
-
return
|
|
266
|
+
return new DualWriteQueryBuilder(queryBuilder, table);
|
|
217
267
|
};
|
|
218
268
|
return client;
|
|
219
269
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualWriteProxy.js","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dualWriteProxy.js","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAe,MAAM,UAAU,CAAA;AAG/C,MAAM,WAAW,GAAG,yBAAyB,CAAA;AAE7C,+DAA+D;AAE/D,IAAI,YAAY,GAAkB,IAAI,CAAA;AACtC,IAAI,eAAe,GAAG,KAAK,CAAA;AAC3B,IAAI,gBAAgB,GAAG,KAAK,CAAA;AAC5B,IAAI,KAAK,GAAG,CAAC,CAAA;AAEb,SAAS,aAAa;IACpB,IAAI,eAAe;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC7C,IAAI,gBAAgB;QAAE,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IAEjE,gBAAgB,GAAG,IAAI,CAAA;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;QACjC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAA;YACd,gBAAgB,GAAG,KAAK,CAAA;YACxB,OAAO,EAAE,CAAA;QACX,CAAC,EAAE,IAAI,CAAC,CAAA;QAER,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACtB,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,YAAY,GAAG,IAAI,CAAA;YACnB,eAAe,GAAG,IAAI,CAAA;YACtB,gBAAgB,GAAG,KAAK,CAAA;YACxB,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACpB,eAAe,GAAG,KAAK,CAAA;YACvB,YAAY,GAAG,IAAI,CAAA;QACrB,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACpB,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,eAAe,GAAG,KAAK,CAAA;YACvB,YAAY,GAAG,IAAI,CAAA;YACnB,gBAAgB,GAAG,KAAK,CAAA;YACxB,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAc,EAAE,MAA+B;IAChE,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACxB,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe;YAAE,OAAM;QAC7C,MAAM,EAAE,GAAG,EAAE,KAAK,CAAA;QAClB,IAAI,CAAC;YACH,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,eAAe,GAAG,KAAK,CAAA;YACvB,YAAY,GAAG,IAAI,CAAA;QACrB,CAAC;IACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AACpB,CAAC;AAED,+DAA+D;AAE/D,SAAS,YAAY,CAAC,KAAa,EAAE,IAAS;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,SAAS,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,SAAS,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,IAAS,EAAE,UAAkB;IAChE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,SAAS,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,SAAS,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;IAChE,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,OAAY,EAAE,OAA8D;IAC/G,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,SAAS,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IACxD,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,OAA8D;IACjG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,SAAS,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC;AAiBD,MAAM,qBAAqB;IACjB,QAAQ,CAAK;IACb,KAAK,CAAQ;IAErB,YAAY,QAAa,EAAE,KAAa;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,wCAAwC;IAExC,MAAM,CAAC,IAAS,EAAE,OAAa;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAClD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IACtE,CAAC;IAED,MAAM,CAAC,IAAS,EAAE,OAAa;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAClD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAA;QAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,CAAC,OAAY,EAAE,OAAa;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACrD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IACjG,CAAC;IAED,MAAM,CAAC,OAAa;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC5C,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;IACxF,CAAC;IAED,sCAAsC;IAEtC,MAAM,CAAC,GAAG,IAAW,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA,CAAC,CAAC;IAE/D,2DAA2D;IAEnD,UAAU,CAAC,OAAY,EAAE,SAAqB;QACpD,OAAO,IAAI,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACvD,CAAC;IAEO,kBAAkB,CAAC,OAAY,EAAE,SAA2C;QAClF,OAAO,IAAI,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACvD,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,sBAAsB;IAClB,OAAO,CAAK;IACZ,SAAS,CAAY;IAE7B,YAAY,OAAY,EAAE,SAAqB;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,sDAAsD;IACtD,MAAM,CAAC,GAAG,IAAW;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA;QAC3C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM;QACJ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,WAAW;QACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK,CAAC,GAAG,IAAW;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;QAC1C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK,CAAC,GAAG,IAAW;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;QAC1C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,EAAE,CAAC,GAAG,IAAW;QACf,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;QACvC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,sCAAsC;IACtC,IAAI,CAAC,WAAiB,EAAE,UAAgB;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE;YACvC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC;oBAAC,IAAI,CAAC,SAAS,EAAE,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACnD,CAAC,EAAE,UAAU,CAAC,CAAA;IAChB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,sBAAsB;IAClB,OAAO,CAAK;IACZ,SAAS,CAAkC;IAC3C,OAAO,GAAkB,EAAE,CAAA;IAEnC,YAAY,OAAY,EAAE,SAA2C;QACnE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,wCAAwC;IACxC,EAAE,CAAC,MAAc,EAAE,KAAc;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC7C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,GAAG,CAAC,MAAc,EAAE,KAAc;QAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,EAAE,CAAC,MAAc,EAAE,KAAc;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC7C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,GAAG,CAAC,MAAc,EAAE,KAAc;QAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,EAAE,CAAC,MAAc,EAAE,KAAc;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC7C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,GAAG,CAAC,MAAc,EAAE,KAAc;QAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,EAAE,CAAC,MAAc,EAAE,MAAiB;QAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,EAAE,CAAC,MAAc,EAAE,KAAc;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC7C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,gBAAgB;IAChB,MAAM,CAAC,GAAG,IAAW;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA;QAC3C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM;QACJ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,WAAW;QACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,WAAW;IACX,IAAI,CAAC,WAAiB,EAAE,UAAgB;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE;YACvC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC;oBAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACnD,CAAC,EAAE,UAAU,CAAC,CAAA;IAChB,CAAC;CACF;AAED,+DAA+D;AAE/D,MAAM,UAAU,kBAAkB;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAA;IAC9C,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAsB;IAClD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAE7C,MAAM,CAAC,IAAI,GAAG,SAAS,WAAW,CAAC,KAAa;QAC9C,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QACxC,OAAO,IAAI,qBAAqB,CAAC,YAAY,EAAE,KAAK,CAAQ,CAAA;IAC9D,CAAuB,CAAA;IAEvB,OAAO,MAAM,CAAA;AACf,CAAC"}
|