ox 1.0.4 → 1.1.0

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 (230) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/core/Base64.d.ts +10 -21
  3. package/dist/core/Base64.d.ts.map +1 -1
  4. package/dist/core/Base64.js +8 -127
  5. package/dist/core/Base64.js.map +1 -1
  6. package/dist/core/BinaryStateTree.d.ts.map +1 -1
  7. package/dist/core/BinaryStateTree.js +2 -2
  8. package/dist/core/BinaryStateTree.js.map +1 -1
  9. package/dist/core/Bls.d.ts.map +1 -1
  10. package/dist/core/Bls.js +19 -44
  11. package/dist/core/Bls.js.map +1 -1
  12. package/dist/core/Ed25519.d.ts.map +1 -1
  13. package/dist/core/Ed25519.js +7 -6
  14. package/dist/core/Ed25519.js.map +1 -1
  15. package/dist/core/Engine.d.ts +124 -0
  16. package/dist/core/Engine.d.ts.map +1 -0
  17. package/dist/core/Engine.js +180 -0
  18. package/dist/core/Engine.js.map +1 -0
  19. package/dist/core/Hash.d.ts +4 -4
  20. package/dist/core/Hash.d.ts.map +1 -1
  21. package/dist/core/Hash.js +9 -12
  22. package/dist/core/Hash.js.map +1 -1
  23. package/dist/core/Keystore.d.ts.map +1 -1
  24. package/dist/core/Keystore.js +15 -10
  25. package/dist/core/Keystore.js.map +1 -1
  26. package/dist/core/Mnemonic.d.ts.map +1 -1
  27. package/dist/core/Mnemonic.js +3 -2
  28. package/dist/core/Mnemonic.js.map +1 -1
  29. package/dist/core/P256.d.ts.map +1 -1
  30. package/dist/core/P256.js +8 -9
  31. package/dist/core/P256.js.map +1 -1
  32. package/dist/core/Secp256k1.d.ts.map +1 -1
  33. package/dist/core/Secp256k1.js +8 -9
  34. package/dist/core/Secp256k1.js.map +1 -1
  35. package/dist/core/WebCryptoP256.d.ts.map +1 -1
  36. package/dist/core/WebCryptoP256.js +2 -2
  37. package/dist/core/WebCryptoP256.js.map +1 -1
  38. package/dist/core/X25519.d.ts.map +1 -1
  39. package/dist/core/X25519.js +4 -3
  40. package/dist/core/X25519.js.map +1 -1
  41. package/dist/core/internal/bls.d.ts +12 -0
  42. package/dist/core/internal/bls.d.ts.map +1 -0
  43. package/dist/core/internal/bls.js +79 -0
  44. package/dist/core/internal/bls.js.map +1 -0
  45. package/dist/core/internal/codec/base64.d.ts +84 -0
  46. package/dist/core/internal/codec/base64.d.ts.map +1 -0
  47. package/dist/core/internal/codec/base64.js +177 -0
  48. package/dist/core/internal/codec/base64.js.map +1 -0
  49. package/dist/core/internal/codec/hex.d.ts +49 -4
  50. package/dist/core/internal/codec/hex.d.ts.map +1 -1
  51. package/dist/core/internal/codec/hex.js +109 -35
  52. package/dist/core/internal/codec/hex.js.map +1 -1
  53. package/dist/core/internal/curves.d.ts +17 -0
  54. package/dist/core/internal/curves.d.ts.map +1 -0
  55. package/dist/core/internal/curves.js +17 -0
  56. package/dist/core/internal/curves.js.map +1 -0
  57. package/dist/core/internal/ed25519.d.ts +14 -0
  58. package/dist/core/internal/ed25519.d.ts.map +1 -0
  59. package/dist/core/internal/ed25519.js +29 -0
  60. package/dist/core/internal/ed25519.js.map +1 -0
  61. package/dist/core/internal/engine.d.ts +278 -0
  62. package/dist/core/internal/engine.d.ts.map +1 -0
  63. package/dist/core/internal/engine.js +131 -0
  64. package/dist/core/internal/engine.js.map +1 -0
  65. package/dist/core/internal/hash.d.ts +12 -0
  66. package/dist/core/internal/hash.d.ts.map +1 -0
  67. package/dist/core/internal/hash.js +30 -0
  68. package/dist/core/internal/hash.js.map +1 -0
  69. package/dist/core/internal/keystore.d.ts +14 -0
  70. package/dist/core/internal/keystore.d.ts.map +1 -0
  71. package/dist/core/internal/keystore.js +32 -0
  72. package/dist/core/internal/keystore.js.map +1 -0
  73. package/dist/core/internal/mnemonic.d.ts +4 -0
  74. package/dist/core/internal/mnemonic.d.ts.map +1 -0
  75. package/dist/core/internal/mnemonic.js +14 -0
  76. package/dist/core/internal/mnemonic.js.map +1 -0
  77. package/dist/core/internal/p256.d.ts +14 -0
  78. package/dist/core/internal/p256.d.ts.map +1 -0
  79. package/dist/core/internal/p256.js +36 -0
  80. package/dist/core/internal/p256.js.map +1 -0
  81. package/dist/core/internal/secp256k1.d.ts +14 -0
  82. package/dist/core/internal/secp256k1.d.ts.map +1 -0
  83. package/dist/core/internal/secp256k1.js +36 -0
  84. package/dist/core/internal/secp256k1.js.map +1 -0
  85. package/dist/core/internal/x25519.d.ts +8 -0
  86. package/dist/core/internal/x25519.d.ts.map +1 -0
  87. package/dist/core/internal/x25519.js +20 -0
  88. package/dist/core/internal/x25519.js.map +1 -0
  89. package/dist/index.d.ts +35 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.docs.d.ts +2 -0
  92. package/dist/index.docs.d.ts.map +1 -1
  93. package/dist/index.docs.js +2 -0
  94. package/dist/index.docs.js.map +1 -1
  95. package/dist/index.js +35 -0
  96. package/dist/index.js.map +1 -1
  97. package/dist/node/Engine.d.ts +55 -0
  98. package/dist/node/Engine.d.ts.map +1 -0
  99. package/dist/node/Engine.js +51 -0
  100. package/dist/node/Engine.js.map +1 -0
  101. package/dist/node/Hash.d.ts +39 -0
  102. package/dist/node/Hash.d.ts.map +1 -0
  103. package/dist/node/Hash.js +37 -0
  104. package/dist/node/Hash.js.map +1 -0
  105. package/dist/node/index.d.ts +39 -0
  106. package/dist/node/index.d.ts.map +1 -0
  107. package/dist/node/index.js +39 -0
  108. package/dist/node/index.js.map +1 -0
  109. package/dist/tempo/VirtualMaster.d.ts +2 -0
  110. package/dist/tempo/VirtualMaster.d.ts.map +1 -1
  111. package/dist/tempo/VirtualMaster.js +19 -5
  112. package/dist/tempo/VirtualMaster.js.map +1 -1
  113. package/dist/tempo/ZoneId.d.ts +35 -17
  114. package/dist/tempo/ZoneId.d.ts.map +1 -1
  115. package/dist/tempo/ZoneId.js +41 -16
  116. package/dist/tempo/ZoneId.js.map +1 -1
  117. package/dist/tempo/index.d.ts +5 -6
  118. package/dist/tempo/index.d.ts.map +1 -1
  119. package/dist/tempo/index.js +5 -6
  120. package/dist/tempo/index.js.map +1 -1
  121. package/dist/tempo/internal/mine.wasm.d.ts +2 -4
  122. package/dist/tempo/internal/mine.wasm.d.ts.map +1 -1
  123. package/dist/tempo/internal/mine.wasm.js +7 -12
  124. package/dist/tempo/internal/mine.wasm.js.map +1 -1
  125. package/dist/tempo/internal/virtualMasterPool.js +4 -1
  126. package/dist/tempo/internal/virtualMasterPool.js.map +1 -1
  127. package/dist/wasm/Engine.d.ts +62 -0
  128. package/dist/wasm/Engine.d.ts.map +1 -0
  129. package/dist/wasm/Engine.js +57 -0
  130. package/dist/wasm/Engine.js.map +1 -0
  131. package/dist/wasm/Hash.d.ts +49 -0
  132. package/dist/wasm/Hash.d.ts.map +1 -0
  133. package/dist/wasm/Hash.js +70 -0
  134. package/dist/wasm/Hash.js.map +1 -0
  135. package/dist/wasm/index.d.ts +46 -0
  136. package/dist/wasm/index.d.ts.map +1 -0
  137. package/dist/wasm/index.js +46 -0
  138. package/dist/wasm/index.js.map +1 -0
  139. package/dist/wasm/internal/hash.d.ts +9 -0
  140. package/dist/wasm/internal/hash.d.ts.map +1 -0
  141. package/dist/wasm/internal/hash.js +26 -0
  142. package/dist/wasm/internal/hash.js.map +1 -0
  143. package/dist/wasm/internal/hashes.wasm.d.ts +5 -0
  144. package/dist/wasm/internal/hashes.wasm.d.ts.map +1 -0
  145. package/dist/wasm/internal/hashes.wasm.js +12 -0
  146. package/dist/wasm/internal/hashes.wasm.js.map +1 -0
  147. package/dist/wasm/internal/instantiate.d.ts +56 -0
  148. package/dist/wasm/internal/instantiate.d.ts.map +1 -0
  149. package/dist/wasm/internal/instantiate.js +92 -0
  150. package/dist/wasm/internal/instantiate.js.map +1 -0
  151. package/dist/zod/TypedData.d.ts +12 -12
  152. package/package.json +36 -1
  153. package/src/core/Base64.ts +19 -166
  154. package/src/core/BinaryStateTree.ts +2 -3
  155. package/src/core/Bls.ts +27 -77
  156. package/src/core/Ed25519.ts +7 -7
  157. package/src/core/Engine.ts +235 -0
  158. package/src/core/Hash.ts +9 -12
  159. package/src/core/Keystore.ts +17 -17
  160. package/src/core/Mnemonic.ts +3 -6
  161. package/src/core/P256.ts +15 -24
  162. package/src/core/Rlp_tx.bench.ts +2 -4
  163. package/src/core/Secp256k1.ts +9 -14
  164. package/src/core/TxEnvelopeEip1559.bench.ts +0 -5
  165. package/src/core/WebCryptoP256.ts +2 -2
  166. package/src/core/X25519.ts +4 -3
  167. package/src/core/_test/AbiParameters.adversarial.fuzz.ts +1 -2
  168. package/src/core/_test/AbiParameters.fuzz.ts +1 -2
  169. package/src/core/_test/Base.fuzz.ts +1 -2
  170. package/src/core/_test/Cbor.fuzz.ts +1 -2
  171. package/src/core/_test/Engine.fuzz.ts +293 -0
  172. package/src/core/_test/Engine.test-d.ts +84 -0
  173. package/src/core/_test/Engine.test.ts +523 -0
  174. package/src/core/_test/Hash.vectors.test.ts +56 -0
  175. package/src/core/_test/Hex.fuzz.ts +1 -2
  176. package/src/core/_test/Rlp.fuzz.ts +1 -2
  177. package/src/core/_test/Signature.fuzz.ts +1 -2
  178. package/src/core/_test/curves.test.ts +7 -0
  179. package/src/core/_test/index.test.ts +1 -0
  180. package/src/core/internal/bls.ts +121 -0
  181. package/src/core/internal/codec/_test/base64.conformance.ts +156 -0
  182. package/src/core/internal/codec/_test/hex.conformance.ts +204 -0
  183. package/src/core/internal/codec/_test/hex.fuzz.ts +234 -0
  184. package/src/core/internal/codec/_test/hex.test.ts +124 -0
  185. package/src/core/internal/codec/base64.ts +222 -0
  186. package/src/core/internal/codec/hex.ts +115 -34
  187. package/src/core/internal/curves.ts +18 -0
  188. package/src/core/internal/ed25519.ts +64 -0
  189. package/src/core/internal/engine.ts +410 -0
  190. package/src/core/internal/hash.ts +48 -0
  191. package/src/core/internal/keystore.ts +107 -0
  192. package/src/core/internal/mnemonic.ts +18 -0
  193. package/src/core/internal/p256.ts +91 -0
  194. package/src/core/internal/secp256k1.ts +91 -0
  195. package/src/core/internal/x25519.ts +40 -0
  196. package/src/index.docs.ts +2 -0
  197. package/src/index.ts +36 -0
  198. package/src/node/Engine.ts +69 -0
  199. package/src/node/Hash.ts +56 -0
  200. package/src/node/_test/Engine.test.ts +62 -0
  201. package/src/node/_test/Hash.test-d.ts +26 -0
  202. package/src/node/_test/Hash.test.ts +102 -0
  203. package/src/node/index.ts +40 -0
  204. package/src/tempo/VirtualMaster.test.ts +75 -0
  205. package/src/tempo/VirtualMaster.ts +28 -6
  206. package/src/tempo/ZoneId.test-d.ts +16 -0
  207. package/src/tempo/ZoneId.test.ts +48 -13
  208. package/src/tempo/ZoneId.ts +55 -19
  209. package/src/tempo/index.ts +5 -6
  210. package/src/tempo/internal/mine.wasm.ts +7 -13
  211. package/src/tempo/internal/virtualMasterPool.ts +4 -1
  212. package/src/tsconfig.json +2 -1
  213. package/src/version.ts +1 -1
  214. package/src/wasm/Engine.ts +76 -0
  215. package/src/wasm/Hash.bench.ts +60 -0
  216. package/src/wasm/Hash.ts +109 -0
  217. package/src/wasm/_test/Engine.test.ts +62 -0
  218. package/src/wasm/_test/Hash.browser.test.ts +50 -0
  219. package/src/wasm/_test/Hash.fuzz.ts +188 -0
  220. package/src/wasm/_test/Hash.test-d.ts +28 -0
  221. package/src/wasm/_test/Hash.test.ts +211 -0
  222. package/src/wasm/_test/Hash.vectors.test.ts +117 -0
  223. package/src/wasm/_test/Runtime.test.ts +21 -0
  224. package/src/wasm/_test/runtime.wasm.ts +11 -0
  225. package/src/wasm/index.ts +47 -0
  226. package/src/wasm/internal/hash.ts +50 -0
  227. package/src/wasm/internal/hashes.wasm.ts +14 -0
  228. package/src/wasm/internal/instantiate.ts +135 -0
  229. package/src/zod/tempo/_test/ZoneId.test.ts +2 -2
  230. package/src/tempo/internal/mine.c +0 -182
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Base64 codec tiers, and the tables they share.
3
+ *
4
+ * Split out of the public `Base64` module for the same reason the hex codec is:
5
+ * a runtime selects one tier at import, so the others are unreachable from a
6
+ * test unless they can be called directly. Keeping them here lets the
7
+ * conformance suite compare every tier a runtime can execute, without widening
8
+ * `Base64`'s public surface.
9
+ *
10
+ * @internal
11
+ */
12
+ import * as Errors from '../../Errors.js';
13
+ import { decoder } from './utf8.js';
14
+ // Standard Base64 alphabet (RFC 4648 section 4) and URL-safe alphabet (section 5).
15
+ const stdAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
16
+ // Char-code -> 6-bit integer lookup. Sentinel `0xff` = invalid character.
17
+ // Standard alphabet plus URL-safe `-`/`_` (decoders are alphabet-agnostic).
18
+ const characterToInteger = /*#__PURE__*/ (() => {
19
+ const table = new Uint8Array(256).fill(0xff);
20
+ for (let i = 0; i < stdAlphabet.length; i++)
21
+ table[stdAlphabet.charCodeAt(i)] = i;
22
+ // URL-safe alternates: `-` for `+` (62), `_` for `/` (63).
23
+ table[45 /* '-' */] = 62;
24
+ table[95 /* '_' */] = 63;
25
+ return table;
26
+ })();
27
+ // Integer -> char-code table for the standard alphabet, indexed by 6-bit value.
28
+ const integerToCharacter = /*#__PURE__*/ (() => {
29
+ const table = new Uint8Array(64);
30
+ for (let i = 0; i < stdAlphabet.length; i++)
31
+ table[i] = stdAlphabet.charCodeAt(i);
32
+ return table;
33
+ })();
34
+ // Native fast-path detection. `Uint8Array.prototype.toBase64` ships in
35
+ // Chromium 145, Safari 18.2+, Firefox 133+ and Bun, but not in Node 24.
36
+ //
37
+ // Only encoding delegates to it; see `toBytes` for why decoding cannot.
38
+ const nativeToBase64 = Uint8Array.prototype.toBase64;
39
+ /**
40
+ * Encodes via `Uint8Array.prototype.toBase64`, where the runtime has it.
41
+ * `undefined` otherwise, so the conformance suite can ask whether this tier
42
+ * exists rather than inferring it from the runtime.
43
+ *
44
+ * @internal
45
+ */
46
+ export const fromBytesNative = nativeToBase64 &&
47
+ ((value, options = {}) => {
48
+ const { pad = true, url = false } = options;
49
+ // `omitPadding` governs both alphabets, so `base64url` is padded here too
50
+ // when asked. Appending padding on top of that double-pads it.
51
+ return nativeToBase64.call(value, {
52
+ alphabet: url ? 'base64url' : 'base64',
53
+ omitPadding: !pad,
54
+ });
55
+ });
56
+ /**
57
+ * Encodes in plain JavaScript, for runtimes without the native method.
58
+ *
59
+ * @internal
60
+ */
61
+ export function fromBytesLoop(value, options = {}) {
62
+ const { pad = true, url = false } = options;
63
+ const encoded = new Uint8Array(Math.ceil(value.length / 3) * 4);
64
+ for (let i = 0, j = 0; j < value.length; i += 4, j += 3) {
65
+ const y = (value[j] << 16) + (value[j + 1] << 8) + (value[j + 2] | 0);
66
+ encoded[i] = integerToCharacter[y >> 18];
67
+ encoded[i + 1] = integerToCharacter[(y >> 12) & 0x3f];
68
+ encoded[i + 2] = integerToCharacter[(y >> 6) & 0x3f];
69
+ encoded[i + 3] = integerToCharacter[y & 0x3f];
70
+ }
71
+ const k = value.length % 3;
72
+ const end = Math.floor(value.length / 3) * 4 + (k && k + 1);
73
+ let base64 = decoder.decode(new Uint8Array(encoded.buffer, 0, end));
74
+ if (pad && k === 1)
75
+ base64 += '==';
76
+ if (pad && k === 2)
77
+ base64 += '=';
78
+ if (url)
79
+ base64 = base64.replaceAll('+', '-').replaceAll('/', '_');
80
+ return base64;
81
+ }
82
+ /**
83
+ * Encodes with whichever tier this runtime provides.
84
+ *
85
+ * @internal
86
+ */
87
+ export function fromBytes(value, options = {}) {
88
+ if (fromBytesNative)
89
+ return fromBytesNative(value, options);
90
+ return fromBytesLoop(value, options);
91
+ }
92
+ /**
93
+ * `Uint8Array.fromBase64` is deliberately unused.
94
+ *
95
+ * Its `alphabet` option is strict and mutually exclusive -- `base64` refuses
96
+ * `-`/`_`, `base64url` refuses `+`/`/` -- while ox decodes either alphabet
97
+ * transparently. There is no single native call with that behavior, so matching
98
+ * it would mean normalizing the string first or trying both alphabets and
99
+ * throwing on one. Both cost more than they would save, and neither has been
100
+ * measured; the loop is the only decode tier until one is.
101
+ */
102
+ /**
103
+ * Decodes in plain JavaScript, for runtimes without the native method.
104
+ *
105
+ * @internal
106
+ */
107
+ export function toBytesLoop(value, bodyEnd) {
108
+ const size = bodyEnd;
109
+ // Validate characters: every char must be in the standard or URL-safe
110
+ // alphabet, and '=' may not appear in the body (only stripped trailing
111
+ // padding).
112
+ const decoded = new Uint8Array((size >> 2) * 3 + (size % 4 ? (size % 4) - 1 : 0));
113
+ let acc = 0;
114
+ let bits = 0;
115
+ let n = 0;
116
+ for (let i = 0; i < size; i++) {
117
+ const code = value.charCodeAt(i);
118
+ if (code === 61 /* '=' */)
119
+ throw new InvalidCharacterError({ character: '=' });
120
+ // `characterToInteger` only spans Latin-1, so a code unit above it reads
121
+ // `undefined` and has to be mapped to the sentinel. Without that, `undefined`
122
+ // fails the `=== 0xff` test, then coerces to zero in the shift below, and a
123
+ // non-ASCII character silently decodes as `A`.
124
+ const v = characterToInteger[code] ?? 0xff;
125
+ if (v === 0xff)
126
+ throw new InvalidCharacterError({ character: value[i] });
127
+ acc = (acc << 6) | v;
128
+ bits += 6;
129
+ if (bits >= 8) {
130
+ bits -= 8;
131
+ decoded[n++] = (acc >>> bits) & 0xff;
132
+ }
133
+ }
134
+ return decoded;
135
+ }
136
+ /**
137
+ * Decodes with whichever tier this runtime provides.
138
+ *
139
+ * @internal
140
+ */
141
+ export function toBytes(value) {
142
+ // Strip trailing '=' padding (only at the very end).
143
+ let bodyEnd = value.length;
144
+ let pad = 0;
145
+ while (bodyEnd > 0 && value.charCodeAt(bodyEnd - 1) === 61 /* '=' */) {
146
+ bodyEnd--;
147
+ pad++;
148
+ }
149
+ // Reject impossible lengths and excessive padding.
150
+ if (bodyEnd % 4 === 1)
151
+ throw new InvalidLengthError({ length: value.length });
152
+ if (pad > 2)
153
+ throw new InvalidPaddingError({ padding: pad });
154
+ return toBytesLoop(value, bodyEnd);
155
+ }
156
+ /** Thrown when a Base64 string contains an invalid character. */
157
+ export class InvalidCharacterError extends Errors.BaseError {
158
+ name = 'Base64.InvalidCharacterError';
159
+ constructor({ character }) {
160
+ super(`Invalid Base64 character: "${character}".`);
161
+ }
162
+ }
163
+ /** Thrown when a Base64 string has an impossible length. */
164
+ export class InvalidLengthError extends Errors.BaseError {
165
+ name = 'Base64.InvalidLengthError';
166
+ constructor({ length }) {
167
+ super(`Invalid Base64 input length \`${length}\`.`);
168
+ }
169
+ }
170
+ /** Thrown when a Base64 string contains too many trailing `=` padding characters. */
171
+ export class InvalidPaddingError extends Errors.BaseError {
172
+ name = 'Base64.InvalidPaddingError';
173
+ constructor({ padding }) {
174
+ super(`Invalid Base64 padding length \`${padding}\` (must be 0, 1, or 2).`);
175
+ }
176
+ }
177
+ //# sourceMappingURL=base64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../../../src/core/internal/codec/base64.ts"],"names":[],"mappings":"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"}
@@ -3,20 +3,65 @@ import * as Errors from '../../Errors.js';
3
3
  export type Hex = `0x${string}`;
