accounts 0.3.0 → 0.4.1

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 +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +97 -0
  4. package/dist/core/AccessKey.d.ts +55 -0
  5. package/dist/core/AccessKey.d.ts.map +1 -0
  6. package/dist/core/AccessKey.js +69 -0
  7. package/dist/core/AccessKey.js.map +1 -0
  8. package/dist/core/Account.d.ts +91 -0
  9. package/dist/core/Account.d.ts.map +1 -0
  10. package/dist/core/Account.js +64 -0
  11. package/dist/core/Account.js.map +1 -0
  12. package/dist/core/Adapter.d.ts +187 -0
  13. package/dist/core/Adapter.d.ts.map +1 -0
  14. package/dist/core/Adapter.js +7 -0
  15. package/dist/core/Adapter.js.map +1 -0
  16. package/dist/core/Ceremony.d.ts +109 -0
  17. package/dist/core/Ceremony.d.ts.map +1 -0
  18. package/dist/core/Ceremony.js +104 -0
  19. package/dist/core/Ceremony.js.map +1 -0
  20. package/dist/core/Client.d.ts +16 -0
  21. package/dist/core/Client.d.ts.map +1 -0
  22. package/dist/core/Client.js +18 -0
  23. package/dist/core/Client.js.map +1 -0
  24. package/dist/core/Dialog.d.ts +52 -0
  25. package/dist/core/Dialog.d.ts.map +1 -0
  26. package/dist/core/Dialog.js +342 -0
  27. package/dist/core/Dialog.js.map +1 -0
  28. package/dist/core/Expiry.d.ts +15 -0
  29. package/dist/core/Expiry.d.ts.map +1 -0
  30. package/dist/core/Expiry.js +29 -0
  31. package/dist/core/Expiry.js.map +1 -0
  32. package/dist/core/Messenger.d.ts +86 -0
  33. package/dist/core/Messenger.d.ts.map +1 -0
  34. package/dist/core/Messenger.js +127 -0
  35. package/dist/core/Messenger.js.map +1 -0
  36. package/dist/core/Provider.d.ts +69 -0
  37. package/dist/core/Provider.d.ts.map +1 -0
  38. package/dist/core/Provider.js +401 -0
  39. package/dist/core/Provider.js.map +1 -0
  40. package/dist/core/Remote.d.ts +114 -0
  41. package/dist/core/Remote.d.ts.map +1 -0
  42. package/dist/core/Remote.js +116 -0
  43. package/dist/core/Remote.js.map +1 -0
  44. package/dist/core/Schema.d.ts +805 -0
  45. package/dist/core/Schema.d.ts.map +1 -0
  46. package/dist/core/Schema.js +43 -0
  47. package/dist/core/Schema.js.map +1 -0
  48. package/dist/core/Storage.d.ts +42 -0
  49. package/dist/core/Storage.d.ts.map +1 -0
  50. package/dist/core/Storage.js +173 -0
  51. package/dist/core/Storage.js.map +1 -0
  52. package/dist/core/Store.d.ts +58 -0
  53. package/dist/core/Store.d.ts.map +1 -0
  54. package/dist/core/Store.js +58 -0
  55. package/dist/core/Store.js.map +1 -0
  56. package/dist/core/adapters/dangerous_secp256k1.d.ts +30 -0
  57. package/dist/core/adapters/dangerous_secp256k1.d.ts.map +1 -0
  58. package/dist/core/adapters/dangerous_secp256k1.js +39 -0
  59. package/dist/core/adapters/dangerous_secp256k1.js.map +1 -0
  60. package/dist/core/adapters/dialog.d.ts +31 -0
  61. package/dist/core/adapters/dialog.d.ts.map +1 -0
  62. package/dist/core/adapters/dialog.js +306 -0
  63. package/dist/core/adapters/dialog.js.map +1 -0
  64. package/dist/core/adapters/local.d.ts +33 -0
  65. package/dist/core/adapters/local.d.ts.map +1 -0
  66. package/dist/core/adapters/local.js +227 -0
  67. package/dist/core/adapters/local.js.map +1 -0
  68. package/dist/core/adapters/webAuthn.d.ts +36 -0
  69. package/dist/core/adapters/webAuthn.d.ts.map +1 -0
  70. package/dist/core/adapters/webAuthn.js +93 -0
  71. package/dist/core/adapters/webAuthn.js.map +1 -0
  72. package/dist/core/internal/withDedupe.d.ts +12 -0
  73. package/dist/core/internal/withDedupe.d.ts.map +1 -0
  74. package/dist/core/internal/withDedupe.js +12 -0
  75. package/dist/core/internal/withDedupe.js.map +1 -0
  76. package/dist/core/zod/request.d.ts +31 -0
  77. package/dist/core/zod/request.d.ts.map +1 -0
  78. package/dist/core/zod/request.js +41 -0
  79. package/dist/core/zod/request.js.map +1 -0
  80. package/dist/core/zod/rpc.d.ts +603 -0
  81. package/dist/core/zod/rpc.d.ts.map +1 -0
  82. package/dist/core/zod/rpc.js +293 -0
  83. package/dist/core/zod/rpc.js.map +1 -0
  84. package/dist/core/zod/utils.d.ts +18 -0
  85. package/dist/core/zod/utils.d.ts.map +1 -0
  86. package/dist/core/zod/utils.js +21 -0
  87. package/dist/core/zod/utils.js.map +1 -0
  88. package/dist/index.d.ts +15 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +15 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/internal/types.d.ts +284 -0
  93. package/dist/internal/types.d.ts.map +1 -0
  94. package/dist/internal/types.js +2 -0
  95. package/dist/internal/types.js.map +1 -0
  96. package/dist/server/Handler.d.ts +257 -0
  97. package/dist/server/Handler.d.ts.map +1 -0
  98. package/dist/server/Handler.js +433 -0
  99. package/dist/server/Handler.js.map +1 -0
  100. package/dist/server/Kv.d.ts +16 -0
  101. package/dist/server/Kv.d.ts.map +1 -0
  102. package/dist/server/Kv.js +30 -0
  103. package/dist/server/Kv.js.map +1 -0
  104. package/dist/server/index.d.ts +3 -0
  105. package/dist/server/index.d.ts.map +1 -0
  106. package/dist/server/index.js +3 -0
  107. package/dist/server/index.js.map +1 -0
  108. package/dist/server/internal/requestListener.d.ts +124 -0
  109. package/dist/server/internal/requestListener.d.ts.map +1 -0
  110. package/dist/server/internal/requestListener.js +173 -0
  111. package/dist/server/internal/requestListener.js.map +1 -0
  112. package/dist/wagmi/Connector.d.ts +93 -0
  113. package/dist/wagmi/Connector.d.ts.map +1 -0
  114. package/dist/wagmi/Connector.js +238 -0
  115. package/dist/wagmi/Connector.js.map +1 -0
  116. package/dist/wagmi/index.d.ts +3 -0
  117. package/dist/wagmi/index.d.ts.map +1 -0
  118. package/dist/wagmi/index.js +3 -0
  119. package/dist/wagmi/index.js.map +1 -0
  120. package/package.json +56 -2
  121. package/src/core/AccessKey.test.ts +257 -0
  122. package/src/core/AccessKey.ts +123 -0
  123. package/src/core/Account.test.ts +309 -0
  124. package/src/core/Account.ts +152 -0
  125. package/src/core/Adapter.ts +238 -0
  126. package/src/core/Ceremony.browser.test.ts +239 -0
  127. package/src/core/Ceremony.test.ts +151 -0
  128. package/src/core/Ceremony.ts +203 -0
  129. package/src/core/Client.ts +36 -0
  130. package/src/core/Dialog.browser.test.ts +309 -0
  131. package/src/core/Dialog.test-d.ts +19 -0
  132. package/src/core/Dialog.ts +442 -0
  133. package/src/core/Expiry.ts +34 -0
  134. package/src/core/Messenger.ts +206 -0
  135. package/src/core/Provider.browser.test.ts +774 -0
  136. package/src/core/Provider.connect.browser.test.ts +415 -0
  137. package/src/core/Provider.test-d.ts +53 -0
  138. package/src/core/Provider.test.ts +1566 -0
  139. package/src/core/Provider.ts +559 -0
  140. package/src/core/Remote.ts +262 -0
  141. package/src/core/Schema.test-d.ts +211 -0
  142. package/src/core/Schema.ts +143 -0
  143. package/src/core/Storage.ts +213 -0
  144. package/src/core/Store.test.ts +287 -0
  145. package/src/core/Store.ts +129 -0
  146. package/src/core/adapters/dangerous_secp256k1.ts +53 -0
  147. package/src/core/adapters/dialog.ts +379 -0
  148. package/src/core/adapters/local.test.ts +97 -0
  149. package/src/core/adapters/local.ts +277 -0
  150. package/src/core/adapters/webAuthn.ts +129 -0
  151. package/src/core/internal/withDedupe.test.ts +116 -0
  152. package/src/core/internal/withDedupe.ts +20 -0
  153. package/src/core/mppx.test.ts +83 -0
  154. package/src/core/zod/request.test.ts +121 -0
  155. package/src/core/zod/request.ts +70 -0
  156. package/src/core/zod/rpc.ts +374 -0
  157. package/src/core/zod/utils.test.ts +69 -0
  158. package/src/core/zod/utils.ts +40 -0
  159. package/src/index.ts +14 -0
  160. package/src/internal/types.ts +378 -0
  161. package/src/server/Handler.test.ts +1014 -0
  162. package/src/server/Handler.ts +605 -0
  163. package/src/server/Kv.ts +46 -0
  164. package/src/server/index.ts +2 -0
  165. package/src/server/internal/requestListener.ts +273 -0
  166. package/src/tsconfig.json +9 -0
  167. package/src/wagmi/Connector.ts +287 -0
  168. package/src/wagmi/index.ts +2 -0
