@xian-tech/client 0.1.5 → 0.1.7

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.
@@ -0,0 +1,473 @@
1
+ import { mergeAbortSignals } from "./client.js";
2
+ import { normalizeMaybeInteger, normalizeMaybeString, normalizeMaybeXianNumber, } from "./encoding.js";
3
+ import { TransportError, XianClientError } from "./errors.js";
4
+ const ALL_RELAY_KINDS = [
5
+ "shielded_note_relay_transfer",
6
+ "shielded_command"
7
+ ];
8
+ function stripTrailingSlash(value) {
9
+ return value.replace(/\/+$/, "");
10
+ }
11
+ function jsonBody(value) {
12
+ return JSON.stringify(value, (_key, entry) => typeof entry === "bigint" ? entry.toString() : entry);
13
+ }
14
+ function asRecord(value) {
15
+ if (typeof value !== "object" || value === null) {
16
+ throw new TransportError("expected object response");
17
+ }
18
+ return value;
19
+ }
20
+ function asArrayOfStrings(value) {
21
+ if (!Array.isArray(value)) {
22
+ return [];
23
+ }
24
+ return value.filter((item) => typeof item === "string");
25
+ }
26
+ function normalizeRelayKind(value) {
27
+ return value === "shielded_command" ||
28
+ value === "shielded_note_relay_transfer"
29
+ ? value
30
+ : null;
31
+ }
32
+ function normalizeAuthScheme(value) {
33
+ return value === "bearer" ? "bearer" : "none";
34
+ }
35
+ function normalizeBool(value, fallback) {
36
+ return typeof value === "boolean" ? value : fallback;
37
+ }
38
+ function normalizePriority(value) {
39
+ const parsed = normalizeMaybeInteger(value);
40
+ return parsed !== null && parsed >= 0 ? parsed : 100;
41
+ }
42
+ function uniqueRelayKinds(values) {
43
+ if (!Array.isArray(values) || values.length === 0) {
44
+ return [...ALL_RELAY_KINDS];
45
+ }
46
+ const unique = new Set();
47
+ for (const value of values) {
48
+ const normalized = normalizeRelayKind(value);
49
+ if (normalized !== null) {
50
+ unique.add(normalized);
51
+ }
52
+ }
53
+ return unique.size > 0 ? [...unique] : [...ALL_RELAY_KINDS];
54
+ }
55
+ function copyRelayerEntry(entry) {
56
+ return {
57
+ ...entry,
58
+ submissionKinds: [...entry.submissionKinds]
59
+ };
60
+ }
61
+ export function normalizeShieldedRelayerCatalogEntry(entry, index = 0) {
62
+ const relayerUrl = stripTrailingSlash(typeof entry.relayerUrl === "string"
63
+ ? entry.relayerUrl
64
+ : typeof entry.baseUrl === "string"
65
+ ? entry.baseUrl
66
+ : "");
67
+ if (!relayerUrl) {
68
+ throw new XianClientError("shielded relayer entry must define relayerUrl or baseUrl");
69
+ }
70
+ const id = normalizeMaybeString(entry.id)?.trim() || `relayer-${index + 1}`;
71
+ const authToken = normalizeMaybeString(entry.authToken)?.trim() || undefined;
72
+ return {
73
+ id,
74
+ relayerUrl,
75
+ authToken,
76
+ authScheme: normalizeAuthScheme(entry.authScheme),
77
+ publicInfo: normalizeBool(entry.publicInfo, true),
78
+ publicQuote: normalizeBool(entry.publicQuote, false),
79
+ publicJobLookup: normalizeBool(entry.publicJobLookup, false),
80
+ priority: normalizePriority(entry.priority),
81
+ submissionKinds: uniqueRelayKinds(entry.submissionKinds)
82
+ };
83
+ }
84
+ export function sortShieldedRelayerCatalog(entries) {
85
+ const normalized = entries.map((entry, index) => normalizeShieldedRelayerCatalogEntry(entry, index));
86
+ normalized.sort((left, right) => {
87
+ if (left.priority !== right.priority) {
88
+ return left.priority - right.priority;
89
+ }
90
+ if (left.id !== right.id) {
91
+ return left.id.localeCompare(right.id);
92
+ }
93
+ return left.relayerUrl.localeCompare(right.relayerUrl);
94
+ });
95
+ const seen = new Set();
96
+ for (const entry of normalized) {
97
+ if (seen.has(entry.id)) {
98
+ throw new XianClientError(`duplicate shielded relayer id: ${entry.id}`);
99
+ }
100
+ seen.add(entry.id);
101
+ }
102
+ return normalized;
103
+ }
104
+ function buildAggregateTransportError(action, failures) {
105
+ const detail = failures
106
+ .map(({ relayer, error }) => {
107
+ const message = error instanceof Error ? error.message : String(error);
108
+ return `${relayer.id}: ${message}`;
109
+ })
110
+ .join("; ");
111
+ return new TransportError(`${action} failed for all candidate relayers: ${detail}`);
112
+ }
113
+ function relayerSupportsKind(relayer, kind) {
114
+ return relayer.submissionKinds.includes(kind);
115
+ }
116
+ function normalizeSignedTransaction(value) {
117
+ if (typeof value !== "object" || value === null) {
118
+ return undefined;
119
+ }
120
+ const raw = value;
121
+ const payload = typeof raw.payload === "object" && raw.payload !== null
122
+ ? raw.payload
123
+ : null;
124
+ const metadata = typeof raw.metadata === "object" && raw.metadata !== null
125
+ ? raw.metadata
126
+ : null;
127
+ if (payload == null || metadata == null) {
128
+ return undefined;
129
+ }
130
+ return { payload, metadata };
131
+ }
132
+ function normalizeReceipt(value) {
133
+ if (typeof value !== "object" || value === null) {
134
+ return null;
135
+ }
136
+ const raw = value;
137
+ const txHash = normalizeMaybeString(raw.tx_hash ?? raw.txHash) ?? undefined;
138
+ return {
139
+ success: Boolean(raw.success),
140
+ txHash,
141
+ message: raw.message,
142
+ response: asRecord(raw.raw ?? raw.response ?? raw),
143
+ transaction: normalizeSignedTransaction(raw.transaction),
144
+ execution: raw.execution
145
+ };
146
+ }
147
+ function normalizeSubmission(value) {
148
+ if (typeof value !== "object" || value === null) {
149
+ return null;
150
+ }
151
+ const raw = value;
152
+ const modeValue = normalizeMaybeString(raw.mode);
153
+ const mode = modeValue === "async" || modeValue === "commit" || modeValue === "checktx"
154
+ ? modeValue
155
+ : "checktx";
156
+ const nonce = normalizeMaybeXianNumber(raw.nonce) ?? 0;
157
+ const chiSupplied = normalizeMaybeXianNumber(raw.chi_supplied ?? raw.chiSupplied) ?? 0;
158
+ const chiEstimated = normalizeMaybeInteger(raw.chi_estimated ?? raw.chiEstimated) ?? undefined;
159
+ return {
160
+ submitted: Boolean(raw.submitted),
161
+ accepted: typeof raw.accepted === "boolean" || raw.accepted == null
162
+ ? raw.accepted
163
+ : null,
164
+ finalized: Boolean(raw.finalized),
165
+ txHash: normalizeMaybeString(raw.tx_hash ?? raw.txHash) ?? undefined,
166
+ message: raw.message,
167
+ mode,
168
+ nonce,
169
+ chiSupplied,
170
+ chiEstimated,
171
+ response: asRecord(raw.response ?? raw),
172
+ receipt: normalizeReceipt(raw.receipt) ?? undefined
173
+ };
174
+ }
175
+ export class XianShieldedRelayerClient {
176
+ relayerUrl;
177
+ authToken;
178
+ fetchFn;
179
+ requestTimeoutMs;
180
+ constructor(options) {
181
+ this.relayerUrl = stripTrailingSlash(options.relayerUrl);
182
+ this.authToken = options.authToken?.trim() || undefined;
183
+ this.fetchFn = options.fetchFn ?? globalThis.fetch.bind(globalThis);
184
+ this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;
185
+ }
186
+ async requestJson(method, path, body, options) {
187
+ const headers = {
188
+ accept: "application/json"
189
+ };
190
+ let payload;
191
+ if (body !== undefined) {
192
+ headers["content-type"] = "application/json";
193
+ payload = jsonBody(body);
194
+ }
195
+ if (this.authToken) {
196
+ headers.authorization = `Bearer ${this.authToken}`;
197
+ }
198
+ const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
199
+ const timeoutController = timeoutMs > 0 ? new AbortController() : undefined;
200
+ const timeoutHandle = timeoutController
201
+ ? setTimeout(() => timeoutController.abort(), timeoutMs)
202
+ : undefined;
203
+ const signal = mergeAbortSignals(options?.signal, timeoutController?.signal);
204
+ let response;
205
+ try {
206
+ response = await this.fetchFn(`${this.relayerUrl}${path}`, {
207
+ method,
208
+ headers,
209
+ body: payload,
210
+ signal
211
+ });
212
+ }
213
+ catch (error) {
214
+ if (options?.signal?.aborted) {
215
+ throw error;
216
+ }
217
+ if (timeoutController?.signal.aborted) {
218
+ throw new TransportError(`relayer request timed out after ${timeoutMs}ms for ${this.relayerUrl}${path}`, { cause: error });
219
+ }
220
+ throw new TransportError(`request failed for ${this.relayerUrl}${path}`, { cause: error });
221
+ }
222
+ finally {
223
+ if (timeoutHandle !== undefined) {
224
+ clearTimeout(timeoutHandle);
225
+ }
226
+ }
227
+ let decoded;
228
+ try {
229
+ decoded = await response.json();
230
+ }
231
+ catch (error) {
232
+ throw new TransportError(`invalid JSON response from ${this.relayerUrl}${path}`, { cause: error });
233
+ }
234
+ const record = asRecord(decoded);
235
+ if (!response.ok) {
236
+ const message = normalizeMaybeString(record.error) ?? `relayer request failed with status ${response.status}`;
237
+ throw new TransportError(message);
238
+ }
239
+ return record;
240
+ }
241
+ async getInfo() {
242
+ const raw = await this.requestJson("GET", "/v1/info");
243
+ const policy = asRecord(raw.policy ?? {});
244
+ return {
245
+ service: normalizeMaybeString(raw.service) ?? "xian-shielded-relayer",
246
+ protocolVersion: normalizeMaybeString(raw.protocol_version) ?? "v1",
247
+ available: Boolean(raw.available),
248
+ chainId: normalizeMaybeString(raw.chain_id),
249
+ relayerAccount: normalizeMaybeString(raw.relayer_account),
250
+ submissionMode: raw.submission_mode === "async" ||
251
+ raw.submission_mode === "commit" ||
252
+ raw.submission_mode === "checktx"
253
+ ? raw.submission_mode
254
+ : "checktx",
255
+ waitForTx: Boolean(raw.wait_for_tx),
256
+ capabilities: typeof raw.capabilities === "object" && raw.capabilities !== null
257
+ ? Object.fromEntries(Object.entries(raw.capabilities).map(([key, value]) => [key, Boolean(value)]))
258
+ : {},
259
+ policy: {
260
+ quoteTtlSeconds: normalizeMaybeInteger(policy.quote_ttl_seconds) ?? 0,
261
+ defaultExpirySeconds: normalizeMaybeInteger(policy.default_expiry_seconds) ?? 0,
262
+ maxExpirySeconds: normalizeMaybeInteger(policy.max_expiry_seconds) ?? 0,
263
+ minNoteRelayerFee: normalizeMaybeXianNumber(policy.min_note_relayer_fee) ?? 0,
264
+ minCommandRelayerFee: normalizeMaybeXianNumber(policy.min_command_relayer_fee) ?? 0,
265
+ allowedNoteContracts: asArrayOfStrings(policy.allowed_note_contracts),
266
+ allowedCommandContracts: asArrayOfStrings(policy.allowed_command_contracts),
267
+ allowedCommandTargets: asArrayOfStrings(policy.allowed_command_targets)
268
+ },
269
+ raw
270
+ };
271
+ }
272
+ async getQuote(request) {
273
+ const raw = await this.requestJson("POST", "/v1/quote", {
274
+ kind: request.kind,
275
+ contract: request.contract,
276
+ target_contract: request.targetContract,
277
+ requested_relayer_fee: request.requestedRelayerFee,
278
+ requested_expires_in_seconds: request.requestedExpiresInSeconds
279
+ });
280
+ return {
281
+ kind: raw.kind === "shielded_command"
282
+ ? "shielded_command"
283
+ : "shielded_note_relay_transfer",
284
+ contract: normalizeMaybeString(raw.contract) ?? "",
285
+ targetContract: normalizeMaybeString(raw.target_contract),
286
+ chainId: normalizeMaybeString(raw.chain_id),
287
+ relayerAccount: normalizeMaybeString(raw.relayer_account),
288
+ relayerFee: normalizeMaybeXianNumber(raw.relayer_fee) ?? 0,
289
+ expiresAt: normalizeMaybeString(raw.expires_at),
290
+ issuedAt: normalizeMaybeString(raw.issued_at),
291
+ policyVersion: normalizeMaybeString(raw.policy_version),
292
+ raw
293
+ };
294
+ }
295
+ async submitShieldedNoteRelayTransfer(request) {
296
+ const raw = await this.requestJson("POST", "/v1/jobs/shielded-note-transfer", {
297
+ contract: request.contract,
298
+ old_root: request.oldRoot,
299
+ input_nullifiers: request.inputNullifiers,
300
+ output_commitments: request.outputCommitments,
301
+ proof_hex: request.proofHex,
302
+ relayer_fee: request.relayerFee,
303
+ expires_at: request.expiresAt ?? null,
304
+ output_payloads: request.outputPayloads ?? [],
305
+ client_request_id: request.clientRequestId
306
+ });
307
+ return this.normalizeJob(raw);
308
+ }
309
+ async submitShieldedCommand(request) {
310
+ const raw = await this.requestJson("POST", "/v1/jobs/shielded-command", {
311
+ contract: request.contract,
312
+ target_contract: request.targetContract,
313
+ old_root: request.oldRoot,
314
+ input_nullifiers: request.inputNullifiers,
315
+ output_commitments: request.outputCommitments,
316
+ proof_hex: request.proofHex,
317
+ relayer_fee: request.relayerFee,
318
+ public_amount: request.publicAmount ?? 0,
319
+ payload: request.payload ?? null,
320
+ expires_at: request.expiresAt ?? null,
321
+ output_payloads: request.outputPayloads ?? [],
322
+ client_request_id: request.clientRequestId
323
+ });
324
+ return this.normalizeJob(raw);
325
+ }
326
+ async getJob(jobId) {
327
+ const raw = await this.requestJson("GET", `/v1/jobs/${encodeURIComponent(jobId)}`);
328
+ return this.normalizeJob(raw);
329
+ }
330
+ normalizeJob(raw) {
331
+ return {
332
+ jobId: normalizeMaybeString(raw.job_id) ?? "",
333
+ kind: raw.kind === "shielded_command"
334
+ ? "shielded_command"
335
+ : "shielded_note_relay_transfer",
336
+ status: normalizeMaybeString(raw.status) ?? "unknown",
337
+ chainId: normalizeMaybeString(raw.chain_id),
338
+ relayerAccount: normalizeMaybeString(raw.relayer_account),
339
+ contract: normalizeMaybeString(raw.contract),
340
+ functionName: normalizeMaybeString(raw.function_name),
341
+ txHash: normalizeMaybeString(raw.tx_hash),
342
+ submittedAt: normalizeMaybeString(raw.submitted_at),
343
+ updatedAt: normalizeMaybeString(raw.updated_at),
344
+ error: normalizeMaybeString(raw.error),
345
+ submission: normalizeSubmission(raw.submission),
346
+ raw
347
+ };
348
+ }
349
+ }
350
+ export class XianShieldedRelayerPoolClient {
351
+ relayers;
352
+ clients;
353
+ constructor(options) {
354
+ this.relayers = sortShieldedRelayerCatalog(options.relayers);
355
+ if (this.relayers.length === 0) {
356
+ throw new XianClientError("shielded relayer pool requires at least one configured relayer");
357
+ }
358
+ this.clients = new Map(this.relayers.map((relayer) => [
359
+ relayer.id,
360
+ new XianShieldedRelayerClient({
361
+ relayerUrl: relayer.relayerUrl,
362
+ authToken: relayer.authToken,
363
+ fetchFn: options.fetchFn
364
+ })
365
+ ]));
366
+ }
367
+ listRelayers(kind) {
368
+ const relayers = kind == null
369
+ ? this.relayers
370
+ : this.relayers.filter((relayer) => relayerSupportsKind(relayer, kind));
371
+ return relayers.map(copyRelayerEntry);
372
+ }
373
+ getClient(relayerId) {
374
+ const client = this.clients.get(relayerId);
375
+ if (client == null) {
376
+ throw new XianClientError(`unknown shielded relayer id: ${relayerId}`);
377
+ }
378
+ return client;
379
+ }
380
+ async getInfo(options = {}) {
381
+ const candidates = this.selectCandidates(undefined, options);
382
+ return this.resolveWithFailover("getInfo", candidates, async (relayer) => ({
383
+ relayer,
384
+ info: await this.getClient(relayer.id).getInfo()
385
+ }));
386
+ }
387
+ async getQuote(request, options = {}) {
388
+ const candidates = this.selectCandidates(request.kind, options);
389
+ return this.resolveWithFailover("getQuote", candidates, async (relayer) => ({
390
+ relayer,
391
+ quote: await this.getClient(relayer.id).getQuote(request)
392
+ }));
393
+ }
394
+ async submitShieldedNoteRelayTransfer(request, options = {}) {
395
+ const relayer = this.resolveSubmissionRelayer("submitShieldedNoteRelayTransfer", "shielded_note_relay_transfer", options);
396
+ return {
397
+ relayer,
398
+ job: await this.getClient(relayer.id).submitShieldedNoteRelayTransfer(request)
399
+ };
400
+ }
401
+ async submitShieldedCommand(request, options = {}) {
402
+ const relayer = this.resolveSubmissionRelayer("submitShieldedCommand", "shielded_command", options);
403
+ return {
404
+ relayer,
405
+ job: await this.getClient(relayer.id).submitShieldedCommand(request)
406
+ };
407
+ }
408
+ async getJob(jobId, options = {}) {
409
+ const relayer = this.resolveJobRelayer("getJob", options);
410
+ return {
411
+ relayer,
412
+ job: await this.getClient(relayer.id).getJob(jobId)
413
+ };
414
+ }
415
+ selectCandidates(kind, options = {}) {
416
+ if (options.relayerId != null) {
417
+ const relayer = this.lookupRelayer(options.relayerId);
418
+ if (kind != null && !relayerSupportsKind(relayer, kind)) {
419
+ throw new XianClientError(`shielded relayer ${relayer.id} does not support ${kind}`);
420
+ }
421
+ return [relayer];
422
+ }
423
+ const relayers = kind == null
424
+ ? this.relayers
425
+ : this.relayers.filter((relayer) => relayerSupportsKind(relayer, kind));
426
+ if (relayers.length === 0) {
427
+ throw new XianClientError(kind == null
428
+ ? "no shielded relayers are configured"
429
+ : `no shielded relayers are configured for ${kind}`);
430
+ }
431
+ return relayers;
432
+ }
433
+ resolveSubmissionRelayer(action, kind, options) {
434
+ const candidates = this.selectCandidates(kind, options);
435
+ if (options.relayerId != null || candidates.length === 1) {
436
+ const [relayer] = candidates;
437
+ if (relayer != null) {
438
+ return relayer;
439
+ }
440
+ }
441
+ throw new XianClientError(`${action} requires relayerId when multiple shielded relayers are configured`);
442
+ }
443
+ resolveJobRelayer(action, options) {
444
+ const candidates = this.selectCandidates(undefined, options);
445
+ if (options.relayerId != null || candidates.length === 1) {
446
+ const [relayer] = candidates;
447
+ if (relayer != null) {
448
+ return relayer;
449
+ }
450
+ }
451
+ throw new XianClientError(`${action} requires relayerId when multiple shielded relayers are configured`);
452
+ }
453
+ lookupRelayer(relayerId) {
454
+ const relayer = this.relayers.find((entry) => entry.id === relayerId);
455
+ if (relayer == null) {
456
+ throw new XianClientError(`unknown shielded relayer id: ${relayerId}`);
457
+ }
458
+ return relayer;
459
+ }
460
+ async resolveWithFailover(action, candidates, fn) {
461
+ const failures = [];
462
+ for (const relayer of candidates) {
463
+ try {
464
+ return await fn(relayer);
465
+ }
466
+ catch (error) {
467
+ failures.push({ relayer, error });
468
+ }
469
+ }
470
+ throw buildAggregateTransportError(action, failures);
471
+ }
472
+ }
473
+ //# sourceMappingURL=relayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayer.js","sourceRoot":"","sources":["../src/relayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function shieldedSyncHintFromViewingPublicKey(viewingPublicKey: string): string;
2
+ export declare function shieldedSyncHintFromViewingPrivateKey(viewingPrivateKey: string): string;
3
+ //# sourceMappingURL=shielded.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shielded.d.ts","sourceRoot":"","sources":["../src/shielded.ts"],"names":[],"mappings":"AAeA,wBAAgB,oCAAoC,CAClD,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAKR;AAED,wBAAgB,qCAAqC,CACnD,iBAAiB,EAAE,MAAM,GACxB,MAAM,CAIR"}
@@ -0,0 +1,19 @@
1
+ import { sha3_256 } from "@noble/hashes/sha3.js";
2
+ import { bytesToHex, hexToBytes, utf8ToBytes } from "./encoding.js";
3
+ import { publicKeyFromPrivateKey } from "./ed25519.js";
4
+ const SYNC_HINT_PREFIX = utf8ToBytes("xian-zk-note-sync-v1");
5
+ const SYNC_HINT_BYTES = 12;
6
+ function concatBytes(left, right) {
7
+ const out = new Uint8Array(left.length + right.length);
8
+ out.set(left, 0);
9
+ out.set(right, left.length);
10
+ return out;
11
+ }
12
+ export function shieldedSyncHintFromViewingPublicKey(viewingPublicKey) {
13
+ const digest = sha3_256(concatBytes(SYNC_HINT_PREFIX, hexToBytes(viewingPublicKey)));
14
+ return `0x${bytesToHex(digest.slice(0, SYNC_HINT_BYTES))}`;
15
+ }
16
+ export function shieldedSyncHintFromViewingPrivateKey(viewingPrivateKey) {
17
+ return shieldedSyncHintFromViewingPublicKey(publicKeyFromPrivateKey(viewingPrivateKey));
18
+ }
19
+ //# sourceMappingURL=shielded.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shielded.js","sourceRoot":"","sources":["../src/shielded.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,gBAAgB,GAAG,WAAW,CAAC,sBAAsB,CAAC,CAAC;AAC7D,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,SAAS,WAAW,CAAC,IAAgB,EAAE,KAAiB;IACtD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjB,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oCAAoC,CAClD,gBAAwB;IAExB,MAAM,MAAM,GAAG,QAAQ,CACrB,WAAW,CAAC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAC5D,CAAC;IACF,OAAO,KAAK,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,iBAAyB;IAEzB,OAAO,oCAAoC,CACzC,uBAAuB,CAAC,iBAAiB,CAAC,CAC3C,CAAC;AACJ,CAAC"}