4
4
  /**
5
5
  * Encodes a `Uint8Array` into a `0x`-prefixed lowercase hex string. Uses the
6
- * native `Uint8Array.prototype.toHex` (Node 22+, Safari 18+, Firefox 133+) or
7
- * Node's `Buffer` when available; otherwise a tight JS loop.
6
+ * native `Uint8Array.prototype.toHex` or Node's `Buffer` when available;
7
+ * otherwise a tight JS loop.
8
8
  *
9
9
  * @internal
10
10
  */
11
11
  export declare function bytesToHex(value: Uint8Array): Hex;
12
+ /**
13
+ * Encodes via `Uint8Array.prototype.toHex`, where the runtime has it.
14
+ * `undefined` otherwise, so callers and the conformance suite can both ask
15
+ * whether this tier exists rather than inferring it.
16
+ *
17
+ * @internal
18
+ */
19
+ export declare const bytesToHexNative: ((value: Uint8Array) => Hex) | undefined;
20
+ /**
21
+ * Encodes via Node's `Buffer`, where the runtime has it.
22
+ *
23
+ * @internal
24
+ */
25
+ export declare const bytesToHexBuffer: ((value: Uint8Array) => Hex) | undefined;
26
+ /**
27
+ * Encodes in plain JavaScript, for runtimes with neither the native method nor
28
+ * `Buffer`: browsers predating `Uint8Array.prototype.toHex`, which is recent
29
+ * enough that a meaningful share of installed browsers still land here.
30
+ *
31
+ * Appending to a string beats collecting substrings and joining them: V8 builds
32
+ * a rope and flattens it once, where `join` over an `Array.from({ length })`
33
+ * pays for a holey array as well as the concatenation. Measured at ~6.5x on a
34
+ * 32-byte input, counting the flatten.
35
+ *
36
+ * @internal
37
+ */
38
+ export declare function bytesToHexLoop(value: Uint8Array): Hex;
12
39
  /**
13
40
  * Strictly decodes a `0x`-prefixed even-length hex string into a `Uint8Array`.
14
- * Uses the native `Uint8Array.fromHex` (Node 22+, Safari 18+, Firefox 133+) or
15
- * Node's `Buffer` when available; otherwise a tight JS loop.
41
+ * Uses a JS loop for short inputs and Node's `Buffer` for longer ones.
16
42
  *
17
43
  * @internal
18
44
  */
