mppx 0.6.19 → 0.6.21

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 (168) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/Challenge.d.ts +2 -2
  3. package/dist/Challenge.d.ts.map +1 -1
  4. package/dist/Challenge.js +1 -1
  5. package/dist/Challenge.js.map +1 -1
  6. package/dist/Method.d.ts +34 -0
  7. package/dist/Method.d.ts.map +1 -1
  8. package/dist/Method.js +3 -1
  9. package/dist/Method.js.map +1 -1
  10. package/dist/Receipt.d.ts +1 -0
  11. package/dist/Receipt.d.ts.map +1 -1
  12. package/dist/Receipt.js +2 -0
  13. package/dist/Receipt.js.map +1 -1
  14. package/dist/client/Methods.d.ts +1 -0
  15. package/dist/client/Methods.d.ts.map +1 -1
  16. package/dist/client/Methods.js +1 -0
  17. package/dist/client/Methods.js.map +1 -1
  18. package/dist/client/Mppx.d.ts +12 -1
  19. package/dist/client/Mppx.d.ts.map +1 -1
  20. package/dist/client/Mppx.js +127 -10
  21. package/dist/client/Mppx.js.map +1 -1
  22. package/dist/client/internal/Fetch.d.ts +69 -1
  23. package/dist/client/internal/Fetch.d.ts.map +1 -1
  24. package/dist/client/internal/Fetch.js +250 -20
  25. package/dist/client/internal/Fetch.js.map +1 -1
  26. package/dist/middlewares/elysia.d.ts.map +1 -1
  27. package/dist/middlewares/elysia.js +14 -0
  28. package/dist/middlewares/elysia.js.map +1 -1
  29. package/dist/middlewares/express.d.ts.map +1 -1
  30. package/dist/middlewares/express.js +1 -2
  31. package/dist/middlewares/express.js.map +1 -1
  32. package/dist/middlewares/hono.d.ts.map +1 -1
  33. package/dist/middlewares/hono.js +14 -0
  34. package/dist/middlewares/hono.js.map +1 -1
  35. package/dist/middlewares/internal/mppx.d.ts +1 -1
  36. package/dist/middlewares/internal/mppx.d.ts.map +1 -1
  37. package/dist/middlewares/internal/mppx.js +2 -1
  38. package/dist/middlewares/internal/mppx.js.map +1 -1
  39. package/dist/middlewares/nextjs.d.ts.map +1 -1
  40. package/dist/middlewares/nextjs.js +14 -0
  41. package/dist/middlewares/nextjs.js.map +1 -1
  42. package/dist/proxy/Proxy.d.ts.map +1 -1
  43. package/dist/proxy/Proxy.js +2 -2
  44. package/dist/proxy/Proxy.js.map +1 -1
  45. package/dist/proxy/Service.d.ts.map +1 -1
  46. package/dist/proxy/Service.js +1 -1
  47. package/dist/proxy/Service.js.map +1 -1
  48. package/dist/server/Mppx.d.ts +96 -5
  49. package/dist/server/Mppx.d.ts.map +1 -1
  50. package/dist/server/Mppx.js +739 -115
  51. package/dist/server/Mppx.js.map +1 -1
  52. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  53. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  54. package/dist/stripe/server/internal/html.gen.js +1 -1
  55. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  56. package/dist/tempo/Methods.d.ts +96 -0
  57. package/dist/tempo/Methods.d.ts.map +1 -1
  58. package/dist/tempo/Methods.js +97 -0
  59. package/dist/tempo/Methods.js.map +1 -1
  60. package/dist/tempo/client/Methods.d.ts +3 -0
  61. package/dist/tempo/client/Methods.d.ts.map +1 -1
  62. package/dist/tempo/client/Methods.js +3 -0
  63. package/dist/tempo/client/Methods.js.map +1 -1
  64. package/dist/tempo/client/Subscription.d.ts +114 -0
  65. package/dist/tempo/client/Subscription.d.ts.map +1 -0
  66. package/dist/tempo/client/Subscription.js +100 -0
  67. package/dist/tempo/client/Subscription.js.map +1 -0
  68. package/dist/tempo/client/index.d.ts +1 -0
  69. package/dist/tempo/client/index.d.ts.map +1 -1
  70. package/dist/tempo/client/index.js +1 -0
  71. package/dist/tempo/client/index.js.map +1 -1
  72. package/dist/tempo/index.d.ts +1 -0
  73. package/dist/tempo/index.d.ts.map +1 -1
  74. package/dist/tempo/index.js +1 -0
  75. package/dist/tempo/index.js.map +1 -1
  76. package/dist/tempo/server/Methods.d.ts +5 -0
  77. package/dist/tempo/server/Methods.d.ts.map +1 -1
  78. package/dist/tempo/server/Methods.js +5 -0
  79. package/dist/tempo/server/Methods.js.map +1 -1
  80. package/dist/tempo/server/Subscription.d.ts +221 -0
  81. package/dist/tempo/server/Subscription.d.ts.map +1 -0
  82. package/dist/tempo/server/Subscription.js +637 -0
  83. package/dist/tempo/server/Subscription.js.map +1 -0
  84. package/dist/tempo/server/index.d.ts +1 -0
  85. package/dist/tempo/server/index.d.ts.map +1 -1
  86. package/dist/tempo/server/index.js +1 -0
  87. package/dist/tempo/server/index.js.map +1 -1
  88. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  89. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  90. package/dist/tempo/server/internal/html.gen.js +1 -1
  91. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  92. package/dist/tempo/subscription/KeyAuthorization.d.ts +282 -0
  93. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -0
  94. package/dist/tempo/subscription/KeyAuthorization.js +297 -0
  95. package/dist/tempo/subscription/KeyAuthorization.js.map +1 -0
  96. package/dist/tempo/subscription/Receipt.d.ts +10 -0
  97. package/dist/tempo/subscription/Receipt.d.ts.map +1 -0
  98. package/dist/tempo/subscription/Receipt.js +16 -0
  99. package/dist/tempo/subscription/Receipt.js.map +1 -0
  100. package/dist/tempo/subscription/Store.d.ts +99 -0
  101. package/dist/tempo/subscription/Store.d.ts.map +1 -0
  102. package/dist/tempo/subscription/Store.js +292 -0
  103. package/dist/tempo/subscription/Store.js.map +1 -0
  104. package/dist/tempo/subscription/Types.d.ts +65 -0
  105. package/dist/tempo/subscription/Types.d.ts.map +1 -0
  106. package/dist/tempo/subscription/Types.js +2 -0
  107. package/dist/tempo/subscription/Types.js.map +1 -0
  108. package/dist/tempo/subscription/index.d.ts +6 -0
  109. package/dist/tempo/subscription/index.d.ts.map +1 -0
  110. package/dist/tempo/subscription/index.js +4 -0
  111. package/dist/tempo/subscription/index.js.map +1 -0
  112. package/dist/zod.d.ts +7 -0
  113. package/dist/zod.d.ts.map +1 -1
  114. package/dist/zod.js +18 -0
  115. package/dist/zod.js.map +1 -1
  116. package/package.json +3 -3
  117. package/src/Challenge.test.ts +13 -0
  118. package/src/Challenge.ts +3 -3
  119. package/src/Method.ts +46 -1
  120. package/src/Receipt.ts +2 -0
  121. package/src/client/Methods.ts +1 -0
  122. package/src/client/Mppx.test-d.ts +55 -0
  123. package/src/client/Mppx.test.ts +181 -0
  124. package/src/client/Mppx.ts +248 -16
  125. package/src/client/internal/Fetch.test-d.ts +31 -0
  126. package/src/client/internal/Fetch.test.ts +261 -0
  127. package/src/client/internal/Fetch.ts +467 -24
  128. package/src/middlewares/elysia.test.ts +31 -1
  129. package/src/middlewares/elysia.ts +13 -0
  130. package/src/middlewares/express.ts +1 -5
  131. package/src/middlewares/hono.test.ts +30 -1
  132. package/src/middlewares/hono.ts +13 -0
  133. package/src/middlewares/internal/mppx.ts +5 -6
  134. package/src/middlewares/nextjs.test.ts +28 -1
  135. package/src/middlewares/nextjs.ts +13 -0
  136. package/src/proxy/Proxy.test.ts +69 -0
  137. package/src/proxy/Proxy.ts +2 -5
  138. package/src/proxy/Service.test.ts +34 -0
  139. package/src/proxy/Service.ts +7 -0
  140. package/src/server/Mppx.authorize.test.ts +210 -0
  141. package/src/server/Mppx.test-d.ts +73 -1
  142. package/src/server/Mppx.test.ts +965 -3
  143. package/src/server/Mppx.ts +1138 -140
  144. package/src/stripe/server/internal/html/package.json +1 -1
  145. package/src/stripe/server/internal/html.gen.ts +1 -1
  146. package/src/tempo/Methods.test.ts +131 -0
  147. package/src/tempo/Methods.ts +136 -0
  148. package/src/tempo/Subscription.integration.test.ts +591 -0
  149. package/src/tempo/client/Methods.ts +3 -0
  150. package/src/tempo/client/Subscription.test.ts +131 -0
  151. package/src/tempo/client/Subscription.ts +155 -0
  152. package/src/tempo/client/index.ts +1 -0
  153. package/src/tempo/index.ts +1 -0
  154. package/src/tempo/server/Methods.ts +5 -0
  155. package/src/tempo/server/Subscription.test.ts +1410 -0
  156. package/src/tempo/server/Subscription.ts +1014 -0
  157. package/src/tempo/server/index.ts +1 -0
  158. package/src/tempo/server/internal/html/package.json +1 -1
  159. package/src/tempo/server/internal/html.gen.ts +1 -1
  160. package/src/tempo/subscription/KeyAuthorization.test.ts +204 -0
  161. package/src/tempo/subscription/KeyAuthorization.ts +394 -0
  162. package/src/tempo/subscription/Receipt.ts +28 -0
  163. package/src/tempo/subscription/Store.test.ts +554 -0
  164. package/src/tempo/subscription/Store.ts +431 -0
  165. package/src/tempo/subscription/Types.ts +68 -0
  166. package/src/tempo/subscription/index.ts +23 -0
  167. package/src/zod.test.ts +23 -1
  168. package/src/zod.ts +24 -0