@@ -0,0 +1,93 @@
1
+ import { PublicKey, Signature } from 'ox';
2
+ import { SignatureEnvelope } from 'ox/tempo';
3
+ import { Account } from 'viem/tempo';
4
+ import { Authentication, Registration } from 'webauthx/client';
5
+ import * as Adapter from '../Adapter.js';
6
+ import * as Ceremony from '../Ceremony.js';
7
+ import { local } from './local.js';
8
+ /**
9
+ * Creates a WebAuthn adapter backed by real passkey ceremonies.
10
+ *
11
+ * Wraps the {@link local} adapter with WebAuthn registration and authentication flows,
12
+ * using the provided {@link Ceremony} for challenge generation and verification.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { webAuthn } from 'accounts'
17
+ *
18
+ * const provider = Provider.create({
19
+ * adapter: webAuthn(),
20
+ * })
21
+ * ```
22
+ */
23
+ export function webAuthn(options = {}) {
24
+ const { authUrl, icon, name, rdns } = options;
25
+ return Adapter.define({ icon, name, rdns }, (parameters) => {
26
+ const { storage } = parameters;
27
+ const ceremony = options.ceremony ??
28
+ (authUrl ? Ceremony.server({ url: authUrl }) : Ceremony.local({ storage }));
29
+ const base = local({
30
+ async createAccount(parameters) {
31
+ const { options } = await ceremony.getRegistrationOptions(parameters);
32
+ const rpId = options.publicKey?.rp.id;
33
+ if (!rpId)
34
+ throw new Error('rpId is required');
35
+ const credential = await Registration.create({ options });
36
+ const { publicKey } = await ceremony.verifyRegistration(credential, {
37
+ name: parameters.name,
38
+ });
39
+ await storage.setItem('lastCredentialId', credential.id);
40
+ const account = Account.fromWebAuthnP256({ id: credential.id, publicKey });
41
+ return {
42
+ accounts: [
43
+ {
44
+ address: account.address,
45
+ keyType: 'webAuthn',
46
+ credential: { id: credential.id, publicKey, rpId },
47
+ },
48
+ ],
49
+ };
50
+ },
51
+ async loadAccounts(parameters = {}) {
52
+ const { selectAccount, digest } = parameters;
53
+ const credentialId = selectAccount
54
+ ? undefined
55
+ : (parameters?.credentialId ??
56
+ (await storage.getItem('lastCredentialId')) ??
57
+ undefined);
58
+ const { options } = await ceremony.getAuthenticationOptions({
59
+ ...parameters,
60
+ challenge: digest,
61
+ credentialId,
62
+ });
63
+ const rpId = options.publicKey?.rpId;
64
+ if (!rpId)
65
+ throw new Error('rpId is required');
66
+ const response = await Authentication.sign({ options });
67
+ const { publicKey } = await ceremony.verifyAuthentication(response);
68
+ await storage.setItem('lastCredentialId', response.id);
69
+ const account = Account.fromWebAuthnP256({ id: response.id, publicKey }, { rpId });
70
+ const signature = digest
71
+ ? SignatureEnvelope.serialize({
72
+ metadata: response.metadata,
73
+ publicKey: PublicKey.fromHex(publicKey),
74
+ signature: Signature.from(response.signature),
75
+ type: 'webAuthn',
76
+ }, { magic: true })
77
+ : undefined;
78
+ return {
79
+ accounts: [
80
+ {
81
+ address: account.address,
82
+ keyType: 'webAuthn',
83
+ credential: { id: response.id, publicKey, rpId },
84
+ },
85
+ ],
86
+ signature,
87
+ };
88
+ },
89
+ })(parameters);
90
+ return { ...base, persistAccounts: true };
91
+ });
92
+ }
93
+ //# sourceMappingURL=webAuthn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webAuthn.js","sourceRoot":"","sources":["../../../src/core/adapters/webAuthn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** Deduplicates in-flight promises by key. */
2
+ export declare function withDedupe<data>(fn: () => Promise<data>, { enabled, id }: withDedupe.Options): Promise<data>;
3
+ export declare namespace withDedupe {
4
+ var cache: Map<string, Promise<any>>;
5
+ }
6
+ export declare namespace withDedupe {
7
+ type Options = {
8
+ enabled?: boolean | undefined;
9
+ id?: string | undefined;
10
+ };
11
+ }
12
+ //# sourceMappingURL=withDedupe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withDedupe.d.ts","sourceRoot":"","sources":["../../../src/core/internal/withDedupe.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,wBAAgB,UAAU,CAAC,IAAI,EAC7B,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACvB,EAAE,OAAc,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,OAAO,GACzC,OAAO,CAAC,IAAI,CAAC,CAMf;yBATe,UAAU;;;AAW1B,MAAM,CAAC,OAAO,WAAW,UAAU,CAAC;IAClC,KAAK,OAAO,GAAG;QACb,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QAC7B,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KACxB,CAAA;CACF"}
@@ -0,0 +1,12 @@
1
+ /** Deduplicates in-flight promises by key. */
2
+ export function withDedupe(fn, { enabled = true, id }) {
3
+ if (!enabled || !id)
4
+ return fn();
5
+ if (withDedupe.cache.get(id))
6
+ return withDedupe.cache.get(id);
7
+ const promise = fn().finally(() => withDedupe.cache.delete(id));
8
+ withDedupe.cache.set(id, promise);
9
+ return promise;
10
+ }
11
+ withDedupe.cache = new Map();
12
+ //# sourceMappingURL=withDedupe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withDedupe.js","sourceRoot":"","sources":["../../../src/core/internal/withDedupe.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,MAAM,UAAU,UAAU,CACxB,EAAuB,EACvB,EAAE,OAAO,GAAG,IAAI,EAAE,EAAE,EAAsB;IAE1C,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,CAAA;IAChC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAE,CAAA;IAC9D,MAAM,OAAO,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IAC/D,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACjC,OAAO,OAAO,CAAA;AAChB,CAAC;AASD,UAAU,CAAC,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAA"}
@@ -0,0 +1,31 @@
1
+ import * as z from 'zod/mini';
2
+ /**
3
+ * Validates an incoming JSON-RPC request against the provider schema.
4
+ *
5
+ * Returns the original request augmented with a `_decoded` property
6
+ * containing the Zod-parsed output (with codec transforms applied).
7
+ *
8
+ * Throws EIP-1193 errors on validation failure:
9
+ * - `4200` if the method is not in the discriminated union
10
+ * - `-32602` if params fail validation
11
+ */
12
+ export declare function validate<const schema extends z.ZodMiniType>(schema: schema, value: unknown): WithDecoded<schema>;
13
+ /**
14
+ * A validated request with the decoded (Zod-parsed) output attached.
15
+ *
16
+ * Distributes over the union so that switching on `method` narrows
17
+ * both the input and `_decoded` properties together.
18
+ */
19
+ export type WithDecoded<schema extends z.ZodMiniType> = z.output<schema> extends infer decoded ? decoded extends {
20
+ method: infer m extends string;
21
+ } ? Extract<z.input<schema>, {
22
+ method: m;
23
+ }> & {
24
+ _decoded: decoded;
25
+ } : never : never;
26
+ /**
27
+ * Encodes a decoded (output) value back to its wire (input) format
28
+ * by running codec `reverseTransform` functions.
29
+ */
30
+ export declare function encode<const schema extends z.ZodMiniType>(schema: schema, value: z.output<schema>): z.input<schema>;
31
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/core/zod/request.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC,WAAW,EACzD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,WAAW,CAAC,MAAM,CAAC,CAcrB;AAiBD;;;;;GAKG;AACH,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,CAAC,CAAC,WAAW,IAClD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,MAAM,OAAO,GAClC,OAAO,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;IAAE,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC/D,KAAK,GACP,KAAK,CAAA;AAEX;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC,WAAW,EACvD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GACtB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAEjB"}
@@ -0,0 +1,41 @@
1
+ import { Provider } from 'ox';
2
+ import * as z from 'zod/mini';
3
+ /**
4
+ * Validates an incoming JSON-RPC request against the provider schema.
5
+ *
6
+ * Returns the original request augmented with a `_decoded` property
7
+ * containing the Zod-parsed output (with codec transforms applied).
8
+ *
9
+ * Throws EIP-1193 errors on validation failure:
10
+ * - `4200` if the method is not in the discriminated union
11
+ * - `-32602` if params fail validation
12
+ */
13
+ export function validate(schema, value) {
14
+ const result = z.safeParse(schema, value);
15
+ if (result.error) {
16
+ const issue = result.error.issues.at(0);
17
+ if (issue?.code === 'invalid_union' && issue.note === 'No matching discriminator')
18
+ throw new Provider.UnsupportedMethodError({
19
+ message: `Unsupported method "${value?.method}".`,
20
+ });
21
+ throw new Provider.ProviderRpcError(-32602, `Invalid params: ${formatIssues(result.error.issues)}`);
22
+ }
23
+ return { ...value, _decoded: result.data };
24
+ }
25
+ function formatIssues(issues) {
26
+ return issues
27
+ .flatMap((issue) => {
28
+ if (issue.code === 'invalid_union' && issue.errors.length > 0)
29
+ return issue.errors.flatMap((branch) => branch.map((i) => `${[...issue.path, ...i.path].join('.')}: ${i.code === 'invalid_union' && i.errors.length > 0 ? formatIssues([i]) : i.message}`));
30
+ return [`${issue.path.join('.')}: ${issue.message}`];
31
+ })
32
+ .join(', ');
33
+ }
34
+ /**
35
+ * Encodes a decoded (output) value back to its wire (input) format
36
+ * by running codec `reverseTransform` functions.
37
+ */
38
+ export function encode(schema, value) {
39
+ return z.encode(schema, value);
40
+ }
41
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/core/zod/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;AAC7B,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CACtB,MAAc,EACd,KAAc;IAEd,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACzC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,KAAK,EAAE,IAAI,KAAK,eAAe,IAAK,KAAa,CAAC,IAAI,KAAK,2BAA2B;YACxF,MAAM,IAAI,QAAQ,CAAC,sBAAsB,CAAC;gBACxC,OAAO,EAAE,uBAAwB,KAAa,EAAE,MAAM,IAAI;aAC3D,CAAC,CAAA;QACJ,MAAM,IAAI,QAAQ,CAAC,gBAAgB,CACjC,CAAC,KAAK,EACN,mBAAmB,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CACvD,CAAA;IACH,CAAC;IACD,OAAO,EAAE,GAAI,KAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAW,CAAA;AAC9D,CAAC;AAED,SAAS,YAAY,CAAC,MAAmC;IACvD,OAAO,MAAM;SACV,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAC3D,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACrC,MAAM,CAAC,GAAG,CACR,CAAC,CAAC,EAAE,EAAE,CACJ,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAClI,CACF,CAAA;QACH,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAeD;;;GAGG;AACH,MAAM,UAAU,MAAM,CACpB,MAAc,EACd,KAAuB;IAEvB,OAAQ,CAAwC,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AACxE,CAAC"}