19
45
  export declare function hexToBytes(value: string): Uint8Array;
46
+ /**
47
+ * Decodes via Node's `Buffer`, where the runtime has it.
48
+ *
49
+ * @internal
50
+ */
51
+ export declare const hexToBytesBuffer: ((value: string, length: number) => Uint8Array) | undefined;
52
+ /**
53
+ * Decodes in plain JavaScript, reading nibbles straight out of `value` from
54
+ * index 2 so no substring is materialized.
55
+ *
56
+ * Invalidity is accumulated rather than branched on per nibble: a valid nibble
57
+ * is at most `0x0f`, so only the `0xff` sentinel can set bit 7, and one check
58
+ * after the loop covers every character. `nibbleTable` only spans Latin-1, so a
59
+ * code unit above it reads `undefined` and has to be mapped to the sentinel --
60
+ * without that, a non-ASCII character would OR in as zero and decode silently.
61
+ *
62
+ * @internal
63
+ */
64
+ export declare function hexToBytesLoop(value: string, length: number): Uint8Array;
20
65
  /** @internal */
21
66
  export declare function charCodeToBase16(char: number): number | undefined;
22
67
  /** Thrown when a value is not a valid `0x`-prefixed hex string. */
@@ -1 +1 @@
1
- {"version":3,"file":"hex.d.ts","sourceRoot":"","sources":["../../../../src/core/internal/codec/hex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AAEzC,gBAAgB;AAChB,MAAM,MAAM,GAAG,GAAG,KAAK,MAAM,EAAE,CAAA;AA+B/B;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,GAAG,CAQjD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAwCpD;AAED,gBAAgB;AAChB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjE;AAED,mEAAmE;AACnE,qBAAa,oBAAqB,SAAQ,MAAM,CAAC,SAAS;IACxD,SAAkB,IAAI,8BAA6B;gBAEvC,KAAK,EAAE,OAAO;CAO3B;AAED,wDAAwD;AACxD,qBAAa,kBAAmB,SAAQ,MAAM,CAAC,SAAS;IACtD,SAAkB,IAAI,4BAA2B;gBAErC,KAAK,EAAE,GAAG;CAQvB;AAED,gBAAgB;AAChB,MAAM,CAAC,OAAO,WAAW,UAAU,CAAC;IAClC,KAAK,SAAS,GAAG,MAAM,CAAC,eAAe,CAAA;CACxC;AAED,gBAAgB;AAChB,MAAM,CAAC,OAAO,WAAW,UAAU,CAAC;IAClC,KAAK,SAAS,GACV,oBAAoB,GACpB,kBAAkB,GAClB,MAAM,CAAC,eAAe,CAAA;CAC3B"}
1
+ {"version":3,"file":"hex.d.ts","sourceRoot":"","sources":["../../../../src/core/internal/codec/hex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AAEzC,gBAAgB;AAChB,MAAM,MAAM,GAAG,GAAG,KAAK,MAAM,EAAE,CAAA;AAiD/B;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,GAAG,CAIjD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,GAAG,CAAC,GAAG,SACK,CAAA;AAEnE;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,GAAG,CAAC,GAAG,SAGmC,CAAA;AAEjG;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,GAAG,CAKrD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAepD;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EACzB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC,GAC/C,SAoBA,CAAA;AAEJ;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAWxE;AAED,gBAAgB;AAChB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjE;AAED,mEAAmE;AACnE,qBAAa,oBAAqB,SAAQ,MAAM,CAAC,SAAS;IACxD,SAAkB,IAAI,8BAA6B;gBAEvC,KAAK,EAAE,OAAO;CAO3B;AAED,wDAAwD;AACxD,qBAAa,kBAAmB,SAAQ,MAAM,CAAC,SAAS;IACtD,SAAkB,IAAI,4BAA2B;gBAErC,KAAK,EAAE,GAAG;CAQvB;AAED,gBAAgB;AAChB,MAAM,CAAC,OAAO,WAAW,UAAU,CAAC;IAClC,KAAK,SAAS,GAAG,MAAM,CAAC,eAAe,CAAA;CACxC;AAED,gBAAgB;AAChB,MAAM,CAAC,OAAO,WAAW,UAAU,CAAC;IAClC,KAAK,SAAS,GACV,oBAAoB,GACpB,kBAAkB,GAClB,MAAM,CAAC,eAAe,CAAA;CAC3B"}
@@ -12,34 +12,82 @@ const nibbleTable = /*#__PURE__*/ (() => {
12
12
  }
13
13
  return table;
14
14
  })();
15
- // Phase 2 native fast-path detection: `Uint8Array.prototype.toHex` lands in
16
- // Node 22+, Safari 18+, Firefox 133+. Falls back to `Buffer` on Node, then to
17
- // the JS loop.
15
+ // Native fast-path detection. `Uint8Array.prototype.toHex` ships in Chromium
16
+ // 145, Safari 18.2+ and Firefox 133+, but not in Node 24, which reaches
17
+ // `Buffer` instead.
18
+ //
19
+ // Only *encoding* delegates to it. Encoding is total, so a native method has
20
+ // nothing to get wrong; decoding has to reject, and the native decoders do not
21
+ // do so reliably -- Chromium 145 reads U+C230 as the digit `0`, masking the
22
+ // code unit to 8 bits exactly as `Buffer` does, and only rejects it from 149
23
+ // on. test262 misses this because none of its illegal characters mask onto the
24
+ // hex alphabet. Guarding `fromHex` costs an ASCII scan that leaves it only
25
+ // 10-25% ahead of the loop, so it is not used at all.
18
26
  const _Buffer = globalThis.Buffer;
19
27
  const nativeToHex = Uint8Array.prototype.toHex;
20
- const nativeFromHex = Uint8Array.fromHex;
28
+ /**
29
+ * Byte count below which {@link hexToBytesLoop} beats `Buffer.from(…, 'hex')`,
30
+ * whose fixed per-call cost short inputs cannot amortize. Measured on Node 24
31
+ * (V8 13.6): the crossover sits between 32 and 48 bytes, and 32 covers the
32
+ * sizes Ethereum work is made of -- 20-byte addresses and 32-byte words.
33
+ *
34
+ * `Buffer` is the only tier this applies to; where it is absent the loop
35
+ * decodes at every size. Re-measure before moving it.
36
+ *
37
+ * @internal
38
+ */
39
+ const loopDecodeMaxBytes = 32;
21
40
  /**
22
41
  * Encodes a `Uint8Array` into a `0x`-prefixed lowercase hex string. Uses the
23
- * native `Uint8Array.prototype.toHex` (Node 22+, Safari 18+, Firefox 133+) or
24
- * Node's `Buffer` when available; otherwise a tight JS loop.
42
+ * native `Uint8Array.prototype.toHex` or Node's `Buffer` when available;
43
+ * otherwise a tight JS loop.
25
44
  *
26
45
  * @internal
27
46
  */
28
47
  export function bytesToHex(value) {
29
- if (nativeToHex)
30
- return `0x${nativeToHex.call(value)}`;
31
- if (_Buffer)
32
- return `0x${_Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString('hex')}`;
48
+ if (bytesToHexNative)
49
+ return bytesToHexNative(value);
50
+ if (bytesToHexBuffer)
51
+ return bytesToHexBuffer(value);
52
+ return bytesToHexLoop(value);
53
+ }
54
+ /**
55
+ * Encodes via `Uint8Array.prototype.toHex`, where the runtime has it.
56
+ * `undefined` otherwise, so callers and the conformance suite can both ask
57
+ * whether this tier exists rather than inferring it.
58
+ *
59
+ * @internal
60
+ */
61
+ export const bytesToHexNative = nativeToHex && ((value) => `0x${nativeToHex.call(value)}`);
62
+ /**
63
+ * Encodes via Node's `Buffer`, where the runtime has it.
64
+ *
65
+ * @internal
66
+ */
67
+ export const bytesToHexBuffer = _Buffer &&
68
+ ((value) => `0x${_Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString('hex')}`);
69
+ /**
70
+ * Encodes in plain JavaScript, for runtimes with neither the native method nor
71
+ * `Buffer`: browsers predating `Uint8Array.prototype.toHex`, which is recent
72
+ * enough that a meaningful share of installed browsers still land here.
73
+ *
74
+ * Appending to a string beats collecting substrings and joining them: V8 builds
75
+ * a rope and flattens it once, where `join` over an `Array.from({ length })`
76
+ * pays for a holey array as well as the concatenation. Measured at ~6.5x on a
77
+ * 32-byte input, counting the flatten.
78
+ *
79
+ * @internal
80
+ */
81
+ export function bytesToHexLoop(value) {
33
82
  const length = value.length;
34
- const parts = Array.from({ length });
83
+ let hex = '0x';
35
84
  for (let i = 0; i < length; i++)
36
- parts[i] = hexes[value[i]];
37
- return `0x${parts.join('')}`;
85
+ hex += hexes[value[i]];
86
+ return hex;
38
87
  }
39
88
  /**
40
89
  * Strictly decodes a `0x`-prefixed even-length hex string into a `Uint8Array`.
41
- * Uses the native `Uint8Array.fromHex` (Node 22+, Safari 18+, Firefox 133+) or
42
- * Node's `Buffer` when available; otherwise a tight JS loop.
90
+ * Uses a JS loop for short inputs and Node's `Buffer` for longer ones.
43
91
  *
44
92
  * @internal
45
93
  */
@@ -49,44 +97,70 @@ export function hexToBytes(value) {
49
97
  value.charCodeAt(0) !== 48 /* '0' */ ||
50
98
  value.charCodeAt(1) !== 120 /* 'x' */)
51
99
  throw new InvalidHexValueError(value);
52
- const body = value.length === 2 ? '' : value.slice(2);
53
- if ((body.length & 1) !== 0)
100
+ const nibbles = value.length - 2;
101
+ if ((nibbles & 1) !== 0)
54
102
  throw new InvalidLengthError(value);
55
- if (nativeFromHex) {
56
- try {
57
- return nativeFromHex(body);
58
- }
59
- catch {
103
+ const length = nibbles >> 1;
104
+ if (length <= loopDecodeMaxBytes)
105
+ return hexToBytesLoop(value, length);
106
+ if (hexToBytesBuffer)
107
+ return hexToBytesBuffer(value, length);
108
+ return hexToBytesLoop(value, length);
109
+ }
110
+ /**
111
+ * Decodes via Node's `Buffer`, where the runtime has it.
112
+ *
113
+ * @internal
114
+ */
115
+ export const hexToBytesBuffer = _Buffer &&
116
+ ((value, length) => {
117
+ const body = value.slice(2);
118
+ // `Buffer.from(…, 'hex')` masks each UTF-16 code unit to 8 bits, so a
119
+ // character above U+00FF can alias a hex digit: U+C230 masks to 0x30, the
120
+ // digit `0`, and `'0x숰0'` decodes to `0x00` instead of being rejected.
121
+ // Masking cannot fabricate a digit from pure ASCII, and a string is pure
122
+ // ASCII exactly when its UTF-8 length matches its code-unit count.
123
+ if (_Buffer.byteLength(body, 'utf8') !== body.length)
60
124
  throw new InvalidHexValueError(value);
61
- }
62
- }
63
- if (_Buffer && body.length > 0) {
64
125
  // Buffer.from with 'hex' silently truncates on invalid chars; verify
65
126
  // byteLength matches expectations to detect malformed input.
66
- const expected = body.length >> 1;
67
127
  const buf = _Buffer.from(body, 'hex');
68
- if (buf.length !== expected)
128
+ if (buf.length !== length)
69
129
  throw new InvalidHexValueError(value);
70
130
  // Copy out of Buffer pool: callers may rely on `.buffer` being a
71
131
  // standalone ArrayBuffer (e.g. WebAuthn attestationObject round-trips).
72
132
  const out = new Uint8Array(buf.byteLength);
73
133
  out.set(buf);
74
134
  return out;
75
- }
76
- const length = body.length >> 1;
135
+ });
136
+ /**
137
+ * Decodes in plain JavaScript, reading nibbles straight out of `value` from
138
+ * index 2 so no substring is materialized.
139
+ *
140
+ * Invalidity is accumulated rather than branched on per nibble: a valid nibble
141
+ * is at most `0x0f`, so only the `0xff` sentinel can set bit 7, and one check
142
+ * after the loop covers every character. `nibbleTable` only spans Latin-1, so a
143
+ * code unit above it reads `undefined` and has to be mapped to the sentinel --
144
+ * without that, a non-ASCII character would OR in as zero and decode silently.
145
+ *
146
+ * @internal
147
+ */
148
+ export function hexToBytesLoop(value, length) {
77
149
  const out = new Uint8Array(length);
78
- for (let i = 0, j = 0; i < length; i++) {
79
- const hi = nibbleTable[body.charCodeAt(j++)];
80
- const lo = nibbleTable[body.charCodeAt(j++)];
81
- if (hi === 0xff || lo === 0xff)
82
- throw new InvalidHexValueError(value);
150
+ let invalid = 0;
151
+ for (let i = 0, j = 2; i < length; i++) {
152
+ const hi = nibbleTable[value.charCodeAt(j++)] ?? 0xff;
153
+ const lo = nibbleTable[value.charCodeAt(j++)] ?? 0xff;
154
+ invalid |= hi | lo;
83
155
  out[i] = (hi << 4) | lo;
84
156
  }
157
+ if (invalid & 0x80)
158
+ throw new InvalidHexValueError(value);
85
159
  return out;
86
160
  }
87
161
  /** @internal */
88
162
  export function charCodeToBase16(char) {
89
- const v = nibbleTable[char];
163
+ const v = nibbleTable[char] ?? 0xff;
90
164
  return v === 0xff ? undefined : v;
91
165
  }
92
166
  /** Thrown when a value is not a valid `0x`-prefixed hex string. */
@@ -1 +1 @@
1
- {"version":3,"file":"hex.js","sourceRoot":"","sources":["../../../../src/core/internal/codec/hex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hex.js","sourceRoot":"","sources":["../../../../src/core/internal/codec/hex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Curve constants, inlined so that modules needing nothing but an order do not
3
+ * pull a curve implementation into the bundle.
4
+ *
5
+ * These are fixed by the curve specifications and are asserted against
6
+ * `@noble/curves` in `src/core/_test/curves.test.ts`.
7
+ *
8
+ * @internal
9
+ */
10
+ /**
11
+ * Order of the secp256r1 (P-256) curve.
12
+ *
13
+ * @see https://www.secg.org/sec2-v2.pdf
14
+ * @internal
15
+ */
16
+ export declare const p256N = 115792089210356248762697446949407573529996955224135760342422259061068512044369n;
17
+ //# sourceMappingURL=curves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curves.d.ts","sourceRoot":"","sources":["../../../src/core/internal/curves.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,kFACmD,CAAA"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Curve constants, inlined so that modules needing nothing but an order do not
3
+ * pull a curve implementation into the bundle.
4
+ *
5
+ * These are fixed by the curve specifications and are asserted against
6
+ * `@noble/curves` in `src/core/_test/curves.test.ts`.
7
+ *
8
+ * @internal
9
+ */
10
+ /**
11
+ * Order of the secp256r1 (P-256) curve.
12
+ *
13
+ * @see https://www.secg.org/sec2-v2.pdf
14
+ * @internal
15
+ */
16
+ export const p256N = 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551n;
17
+ //# sourceMappingURL=curves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curves.js","sourceRoot":"","sources":["../../../src/core/internal/curves.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAChB,mEAAmE,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { type Complete, type Eddsa } from './engine.js';
2
+ /** @internal */
3
+ export declare const getPublicKey: Complete<Eddsa>['getPublicKey'];
4
+ /** @internal */
5
+ export declare const randomSecretKey: Complete<Eddsa>['randomSecretKey'];
6
+ /** @internal */
7
+ export declare const sign: Complete<Eddsa>['sign'];
8
+ /** @internal */
9
+ export declare const toMontgomery: Complete<Eddsa>['toMontgomery'];
10
+ /** @internal */
11
+ export declare const toMontgomerySecret: Complete<Eddsa>['toMontgomerySecret'];
12
+ /** @internal */
13
+ export declare const verify: Complete<Eddsa>['verify'];
14
+ //# sourceMappingURL=ed25519.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ed25519.d.ts","sourceRoot":"","sources":["../../../src/core/internal/ed25519.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAa,MAAM,aAAa,CAAA;AAiClE,gBAAgB;AAChB,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,cAAc,CACa,CAAA;AAEtE,gBAAgB;AAChB,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,iBAAiB,CACG,CAAA;AAElE,gBAAgB;AAChB,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CACsB,CAAA;AAE/D,gBAAgB;AAChB,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,cAAc,CACY,CAAA;AAErE,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAKlE,CAAA;AAEH,gBAAgB;AAChB,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,CAImC,CAAA"}
@@ -0,0 +1,29 @@
1
+ import { ed25519 } from '@noble/curves/ed25519.js';
2
+ import { overrides } from './engine.js';
3
+ /**
4
+ * Resolvers for the `Ed25519` slot, and ox's defaults for it, backed by
5
+ * `@noble/curves`.
6
+ *
7
+ * Declaring the defaults against the slot contract is what keeps them honest: a
8
+ * default that goes missing, or whose signature drifts, fails to compile rather
9
+ * than failing at the call site.
10
+ */
11
+ const getPublicKeyDefault = (privateKey) => ed25519.getPublicKey(privateKey);
12
+ const randomSecretKeyDefault = () => ed25519.utils.randomSecretKey();
13
+ const signDefault = (payload, privateKey) => ed25519.sign(payload, privateKey);
14
+ const toMontgomeryDefault = (publicKey) => ed25519.utils.toMontgomery(publicKey);
15
+ const toMontgomerySecretDefault = (privateKey) => ed25519.utils.toMontgomerySecret(privateKey);
16
+ const verifyDefault = (signature, payload, publicKey) => ed25519.verify(signature, payload, publicKey);
17
+ /** @internal */
18
+ export const getPublicKey = (privateKey) => (overrides.Ed25519?.getPublicKey ?? getPublicKeyDefault)(privateKey);
19
+ /** @internal */
20
+ export const randomSecretKey = () => (overrides.Ed25519?.randomSecretKey ?? randomSecretKeyDefault)();
21
+ /** @internal */
22
+ export const sign = (payload, privateKey) => (overrides.Ed25519?.sign ?? signDefault)(payload, privateKey);
23
+ /** @internal */
24
+ export const toMontgomery = (publicKey) => (overrides.Ed25519?.toMontgomery ?? toMontgomeryDefault)(publicKey);
25
+ /** @internal */
26
+ export const toMontgomerySecret = (privateKey) => (overrides.Ed25519?.toMontgomerySecret ?? toMontgomerySecretDefault)(privateKey);
27
+ /** @internal */
28
+ export const verify = (signature, payload, publicKey) => (overrides.Ed25519?.verify ?? verifyDefault)(signature, payload, publicKey);
29
+ //# sourceMappingURL=ed25519.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ed25519.js","sourceRoot":"","sources":["../../../src/core/internal/ed25519.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAA6B,SAAS,EAAE,MAAM,aAAa,CAAA;AAElE;;;;;;;GAOG;AAEH,MAAM,mBAAmB,GAAoC,CAAC,UAAU,EAAE,EAAE,CAC1E,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA;AAElC,MAAM,sBAAsB,GAAuC,GAAG,EAAE,CACtE,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,CAAA;AAEjC,MAAM,WAAW,GAA4B,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CACnE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;AAEnC,MAAM,mBAAmB,GAAoC,CAAC,SAAS,EAAE,EAAE,CACzE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;AAEvC,MAAM,yBAAyB,GAA0C,CACvE,UAAU,EACV,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;AAEjD,MAAM,aAAa,GAA8B,CAC/C,SAAS,EACT,OAAO,EACP,SAAS,EACT,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AAElD,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAoC,CAAC,UAAU,EAAE,EAAE,CAC1E,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,IAAI,mBAAmB,CAAC,CAAC,UAAU,CAAC,CAAA;AAEtE,gBAAgB;AAChB,MAAM,CAAC,MAAM,eAAe,GAAuC,GAAG,EAAE,CACtE,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,IAAI,sBAAsB,CAAC,EAAE,CAAA;AAElE,gBAAgB;AAChB,MAAM,CAAC,MAAM,IAAI,GAA4B,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CACnE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;AAE/D,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAoC,CAAC,SAAS,EAAE,EAAE,CACzE,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,IAAI,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAA;AAErE,gBAAgB;AAChB,MAAM,CAAC,MAAM,kBAAkB,GAA0C,CACvE,UAAU,EACV,EAAE,CACF,CAAC,SAAS,CAAC,OAAO,EAAE,kBAAkB,IAAI,yBAAyB,CAAC,CAClE,UAAU,CACX,CAAA;AAEH,gBAAgB;AAChB,MAAM,CAAC,MAAM,MAAM,GAA8B,CAC/C,SAAS,EACT,OAAO,EACP,SAAS,EACT,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,IAAI,aAAa,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA"}