@@ -0,0 +1,637 @@
1
+ import { Base64 } from 'ox';
2
+ import { KeyAuthorization } from 'ox/tempo';
3
+ import { encodeFunctionData, isAddressEqual } from 'viem';
4
+ import { call as viem_call, sendRawTransaction, sendRawTransactionSync, signTransaction, } from 'viem/actions';
5
+ import { tempo as tempo_chain } from 'viem/chains';
6
+ import { Abis, Account as TempoAccount, Transaction } from 'viem/tempo';
7
+ import { VerificationFailedError } from '../../Errors.js';
8
+ import * as Method from '../../Method.js';
9
+ import * as Store from '../../Store.js';
10
+ import * as ClientResolver from '../../viem/Client.js';
11
+ import * as Attribution from '../Attribution.js';
12
+ import * as Account from '../internal/account.js';
13
+ import * as defaults from '../internal/defaults.js';
14
+ import * as Proof from '../internal/proof.js';
15
+ import * as Methods from '../Methods.js';
16
+ import { assertSubscriptionTiming, toSubscriptionPeriodSeconds, verifySubscriptionKeyAuthorization, } from '../subscription/KeyAuthorization.js';
17
+ import * as SubscriptionReceipt from '../subscription/Receipt.js';
18
+ import * as SubscriptionStore from '../subscription/Store.js';
19
+ /**
20
+ * Creates a Tempo subscription method for recurring TIP-20 token payments.
21
+ *
22
+ * The method handles activation, request-path reuse, and optional lazy renewals.
23
+ */
24
+ export function subscription(p) {
25
+ const parameters = p;
26
+ const rawStore = (parameters.store ?? Store.memory());
27
+ if (typeof rawStore.update !== 'function') {
28
+ throw new Error('tempo.subscription() requires an atomic store with `update`.');
29
+ }
30
+ const defaultChainId = parameters.chainId ?? defaults.chainId.testnet;
31
+ const { amount, currency = defaults.resolveCurrency({ chainId: defaultChainId }), decimals = defaults.decimals, description, externalId, periodCount, periodUnit, subscriptionExpires, waitForConfirmation = true, } = parameters;
32
+ const store = SubscriptionStore.fromStore(rawStore, {
33
+ activationTimeoutMs: parameters.activationTimeoutMs,
34
+ renewalTimeoutMs: parameters.renewalTimeoutMs,
35
+ });
36
+ const { recipient } = Account.resolve(parameters);
37
+ const getClient = ClientResolver.getResolver({
38
+ chain: tempo_chain,
39
+ getClient: parameters.getClient,
40
+ rpcUrl: defaults.rpcUrl,
41
+ });
42
+ return Method.toServer(Methods.subscription, {
43
+ defaults: {
44
+ amount,
45
+ currency,
46
+ decimals,
47
+ description,
48
+ externalId,
49
+ periodCount,
50
+ periodUnit,
51
+ recipient,
52
+ subscriptionExpires,
53
+ },
54
+ async authorize({ input, request }) {
55
+ const resolved = await parameters.resolve({ input, request });
56
+ if (!resolved)
57
+ return undefined;
58
+ const subscription = await store.getByKey(resolved.key);
59
+ if (!subscription || !isActive(subscription))
60
+ return undefined;
61
+ if (!subscriptionMatchesRequest(subscription, request))
62
+ return undefined;
63
+ const periodIndex = getPeriodIndex(subscription);
64
+ if (periodIndex > subscription.lastChargedPeriod) {
65
+ const renew = resolveRenewalHandler({
66
+ getClient,
67
+ parameters,
68
+ store,
69
+ subscription,
70
+ waitForConfirmation,
71
+ });
72
+ if (!renew)
73
+ return undefined;
74
+ const renewal = await settleRenewal({
75
+ expectedLookupKey: resolved.key,
76
+ periodIndex,
77
+ renew,
78
+ request,
79
+ store,
80
+ subscription,
81
+ });
82
+ if (!renewal)
83
+ return undefined;
84
+ if (renewal.status === 'charged')
85
+ return { receipt: renewal.receipt };
86
+ if (renewal.status === 'inFlight') {
87
+ return {
88
+ receipt: renewal.receipt,
89
+ response: new Response(null, {
90
+ headers: { 'Retry-After': '1' },
91
+ status: 409,
92
+ }),
93
+ };
94
+ }
95
+ await parameters.hooks?.renewed?.({
96
+ periodIndex,
97
+ receipt: renewal.result.receipt,
98
+ subscription: renewal.result.subscription,
99
+ });
100
+ return {
101
+ receipt: renewal.result.receipt,
102
+ };
103
+ }
104
+ return {
105
+ receipt: SubscriptionReceipt.fromRecord(subscription),
106
+ };
107
+ },
108
+ async request({ capturedRequest, credential, request }) {
109
+ const credentialRequest = credential?.challenge.request;
110
+ const chainId = request.chainId ??
111
+ parameters.chainId ??
112
+ credentialRequest?.methodDetails?.chainId ??
113
+ defaults.chainId.testnet;
114
+ const parsedRequest = Methods.subscription.schema.request.parse({
115
+ ...request,
116
+ chainId,
117
+ });
118
+ const input = requestFromCaptured(capturedRequest);
119
+ const resolved = await parameters.resolve({ input, request: parsedRequest });
120
+ const existing = resolved ? await store.getByKey(resolved.key) : null;
121
+ const accessKey = resolved && !credential
122
+ ? await resolveChallengeAccessKey({
123
+ existing,
124
+ input,
125
+ parameters,
126
+ request: parsedRequest,
127
+ resolved,
128
+ store,
129
+ })
130
+ : (credentialRequest?.methodDetails?.accessKey ?? parsedRequest.methodDetails?.accessKey);
131
+ if (!accessKey) {
132
+ throw new VerificationFailedError({ reason: 'subscription accessKey is missing' });
133
+ }
134
+ // Challenges carry the server-generated key in methodDetails so the shared request shape stays spec-compatible.
135
+ return {
136
+ ...request,
137
+ methodDetails: {
138
+ ...request.methodDetails,
139
+ accessKey,
140
+ },
141
+ chainId,
142
+ };
143
+ },
144
+ stableBinding: subscriptionBinding,
145
+ async verify({ credential, envelope, request }) {
146
+ const input = requestFromCaptured(envelope?.capturedRequest);
147
+ const parsed = Methods.subscription.schema.request.safeParse(request);
148
+ const parsedRequest = parsed.success ? parsed.data : request;
149
+ assertSubscriptionTiming({
150
+ challengeExpires: credential.challenge.expires,
151
+ request: parsedRequest,
152
+ });
153
+ const resolved = await parameters.resolve({ input, request: parsedRequest });
154
+ if (!resolved) {
155
+ throw new VerificationFailedError({ reason: 'subscription could not be resolved' });
156
+ }
157
+ const challengeRequest = credential.challenge.request;
158
+ const accessKey = challengeRequest.methodDetails?.accessKey ??
159
+ parsedRequest.methodDetails?.accessKey ??
160
+ (await resolveAccessKey({ input, parameters, request: parsedRequest, resolved }));
161
+ if (!accessKey) {
162
+ throw new VerificationFailedError({ reason: 'subscription accessKey is missing' });
163
+ }
164
+ const verified = verifySubscriptionKeyAuthorization({
165
+ accessKey,
166
+ chainId: parsedRequest.methodDetails?.chainId ?? defaults.chainId.testnet,
167
+ payload: credential.payload,
168
+ request: parsedRequest,
169
+ });
170
+ const declaredSource = credential.source ? Proof.parsePkhSource(credential.source) : null;
171
+ if (declaredSource &&
172
+ (declaredSource.chainId !== verified.source.chainId ||
173
+ !isAddressEqual(declaredSource.address, verified.source.address))) {
174
+ throw new VerificationFailedError({ reason: 'credential source does not match signature' });
175
+ }
176
+ const activation = await store.activate({
177
+ challengeId: credential.challenge.id,
178
+ isReusable: (subscription) => isReusableSubscription(subscription, parsedRequest),
179
+ lookupKey: resolved.key,
180
+ async create() {
181
+ const activation = withSubscriptionAccessKey(await activateSubscription({
182
+ accessKey,
183
+ auto: {
184
+ challengeId: credential.challenge.id,
185
+ getClient,
186
+ keyAuthorization: credential.payload.signature,
187
+ realm: credential.challenge.realm,
188
+ store,
189
+ waitForConfirmation,
190
+ },
191
+ credential: credential,
192
+ input,
193
+ parameters,
194
+ request: parsedRequest,
195
+ resolved,
196
+ source: verified.source,
197
+ }), accessKey);
198
+ validateSubscriptionSettlement(activation, {
199
+ expectedLookupKey: resolved.key,
200
+ expectedPeriodIndex: 0,
201
+ request: parsedRequest,
202
+ });
203
+ return activation;
204
+ },
205
+ });
206
+ if (activation.status === 'replayed') {
207
+ throw new VerificationFailedError({
208
+ reason: 'subscription credential has already been used',
209
+ });
210
+ }
211
+ if (activation.status === 'inFlight') {
212
+ throw new VerificationFailedError({
213
+ reason: 'subscription activation is already in flight',
214
+ });
215
+ }
216
+ if (activation.status === 'claimMismatch') {
217
+ throw new VerificationFailedError({ reason: 'subscription activation claim mismatch' });
218
+ }
219
+ if (activation.status === 'existing') {
220
+ return SubscriptionReceipt.fromRecord(activation.subscription);
221
+ }
222
+ await parameters.hooks?.activated?.({
223
+ receipt: activation.result.receipt,
224
+ subscription: activation.result.subscription,
225
+ });
226
+ return activation.result.receipt;
227
+ },
228
+ });
229
+ }
230
+ function requestFromCaptured(capturedRequest) {
231
+ if (!capturedRequest)
232
+ return new Request('https://subscription.invalid');
233
+ return new Request(capturedRequest.url, {
234
+ headers: capturedRequest.headers,
235
+ method: capturedRequest.method,
236
+ });
237
+ }
238
+ async function resolveAccessKey(parameters) {
239
+ const { input, parameters: subscriptionParameters, request, resolved } = parameters;
240
+ return (resolved.accessKey ??
241
+ (subscriptionParameters.accessKey
242
+ ? await subscriptionParameters.accessKey({ input, request, resolved })
243
+ : undefined));
244
+ }
245
+ async function resolveChallengeAccessKey(parameters) {
246
+ const { existing, input, parameters: subscriptionParameters, request, resolved, store, } = parameters;
247
+ if (!subscriptionParameters.activate) {
248
+ // In automatic mode, the SDK owns the server access key so apps can issue
249
+ // challenges from only their resolved subscription lookup key.
250
+ const accessKey = await store.getOrCreateAccessKey(resolved.key);
251
+ return {
252
+ accessKeyAddress: accessKey.accessKeyAddress,
253
+ keyType: accessKey.keyType,
254
+ };
255
+ }
256
+ // Manual activation keeps the lower-level API: callers can provide the
257
+ // access key for new challenges, while active subscriptions reuse the stored key.
258
+ return ((await resolveAccessKey({ input, parameters: subscriptionParameters, request, resolved })) ??
259
+ (existing && isActive(existing) ? existing.accessKey : undefined));
260
+ }
261
+ async function activateSubscription(parameters) {
262
+ const { accessKey, auto, credential, input, parameters: subscriptionParameters, request, resolved, source, } = parameters;
263
+ if (subscriptionParameters.activate) {
264
+ // A custom activate hook owns settlement and record creation.
265
+ return subscriptionParameters.activate({
266
+ accessKey,
267
+ credential,
268
+ input,
269
+ request,
270
+ resolved,
271
+ source,
272
+ });
273
+ }
274
+ if (!source) {
275
+ throw new VerificationFailedError({ reason: 'subscription payer is missing' });
276
+ }
277
+ // Automatic activation bills the first period and persists the recurring
278
+ // billing authority needed for request-path and background renewals.
279
+ const reference = await submitSubscriptionPayment({
280
+ accessKey,
281
+ getClient: auto.getClient,
282
+ keyAuthorization: auto.keyAuthorization,
283
+ lookupKey: resolved.key,
284
+ request,
285
+ settlementReference: auto.challengeId,
286
+ source,
287
+ store: auto.store,
288
+ waitForConfirmation: auto.waitForConfirmation,
289
+ });
290
+ const timestamp = new Date().toISOString();
291
+ const subscription = {
292
+ accessKey,
293
+ amount: request.amount,
294
+ billingAnchor: timestamp,
295
+ chainId: request.methodDetails?.chainId,
296
+ currency: request.currency,
297
+ externalId: request.externalId,
298
+ keyAuthorization: auto.keyAuthorization,
299
+ lastChargedPeriod: 0,
300
+ lookupKey: resolved.key,
301
+ payer: source,
302
+ periodCount: request.periodCount,
303
+ periodUnit: request.periodUnit,
304
+ recipient: request.recipient,
305
+ reference,
306
+ subscriptionExpires: request.subscriptionExpires,
307
+ subscriptionId: createSubscriptionId(),
308
+ timestamp,
309
+ };
310
+ return {
311
+ receipt: SubscriptionReceipt.createSubscriptionReceipt(subscription),
312
+ subscription,
313
+ };
314
+ }
315
+ async function settleRenewal(parameters) {
316
+ const { expectedLookupKey, periodIndex, renew, request, store, subscription } = parameters;
317
+ const inFlightReference = renewalReference(subscription.subscriptionId, periodIndex);
318
+ const renewal = await store.renew({
319
+ inFlightReference,
320
+ periodIndex,
321
+ async renew({ inFlightReference, periodIndex, subscription: started }) {
322
+ const renewed = withSubscriptionAccessKey(await renew({
323
+ inFlightReference,
324
+ periodIndex,
325
+ subscription: started,
326
+ }), started.accessKey);
327
+ validateSubscriptionSettlement(renewed, {
328
+ expectedLookupKey,
329
+ expectedPeriodIndex: periodIndex,
330
+ expectedSubscriptionId: subscription.subscriptionId,
331
+ previous: started,
332
+ request,
333
+ });
334
+ return renewed;
335
+ },
336
+ subscriptionId: subscription.subscriptionId,
337
+ });
338
+ if (renewal.status === 'charged') {
339
+ return { receipt: SubscriptionReceipt.fromRecord(renewal.subscription), status: 'charged' };
340
+ }
341
+ if (renewal.status === 'inFlight') {
342
+ return { receipt: SubscriptionReceipt.fromRecord(renewal.subscription), status: 'inFlight' };
343
+ }
344
+ if (renewal.status === 'renewed')
345
+ return { result: renewal.result, status: 'renewed' };
346
+ if (renewal.status === 'claimMismatch') {
347
+ throw new VerificationFailedError({ reason: 'subscription renewal claim mismatch' });
348
+ }
349
+ return null;
350
+ }
351
+ function renewalReference(subscriptionId, periodIndex) {
352
+ // This stable identifier is persisted before the billing hook runs so apps can
353
+ // use it as an idempotency/reconciliation key if a renewal crashes mid-flight.
354
+ return `renewal:${subscriptionId}:${periodIndex}`;
355
+ }
356
+ function withSubscriptionAccessKey(result, accessKey) {
357
+ if (!accessKey || result.subscription.accessKey)
358
+ return result;
359
+ return {
360
+ ...result,
361
+ subscription: {
362
+ ...result.subscription,
363
+ accessKey,
364
+ },
365
+ };
366
+ }
367
+ function getPeriodIndex(subscription) {
368
+ const anchor = new Date(subscription.billingAnchor).getTime();
369
+ const expires = new Date(subscription.subscriptionExpires).getTime();
370
+ const now = Date.now();
371
+ if (!Number.isFinite(anchor) || !Number.isFinite(expires) || now >= expires) {
372
+ return Number.POSITIVE_INFINITY;
373
+ }
374
+ let periodSeconds;
375
+ try {
376
+ periodSeconds = toSubscriptionPeriodSeconds(subscription);
377
+ }
378
+ catch {
379
+ return Number.POSITIVE_INFINITY;
380
+ }
381
+ return Math.max(0, Math.floor((now - anchor) / (periodSeconds * 1_000)));
382
+ }
383
+ function isActive(subscription) {
384
+ if (subscription.canceledAt || subscription.revokedAt)
385
+ return false;
386
+ return new Date(subscription.subscriptionExpires).getTime() > Date.now();
387
+ }
388
+ function isReusableSubscription(subscription, request) {
389
+ return (isActive(subscription) &&
390
+ getPeriodIndex(subscription) <= subscription.lastChargedPeriod &&
391
+ subscriptionMatchesRequest(subscription, request));
392
+ }
393
+ function subscriptionMatchesRequest(subscription, request) {
394
+ const actual = comparableSubscriptionBinding(subscription);
395
+ const expected = comparableSubscriptionBinding(request);
396
+ return Object.keys(expected).every((key) => actual[key] === expected[key]);
397
+ }
398
+ function comparableSubscriptionBinding(value) {
399
+ const chainId = 'chainId' in value ? value.chainId : value.methodDetails?.chainId;
400
+ return {
401
+ amount: value.amount,
402
+ chainId,
403
+ currency: value.currency.toLowerCase(),
404
+ externalId: value.externalId,
405
+ periodCount: value.periodCount,
406
+ periodUnit: value.periodUnit,
407
+ recipient: value.recipient.toLowerCase(),
408
+ subscriptionExpires: value.subscriptionExpires,
409
+ };
410
+ }
411
+ function validateSubscriptionSettlement(result, options) {
412
+ const { receipt, subscription } = result;
413
+ assertSubscriptionReceipt(receipt, subscription);
414
+ assertSubscriptionRecord(subscription, options);
415
+ if (options.request) {
416
+ assertSubscriptionRequestMatch(subscription, options.request);
417
+ }
418
+ else if (options.previous) {
419
+ assertSubscriptionRequestMatch(subscription, options.previous);
420
+ }
421
+ }
422
+ function assertSubscriptionReceipt(receipt, subscription) {
423
+ if (receipt.method !== 'tempo' || receipt.status !== 'success') {
424
+ throw new VerificationFailedError({ reason: 'subscription receipt is invalid' });
425
+ }
426
+ if (receipt.subscriptionId !== subscription.subscriptionId) {
427
+ throw new VerificationFailedError({ reason: 'subscription receipt id mismatch' });
428
+ }
429
+ if (receipt.reference !== subscription.reference) {
430
+ throw new VerificationFailedError({ reason: 'subscription receipt reference mismatch' });
431
+ }
432
+ if (receipt.timestamp !== subscription.timestamp) {
433
+ throw new VerificationFailedError({ reason: 'subscription receipt timestamp mismatch' });
434
+ }
435
+ assertTransactionHash(receipt.reference, 'subscription reference must be a transaction hash');
436
+ assertValidDate(receipt.timestamp, 'subscription receipt timestamp is invalid');
437
+ }
438
+ function assertSubscriptionRecord(subscription, options) {
439
+ assertBase64Url(subscription.subscriptionId, 'subscriptionId must be base64url');
440
+ assertTransactionHash(subscription.reference, 'subscription reference must be a transaction hash');
441
+ const billingAnchor = assertValidDate(subscription.billingAnchor, 'subscription billingAnchor is invalid');
442
+ const subscriptionExpires = assertValidDate(subscription.subscriptionExpires, 'subscriptionExpires is invalid');
443
+ assertEqual(subscription.lookupKey, options.expectedLookupKey, {
444
+ reason: 'subscription lookupKey does not match the resolved key',
445
+ });
446
+ assertEqual(subscription.lastChargedPeriod, options.expectedPeriodIndex, {
447
+ reason: 'subscription lastChargedPeriod does not match the settled period',
448
+ });
449
+ if (options.expectedSubscriptionId) {
450
+ assertEqual(subscription.subscriptionId, options.expectedSubscriptionId, {
451
+ reason: 'subscriptionId does not match the active subscription',
452
+ });
453
+ }
454
+ if (billingAnchor >= subscriptionExpires) {
455
+ throw new VerificationFailedError({
456
+ reason: 'subscription billingAnchor must be before subscriptionExpires',
457
+ });
458
+ }
459
+ }
460
+ function assertSubscriptionRequestMatch(subscription, request) {
461
+ if (!subscriptionMatchesRequest(subscription, request)) {
462
+ throw new VerificationFailedError({ reason: 'subscription record does not match request' });
463
+ }
464
+ }
465
+ function assertBase64Url(value, reason) {
466
+ if (!/^[A-Za-z0-9_-]+$/.test(value)) {
467
+ throw new VerificationFailedError({ reason });
468
+ }
469
+ }
470
+ function assertTransactionHash(value, reason) {
471
+ if (!/^0x[0-9a-fA-F]{64}$/.test(value)) {
472
+ throw new VerificationFailedError({ reason });
473
+ }
474
+ }
475
+ function assertValidDate(value, reason) {
476
+ const milliseconds = new Date(value).getTime();
477
+ if (!Number.isFinite(milliseconds)) {
478
+ throw new VerificationFailedError({ reason });
479
+ }
480
+ return milliseconds;
481
+ }
482
+ function assertEqual(actual, expected, options) {
483
+ if (actual !== expected) {
484
+ throw new VerificationFailedError(options);
485
+ }
486
+ }
487
+ function subscriptionBinding(request) {
488
+ return {
489
+ amount: request.amount,
490
+ chainId: request.methodDetails?.chainId,
491
+ currency: request.currency,
492
+ externalId: request.externalId,
493
+ periodCount: request.periodCount,
494
+ periodUnit: request.periodUnit,
495
+ recipient: request.recipient,
496
+ subscriptionExpires: request.subscriptionExpires,
497
+ };
498
+ }
499
+ function resolveRenewalHandler(parameters) {
500
+ const { getClient, parameters: subscriptionParameters, store, subscription, waitForConfirmation, } = parameters;
501
+ if (subscriptionParameters.renew)
502
+ return subscriptionParameters.renew;
503
+ if (!subscription.accessKey || !subscription.payer)
504
+ return undefined;
505
+ return async ({ inFlightReference, periodIndex, subscription }) => {
506
+ const reference = await submitSubscriptionPayment({
507
+ accessKey: subscription.accessKey,
508
+ getClient,
509
+ lookupKey: subscription.lookupKey,
510
+ request: subscription,
511
+ settlementReference: inFlightReference,
512
+ source: subscription.payer,
513
+ store,
514
+ waitForConfirmation,
515
+ });
516
+ const record = {
517
+ ...subscription,
518
+ lastChargedPeriod: periodIndex,
519
+ reference,
520
+ timestamp: new Date().toISOString(),
521
+ };
522
+ return {
523
+ receipt: SubscriptionReceipt.createSubscriptionReceipt(record),
524
+ subscription: record,
525
+ };
526
+ };
527
+ }
528
+ async function submitSubscriptionPayment(parameters) {
529
+ const { accessKey, getClient, keyAuthorization, lookupKey, request, settlementReference, source, store, waitForConfirmation, } = parameters;
530
+ const stored = await store.getAccessKey(lookupKey);
531
+ if (!stored) {
532
+ throw new VerificationFailedError({ reason: 'subscription access key is missing' });
533
+ }
534
+ const rawAccessAccount = TempoAccount.fromSecp256k1(stored.privateKey);
535
+ if (!isAddressEqual(rawAccessAccount.address, accessKey.accessKeyAddress)) {
536
+ throw new VerificationFailedError({
537
+ reason: 'subscription access key does not match stored key',
538
+ });
539
+ }
540
+ const chainId = request.methodDetails?.chainId ?? source.chainId;
541
+ const client = await getClient({ chainId });
542
+ const account = TempoAccount.fromSecp256k1(stored.privateKey, {
543
+ access: source.address,
544
+ });
545
+ const memo = Attribution.encode({
546
+ challengeId: settlementReference,
547
+ serverId: lookupKey,
548
+ });
549
+ const serializedTransaction = await signTransaction(client, {
550
+ account,
551
+ calls: [
552
+ {
553
+ data: encodeFunctionData({
554
+ abi: Abis.tip20,
555
+ functionName: 'transferWithMemo',
556
+ args: [request.recipient, BigInt(request.amount), memo],
557
+ }),
558
+ to: request.currency,
559
+ },
560
+ ],
561
+ chainId,
562
+ ...(keyAuthorization
563
+ ? { keyAuthorization: KeyAuthorization.deserialize(keyAuthorization) }
564
+ : {}),
565
+ });
566
+ const transaction = Transaction.deserialize(serializedTransaction);
567
+ await viem_call(client, {
568
+ ...transaction,
569
+ account: transaction.from,
570
+ calls: transaction.calls,
571
+ });
572
+ if (!waitForConfirmation) {
573
+ return sendRawTransaction(client, {
574
+ serializedTransaction: serializedTransaction,
575
+ });
576
+ }
577
+ const receipt = await sendRawTransactionSync(client, {
578
+ serializedTransaction: serializedTransaction,
579
+ });
580
+ if (receipt.status !== 'success') {
581
+ throw new VerificationFailedError({
582
+ reason: `subscription transaction reverted: ${receipt.transactionHash}`,
583
+ });
584
+ }
585
+ return receipt.transactionHash;
586
+ }
587
+ function createSubscriptionId() {
588
+ const bytes = new Uint8Array(18);
589
+ globalThis.crypto.getRandomValues(bytes);
590
+ return Base64.fromBytes(bytes, { url: true }).replace(/=+$/, '');
591
+ }
592
+ /**
593
+ * Renews an overdue subscription outside of the HTTP request path.
594
+ * Intended for cron jobs or background workers that bill subscriptions on a schedule.
595
+ *
596
+ * Returns the renewal result if the subscription was overdue, or `null` if already current.
597
+ */
598
+ export async function renew(parameters) {
599
+ const { store: rawStore, waitForConfirmation = true } = parameters;
600
+ const store = SubscriptionStore.fromStore(rawStore, {
601
+ renewalTimeoutMs: parameters.renewalTimeoutMs,
602
+ });
603
+ const getClient = ClientResolver.getResolver({
604
+ chain: tempo_chain,
605
+ getClient: parameters.getClient,
606
+ rpcUrl: defaults.rpcUrl,
607
+ });
608
+ const record = await store.get(parameters.subscriptionId);
609
+ if (!record)
610
+ return null;
611
+ if (!isActive(record))
612
+ return null;
613
+ const active = await store.getByKey(record.lookupKey);
614
+ if (active?.subscriptionId !== record.subscriptionId)
615
+ return null;
616
+ const periodIndex = getPeriodIndex(record);
617
+ if (periodIndex <= record.lastChargedPeriod)
618
+ return null;
619
+ const renew = resolveRenewalHandler({
620
+ getClient,
621
+ parameters,
622
+ store,
623
+ subscription: record,
624
+ waitForConfirmation,
625
+ });
626
+ if (!renew)
627
+ return null;
628
+ const renewal = await settleRenewal({
629
+ expectedLookupKey: record.lookupKey,
630
+ periodIndex,
631
+ renew,
632
+ store,
633
+ subscription: record,
634
+ });
635
+ return renewal?.status === 'renewed' ? renewal.result : null;
636
+ }
637
+ //# sourceMappingURL=Subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Subscription.js","sourceRoot":"","sources":["../../../src/tempo/server/Subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAA2C,MAAM,MAAM,CAAA;AAClG,OAAO,EACL,IAAI,IAAI,SAAS,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAChB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEzD,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAEvC,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAA;AACnD,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAE7C,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AACxC,OAAO,EACL,wBAAwB,EACxB,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,qCAAqC,CAAA;AAC5C,OAAO,KAAK,mBAAmB,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAA;AAY7D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,CAAmD;IAEnD,MAAM,UAAU,GAAG,CAAe,CAAA;IAClC,MAAM,QAAQ,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAEnD,CAAA;IACD,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IACD,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAA;IACrE,MAAM,EACJ,MAAM,EACN,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,EAChE,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,mBAAmB,GAAG,IAAI,GAC3B,GAAG,UAAU,CAAA;IAEd,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE;QAClD,mBAAmB,EAAE,UAAU,CAAC,mBAAmB;QACnD,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;KAC9C,CAAC,CAAA;IACF,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC;QAC3C,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC,CAAA;IAGF,OAAO,MAAM,CAAC,QAAQ,CAAwC,OAAO,CAAC,YAAY,EAAE;QAClF,QAAQ,EAAE;YACR,MAAM;YACN,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,UAAU;YACV,WAAW;YACX,UAAU;YACV,SAAS;YACT,mBAAmB;SACG;QAExB,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE;YAChC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;YAC7D,IAAI,CAAC,QAAQ;gBAAE,OAAO,SAAS,CAAA;YAE/B,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YACvD,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,OAAO,SAAS,CAAA;YAC9D,IAAI,CAAC,0BAA0B,CAAC,YAAY,EAAE,OAAO,CAAC;gBAAE,OAAO,SAAS,CAAA;YAExE,MAAM,WAAW,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;YAChD,IAAI,WAAW,GAAG,YAAY,CAAC,iBAAiB,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,qBAAqB,CAAC;oBAClC,SAAS;oBACT,UAAU;oBACV,KAAK;oBACL,YAAY;oBACZ,mBAAmB;iBACpB,CAAC,CAAA;gBACF,IAAI,CAAC,KAAK;oBAAE,OAAO,SAAS,CAAA;gBAE5B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;oBAClC,iBAAiB,EAAE,QAAQ,CAAC,GAAG;oBAC/B,WAAW;oBACX,KAAK;oBACL,OAAO;oBACP,KAAK;oBACL,YAAY;iBACb,CAAC,CAAA;gBACF,IAAI,CAAC,OAAO;oBAAE,OAAO,SAAS,CAAA;gBAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;oBAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAA;gBACrE,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBAClC,OAAO;wBACL,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,QAAQ,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE;4BAC3B,OAAO,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE;4BAC/B,MAAM,EAAE,GAAG;yBACZ,CAAC;qBACH,CAAA;gBACH,CAAC;gBAED,MAAM,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;oBAChC,WAAW;oBACX,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;oBAC/B,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY;iBAC1C,CAAC,CAAA;gBACF,OAAO;oBACL,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;iBAChC,CAAA;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,mBAAmB,CAAC,UAAU,CAAC,YAAY,CAAC;aACtD,CAAA;QACH,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE;YACpD,MAAM,iBAAiB,GAAG,UAAU,EAAE,SAAS,CAAC,OAA0C,CAAA;YAC1F,MAAM,OAAO,GACX,OAAO,CAAC,OAAO;gBACf,UAAU,CAAC,OAAO;gBAClB,iBAAiB,EAAE,aAAa,EAAE,OAAO;gBACzC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAA;YAC1B,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC9D,GAAG,OAAO;gBACV,OAAO;aACR,CAAC,CAAA;YACF,MAAM,KAAK,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAA;YAClD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAA;YAC5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACrE,MAAM,SAAS,GACb,QAAQ,IAAI,CAAC,UAAU;gBACrB,CAAC,CAAC,MAAM,yBAAyB,CAAC;oBAC9B,QAAQ;oBACR,KAAK;oBACL,UAAU;oBACV,OAAO,EAAE,aAAa;oBACtB,QAAQ;oBACR,KAAK;iBACN,CAAC;gBACJ,CAAC,CAAC,CAAC,iBAAiB,EAAE,aAAa,EAAE,SAAS,IAAI,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;YAC7F,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC,CAAA;YACpF,CAAC;YAED,gHAAgH;YAChH,OAAO;gBACL,GAAG,OAAO;gBACV,aAAa,EAAE;oBACb,GAAG,OAAO,CAAC,aAAa;oBACxB,SAAS;iBACV;gBACD,OAAO;aACR,CAAA;QACH,CAAC;QAED,aAAa,EAAE,mBAAmB;QAElC,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE;YAC5C,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;YAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YACrE,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,OAA+B,CAAA;YACrF,wBAAwB,CAAC;gBACvB,gBAAgB,EAAE,UAAU,CAAC,SAAS,CAAC,OAAO;gBAC9C,OAAO,EAAE,aAAa;aACvB,CAAC,CAAA;YACF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAA;YAE5E,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC,CAAA;YACrF,CAAC;YACD,MAAM,gBAAgB,GAAG,UAAU,CAAC,SAAS,CAAC,OAA8B,CAAA;YAC5E,MAAM,SAAS,GACb,gBAAgB,CAAC,aAAa,EAAE,SAAS;gBACzC,aAAa,CAAC,aAAa,EAAE,SAAS;gBACtC,CAAC,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACnF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC,CAAA;YACpF,CAAC;YACD,MAAM,QAAQ,GAAG,kCAAkC,CAAC;gBAClD,SAAS;gBACT,OAAO,EAAE,aAAa,CAAC,aAAa,EAAE,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO;gBACzE,OAAO,EAAE,UAAU,CAAC,OAAwC;gBAC5D,OAAO,EAAE,aAAa;aACvB,CAAC,CAAA;YACF,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACzF,IACE,cAAc;gBACd,CAAC,cAAc,CAAC,OAAO,KAAK,QAAQ,CAAC,MAAM,CAAC,OAAO;oBACjD,CAAC,cAAc,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EACnE,CAAC;gBACD,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,4CAA4C,EAAE,CAAC,CAAA;YAC7F,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC;gBACtC,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE;gBACpC,UAAU,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,sBAAsB,CAAC,YAAY,EAAE,aAAa,CAAC;gBACjF,SAAS,EAAE,QAAQ,CAAC,GAAG;gBACvB,KAAK,CAAC,MAAM;oBACV,MAAM,UAAU,GAAG,yBAAyB,CAC1C,MAAM,oBAAoB,CAAC;wBACzB,SAAS;wBACT,IAAI,EAAE;4BACJ,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE;4BACpC,SAAS;4BACT,gBAAgB,EAAG,UAAU,CAAC,OAAyC,CAAC,SAAS;4BACjF,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,KAAK;4BACjC,KAAK;4BACL,mBAAmB;yBACpB;wBACD,UAAU,EAAE,UAEX;wBACD,KAAK;wBACL,UAAU;wBACV,OAAO,EAAE,aAAa;wBACtB,QAAQ;wBACR,MAAM,EAAE,QAAQ,CAAC,MAAM;qBACxB,CAAC,EACF,SAAS,CACV,CAAA;oBACD,8BAA8B,CAAC,UAAU,EAAE;wBACzC,iBAAiB,EAAE,QAAQ,CAAC,GAAG;wBAC/B,mBAAmB,EAAE,CAAC;wBACtB,OAAO,EAAE,aAAa;qBACvB,CAAC,CAAA;oBACF,OAAO,UAAU,CAAA;gBACnB,CAAC;aACF,CAAC,CAAA;YACF,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACrC,MAAM,IAAI,uBAAuB,CAAC;oBAChC,MAAM,EAAE,+CAA+C;iBACxD,CAAC,CAAA;YACJ,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACrC,MAAM,IAAI,uBAAuB,CAAC;oBAChC,MAAM,EAAE,8CAA8C;iBACvD,CAAC,CAAA;YACJ,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;gBAC1C,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,wCAAwC,EAAE,CAAC,CAAA;YACzF,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACrC,OAAO,mBAAmB,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;YAChE,CAAC;YAED,MAAM,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;gBAClC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO;gBAClC,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY;aAC7C,CAAC,CAAA;YACF,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAA;QAClC,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,eAAmD;IAC9E,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,OAAO,CAAC,8BAA8B,CAAC,CAAA;IACxE,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE;QACtC,OAAO,EAAE,eAAe,CAAC,OAAO;QAChC,MAAM,EAAE,eAAe,CAAC,MAAM;KAC/B,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,UAK/B;IACC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAA;IACnF,OAAO,CACL,QAAQ,CAAC,SAAS;QAClB,CAAC,sBAAsB,CAAC,SAAS;YAC/B,CAAC,CAAC,MAAM,sBAAsB,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtE,CAAC,CAAC,SAAS,CAAC,CACf,CAAA;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,UAOxC;IACC,MAAM,EACJ,QAAQ,EACR,KAAK,EACL,UAAU,EAAE,sBAAsB,EAClC,OAAO,EACP,QAAQ,EACR,KAAK,GACN,GAAG,UAAU,CAAA;IACd,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;QACrC,0EAA0E;QAC1E,+DAA+D;QAC/D,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAChE,OAAO;YACL,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;YAC5C,OAAO,EAAE,SAAS,CAAC,OAAO;SACK,CAAA;IACnC,CAAC;IACD,uEAAuE;IACvE,kFAAkF;IAClF,OAAO,CACL,CAAC,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1F,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAClE,CAAA;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,UAmBnC;IACC,MAAM,EACJ,SAAS,EACT,IAAI,EACJ,UAAU,EACV,KAAK,EACL,UAAU,EAAE,sBAAsB,EAClC,OAAO,EACP,QAAQ,EACR,MAAM,GACP,GAAG,UAAU,CAAA;IACd,IAAI,sBAAsB,CAAC,QAAQ,EAAE,CAAC;QACpC,8DAA8D;QAC9D,OAAO,sBAAsB,CAAC,QAAQ,CAAC;YACrC,SAAS;YACT,UAAU;YACV,KAAK;YACL,OAAO;YACP,QAAQ;YACR,MAAM;SACP,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC,CAAA;IAChF,CAAC;IAED,yEAAyE;IACzE,qEAAqE;IACrE,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC;QAChD,SAAS;QACT,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,SAAS,EAAE,QAAQ,CAAC,GAAG;QACvB,OAAO;QACP,mBAAmB,EAAE,IAAI,CAAC,WAAW;QACrC,MAAM;QACN,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;KAC9C,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC1C,MAAM,YAAY,GAAG;QACnB,SAAS;QACT,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,aAAa,EAAE,SAAS;QACxB,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO;QACvC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,iBAAiB,EAAE,CAAC;QACpB,SAAS,EAAE,QAAQ,CAAC,GAAG;QACvB,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS;QACT,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;QAChD,cAAc,EAAE,oBAAoB,EAAE;QACtC,SAAS;KACmB,CAAA;IAE9B,OAAO;QACL,OAAO,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,YAAY,CAAC;QACpE,YAAY;KACb,CAAA;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,UAW5B;IAMC,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,UAAU,CAAA;IAC1F,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,YAAY,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;IACpF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC;QAChC,iBAAiB;QACjB,WAAW;QACX,KAAK,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE;YACnE,MAAM,OAAO,GAAG,yBAAyB,CACvC,MAAM,KAAK,CAAC;gBACV,iBAAiB;gBACjB,WAAW;gBACX,YAAY,EAAE,OAAO;aACtB,CAAC,EACF,OAAO,CAAC,SAAS,CAClB,CAAA;YACD,8BAA8B,CAAC,OAAO,EAAE;gBACtC,iBAAiB;gBACjB,mBAAmB,EAAE,WAAW;gBAChC,sBAAsB,EAAE,YAAY,CAAC,cAAc;gBACnD,QAAQ,EAAE,OAAO;gBACjB,OAAO;aACR,CAAC,CAAA;YACF,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,cAAc,EAAE,YAAY,CAAC,cAAc;KAC5C,CAAC,CAAA;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC7F,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;IAC9F,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACtF,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QACvC,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC,CAAA;IACtF,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,cAAsB,EAAE,WAAmB;IACnE,+EAA+E;IAC/E,+EAA+E;IAC/E,OAAO,WAAW,cAAc,IAAI,WAAW,EAAE,CAAA;AACnD,CAAC;AAED,SAAS,yBAAyB,CAEhC,MAAc,EAAE,SAA4C;IAC5D,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,YAAY,CAAC,SAAS;QAAE,OAAO,MAAM,CAAA;IAC9D,OAAO;QACL,GAAG,MAAM;QACT,YAAY,EAAE;YACZ,GAAG,MAAM,CAAC,YAAY;YACtB,SAAS;SACV;KACF,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,YAAgC;IACtD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAA;IAC7D,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,OAAO,EAAE,CAAA;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;QAC5E,OAAO,MAAM,CAAC,iBAAiB,CAAA;IACjC,CAAC;IAED,IAAI,aAAqB,CAAA;IACzB,IAAI,CAAC;QACH,aAAa,GAAG,2BAA2B,CAAC,YAAY,CAAC,CAAA;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,iBAAiB,CAAA;IACjC,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;AAC1E,CAAC;AAED,SAAS,QAAQ,CAAC,YAAgC;IAChD,IAAI,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,SAAS;QAAE,OAAO,KAAK,CAAA;IACnE,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;AAC1E,CAAC;AAED,SAAS,sBAAsB,CAC7B,YAAgC,EAChC,OAA4B;IAE5B,OAAO,CACL,QAAQ,CAAC,YAAY,CAAC;QACtB,cAAc,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,iBAAiB;QAC9D,0BAA0B,CAAC,YAAY,EAAE,OAAO,CAAC,CAClD,CAAA;AACH,CAAC;AAED,SAAS,0BAA0B,CACjC,YAAgC,EAChC,OAAiD;IAEjD,MAAM,MAAM,GAAG,6BAA6B,CAAC,YAAY,CAAC,CAAA;IAC1D,MAAM,QAAQ,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAA;IACvD,OAAQ,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA+B,CAAC,KAAK,CAC/D,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CACvC,CAAA;AACH,CAAC;AAED,SAAS,6BAA6B,CAAC,KAA+C;IACpF,MAAM,OAAO,GACX,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,KAA6B,CAAC,aAAa,EAAE,OAAO,CAAA;IAC5F,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO;QACP,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE;QACtC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;QACxC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;KAC/C,CAAA;AACH,CAAC;AAED,SAAS,8BAA8B,CACrC,MAAkE,EAClE,OAMC;IAED,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IACxC,yBAAyB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAChD,wBAAwB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAE/C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,8BAA8B,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/D,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5B,8BAA8B,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChE,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,OAAiC,EACjC,YAAgC;IAEhC,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC,CAAA;IAClF,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,KAAK,YAAY,CAAC,cAAc,EAAE,CAAC;QAC3D,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC,CAAA;IACnF,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,YAAY,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC,CAAA;IAC1F,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,YAAY,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC,CAAA;IAC1F,CAAC;IACD,qBAAqB,CAAC,OAAO,CAAC,SAAS,EAAE,mDAAmD,CAAC,CAAA;IAC7F,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,2CAA2C,CAAC,CAAA;AACjF,CAAC;AAED,SAAS,wBAAwB,CAC/B,YAAgC,EAChC,OAIC;IAED,eAAe,CAAC,YAAY,CAAC,cAAc,EAAE,kCAAkC,CAAC,CAAA;IAChF,qBAAqB,CAAC,YAAY,CAAC,SAAS,EAAE,mDAAmD,CAAC,CAAA;IAClG,MAAM,aAAa,GAAG,eAAe,CACnC,YAAY,CAAC,aAAa,EAC1B,uCAAuC,CACxC,CAAA;IACD,MAAM,mBAAmB,GAAG,eAAe,CACzC,YAAY,CAAC,mBAAmB,EAChC,gCAAgC,CACjC,CAAA;IAED,WAAW,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,iBAAiB,EAAE;QAC7D,MAAM,EAAE,wDAAwD;KACjE,CAAC,CAAA;IACF,WAAW,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,EAAE;QACvE,MAAM,EAAE,kEAAkE;KAC3E,CAAC,CAAA;IACF,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;QACnC,WAAW,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,sBAAsB,EAAE;YACvE,MAAM,EAAE,uDAAuD;SAChE,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,mBAAmB,EAAE,CAAC;QACzC,MAAM,IAAI,uBAAuB,CAAC;YAChC,MAAM,EAAE,+DAA+D;SACxE,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B,CACrC,YAAgC,EAChC,OAAiD;IAEjD,IAAI,CAAC,0BAA0B,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,4CAA4C,EAAE,CAAC,CAAA;IAC7F,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,MAAc;IACpD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa,EAAE,MAAc;IAC1D,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,MAAc;IACpD,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;IAC9C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/C,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,SAAS,WAAW,CAAQ,MAAa,EAAE,QAAe,EAAE,OAA2B;IACrF,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,IAAI,uBAAuB,CAAC,OAAO,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAA4B;IACvD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO;QACvC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;KACjD,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,UAc9B;IAOC,MAAM,EACJ,SAAS,EACT,UAAU,EAAE,sBAAsB,EAClC,KAAK,EACL,YAAY,EACZ,mBAAmB,GACpB,GAAG,UAAU,CAAA;IACd,IAAI,sBAAsB,CAAC,KAAK;QAAE,OAAO,sBAAsB,CAAC,KAAK,CAAA;IACrE,IAAI,CAAC,YAAY,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IACpE,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,EAAE;QAChE,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC;YAChD,SAAS,EAAE,YAAY,CAAC,SAAU;YAClC,SAAS;YACT,SAAS,EAAE,YAAY,CAAC,SAAS;YACjC,OAAO,EAAE,YAAY;YACrB,mBAAmB,EAAE,iBAAiB;YACtC,MAAM,EAAE,YAAY,CAAC,KAAM;YAC3B,KAAK;YACL,mBAAmB;SACpB,CAAC,CAAA;QACF,MAAM,MAAM,GAAG;YACb,GAAG,YAAY;YACf,iBAAiB,EAAE,WAAW;YAC9B,SAAS;YACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACP,CAAA;QAC9B,OAAO;YACL,OAAO,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,MAAM,CAAC;YAC9D,YAAY,EAAE,MAAM;SACrB,CAAA;IACH,CAAC,CAAA;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,UAYxC;IACC,MAAM,EACJ,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,MAAM,EACN,KAAK,EACL,mBAAmB,GACpB,GAAG,UAAU,CAAA;IACd,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC,CAAA;IACrF,CAAC;IACD,MAAM,gBAAgB,GAAG,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACtE,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,uBAAuB,CAAC;YAChC,MAAM,EAAE,mDAAmD;SAC5D,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,CAAA;IAChE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE;QAC5D,MAAM,EAAE,MAAM,CAAC,OAAO;KACvB,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;QAC9B,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,SAAS;KACpB,CAAC,CAAA;IACF,MAAM,qBAAqB,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE;QAC1D,OAAO;QACP,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,kBAAkB,CAAC;oBACvB,GAAG,EAAE,IAAI,CAAC,KAAK;oBACf,YAAY,EAAE,kBAAkB;oBAChC,IAAI,EAAE,CAAC,OAAO,CAAC,SAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;iBACnE,CAAC;gBACF,EAAE,EAAE,OAAO,CAAC,QAAmB;aAChC;SACF;QACD,OAAO;QACP,GAAG,CAAC,gBAAgB;YAClB,CAAC,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,WAAW,CAAC,gBAAgB,CAAC,EAAE;YACtE,CAAC,CAAC,EAAE,CAAC;KACC,CAAC,CAAA;IACX,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CACzC,qBAA+D,CAChE,CAAA;IACD,MAAM,SAAS,CAAC,MAAM,EAAE;QACtB,GAAG,WAAW;QACd,OAAO,EAAE,WAAW,CAAC,IAAI;QACzB,KAAK,EAAE,WAAW,CAAC,KAAK;KAChB,CAAC,CAAA;IAEX,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,OAAO,kBAAkB,CAAC,MAAM,EAAE;YAChC,qBAAqB,EAAE,qBAA+D;SACvF,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE;QACnD,qBAAqB,EAAE,qBAA+D;KACvF,CAAC,CAAA;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,uBAAuB,CAAC;YAChC,MAAM,EAAE,sCAAsC,OAAO,CAAC,eAAe,EAAE;SACxE,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,eAAe,CAAA;AAChC,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IACxC,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,UAA4B;IACtD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EAAE,GAAG,UAAU,CAAA;IAClE,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE;QAClD,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;KAC9C,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC;QAC3C,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;IACzD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IAClC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACrD,IAAI,MAAM,EAAE,cAAc,KAAK,MAAM,CAAC,cAAc;QAAE,OAAO,IAAI,CAAA;IAEjE,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IAC1C,IAAI,WAAW,IAAI,MAAM,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAA;IAExD,MAAM,KAAK,GAAG,qBAAqB,CAAC;QAClC,SAAS;QACT,UAAU;QACV,KAAK;QACL,YAAY,EAAE,MAAM;QACpB,mBAAmB;KACpB,CAAC,CAAA;IACF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAEvB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;QAClC,iBAAiB,EAAE,MAAM,CAAC,SAAS;QACnC,WAAW;QACX,KAAK;QACL,KAAK;QACL,YAAY,EAAE,MAAM;KACrB,CAAC,CAAA;IACF,OAAO,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9D,CAAC"}