@cardanowall/crypto-core 0.2.0 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/aead/errors.ts","../src/aead/chacha20-poly1305.ts","../src/aead/xchacha20-poly1305.ts","../src/kdf/hkdf.ts","../src/kem/mlkem768x25519.ts","../src/kem/x25519.ts","../src/sealed-poe/errors.ts","../src/cbor/canonical.ts","../src/sealed-poe/slots-codec.ts","../src/sealed-poe/wrap.ts","../src/util/compare-ct.ts","../src/sealed-poe/unwrap.ts","../src/sealed-poe/envelope-from-parsed.ts"],"names":["sha256","ZERO_NONCE_12","EMPTY_SALT","X25519_SECRET_KEY_LENGTH","X25519_PUBLIC_KEY_LENGTH","NONCE_LENGTH","WRAP_LENGTH","SLOTS_MAC_LENGTH","concat","hmac"],"mappings":"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","file":"sealed-poe.js","sourcesContent":["export class AeadVerificationError extends Error {\n readonly code: string = 'aead_verification_failed';\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'AeadVerificationError';\n }\n}\n","import { chacha20poly1305 } from '@noble/ciphers/chacha.js';\n\nimport { AeadVerificationError } from './errors';\n\nexport interface ChaCha20Poly1305EncryptOpts {\n readonly key: Uint8Array;\n readonly nonce: Uint8Array;\n readonly aad: Uint8Array;\n readonly plaintext: Uint8Array;\n}\n\nexport interface ChaCha20Poly1305DecryptOpts {\n readonly key: Uint8Array;\n readonly nonce: Uint8Array;\n readonly aad: Uint8Array;\n readonly ciphertext: Uint8Array;\n}\n\nexport function chacha20Poly1305Encrypt(opts: ChaCha20Poly1305EncryptOpts): Uint8Array {\n return chacha20poly1305(opts.key, opts.nonce, opts.aad).encrypt(opts.plaintext);\n}\n\nexport function chacha20Poly1305Decrypt(opts: ChaCha20Poly1305DecryptOpts): Uint8Array {\n try {\n return chacha20poly1305(opts.key, opts.nonce, opts.aad).decrypt(opts.ciphertext);\n } catch (cause) {\n throw new AeadVerificationError('chacha20-poly1305 decrypt failed', { cause });\n }\n}\n","import { xchacha20poly1305 } from '@noble/ciphers/chacha.js';\n\nimport { AeadVerificationError } from './errors';\n\nexport interface XChaCha20Poly1305EncryptOpts {\n readonly key: Uint8Array;\n readonly nonce: Uint8Array;\n readonly aad: Uint8Array;\n readonly plaintext: Uint8Array;\n}\n\nexport interface XChaCha20Poly1305DecryptOpts {\n readonly key: Uint8Array;\n readonly nonce: Uint8Array;\n readonly aad: Uint8Array;\n readonly ciphertext: Uint8Array;\n}\n\nexport function xchacha20Poly1305Encrypt(opts: XChaCha20Poly1305EncryptOpts): Uint8Array {\n return xchacha20poly1305(opts.key, opts.nonce, opts.aad).encrypt(opts.plaintext);\n}\n\nexport function xchacha20Poly1305Decrypt(opts: XChaCha20Poly1305DecryptOpts): Uint8Array {\n try {\n return xchacha20poly1305(opts.key, opts.nonce, opts.aad).decrypt(opts.ciphertext);\n } catch (cause) {\n throw new AeadVerificationError('xchacha20-poly1305 decrypt failed', { cause });\n }\n}\n","import { hkdf } from '@noble/hashes/hkdf.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nexport interface HkdfSha256Opts {\n readonly ikm: Uint8Array;\n readonly salt: Uint8Array;\n readonly info: Uint8Array;\n readonly length: number;\n}\n\nexport function hkdfSha256(opts: HkdfSha256Opts): Uint8Array {\n return hkdf(sha256, opts.ikm, opts.salt, opts.info, opts.length);\n}\n","import { XWing } from '@noble/post-quantum/hybrid.js';\n\n// X-Wing (ML-KEM-768 + X25519) hybrid KEM per draft-connolly-cfrg-xwing-kem-06.\n// `XWing` is @noble/post-quantum's alias for `ml_kem768_x25519`. We expose it\n// through opts-object wrappers that pin the wire lengths and map noble's field\n// names onto the project's vocabulary.\n//\n// Unlike the bare X25519 KEM, there is no contributory-behaviour rejection to\n// translate: X-Wing combines the ML-KEM and X25519 shared secrets through a\n// SHA3-256 combiner that also binds the X25519 ephemeral and recipient public\n// keys, and ML-KEM's implicit rejection already yields a constant-work\n// pseudorandom secret on a malformed ciphertext. Decapsulation therefore never\n// throws on attacker-supplied wire data — a wrong shared secret is the correct,\n// indistinguishable failure mode, and callers MUST treat it as a non-match\n// rather than expecting an exception.\n\nexport const MLKEM768X25519_PUBLIC_KEY_LENGTH = 1216 as const;\nexport const MLKEM768X25519_ENC_LENGTH = 1120 as const;\nexport const MLKEM768X25519_SHARED_SECRET_LENGTH = 32 as const;\nexport const MLKEM768X25519_SEED_LENGTH = 32 as const;\nexport const MLKEM768X25519_ESEED_LENGTH = 64 as const;\n\nexport interface Mlkem768X25519KeyPair {\n // The 32-byte root seed IS the secret key in draft-06: the ML-KEM coins and\n // the X25519 scalar are re-expanded from it via SHAKE-256 at decapsulation.\n readonly secretSeed: Uint8Array;\n readonly publicKey: Uint8Array;\n}\n\nexport interface Mlkem768X25519EncapsulateOpts {\n readonly publicKey: Uint8Array;\n // Optional 64-byte encapsulation randomness (msgRand). When supplied the\n // ciphertext and shared secret are fully deterministic; a 32-byte value is\n // rejected by noble, so we pin the length here too.\n readonly eseed?: Uint8Array;\n}\n\nexport interface Mlkem768X25519Encapsulation {\n readonly enc: Uint8Array;\n readonly ss: Uint8Array;\n}\n\nexport interface Mlkem768X25519DecapsulateOpts {\n readonly secretSeed: Uint8Array;\n readonly enc: Uint8Array;\n}\n\nexport function mlkem768x25519Keygen(seed: Uint8Array): Mlkem768X25519KeyPair {\n if (seed.length !== MLKEM768X25519_SEED_LENGTH) {\n throw new Error(\n `mlkem768x25519 seed must be ${MLKEM768X25519_SEED_LENGTH} bytes, got ${seed.length}`,\n );\n }\n const { secretKey, publicKey } = XWing.keygen(seed);\n return { secretSeed: secretKey, publicKey };\n}\n\nexport function mlkem768x25519Encapsulate(\n opts: Mlkem768X25519EncapsulateOpts,\n): Mlkem768X25519Encapsulation {\n if (opts.publicKey.length !== MLKEM768X25519_PUBLIC_KEY_LENGTH) {\n throw new Error(\n `mlkem768x25519 public key must be ${MLKEM768X25519_PUBLIC_KEY_LENGTH} bytes, got ${opts.publicKey.length}`,\n );\n }\n if (opts.eseed !== undefined && opts.eseed.length !== MLKEM768X25519_ESEED_LENGTH) {\n throw new Error(\n `mlkem768x25519 eseed must be ${MLKEM768X25519_ESEED_LENGTH} bytes, got ${opts.eseed.length}`,\n );\n }\n const { cipherText, sharedSecret } = XWing.encapsulate(opts.publicKey, opts.eseed);\n return { enc: cipherText, ss: sharedSecret };\n}\n\nexport function mlkem768x25519Decapsulate(opts: Mlkem768X25519DecapsulateOpts): Uint8Array {\n // Pre-check both lengths before calling noble: decapsulation must perform a\n // constant amount of work for any caller-supplied ciphertext (implicit\n // rejection), which requires the inputs to be the exact expected sizes.\n if (opts.secretSeed.length !== MLKEM768X25519_SEED_LENGTH) {\n throw new Error(\n `mlkem768x25519 secret seed must be ${MLKEM768X25519_SEED_LENGTH} bytes, got ${opts.secretSeed.length}`,\n );\n }\n if (opts.enc.length !== MLKEM768X25519_ENC_LENGTH) {\n throw new Error(\n `mlkem768x25519 enc must be ${MLKEM768X25519_ENC_LENGTH} bytes, got ${opts.enc.length}`,\n );\n }\n // noble's signature is decapsulate(cipherText, secretKey) — ciphertext first.\n return XWing.decapsulate(opts.enc, opts.secretSeed);\n}\n","import { x25519 } from '@noble/curves/ed25519.js';\n\n// RFC 7748 §6.1 contributory-behaviour rejection: a small-order (low-order)\n// Montgomery `u` coordinate makes the X25519 shared secret all-zero, which\n// @noble/curves refuses with `Error: invalid private or public key received`.\n// We rethrow that as a *typed* error so callers can distinguish a structurally\n// valid-but-malicious peer public key (a property of attacker-supplied wire\n// data — trial-decrypt MUST treat the slot as a non-match, not crash) from\n// genuine caller misuse such as a wrong-length key (which @noble raises as a\n// RangeError and which we deliberately let propagate untouched).\nexport class X25519LowOrderPointError extends Error {\n readonly code = 'X25519_LOW_ORDER_POINT' as const;\n constructor(options?: { cause?: unknown }) {\n super('x25519 ECDH rejected: peer public key is a small-order point', options);\n this.name = 'X25519LowOrderPointError';\n }\n}\n\n// @noble/curves v2 signals a small-order/all-zero shared secret with this exact\n// message. Matching on it (rather than the broad Error class) keeps unrelated\n// failures — e.g. a future internal assertion — surfacing as themselves.\nconst NOBLE_LOW_ORDER_MESSAGE = 'invalid private or public key received';\n\nexport interface X25519KeyPair {\n readonly secretKey: Uint8Array;\n readonly publicKey: Uint8Array;\n}\n\nexport interface X25519PublicKeyOpts {\n readonly secretKey: Uint8Array;\n}\n\nexport interface X25519EcdhOpts {\n readonly secretKey: Uint8Array;\n readonly theirPublicKey: Uint8Array;\n}\n\nexport function x25519Keygen(): X25519KeyPair {\n return x25519.keygen();\n}\n\nexport function x25519PublicKey(opts: X25519PublicKeyOpts): Uint8Array {\n return x25519.getPublicKey(opts.secretKey);\n}\n\nexport function x25519Ecdh(opts: X25519EcdhOpts): Uint8Array {\n try {\n return x25519.getSharedSecret(opts.secretKey, opts.theirPublicKey);\n } catch (e) {\n // Translate ONLY the contributory-check rejection into our typed error.\n // A wrong-length key throws a RangeError from @noble's length assertion;\n // that is caller misuse, not malicious wire data, so it must propagate.\n if (e instanceof Error && e.message === NOBLE_LOW_ORDER_MESSAGE) {\n throw new X25519LowOrderPointError({ cause: e });\n }\n throw e;\n }\n}\n","// Sealed-PoE error taxonomy (wire-shape + partitioning-oracle pre-checks).\n\nexport type EciesSealedPoeErrorCode =\n | 'ENC_SLOTS_EMPTY'\n | 'ENC_SLOTS_REQUIRED'\n | 'ENC_SLOTS_MAC_REQUIRED'\n | 'ENC_SLOTS_MAC_INVALID_LENGTH'\n | 'KEM_EPK_LENGTH_MISMATCH'\n | 'KEM_CT_LENGTH_MISMATCH'\n | 'INVALID_CEK_LENGTH'\n | 'NONCE_LENGTH_MISMATCH'\n | 'INVALID_EPHEMERAL_SECRET_LENGTH'\n | 'EPHEMERAL_SECRETS_COUNT_MISMATCH'\n | 'UNSUPPORTED_ENC_VERSION'\n | 'UNSUPPORTED_AEAD_ALG'\n | 'UNSUPPORTED_KEM_ALG'\n | 'INVALID_ENVELOPE_SHAPE'\n | 'INVALID_RECIPIENT_KEY'\n | 'WRAP_LENGTH_MISMATCH';\n\nexport class EciesSealedPoeError extends Error {\n readonly code: EciesSealedPoeErrorCode;\n\n constructor(code: EciesSealedPoeErrorCode, message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'EciesSealedPoeError';\n this.code = code;\n }\n}\n","import { cdeDecodeOptions, decode, encode } from 'cbor2';\nimport { sortCoreDeterministic } from 'cbor2/sorts';\n\nimport { CanonicalCborError } from './errors';\n\nexport type CanonicalCborValue =\n | null\n | boolean\n | number\n | bigint\n | string\n | Uint8Array\n | readonly CanonicalCborValue[]\n | { readonly [key: string]: CanonicalCborValue }\n | ReadonlyMap<string | number, CanonicalCborValue>;\n\nexport function encodeCanonicalCbor(value: CanonicalCborValue): Uint8Array {\n return encode(value, {\n cde: true,\n collapseBigInts: true,\n rejectDuplicateKeys: true,\n sortKeys: sortCoreDeterministic,\n });\n}\n\nexport function decodeCanonicalCbor(bytes: Uint8Array): unknown {\n try {\n return decode(bytes, {\n ...cdeDecodeOptions,\n rejectStreaming: true,\n rejectDuplicateKeys: true,\n // A Label 309 record carries integers, byte/text strings, arrays, maps and\n // `null` — and nothing else. Without these rejections the major-type-7\n // surface leaks into the decoder: a float16/32/64 that happens to hold an\n // integral value (e.g. 1.0) silently decodes to the integer 1 and passes\n // a `z.literal(1)` / Number.isInteger schema check, so two byte strings\n // that are NOT byte-identical canonicalise to the same record. That\n // breaks the cross-implementation parity invariant (the Python twin\n // already rejects non-integer `v` / `enc.scheme` outright). Reject the\n // whole non-record surface — floats, negative zero, undefined, and\n // non-{true,false,null} simple values — so any such input surfaces as\n // MALFORMED_CBOR via mapDecodeError rather than decoding to a look-alike.\n rejectFloats: true,\n rejectNegativeZero: true,\n rejectUndefined: true,\n rejectSimple: true,\n });\n } catch (cause) {\n throw mapDecodeError(cause);\n }\n}\n\nfunction mapDecodeError(cause: unknown): CanonicalCborError {\n const message = cause instanceof Error ? cause.message : String(cause);\n const lower = message.toLowerCase();\n // Every canonical-decode violation collapses to the single public taxonomy\n // code MALFORMED_CBOR: indefinite-length (streaming) items, duplicate keys,\n // non-canonical (unsorted) key ordering, non-minimal integer encodings, and\n // invalid UTF-8 in text strings. cbor2 raises the SAME \"Duplicate or out of\n // order key\" message for both true duplicates AND distinct-but-unsorted keys,\n // so the two are indistinguishable by message — and per the Label 309 taxonomy\n // both belong under MALFORMED_CBOR anyway. The specific cause survives in the\n // human-readable message below; for indefinite-length we state it explicitly\n // so the diagnostic is not lost when the code is collapsed.\n const isIndefinite = lower.includes('streaming') || lower.includes('indefinite');\n const detail = isIndefinite\n ? `indefinite-length items are not permitted in canonical CBOR: ${message}`\n : message;\n return new CanonicalCborError('MALFORMED_CBOR', `cbor decode failed: ${detail}`, { cause });\n}\n","// Single source of truth for two seams that wrap, unwrap, and the wire encoder\n// MUST agree on byte-for-byte:\n//\n// 1. How the 1120-byte X-Wing `enc` is split into the ≤ 64-byte byte-string\n// chunks the Cardano ledger requires (`kem_ct`), and the inverse join.\n// 2. The canonical-CBOR serialization of the slot array that feeds slots_mac.\n//\n// Keeping both here means the producer (wrap) and the verifier (unwrap), as well\n// as the downstream record encoder, cannot diverge on the bytes the MAC commits\n// to — the single highest correctness risk for the hybrid branch, since a\n// divergence would leave the ML-KEM ciphertext unauthenticated.\n\nimport { encodeCanonicalCbor, type CanonicalCborValue } from '../cbor/canonical';\n\nimport type { Mlkem768X25519Slot, X25519Slot } from './wrap';\n\n// The envelope-level KEM discriminator.\nexport type SealedKem = 'x25519' | 'mlkem768x25519';\n\n// Cardano ledger CDDL caps every `transaction_metadatum` byte string at 64\n// bytes, so any value larger than 64 bytes is carried as an array of ≤ 64-byte\n// chunks (the `bytes-chunk-array` wire form). This is the identical split rule\n// the record encoder applies to chunked COSE bytes.\nconst CHUNK_MAX_BYTES = 64;\n\n// Split a logical byte string into ≤ 64-byte chunks. Used for the X-Wing\n// `enc` → `kem_ct` wire form. Subarrays are views over the input, never copies.\nexport function chunkKemCt(value: Uint8Array): Uint8Array[] {\n if (value.length === 0) {\n throw new Error('chunkKemCt: refusing to chunk an empty byte string');\n }\n const chunks: Uint8Array[] = [];\n for (let i = 0; i < value.length; i += CHUNK_MAX_BYTES) {\n chunks.push(value.subarray(i, Math.min(i + CHUNK_MAX_BYTES, value.length)));\n }\n return chunks;\n}\n\n// Inverse of chunkKemCt: concatenate the chunked `kem_ct` back into the flat\n// X-Wing `enc`. Performs NO length validation — the caller (unwrap) gates the\n// reassembled length against MLKEM768X25519_ENC_LENGTH before any decapsulation.\nexport function joinKemCt(chunks: ReadonlyArray<Uint8Array>): Uint8Array {\n let total = 0;\n for (const c of chunks) total += c.length;\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.length;\n }\n return out;\n}\n\n// KEM-driven slot serialization for the slots_mac input.\n//\n// • x25519: each slot → { epk: bstr, wrap: bstr }\n// • mlkem768x25519: each slot → { kem_ct: [ bstr, ... ], wrap: bstr }\n//\n// The hybrid form uses the SAME chunked-array shape as the wire encoder, so the\n// MAC commits to the ciphertext exactly as it appears on-chain. Returns the\n// canonical-CBOR bytes ready for HMAC.\nexport function slotsToMacCbor(\n slots: ReadonlyArray<X25519Slot | Mlkem768X25519Slot>,\n kem: SealedKem,\n): Uint8Array {\n let value: CanonicalCborValue;\n if (kem === 'x25519') {\n value = (slots as ReadonlyArray<X25519Slot>).map((s) => ({ epk: s.epk, wrap: s.wrap }));\n } else {\n value = (slots as ReadonlyArray<Mlkem768X25519Slot>).map((s) => ({\n // Canonicalize the chunk boundaries before the MAC commits to them:\n // reassemble the logical ciphertext and re-split into canonical ≤ 64-byte\n // chunks. The on-wire `kem_ct` array is a transport detail (the Cardano\n // ledger's 64-byte metadatum cap), and a hostile or non-canonical chunking\n // ([1, 63, …] instead of [64, …]) reassembles to the SAME bytes — so the\n // MAC must be invariant to it. Committing to the verbatim wire chunks would\n // let an attacker re-chunk an honest envelope and break the slots_mac match\n // for an honest recipient. Honest (already-64B-chunked) records are\n // unchanged; a real byte flip still changes the reassembled bytes and is\n // still rejected.\n kem_ct: chunkKemCt(joinKemCt(s.kem_ct)),\n wrap: s.wrap,\n }));\n }\n return encodeCanonicalCbor(value);\n}\n","// Multi-recipient sealed-PoE wrap (age-style ECIES + AEAD-bound slots).\n// Wire-field names are fixed by the standard: scheme, aead, kem, nonce, slots, slots_mac.\n//\n// Two KEM branches share one envelope shape, discriminated on the envelope-level\n// `kem` field:\n//\n// • kem: 'x25519' — classical age-style ECIES. Per-slot epk(32) + wrap(48).\n// • kem: 'mlkem768x25519' — X-Wing hybrid (ML-KEM-768 + X25519). Per-slot the\n// 1120-byte X-Wing enc carried as a chunked byte-string\n// array (`kem_ct`) + wrap(48). No per-slot epk.\n//\n// The slot type is a discriminated union so every consumer is forced — at compile\n// time — to branch on the KEM before touching kem-specific fields.\n\nimport { randomBytes } from '@noble/ciphers/utils.js';\nimport { hmac } from '@noble/hashes/hmac.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { chacha20Poly1305Encrypt } from '../aead/chacha20-poly1305';\nimport { xchacha20Poly1305Encrypt } from '../aead/xchacha20-poly1305';\nimport { hkdfSha256 } from '../kdf/hkdf';\nimport {\n mlkem768x25519Encapsulate,\n MLKEM768X25519_ENC_LENGTH,\n MLKEM768X25519_ESEED_LENGTH,\n MLKEM768X25519_PUBLIC_KEY_LENGTH,\n} from '../kem/mlkem768x25519';\nimport { x25519Ecdh, x25519PublicKey } from '../kem/x25519';\n\nimport { EciesSealedPoeError } from './errors';\nimport { chunkKemCt, slotsToMacCbor, type SealedKem } from './slots-codec';\n\n// HKDF info strings — fixed protocol labels for KEK derivation and the slot MAC.\n// Byte-length invariants enforce that the SCREAMING_SNAKE constants stay in sync\n// with the on-wire ASCII literals every conformant verifier hashes against.\nexport const CARDANO_POE_HKDF_INFO_KEK: Uint8Array = new TextEncoder().encode('cardano-poe-kek-v1');\n// Hybrid (X-Wing) per-slot KEK label. Distinct from the classical label so a\n// KEK derived under one KEM can never collide with the other. Reused verbatim as\n// the per-slot wrap AEAD AAD, exactly as the classical path reuses its own label.\nexport const CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-kek-mlkem768x25519-v1',\n);\nexport const CARDANO_POE_HKDF_INFO_SLOTS_MAC: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-slots-mac-v1',\n);\n\nconst ZERO_NONCE_12: Uint8Array = new Uint8Array(12);\nconst EMPTY_SALT: Uint8Array = new Uint8Array(0);\nconst X25519_PUBLIC_KEY_LENGTH = 32 as const;\nconst X25519_SECRET_KEY_LENGTH = 32 as const;\nconst CEK_LENGTH = 32 as const;\nconst NONCE_LENGTH = 24 as const;\nconst WRAP_LENGTH = 48 as const;\nconst SLOTS_MAC_LENGTH = 32 as const;\n\nif (CARDANO_POE_HKDF_INFO_KEK.length !== 18) {\n throw new Error('CARDANO_POE_HKDF_INFO_KEK byte-length invariant violated (expected 18)');\n}\nif (CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519.length !== 33) {\n throw new Error(\n 'CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519 byte-length invariant violated (expected 33)',\n );\n}\nif (CARDANO_POE_HKDF_INFO_SLOTS_MAC.length !== 24) {\n throw new Error('CARDANO_POE_HKDF_INFO_SLOTS_MAC byte-length invariant violated (expected 24)');\n}\nif (ZERO_NONCE_12.length !== 12) {\n throw new Error('ZERO_NONCE_12 byte-length invariant violated (expected 12)');\n}\n\n// Classical per-slot wire shape: { epk: bstr(32), wrap: bstr(48) }.\nexport interface X25519Slot {\n readonly epk: Uint8Array;\n readonly wrap: Uint8Array;\n}\n\n// Hybrid per-slot wire shape: { kem_ct: [ bstr .size (1..64) ], wrap: bstr(48) }.\n// `kem_ct` is the 1120-byte X-Wing enc carried as a chunked byte-string array\n// (the Cardano ledger caps any single metadatum bstr at 64 bytes). There is NO\n// per-slot epk and NO per-slot kem field — the KEM identifier is hoisted to\n// envelope scope (every slot shares it).\nexport interface Mlkem768X25519Slot {\n readonly kem_ct: ReadonlyArray<Uint8Array>;\n readonly wrap: Uint8Array;\n}\n\n// Back-compat alias retired: callers branch on the envelope `kem` and use the\n// concrete slot type. The discriminated `SealedEnvelope` below is the only\n// shape consumers should depend on.\n\n// Sealed envelope wire shape (discriminated on `kem`).\nexport type SealedEnvelope =\n | {\n readonly scheme: 1;\n readonly aead: 'xchacha20-poly1305';\n readonly kem: 'x25519';\n readonly nonce: Uint8Array;\n readonly slots: ReadonlyArray<X25519Slot>;\n readonly slots_mac: Uint8Array;\n }\n | {\n readonly scheme: 1;\n readonly aead: 'xchacha20-poly1305';\n readonly kem: 'mlkem768x25519';\n readonly nonce: Uint8Array;\n readonly slots: ReadonlyArray<Mlkem768X25519Slot>;\n readonly slots_mac: Uint8Array;\n };\n\nexport interface SealedPoeOutput {\n readonly envelope: SealedEnvelope;\n readonly ciphertext: Uint8Array;\n}\n\nexport interface WrapArgs {\n readonly plaintext: Uint8Array;\n readonly recipientPublicKeys: ReadonlyArray<Uint8Array>;\n // KEM branch selector. Defaults to 'x25519' for the classical path. The\n // recipient public-key length is validated against the chosen KEM.\n readonly kem?: SealedKem;\n readonly cek?: Uint8Array;\n readonly nonce?: Uint8Array;\n // Deterministic X25519 ephemeral scalars — x25519 branch only.\n readonly ephemeralSecrets?: ReadonlyArray<Uint8Array>;\n // Deterministic X-Wing encapsulation randomness (64 bytes each) — hybrid\n // branch only. One per recipient, parallel to recipientPublicKeys.\n readonly eseeds?: ReadonlyArray<Uint8Array>;\n readonly skipShuffle?: boolean;\n}\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n\n// Anonymity invariant: wire ordering MUST NOT encode \"primary\n// recipient first\". A CSPRNG-keyed Fisher-Yates shuffle uniformly permutes the\n// slot array so trial-decrypt order leaks no recipient identity. The\n// slot-set HMAC is computed AFTER this shuffle, binding the on-wire order.\n//\n// Draw an unbiased index in [0, m) from a CSPRNG uint32 via rejection sampling.\n// A plain `u32 % m` skews toward the low residues whenever `m` does not divide\n// 2^32 evenly: the values [0, 2^32 mod m) each occur one extra time. This\n// function exists purely to produce a UNIFORM permutation, so the bias — though\n// cryptographically negligible — is exactly the property we cannot tolerate.\n// We reject any draw landing in the final partial block [limit, 2^32) and\n// redraw, leaving only the residues that map uniformly onto [0, m).\n// Exported so the rejection-bound arithmetic can be asserted directly in tests\n// without relying on a flaky statistical-distribution check.\nexport function uniformIndexBelow(m: number): number {\n // 2^32 mod m, computed without overflowing the 32-bit space.\n const limit = 0x1_0000_0000 - (0x1_0000_0000 % m);\n const buf = new Uint32Array(1);\n let x: number;\n do {\n crypto.getRandomValues(buf);\n x = buf[0] as number;\n } while (x >= limit);\n return x % m;\n}\n\nfunction csprngShuffle<T>(arr: T[]): void {\n for (let i = arr.length - 1; i > 0; i--) {\n const j = uniformIndexBelow(i + 1);\n const tmp = arr[i] as T;\n arr[i] = arr[j] as T;\n arr[j] = tmp;\n }\n}\n\n// Wrap the CEK for one classical recipient: age-style ECIES stanza.\nfunction wrapSlotX25519(args: {\n pubR: Uint8Array;\n privEph: Uint8Array | undefined;\n cek: Uint8Array;\n slotIdx: number;\n}): X25519Slot {\n const privEph = args.privEph ?? randomBytes(X25519_SECRET_KEY_LENGTH);\n if (privEph.length !== X25519_SECRET_KEY_LENGTH) {\n throw new EciesSealedPoeError(\n 'INVALID_EPHEMERAL_SECRET_LENGTH',\n `ephemeralSecrets[${args.slotIdx}] MUST be exactly ${X25519_SECRET_KEY_LENGTH} bytes, got ${privEph.length}`,\n );\n }\n const epk = x25519PublicKey({ secretKey: privEph });\n const shared = x25519Ecdh({ secretKey: privEph, theirPublicKey: args.pubR });\n // age v1 stanza salt is `epk || pub_R`.\n const kek = hkdfSha256({\n ikm: shared,\n salt: concat(epk, args.pubR),\n info: CARDANO_POE_HKDF_INFO_KEK,\n length: 32,\n });\n // Per-slot wrap AAD MUST be the 18-byte ASCII literal of the KEK info\n // string (never empty AAD).\n const wrap = chacha20Poly1305Encrypt({\n key: kek,\n nonce: ZERO_NONCE_12,\n aad: CARDANO_POE_HKDF_INFO_KEK,\n plaintext: args.cek,\n });\n if (wrap.length !== WRAP_LENGTH) {\n throw new Error(`internal: wrap.length=${wrap.length}, expected ${WRAP_LENGTH}`);\n }\n return { epk, wrap };\n}\n\n// Wrap the CEK for one hybrid recipient: X-Wing encapsulation → HKDF → AEAD.\n// The KEK info label doubles as the wrap AEAD AAD, mirroring the classical path.\nfunction wrapSlotMlkem768X25519(args: {\n pubR: Uint8Array;\n eseed: Uint8Array | undefined;\n cek: Uint8Array;\n}): Mlkem768X25519Slot {\n const { enc, ss } = mlkem768x25519Encapsulate({\n publicKey: args.pubR,\n ...(args.eseed !== undefined ? { eseed: args.eseed } : {}),\n });\n if (enc.length !== MLKEM768X25519_ENC_LENGTH) {\n throw new Error(`internal: enc.length=${enc.length}, expected ${MLKEM768X25519_ENC_LENGTH}`);\n }\n const kek = hkdfSha256({\n ikm: ss,\n salt: EMPTY_SALT,\n info: CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519,\n length: 32,\n });\n const wrap = chacha20Poly1305Encrypt({\n key: kek,\n nonce: ZERO_NONCE_12,\n aad: CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519,\n plaintext: args.cek,\n });\n if (wrap.length !== WRAP_LENGTH) {\n throw new Error(`internal: wrap.length=${wrap.length}, expected ${WRAP_LENGTH}`);\n }\n return { kem_ct: chunkKemCt(enc), wrap };\n}\n\nexport function eciesSealedPoeWrap(args: WrapArgs): SealedPoeOutput {\n const { plaintext, recipientPublicKeys } = args;\n const kem: SealedKem = args.kem ?? 'x25519';\n const n = recipientPublicKeys.length;\n\n // There is no fixed upper bound on slot count; the producer SDK polices the\n // per-record byte budget. Only the lower bound is enforced here.\n if (n < 1) {\n throw new EciesSealedPoeError(\n 'ENC_SLOTS_EMPTY',\n `recipientPublicKeys.length=${n} must be >= 1`,\n );\n }\n\n const expectedPubLen =\n kem === 'x25519' ? X25519_PUBLIC_KEY_LENGTH : MLKEM768X25519_PUBLIC_KEY_LENGTH;\n for (let i = 0; i < n; i++) {\n const pub = recipientPublicKeys[i];\n if (pub === undefined || pub.length !== expectedPubLen) {\n throw new EciesSealedPoeError(\n 'KEM_EPK_LENGTH_MISMATCH',\n `recipientPublicKeys[${i}] MUST be exactly ${expectedPubLen} bytes for kem='${kem}'`,\n );\n }\n }\n\n if (kem === 'x25519') {\n if (args.eseeds !== undefined) {\n throw new EciesSealedPoeError(\n 'EPHEMERAL_SECRETS_COUNT_MISMATCH',\n \"eseeds is an X-Wing (mlkem768x25519) override and MUST NOT be supplied for kem='x25519'\",\n );\n }\n if (args.ephemeralSecrets !== undefined && args.ephemeralSecrets.length !== n) {\n throw new EciesSealedPoeError(\n 'EPHEMERAL_SECRETS_COUNT_MISMATCH',\n `ephemeralSecrets.length=${args.ephemeralSecrets.length} must match recipientPublicKeys.length=${n}`,\n );\n }\n } else {\n if (args.ephemeralSecrets !== undefined) {\n throw new EciesSealedPoeError(\n 'EPHEMERAL_SECRETS_COUNT_MISMATCH',\n \"ephemeralSecrets is an X25519 override and MUST NOT be supplied for kem='mlkem768x25519'\",\n );\n }\n if (args.eseeds !== undefined) {\n if (args.eseeds.length !== n) {\n throw new EciesSealedPoeError(\n 'EPHEMERAL_SECRETS_COUNT_MISMATCH',\n `eseeds.length=${args.eseeds.length} must match recipientPublicKeys.length=${n}`,\n );\n }\n for (let i = 0; i < n; i++) {\n const eseed = args.eseeds[i]!;\n if (eseed.length !== MLKEM768X25519_ESEED_LENGTH) {\n throw new EciesSealedPoeError(\n 'INVALID_EPHEMERAL_SECRET_LENGTH',\n `eseeds[${i}] MUST be exactly ${MLKEM768X25519_ESEED_LENGTH} bytes, got ${eseed.length}`,\n );\n }\n }\n }\n }\n\n const cek = args.cek ?? randomBytes(CEK_LENGTH);\n const nonce = args.nonce ?? randomBytes(NONCE_LENGTH);\n if (cek.length !== CEK_LENGTH) {\n throw new EciesSealedPoeError(\n 'INVALID_CEK_LENGTH',\n `cek MUST be exactly ${CEK_LENGTH} bytes, got ${cek.length}`,\n );\n }\n if (nonce.length !== NONCE_LENGTH) {\n throw new EciesSealedPoeError(\n 'NONCE_LENGTH_MISMATCH',\n `nonce MUST be exactly ${NONCE_LENGTH} bytes, got ${nonce.length}`,\n );\n }\n\n let envelope: SealedEnvelope;\n if (kem === 'x25519') {\n const slots: X25519Slot[] = [];\n for (let i = 0; i < n; i++) {\n slots.push(\n wrapSlotX25519({\n pubR: recipientPublicKeys[i]!,\n privEph: args.ephemeralSecrets ? (args.ephemeralSecrets[i] as Uint8Array) : undefined,\n cek,\n slotIdx: i,\n }),\n );\n }\n // Anonymity invariant (see csprngShuffle comment).\n if (args.skipShuffle !== true) {\n csprngShuffle(slots);\n }\n const slotsMac = computeSlotsMac(cek, slots, 'x25519');\n envelope = {\n scheme: 1,\n aead: 'xchacha20-poly1305',\n kem: 'x25519',\n nonce,\n slots,\n slots_mac: slotsMac,\n };\n } else {\n const slots: Mlkem768X25519Slot[] = [];\n for (let i = 0; i < n; i++) {\n slots.push(\n wrapSlotMlkem768X25519({\n pubR: recipientPublicKeys[i]!,\n eseed: args.eseeds ? (args.eseeds[i] as Uint8Array) : undefined,\n cek,\n }),\n );\n }\n if (args.skipShuffle !== true) {\n csprngShuffle(slots);\n }\n const slotsMac = computeSlotsMac(cek, slots, 'mlkem768x25519');\n envelope = {\n scheme: 1,\n aead: 'xchacha20-poly1305',\n kem: 'mlkem768x25519',\n nonce,\n slots,\n slots_mac: slotsMac,\n };\n }\n\n // Content AEAD AAD is `nonce || slots_mac` (24 + 32 = 56 B).\n const adContent = concat(nonce, envelope.slots_mac);\n const ciphertext = xchacha20Poly1305Encrypt({\n key: cek,\n nonce,\n aad: adContent,\n plaintext,\n });\n\n return { envelope, ciphertext };\n}\n\n// Slot-set MAC binds canonical-CBOR(slots) to the CEK.\n// The slot→CBOR serialization is KEM-driven (`slotsToMacCbor`) so the hybrid\n// kem_ct is authenticated by slots_mac exactly as the classical epk is.\nfunction computeSlotsMac(\n cek: Uint8Array,\n slots: ReadonlyArray<X25519Slot | Mlkem768X25519Slot>,\n kem: SealedKem,\n): Uint8Array {\n const hmacKey = hkdfSha256({\n ikm: cek,\n salt: EMPTY_SALT,\n info: CARDANO_POE_HKDF_INFO_SLOTS_MAC,\n length: 32,\n });\n const slotsCbor = slotsToMacCbor(slots, kem);\n const slotsMac = hmac(sha256, hmacKey, slotsCbor);\n if (slotsMac.length !== SLOTS_MAC_LENGTH) {\n throw new Error(`internal: slots_mac.length=${slotsMac.length}, expected ${SLOTS_MAC_LENGTH}`);\n }\n return slotsMac;\n}\n","// Isomorphic constant-time byte-equality. crypto-core is browser-safe by\n// design, so we cannot import `node:crypto.timingSafeEqual` — webpack rejects\n// the `node:` scheme in the browser bundle. A pure-JS XOR loop is constant-time\n// for equal-length inputs; length mismatch is a deliberate early-return (the\n// API surface itself leaks length, same as node's timingSafeEqual which throws).\nexport function compareCt(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n // Lengths are equal and `i` stays in-bounds, so both indexes are always\n // defined — no nullish guard is needed (and one would read as a guard for\n // an impossible case).\n for (let i = 0; i < a.length; i++) diff |= (a[i] as number) ^ (b[i] as number);\n return diff === 0;\n}\n","// Multi-recipient sealed-PoE unwrap (age-style trial-decrypt\n// + constant-time slots_mac binding + partitioning-oracle length pre-checks).\n//\n// Two forms (mutually exclusive — exactly one MUST be supplied):\n//\n// • Single-priv form: `recipientSecretKey: Uint8Array` — the standalone-verifier\n// path. Runs the trial-decrypt loop over `envelope.slots` once.\n//\n// • Multi-priv form: `recipientSecretKeys: ReadonlyArray<Uint8Array>` — for the\n// trial-decrypt scan of a rotated identity holding `[currentPriv, ...archivedPrivs]`.\n// Caller supplies the order; the iterator runs outer-loop = privkey ×\n// inner-loop = slot, short-circuiting on the first cross-priv match that\n// passes slots_mac verification. The recommended caller order\n// is `[currentPriv, ...previousPrivsReversed]` (newest archive first).\n//\n// Constant-time-N (default `true`) applies PER PRIV (the inner loop): all slots\n// are entered regardless of match position. The outer loop short-circuits on\n// first cross-priv match — the cross-priv channel is intrinsic to trial-decrypt\n//\n// Both KEM branches share this control flow. The per-slot recovery body differs:\n// • x25519: X25519 ECDH → HKDF → AEAD-unwrap; may throw on a low-order\n// epk (RFC 7748 §6.1 contributory-check rejection), handled\n// as a non-match.\n// • mlkem768x25519: X-Wing decapsulate → HKDF → AEAD-unwrap; NEVER throws on\n// attacker wire data (ML-KEM implicit rejection yields a\n// pseudorandom shared secret), so no try/catch around it.\n\nimport { hmac } from '@noble/hashes/hmac.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { chacha20Poly1305Decrypt } from '../aead/chacha20-poly1305';\nimport { AeadVerificationError } from '../aead/errors';\nimport { xchacha20Poly1305Decrypt } from '../aead/xchacha20-poly1305';\nimport { hkdfSha256 } from '../kdf/hkdf';\nimport { mlkem768x25519Decapsulate, MLKEM768X25519_ENC_LENGTH } from '../kem/mlkem768x25519';\nimport { x25519Ecdh, X25519LowOrderPointError, x25519PublicKey } from '../kem/x25519';\nimport { compareCt } from '../util/compare-ct';\n\nimport { EciesSealedPoeError } from './errors';\nimport { joinKemCt, slotsToMacCbor } from './slots-codec';\nimport {\n CARDANO_POE_HKDF_INFO_KEK,\n CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519,\n CARDANO_POE_HKDF_INFO_SLOTS_MAC,\n type Mlkem768X25519Slot,\n type SealedEnvelope,\n type X25519Slot,\n} from './wrap';\n\nexport type UnwrapFailureReason = 'WRONG_RECIPIENT_KEY' | 'TAMPERED_HEADER' | 'TAMPERED_CIPHERTEXT';\n\nexport type UnwrapResult =\n | { readonly matched: true; readonly plaintext: Uint8Array }\n | { readonly matched: false; readonly reason: UnwrapFailureReason };\n\n// Unified recipient key bundle. Callers hold BOTH the X25519\n// private-key chain (current + archived, for classical and rotation history)\n// AND the X-Wing secret seed(s) (for the hybrid KEM), without knowing which a\n// given record was sealed under. They pass the whole bundle; the unwrap /\n// trial-decrypt dispatch selects the correct secret list from `envelope.kem`:\n//\n// • kem === 'x25519' → bundle.x25519PrivateKeys\n// • kem === 'mlkem768x25519' → bundle.mlkem768x25519SecretSeeds\n//\n// Both lists are ordered newest-first (caller's responsibility — the outer\n// trial-decrypt loop scans them in order). A list MAY be empty when the\n// recipient holds no key for that KEM (e.g. archived-only X25519 identities\n// predate the hybrid KEM, so their hybrid seed list is empty); a bundle whose\n// selected list is empty unwraps to a clean WRONG_RECIPIENT_KEY / no_aead_pass\n// without touching any KEM primitive.\nexport interface RecipientKeyBundle {\n readonly x25519PrivateKeys: ReadonlyArray<Uint8Array>;\n readonly mlkem768x25519SecretSeeds: ReadonlyArray<Uint8Array>;\n}\n\n// Select the secret-key list a bundle contributes for the given envelope KEM.\n// The single dispatch seam — wrap and trial-decrypt both route through here so\n// the per-KEM selection lives in exactly one place.\nfunction selectBundleSecrets(\n envelope: SealedEnvelope,\n bundle: RecipientKeyBundle,\n): ReadonlyArray<Uint8Array> {\n return envelope.kem === 'x25519' ? bundle.x25519PrivateKeys : bundle.mlkem768x25519SecretSeeds;\n}\n\ninterface UnwrapArgsCommon {\n readonly envelope: SealedEnvelope;\n readonly ciphertext: Uint8Array;\n readonly constantTimeN?: boolean;\n // Test-only instrumentation for constant-time-N verification.\n // The unwrap fn bumps `count` once per inner-loop iteration entered. In the\n // multi-priv path, `count` is reset at the start of each outer iteration and\n // — when `perPrivCounts` is provided — the final per-priv inner count is\n // appended after that priv's inner loop completes. Production callers never\n // pass this.\n readonly _slotsAttemptedOut?: { count: number; perPrivCounts?: number[] };\n // Test-only multi-priv outer-loop iteration counter. Bumped to `k + 1` at\n // the start of each outer-loop iteration. Production callers never pass this.\n readonly _privsAttemptedOut?: { count: number };\n}\n\nexport interface UnwrapArgsSinglePriv extends UnwrapArgsCommon {\n readonly recipientSecretKey: Uint8Array;\n}\n\nexport interface UnwrapArgsMultiPriv extends UnwrapArgsCommon {\n readonly recipientSecretKeys: ReadonlyArray<Uint8Array>;\n}\n\n// Bundle form of the multi-priv path: the caller passes both KEMs' secret\n// lists and the dispatch picks the right one from `envelope.kem`. This is the\n// surface every read-path consumer (inbox decrypt, CLI decrypt, standalone\n// recipient verifier) should use — they hold the whole identity key bundle and\n// must NOT pre-select a list or rebuild slots themselves.\nexport interface UnwrapArgsBundle extends UnwrapArgsCommon {\n readonly recipientKeyBundle: RecipientKeyBundle;\n}\n\nexport type UnwrapArgs = UnwrapArgsSinglePriv | UnwrapArgsMultiPriv | UnwrapArgsBundle;\n\n// Trial-decrypt-only sibling of eciesSealedPoeUnwrap. Runs the\n// per-slot AEAD + slots_mac check but NEVER calls the content AEAD (which\n// requires the off-chain `ciphertext` blob, not available at trial-decrypt\n// time). Used by an inbox-scan agent to discover readable records before\n// fetching their ciphertext.\ninterface TrialDecryptOnlyArgsCommon {\n readonly envelope: SealedEnvelope;\n readonly constantTimeN?: boolean;\n readonly _slotsAttemptedOut?: { count: number; perPrivCounts?: number[] };\n readonly _privsAttemptedOut?: { count: number };\n}\n\n// Exactly one of `recipientSecretKeys` (flat, KEM-pre-selected) or\n// `recipientKeyBundle` (whole bundle, KEM dispatched from `envelope.kem`).\n// Inbox-scan consumers pass the bundle; the low-level / parity tests pass the\n// flat list directly.\nexport type TrialDecryptOnlyArgs = TrialDecryptOnlyArgsCommon &\n (\n | { readonly recipientSecretKeys: ReadonlyArray<Uint8Array> }\n | { readonly recipientKeyBundle: RecipientKeyBundle }\n );\n\nexport type TrialDecryptOnlyResult =\n | { readonly kind: 'match'; readonly slotIdx: number; readonly cek: Uint8Array }\n | { readonly kind: 'no_aead_pass' }\n | { readonly kind: 'aead_pass_no_mac_match' };\n\nconst ZERO_NONCE_12: Uint8Array = new Uint8Array(12);\nconst EMPTY_SALT: Uint8Array = new Uint8Array(0);\nconst X25519_SECRET_KEY_LENGTH = 32 as const;\nconst X25519_PUBLIC_KEY_LENGTH = 32 as const;\nconst NONCE_LENGTH = 24 as const;\nconst WRAP_LENGTH = 48 as const;\nconst SLOTS_MAC_LENGTH = 32 as const;\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n\n// Partitioning-oracle defence: every wire\n// length MUST be validated before any KEM/AEAD primitive is invoked, so malformed\n// records cannot probe per-slot failure ordering. Shared between\n// `eciesSealedPoeUnwrap` (single- and multi-priv) and `eciesSealedPoeTrialDecrypt`\n// to guarantee byte-identical pre-trial behaviour and to keep the dispatch\n// invariant in one place. For the hybrid branch this includes reassembling each\n// slot's `kem_ct` and asserting the flat enc length BEFORE any decapsulation.\nfunction assertEnvelopeStructure(\n envelope: SealedEnvelope,\n multiPrivKeys?: ReadonlyArray<Uint8Array>,\n singlePrivKey?: Uint8Array,\n): void {\n if (envelope.scheme !== 1) {\n throw new EciesSealedPoeError(\n 'UNSUPPORTED_ENC_VERSION',\n `envelope.scheme=${String(envelope.scheme)} unsupported (expected 1)`,\n );\n }\n if (envelope.aead !== 'xchacha20-poly1305') {\n throw new EciesSealedPoeError(\n 'UNSUPPORTED_AEAD_ALG',\n `envelope.aead=${String(envelope.aead)} unsupported (expected 'xchacha20-poly1305')`,\n );\n }\n if (envelope.kem !== 'x25519' && envelope.kem !== 'mlkem768x25519') {\n throw new EciesSealedPoeError(\n 'UNSUPPORTED_KEM_ALG',\n `envelope.kem=${String((envelope as { kem: string }).kem)} unsupported (expected 'x25519' or 'mlkem768x25519')`,\n );\n }\n\n // Envelope-level length pre-checks in this exact order.\n const n = envelope.slots.length;\n if (n < 1) {\n throw new EciesSealedPoeError('ENC_SLOTS_EMPTY', `envelope.slots.length=${n} must be >= 1`);\n }\n if (envelope.nonce.length !== NONCE_LENGTH) {\n throw new EciesSealedPoeError(\n 'NONCE_LENGTH_MISMATCH',\n `envelope.nonce MUST be exactly ${NONCE_LENGTH} bytes, got ${envelope.nonce.length}`,\n );\n }\n if (envelope.slots_mac.length !== SLOTS_MAC_LENGTH) {\n throw new EciesSealedPoeError(\n 'ENC_SLOTS_MAC_INVALID_LENGTH',\n `envelope.slots_mac MUST be exactly ${SLOTS_MAC_LENGTH} bytes, got ${envelope.slots_mac.length}`,\n );\n }\n\n // Per-slot length pre-checks — KEM-driven. ALL slots are validated here,\n // before any decapsulation, so the trial-decrypt loop never observes a\n // malformed slot (partitioning-oracle-safe ordering).\n if (envelope.kem === 'x25519') {\n for (let i = 0; i < n; i++) {\n const slot = envelope.slots[i]!;\n if (slot.epk.length !== X25519_PUBLIC_KEY_LENGTH) {\n throw new EciesSealedPoeError(\n 'KEM_EPK_LENGTH_MISMATCH',\n `envelope.slots[${i}].epk MUST be exactly ${X25519_PUBLIC_KEY_LENGTH} bytes, got ${slot.epk.length}`,\n );\n }\n if (slot.wrap.length !== WRAP_LENGTH) {\n throw new EciesSealedPoeError(\n 'WRAP_LENGTH_MISMATCH',\n `envelope.slots[${i}].wrap MUST be exactly ${WRAP_LENGTH} bytes, got ${slot.wrap.length}`,\n );\n }\n }\n } else {\n for (let i = 0; i < n; i++) {\n const slot = envelope.slots[i]!;\n const enc = joinKemCt(slot.kem_ct);\n if (enc.length !== MLKEM768X25519_ENC_LENGTH) {\n throw new EciesSealedPoeError(\n 'KEM_CT_LENGTH_MISMATCH',\n `envelope.slots[${i}].kem_ct MUST reassemble to exactly ${MLKEM768X25519_ENC_LENGTH} bytes, got ${enc.length}`,\n );\n }\n if (slot.wrap.length !== WRAP_LENGTH) {\n throw new EciesSealedPoeError(\n 'WRAP_LENGTH_MISMATCH',\n `envelope.slots[${i}].wrap MUST be exactly ${WRAP_LENGTH} bytes, got ${slot.wrap.length}`,\n );\n }\n }\n }\n\n if (multiPrivKeys !== undefined) {\n for (let i = 0; i < multiPrivKeys.length; i++) {\n if (multiPrivKeys[i]!.length !== X25519_SECRET_KEY_LENGTH) {\n throw new EciesSealedPoeError(\n 'INVALID_RECIPIENT_KEY',\n `recipientSecretKeys[${i}] MUST be exactly ${X25519_SECRET_KEY_LENGTH} bytes, got ${multiPrivKeys[i]!.length}`,\n );\n }\n }\n } else if (singlePrivKey !== undefined) {\n if (singlePrivKey.length !== X25519_SECRET_KEY_LENGTH) {\n throw new EciesSealedPoeError(\n 'INVALID_RECIPIENT_KEY',\n `recipientSecretKey MUST be exactly ${X25519_SECRET_KEY_LENGTH} bytes, got ${singlePrivKey.length}`,\n );\n }\n }\n}\n\n// Classical (x25519) per-slot recovery body. Returns the CEK on the first\n// AEAD-tag success; null otherwise. `liveSlot` distinguishes the real-work path\n// (attempt the AEAD unwrap) from the constant-time-N dummy path (do the ECDH +\n// HKDF but skip the AEAD, since a CEK is already in hand).\nfunction tryX25519Slot(args: {\n slot: X25519Slot;\n recipientSecretKey: Uint8Array;\n pubRLocal: Uint8Array;\n liveSlot: boolean;\n}): Uint8Array | null {\n // A slot's `epk` is attacker-influenceable wire data. A small-order\n // Montgomery point makes the X25519 shared secret all-zero, which the KEM\n // rejects per RFC 7748 §6.1. Such a slot can never have been produced by a\n // conformant wrap for THIS recipient, so it is a non-match — handled here\n // identically to an AEAD-tag failure (skip the slot, keep iterating so the\n // constant-time-N loop shape is preserved). Only the contributory-check\n // rejection is swallowed; any other error propagates.\n if (args.liveSlot) {\n try {\n const shared = x25519Ecdh({\n secretKey: args.recipientSecretKey,\n theirPublicKey: args.slot.epk,\n });\n const kek = hkdfSha256({\n ikm: shared,\n salt: concat(args.slot.epk, args.pubRLocal),\n info: CARDANO_POE_HKDF_INFO_KEK,\n length: 32,\n });\n return chacha20Poly1305Decrypt({\n key: kek,\n nonce: ZERO_NONCE_12,\n aad: CARDANO_POE_HKDF_INFO_KEK,\n ciphertext: args.slot.wrap,\n });\n } catch (e) {\n if (!(e instanceof AeadVerificationError) && !(e instanceof X25519LowOrderPointError)) {\n throw e;\n }\n return null;\n }\n }\n // Constant-time-N dummy path: mirror the real-work ECDH + HKDF, still\n // tolerating a low-order epk in a later slot so it cannot turn a successful\n // unwrap into a throw.\n try {\n const shared = x25519Ecdh({\n secretKey: args.recipientSecretKey,\n theirPublicKey: args.slot.epk,\n });\n hkdfSha256({\n ikm: shared,\n salt: concat(args.slot.epk, args.pubRLocal),\n info: CARDANO_POE_HKDF_INFO_KEK,\n length: 32,\n });\n } catch (e) {\n if (!(e instanceof X25519LowOrderPointError)) throw e;\n }\n return null;\n}\n\n// Hybrid (mlkem768x25519) per-slot recovery body. X-Wing decapsulate NEVER\n// throws on attacker wire data (ML-KEM implicit rejection), so there is no\n// try/catch: a wrong shared secret simply yields a KEK that fails the AEAD tag.\n// The dummy (constant-time-N) path runs a FULL decapsulate + HKDF so matching\n// and non-matching slots cost the same X-Wing work.\nfunction tryMlkem768X25519Slot(args: {\n slot: Mlkem768X25519Slot;\n recipientSecretKey: Uint8Array;\n liveSlot: boolean;\n}): Uint8Array | null {\n // kem_ct length was validated to reassemble to MLKEM768X25519_ENC_LENGTH in\n // assertEnvelopeStructure, so this join + decapsulate is constant-work.\n const enc = joinKemCt(args.slot.kem_ct);\n const ss = mlkem768x25519Decapsulate({ secretSeed: args.recipientSecretKey, enc });\n const kek = hkdfSha256({\n ikm: ss,\n salt: EMPTY_SALT,\n info: CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519,\n length: 32,\n });\n if (!args.liveSlot) {\n // Dummy path: full decapsulate + HKDF already done above; skip only the\n // AEAD attempt (a CEK is already in hand).\n return null;\n }\n try {\n return chacha20Poly1305Decrypt({\n key: kek,\n nonce: ZERO_NONCE_12,\n aad: CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519,\n ciphertext: args.slot.wrap,\n });\n } catch (e) {\n if (!(e instanceof AeadVerificationError)) throw e;\n return null;\n }\n}\n\n// Per-priv inner trial-decrypt loop with slot-index reporting, KEM-driven.\n// Enters every slot when constantTimeN; the dummy path keeps per-iteration cost\n// uniform regardless of which slot matched.\nfunction tryRecipientUnwrapWithIdx(\n envelope: SealedEnvelope,\n recipientSecretKey: Uint8Array,\n constantTimeN: boolean,\n slotsAttemptedOut: { count: number; perPrivCounts?: number[] } | undefined,\n): { cek: Uint8Array; slotIdx: number } | null {\n const n = envelope.slots.length;\n let cek: Uint8Array | null = null;\n let matchedSlotIdx = -1;\n\n if (envelope.kem === 'x25519') {\n const pubRLocal = x25519PublicKey({ secretKey: recipientSecretKey });\n for (let i = 0; i < n; i++) {\n if (slotsAttemptedOut !== undefined) {\n slotsAttemptedOut.count = i + 1;\n }\n const candidate = tryX25519Slot({\n slot: envelope.slots[i]!,\n recipientSecretKey,\n pubRLocal,\n liveSlot: cek === null,\n });\n if (cek === null && candidate !== null) {\n cek = candidate;\n matchedSlotIdx = i;\n }\n if (cek !== null && !constantTimeN) break;\n }\n } else {\n for (let i = 0; i < n; i++) {\n if (slotsAttemptedOut !== undefined) {\n slotsAttemptedOut.count = i + 1;\n }\n const candidate = tryMlkem768X25519Slot({\n slot: envelope.slots[i]!,\n recipientSecretKey,\n liveSlot: cek === null,\n });\n if (cek === null && candidate !== null) {\n cek = candidate;\n matchedSlotIdx = i;\n }\n if (cek !== null && !constantTimeN) break;\n }\n }\n return cek === null ? null : { cek, slotIdx: matchedSlotIdx };\n}\n\n// Back-compat wrapper preserved for callers that only care about the CEK\n// (single-priv path inside `eciesSealedPoeUnwrap`).\nfunction tryRecipientUnwrap(\n envelope: SealedEnvelope,\n recipientSecretKey: Uint8Array,\n constantTimeN: boolean,\n slotsAttemptedOut: { count: number; perPrivCounts?: number[] } | undefined,\n): Uint8Array | null {\n return (\n tryRecipientUnwrapWithIdx(envelope, recipientSecretKey, constantTimeN, slotsAttemptedOut)\n ?.cek ?? null\n );\n}\n\n// Slot-set MAC bytes, KEM-driven so the hybrid kem_ct is\n// committed exactly as it appears on-wire. Constant across the multi-priv outer\n// loop (depends only on envelope.slots), so callers compute it once.\nfunction slotsMacCborBytes(envelope: SealedEnvelope): Uint8Array {\n return slotsToMacCbor(\n envelope.slots as ReadonlyArray<X25519Slot | Mlkem768X25519Slot>,\n envelope.kem,\n );\n}\n\nexport function eciesSealedPoeUnwrap(args: UnwrapArgs): UnwrapResult {\n const { envelope, ciphertext } = args;\n const constantTimeN = args.constantTimeN ?? true;\n\n // Exactly-one-of validation across the three UnwrapArgs forms (single-priv,\n // flat multi-priv, bundle). Runs before any AEAD / wire-shape work so a\n // malformed call cannot probe per-slot AEAD timing. The bundle form resolves\n // to a flat multi-priv list here by dispatching on `envelope.kem` — from this\n // point the loop is identical regardless of how the caller supplied keys.\n const hasSingle = 'recipientSecretKey' in args;\n const hasBundle = 'recipientKeyBundle' in args;\n const multiPrivKeys: ReadonlyArray<Uint8Array> | undefined = hasBundle\n ? selectBundleSecrets(envelope, (args as UnwrapArgsBundle).recipientKeyBundle)\n : 'recipientSecretKeys' in args\n ? (args as UnwrapArgsMultiPriv).recipientSecretKeys\n : undefined;\n const hasMulti = multiPrivKeys !== undefined;\n if (hasSingle === hasMulti) {\n throw new EciesSealedPoeError(\n 'INVALID_RECIPIENT_KEY',\n 'exactly one of recipientSecretKey / recipientSecretKeys / recipientKeyBundle MUST be supplied',\n );\n }\n // A bundle selecting an empty list for this KEM means the recipient holds no\n // key of the matching kind (e.g. an archived-only identity facing a hybrid\n // record). That is a legitimate non-match, NOT a malformed call — return a\n // clean WRONG_RECIPIENT_KEY without invoking any KEM primitive. The flat\n // multi-priv form keeps the original \"empty array is a programmer error\"\n // contract its callers (and step-3 tests) rely on.\n if (hasMulti && multiPrivKeys!.length === 0) {\n if (hasBundle) {\n return { matched: false, reason: 'WRONG_RECIPIENT_KEY' };\n }\n throw new EciesSealedPoeError(\n 'INVALID_RECIPIENT_KEY',\n 'recipientSecretKeys MUST be a non-empty array, got length=0',\n );\n }\n\n // Partitioning-oracle pre-checks; per-priv length validation happens\n // inside `assertEnvelopeStructure`.\n if (hasMulti) {\n assertEnvelopeStructure(envelope, multiPrivKeys, undefined);\n } else {\n assertEnvelopeStructure(envelope, undefined, (args as UnwrapArgsSinglePriv).recipientSecretKey);\n }\n\n // Trial-decrypt loop. With constantTimeN=true the loop\n // entries are uniform regardless of match position; the per-iteration body\n // does the same KEM + HKDF work in both branches.\n\n let matchedCek: Uint8Array | null = null;\n let anyCandidateRecovered = false;\n\n if (hasSingle) {\n const recipientSecretKey = (args as UnwrapArgsSinglePriv).recipientSecretKey;\n const cek = tryRecipientUnwrap(\n envelope,\n recipientSecretKey,\n constantTimeN,\n args._slotsAttemptedOut,\n );\n if (cek === null) {\n return { matched: false, reason: 'WRONG_RECIPIENT_KEY' };\n }\n // Slot-set MAC verification. Use compareCt to\n // avoid leaking byte-position via early-exit on first mismatching byte.\n const slotsCbor = slotsMacCborBytes(envelope);\n const hmacKey = hkdfSha256({\n ikm: cek,\n salt: EMPTY_SALT,\n info: CARDANO_POE_HKDF_INFO_SLOTS_MAC,\n length: 32,\n });\n const slotsMacCalc = hmac(sha256, hmacKey, slotsCbor);\n if (!compareCt(slotsMacCalc, envelope.slots_mac)) {\n return { matched: false, reason: 'TAMPERED_HEADER' };\n }\n matchedCek = cek;\n } else {\n // The slots-CBOR is constant across the outer loop (depends only on\n // envelope.slots) — compute once before the loop to keep per-priv cost\n // identical to the single-priv path.\n const slotsCbor = slotsMacCborBytes(envelope);\n const recipientSecretKeys = multiPrivKeys!;\n for (let k = 0; k < recipientSecretKeys.length; k++) {\n if (args._privsAttemptedOut !== undefined) {\n args._privsAttemptedOut.count = k + 1;\n }\n if (args._slotsAttemptedOut !== undefined) {\n args._slotsAttemptedOut.count = 0;\n }\n const cek = tryRecipientUnwrap(\n envelope,\n recipientSecretKeys[k]!,\n constantTimeN,\n args._slotsAttemptedOut,\n );\n if (args._slotsAttemptedOut?.perPrivCounts !== undefined) {\n args._slotsAttemptedOut.perPrivCounts.push(args._slotsAttemptedOut.count);\n }\n if (cek === null) continue;\n // Slot-set MAC verification per priv that recovered a candidate CEK.\n const hmacKey = hkdfSha256({\n ikm: cek,\n salt: EMPTY_SALT,\n info: CARDANO_POE_HKDF_INFO_SLOTS_MAC,\n length: 32,\n });\n const slotsMacCalc = hmac(sha256, hmacKey, slotsCbor);\n // The outer cross-priv loop short-circuits on the first priv whose\n // recovered CEK also passes slots_mac. This intentionally leaks \"which\n // priv matched\" → \"how many key rotations the recipient has performed\".\n // We accept it: trial-decrypt runs client-side, so this timing is only\n // locally observable, and the leak is a weak ordering signal, not a\n // key/plaintext oracle. Making the outer loop constant-work would cost a\n // FULL KEM decapsulation (an X25519 ECDH, or — for the hybrid branch — a\n // full X-Wing ML-KEM-768 + X25519 decapsulation) for EVERY archived priv\n // on EVERY record, which for the hybrid case is the dominant cost; the\n // benefit (hiding a count the user already knows) does not justify it.\n // The inner per-slot loop IS held constant-work (constant-time-N).\n if (compareCt(slotsMacCalc, envelope.slots_mac)) {\n matchedCek = cek;\n break;\n }\n anyCandidateRecovered = true;\n }\n if (matchedCek === null) {\n return {\n matched: false,\n reason: anyCandidateRecovered ? 'TAMPERED_HEADER' : 'WRONG_RECIPIENT_KEY',\n };\n }\n }\n\n // Content AEAD AAD is `nonce || slots_mac`.\n const adContent = concat(envelope.nonce, envelope.slots_mac);\n try {\n const plaintext = xchacha20Poly1305Decrypt({\n key: matchedCek,\n nonce: envelope.nonce,\n aad: adContent,\n ciphertext,\n });\n return { matched: true, plaintext };\n } catch (e) {\n if (!(e instanceof AeadVerificationError)) throw e;\n return { matched: false, reason: 'TAMPERED_CIPHERTEXT' };\n }\n}\n\n// Trial-decrypt half of the sealed-PoE unwrap algorithm:\n// recovers the CEK + slot index without touching the content AEAD. Used by an\n// inbox-scan agent where the on-chain `metadata_cbor` envelope is available but\n// the off-chain ciphertext blob is fetched lazily only when the user invokes\n// Decrypt.\n//\n// Mirrors the multi-priv branch of `eciesSealedPoeUnwrap`: same\n// partitioning-oracle pre-checks, same per-priv inner loop, same\n// constant-time-N invariant (default `true` — MANDATORY for untrusted scan\n// agents), same `compareCt` slots_mac check. Differs only\n// in the return shape: `{kind: 'match', slotIdx, cek}` instead of plaintext;\n// `{kind: 'aead_pass_no_mac_match'}`\n// instead of `TAMPERED_HEADER`; `{kind: 'no_aead_pass'}` instead of\n// `WRONG_RECIPIENT_KEY`. Cross-priv variable-time short-circuit is preserved\n// (leaks \"which priv matched\" → \"how many rotations\",\n// a documented weak ordering signal).\nexport function eciesSealedPoeTrialDecrypt(args: TrialDecryptOnlyArgs): TrialDecryptOnlyResult {\n const { envelope } = args;\n const constantTimeN = args.constantTimeN ?? true;\n\n // Bundle form selects the per-KEM list from `envelope.kem`; flat form is\n // already KEM-pre-selected. An empty bundle list for this KEM is a clean\n // no_aead_pass (the recipient holds no key of the matching kind), whereas an\n // empty flat list stays a programmer error (its callers / step-3 tests rely\n // on the throw).\n const hasBundle = 'recipientKeyBundle' in args;\n const recipientSecretKeys: ReadonlyArray<Uint8Array> = hasBundle\n ? selectBundleSecrets(envelope, args.recipientKeyBundle)\n : args.recipientSecretKeys;\n\n if (recipientSecretKeys.length === 0) {\n if (hasBundle) {\n return { kind: 'no_aead_pass' };\n }\n throw new EciesSealedPoeError(\n 'INVALID_RECIPIENT_KEY',\n 'recipientSecretKeys MUST be a non-empty array, got length=0',\n );\n }\n assertEnvelopeStructure(envelope, recipientSecretKeys, undefined);\n\n const slotsCbor = slotsMacCborBytes(envelope);\n\n let anyCandidateRecovered = false;\n for (let k = 0; k < recipientSecretKeys.length; k++) {\n if (args._privsAttemptedOut !== undefined) {\n args._privsAttemptedOut.count = k + 1;\n }\n if (args._slotsAttemptedOut !== undefined) {\n args._slotsAttemptedOut.count = 0;\n }\n const candidate = tryRecipientUnwrapWithIdx(\n envelope,\n recipientSecretKeys[k]!,\n constantTimeN,\n args._slotsAttemptedOut,\n );\n if (args._slotsAttemptedOut?.perPrivCounts !== undefined) {\n args._slotsAttemptedOut.perPrivCounts.push(args._slotsAttemptedOut.count);\n }\n if (candidate === null) continue;\n const hmacKey = hkdfSha256({\n ikm: candidate.cek,\n salt: EMPTY_SALT,\n info: CARDANO_POE_HKDF_INFO_SLOTS_MAC,\n length: 32,\n });\n const slotsMacCalc = hmac(sha256, hmacKey, slotsCbor);\n if (compareCt(slotsMacCalc, envelope.slots_mac)) {\n return { kind: 'match', slotIdx: candidate.slotIdx, cek: candidate.cek };\n }\n anyCandidateRecovered = true;\n }\n return anyCandidateRecovered ? { kind: 'aead_pass_no_mac_match' } : { kind: 'no_aead_pass' };\n}\n","// The single seam that turns a structurally-validated but permissive on-wire\n// `enc` block into the discriminated `SealedEnvelope` the unwrap / trial-decrypt\n// path consumes.\n//\n// Every read-path consumer (inbox trial-decrypt, inbox CEK recovery, the CLI\n// `inbox sync` / `inbox decrypt` orchestrators, the standalone recipient\n// verifier) used to do this inline with a HARDCODED `kem: 'x25519'` and an\n// unconditional `slots.map(s => ({ epk: s.epk, wrap: s.wrap }))`. With the\n// discriminated-union slot shape (classical `{epk, wrap}` vs hybrid\n// `{kem_ct, wrap}`) that inline build is both wrong (drops `kem_ct`) and\n// uncompilable (reads optional `epk` as required). This helper is the ONE place\n// the conversion lives: it dispatches on `enc.kem`, picks the matching per-slot\n// fields, and returns `null` for anything that is not a recognised sealed\n// envelope (passphrase-only blocks, missing slots, unknown KEM). Callers then\n// pass the whole returned envelope plus their `RecipientKeyBundle` straight to\n// `eciesSealedPoeUnwrap` / `eciesSealedPoeTrialDecrypt` — they never rebuild\n// slots or reassemble `kem_ct` themselves.\n//\n// crypto-core is a leaf package and must not depend on poe-standard's Zod\n// schema, so the input is a structural shape mirroring the fields the parsed\n// `EncryptionEnvelope` exposes. Anything narrower (per-slot length checks) is\n// re-asserted by `assertEnvelopeStructure` inside the unwrap path; this helper\n// is purely the KEM-driven shape projection.\n\nimport type { Mlkem768X25519Slot, SealedEnvelope, X25519Slot } from './wrap';\n\n// Structural mirror of the parsed-but-permissive on-wire slot. Each field is\n// `T | undefined` (not just optional) so the parsed `EncryptionEnvelope` from a\n// consumer compiled with `exactOptionalPropertyTypes` is assignable without a\n// cast: the schema layer cannot know the envelope `kem` from a slot in\n// isolation, so it leaves all three fields optional (see poe-standard\n// SlotSchema).\nexport interface ParsedSlotShape {\n readonly epk?: Uint8Array | undefined;\n readonly kem_ct?: ReadonlyArray<Uint8Array> | undefined;\n readonly wrap?: Uint8Array | undefined;\n}\n\n// Structural mirror of the parsed-but-permissive `enc` block.\nexport interface ParsedEnvelopeShape {\n readonly scheme?: unknown;\n readonly aead?: string | undefined;\n readonly kem?: string | undefined;\n readonly nonce?: Uint8Array | undefined;\n readonly slots?: ReadonlyArray<ParsedSlotShape> | undefined;\n readonly slots_mac?: Uint8Array | undefined;\n}\n\n// Build the discriminated `SealedEnvelope` from a parsed `enc` block, or return\n// `null` when the block is not a sealed-recipient envelope we can trial-decrypt\n// (passphrase-only, missing slots/nonce/slots_mac, unrecognised KEM, or a slot\n// missing the KEM's required field). Returning `null` keeps every consumer's\n// \"this item is not for the recipient path → no match, no crypto\" branch.\nexport function sealedEnvelopeFromParsed(enc: ParsedEnvelopeShape): SealedEnvelope | null {\n if (enc.scheme !== 1 || enc.aead !== 'xchacha20-poly1305') return null;\n if (enc.nonce === undefined || enc.slots_mac === undefined) return null;\n const slots = enc.slots;\n if (slots === undefined || slots.length < 1) return null;\n\n if (enc.kem === 'x25519') {\n const x25519Slots: X25519Slot[] = [];\n for (const s of slots) {\n if (s.epk === undefined || s.wrap === undefined) return null;\n x25519Slots.push({ epk: s.epk, wrap: s.wrap });\n }\n return {\n scheme: 1,\n aead: 'xchacha20-poly1305',\n kem: 'x25519',\n nonce: enc.nonce,\n slots: x25519Slots,\n slots_mac: enc.slots_mac,\n };\n }\n\n if (enc.kem === 'mlkem768x25519') {\n const hybridSlots: Mlkem768X25519Slot[] = [];\n for (const s of slots) {\n if (s.kem_ct === undefined || s.wrap === undefined) return null;\n hybridSlots.push({ kem_ct: s.kem_ct, wrap: s.wrap });\n }\n return {\n scheme: 1,\n aead: 'xchacha20-poly1305',\n kem: 'mlkem768x25519',\n nonce: enc.nonce,\n slots: hybridSlots,\n slots_mac: enc.slots_mac,\n };\n }\n\n return null;\n}\n"]}
1
+ {"version":3,"sources":["../src/aead/errors.ts","../src/aead/chacha20-poly1305.ts","../src/kem/mlkem768x25519.ts","../src/kem/x25519.ts","../src/kdf/hkdf.ts","../src/sealed-poe/errors.ts","../src/sealed-poe/stream.ts","../src/cbor/canonical.ts","../src/sealed-poe/transcript.ts","../src/sealed-poe/wrap.ts","../src/util/compare-ct.ts","../src/sealed-poe/slot-acceptance.ts","../src/sealed-poe/unwrap.ts","../src/kdf/argon2id.ts","../src/unicode/nfkc16-data.ts","../src/unicode/nfkc16.ts","../src/sealed-poe/passphrase-normalize.ts","../src/sealed-poe/passphrase.ts","../src/sealed-poe/envelope-from-parsed.ts"],"names":["sha256","NONCE_LENGTH","CEK_LENGTH","ZERO_NONCE_12","X25519_SECRET_KEY_LENGTH","X25519_PUBLIC_KEY_LENGTH","WRAP_LENGTH","SLOTS_MAC_LENGTH","randomBytes"],"mappings":"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,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA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CA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EA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","file":"sealed-poe.js","sourcesContent":["export class AeadVerificationError extends Error {\n readonly code: string = 'aead_verification_failed';\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'AeadVerificationError';\n }\n}\n","import { chacha20poly1305 } from '@noble/ciphers/chacha.js';\n\nimport { AeadVerificationError } from './errors';\n\nexport interface ChaCha20Poly1305EncryptOpts {\n readonly key: Uint8Array;\n readonly nonce: Uint8Array;\n readonly aad: Uint8Array;\n readonly plaintext: Uint8Array;\n}\n\nexport interface ChaCha20Poly1305DecryptOpts {\n readonly key: Uint8Array;\n readonly nonce: Uint8Array;\n readonly aad: Uint8Array;\n readonly ciphertext: Uint8Array;\n}\n\nexport function chacha20Poly1305Encrypt(opts: ChaCha20Poly1305EncryptOpts): Uint8Array {\n return chacha20poly1305(opts.key, opts.nonce, opts.aad).encrypt(opts.plaintext);\n}\n\nexport function chacha20Poly1305Decrypt(opts: ChaCha20Poly1305DecryptOpts): Uint8Array {\n try {\n return chacha20poly1305(opts.key, opts.nonce, opts.aad).decrypt(opts.ciphertext);\n } catch (cause) {\n throw new AeadVerificationError('chacha20-poly1305 decrypt failed', { cause });\n }\n}\n","import { XWing } from '@noble/post-quantum/hybrid.js';\n\n// X-Wing (ML-KEM-768 + X25519) hybrid KEM per draft-connolly-cfrg-xwing-kem-10.\n// `XWing` is @noble/post-quantum's alias for `ml_kem768_x25519`. We expose it\n// through opts-object wrappers that pin the wire lengths and map noble's field\n// names onto the project's vocabulary.\n//\n// Unlike the bare X25519 KEM, there is no contributory-behaviour rejection to\n// translate: X-Wing combines the ML-KEM and X25519 shared secrets through a\n// SHA3-256 combiner that also binds the X25519 ephemeral and recipient public\n// keys, and ML-KEM's implicit rejection already yields a constant-work\n// pseudorandom secret on a malformed ciphertext. Decapsulation therefore never\n// throws on attacker-supplied wire data — a wrong shared secret is the correct,\n// indistinguishable failure mode, and callers MUST treat it as a non-match\n// rather than expecting an exception.\n\nexport const MLKEM768X25519_PUBLIC_KEY_LENGTH = 1216 as const;\nexport const MLKEM768X25519_ENC_LENGTH = 1120 as const;\nexport const MLKEM768X25519_SHARED_SECRET_LENGTH = 32 as const;\nexport const MLKEM768X25519_SEED_LENGTH = 32 as const;\nexport const MLKEM768X25519_ESEED_LENGTH = 64 as const;\n\nexport interface Mlkem768X25519KeyPair {\n // The 32-byte root seed IS the secret key: the ML-KEM coins and the X25519\n // scalar are re-expanded from it via SHAKE-256 at decapsulation. (Later X-Wing\n // drafts also define an optional expanded decapsulation-key form; we keep the\n // seed-only key, which the draft-10 Appendix C vectors still pin.)\n readonly secretSeed: Uint8Array;\n readonly publicKey: Uint8Array;\n}\n\nexport interface Mlkem768X25519EncapsulateOpts {\n readonly publicKey: Uint8Array;\n // Optional 64-byte encapsulation randomness (msgRand). When supplied the\n // ciphertext and shared secret are fully deterministic; a 32-byte value is\n // rejected by noble, so we pin the length here too.\n readonly eseed?: Uint8Array;\n}\n\nexport interface Mlkem768X25519Encapsulation {\n readonly enc: Uint8Array;\n readonly ss: Uint8Array;\n}\n\nexport interface Mlkem768X25519DecapsulateOpts {\n readonly secretSeed: Uint8Array;\n readonly enc: Uint8Array;\n}\n\nexport function mlkem768x25519Keygen(seed: Uint8Array): Mlkem768X25519KeyPair {\n if (seed.length !== MLKEM768X25519_SEED_LENGTH) {\n throw new Error(\n `mlkem768x25519 seed must be ${MLKEM768X25519_SEED_LENGTH} bytes, got ${seed.length}`,\n );\n }\n const { secretKey, publicKey } = XWing.keygen(seed);\n return { secretSeed: secretKey, publicKey };\n}\n\nexport function mlkem768x25519Encapsulate(\n opts: Mlkem768X25519EncapsulateOpts,\n): Mlkem768X25519Encapsulation {\n if (opts.publicKey.length !== MLKEM768X25519_PUBLIC_KEY_LENGTH) {\n throw new Error(\n `mlkem768x25519 public key must be ${MLKEM768X25519_PUBLIC_KEY_LENGTH} bytes, got ${opts.publicKey.length}`,\n );\n }\n if (opts.eseed !== undefined && opts.eseed.length !== MLKEM768X25519_ESEED_LENGTH) {\n throw new Error(\n `mlkem768x25519 eseed must be ${MLKEM768X25519_ESEED_LENGTH} bytes, got ${opts.eseed.length}`,\n );\n }\n const { cipherText, sharedSecret } = XWing.encapsulate(opts.publicKey, opts.eseed);\n return { enc: cipherText, ss: sharedSecret };\n}\n\nexport function mlkem768x25519Decapsulate(opts: Mlkem768X25519DecapsulateOpts): Uint8Array {\n // Pre-check both lengths before calling noble: decapsulation must perform a\n // constant amount of work for any caller-supplied ciphertext (implicit\n // rejection), which requires the inputs to be the exact expected sizes.\n if (opts.secretSeed.length !== MLKEM768X25519_SEED_LENGTH) {\n throw new Error(\n `mlkem768x25519 secret seed must be ${MLKEM768X25519_SEED_LENGTH} bytes, got ${opts.secretSeed.length}`,\n );\n }\n if (opts.enc.length !== MLKEM768X25519_ENC_LENGTH) {\n throw new Error(\n `mlkem768x25519 enc must be ${MLKEM768X25519_ENC_LENGTH} bytes, got ${opts.enc.length}`,\n );\n }\n // noble's signature is decapsulate(cipherText, secretKey) — ciphertext first.\n return XWing.decapsulate(opts.enc, opts.secretSeed);\n}\n","import { x25519 } from '@noble/curves/ed25519.js';\n\n// RFC 7748 §6.1 contributory-behaviour rejection: a small-order (low-order)\n// Montgomery `u` coordinate makes the X25519 shared secret all-zero, which\n// @noble/curves refuses with `Error: invalid private or public key received`.\n// We rethrow that as a *typed* error so callers can distinguish a structurally\n// valid-but-malicious peer public key (a property of attacker-supplied wire\n// data — trial-decrypt MUST treat the slot as a non-match, not crash) from\n// genuine caller misuse such as a wrong-length key (which @noble raises as a\n// RangeError and which we deliberately let propagate untouched).\nexport class X25519LowOrderPointError extends Error {\n readonly code = 'X25519_LOW_ORDER_POINT' as const;\n constructor(options?: { cause?: unknown }) {\n super('x25519 ECDH rejected: peer public key is a small-order point', options);\n this.name = 'X25519LowOrderPointError';\n }\n}\n\n// @noble/curves v2 signals a small-order/all-zero shared secret with this exact\n// message. Matching on it (rather than the broad Error class) keeps unrelated\n// failures — e.g. a future internal assertion — surfacing as themselves.\nconst NOBLE_LOW_ORDER_MESSAGE = 'invalid private or public key received';\n\nexport interface X25519KeyPair {\n readonly secretKey: Uint8Array;\n readonly publicKey: Uint8Array;\n}\n\nexport interface X25519PublicKeyOpts {\n readonly secretKey: Uint8Array;\n}\n\nexport interface X25519EcdhOpts {\n readonly secretKey: Uint8Array;\n readonly theirPublicKey: Uint8Array;\n}\n\nexport function x25519Keygen(): X25519KeyPair {\n return x25519.keygen();\n}\n\nexport function x25519PublicKey(opts: X25519PublicKeyOpts): Uint8Array {\n return x25519.getPublicKey(opts.secretKey);\n}\n\nexport function x25519Ecdh(opts: X25519EcdhOpts): Uint8Array {\n try {\n return x25519.getSharedSecret(opts.secretKey, opts.theirPublicKey);\n } catch (e) {\n // Translate ONLY the contributory-check rejection into our typed error.\n // A wrong-length key throws a RangeError from @noble's length assertion;\n // that is caller misuse, not malicious wire data, so it must propagate.\n if (e instanceof Error && e.message === NOBLE_LOW_ORDER_MESSAGE) {\n throw new X25519LowOrderPointError({ cause: e });\n }\n throw e;\n }\n}\n","import { hkdf } from '@noble/hashes/hkdf.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nexport interface HkdfSha256Opts {\n readonly ikm: Uint8Array;\n readonly salt: Uint8Array;\n readonly info: Uint8Array;\n readonly length: number;\n}\n\nexport function hkdfSha256(opts: HkdfSha256Opts): Uint8Array {\n return hkdf(sha256, opts.ikm, opts.salt, opts.info, opts.length);\n}\n","// Sealed-PoE construction error taxonomy (wire-shape + partitioning-oracle\n// pre-checks + caller-input validation).\n//\n// Codes whose concept exists in the wire error-code registry reuse the registry\n// string verbatim (UNSUPPORTED_ENVELOPE_SCHEME, UNSUPPORTED_AEAD_ALG,\n// ENC_PASSPHRASE_EMPTY, ...), so a consumer correlating construction failures\n// with validator/verifier reports sees one vocabulary. Conditions that exist\n// only at the construction API boundary (raw caller-input lengths, deterministic\n// test-override mismatches) carry construction-local names with no wire\n// counterpart.\n\nexport type EciesSealedPoeErrorCode =\n // Wire-registry codes (same concept, same string).\n | 'ENC_SLOTS_EMPTY'\n | 'ENC_SLOTS_MAC_INVALID_LENGTH'\n | 'ENC_SLOTS_DUPLICATE_KEM_MATERIAL'\n | 'ENC_SLOTS_TOO_MANY'\n | 'ENC_ENVELOPE_TOO_LARGE'\n | 'ENC_REQUIRES_CONTENT_HASH'\n | 'ENC_PASSPHRASE_EMPTY'\n | 'ENC_PASSPHRASE_UNNORMALIZABLE'\n | 'ENC_PASSPHRASE_ALG_UNSUPPORTED'\n | 'ENC_PASSPHRASE_SALT_TOO_SHORT'\n | 'ENC_PASSPHRASE_SALT_TOO_LONG'\n | 'ENC_PASSPHRASE_ARGON2_PARAMS_TOO_LOW'\n | 'KEM_EPK_LENGTH_MISMATCH'\n | 'KEM_CT_LENGTH_MISMATCH'\n | 'NONCE_LENGTH_MISMATCH'\n | 'WRAP_LENGTH_MISMATCH'\n | 'UNSUPPORTED_ENVELOPE_SCHEME'\n | 'UNSUPPORTED_AEAD_ALG'\n | 'UNSUPPORTED_KEM_ALG'\n | 'KDF_DERIVATION_FAILED'\n // Construction-local codes (no wire counterpart).\n | 'INVALID_CEK_LENGTH'\n | 'INVALID_EPHEMERAL_SECRET_LENGTH'\n | 'EPHEMERAL_SECRETS_COUNT_MISMATCH'\n | 'INVALID_RECIPIENT_KEY'\n | 'INVALID_PASSPHRASE_PARAMS'\n | 'PASSPHRASE_INPUT_TOO_LONG';\n\nexport class EciesSealedPoeError extends Error {\n readonly code: EciesSealedPoeErrorCode;\n\n constructor(code: EciesSealedPoeErrorCode, message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'EciesSealedPoeError';\n this.code = code;\n }\n}\n","// chacha20-poly1305-stream64k: the segmented STREAM content format for sealed\n// PoE (the age v1 STREAM layout).\n//\n// cipher : ChaCha20-Poly1305 (RFC 8439; 12-byte nonce, 16-byte tag)\n// chunk size : 65536 plaintext bytes per non-final chunk\n// chunk nonce : uint88_be(counter) || final_flag — counter starts at 0,\n// +1 per chunk; final_flag is 0x01 on the final chunk,\n// 0x00 otherwise\n// per-chunk AAD : empty (all context binds transitively through the\n// payload_key, whose CEK is committed by slots_mac or the\n// passphrase commitment header)\n// final chunk : 0..65536 plaintext bytes; zero-length only when the whole\n// plaintext is empty (an empty plaintext is exactly one\n// zero-length final chunk — a lone 16-byte tag)\n//\n// The counter nonces are safe because the payload_key is single-use (a fresh\n// CEK salted by the envelope-unique enc.nonce), so no two streams ever share a\n// (key, nonce) pair. The final flag domain-separates the last chunk, which is\n// what makes truncation detectable.\n//\n// Layout violations — a tag failure, a truncated stream, data after the final\n// chunk, a non-final chunk shorter than CHUNK_SIZE, a zero-length final chunk\n// on a non-empty stream — all surface as StreamTamperedError; the caller maps\n// it to the single generic decryption failure. Each chunk's tag is verified\n// before that chunk's plaintext is released, but the whole-plaintext hash\n// recheck is post-hoc: incremental consumers MUST treat released bytes as\n// tentative until it passes.\n\nimport { chacha20Poly1305Decrypt, chacha20Poly1305Encrypt } from '../aead/chacha20-poly1305';\nimport { AeadVerificationError } from '../aead/errors';\n\n// Pinned format constants. The 88-bit counter admits at most 2^88 chunks, far\n// above any realisable payload, so the format imposes no cryptographic payload\n// ceiling — the practical maximum is a deployment denial-of-service policy, not\n// a wire constant.\nexport const CHUNK_SIZE = 65536;\nexport const TAG_SIZE = 16;\n\nconst NONCE_LENGTH = 12;\nconst COUNTER_LENGTH = 11;\nconst SEALED_CHUNK_SIZE = CHUNK_SIZE + TAG_SIZE;\nconst PAYLOAD_KEY_LENGTH = 32;\nconst EMPTY_AAD: Uint8Array = new Uint8Array(0);\n\n// Authenticated-decryption failure of the stream: a chunk tag did not verify or\n// the chunk layout violates the format rules. Callers surface it as the single\n// generic decryption failure (the TAMPERED_CIPHERTEXT outcome).\nexport class StreamTamperedError extends Error {\n readonly code = 'TAMPERED_CIPHERTEXT' as const;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'StreamTamperedError';\n }\n}\n\n// Shared chunk-nonce state machine: an 11-byte big-endian counter followed by\n// the final-flag byte. The counter increments once per chunk; using a chunk\n// machine after its final chunk is a caller error, never silently accepted.\nclass ChunkNonce {\n private readonly nonce = new Uint8Array(NONCE_LENGTH);\n private finished = false;\n\n next(final: boolean): Uint8Array {\n if (this.finished) {\n throw new Error('STREAM: no chunks may follow the final chunk');\n }\n if (final) {\n this.finished = true;\n this.nonce[COUNTER_LENGTH] = 0x01;\n }\n const out = this.nonce.slice();\n this.increment();\n return out;\n }\n\n get done(): boolean {\n return this.finished;\n }\n\n private increment(): void {\n for (let i = COUNTER_LENGTH - 1; i >= 0; i--) {\n const v = ((this.nonce[i] as number) + 1) & 0xff;\n this.nonce[i] = v;\n if (v !== 0) return;\n }\n // 2^88 chunks exhausted — unreachable for any realisable payload.\n throw new Error('STREAM: chunk counter overflow');\n }\n}\n\nfunction assertPayloadKey(payloadKey: Uint8Array): void {\n if (payloadKey.length !== PAYLOAD_KEY_LENGTH) {\n throw new Error(\n `STREAM: payloadKey MUST be exactly ${PAYLOAD_KEY_LENGTH} bytes, got ${payloadKey.length}`,\n );\n }\n}\n\n// Incremental sealer. Feed plaintext chunk by chunk: every non-final chunk MUST\n// be exactly CHUNK_SIZE bytes; the final chunk carries 0..CHUNK_SIZE bytes, and\n// a zero-length final chunk is admissible only as the sole chunk of an empty\n// plaintext.\nexport class StreamSealer {\n private readonly payloadKey: Uint8Array;\n private readonly nonce = new ChunkNonce();\n private chunkIndex = 0;\n\n constructor(payloadKey: Uint8Array) {\n assertPayloadKey(payloadKey);\n this.payloadKey = payloadKey;\n }\n\n sealChunk(plaintext: Uint8Array, final: boolean): Uint8Array {\n if (!final && plaintext.length !== CHUNK_SIZE) {\n throw new Error(\n `STREAM: non-final chunk MUST carry exactly ${CHUNK_SIZE} plaintext bytes, got ${plaintext.length}`,\n );\n }\n if (final && plaintext.length > CHUNK_SIZE) {\n throw new Error(\n `STREAM: final chunk MUST carry at most ${CHUNK_SIZE} plaintext bytes, got ${plaintext.length}`,\n );\n }\n if (final && plaintext.length === 0 && this.chunkIndex > 0) {\n throw new Error(\n 'STREAM: a zero-length final chunk is admissible only for an empty plaintext',\n );\n }\n const sealed = chacha20Poly1305Encrypt({\n key: this.payloadKey,\n nonce: this.nonce.next(final),\n aad: EMPTY_AAD,\n plaintext,\n });\n this.chunkIndex += 1;\n return sealed;\n }\n}\n\n// Incremental opener. Feed sealed chunks in order with the expected final flag;\n// each chunk's plaintext is released only after its tag verifies (and is still\n// tentative until the caller's whole-plaintext hash recheck passes). Chunk\n// boundaries are the caller's responsibility in incremental use; `streamOpen`\n// derives them from the blob length.\nexport class StreamOpener {\n private readonly payloadKey: Uint8Array;\n private readonly nonce = new ChunkNonce();\n private chunkIndex = 0;\n\n constructor(payloadKey: Uint8Array) {\n assertPayloadKey(payloadKey);\n this.payloadKey = payloadKey;\n }\n\n openChunk(sealedChunk: Uint8Array, final: boolean): Uint8Array {\n if (sealedChunk.length < TAG_SIZE) {\n throw new StreamTamperedError(\n `STREAM: sealed chunk shorter than the ${TAG_SIZE}-byte tag floor`,\n );\n }\n if (!final && sealedChunk.length !== SEALED_CHUNK_SIZE) {\n throw new StreamTamperedError(\n `STREAM: non-final sealed chunk MUST be exactly ${SEALED_CHUNK_SIZE} bytes, got ${sealedChunk.length}`,\n );\n }\n if (final && sealedChunk.length > SEALED_CHUNK_SIZE) {\n throw new StreamTamperedError(\n `STREAM: final sealed chunk MUST be at most ${SEALED_CHUNK_SIZE} bytes, got ${sealedChunk.length}`,\n );\n }\n if (final && sealedChunk.length === TAG_SIZE && this.chunkIndex > 0) {\n throw new StreamTamperedError('STREAM: zero-length final chunk on a non-empty stream');\n }\n let plaintext: Uint8Array;\n try {\n plaintext = chacha20Poly1305Decrypt({\n key: this.payloadKey,\n nonce: this.nonce.next(final),\n aad: EMPTY_AAD,\n ciphertext: sealedChunk,\n });\n } catch (e) {\n if (!(e instanceof AeadVerificationError)) throw e;\n throw new StreamTamperedError(`STREAM: chunk ${this.chunkIndex} tag verification failed`, {\n cause: e,\n });\n }\n this.chunkIndex += 1;\n return plaintext;\n }\n}\n\n// Whole-buffer seal: split the plaintext into CHUNK_SIZE chunks (an empty\n// plaintext is exactly one zero-length final chunk) and concatenate the sealed\n// chunks.\nexport function streamSeal(args: { payloadKey: Uint8Array; plaintext: Uint8Array }): Uint8Array {\n const { plaintext } = args;\n const sealer = new StreamSealer(args.payloadKey);\n const chunkCount = Math.max(1, Math.ceil(plaintext.length / CHUNK_SIZE));\n const out = new Uint8Array(plaintext.length + chunkCount * TAG_SIZE);\n let offset = 0;\n for (let i = 0; i < chunkCount; i++) {\n const final = i === chunkCount - 1;\n const chunk = plaintext.subarray(\n i * CHUNK_SIZE,\n Math.min((i + 1) * CHUNK_SIZE, plaintext.length),\n );\n const sealed = sealer.sealChunk(chunk, final);\n out.set(sealed, offset);\n offset += sealed.length;\n }\n return out;\n}\n\n// Whole-buffer open. The chunk boundaries are fully determined by the blob\n// length: every non-final sealed chunk is exactly SEALED_CHUNK_SIZE bytes and\n// the final sealed chunk is whatever remains (TAG_SIZE..SEALED_CHUNK_SIZE). A\n// blob below the 16-byte floor, a tail that cannot form a well-formed final\n// chunk, or a zero-length final chunk on a non-empty stream is malformed before\n// any tag is checked. Truncation that removes the final chunk leaves a stream\n// whose last chunk was sealed with the 0x00 flag but is opened with the 0x01\n// flag nonce, so its tag fails — the final-flag byte is the truncation\n// detector.\nexport function streamOpen(args: { payloadKey: Uint8Array; ciphertext: Uint8Array }): Uint8Array {\n const { ciphertext } = args;\n const total = ciphertext.length;\n if (total < TAG_SIZE) {\n throw new StreamTamperedError(\n `STREAM: ciphertext shorter than the ${TAG_SIZE}-byte single-tag floor`,\n );\n }\n const rem = total % SEALED_CHUNK_SIZE;\n let nonFinalCount: number;\n let finalSealedLength: number;\n if (rem === 0) {\n nonFinalCount = total / SEALED_CHUNK_SIZE - 1;\n finalSealedLength = SEALED_CHUNK_SIZE;\n } else if (rem >= TAG_SIZE) {\n nonFinalCount = (total - rem) / SEALED_CHUNK_SIZE;\n finalSealedLength = rem;\n } else {\n throw new StreamTamperedError('STREAM: trailing bytes cannot form a well-formed final chunk');\n }\n if (nonFinalCount > 0 && finalSealedLength === TAG_SIZE) {\n throw new StreamTamperedError('STREAM: zero-length final chunk on a non-empty stream');\n }\n\n const opener = new StreamOpener(args.payloadKey);\n const out = new Uint8Array(nonFinalCount * CHUNK_SIZE + finalSealedLength - TAG_SIZE);\n let readOffset = 0;\n let writeOffset = 0;\n for (let i = 0; i < nonFinalCount; i++) {\n const plaintext = opener.openChunk(\n ciphertext.subarray(readOffset, readOffset + SEALED_CHUNK_SIZE),\n false,\n );\n out.set(plaintext, writeOffset);\n readOffset += SEALED_CHUNK_SIZE;\n writeOffset += CHUNK_SIZE;\n }\n const finalPlaintext = opener.openChunk(ciphertext.subarray(readOffset), true);\n out.set(finalPlaintext, writeOffset);\n return out;\n}\n","import { cdeDecodeOptions, decode, encode } from 'cbor2';\nimport { sortCoreDeterministic } from 'cbor2/sorts';\n\nimport { CanonicalCborError } from './errors';\n\nexport type CanonicalCborValue =\n | null\n | boolean\n | number\n | bigint\n | string\n | Uint8Array\n | readonly CanonicalCborValue[]\n | { readonly [key: string]: CanonicalCborValue }\n | ReadonlyMap<string | number, CanonicalCborValue>;\n\nexport function encodeCanonicalCbor(value: CanonicalCborValue): Uint8Array {\n return encode(value, {\n cde: true,\n collapseBigInts: true,\n rejectDuplicateKeys: true,\n sortKeys: sortCoreDeterministic,\n });\n}\n\nexport function decodeCanonicalCbor(bytes: Uint8Array): unknown {\n try {\n return decode(bytes, {\n ...cdeDecodeOptions,\n rejectStreaming: true,\n rejectDuplicateKeys: true,\n // A Label 309 record carries integers, byte/text strings, arrays, maps and\n // `null` — and nothing else. Without these rejections the major-type-7\n // surface leaks into the decoder: a float16/32/64 that happens to hold an\n // integral value (e.g. 1.0) silently decodes to the integer 1 and passes\n // a `z.literal(1)` / Number.isInteger schema check, so two byte strings\n // that are NOT byte-identical canonicalise to the same record. That\n // breaks the cross-implementation parity invariant (the Python twin\n // already rejects non-integer `v` / `enc.scheme` outright). Reject the\n // whole non-record surface — floats, negative zero, undefined, and\n // non-{true,false,null} simple values — so any such input surfaces as\n // MALFORMED_CBOR via mapDecodeError rather than decoding to a look-alike.\n rejectFloats: true,\n rejectNegativeZero: true,\n rejectUndefined: true,\n rejectSimple: true,\n });\n } catch (cause) {\n throw mapDecodeError(cause);\n }\n}\n\nfunction mapDecodeError(cause: unknown): CanonicalCborError {\n const message = cause instanceof Error ? cause.message : String(cause);\n const lower = message.toLowerCase();\n // Every canonical-decode violation collapses to the single public taxonomy\n // code MALFORMED_CBOR: indefinite-length (streaming) items, duplicate keys,\n // non-canonical (unsorted) key ordering, non-minimal integer encodings, and\n // invalid UTF-8 in text strings. cbor2 raises the SAME \"Duplicate or out of\n // order key\" message for both true duplicates AND distinct-but-unsorted keys,\n // so the two are indistinguishable by message — and per the Label 309 taxonomy\n // both belong under MALFORMED_CBOR anyway. The specific cause survives in the\n // human-readable message below; for indefinite-length we state it explicitly\n // so the diagnostic is not lost when the code is collapsed.\n const isIndefinite = lower.includes('streaming') || lower.includes('indefinite');\n const detail = isIndefinite\n ? `indefinite-length items are not permitted in canonical CBOR: ${message}`\n : message;\n return new CanonicalCborError('MALFORMED_CBOR', `cbor decode failed: ${detail}`, { cause });\n}\n","// Shared, byte-critical pieces of the sealed-PoE construction that the producer\n// (wrap / passphrase seal) and every verifier (unwrap, trial-decrypt,\n// passphrase open) MUST compute byte-for-byte identically:\n//\n// 1. The item-hashes digest `hashes_hash`.\n// 2. The slots transcript, its SHA-256 `slots_hash`, and the CEK-keyed\n// `slots_mac`.\n// 3. The passphrase transcript, its SHA-256 `pw_hash`, and the CEK-keyed\n// in-ciphertext `commitment`.\n// 4. The content `payload_key` derivations (both key paths).\n// 5. Both per-slot KEK HKDF salts (classical and hybrid).\n//\n// Keeping these in one module is the interop guarantee: a single divergence in\n// the canonical encoding silently yields a `slots_mac`, a commitment, or an\n// AEAD tag that another implementation cannot reproduce, with no typed error to\n// localise the fault. There is exactly one shared implementation, imported by\n// both sides.\n\nimport { hmac } from '@noble/hashes/hmac.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { encodeCanonicalCbor, type CanonicalCborValue } from '../cbor/canonical';\nimport { hkdfSha256 } from '../kdf/hkdf';\n\nimport { EciesSealedPoeError } from './errors';\nimport type { Mlkem768X25519Slot, SealedKem, X25519Slot } from './wrap';\n\n// Internal domain-separation labels. Each is exact ASCII with no terminator and\n// no length prefix; each is a fixed constant of the scheme, never serialised on\n// the wire and never registry-selectable. The byte-length invariants below keep\n// the SCREAMING_SNAKE constants in sync with the ASCII literals every conformant\n// verifier hashes against.\n\n// SHA-256 prefix for the item-hashes digest `hashes_hash`.\nexport const CARDANO_POE_ITEM_HASHES_PREFIX: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-item-hashes-v1',\n);\n// SHA-256 prefix for the slots-transcript hash `slots_hash`.\nexport const CARDANO_POE_SLOTS_TRANSCRIPT_PREFIX: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-slots-transcript-v1',\n);\n// SHA-256 prefix for the passphrase-transcript hash `pw_hash`.\nexport const CARDANO_POE_PASSPHRASE_TRANSCRIPT_PREFIX: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-passphrase-transcript-v1',\n);\n// HKDF info for the slot-set MAC key.\nexport const CARDANO_POE_HKDF_INFO_SLOTS_MAC: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-slots-mac-v1',\n);\n// HKDF info for the passphrase commitment MAC key.\nexport const CARDANO_POE_HKDF_INFO_PASSPHRASE_MAC: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-passphrase-mac-v1',\n);\n// HKDF info for the slots-path content `payload_key`.\nexport const CARDANO_POE_HKDF_INFO_PAYLOAD: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-payload-v1',\n);\n// HKDF info for the passphrase-path content `payload_key`.\nexport const CARDANO_POE_HKDF_INFO_PAYLOAD_PASSPHRASE: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-payload-passphrase-v1',\n);\n// SHA-256 prefix for the classical (x25519) per-slot KEK HKDF salt.\nexport const CARDANO_POE_X25519_KEK_SALT_PREFIX: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-x25519-kek-salt-v1',\n);\n// SHA-256 prefix for the hybrid (X-Wing) per-slot KEK HKDF salt.\nexport const CARDANO_POE_XWING_KEK_SALT_PREFIX: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-xwing-kek-salt-v1',\n);\n\nif (CARDANO_POE_ITEM_HASHES_PREFIX.length !== 26) {\n throw new Error('CARDANO_POE_ITEM_HASHES_PREFIX byte-length invariant violated (expected 26)');\n}\nif (CARDANO_POE_SLOTS_TRANSCRIPT_PREFIX.length !== 31) {\n throw new Error(\n 'CARDANO_POE_SLOTS_TRANSCRIPT_PREFIX byte-length invariant violated (expected 31)',\n );\n}\nif (CARDANO_POE_PASSPHRASE_TRANSCRIPT_PREFIX.length !== 36) {\n throw new Error(\n 'CARDANO_POE_PASSPHRASE_TRANSCRIPT_PREFIX byte-length invariant violated (expected 36)',\n );\n}\nif (CARDANO_POE_HKDF_INFO_SLOTS_MAC.length !== 24) {\n throw new Error('CARDANO_POE_HKDF_INFO_SLOTS_MAC byte-length invariant violated (expected 24)');\n}\nif (CARDANO_POE_HKDF_INFO_PASSPHRASE_MAC.length !== 29) {\n throw new Error(\n 'CARDANO_POE_HKDF_INFO_PASSPHRASE_MAC byte-length invariant violated (expected 29)',\n );\n}\nif (CARDANO_POE_HKDF_INFO_PAYLOAD.length !== 22) {\n throw new Error('CARDANO_POE_HKDF_INFO_PAYLOAD byte-length invariant violated (expected 22)');\n}\nif (CARDANO_POE_HKDF_INFO_PAYLOAD_PASSPHRASE.length !== 33) {\n throw new Error(\n 'CARDANO_POE_HKDF_INFO_PAYLOAD_PASSPHRASE byte-length invariant violated (expected 33)',\n );\n}\nif (CARDANO_POE_X25519_KEK_SALT_PREFIX.length !== 30) {\n throw new Error(\n 'CARDANO_POE_X25519_KEK_SALT_PREFIX byte-length invariant violated (expected 30)',\n );\n}\nif (CARDANO_POE_XWING_KEK_SALT_PREFIX.length !== 29) {\n throw new Error('CARDANO_POE_XWING_KEK_SALT_PREFIX byte-length invariant violated (expected 29)');\n}\n\n// Scheme-fixed constant pinning the passphrase normalization profile the CEK was\n// derived under. Fed into the passphrase transcript; never serialised on the\n// wire.\nexport const CARDANO_POE_PW_NORM_PROFILE = 'cardano-poe-pw-norm-v1' as const;\n\n// Verifier-side resource bounds a public parser MUST enforce BEFORE invoking any\n// KEM/AEAD primitive, so a malformed envelope cannot drive unbounded work. Both\n// are deployment-pinned reference constants (not wire fields); deployments MAY\n// tighten them. They sit far above the ~16 KiB Cardano transaction-metadata\n// ceiling that bounds honest records, so a conformant record never trips them.\n//\n// • MAX_SLOTS — the maximum slot count; an envelope with more slots is\n// rejected outright.\n// • MAX_DECODED_ENVELOPE_BYTES — a backstop on the decoded envelope's\n// aggregate byte size (nonce + slots_mac + every per-slot wire field),\n// bounding the work even before the slot-count cap would.\nexport const MAX_SLOTS = 1024;\nexport const MAX_DECODED_ENVELOPE_BYTES = 65536;\n\nconst EMPTY_SALT: Uint8Array = new Uint8Array(0);\n\n// The item's plaintext-hash claim: registered algorithm identifier → digest\n// bytes, exactly as carried in the record body. Both key paths bind this map\n// (via `hashes_hash`) into their commitment, so an envelope spliced onto an\n// item with a different hash claim is rejected before any ciphertext work.\nexport type ItemHashes = Readonly<Record<string, Uint8Array>>;\n\nfunction labelledSha256(prefix: Uint8Array, ...parts: ReadonlyArray<Uint8Array>): Uint8Array {\n let total = prefix.length;\n for (const p of parts) total += p.length;\n const message = new Uint8Array(total);\n message.set(prefix, 0);\n let offset = prefix.length;\n for (const p of parts) {\n message.set(p, offset);\n offset += p.length;\n }\n return sha256(message);\n}\n\n// SHA-256(\"cardano-poe-item-hashes-v1\" || canonicalEncode(item.hashes)).\n// The hashes map is encoded exactly as it appears in the record body\n// (registry-identifier keys → digest byte strings, canonical key order). An\n// `enc`-bearing item MUST declare at least one content hash — the ciphertext is\n// bound to the plaintext only through that digest — so an empty map is rejected\n// here, on both the producer and the verifier side.\nexport function itemHashesHash(hashes: ItemHashes): Uint8Array {\n if (Object.keys(hashes).length === 0) {\n throw new EciesSealedPoeError(\n 'ENC_REQUIRES_CONTENT_HASH',\n 'hashes MUST carry at least one content-hash entry',\n );\n }\n return labelledSha256(CARDANO_POE_ITEM_HASHES_PREFIX, encodeCanonicalCbor(hashes));\n}\n\n// SHA-256(\"cardano-poe-slots-transcript-v1\" || canonicalEncode(SLOTS_TRANSCRIPT)).\n// SLOTS_TRANSCRIPT is the closed seven-key map binding the cross-KEM header\n// fields (scheme, path, aead, kem, nonce) and the item's hash claim\n// (hashes_hash) to the on-wire slot set, so a relay that flips any header field\n// — or splices the envelope onto a different item — yields a different\n// `slots_hash` and the MAC fails. Computed ONCE per envelope and held constant\n// across the recipient trial-decrypt loop. The map keys are a SET — their wire\n// order is fixed by the canonical-encode sort, never hand-arranged here.\nexport function computeSlotsHash(args: {\n aead: string;\n kem: SealedKem;\n nonce: Uint8Array;\n slots: ReadonlyArray<X25519Slot | Mlkem768X25519Slot>;\n hashesHash: Uint8Array;\n}): Uint8Array {\n // The slot array is re-stated as explicit closed two-key maps (never the raw\n // caller objects), so an extra property on a caller's slot value can never\n // leak into the committed bytes.\n const slots: CanonicalCborValue =\n args.kem === 'x25519'\n ? (args.slots as ReadonlyArray<X25519Slot>).map((s) => ({ epk: s.epk, wrap: s.wrap }))\n : (args.slots as ReadonlyArray<Mlkem768X25519Slot>).map((s) => ({\n kem_ct: s.kem_ct,\n wrap: s.wrap,\n }));\n const transcript: CanonicalCborValue = {\n scheme: 1,\n path: 'slots',\n aead: args.aead,\n kem: args.kem,\n nonce: args.nonce,\n slots,\n hashes_hash: args.hashesHash,\n };\n return labelledSha256(CARDANO_POE_SLOTS_TRANSCRIPT_PREFIX, encodeCanonicalCbor(transcript));\n}\n\n// SHA-256(\"cardano-poe-passphrase-transcript-v1\" || canonicalEncode(PASSPHRASE_TRANSCRIPT)).\n// PASSPHRASE_TRANSCRIPT is the closed six-key map (with `passphrase` itself a\n// closed sub-map) binding the header fields, the Argon2id parameters, the\n// normalization profile, and the item's hash claim into the in-ciphertext\n// commitment. There is NO `kem` key on this path. The `normalization` value is\n// the scheme-fixed profile constant, pinned into the transcript and never\n// serialised on the wire.\nexport function computePassphraseHash(args: {\n aead: string;\n nonce: Uint8Array;\n hashesHash: Uint8Array;\n salt: Uint8Array;\n params: { m: number; t: number; p: number };\n}): Uint8Array {\n const transcript: CanonicalCborValue = {\n scheme: 1,\n path: 'passphrase',\n aead: args.aead,\n nonce: args.nonce,\n hashes_hash: args.hashesHash,\n passphrase: {\n alg: 'argon2id',\n salt: args.salt,\n params: { m: args.params.m, t: args.params.t, p: args.params.p },\n normalization: CARDANO_POE_PW_NORM_PROFILE,\n },\n };\n return labelledSha256(CARDANO_POE_PASSPHRASE_TRANSCRIPT_PREFIX, encodeCanonicalCbor(transcript));\n}\n\n// Slot-set MAC: HMAC-SHA-256 keyed by an HKDF leaf of the CEK over the 32-byte\n// `slots_hash`. Pre-hashing the transcript only changes the HMAC message from\n// the full transcript to its SHA-256, leaving the CEK-keyed commitment intact.\n// The fixed 32-byte HKDF key structurally excludes the HMAC over-block-length\n// key ambiguity.\nexport function computeSlotsMac(args: { cek: Uint8Array; slotsHash: Uint8Array }): Uint8Array {\n const macKey = hkdfSha256({\n ikm: args.cek,\n salt: EMPTY_SALT,\n info: CARDANO_POE_HKDF_INFO_SLOTS_MAC,\n length: 32,\n });\n return hmac(sha256, macKey, args.slotsHash);\n}\n\n// Passphrase-path key commitment: HMAC-SHA-256 keyed by an HKDF leaf of the CEK\n// over the 32-byte `pw_hash`. Prepended inside the ciphertext blob (never an\n// on-chain field), so testing a passphrase guess requires possession of the\n// blob itself.\nexport function computePassphraseCommitment(args: {\n cek: Uint8Array;\n pwHash: Uint8Array;\n}): Uint8Array {\n const macKey = hkdfSha256({\n ikm: args.cek,\n salt: EMPTY_SALT,\n info: CARDANO_POE_HKDF_INFO_PASSPHRASE_MAC,\n length: 32,\n });\n return hmac(sha256, macKey, args.pwHash);\n}\n\n// Slots-path content key: HKDF-SHA-256(ikm=CEK, salt=enc.nonce, info=payload-v1).\n// The content is encrypted under this leaf of the CEK, never under the CEK\n// directly, so the wrap layer and the content layer never key the same primitive\n// on the same bytes. The envelope-unique nonce salt makes the key single-use,\n// which is what keeps the STREAM counter nonces collision-free.\nexport function slotsPayloadKey(args: { cek: Uint8Array; nonce: Uint8Array }): Uint8Array {\n return hkdfSha256({\n ikm: args.cek,\n salt: args.nonce,\n info: CARDANO_POE_HKDF_INFO_PAYLOAD,\n length: 32,\n });\n}\n\n// Passphrase-path content key: HKDF-SHA-256(ikm=CEK, salt=enc.nonce,\n// info=payload-passphrase-v1).\nexport function passphrasePayloadKey(args: { cek: Uint8Array; nonce: Uint8Array }): Uint8Array {\n return hkdfSha256({\n ikm: args.cek,\n salt: args.nonce,\n info: CARDANO_POE_HKDF_INFO_PAYLOAD_PASSPHRASE,\n length: 32,\n });\n}\n\n// Classical (x25519) per-slot KEK salt:\n// SHA-256(\"cardano-poe-x25519-kek-salt-v1\" || enc.nonce || epk || pub_R).\n// The slot's own ephemeral anchors the KEK to a slot-unique value, `pub_R`\n// binds it to the specific recipient (defeating confused-deputy relay of the\n// ephemeral against a different recipient), and the envelope-unique `enc.nonce`\n// anchors it to one envelope — a CSPRNG failure that repeats KEM randomness\n// across records degrades to mere linkability instead of reproducing a\n// (KEK, zero-nonce) wrap pair.\nexport function x25519KekSalt(args: {\n nonce: Uint8Array;\n epk: Uint8Array;\n pubR: Uint8Array;\n}): Uint8Array {\n return labelledSha256(CARDANO_POE_X25519_KEK_SALT_PREFIX, args.nonce, args.epk, args.pubR);\n}\n\n// Hybrid (mlkem768x25519) per-slot KEK salt:\n// SHA-256(\"cardano-poe-xwing-kek-salt-v1\" || enc.nonce || kem_ct || pub_R).\n// `kem_ct` is the slot's 1120-byte X-Wing ciphertext exactly as carried on the\n// wire and `pub_R` the 1216-byte X-Wing recipient public key — the same three\n// bindings as the classical salt, computed outside the KEM over the slot's own\n// wire bytes so it holds X-Wing as a black box.\nexport function xwingKekSalt(args: {\n nonce: Uint8Array;\n kemCt: Uint8Array;\n pubR: Uint8Array;\n}): Uint8Array {\n return labelledSha256(CARDANO_POE_XWING_KEK_SALT_PREFIX, args.nonce, args.kemCt, args.pubR);\n}\n","// Multi-recipient sealed-PoE wrap (age-style KEM-then-wrap slots + segmented\n// STREAM content). Wire-field names are fixed by the standard: scheme, aead,\n// kem, nonce, slots, slots_mac.\n//\n// Two KEM branches share one envelope shape, discriminated on the envelope-level\n// `kem` field:\n//\n// • kem: 'x25519' — classical age-style ECIES. Per-slot epk(32) + wrap(48).\n// • kem: 'mlkem768x25519' — X-Wing hybrid (ML-KEM-768 + X25519). Per-slot the\n// 1120-byte X-Wing ciphertext as a single byte\n// string (`kem_ct`) + wrap(48). No per-slot epk.\n//\n// The slot type is a discriminated union so every consumer is forced — at compile\n// time — to branch on the KEM before touching kem-specific fields.\n\nimport { randomBytes } from '@noble/ciphers/utils.js';\n\nimport { chacha20Poly1305Encrypt } from '../aead/chacha20-poly1305';\nimport {\n mlkem768x25519Encapsulate,\n MLKEM768X25519_ENC_LENGTH,\n MLKEM768X25519_ESEED_LENGTH,\n MLKEM768X25519_PUBLIC_KEY_LENGTH,\n} from '../kem/mlkem768x25519';\nimport { x25519Ecdh, x25519PublicKey } from '../kem/x25519';\nimport { hkdfSha256 } from '../kdf/hkdf';\n\nimport { EciesSealedPoeError } from './errors';\nimport { streamSeal } from './stream';\nimport {\n computeSlotsHash,\n computeSlotsMac,\n itemHashesHash,\n slotsPayloadKey,\n x25519KekSalt,\n xwingKekSalt,\n type ItemHashes,\n} from './transcript';\n\n// The envelope-level KEM discriminator.\nexport type SealedKem = 'x25519' | 'mlkem768x25519';\n\n// The sole registered content format under enc.scheme 1: ChaCha20-Poly1305 in\n// the 64 KiB segmented STREAM layout. Producers MUST emit this identifier\n// byte-exact.\nexport const SEALED_POE_AEAD = 'chacha20-poly1305-stream64k' as const;\n\n// HKDF info strings — fixed protocol labels for KEK derivation. Each doubles as\n// the per-slot wrap AEAD AAD (never empty AAD). Byte-length invariants enforce\n// that the SCREAMING_SNAKE constants stay in sync with the ASCII literals every\n// conformant verifier hashes against.\nexport const CARDANO_POE_HKDF_INFO_KEK: Uint8Array = new TextEncoder().encode('cardano-poe-kek-v1');\n// Hybrid (X-Wing) per-slot KEK label. Distinct from the classical label so a\n// KEK derived under one KEM can never collide with the other.\nexport const CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519: Uint8Array = new TextEncoder().encode(\n 'cardano-poe-kek-mlkem768x25519-v1',\n);\n\nconst ZERO_NONCE_12: Uint8Array = new Uint8Array(12);\nconst X25519_PUBLIC_KEY_LENGTH = 32 as const;\nconst X25519_SECRET_KEY_LENGTH = 32 as const;\nconst CEK_LENGTH = 32 as const;\nconst NONCE_LENGTH = 24 as const;\nconst WRAP_LENGTH = 48 as const;\nconst SLOTS_MAC_LENGTH = 32 as const;\n\nif (CARDANO_POE_HKDF_INFO_KEK.length !== 18) {\n throw new Error('CARDANO_POE_HKDF_INFO_KEK byte-length invariant violated (expected 18)');\n}\nif (CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519.length !== 33) {\n throw new Error(\n 'CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519 byte-length invariant violated (expected 33)',\n );\n}\nif (ZERO_NONCE_12.length !== 12) {\n throw new Error('ZERO_NONCE_12 byte-length invariant violated (expected 12)');\n}\n\n// Classical per-slot wire shape: { epk: bstr(32), wrap: bstr(48) }.\nexport interface X25519Slot {\n readonly epk: Uint8Array;\n readonly wrap: Uint8Array;\n}\n\n// Hybrid per-slot wire shape: { kem_ct: bstr(1120), wrap: bstr(48) }. `kem_ct`\n// is the X-Wing ciphertext as a single byte string. There is NO per-slot epk\n// (the X25519 ephemeral is the trailing 32 bytes of kem_ct) and NO per-slot kem\n// field — the KEM identifier is hoisted to envelope scope (every slot shares it).\nexport interface Mlkem768X25519Slot {\n readonly kem_ct: Uint8Array;\n readonly wrap: Uint8Array;\n}\n\n// Sealed envelope wire shape (discriminated on `kem`).\nexport type SealedEnvelope =\n | {\n readonly scheme: 1;\n readonly aead: typeof SEALED_POE_AEAD;\n readonly kem: 'x25519';\n readonly nonce: Uint8Array;\n readonly slots: ReadonlyArray<X25519Slot>;\n readonly slots_mac: Uint8Array;\n }\n | {\n readonly scheme: 1;\n readonly aead: typeof SEALED_POE_AEAD;\n readonly kem: 'mlkem768x25519';\n readonly nonce: Uint8Array;\n readonly slots: ReadonlyArray<Mlkem768X25519Slot>;\n readonly slots_mac: Uint8Array;\n };\n\nexport interface SealedPoeOutput {\n readonly envelope: SealedEnvelope;\n readonly ciphertext: Uint8Array;\n}\n\nexport interface WrapArgs {\n readonly plaintext: Uint8Array;\n // The item's plaintext-hash claim (registered algorithm id → digest bytes).\n // Its labelled digest is bound into the slots transcript, so the on-chain\n // slots_mac match also confirms the envelope belongs to this hash claim.\n readonly hashes: ItemHashes;\n readonly recipientPublicKeys: ReadonlyArray<Uint8Array>;\n // KEM branch selector. Defaults to 'x25519' for the classical path. The\n // recipient public-key length is validated against the chosen KEM.\n readonly kem?: SealedKem;\n readonly cek?: Uint8Array;\n readonly nonce?: Uint8Array;\n // Deterministic X25519 ephemeral scalars — x25519 branch only.\n readonly ephemeralSecrets?: ReadonlyArray<Uint8Array>;\n // Deterministic X-Wing encapsulation randomness (64 bytes each) — hybrid\n // branch only. One per recipient, parallel to recipientPublicKeys.\n readonly eseeds?: ReadonlyArray<Uint8Array>;\n readonly skipShuffle?: boolean;\n}\n\n// Anonymity invariant: wire ordering MUST NOT encode \"primary\n// recipient first\". A CSPRNG-keyed Fisher-Yates shuffle uniformly permutes the\n// slot array so trial-decrypt order leaks no recipient identity. The\n// slot-set HMAC is computed AFTER this shuffle, binding the on-wire order.\n//\n// Draw an unbiased index in [0, m) from a CSPRNG uint32 via rejection sampling.\n// A plain `u32 % m` skews toward the low residues whenever `m` does not divide\n// 2^32 evenly: the values [0, 2^32 mod m) each occur one extra time. This\n// function exists purely to produce a UNIFORM permutation, so the bias — though\n// cryptographically negligible — is exactly the property we cannot tolerate.\n// We reject any draw landing in the final partial block [limit, 2^32) and\n// redraw, leaving only the residues that map uniformly onto [0, m).\n// Exported so the rejection-bound arithmetic can be asserted directly in tests\n// without relying on a flaky statistical-distribution check.\nexport function uniformIndexBelow(m: number): number {\n // 2^32 mod m, computed without overflowing the 32-bit space.\n const limit = 0x1_0000_0000 - (0x1_0000_0000 % m);\n const buf = new Uint32Array(1);\n let x: number;\n do {\n crypto.getRandomValues(buf);\n x = buf[0] as number;\n } while (x >= limit);\n return x % m;\n}\n\nfunction csprngShuffle<T>(arr: T[]): void {\n for (let i = arr.length - 1; i > 0; i--) {\n const j = uniformIndexBelow(i + 1);\n const tmp = arr[i] as T;\n arr[i] = arr[j] as T;\n arr[j] = tmp;\n }\n}\n\n// Wrap the CEK for one classical recipient: age-style ECIES stanza with the\n// labelled-hash KEK salt binding nonce, epk, and pub_R.\nfunction wrapSlotX25519(args: {\n pubR: Uint8Array;\n privEph: Uint8Array | undefined;\n cek: Uint8Array;\n nonce: Uint8Array;\n slotIdx: number;\n}): X25519Slot {\n const privEph = args.privEph ?? randomBytes(X25519_SECRET_KEY_LENGTH);\n if (privEph.length !== X25519_SECRET_KEY_LENGTH) {\n throw new EciesSealedPoeError(\n 'INVALID_EPHEMERAL_SECRET_LENGTH',\n `ephemeralSecrets[${args.slotIdx}] MUST be exactly ${X25519_SECRET_KEY_LENGTH} bytes, got ${privEph.length}`,\n );\n }\n const epk = x25519PublicKey({ secretKey: privEph });\n const shared = x25519Ecdh({ secretKey: privEph, theirPublicKey: args.pubR });\n const kek = hkdfSha256({\n ikm: shared,\n salt: x25519KekSalt({ nonce: args.nonce, epk, pubR: args.pubR }),\n info: CARDANO_POE_HKDF_INFO_KEK,\n length: 32,\n });\n // Per-slot wrap AAD MUST be the 18-byte ASCII literal of the KEK info\n // string (never empty AAD).\n const wrap = chacha20Poly1305Encrypt({\n key: kek,\n nonce: ZERO_NONCE_12,\n aad: CARDANO_POE_HKDF_INFO_KEK,\n plaintext: args.cek,\n });\n if (wrap.length !== WRAP_LENGTH) {\n throw new Error(`internal: wrap.length=${wrap.length}, expected ${WRAP_LENGTH}`);\n }\n return { epk, wrap };\n}\n\n// Wrap the CEK for one hybrid recipient: X-Wing encapsulation → HKDF → AEAD.\n// The KEK info label doubles as the wrap AEAD AAD, mirroring the classical path.\nfunction wrapSlotMlkem768X25519(args: {\n pubR: Uint8Array;\n eseed: Uint8Array | undefined;\n cek: Uint8Array;\n nonce: Uint8Array;\n}): Mlkem768X25519Slot {\n const { enc, ss } = mlkem768x25519Encapsulate({\n publicKey: args.pubR,\n ...(args.eseed !== undefined ? { eseed: args.eseed } : {}),\n });\n if (enc.length !== MLKEM768X25519_ENC_LENGTH) {\n throw new Error(`internal: enc.length=${enc.length}, expected ${MLKEM768X25519_ENC_LENGTH}`);\n }\n // The hybrid KEK salt binds the envelope nonce, the slot's own X-Wing\n // ciphertext, and the recipient public key, mirroring the classical salt: the\n // ciphertext anchors the KEK to a slot-unique value and `pub_R` binds it to\n // the specific recipient. It is computed outside the KEM, over the slot's wire\n // bytes, so it holds X-Wing as a black-box KEM.\n const kek = hkdfSha256({\n ikm: ss,\n salt: xwingKekSalt({ nonce: args.nonce, kemCt: enc, pubR: args.pubR }),\n info: CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519,\n length: 32,\n });\n const wrap = chacha20Poly1305Encrypt({\n key: kek,\n nonce: ZERO_NONCE_12,\n aad: CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519,\n plaintext: args.cek,\n });\n if (wrap.length !== WRAP_LENGTH) {\n throw new Error(`internal: wrap.length=${wrap.length}, expected ${WRAP_LENGTH}`);\n }\n return { kem_ct: enc, wrap };\n}\n\nexport function eciesSealedPoeWrap(args: WrapArgs): SealedPoeOutput {\n const { plaintext, recipientPublicKeys } = args;\n const kem: SealedKem = args.kem ?? 'x25519';\n const n = recipientPublicKeys.length;\n\n // The hash-claim digest is computed before any KEM/AEAD work: an item without\n // a content hash cannot be sealed (the ciphertext is bound to the plaintext\n // only through that digest).\n const hashesHash = itemHashesHash(args.hashes);\n\n // There is no fixed upper bound on slot count; the producer SDK polices the\n // per-record byte budget. Only the lower bound is enforced here.\n if (n < 1) {\n throw new EciesSealedPoeError(\n 'ENC_SLOTS_EMPTY',\n `recipientPublicKeys.length=${n} must be >= 1`,\n );\n }\n\n const expectedPubLen =\n kem === 'x25519' ? X25519_PUBLIC_KEY_LENGTH : MLKEM768X25519_PUBLIC_KEY_LENGTH;\n for (let i = 0; i < n; i++) {\n const pub = recipientPublicKeys[i];\n if (pub === undefined || pub.length !== expectedPubLen) {\n throw new EciesSealedPoeError(\n 'KEM_EPK_LENGTH_MISMATCH',\n `recipientPublicKeys[${i}] MUST be exactly ${expectedPubLen} bytes for kem='${kem}'`,\n );\n }\n }\n\n if (kem === 'x25519') {\n if (args.eseeds !== undefined) {\n throw new EciesSealedPoeError(\n 'EPHEMERAL_SECRETS_COUNT_MISMATCH',\n \"eseeds is an X-Wing (mlkem768x25519) override and MUST NOT be supplied for kem='x25519'\",\n );\n }\n if (args.ephemeralSecrets !== undefined && args.ephemeralSecrets.length !== n) {\n throw new EciesSealedPoeError(\n 'EPHEMERAL_SECRETS_COUNT_MISMATCH',\n `ephemeralSecrets.length=${args.ephemeralSecrets.length} must match recipientPublicKeys.length=${n}`,\n );\n }\n } else {\n if (args.ephemeralSecrets !== undefined) {\n throw new EciesSealedPoeError(\n 'EPHEMERAL_SECRETS_COUNT_MISMATCH',\n \"ephemeralSecrets is an X25519 override and MUST NOT be supplied for kem='mlkem768x25519'\",\n );\n }\n if (args.eseeds !== undefined) {\n if (args.eseeds.length !== n) {\n throw new EciesSealedPoeError(\n 'EPHEMERAL_SECRETS_COUNT_MISMATCH',\n `eseeds.length=${args.eseeds.length} must match recipientPublicKeys.length=${n}`,\n );\n }\n for (let i = 0; i < n; i++) {\n const eseed = args.eseeds[i]!;\n if (eseed.length !== MLKEM768X25519_ESEED_LENGTH) {\n throw new EciesSealedPoeError(\n 'INVALID_EPHEMERAL_SECRET_LENGTH',\n `eseeds[${i}] MUST be exactly ${MLKEM768X25519_ESEED_LENGTH} bytes, got ${eseed.length}`,\n );\n }\n }\n }\n }\n\n const cek = args.cek ?? randomBytes(CEK_LENGTH);\n const nonce = args.nonce ?? randomBytes(NONCE_LENGTH);\n if (cek.length !== CEK_LENGTH) {\n throw new EciesSealedPoeError(\n 'INVALID_CEK_LENGTH',\n `cek MUST be exactly ${CEK_LENGTH} bytes, got ${cek.length}`,\n );\n }\n if (nonce.length !== NONCE_LENGTH) {\n throw new EciesSealedPoeError(\n 'NONCE_LENGTH_MISMATCH',\n `nonce MUST be exactly ${NONCE_LENGTH} bytes, got ${nonce.length}`,\n );\n }\n\n let envelope: SealedEnvelope;\n if (kem === 'x25519') {\n const slots: X25519Slot[] = [];\n for (let i = 0; i < n; i++) {\n slots.push(\n wrapSlotX25519({\n pubR: recipientPublicKeys[i]!,\n privEph: args.ephemeralSecrets ? (args.ephemeralSecrets[i] as Uint8Array) : undefined,\n cek,\n nonce,\n slotIdx: i,\n }),\n );\n }\n // Anonymity invariant (see csprngShuffle comment). The transcript is built\n // AFTER the shuffle so the MAC binds the on-wire slot order.\n if (args.skipShuffle !== true) {\n csprngShuffle(slots);\n }\n const slotsHash = computeSlotsHash({\n aead: SEALED_POE_AEAD,\n kem: 'x25519',\n nonce,\n slots,\n hashesHash,\n });\n envelope = {\n scheme: 1,\n aead: SEALED_POE_AEAD,\n kem: 'x25519',\n nonce,\n slots,\n slots_mac: sizedSlotsMac(cek, slotsHash),\n };\n } else {\n const slots: Mlkem768X25519Slot[] = [];\n for (let i = 0; i < n; i++) {\n slots.push(\n wrapSlotMlkem768X25519({\n pubR: recipientPublicKeys[i]!,\n eseed: args.eseeds ? (args.eseeds[i] as Uint8Array) : undefined,\n cek,\n nonce,\n }),\n );\n }\n if (args.skipShuffle !== true) {\n csprngShuffle(slots);\n }\n const slotsHash = computeSlotsHash({\n aead: SEALED_POE_AEAD,\n kem: 'mlkem768x25519',\n nonce,\n slots,\n hashesHash,\n });\n envelope = {\n scheme: 1,\n aead: SEALED_POE_AEAD,\n kem: 'mlkem768x25519',\n nonce,\n slots,\n slots_mac: sizedSlotsMac(cek, slotsHash),\n };\n }\n\n // Content is encrypted under a derived `payload_key` (a separate HKDF leaf of\n // the CEK salted by the envelope-unique nonce), never under the CEK directly,\n // in the segmented STREAM format. There is no content AAD: the content binds\n // to the header transitively — payload_key derives from the CEK, and the CEK\n // is committed to the full header (including hashes_hash) by slots_mac.\n const ciphertext = streamSeal({\n payloadKey: slotsPayloadKey({ cek, nonce }),\n plaintext,\n });\n\n return { envelope, ciphertext };\n}\n\nfunction sizedSlotsMac(cek: Uint8Array, slotsHash: Uint8Array): Uint8Array {\n const slotsMac = computeSlotsMac({ cek, slotsHash });\n if (slotsMac.length !== SLOTS_MAC_LENGTH) {\n throw new Error(`internal: slots_mac.length=${slotsMac.length}, expected ${SLOTS_MAC_LENGTH}`);\n }\n return slotsMac;\n}\n","// Isomorphic constant-time byte-equality. crypto-core is browser-safe by\n// design, so we cannot import `node:crypto.timingSafeEqual` — webpack rejects\n// the `node:` scheme in the browser bundle. A pure-JS XOR loop is constant-time\n// for equal-length inputs; length mismatch is a deliberate early-return (the\n// API surface itself leaks length, same as node's timingSafeEqual which throws).\nexport function compareCt(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n // Lengths are equal and `i` stays in-bounds, so both indexes are always\n // defined — no nullish guard is needed (and one would read as a guard for\n // an impossible case).\n for (let i = 0; i < a.length; i++) diff |= (a[i] as number) ^ (b[i] as number);\n return diff === 0;\n}\n","// Per-slot acceptance accumulator for the trial-decrypt loop.\n//\n// A slot is \"mine\" only when its KEM validity bit, its wrap-open, AND its\n// slot-set MAC check all hold (the folded per-slot `ok` bit). The accumulator\n// selects the FIRST accepted slot's CEK, keeps scanning every remaining slot\n// (the loop never breaks early within one private key's pass), and raises the\n// conflict bit when a later accepted slot recovers a CEK that differs from the\n// selected one — the multi-key commitment collision the construction fails\n// closed on. Slots that wrap-open under an attacker-chosen CEK but fail the\n// MAC are simply not accepted: they neither select a CEK nor raise a conflict,\n// so an honest slot later in the array still wins.\n//\n// The fold is branchless mask-based selection — no control flow keyed on which\n// slot matched:\n//\n// first = ok AND NOT found\n// cek_conflict = cek_conflict OR (ok AND found AND NOT ctEq(cand, selected))\n// selected_CEK = select(first, cand, selected) (byte masks 0x00/0xFF)\n// selected_idx = select(first, idx, selected_idx) (word masks 0/-1)\n// found = found OR ok\n//\n// Every update runs on every slot with the same operations; the state is a\n// fixed-size buffer plus 0|1 bits, never a data-dependent assignment guarded\n// by `if`. JavaScript offers no hardware constant-time guarantee — a JIT may\n// reintroduce data-dependent paths — so this is the best-effort discipline,\n// not a timing proof.\n//\n// Two accepted slots recovering DIFFERENT CEKs requires a collision in the\n// CEK-keyed commitment, so the conflict bit is not reachable through any\n// envelope the public API can build; it is exercised directly on this\n// accumulator. This module is internal to the trial-decrypt implementation and\n// is not part of the package surface.\n\nconst CEK_LENGTH = 32;\n\n// Mutable accumulator state. `foundBit` / `conflictBit` are 0|1 integers;\n// `selectedCek` is a fixed 32-byte buffer (all-zero until a slot is accepted);\n// `selectedSlotIdx` keeps the -1 sentinel until the first acceptance.\nexport interface SlotAcceptanceState {\n foundBit: number;\n conflictBit: number;\n readonly selectedCek: Uint8Array;\n selectedSlotIdx: number;\n}\n\nexport function newSlotAcceptanceState(): SlotAcceptanceState {\n return {\n foundBit: 0,\n conflictBit: 0,\n selectedCek: new Uint8Array(CEK_LENGTH),\n selectedSlotIdx: -1,\n };\n}\n\n// Fold one slot's outcome into the state. `ok` MUST be the slot's\n// `kem_ok AND open_ok AND mac_ok` acceptance as a 0|1 integer; `candidateCek`\n// MUST be exactly 32 bytes (the recovered CEK, or the caller's fixed dummy\n// when the wrap-open failed, so every slot folds the same-shaped input).\nexport function foldSlotAcceptance(\n state: SlotAcceptanceState,\n ok: number,\n candidateCek: Uint8Array,\n slotIdx: number,\n): void {\n if (candidateCek.length !== CEK_LENGTH) {\n // Structural programmer-error guard on a public quantity (the wrap length\n // is wire-validated upstream); never reachable from envelope data.\n throw new Error(\n `candidate CEK MUST be exactly ${CEK_LENGTH} bytes, got ${candidateCek.length}`,\n );\n }\n const okBit = ok & 1;\n const firstBit = okBit & (state.foundBit ^ 1);\n const firstByteMask = -firstBit & 0xff; // 0x00 or 0xFF\n const firstWordMask = -firstBit | 0; // 0 or -1 (all-ones int32)\n\n // Constant-time inequality of candidate vs selected as a 0|1 bit. Computed\n // unconditionally on every slot; its conflict contribution is masked off\n // unless this slot AND an earlier slot were both accepted.\n let diff = 0;\n for (let i = 0; i < CEK_LENGTH; i++) {\n diff |= (candidateCek[i] as number) ^ (state.selectedCek[i] as number);\n }\n const neqBit = ((diff | -diff) >>> 31) & 1;\n\n state.conflictBit |= okBit & state.foundBit & neqBit;\n for (let i = 0; i < CEK_LENGTH; i++) {\n state.selectedCek[i] =\n ((candidateCek[i] as number) & firstByteMask) |\n ((state.selectedCek[i] as number) & ~firstByteMask & 0xff);\n }\n state.selectedSlotIdx = (slotIdx & firstWordMask) | (state.selectedSlotIdx & ~firstWordMask);\n state.foundBit |= okBit;\n}\n\n// The pass outcome in consumer shape, read once after the whole slot loop.\nexport interface SlotAcceptanceOutcome {\n readonly found: boolean;\n readonly cekConflict: boolean;\n // The first accepted slot's CEK (null when nothing was accepted).\n readonly selectedCek: Uint8Array | null;\n // The first accepted slot's index (-1 when nothing was accepted).\n readonly selectedSlotIdx: number;\n}\n\nexport function finishSlotAcceptance(state: SlotAcceptanceState): SlotAcceptanceOutcome {\n const found = state.foundBit === 1;\n return {\n found,\n cekConflict: state.conflictBit === 1,\n selectedCek: found ? state.selectedCek : null,\n selectedSlotIdx: state.selectedSlotIdx,\n };\n}\n","// Multi-recipient sealed-PoE unwrap (age-style trial-decrypt with the slot-set\n// MAC folded into per-slot acceptance + partitioning-oracle length pre-checks).\n//\n// Three key forms (mutually exclusive — exactly one MUST be supplied):\n//\n// • Single-priv form: `recipientSecretKey: Uint8Array` — the standalone-verifier\n// path. Runs the trial-decrypt loop over `envelope.slots` once.\n//\n// • Multi-priv form: `recipientSecretKeys: ReadonlyArray<Uint8Array>` — for the\n// trial-decrypt scan of a rotated identity holding `[currentPriv, ...archivedPrivs]`.\n// Caller supplies the order; the iterator runs outer-loop = privkey ×\n// inner-loop = slot, short-circuiting on the first priv that accepts a\n// slot. The recommended caller order is `[currentPriv,\n// ...previousPrivsReversed]` (newest archive first).\n//\n// • Bundle form: `recipientKeyBundle` — both KEMs' secret lists; the dispatch\n// picks the right one from `envelope.kem`.\n//\n// The inner per-slot loop is constant-time across slots: every slot of a key's\n// pass is entered regardless of match position, and every slot pays the same\n// KEM + HKDF + wrap-open + MAC work, so an observer cannot infer which slot\n// index matched. The outer loop short-circuits on the first cross-priv match —\n// that channel leaks only the weak \"which key matched\" ordering signal,\n// intrinsic to multi-key trial-decrypt.\n//\n// Per-slot acceptance folds three bits: `ok = kem_ok AND open_ok AND mac_ok`.\n// The MAC fold is load-bearing: a malicious sender can craft a slot that\n// wrap-opens under a recipient's key with an attacker-chosen CEK, but that CEK\n// does not reproduce `slots_mac`, so the forged slot is skipped exactly like a\n// non-matching one and an honest slot later in the array still wins.\n//\n// The per-slot recovery body differs by KEM, but both take the same work\n// shape — KEK derivation, then a wrap-open attempt on EVERY slot:\n// • x25519: X25519 ECDH → HKDF → AEAD-unwrap; a low-order epk\n// (RFC 7748 §6.1 contributory-check rejection) sets\n// kem_ok=false, derives a dummy KEK instead, and STILL\n// attempts the wrap-open under it, so an invalid-ECDH slot\n// pays the identical per-slot cost and can never be\n// accepted (the kem bit is folded into acceptance).\n// • mlkem768x25519: X-Wing decapsulate → HKDF → AEAD-unwrap; NEVER throws on\n// attacker wire data (ML-KEM implicit rejection yields a\n// pseudorandom shared secret), so no try/catch around it.\n\nimport { chacha20Poly1305Decrypt } from '../aead/chacha20-poly1305';\nimport { AeadVerificationError } from '../aead/errors';\nimport { hkdfSha256 } from '../kdf/hkdf';\nimport {\n mlkem768x25519Decapsulate,\n mlkem768x25519Keygen,\n MLKEM768X25519_ENC_LENGTH,\n} from '../kem/mlkem768x25519';\nimport { x25519Ecdh, X25519LowOrderPointError, x25519PublicKey } from '../kem/x25519';\nimport { compareCt } from '../util/compare-ct';\n\nimport { EciesSealedPoeError } from './errors';\nimport {\n finishSlotAcceptance,\n foldSlotAcceptance,\n newSlotAcceptanceState,\n} from './slot-acceptance';\nimport { streamOpen, StreamTamperedError } from './stream';\nimport {\n computeSlotsHash,\n computeSlotsMac,\n itemHashesHash,\n MAX_DECODED_ENVELOPE_BYTES,\n MAX_SLOTS,\n slotsPayloadKey,\n x25519KekSalt,\n xwingKekSalt,\n type ItemHashes,\n} from './transcript';\nimport {\n CARDANO_POE_HKDF_INFO_KEK,\n CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519,\n SEALED_POE_AEAD,\n type Mlkem768X25519Slot,\n type SealedEnvelope,\n type X25519Slot,\n} from './wrap';\n\n// Typed decryption outcomes — internal diagnostics for a trusted local caller.\n// An untrusted external caller MUST receive one indistinguishable generic\n// failure regardless of which of these fired.\nexport type UnwrapFailureReason = 'WRONG_RECIPIENT_KEY' | 'TAMPERED_HEADER' | 'TAMPERED_CIPHERTEXT';\n\nexport type UnwrapResult =\n | { readonly matched: true; readonly plaintext: Uint8Array }\n | { readonly matched: false; readonly reason: UnwrapFailureReason };\n\n// Unified recipient key bundle. Callers hold BOTH the X25519\n// private-key chain (current + archived, for classical and rotation history)\n// AND the X-Wing secret seed(s) (for the hybrid KEM), without knowing which a\n// given record was sealed under. They pass the whole bundle; the unwrap /\n// trial-decrypt dispatch selects the correct secret list from `envelope.kem`:\n//\n// • kem === 'x25519' → bundle.x25519PrivateKeys\n// • kem === 'mlkem768x25519' → bundle.mlkem768x25519SecretSeeds\n//\n// Both lists are ordered newest-first (caller's responsibility — the outer\n// trial-decrypt loop scans them in order). A list MAY be empty when the\n// recipient holds no key for that KEM (e.g. archived-only X25519 identities\n// predate the hybrid KEM, so their hybrid seed list is empty); a bundle whose\n// selected list is empty unwraps to a clean no-match without touching any KEM\n// primitive.\nexport interface RecipientKeyBundle {\n readonly x25519PrivateKeys: ReadonlyArray<Uint8Array>;\n readonly mlkem768x25519SecretSeeds: ReadonlyArray<Uint8Array>;\n}\n\n// Select the secret-key list a bundle contributes for the given envelope KEM.\n// The single dispatch seam — unwrap and trial-decrypt both route through here so\n// the per-KEM selection lives in exactly one place.\nfunction selectBundleSecrets(\n envelope: SealedEnvelope,\n bundle: RecipientKeyBundle,\n): ReadonlyArray<Uint8Array> {\n return envelope.kem === 'x25519' ? bundle.x25519PrivateKeys : bundle.mlkem768x25519SecretSeeds;\n}\n\ninterface UnwrapArgsCommon {\n readonly envelope: SealedEnvelope;\n readonly ciphertext: Uint8Array;\n // The item's plaintext-hash claim, as carried in the record body. Bound into\n // the slots transcript: an envelope spliced onto an item with a different\n // hashes map fails the per-slot MAC, before any content work.\n readonly hashes: ItemHashes;\n // Test-only instrumentation for the constant-time-across-slots invariant.\n // The unwrap fn bumps `count` once per inner-loop iteration entered. In the\n // multi-priv path, `count` is reset at the start of each outer iteration and\n // — when `perPrivCounts` is provided — the final per-priv inner count is\n // appended after that priv's inner loop completes. Production callers never\n // pass this.\n readonly _slotsAttemptedOut?: { count: number; perPrivCounts?: number[] };\n // Test-only multi-priv outer-loop iteration counter. Bumped to `k + 1` at\n // the start of each outer-loop iteration. Production callers never pass this.\n readonly _privsAttemptedOut?: { count: number };\n}\n\nexport interface UnwrapArgsSinglePriv extends UnwrapArgsCommon {\n readonly recipientSecretKey: Uint8Array;\n}\n\nexport interface UnwrapArgsMultiPriv extends UnwrapArgsCommon {\n readonly recipientSecretKeys: ReadonlyArray<Uint8Array>;\n}\n\n// Bundle form of the multi-priv path: the caller passes both KEMs' secret\n// lists and the dispatch picks the right one from `envelope.kem`. This is the\n// surface every read-path consumer (inbox decrypt, CLI decrypt, standalone\n// recipient verifier) should use — they hold the whole identity key bundle and\n// must NOT pre-select a list or rebuild slots themselves.\nexport interface UnwrapArgsBundle extends UnwrapArgsCommon {\n readonly recipientKeyBundle: RecipientKeyBundle;\n}\n\nexport type UnwrapArgs = UnwrapArgsSinglePriv | UnwrapArgsMultiPriv | UnwrapArgsBundle;\n\n// Trial-decrypt-only sibling of eciesSealedPoeUnwrap. Runs the per-slot\n// acceptance (KEM + wrap-open + slots_mac) but NEVER opens the content stream\n// (which requires the off-chain ciphertext blob, not available at trial-decrypt\n// time). Used by an inbox-scan agent to discover readable records before\n// fetching their ciphertext.\ninterface TrialDecryptOnlyArgsCommon {\n readonly envelope: SealedEnvelope;\n readonly hashes: ItemHashes;\n readonly _slotsAttemptedOut?: { count: number; perPrivCounts?: number[] };\n readonly _privsAttemptedOut?: { count: number };\n}\n\n// Exactly one of `recipientSecretKeys` (flat, KEM-pre-selected) or\n// `recipientKeyBundle` (whole bundle, KEM dispatched from `envelope.kem`).\n// Inbox-scan consumers pass the bundle; the low-level / parity tests pass the\n// flat list directly.\nexport type TrialDecryptOnlyArgs = TrialDecryptOnlyArgsCommon &\n (\n | { readonly recipientSecretKeys: ReadonlyArray<Uint8Array> }\n | { readonly recipientKeyBundle: RecipientKeyBundle }\n );\n\n// Binary by design: with the MAC folded into per-slot acceptance there is no\n// observable middle state — a slot either fully matches (KEM + wrap + MAC) or\n// it does not. A CEK conflict among accepted slots fails closed to no_match.\nexport type TrialDecryptOnlyResult =\n | { readonly kind: 'match'; readonly slotIdx: number; readonly cek: Uint8Array }\n | { readonly kind: 'no_match' };\n\nconst ZERO_NONCE_12: Uint8Array = new Uint8Array(12);\nconst CEK_LENGTH = 32 as const;\nconst X25519_SECRET_KEY_LENGTH = 32 as const;\nconst X25519_PUBLIC_KEY_LENGTH = 32 as const;\nconst NONCE_LENGTH = 24 as const;\nconst WRAP_LENGTH = 48 as const;\nconst SLOTS_MAC_LENGTH = 32 as const;\n\n// Stable string key for a byte string, used only for the per-slot KEM-material\n// duplicate check (a structural pre-trial gate, not a constant-time comparison).\nfunction bytesKey(bytes: Uint8Array): string {\n let s = '';\n for (let i = 0; i < bytes.length; i++) {\n s += String.fromCharCode(bytes[i]!);\n }\n return s;\n}\n\n// Partitioning-oracle defence: every wire\n// length MUST be validated before any KEM/AEAD primitive is invoked, so malformed\n// records cannot probe per-slot failure ordering. Shared between\n// `eciesSealedPoeUnwrap` (single- and multi-priv) and `eciesSealedPoeTrialDecrypt`\n// to guarantee byte-identical pre-trial behaviour and to keep the dispatch\n// invariant in one place.\nfunction assertEnvelopeStructure(\n envelope: SealedEnvelope,\n multiPrivKeys?: ReadonlyArray<Uint8Array>,\n singlePrivKey?: Uint8Array,\n): void {\n if (envelope.scheme !== 1) {\n throw new EciesSealedPoeError(\n 'UNSUPPORTED_ENVELOPE_SCHEME',\n `envelope.scheme=${String(envelope.scheme)} unsupported (expected 1)`,\n );\n }\n if (envelope.aead !== SEALED_POE_AEAD) {\n throw new EciesSealedPoeError(\n 'UNSUPPORTED_AEAD_ALG',\n `envelope.aead=${String(envelope.aead)} unsupported (expected '${SEALED_POE_AEAD}')`,\n );\n }\n if (envelope.kem !== 'x25519' && envelope.kem !== 'mlkem768x25519') {\n throw new EciesSealedPoeError(\n 'UNSUPPORTED_KEM_ALG',\n `envelope.kem=${String((envelope as { kem: string }).kem)} unsupported (expected 'x25519' or 'mlkem768x25519')`,\n );\n }\n\n // Envelope-level length pre-checks in this exact order.\n const n = envelope.slots.length;\n if (n < 1) {\n throw new EciesSealedPoeError('ENC_SLOTS_EMPTY', `envelope.slots.length=${n} must be >= 1`);\n }\n // Resource bound: reject an envelope with more than MAX_SLOTS slots before any\n // KEM/AEAD primitive runs, so a malformed record cannot drive unbounded\n // per-slot work. Checked before the per-slot length loop below.\n if (n > MAX_SLOTS) {\n throw new EciesSealedPoeError(\n 'ENC_SLOTS_TOO_MANY',\n `envelope.slots.length=${n} exceeds MAX_SLOTS=${MAX_SLOTS}`,\n );\n }\n if (envelope.nonce.length !== NONCE_LENGTH) {\n throw new EciesSealedPoeError(\n 'NONCE_LENGTH_MISMATCH',\n `envelope.nonce MUST be exactly ${NONCE_LENGTH} bytes, got ${envelope.nonce.length}`,\n );\n }\n if (envelope.slots_mac.length !== SLOTS_MAC_LENGTH) {\n throw new EciesSealedPoeError(\n 'ENC_SLOTS_MAC_INVALID_LENGTH',\n `envelope.slots_mac MUST be exactly ${SLOTS_MAC_LENGTH} bytes, got ${envelope.slots_mac.length}`,\n );\n }\n\n // Per-slot length pre-checks — KEM-driven. ALL slots are validated here,\n // before any decapsulation, so the trial-decrypt loop never observes a\n // malformed slot (partitioning-oracle-safe ordering).\n //\n // Per-slot KEK uniqueness is also enforced here. The zero-nonce per-slot wrap\n // is safe only because each slot draws fresh KEM randomness, so its KEK is\n // unique; two slots sharing the same KEM material derive the same KEK and\n // repeat a (KEK, zero-nonce) pair. The KEM material that fixes the KEK is the\n // `epk` (x25519) or the `kem_ct` (hybrid) — both bound into the KEK salt — so\n // a repeat of either across slots is rejected outright.\n const seenKemMaterial = new Set<string>();\n if (envelope.kem === 'x25519') {\n for (let i = 0; i < n; i++) {\n const slot = envelope.slots[i]!;\n if (slot.epk.length !== X25519_PUBLIC_KEY_LENGTH) {\n throw new EciesSealedPoeError(\n 'KEM_EPK_LENGTH_MISMATCH',\n `envelope.slots[${i}].epk MUST be exactly ${X25519_PUBLIC_KEY_LENGTH} bytes, got ${slot.epk.length}`,\n );\n }\n if (slot.wrap.length !== WRAP_LENGTH) {\n throw new EciesSealedPoeError(\n 'WRAP_LENGTH_MISMATCH',\n `envelope.slots[${i}].wrap MUST be exactly ${WRAP_LENGTH} bytes, got ${slot.wrap.length}`,\n );\n }\n const key = bytesKey(slot.epk);\n if (seenKemMaterial.has(key)) {\n throw new EciesSealedPoeError(\n 'ENC_SLOTS_DUPLICATE_KEM_MATERIAL',\n `envelope.slots[${i}].epk duplicates an earlier slot — per-slot KEK uniqueness is violated`,\n );\n }\n seenKemMaterial.add(key);\n }\n } else {\n for (let i = 0; i < n; i++) {\n const slot = envelope.slots[i]!;\n if (slot.kem_ct.length !== MLKEM768X25519_ENC_LENGTH) {\n throw new EciesSealedPoeError(\n 'KEM_CT_LENGTH_MISMATCH',\n `envelope.slots[${i}].kem_ct MUST be exactly ${MLKEM768X25519_ENC_LENGTH} bytes, got ${slot.kem_ct.length}`,\n );\n }\n if (slot.wrap.length !== WRAP_LENGTH) {\n throw new EciesSealedPoeError(\n 'WRAP_LENGTH_MISMATCH',\n `envelope.slots[${i}].wrap MUST be exactly ${WRAP_LENGTH} bytes, got ${slot.wrap.length}`,\n );\n }\n const key = bytesKey(slot.kem_ct);\n if (seenKemMaterial.has(key)) {\n throw new EciesSealedPoeError(\n 'ENC_SLOTS_DUPLICATE_KEM_MATERIAL',\n `envelope.slots[${i}].kem_ct duplicates an earlier slot — per-slot KEK uniqueness is violated`,\n );\n }\n seenKemMaterial.add(key);\n }\n }\n\n // Decoded-envelope byte backstop. Every per-slot field above is validated to a\n // fixed length, so the decoded envelope's aggregate size is determined here:\n // nonce + slots_mac + per-slot (epk|kem_ct + wrap). Reject before any KEM/AEAD\n // primitive when it exceeds the bound — a tighter resource cap than MAX_SLOTS\n // for honest records, and the bound a parser that can see the decoded size\n // enforces. (The slot-count cap above already bounds work; this is the byte\n // backstop the verifier also pins.)\n const perSlotBytes =\n envelope.kem === 'x25519'\n ? X25519_PUBLIC_KEY_LENGTH + WRAP_LENGTH\n : MLKEM768X25519_ENC_LENGTH + WRAP_LENGTH;\n const decodedEnvelopeBytes = NONCE_LENGTH + SLOTS_MAC_LENGTH + n * perSlotBytes;\n if (decodedEnvelopeBytes > MAX_DECODED_ENVELOPE_BYTES) {\n throw new EciesSealedPoeError(\n 'ENC_ENVELOPE_TOO_LARGE',\n `decoded envelope size ${decodedEnvelopeBytes} exceeds MAX_DECODED_ENVELOPE_BYTES=${MAX_DECODED_ENVELOPE_BYTES}`,\n );\n }\n\n if (multiPrivKeys !== undefined) {\n for (let i = 0; i < multiPrivKeys.length; i++) {\n if (multiPrivKeys[i]!.length !== X25519_SECRET_KEY_LENGTH) {\n throw new EciesSealedPoeError(\n 'INVALID_RECIPIENT_KEY',\n `recipientSecretKeys[${i}] MUST be exactly ${X25519_SECRET_KEY_LENGTH} bytes, got ${multiPrivKeys[i]!.length}`,\n );\n }\n }\n } else if (singlePrivKey !== undefined) {\n if (singlePrivKey.length !== X25519_SECRET_KEY_LENGTH) {\n throw new EciesSealedPoeError(\n 'INVALID_RECIPIENT_KEY',\n `recipientSecretKey MUST be exactly ${X25519_SECRET_KEY_LENGTH} bytes, got ${singlePrivKey.length}`,\n );\n }\n }\n}\n\n// All-zero IKM for the dummy KEK an invalid-ECDH slot derives so it pays the\n// same HKDF work as a live slot (see `tryX25519Slot`).\nconst ZERO_IKM_32: Uint8Array = new Uint8Array(32);\n// Fixed dummy candidate CEK for a slot whose wrap-open failed, so the per-slot\n// MAC step runs uniformly on every slot. The dummy is independent of the failed\n// ciphertext, and its MAC outcome can never accept a slot — acceptance also\n// requires the slot's `ok` bit.\nconst DUMMY_CEK_32: Uint8Array = new Uint8Array(32);\n\n// One slot's recovery outcome: the folded `kem_ok AND open_ok` acceptance\n// contribution as a 0|1 integer, plus the candidate CEK — the recovered\n// 32-byte wrap plaintext, or the fixed dummy when the bit is 0 — so the\n// caller's MAC step folds the same-shaped input for every slot.\ninterface SlotCandidate {\n readonly ok: number;\n readonly candidate: Uint8Array;\n}\n\n// Attempt the per-slot wrap AEAD, or yield the dummy candidate. Atomic: on a\n// tag failure no plaintext escapes and the candidate is the fixed all-zero\n// dummy, independent of the failed ciphertext.\nfunction wrapOpenOrDummy(kek: Uint8Array, aad: Uint8Array, wrap: Uint8Array): SlotCandidate {\n try {\n const plaintext = chacha20Poly1305Decrypt({\n key: kek,\n nonce: ZERO_NONCE_12,\n aad,\n ciphertext: wrap,\n });\n // The wrap is pre-validated to 48 bytes, so the recovered CEK is exactly\n // 32; anything else is treated as a failed open.\n if (plaintext.length === CEK_LENGTH) {\n return { ok: 1, candidate: plaintext };\n }\n return { ok: 0, candidate: DUMMY_CEK_32 };\n } catch (e) {\n if (!(e instanceof AeadVerificationError)) throw e;\n return { ok: 0, candidate: DUMMY_CEK_32 };\n }\n}\n\n// Classical (x25519) per-slot recovery body. The wrap AEAD is attempted on\n// EVERY slot (no match-position-dependent skip), so a per-priv scan recovers a\n// candidate CEK from each slot the recipient is addressed in — which is what\n// the CEK-conflict detection needs — and every slot pays the identical\n// ECDH + HKDF + AEAD-open cost regardless of where the match lands.\n//\n// `kem_ok` is the X25519 validity bit: a small-order `epk` drives the shared\n// secret to all-zero, which RFC 7748 §6.1 rejects. @noble/curves signals this\n// by THROWING from `getSharedSecret`, so a fully branchless ct-select over the\n// shared secret is not expressible against this library API. The next-best,\n// equivalent form is taken instead: on the all-zero rejection the slot derives\n// a DUMMY KEK from `ikm=0^32` (same salt/info — same HKDF work) and STILL\n// attempts the wrap-open under it, so the invalid-ECDH slot takes the same\n// per-slot work shape as a live one, while `kem_ok=0` folded into the returned\n// bit means it can never be accepted regardless of the AEAD outcome.\nfunction tryX25519Slot(args: {\n slot: X25519Slot;\n nonce: Uint8Array;\n recipientSecretKey: Uint8Array;\n pubRLocal: Uint8Array;\n}): SlotCandidate {\n const salt = x25519KekSalt({ nonce: args.nonce, epk: args.slot.epk, pubR: args.pubRLocal });\n let kemOk = 1;\n let kek: Uint8Array;\n try {\n const shared = x25519Ecdh({\n secretKey: args.recipientSecretKey,\n theirPublicKey: args.slot.epk,\n });\n kek = hkdfSha256({ ikm: shared, salt, info: CARDANO_POE_HKDF_INFO_KEK, length: 32 });\n } catch (e) {\n if (!(e instanceof X25519LowOrderPointError)) throw e;\n kemOk = 0;\n kek = hkdfSha256({ ikm: ZERO_IKM_32, salt, info: CARDANO_POE_HKDF_INFO_KEK, length: 32 });\n }\n const opened = wrapOpenOrDummy(kek, CARDANO_POE_HKDF_INFO_KEK, args.slot.wrap);\n return { ok: kemOk & opened.ok, candidate: opened.candidate };\n}\n\n// Hybrid (mlkem768x25519) per-slot recovery body. X-Wing decapsulate NEVER\n// throws on attacker wire data (ML-KEM implicit rejection), so there is no\n// try/catch and the KEM validity bit is constant 1: a wrong shared secret\n// simply yields a KEK that fails the AEAD tag. As in the classical body, the\n// AEAD is attempted on EVERY slot (full decapsulate + HKDF + AEAD-open) so\n// matching and non-matching slots cost the same X-Wing work.\nfunction tryMlkem768X25519Slot(args: {\n slot: Mlkem768X25519Slot;\n nonce: Uint8Array;\n recipientSecretKey: Uint8Array;\n pubR: Uint8Array;\n}): SlotCandidate {\n // kem_ct length was validated against MLKEM768X25519_ENC_LENGTH in\n // assertEnvelopeStructure, so this decapsulate is constant-work.\n const ss = mlkem768x25519Decapsulate({\n secretSeed: args.recipientSecretKey,\n enc: args.slot.kem_ct,\n });\n // The KEK salt binds the envelope nonce, the slot's own ciphertext, and the\n // recipient's own X-Wing public key (recomputed from the held seed), exactly\n // as the producer bound them — see the wrap path.\n const kek = hkdfSha256({\n ikm: ss,\n salt: xwingKekSalt({ nonce: args.nonce, kemCt: args.slot.kem_ct, pubR: args.pubR }),\n info: CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519,\n length: 32,\n });\n return wrapOpenOrDummy(kek, CARDANO_POE_HKDF_INFO_KEK_MLKEM768X25519, args.slot.wrap);\n}\n\n// Outcome of one private key's full pass over the slot array.\n//\n// • found — some slot fully matched (kem_ok AND open_ok AND mac_ok).\n// • selectedCek — the FIRST matching slot's CEK (null when !found).\n// • cekConflict — two matching slots recovered different CEKs (the\n// commitment collision the construction fails closed on).\n// • anyOpened — some slot wrap-opened under a valid KEM (`kem_ok AND\n// open_ok`), regardless of its MAC outcome. Distinguishes\n// the tampered-header diagnostic from a plain non-recipient.\ninterface PrivPassResult {\n readonly found: boolean;\n readonly selectedCek: Uint8Array | null;\n readonly selectedSlotIdx: number;\n readonly cekConflict: boolean;\n readonly anyOpened: boolean;\n}\n\n// Per-priv inner trial-decrypt loop, KEM-driven, with the slot-set MAC folded\n// into per-slot acceptance. Every slot is entered and every slot pays the same\n// work: KEM recovery, wrap-open, then the MAC check over the loop-constant\n// `slots_hash` — keyed from the recovered candidate CEK, or from a fixed dummy\n// when the wrap-open failed, so the MAC step is uniform too. This follows the\n// spec loop shape:\n//\n// ok = kem_ok AND open_ok AND mac_ok\n// first = ok AND NOT found\n// cek_conflict = cek_conflict OR (ok AND found AND NOT ctEq(cand, selected))\n// selected_CEK = select(first, cand, selected)\n// found = found OR ok\n//\n// No early break is taken, the bits combine with integer `&`/`|` (never a\n// short-circuit), and the running selection state is folded with mask-based\n// updates, so the scan takes the same source-level path across the whole slot\n// set regardless of where (or whether) a match lands.\nfunction runPrivPass(\n envelope: SealedEnvelope,\n recipientSecretKey: Uint8Array,\n slotsHash: Uint8Array,\n slotsAttemptedOut: { count: number; perPrivCounts?: number[] } | undefined,\n): PrivPassResult {\n const n = envelope.slots.length;\n const state = newSlotAcceptanceState();\n let anyOpenedBit = 0;\n\n const acceptSlot = (slot: SlotCandidate, i: number): void => {\n anyOpenedBit |= slot.ok;\n const macOk =\n Number(compareCt(computeSlotsMac({ cek: slot.candidate, slotsHash }), envelope.slots_mac)) &\n 1;\n foldSlotAcceptance(state, slot.ok & macOk, slot.candidate, i);\n };\n\n if (envelope.kem === 'x25519') {\n const pubRLocal = x25519PublicKey({ secretKey: recipientSecretKey });\n for (let i = 0; i < n; i++) {\n if (slotsAttemptedOut !== undefined) {\n slotsAttemptedOut.count = i + 1;\n }\n acceptSlot(\n tryX25519Slot({\n slot: envelope.slots[i]!,\n nonce: envelope.nonce,\n recipientSecretKey,\n pubRLocal,\n }),\n i,\n );\n }\n } else {\n // Recompute the recipient's own X-Wing public key from the held seed: the\n // hybrid KEK salt binds `pub_R`, so each private key in a multi-key scan\n // MUST re-derive it (a single shared pub_R would compute the wrong KEK for\n // every key but one).\n const pubR = mlkem768x25519Keygen(recipientSecretKey).publicKey;\n for (let i = 0; i < n; i++) {\n if (slotsAttemptedOut !== undefined) {\n slotsAttemptedOut.count = i + 1;\n }\n acceptSlot(\n tryMlkem768X25519Slot({\n slot: envelope.slots[i]!,\n nonce: envelope.nonce,\n recipientSecretKey,\n pubR,\n }),\n i,\n );\n }\n }\n const outcome = finishSlotAcceptance(state);\n return {\n found: outcome.found,\n selectedCek: outcome.selectedCek,\n selectedSlotIdx: outcome.selectedSlotIdx,\n cekConflict: outcome.cekConflict,\n anyOpened: anyOpenedBit === 1,\n };\n}\n\n// 32-byte slots-transcript hash. It depends only on the header, the slots, and\n// the item's hash claim, so it is constant across the multi-priv outer loop and\n// the per-slot trial-decrypt loop — callers compute it ONCE and re-key the HMAC\n// from each candidate CEK over this same 32-byte message.\nfunction slotsHashBytes(envelope: SealedEnvelope, hashes: ItemHashes): Uint8Array {\n return computeSlotsHash({\n aead: envelope.aead,\n kem: envelope.kem,\n nonce: envelope.nonce,\n slots: envelope.slots as ReadonlyArray<X25519Slot | Mlkem768X25519Slot>,\n hashesHash: itemHashesHash(hashes),\n });\n}\n\nexport function eciesSealedPoeUnwrap(args: UnwrapArgs): UnwrapResult {\n const { envelope, ciphertext } = args;\n\n // Exactly-one-of validation across the three UnwrapArgs forms (single-priv,\n // flat multi-priv, bundle). Runs before any AEAD / wire-shape work so a\n // malformed call cannot probe per-slot AEAD timing. The bundle form resolves\n // to a flat multi-priv list here by dispatching on `envelope.kem` — from this\n // point the loop is identical regardless of how the caller supplied keys.\n const hasSingle = 'recipientSecretKey' in args;\n const hasBundle = 'recipientKeyBundle' in args;\n const multiPrivKeys: ReadonlyArray<Uint8Array> | undefined = hasBundle\n ? selectBundleSecrets(envelope, (args as UnwrapArgsBundle).recipientKeyBundle)\n : 'recipientSecretKeys' in args\n ? (args as UnwrapArgsMultiPriv).recipientSecretKeys\n : undefined;\n const hasMulti = multiPrivKeys !== undefined;\n if (hasSingle === hasMulti) {\n throw new EciesSealedPoeError(\n 'INVALID_RECIPIENT_KEY',\n 'exactly one of recipientSecretKey / recipientSecretKeys / recipientKeyBundle MUST be supplied',\n );\n }\n // A bundle selecting an empty list for this KEM means the recipient holds no\n // key of the matching kind (e.g. an archived-only identity facing a hybrid\n // record). That is a legitimate non-match, NOT a malformed call — return a\n // clean WRONG_RECIPIENT_KEY without invoking any KEM primitive. The flat\n // multi-priv form keeps the \"empty array is a programmer error\" contract.\n if (hasMulti && multiPrivKeys!.length === 0) {\n if (hasBundle) {\n return { matched: false, reason: 'WRONG_RECIPIENT_KEY' };\n }\n throw new EciesSealedPoeError(\n 'INVALID_RECIPIENT_KEY',\n 'recipientSecretKeys MUST be a non-empty array, got length=0',\n );\n }\n\n // Partitioning-oracle pre-checks; per-priv length validation happens\n // inside `assertEnvelopeStructure`.\n if (hasMulti) {\n assertEnvelopeStructure(envelope, multiPrivKeys, undefined);\n } else {\n assertEnvelopeStructure(envelope, undefined, (args as UnwrapArgsSinglePriv).recipientSecretKey);\n }\n\n // The slots-transcript hash (which also digests the item's hash claim) is\n // constant across the whole scan — compute it ONCE, then re-key the HMAC from\n // each candidate CEK over this same 32-byte message.\n const slotsHash = slotsHashBytes(envelope, args.hashes);\n\n let matchedCek: Uint8Array | null = null;\n let anyOpenedAcrossPrivs = false;\n\n const privKeys: ReadonlyArray<Uint8Array> = hasMulti\n ? multiPrivKeys!\n : [(args as UnwrapArgsSinglePriv).recipientSecretKey];\n\n for (let k = 0; k < privKeys.length; k++) {\n if (args._privsAttemptedOut !== undefined) {\n args._privsAttemptedOut.count = k + 1;\n }\n if (args._slotsAttemptedOut !== undefined) {\n args._slotsAttemptedOut.count = 0;\n }\n const pass = runPrivPass(envelope, privKeys[k]!, slotsHash, args._slotsAttemptedOut);\n if (args._slotsAttemptedOut?.perPrivCounts !== undefined) {\n args._slotsAttemptedOut.perPrivCounts.push(args._slotsAttemptedOut.count);\n }\n anyOpenedAcrossPrivs = anyOpenedAcrossPrivs || pass.anyOpened;\n if (!pass.found) continue;\n // Two accepted slots recovering different CEKs is the commitment collision\n // the construction fails closed on — an anomalous slot set, surfaced as the\n // generic tampered-header diagnostic.\n if (pass.cekConflict) {\n return { matched: false, reason: 'TAMPERED_HEADER' };\n }\n matchedCek = pass.selectedCek;\n // The outer cross-priv loop short-circuits on the first priv that accepted\n // a slot. This intentionally leaks \"which priv matched\" → \"how many key\n // rotations the recipient has performed\". We accept it: trial-decrypt runs\n // client-side, so this timing is only locally observable, and the leak is a\n // weak ordering signal, not a key/plaintext oracle. Making the outer loop\n // constant-work would cost a FULL KEM pass (for the hybrid branch a full\n // X-Wing decapsulation per slot) for EVERY archived priv on EVERY record;\n // the benefit (hiding a count the user already knows) does not justify it.\n // The inner per-slot loop IS constant across slots.\n break;\n }\n\n if (matchedCek === null) {\n // A slot wrap-opened somewhere but nothing passed the folded acceptance:\n // some slot, header field, the hashes claim, or slots_mac itself was\n // tampered. No wrap-open at all is a plain non-recipient.\n return {\n matched: false,\n reason: anyOpenedAcrossPrivs ? 'TAMPERED_HEADER' : 'WRONG_RECIPIENT_KEY',\n };\n }\n\n // Content opens under the derived `payload_key` in the segmented STREAM\n // format; each chunk's tag is verified before its plaintext is released.\n try {\n const plaintext = streamOpen({\n payloadKey: slotsPayloadKey({ cek: matchedCek, nonce: envelope.nonce }),\n ciphertext,\n });\n return { matched: true, plaintext };\n } catch (e) {\n if (!(e instanceof StreamTamperedError)) throw e;\n return { matched: false, reason: 'TAMPERED_CIPHERTEXT' };\n }\n}\n\n// Trial-decrypt half of the sealed-PoE unwrap algorithm:\n// recovers the CEK + slot index without touching the content stream. Used by an\n// inbox-scan agent where the on-chain envelope is available but the off-chain\n// ciphertext blob is fetched lazily only when the user invokes Decrypt.\n//\n// Mirrors the multi-priv branch of `eciesSealedPoeUnwrap`: same\n// partitioning-oracle pre-checks, same per-priv inner loop with the MAC folded\n// into per-slot acceptance, same constant-across-slots invariant. Differs only\n// in the return shape: `{kind: 'match', slotIdx, cek}` instead of plaintext;\n// `{kind: 'no_match'}` for everything else (per-slot acceptance is binary, so\n// there is no distinguishable middle outcome). Cross-priv variable-time\n// short-circuit is preserved (leaks \"which priv matched\" → \"how many\n// rotations\", a documented weak ordering signal).\nexport function eciesSealedPoeTrialDecrypt(args: TrialDecryptOnlyArgs): TrialDecryptOnlyResult {\n const { envelope } = args;\n\n // Bundle form selects the per-KEM list from `envelope.kem`; flat form is\n // already KEM-pre-selected. An empty bundle list for this KEM is a clean\n // no_match (the recipient holds no key of the matching kind), whereas an\n // empty flat list stays a programmer error.\n const hasBundle = 'recipientKeyBundle' in args;\n const recipientSecretKeys: ReadonlyArray<Uint8Array> = hasBundle\n ? selectBundleSecrets(envelope, args.recipientKeyBundle)\n : args.recipientSecretKeys;\n\n if (recipientSecretKeys.length === 0) {\n if (hasBundle) {\n return { kind: 'no_match' };\n }\n throw new EciesSealedPoeError(\n 'INVALID_RECIPIENT_KEY',\n 'recipientSecretKeys MUST be a non-empty array, got length=0',\n );\n }\n assertEnvelopeStructure(envelope, recipientSecretKeys, undefined);\n\n const slotsHash = slotsHashBytes(envelope, args.hashes);\n\n for (let k = 0; k < recipientSecretKeys.length; k++) {\n if (args._privsAttemptedOut !== undefined) {\n args._privsAttemptedOut.count = k + 1;\n }\n if (args._slotsAttemptedOut !== undefined) {\n args._slotsAttemptedOut.count = 0;\n }\n const pass = runPrivPass(envelope, recipientSecretKeys[k]!, slotsHash, args._slotsAttemptedOut);\n if (args._slotsAttemptedOut?.perPrivCounts !== undefined) {\n args._slotsAttemptedOut.perPrivCounts.push(args._slotsAttemptedOut.count);\n }\n if (!pass.found) continue;\n // A CEK conflict is never a clean match — fail closed.\n if (pass.cekConflict) {\n return { kind: 'no_match' };\n }\n return {\n kind: 'match',\n slotIdx: pass.selectedSlotIdx,\n cek: pass.selectedCek as Uint8Array,\n };\n }\n return { kind: 'no_match' };\n}\n","import { argon2id } from 'hash-wasm';\n\nexport interface Argon2idParams {\n readonly memSizeKB: number;\n readonly iterations: number;\n readonly parallelism: number;\n readonly outBytes: number;\n}\n\nexport interface Argon2idV13Opts {\n readonly password: Uint8Array;\n readonly salt: Uint8Array;\n readonly memSizeKB: number;\n readonly iterations: number;\n readonly parallelism: number;\n readonly outBytes: number;\n}\n\nexport async function argon2idV13(opts: Argon2idV13Opts): Promise<Uint8Array> {\n return (await argon2id({\n password: opts.password,\n salt: opts.salt,\n parallelism: opts.parallelism,\n iterations: opts.iterations,\n memorySize: opts.memSizeKB,\n hashLength: opts.outBytes,\n outputType: 'binary',\n })) as Uint8Array;\n}\n","// Generated by generate-unicode-nfkc-16.py from the Unicode Character Database 16.0.0.\n// Do not edit by hand.\n//\n// Derived from Unicode data files, copyright (c) 2024 Unicode, Inc., used\n// under the UNICODE LICENSE V3 (https://www.unicode.org/license.txt).\n\n// Fully expanded compatibility (NFKD) decompositions, Hangul excluded.\n// Entry: <cp>=<cp> <cp>...; all numbers uppercase hex; entries sorted, ';'-joined.\nexport const NFKC16_DECOMPOSITION_PACKED: string = [\n 'A0=20;A8=20 308;AA=61;AF=20 304;B2=32;B3=33;B4=20 301;B5=3BC;B8=20 327;B9=31;BA=6F;BC=31',\n ' 2044 34;BD=31 2044 32;BE=33 2044 34;C0=41 300;C1=41 301;C2=41 302;C3=41 303;C4=41 308;C',\n '5=41 30A;C7=43 327;C8=45 300;C9=45 301;CA=45 302;CB=45 308;CC=49 300;CD=49 301;CE=49 302',\n ';CF=49 308;D1=4E 303;D2=4F 300;D3=4F 301;D4=4F 302;D5=4F 303;D6=4F 308;D9=55 300;DA=55 3',\n '01;DB=55 302;DC=55 308;DD=59 301;E0=61 300;E1=61 301;E2=61 302;E3=61 303;E4=61 308;E5=61',\n ' 30A;E7=63 327;E8=65 300;E9=65 301;EA=65 302;EB=65 308;EC=69 300;ED=69 301;EE=69 302;EF=',\n '69 308;F1=6E 303;F2=6F 300;F3=6F 301;F4=6F 302;F5=6F 303;F6=6F 308;F9=75 300;FA=75 301;F',\n 'B=75 302;FC=75 308;FD=79 301;FF=79 308;100=41 304;101=61 304;102=41 306;103=61 306;104=4',\n '1 328;105=61 328;106=43 301;107=63 301;108=43 302;109=63 302;10A=43 307;10B=63 307;10C=4',\n '3 30C;10D=63 30C;10E=44 30C;10F=64 30C;112=45 304;113=65 304;114=45 306;115=65 306;116=4',\n '5 307;117=65 307;118=45 328;119=65 328;11A=45 30C;11B=65 30C;11C=47 302;11D=67 302;11E=4',\n '7 306;11F=67 306;120=47 307;121=67 307;122=47 327;123=67 327;124=48 302;125=68 302;128=4',\n '9 303;129=69 303;12A=49 304;12B=69 304;12C=49 306;12D=69 306;12E=49 328;12F=69 328;130=4',\n '9 307;132=49 4A;133=69 6A;134=4A 302;135=6A 302;136=4B 327;137=6B 327;139=4C 301;13A=6C ',\n '301;13B=4C 327;13C=6C 327;13D=4C 30C;13E=6C 30C;13F=4C B7;140=6C B7;143=4E 301;144=6E 30',\n '1;145=4E 327;146=6E 327;147=4E 30C;148=6E 30C;149=2BC 6E;14C=4F 304;14D=6F 304;14E=4F 30',\n '6;14F=6F 306;150=4F 30B;151=6F 30B;154=52 301;155=72 301;156=52 327;157=72 327;158=52 30',\n 'C;159=72 30C;15A=53 301;15B=73 301;15C=53 302;15D=73 302;15E=53 327;15F=73 327;160=53 30',\n 'C;161=73 30C;162=54 327;163=74 327;164=54 30C;165=74 30C;168=55 303;169=75 303;16A=55 30',\n '4;16B=75 304;16C=55 306;16D=75 306;16E=55 30A;16F=75 30A;170=55 30B;171=75 30B;172=55 32',\n '8;173=75 328;174=57 302;175=77 302;176=59 302;177=79 302;178=59 308;179=5A 301;17A=7A 30',\n '1;17B=5A 307;17C=7A 307;17D=5A 30C;17E=7A 30C;17F=73;1A0=4F 31B;1A1=6F 31B;1AF=55 31B;1B',\n '0=75 31B;1C4=44 5A 30C;1C5=44 7A 30C;1C6=64 7A 30C;1C7=4C 4A;1C8=4C 6A;1C9=6C 6A;1CA=4E ',\n '4A;1CB=4E 6A;1CC=6E 6A;1CD=41 30C;1CE=61 30C;1CF=49 30C;1D0=69 30C;1D1=4F 30C;1D2=6F 30C',\n ';1D3=55 30C;1D4=75 30C;1D5=55 308 304;1D6=75 308 304;1D7=55 308 301;1D8=75 308 301;1D9=5',\n '5 308 30C;1DA=75 308 30C;1DB=55 308 300;1DC=75 308 300;1DE=41 308 304;1DF=61 308 304;1E0',\n '=41 307 304;1E1=61 307 304;1E2=C6 304;1E3=E6 304;1E6=47 30C;1E7=67 30C;1E8=4B 30C;1E9=6B',\n ' 30C;1EA=4F 328;1EB=6F 328;1EC=4F 328 304;1ED=6F 328 304;1EE=1B7 30C;1EF=292 30C;1F0=6A ',\n '30C;1F1=44 5A;1F2=44 7A;1F3=64 7A;1F4=47 301;1F5=67 301;1F8=4E 300;1F9=6E 300;1FA=41 30A',\n ' 301;1FB=61 30A 301;1FC=C6 301;1FD=E6 301;1FE=D8 301;1FF=F8 301;200=41 30F;201=61 30F;20',\n '2=41 311;203=61 311;204=45 30F;205=65 30F;206=45 311;207=65 311;208=49 30F;209=69 30F;20',\n 'A=49 311;20B=69 311;20C=4F 30F;20D=6F 30F;20E=4F 311;20F=6F 311;210=52 30F;211=72 30F;21',\n '2=52 311;213=72 311;214=55 30F;215=75 30F;216=55 311;217=75 311;218=53 326;219=73 326;21',\n 'A=54 326;21B=74 326;21E=48 30C;21F=68 30C;226=41 307;227=61 307;228=45 327;229=65 327;22',\n 'A=4F 308 304;22B=6F 308 304;22C=4F 303 304;22D=6F 303 304;22E=4F 307;22F=6F 307;230=4F 3',\n '07 304;231=6F 307 304;232=59 304;233=79 304;2B0=68;2B1=266;2B2=6A;2B3=72;2B4=279;2B5=27B',\n ';2B6=281;2B7=77;2B8=79;2D8=20 306;2D9=20 307;2DA=20 30A;2DB=20 328;2DC=20 303;2DD=20 30B',\n ';2E0=263;2E1=6C;2E2=73;2E3=78;2E4=295;340=300;341=301;343=313;344=308 301;374=2B9;37A=20',\n ' 345;37E=3B;384=20 301;385=20 308 301;386=391 301;387=B7;388=395 301;389=397 301;38A=399',\n ' 301;38C=39F 301;38E=3A5 301;38F=3A9 301;390=3B9 308 301;3AA=399 308;3AB=3A5 308;3AC=3B1',\n ' 301;3AD=3B5 301;3AE=3B7 301;3AF=3B9 301;3B0=3C5 308 301;3CA=3B9 308;3CB=3C5 308;3CC=3BF',\n ' 301;3CD=3C5 301;3CE=3C9 301;3D0=3B2;3D1=3B8;3D2=3A5;3D3=3A5 301;3D4=3A5 308;3D5=3C6;3D6',\n '=3C0;3F0=3BA;3F1=3C1;3F2=3C2;3F4=398;3F5=3B5;3F9=3A3;400=415 300;401=415 308;403=413 301',\n ';407=406 308;40C=41A 301;40D=418 300;40E=423 306;419=418 306;439=438 306;450=435 300;451',\n '=435 308;453=433 301;457=456 308;45C=43A 301;45D=438 300;45E=443 306;476=474 30F;477=475',\n ' 30F;4C1=416 306;4C2=436 306;4D0=410 306;4D1=430 306;4D2=410 308;4D3=430 308;4D6=415 306',\n ';4D7=435 306;4DA=4D8 308;4DB=4D9 308;4DC=416 308;4DD=436 308;4DE=417 308;4DF=437 308;4E2',\n '=418 304;4E3=438 304;4E4=418 308;4E5=438 308;4E6=41E 308;4E7=43E 308;4EA=4E8 308;4EB=4E9',\n ' 308;4EC=42D 308;4ED=44D 308;4EE=423 304;4EF=443 304;4F0=423 308;4F1=443 308;4F2=423 30B',\n ';4F3=443 30B;4F4=427 308;4F5=447 308;4F8=42B 308;4F9=44B 308;587=565 582;622=627 653;623',\n '=627 654;624=648 654;625=627 655;626=64A 654;675=627 674;676=648 674;677=6C7 674;678=64A',\n ' 674;6C0=6D5 654;6C2=6C1 654;6D3=6D2 654;929=928 93C;931=930 93C;934=933 93C;958=915 93C',\n ';959=916 93C;95A=917 93C;95B=91C 93C;95C=921 93C;95D=922 93C;95E=92B 93C;95F=92F 93C;9CB',\n '=9C7 9BE;9CC=9C7 9D7;9DC=9A1 9BC;9DD=9A2 9BC;9DF=9AF 9BC;A33=A32 A3C;A36=A38 A3C;A59=A16',\n ' A3C;A5A=A17 A3C;A5B=A1C A3C;A5E=A2B A3C;B48=B47 B56;B4B=B47 B3E;B4C=B47 B57;B5C=B21 B3C',\n ';B5D=B22 B3C;B94=B92 BD7;BCA=BC6 BBE;BCB=BC7 BBE;BCC=BC6 BD7;C48=C46 C56;CC0=CBF CD5;CC7',\n '=CC6 CD5;CC8=CC6 CD6;CCA=CC6 CC2;CCB=CC6 CC2 CD5;D4A=D46 D3E;D4B=D47 D3E;D4C=D46 D57;DDA',\n '=DD9 DCA;DDC=DD9 DCF;DDD=DD9 DCF DCA;DDE=DD9 DDF;E33=E4D E32;EB3=ECD EB2;EDC=EAB E99;EDD',\n '=EAB EA1;F0C=F0B;F43=F42 FB7;F4D=F4C FB7;F52=F51 FB7;F57=F56 FB7;F5C=F5B FB7;F69=F40 FB5',\n ';F73=F71 F72;F75=F71 F74;F76=FB2 F80;F77=FB2 F71 F80;F78=FB3 F80;F79=FB3 F71 F80;F81=F71',\n ' F80;F93=F92 FB7;F9D=F9C FB7;FA2=FA1 FB7;FA7=FA6 FB7;FAC=FAB FB7;FB9=F90 FB5;1026=1025 1',\n '02E;10FC=10DC;1B06=1B05 1B35;1B08=1B07 1B35;1B0A=1B09 1B35;1B0C=1B0B 1B35;1B0E=1B0D 1B35',\n ';1B12=1B11 1B35;1B3B=1B3A 1B35;1B3D=1B3C 1B35;1B40=1B3E 1B35;1B41=1B3F 1B35;1B43=1B42 1B',\n '35;1D2C=41;1D2D=C6;1D2E=42;1D30=44;1D31=45;1D32=18E;1D33=47;1D34=48;1D35=49;1D36=4A;1D37',\n '=4B;1D38=4C;1D39=4D;1D3A=4E;1D3C=4F;1D3D=222;1D3E=50;1D3F=52;1D40=54;1D41=55;1D42=57;1D4',\n '3=61;1D44=250;1D45=251;1D46=1D02;1D47=62;1D48=64;1D49=65;1D4A=259;1D4B=25B;1D4C=25C;1D4D',\n '=67;1D4F=6B;1D50=6D;1D51=14B;1D52=6F;1D53=254;1D54=1D16;1D55=1D17;1D56=70;1D57=74;1D58=7',\n '5;1D59=1D1D;1D5A=26F;1D5B=76;1D5C=1D25;1D5D=3B2;1D5E=3B3;1D5F=3B4;1D60=3C6;1D61=3C7;1D62',\n '=69;1D63=72;1D64=75;1D65=76;1D66=3B2;1D67=3B3;1D68=3C1;1D69=3C6;1D6A=3C7;1D78=43D;1D9B=2',\n '52;1D9C=63;1D9D=255;1D9E=F0;1D9F=25C;1DA0=66;1DA1=25F;1DA2=261;1DA3=265;1DA4=268;1DA5=26',\n '9;1DA6=26A;1DA7=1D7B;1DA8=29D;1DA9=26D;1DAA=1D85;1DAB=29F;1DAC=271;1DAD=270;1DAE=272;1DA',\n 'F=273;1DB0=274;1DB1=275;1DB2=278;1DB3=282;1DB4=283;1DB5=1AB;1DB6=289;1DB7=28A;1DB8=1D1C;',\n '1DB9=28B;1DBA=28C;1DBB=7A;1DBC=290;1DBD=291;1DBE=292;1DBF=3B8;1E00=41 325;1E01=61 325;1E',\n '02=42 307;1E03=62 307;1E04=42 323;1E05=62 323;1E06=42 331;1E07=62 331;1E08=43 327 301;1E',\n '09=63 327 301;1E0A=44 307;1E0B=64 307;1E0C=44 323;1E0D=64 323;1E0E=44 331;1E0F=64 331;1E',\n '10=44 327;1E11=64 327;1E12=44 32D;1E13=64 32D;1E14=45 304 300;1E15=65 304 300;1E16=45 30',\n '4 301;1E17=65 304 301;1E18=45 32D;1E19=65 32D;1E1A=45 330;1E1B=65 330;1E1C=45 327 306;1E',\n '1D=65 327 306;1E1E=46 307;1E1F=66 307;1E20=47 304;1E21=67 304;1E22=48 307;1E23=68 307;1E',\n '24=48 323;1E25=68 323;1E26=48 308;1E27=68 308;1E28=48 327;1E29=68 327;1E2A=48 32E;1E2B=6',\n '8 32E;1E2C=49 330;1E2D=69 330;1E2E=49 308 301;1E2F=69 308 301;1E30=4B 301;1E31=6B 301;1E',\n '32=4B 323;1E33=6B 323;1E34=4B 331;1E35=6B 331;1E36=4C 323;1E37=6C 323;1E38=4C 323 304;1E',\n '39=6C 323 304;1E3A=4C 331;1E3B=6C 331;1E3C=4C 32D;1E3D=6C 32D;1E3E=4D 301;1E3F=6D 301;1E',\n '40=4D 307;1E41=6D 307;1E42=4D 323;1E43=6D 323;1E44=4E 307;1E45=6E 307;1E46=4E 323;1E47=6',\n 'E 323;1E48=4E 331;1E49=6E 331;1E4A=4E 32D;1E4B=6E 32D;1E4C=4F 303 301;1E4D=6F 303 301;1E',\n '4E=4F 303 308;1E4F=6F 303 308;1E50=4F 304 300;1E51=6F 304 300;1E52=4F 304 301;1E53=6F 30',\n '4 301;1E54=50 301;1E55=70 301;1E56=50 307;1E57=70 307;1E58=52 307;1E59=72 307;1E5A=52 32',\n '3;1E5B=72 323;1E5C=52 323 304;1E5D=72 323 304;1E5E=52 331;1E5F=72 331;1E60=53 307;1E61=7',\n '3 307;1E62=53 323;1E63=73 323;1E64=53 301 307;1E65=73 301 307;1E66=53 30C 307;1E67=73 30',\n 'C 307;1E68=53 323 307;1E69=73 323 307;1E6A=54 307;1E6B=74 307;1E6C=54 323;1E6D=74 323;1E',\n '6E=54 331;1E6F=74 331;1E70=54 32D;1E71=74 32D;1E72=55 324;1E73=75 324;1E74=55 330;1E75=7',\n '5 330;1E76=55 32D;1E77=75 32D;1E78=55 303 301;1E79=75 303 301;1E7A=55 304 308;1E7B=75 30',\n '4 308;1E7C=56 303;1E7D=76 303;1E7E=56 323;1E7F=76 323;1E80=57 300;1E81=77 300;1E82=57 30',\n '1;1E83=77 301;1E84=57 308;1E85=77 308;1E86=57 307;1E87=77 307;1E88=57 323;1E89=77 323;1E',\n '8A=58 307;1E8B=78 307;1E8C=58 308;1E8D=78 308;1E8E=59 307;1E8F=79 307;1E90=5A 302;1E91=7',\n 'A 302;1E92=5A 323;1E93=7A 323;1E94=5A 331;1E95=7A 331;1E96=68 331;1E97=74 308;1E98=77 30',\n 'A;1E99=79 30A;1E9A=61 2BE;1E9B=73 307;1EA0=41 323;1EA1=61 323;1EA2=41 309;1EA3=61 309;1E',\n 'A4=41 302 301;1EA5=61 302 301;1EA6=41 302 300;1EA7=61 302 300;1EA8=41 302 309;1EA9=61 30',\n '2 309;1EAA=41 302 303;1EAB=61 302 303;1EAC=41 323 302;1EAD=61 323 302;1EAE=41 306 301;1E',\n 'AF=61 306 301;1EB0=41 306 300;1EB1=61 306 300;1EB2=41 306 309;1EB3=61 306 309;1EB4=41 30',\n '6 303;1EB5=61 306 303;1EB6=41 323 306;1EB7=61 323 306;1EB8=45 323;1EB9=65 323;1EBA=45 30',\n '9;1EBB=65 309;1EBC=45 303;1EBD=65 303;1EBE=45 302 301;1EBF=65 302 301;1EC0=45 302 300;1E',\n 'C1=65 302 300;1EC2=45 302 309;1EC3=65 302 309;1EC4=45 302 303;1EC5=65 302 303;1EC6=45 32',\n '3 302;1EC7=65 323 302;1EC8=49 309;1EC9=69 309;1ECA=49 323;1ECB=69 323;1ECC=4F 323;1ECD=6',\n 'F 323;1ECE=4F 309;1ECF=6F 309;1ED0=4F 302 301;1ED1=6F 302 301;1ED2=4F 302 300;1ED3=6F 30',\n '2 300;1ED4=4F 302 309;1ED5=6F 302 309;1ED6=4F 302 303;1ED7=6F 302 303;1ED8=4F 323 302;1E',\n 'D9=6F 323 302;1EDA=4F 31B 301;1EDB=6F 31B 301;1EDC=4F 31B 300;1EDD=6F 31B 300;1EDE=4F 31',\n 'B 309;1EDF=6F 31B 309;1EE0=4F 31B 303;1EE1=6F 31B 303;1EE2=4F 31B 323;1EE3=6F 31B 323;1E',\n 'E4=55 323;1EE5=75 323;1EE6=55 309;1EE7=75 309;1EE8=55 31B 301;1EE9=75 31B 301;1EEA=55 31',\n 'B 300;1EEB=75 31B 300;1EEC=55 31B 309;1EED=75 31B 309;1EEE=55 31B 303;1EEF=75 31B 303;1E',\n 'F0=55 31B 323;1EF1=75 31B 323;1EF2=59 300;1EF3=79 300;1EF4=59 323;1EF5=79 323;1EF6=59 30',\n '9;1EF7=79 309;1EF8=59 303;1EF9=79 303;1F00=3B1 313;1F01=3B1 314;1F02=3B1 313 300;1F03=3B',\n '1 314 300;1F04=3B1 313 301;1F05=3B1 314 301;1F06=3B1 313 342;1F07=3B1 314 342;1F08=391 3',\n '13;1F09=391 314;1F0A=391 313 300;1F0B=391 314 300;1F0C=391 313 301;1F0D=391 314 301;1F0E',\n '=391 313 342;1F0F=391 314 342;1F10=3B5 313;1F11=3B5 314;1F12=3B5 313 300;1F13=3B5 314 30',\n '0;1F14=3B5 313 301;1F15=3B5 314 301;1F18=395 313;1F19=395 314;1F1A=395 313 300;1F1B=395 ',\n '314 300;1F1C=395 313 301;1F1D=395 314 301;1F20=3B7 313;1F21=3B7 314;1F22=3B7 313 300;1F2',\n '3=3B7 314 300;1F24=3B7 313 301;1F25=3B7 314 301;1F26=3B7 313 342;1F27=3B7 314 342;1F28=3',\n '97 313;1F29=397 314;1F2A=397 313 300;1F2B=397 314 300;1F2C=397 313 301;1F2D=397 314 301;',\n '1F2E=397 313 342;1F2F=397 314 342;1F30=3B9 313;1F31=3B9 314;1F32=3B9 313 300;1F33=3B9 31',\n '4 300;1F34=3B9 313 301;1F35=3B9 314 301;1F36=3B9 313 342;1F37=3B9 314 342;1F38=399 313;1',\n 'F39=399 314;1F3A=399 313 300;1F3B=399 314 300;1F3C=399 313 301;1F3D=399 314 301;1F3E=399',\n ' 313 342;1F3F=399 314 342;1F40=3BF 313;1F41=3BF 314;1F42=3BF 313 300;1F43=3BF 314 300;1F',\n '44=3BF 313 301;1F45=3BF 314 301;1F48=39F 313;1F49=39F 314;1F4A=39F 313 300;1F4B=39F 314 ',\n '300;1F4C=39F 313 301;1F4D=39F 314 301;1F50=3C5 313;1F51=3C5 314;1F52=3C5 313 300;1F53=3C',\n '5 314 300;1F54=3C5 313 301;1F55=3C5 314 301;1F56=3C5 313 342;1F57=3C5 314 342;1F59=3A5 3',\n '14;1F5B=3A5 314 300;1F5D=3A5 314 301;1F5F=3A5 314 342;1F60=3C9 313;1F61=3C9 314;1F62=3C9',\n ' 313 300;1F63=3C9 314 300;1F64=3C9 313 301;1F65=3C9 314 301;1F66=3C9 313 342;1F67=3C9 31',\n '4 342;1F68=3A9 313;1F69=3A9 314;1F6A=3A9 313 300;1F6B=3A9 314 300;1F6C=3A9 313 301;1F6D=',\n '3A9 314 301;1F6E=3A9 313 342;1F6F=3A9 314 342;1F70=3B1 300;1F71=3B1 301;1F72=3B5 300;1F7',\n '3=3B5 301;1F74=3B7 300;1F75=3B7 301;1F76=3B9 300;1F77=3B9 301;1F78=3BF 300;1F79=3BF 301;',\n '1F7A=3C5 300;1F7B=3C5 301;1F7C=3C9 300;1F7D=3C9 301;1F80=3B1 313 345;1F81=3B1 314 345;1F',\n '82=3B1 313 300 345;1F83=3B1 314 300 345;1F84=3B1 313 301 345;1F85=3B1 314 301 345;1F86=3',\n 'B1 313 342 345;1F87=3B1 314 342 345;1F88=391 313 345;1F89=391 314 345;1F8A=391 313 300 3',\n '45;1F8B=391 314 300 345;1F8C=391 313 301 345;1F8D=391 314 301 345;1F8E=391 313 342 345;1',\n 'F8F=391 314 342 345;1F90=3B7 313 345;1F91=3B7 314 345;1F92=3B7 313 300 345;1F93=3B7 314 ',\n '300 345;1F94=3B7 313 301 345;1F95=3B7 314 301 345;1F96=3B7 313 342 345;1F97=3B7 314 342 ',\n '345;1F98=397 313 345;1F99=397 314 345;1F9A=397 313 300 345;1F9B=397 314 300 345;1F9C=397',\n ' 313 301 345;1F9D=397 314 301 345;1F9E=397 313 342 345;1F9F=397 314 342 345;1FA0=3C9 313',\n ' 345;1FA1=3C9 314 345;1FA2=3C9 313 300 345;1FA3=3C9 314 300 345;1FA4=3C9 313 301 345;1FA',\n '5=3C9 314 301 345;1FA6=3C9 313 342 345;1FA7=3C9 314 342 345;1FA8=3A9 313 345;1FA9=3A9 31',\n '4 345;1FAA=3A9 313 300 345;1FAB=3A9 314 300 345;1FAC=3A9 313 301 345;1FAD=3A9 314 301 34',\n '5;1FAE=3A9 313 342 345;1FAF=3A9 314 342 345;1FB0=3B1 306;1FB1=3B1 304;1FB2=3B1 300 345;1',\n 'FB3=3B1 345;1FB4=3B1 301 345;1FB6=3B1 342;1FB7=3B1 342 345;1FB8=391 306;1FB9=391 304;1FB',\n 'A=391 300;1FBB=391 301;1FBC=391 345;1FBD=20 313;1FBE=3B9;1FBF=20 313;1FC0=20 342;1FC1=20',\n ' 308 342;1FC2=3B7 300 345;1FC3=3B7 345;1FC4=3B7 301 345;1FC6=3B7 342;1FC7=3B7 342 345;1F',\n 'C8=395 300;1FC9=395 301;1FCA=397 300;1FCB=397 301;1FCC=397 345;1FCD=20 313 300;1FCE=20 3',\n '13 301;1FCF=20 313 342;1FD0=3B9 306;1FD1=3B9 304;1FD2=3B9 308 300;1FD3=3B9 308 301;1FD6=',\n '3B9 342;1FD7=3B9 308 342;1FD8=399 306;1FD9=399 304;1FDA=399 300;1FDB=399 301;1FDD=20 314',\n ' 300;1FDE=20 314 301;1FDF=20 314 342;1FE0=3C5 306;1FE1=3C5 304;1FE2=3C5 308 300;1FE3=3C5',\n ' 308 301;1FE4=3C1 313;1FE5=3C1 314;1FE6=3C5 342;1FE7=3C5 308 342;1FE8=3A5 306;1FE9=3A5 3',\n '04;1FEA=3A5 300;1FEB=3A5 301;1FEC=3A1 314;1FED=20 308 300;1FEE=20 308 301;1FEF=60;1FF2=3',\n 'C9 300 345;1FF3=3C9 345;1FF4=3C9 301 345;1FF6=3C9 342;1FF7=3C9 342 345;1FF8=39F 300;1FF9',\n '=39F 301;1FFA=3A9 300;1FFB=3A9 301;1FFC=3A9 345;1FFD=20 301;1FFE=20 314;2000=20;2001=20;',\n '2002=20;2003=20;2004=20;2005=20;2006=20;2007=20;2008=20;2009=20;200A=20;2011=2010;2017=2',\n '0 333;2024=2E;2025=2E 2E;2026=2E 2E 2E;202F=20;2033=2032 2032;2034=2032 2032 2032;2036=2',\n '035 2035;2037=2035 2035 2035;203C=21 21;203E=20 305;2047=3F 3F;2048=3F 21;2049=21 3F;205',\n '7=2032 2032 2032 2032;205F=20;2070=30;2071=69;2074=34;2075=35;2076=36;2077=37;2078=38;20',\n '79=39;207A=2B;207B=2212;207C=3D;207D=28;207E=29;207F=6E;2080=30;2081=31;2082=32;2083=33;',\n '2084=34;2085=35;2086=36;2087=37;2088=38;2089=39;208A=2B;208B=2212;208C=3D;208D=28;208E=2',\n '9;2090=61;2091=65;2092=6F;2093=78;2094=259;2095=68;2096=6B;2097=6C;2098=6D;2099=6E;209A=',\n '70;209B=73;209C=74;20A8=52 73;2100=61 2F 63;2101=61 2F 73;2102=43;2103=B0 43;2105=63 2F ',\n '6F;2106=63 2F 75;2107=190;2109=B0 46;210A=67;210B=48;210C=48;210D=48;210E=68;210F=127;21',\n '10=49;2111=49;2112=4C;2113=6C;2115=4E;2116=4E 6F;2119=50;211A=51;211B=52;211C=52;211D=52',\n ';2120=53 4D;2121=54 45 4C;2122=54 4D;2124=5A;2126=3A9;2128=5A;212A=4B;212B=41 30A;212C=4',\n '2;212D=43;212F=65;2130=45;2131=46;2133=4D;2134=6F;2135=5D0;2136=5D1;2137=5D2;2138=5D3;21',\n '39=69;213B=46 41 58;213C=3C0;213D=3B3;213E=393;213F=3A0;2140=2211;2145=44;2146=64;2147=6',\n '5;2148=69;2149=6A;2150=31 2044 37;2151=31 2044 39;2152=31 2044 31 30;2153=31 2044 33;215',\n '4=32 2044 33;2155=31 2044 35;2156=32 2044 35;2157=33 2044 35;2158=34 2044 35;2159=31 204',\n '4 36;215A=35 2044 36;215B=31 2044 38;215C=33 2044 38;215D=35 2044 38;215E=37 2044 38;215',\n 'F=31 2044;2160=49;2161=49 49;2162=49 49 49;2163=49 56;2164=56;2165=56 49;2166=56 49 49;2',\n '167=56 49 49 49;2168=49 58;2169=58;216A=58 49;216B=58 49 49;216C=4C;216D=43;216E=44;216F',\n '=4D;2170=69;2171=69 69;2172=69 69 69;2173=69 76;2174=76;2175=76 69;2176=76 69 69;2177=76',\n ' 69 69 69;2178=69 78;2179=78;217A=78 69;217B=78 69 69;217C=6C;217D=63;217E=64;217F=6D;21',\n '89=30 2044 33;219A=2190 338;219B=2192 338;21AE=2194 338;21CD=21D0 338;21CE=21D4 338;21CF',\n '=21D2 338;2204=2203 338;2209=2208 338;220C=220B 338;2224=2223 338;2226=2225 338;222C=222',\n 'B 222B;222D=222B 222B 222B;222F=222E 222E;2230=222E 222E 222E;2241=223C 338;2244=2243 33',\n '8;2247=2245 338;2249=2248 338;2260=3D 338;2262=2261 338;226D=224D 338;226E=3C 338;226F=3',\n 'E 338;2270=2264 338;2271=2265 338;2274=2272 338;2275=2273 338;2278=2276 338;2279=2277 33',\n '8;2280=227A 338;2281=227B 338;2284=2282 338;2285=2283 338;2288=2286 338;2289=2287 338;22',\n 'AC=22A2 338;22AD=22A8 338;22AE=22A9 338;22AF=22AB 338;22E0=227C 338;22E1=227D 338;22E2=2',\n '291 338;22E3=2292 338;22EA=22B2 338;22EB=22B3 338;22EC=22B4 338;22ED=22B5 338;2329=3008;',\n '232A=3009;2460=31;2461=32;2462=33;2463=34;2464=35;2465=36;2466=37;2467=38;2468=39;2469=3',\n '1 30;246A=31 31;246B=31 32;246C=31 33;246D=31 34;246E=31 35;246F=31 36;2470=31 37;2471=3',\n '1 38;2472=31 39;2473=32 30;2474=28 31 29;2475=28 32 29;2476=28 33 29;2477=28 34 29;2478=',\n '28 35 29;2479=28 36 29;247A=28 37 29;247B=28 38 29;247C=28 39 29;247D=28 31 30 29;247E=2',\n '8 31 31 29;247F=28 31 32 29;2480=28 31 33 29;2481=28 31 34 29;2482=28 31 35 29;2483=28 3',\n '1 36 29;2484=28 31 37 29;2485=28 31 38 29;2486=28 31 39 29;2487=28 32 30 29;2488=31 2E;2',\n '489=32 2E;248A=33 2E;248B=34 2E;248C=35 2E;248D=36 2E;248E=37 2E;248F=38 2E;2490=39 2E;2',\n '491=31 30 2E;2492=31 31 2E;2493=31 32 2E;2494=31 33 2E;2495=31 34 2E;2496=31 35 2E;2497=',\n '31 36 2E;2498=31 37 2E;2499=31 38 2E;249A=31 39 2E;249B=32 30 2E;249C=28 61 29;249D=28 6',\n '2 29;249E=28 63 29;249F=28 64 29;24A0=28 65 29;24A1=28 66 29;24A2=28 67 29;24A3=28 68 29',\n ';24A4=28 69 29;24A5=28 6A 29;24A6=28 6B 29;24A7=28 6C 29;24A8=28 6D 29;24A9=28 6E 29;24A',\n 'A=28 6F 29;24AB=28 70 29;24AC=28 71 29;24AD=28 72 29;24AE=28 73 29;24AF=28 74 29;24B0=28',\n ' 75 29;24B1=28 76 29;24B2=28 77 29;24B3=28 78 29;24B4=28 79 29;24B5=28 7A 29;24B6=41;24B',\n '7=42;24B8=43;24B9=44;24BA=45;24BB=46;24BC=47;24BD=48;24BE=49;24BF=4A;24C0=4B;24C1=4C;24C',\n '2=4D;24C3=4E;24C4=4F;24C5=50;24C6=51;24C7=52;24C8=53;24C9=54;24CA=55;24CB=56;24CC=57;24C',\n 'D=58;24CE=59;24CF=5A;24D0=61;24D1=62;24D2=63;24D3=64;24D4=65;24D5=66;24D6=67;24D7=68;24D',\n '8=69;24D9=6A;24DA=6B;24DB=6C;24DC=6D;24DD=6E;24DE=6F;24DF=70;24E0=71;24E1=72;24E2=73;24E',\n '3=74;24E4=75;24E5=76;24E6=77;24E7=78;24E8=79;24E9=7A;24EA=30;2A0C=222B 222B 222B 222B;2A',\n '74=3A 3A 3D;2A75=3D 3D;2A76=3D 3D 3D;2ADC=2ADD 338;2C7C=6A;2C7D=56;2D6F=2D61;2E9F=6BCD;2',\n 'EF3=9F9F;2F00=4E00;2F01=4E28;2F02=4E36;2F03=4E3F;2F04=4E59;2F05=4E85;2F06=4E8C;2F07=4EA0',\n ';2F08=4EBA;2F09=513F;2F0A=5165;2F0B=516B;2F0C=5182;2F0D=5196;2F0E=51AB;2F0F=51E0;2F10=51',\n 'F5;2F11=5200;2F12=529B;2F13=52F9;2F14=5315;2F15=531A;2F16=5338;2F17=5341;2F18=535C;2F19=',\n '5369;2F1A=5382;2F1B=53B6;2F1C=53C8;2F1D=53E3;2F1E=56D7;2F1F=571F;2F20=58EB;2F21=5902;2F2',\n '2=590A;2F23=5915;2F24=5927;2F25=5973;2F26=5B50;2F27=5B80;2F28=5BF8;2F29=5C0F;2F2A=5C22;2',\n 'F2B=5C38;2F2C=5C6E;2F2D=5C71;2F2E=5DDB;2F2F=5DE5;2F30=5DF1;2F31=5DFE;2F32=5E72;2F33=5E7A',\n ';2F34=5E7F;2F35=5EF4;2F36=5EFE;2F37=5F0B;2F38=5F13;2F39=5F50;2F3A=5F61;2F3B=5F73;2F3C=5F',\n 'C3;2F3D=6208;2F3E=6236;2F3F=624B;2F40=652F;2F41=6534;2F42=6587;2F43=6597;2F44=65A4;2F45=',\n '65B9;2F46=65E0;2F47=65E5;2F48=66F0;2F49=6708;2F4A=6728;2F4B=6B20;2F4C=6B62;2F4D=6B79;2F4',\n 'E=6BB3;2F4F=6BCB;2F50=6BD4;2F51=6BDB;2F52=6C0F;2F53=6C14;2F54=6C34;2F55=706B;2F56=722A;2',\n 'F57=7236;2F58=723B;2F59=723F;2F5A=7247;2F5B=7259;2F5C=725B;2F5D=72AC;2F5E=7384;2F5F=7389',\n ';2F60=74DC;2F61=74E6;2F62=7518;2F63=751F;2F64=7528;2F65=7530;2F66=758B;2F67=7592;2F68=76',\n '76;2F69=767D;2F6A=76AE;2F6B=76BF;2F6C=76EE;2F6D=77DB;2F6E=77E2;2F6F=77F3;2F70=793A;2F71=',\n '79B8;2F72=79BE;2F73=7A74;2F74=7ACB;2F75=7AF9;2F76=7C73;2F77=7CF8;2F78=7F36;2F79=7F51;2F7',\n 'A=7F8A;2F7B=7FBD;2F7C=8001;2F7D=800C;2F7E=8012;2F7F=8033;2F80=807F;2F81=8089;2F82=81E3;2',\n 'F83=81EA;2F84=81F3;2F85=81FC;2F86=820C;2F87=821B;2F88=821F;2F89=826E;2F8A=8272;2F8B=8278',\n ';2F8C=864D;2F8D=866B;2F8E=8840;2F8F=884C;2F90=8863;2F91=897E;2F92=898B;2F93=89D2;2F94=8A',\n '00;2F95=8C37;2F96=8C46;2F97=8C55;2F98=8C78;2F99=8C9D;2F9A=8D64;2F9B=8D70;2F9C=8DB3;2F9D=',\n '8EAB;2F9E=8ECA;2F9F=8F9B;2FA0=8FB0;2FA1=8FB5;2FA2=9091;2FA3=9149;2FA4=91C6;2FA5=91CC;2FA',\n '6=91D1;2FA7=9577;2FA8=9580;2FA9=961C;2FAA=96B6;2FAB=96B9;2FAC=96E8;2FAD=9751;2FAE=975E;2',\n 'FAF=9762;2FB0=9769;2FB1=97CB;2FB2=97ED;2FB3=97F3;2FB4=9801;2FB5=98A8;2FB6=98DB;2FB7=98DF',\n ';2FB8=9996;2FB9=9999;2FBA=99AC;2FBB=9AA8;2FBC=9AD8;2FBD=9ADF;2FBE=9B25;2FBF=9B2F;2FC0=9B',\n '32;2FC1=9B3C;2FC2=9B5A;2FC3=9CE5;2FC4=9E75;2FC5=9E7F;2FC6=9EA5;2FC7=9EBB;2FC8=9EC3;2FC9=',\n '9ECD;2FCA=9ED1;2FCB=9EF9;2FCC=9EFD;2FCD=9F0E;2FCE=9F13;2FCF=9F20;2FD0=9F3B;2FD1=9F4A;2FD',\n '2=9F52;2FD3=9F8D;2FD4=9F9C;2FD5=9FA0;3000=20;3036=3012;3038=5341;3039=5344;303A=5345;304',\n 'C=304B 3099;304E=304D 3099;3050=304F 3099;3052=3051 3099;3054=3053 3099;3056=3055 3099;3',\n '058=3057 3099;305A=3059 3099;305C=305B 3099;305E=305D 3099;3060=305F 3099;3062=3061 3099',\n ';3065=3064 3099;3067=3066 3099;3069=3068 3099;3070=306F 3099;3071=306F 309A;3073=3072 30',\n '99;3074=3072 309A;3076=3075 3099;3077=3075 309A;3079=3078 3099;307A=3078 309A;307C=307B ',\n '3099;307D=307B 309A;3094=3046 3099;309B=20 3099;309C=20 309A;309E=309D 3099;309F=3088 30',\n '8A;30AC=30AB 3099;30AE=30AD 3099;30B0=30AF 3099;30B2=30B1 3099;30B4=30B3 3099;30B6=30B5 ',\n '3099;30B8=30B7 3099;30BA=30B9 3099;30BC=30BB 3099;30BE=30BD 3099;30C0=30BF 3099;30C2=30C',\n '1 3099;30C5=30C4 3099;30C7=30C6 3099;30C9=30C8 3099;30D0=30CF 3099;30D1=30CF 309A;30D3=3',\n '0D2 3099;30D4=30D2 309A;30D6=30D5 3099;30D7=30D5 309A;30D9=30D8 3099;30DA=30D8 309A;30DC',\n '=30DB 3099;30DD=30DB 309A;30F4=30A6 3099;30F7=30EF 3099;30F8=30F0 3099;30F9=30F1 3099;30',\n 'FA=30F2 3099;30FE=30FD 3099;30FF=30B3 30C8;3131=1100;3132=1101;3133=11AA;3134=1102;3135=',\n '11AC;3136=11AD;3137=1103;3138=1104;3139=1105;313A=11B0;313B=11B1;313C=11B2;313D=11B3;313',\n 'E=11B4;313F=11B5;3140=111A;3141=1106;3142=1107;3143=1108;3144=1121;3145=1109;3146=110A;3',\n '147=110B;3148=110C;3149=110D;314A=110E;314B=110F;314C=1110;314D=1111;314E=1112;314F=1161',\n ';3150=1162;3151=1163;3152=1164;3153=1165;3154=1166;3155=1167;3156=1168;3157=1169;3158=11',\n '6A;3159=116B;315A=116C;315B=116D;315C=116E;315D=116F;315E=1170;315F=1171;3160=1172;3161=',\n '1173;3162=1174;3163=1175;3164=1160;3165=1114;3166=1115;3167=11C7;3168=11C8;3169=11CC;316',\n 'A=11CE;316B=11D3;316C=11D7;316D=11D9;316E=111C;316F=11DD;3170=11DF;3171=111D;3172=111E;3',\n '173=1120;3174=1122;3175=1123;3176=1127;3177=1129;3178=112B;3179=112C;317A=112D;317B=112E',\n ';317C=112F;317D=1132;317E=1136;317F=1140;3180=1147;3181=114C;3182=11F1;3183=11F2;3184=11',\n '57;3185=1158;3186=1159;3187=1184;3188=1185;3189=1188;318A=1191;318B=1192;318C=1194;318D=',\n '119E;318E=11A1;3192=4E00;3193=4E8C;3194=4E09;3195=56DB;3196=4E0A;3197=4E2D;3198=4E0B;319',\n '9=7532;319A=4E59;319B=4E19;319C=4E01;319D=5929;319E=5730;319F=4EBA;3200=28 1100 29;3201=',\n '28 1102 29;3202=28 1103 29;3203=28 1105 29;3204=28 1106 29;3205=28 1107 29;3206=28 1109 ',\n '29;3207=28 110B 29;3208=28 110C 29;3209=28 110E 29;320A=28 110F 29;320B=28 1110 29;320C=',\n '28 1111 29;320D=28 1112 29;320E=28 1100 1161 29;320F=28 1102 1161 29;3210=28 1103 1161 2',\n '9;3211=28 1105 1161 29;3212=28 1106 1161 29;3213=28 1107 1161 29;3214=28 1109 1161 29;32',\n '15=28 110B 1161 29;3216=28 110C 1161 29;3217=28 110E 1161 29;3218=28 110F 1161 29;3219=2',\n '8 1110 1161 29;321A=28 1111 1161 29;321B=28 1112 1161 29;321C=28 110C 116E 29;321D=28 11',\n '0B 1169 110C 1165 11AB 29;321E=28 110B 1169 1112 116E 29;3220=28 4E00 29;3221=28 4E8C 29',\n ';3222=28 4E09 29;3223=28 56DB 29;3224=28 4E94 29;3225=28 516D 29;3226=28 4E03 29;3227=28',\n ' 516B 29;3228=28 4E5D 29;3229=28 5341 29;322A=28 6708 29;322B=28 706B 29;322C=28 6C34 29',\n ';322D=28 6728 29;322E=28 91D1 29;322F=28 571F 29;3230=28 65E5 29;3231=28 682A 29;3232=28',\n ' 6709 29;3233=28 793E 29;3234=28 540D 29;3235=28 7279 29;3236=28 8CA1 29;3237=28 795D 29',\n ';3238=28 52B4 29;3239=28 4EE3 29;323A=28 547C 29;323B=28 5B66 29;323C=28 76E3 29;323D=28',\n ' 4F01 29;323E=28 8CC7 29;323F=28 5354 29;3240=28 796D 29;3241=28 4F11 29;3242=28 81EA 29',\n ';3243=28 81F3 29;3244=554F;3245=5E7C;3246=6587;3247=7B8F;3250=50 54 45;3251=32 31;3252=3',\n '2 32;3253=32 33;3254=32 34;3255=32 35;3256=32 36;3257=32 37;3258=32 38;3259=32 39;325A=3',\n '3 30;325B=33 31;325C=33 32;325D=33 33;325E=33 34;325F=33 35;3260=1100;3261=1102;3262=110',\n '3;3263=1105;3264=1106;3265=1107;3266=1109;3267=110B;3268=110C;3269=110E;326A=110F;326B=1',\n '110;326C=1111;326D=1112;326E=1100 1161;326F=1102 1161;3270=1103 1161;3271=1105 1161;3272',\n '=1106 1161;3273=1107 1161;3274=1109 1161;3275=110B 1161;3276=110C 1161;3277=110E 1161;32',\n '78=110F 1161;3279=1110 1161;327A=1111 1161;327B=1112 1161;327C=110E 1161 11B7 1100 1169;',\n '327D=110C 116E 110B 1174;327E=110B 116E;3280=4E00;3281=4E8C;3282=4E09;3283=56DB;3284=4E9',\n '4;3285=516D;3286=4E03;3287=516B;3288=4E5D;3289=5341;328A=6708;328B=706B;328C=6C34;328D=6',\n '728;328E=91D1;328F=571F;3290=65E5;3291=682A;3292=6709;3293=793E;3294=540D;3295=7279;3296',\n '=8CA1;3297=795D;3298=52B4;3299=79D8;329A=7537;329B=5973;329C=9069;329D=512A;329E=5370;32',\n '9F=6CE8;32A0=9805;32A1=4F11;32A2=5199;32A3=6B63;32A4=4E0A;32A5=4E2D;32A6=4E0B;32A7=5DE6;',\n '32A8=53F3;32A9=533B;32AA=5B97;32AB=5B66;32AC=76E3;32AD=4F01;32AE=8CC7;32AF=5354;32B0=591',\n 'C;32B1=33 36;32B2=33 37;32B3=33 38;32B4=33 39;32B5=34 30;32B6=34 31;32B7=34 32;32B8=34 3',\n '3;32B9=34 34;32BA=34 35;32BB=34 36;32BC=34 37;32BD=34 38;32BE=34 39;32BF=35 30;32C0=31 6',\n '708;32C1=32 6708;32C2=33 6708;32C3=34 6708;32C4=35 6708;32C5=36 6708;32C6=37 6708;32C7=3',\n '8 6708;32C8=39 6708;32C9=31 30 6708;32CA=31 31 6708;32CB=31 32 6708;32CC=48 67;32CD=65 7',\n '2 67;32CE=65 56;32CF=4C 54 44;32D0=30A2;32D1=30A4;32D2=30A6;32D3=30A8;32D4=30AA;32D5=30A',\n 'B;32D6=30AD;32D7=30AF;32D8=30B1;32D9=30B3;32DA=30B5;32DB=30B7;32DC=30B9;32DD=30BB;32DE=3',\n '0BD;32DF=30BF;32E0=30C1;32E1=30C4;32E2=30C6;32E3=30C8;32E4=30CA;32E5=30CB;32E6=30CC;32E7',\n '=30CD;32E8=30CE;32E9=30CF;32EA=30D2;32EB=30D5;32EC=30D8;32ED=30DB;32EE=30DE;32EF=30DF;32',\n 'F0=30E0;32F1=30E1;32F2=30E2;32F3=30E4;32F4=30E6;32F5=30E8;32F6=30E9;32F7=30EA;32F8=30EB;',\n '32F9=30EC;32FA=30ED;32FB=30EF;32FC=30F0;32FD=30F1;32FE=30F2;32FF=4EE4 548C;3300=30A2 30C',\n 'F 309A 30FC 30C8;3301=30A2 30EB 30D5 30A1;3302=30A2 30F3 30D8 309A 30A2;3303=30A2 30FC 3',\n '0EB;3304=30A4 30CB 30F3 30AF 3099;3305=30A4 30F3 30C1;3306=30A6 30A9 30F3;3307=30A8 30B9',\n ' 30AF 30FC 30C8 3099;3308=30A8 30FC 30AB 30FC;3309=30AA 30F3 30B9;330A=30AA 30FC 30E0;33',\n '0B=30AB 30A4 30EA;330C=30AB 30E9 30C3 30C8;330D=30AB 30ED 30EA 30FC;330E=30AB 3099 30ED ',\n '30F3;330F=30AB 3099 30F3 30DE;3310=30AD 3099 30AB 3099;3311=30AD 3099 30CB 30FC;3312=30A',\n 'D 30E5 30EA 30FC;3313=30AD 3099 30EB 30BF 3099 30FC;3314=30AD 30ED;3315=30AD 30ED 30AF 3',\n '099 30E9 30E0;3316=30AD 30ED 30E1 30FC 30C8 30EB;3317=30AD 30ED 30EF 30C3 30C8;3318=30AF',\n ' 3099 30E9 30E0;3319=30AF 3099 30E9 30E0 30C8 30F3;331A=30AF 30EB 30BB 3099 30A4 30ED;33',\n '1B=30AF 30ED 30FC 30CD;331C=30B1 30FC 30B9;331D=30B3 30EB 30CA;331E=30B3 30FC 30DB 309A;',\n '331F=30B5 30A4 30AF 30EB;3320=30B5 30F3 30C1 30FC 30E0;3321=30B7 30EA 30F3 30AF 3099;332',\n '2=30BB 30F3 30C1;3323=30BB 30F3 30C8;3324=30BF 3099 30FC 30B9;3325=30C6 3099 30B7;3326=3',\n '0C8 3099 30EB;3327=30C8 30F3;3328=30CA 30CE;3329=30CE 30C3 30C8;332A=30CF 30A4 30C4;332B',\n '=30CF 309A 30FC 30BB 30F3 30C8;332C=30CF 309A 30FC 30C4;332D=30CF 3099 30FC 30EC 30EB;33',\n '2E=30D2 309A 30A2 30B9 30C8 30EB;332F=30D2 309A 30AF 30EB;3330=30D2 309A 30B3;3331=30D2 ',\n '3099 30EB;3332=30D5 30A1 30E9 30C3 30C8 3099;3333=30D5 30A3 30FC 30C8;3334=30D5 3099 30C',\n '3 30B7 30A7 30EB;3335=30D5 30E9 30F3;3336=30D8 30AF 30BF 30FC 30EB;3337=30D8 309A 30BD;3',\n '338=30D8 309A 30CB 30D2;3339=30D8 30EB 30C4;333A=30D8 309A 30F3 30B9;333B=30D8 309A 30FC',\n ' 30B7 3099;333C=30D8 3099 30FC 30BF;333D=30DB 309A 30A4 30F3 30C8;333E=30DB 3099 30EB 30',\n 'C8;333F=30DB 30F3;3340=30DB 309A 30F3 30C8 3099;3341=30DB 30FC 30EB;3342=30DB 30FC 30F3;',\n '3343=30DE 30A4 30AF 30ED;3344=30DE 30A4 30EB;3345=30DE 30C3 30CF;3346=30DE 30EB 30AF;334',\n '7=30DE 30F3 30B7 30E7 30F3;3348=30DF 30AF 30ED 30F3;3349=30DF 30EA;334A=30DF 30EA 30CF 3',\n '099 30FC 30EB;334B=30E1 30AB 3099;334C=30E1 30AB 3099 30C8 30F3;334D=30E1 30FC 30C8 30EB',\n ';334E=30E4 30FC 30C8 3099;334F=30E4 30FC 30EB;3350=30E6 30A2 30F3;3351=30EA 30C3 30C8 30',\n 'EB;3352=30EA 30E9;3353=30EB 30D2 309A 30FC;3354=30EB 30FC 30D5 3099 30EB;3355=30EC 30E0;',\n '3356=30EC 30F3 30C8 30B1 3099 30F3;3357=30EF 30C3 30C8;3358=30 70B9;3359=31 70B9;335A=32',\n ' 70B9;335B=33 70B9;335C=34 70B9;335D=35 70B9;335E=36 70B9;335F=37 70B9;3360=38 70B9;3361',\n '=39 70B9;3362=31 30 70B9;3363=31 31 70B9;3364=31 32 70B9;3365=31 33 70B9;3366=31 34 70B9',\n ';3367=31 35 70B9;3368=31 36 70B9;3369=31 37 70B9;336A=31 38 70B9;336B=31 39 70B9;336C=32',\n ' 30 70B9;336D=32 31 70B9;336E=32 32 70B9;336F=32 33 70B9;3370=32 34 70B9;3371=68 50 61;3',\n '372=64 61;3373=41 55;3374=62 61 72;3375=6F 56;3376=70 63;3377=64 6D;3378=64 6D 32;3379=6',\n '4 6D 33;337A=49 55;337B=5E73 6210;337C=662D 548C;337D=5927 6B63;337E=660E 6CBB;337F=682A',\n ' 5F0F 4F1A 793E;3380=70 41;3381=6E 41;3382=3BC 41;3383=6D 41;3384=6B 41;3385=4B 42;3386=',\n '4D 42;3387=47 42;3388=63 61 6C;3389=6B 63 61 6C;338A=70 46;338B=6E 46;338C=3BC 46;338D=3',\n 'BC 67;338E=6D 67;338F=6B 67;3390=48 7A;3391=6B 48 7A;3392=4D 48 7A;3393=47 48 7A;3394=54',\n ' 48 7A;3395=3BC 6C;3396=6D 6C;3397=64 6C;3398=6B 6C;3399=66 6D;339A=6E 6D;339B=3BC 6D;33',\n '9C=6D 6D;339D=63 6D;339E=6B 6D;339F=6D 6D 32;33A0=63 6D 32;33A1=6D 32;33A2=6B 6D 32;33A3',\n '=6D 6D 33;33A4=63 6D 33;33A5=6D 33;33A6=6B 6D 33;33A7=6D 2215 73;33A8=6D 2215 73 32;33A9',\n '=50 61;33AA=6B 50 61;33AB=4D 50 61;33AC=47 50 61;33AD=72 61 64;33AE=72 61 64 2215 73;33A',\n 'F=72 61 64 2215 73 32;33B0=70 73;33B1=6E 73;33B2=3BC 73;33B3=6D 73;33B4=70 56;33B5=6E 56',\n ';33B6=3BC 56;33B7=6D 56;33B8=6B 56;33B9=4D 56;33BA=70 57;33BB=6E 57;33BC=3BC 57;33BD=6D ',\n '57;33BE=6B 57;33BF=4D 57;33C0=6B 3A9;33C1=4D 3A9;33C2=61 2E 6D 2E;33C3=42 71;33C4=63 63;',\n '33C5=63 64;33C6=43 2215 6B 67;33C7=43 6F 2E;33C8=64 42;33C9=47 79;33CA=68 61;33CB=48 50;',\n '33CC=69 6E;33CD=4B 4B;33CE=4B 4D;33CF=6B 74;33D0=6C 6D;33D1=6C 6E;33D2=6C 6F 67;33D3=6C ',\n '78;33D4=6D 62;33D5=6D 69 6C;33D6=6D 6F 6C;33D7=50 48;33D8=70 2E 6D 2E;33D9=50 50 4D;33DA',\n '=50 52;33DB=73 72;33DC=53 76;33DD=57 62;33DE=56 2215 6D;33DF=41 2215 6D;33E0=31 65E5;33E',\n '1=32 65E5;33E2=33 65E5;33E3=34 65E5;33E4=35 65E5;33E5=36 65E5;33E6=37 65E5;33E7=38 65E5;',\n '33E8=39 65E5;33E9=31 30 65E5;33EA=31 31 65E5;33EB=31 32 65E5;33EC=31 33 65E5;33ED=31 34 ',\n '65E5;33EE=31 35 65E5;33EF=31 36 65E5;33F0=31 37 65E5;33F1=31 38 65E5;33F2=31 39 65E5;33F',\n '3=32 30 65E5;33F4=32 31 65E5;33F5=32 32 65E5;33F6=32 33 65E5;33F7=32 34 65E5;33F8=32 35 ',\n '65E5;33F9=32 36 65E5;33FA=32 37 65E5;33FB=32 38 65E5;33FC=32 39 65E5;33FD=33 30 65E5;33F',\n 'E=33 31 65E5;33FF=67 61 6C;A69C=44A;A69D=44C;A770=A76F;A7F2=43;A7F3=46;A7F4=51;A7F8=126;',\n 'A7F9=153;AB5C=A727;AB5D=AB37;AB5E=26B;AB5F=AB52;AB69=28D;F900=8C48;F901=66F4;F902=8ECA;F',\n '903=8CC8;F904=6ED1;F905=4E32;F906=53E5;F907=9F9C;F908=9F9C;F909=5951;F90A=91D1;F90B=5587',\n ';F90C=5948;F90D=61F6;F90E=7669;F90F=7F85;F910=863F;F911=87BA;F912=88F8;F913=908F;F914=6A',\n '02;F915=6D1B;F916=70D9;F917=73DE;F918=843D;F919=916A;F91A=99F1;F91B=4E82;F91C=5375;F91D=',\n '6B04;F91E=721B;F91F=862D;F920=9E1E;F921=5D50;F922=6FEB;F923=85CD;F924=8964;F925=62C9;F92',\n '6=81D8;F927=881F;F928=5ECA;F929=6717;F92A=6D6A;F92B=72FC;F92C=90CE;F92D=4F86;F92E=51B7;F',\n '92F=52DE;F930=64C4;F931=6AD3;F932=7210;F933=76E7;F934=8001;F935=8606;F936=865C;F937=8DEF',\n ';F938=9732;F939=9B6F;F93A=9DFA;F93B=788C;F93C=797F;F93D=7DA0;F93E=83C9;F93F=9304;F940=9E',\n '7F;F941=8AD6;F942=58DF;F943=5F04;F944=7C60;F945=807E;F946=7262;F947=78CA;F948=8CC2;F949=',\n '96F7;F94A=58D8;F94B=5C62;F94C=6A13;F94D=6DDA;F94E=6F0F;F94F=7D2F;F950=7E37;F951=964B;F95',\n '2=52D2;F953=808B;F954=51DC;F955=51CC;F956=7A1C;F957=7DBE;F958=83F1;F959=9675;F95A=8B80;F',\n '95B=62CF;F95C=6A02;F95D=8AFE;F95E=4E39;F95F=5BE7;F960=6012;F961=7387;F962=7570;F963=5317',\n ';F964=78FB;F965=4FBF;F966=5FA9;F967=4E0D;F968=6CCC;F969=6578;F96A=7D22;F96B=53C3;F96C=58',\n '5E;F96D=7701;F96E=8449;F96F=8AAA;F970=6BBA;F971=8FB0;F972=6C88;F973=62FE;F974=82E5;F975=',\n '63A0;F976=7565;F977=4EAE;F978=5169;F979=51C9;F97A=6881;F97B=7CE7;F97C=826F;F97D=8AD2;F97',\n 'E=91CF;F97F=52F5;F980=5442;F981=5973;F982=5EEC;F983=65C5;F984=6FFE;F985=792A;F986=95AD;F',\n '987=9A6A;F988=9E97;F989=9ECE;F98A=529B;F98B=66C6;F98C=6B77;F98D=8F62;F98E=5E74;F98F=6190',\n ';F990=6200;F991=649A;F992=6F23;F993=7149;F994=7489;F995=79CA;F996=7DF4;F997=806F;F998=8F',\n '26;F999=84EE;F99A=9023;F99B=934A;F99C=5217;F99D=52A3;F99E=54BD;F99F=70C8;F9A0=88C2;F9A1=',\n '8AAA;F9A2=5EC9;F9A3=5FF5;F9A4=637B;F9A5=6BAE;F9A6=7C3E;F9A7=7375;F9A8=4EE4;F9A9=56F9;F9A',\n 'A=5BE7;F9AB=5DBA;F9AC=601C;F9AD=73B2;F9AE=7469;F9AF=7F9A;F9B0=8046;F9B1=9234;F9B2=96F6;F',\n '9B3=9748;F9B4=9818;F9B5=4F8B;F9B6=79AE;F9B7=91B4;F9B8=96B8;F9B9=60E1;F9BA=4E86;F9BB=50DA',\n ';F9BC=5BEE;F9BD=5C3F;F9BE=6599;F9BF=6A02;F9C0=71CE;F9C1=7642;F9C2=84FC;F9C3=907C;F9C4=9F',\n '8D;F9C5=6688;F9C6=962E;F9C7=5289;F9C8=677B;F9C9=67F3;F9CA=6D41;F9CB=6E9C;F9CC=7409;F9CD=',\n '7559;F9CE=786B;F9CF=7D10;F9D0=985E;F9D1=516D;F9D2=622E;F9D3=9678;F9D4=502B;F9D5=5D19;F9D',\n '6=6DEA;F9D7=8F2A;F9D8=5F8B;F9D9=6144;F9DA=6817;F9DB=7387;F9DC=9686;F9DD=5229;F9DE=540F;F',\n '9DF=5C65;F9E0=6613;F9E1=674E;F9E2=68A8;F9E3=6CE5;F9E4=7406;F9E5=75E2;F9E6=7F79;F9E7=88CF',\n ';F9E8=88E1;F9E9=91CC;F9EA=96E2;F9EB=533F;F9EC=6EBA;F9ED=541D;F9EE=71D0;F9EF=7498;F9F0=85',\n 'FA;F9F1=96A3;F9F2=9C57;F9F3=9E9F;F9F4=6797;F9F5=6DCB;F9F6=81E8;F9F7=7ACB;F9F8=7B20;F9F9=',\n '7C92;F9FA=72C0;F9FB=7099;F9FC=8B58;F9FD=4EC0;F9FE=8336;F9FF=523A;FA00=5207;FA01=5EA6;FA0',\n '2=62D3;FA03=7CD6;FA04=5B85;FA05=6D1E;FA06=66B4;FA07=8F3B;FA08=884C;FA09=964D;FA0A=898B;F',\n 'A0B=5ED3;FA0C=5140;FA0D=55C0;FA10=585A;FA12=6674;FA15=51DE;FA16=732A;FA17=76CA;FA18=793C',\n ';FA19=795E;FA1A=7965;FA1B=798F;FA1C=9756;FA1D=7CBE;FA1E=7FBD;FA20=8612;FA22=8AF8;FA25=90',\n '38;FA26=90FD;FA2A=98EF;FA2B=98FC;FA2C=9928;FA2D=9DB4;FA2E=90DE;FA2F=96B7;FA30=4FAE;FA31=',\n '50E7;FA32=514D;FA33=52C9;FA34=52E4;FA35=5351;FA36=559D;FA37=5606;FA38=5668;FA39=5840;FA3',\n 'A=58A8;FA3B=5C64;FA3C=5C6E;FA3D=6094;FA3E=6168;FA3F=618E;FA40=61F2;FA41=654F;FA42=65E2;F',\n 'A43=6691;FA44=6885;FA45=6D77;FA46=6E1A;FA47=6F22;FA48=716E;FA49=722B;FA4A=7422;FA4B=7891',\n ';FA4C=793E;FA4D=7949;FA4E=7948;FA4F=7950;FA50=7956;FA51=795D;FA52=798D;FA53=798E;FA54=7A',\n '40;FA55=7A81;FA56=7BC0;FA57=7DF4;FA58=7E09;FA59=7E41;FA5A=7F72;FA5B=8005;FA5C=81ED;FA5D=',\n '8279;FA5E=8279;FA5F=8457;FA60=8910;FA61=8996;FA62=8B01;FA63=8B39;FA64=8CD3;FA65=8D08;FA6',\n '6=8FB6;FA67=9038;FA68=96E3;FA69=97FF;FA6A=983B;FA6B=6075;FA6C=242EE;FA6D=8218;FA70=4E26;',\n 'FA71=51B5;FA72=5168;FA73=4F80;FA74=5145;FA75=5180;FA76=52C7;FA77=52FA;FA78=559D;FA79=555',\n '5;FA7A=5599;FA7B=55E2;FA7C=585A;FA7D=58B3;FA7E=5944;FA7F=5954;FA80=5A62;FA81=5B28;FA82=5',\n 'ED2;FA83=5ED9;FA84=5F69;FA85=5FAD;FA86=60D8;FA87=614E;FA88=6108;FA89=618E;FA8A=6160;FA8B',\n '=61F2;FA8C=6234;FA8D=63C4;FA8E=641C;FA8F=6452;FA90=6556;FA91=6674;FA92=6717;FA93=671B;FA',\n '94=6756;FA95=6B79;FA96=6BBA;FA97=6D41;FA98=6EDB;FA99=6ECB;FA9A=6F22;FA9B=701E;FA9C=716E;',\n 'FA9D=77A7;FA9E=7235;FA9F=72AF;FAA0=732A;FAA1=7471;FAA2=7506;FAA3=753B;FAA4=761D;FAA5=761',\n 'F;FAA6=76CA;FAA7=76DB;FAA8=76F4;FAA9=774A;FAAA=7740;FAAB=78CC;FAAC=7AB1;FAAD=7BC0;FAAE=7',\n 'C7B;FAAF=7D5B;FAB0=7DF4;FAB1=7F3E;FAB2=8005;FAB3=8352;FAB4=83EF;FAB5=8779;FAB6=8941;FAB7',\n '=8986;FAB8=8996;FAB9=8ABF;FABA=8AF8;FABB=8ACB;FABC=8B01;FABD=8AFE;FABE=8AED;FABF=8B39;FA',\n 'C0=8B8A;FAC1=8D08;FAC2=8F38;FAC3=9072;FAC4=9199;FAC5=9276;FAC6=967C;FAC7=96E3;FAC8=9756;',\n 'FAC9=97DB;FACA=97FF;FACB=980B;FACC=983B;FACD=9B12;FACE=9F9C;FACF=2284A;FAD0=22844;FAD1=2',\n '33D5;FAD2=3B9D;FAD3=4018;FAD4=4039;FAD5=25249;FAD6=25CD0;FAD7=27ED3;FAD8=9F43;FAD9=9F8E;',\n 'FB00=66 66;FB01=66 69;FB02=66 6C;FB03=66 66 69;FB04=66 66 6C;FB05=73 74;FB06=73 74;FB13=',\n '574 576;FB14=574 565;FB15=574 56B;FB16=57E 576;FB17=574 56D;FB1D=5D9 5B4;FB1F=5F2 5B7;FB',\n '20=5E2;FB21=5D0;FB22=5D3;FB23=5D4;FB24=5DB;FB25=5DC;FB26=5DD;FB27=5E8;FB28=5EA;FB29=2B;F',\n 'B2A=5E9 5C1;FB2B=5E9 5C2;FB2C=5E9 5BC 5C1;FB2D=5E9 5BC 5C2;FB2E=5D0 5B7;FB2F=5D0 5B8;FB3',\n '0=5D0 5BC;FB31=5D1 5BC;FB32=5D2 5BC;FB33=5D3 5BC;FB34=5D4 5BC;FB35=5D5 5BC;FB36=5D6 5BC;',\n 'FB38=5D8 5BC;FB39=5D9 5BC;FB3A=5DA 5BC;FB3B=5DB 5BC;FB3C=5DC 5BC;FB3E=5DE 5BC;FB40=5E0 5',\n 'BC;FB41=5E1 5BC;FB43=5E3 5BC;FB44=5E4 5BC;FB46=5E6 5BC;FB47=5E7 5BC;FB48=5E8 5BC;FB49=5E',\n '9 5BC;FB4A=5EA 5BC;FB4B=5D5 5B9;FB4C=5D1 5BF;FB4D=5DB 5BF;FB4E=5E4 5BF;FB4F=5D0 5DC;FB50',\n '=671;FB51=671;FB52=67B;FB53=67B;FB54=67B;FB55=67B;FB56=67E;FB57=67E;FB58=67E;FB59=67E;FB',\n '5A=680;FB5B=680;FB5C=680;FB5D=680;FB5E=67A;FB5F=67A;FB60=67A;FB61=67A;FB62=67F;FB63=67F;',\n 'FB64=67F;FB65=67F;FB66=679;FB67=679;FB68=679;FB69=679;FB6A=6A4;FB6B=6A4;FB6C=6A4;FB6D=6A',\n '4;FB6E=6A6;FB6F=6A6;FB70=6A6;FB71=6A6;FB72=684;FB73=684;FB74=684;FB75=684;FB76=683;FB77=',\n '683;FB78=683;FB79=683;FB7A=686;FB7B=686;FB7C=686;FB7D=686;FB7E=687;FB7F=687;FB80=687;FB8',\n '1=687;FB82=68D;FB83=68D;FB84=68C;FB85=68C;FB86=68E;FB87=68E;FB88=688;FB89=688;FB8A=698;F',\n 'B8B=698;FB8C=691;FB8D=691;FB8E=6A9;FB8F=6A9;FB90=6A9;FB91=6A9;FB92=6AF;FB93=6AF;FB94=6AF',\n ';FB95=6AF;FB96=6B3;FB97=6B3;FB98=6B3;FB99=6B3;FB9A=6B1;FB9B=6B1;FB9C=6B1;FB9D=6B1;FB9E=6',\n 'BA;FB9F=6BA;FBA0=6BB;FBA1=6BB;FBA2=6BB;FBA3=6BB;FBA4=6D5 654;FBA5=6D5 654;FBA6=6C1;FBA7=',\n '6C1;FBA8=6C1;FBA9=6C1;FBAA=6BE;FBAB=6BE;FBAC=6BE;FBAD=6BE;FBAE=6D2;FBAF=6D2;FBB0=6D2 654',\n ';FBB1=6D2 654;FBD3=6AD;FBD4=6AD;FBD5=6AD;FBD6=6AD;FBD7=6C7;FBD8=6C7;FBD9=6C6;FBDA=6C6;FB',\n 'DB=6C8;FBDC=6C8;FBDD=6C7 674;FBDE=6CB;FBDF=6CB;FBE0=6C5;FBE1=6C5;FBE2=6C9;FBE3=6C9;FBE4=',\n '6D0;FBE5=6D0;FBE6=6D0;FBE7=6D0;FBE8=649;FBE9=649;FBEA=64A 654 627;FBEB=64A 654 627;FBEC=',\n '64A 654 6D5;FBED=64A 654 6D5;FBEE=64A 654 648;FBEF=64A 654 648;FBF0=64A 654 6C7;FBF1=64A',\n ' 654 6C7;FBF2=64A 654 6C6;FBF3=64A 654 6C6;FBF4=64A 654 6C8;FBF5=64A 654 6C8;FBF6=64A 65',\n '4 6D0;FBF7=64A 654 6D0;FBF8=64A 654 6D0;FBF9=64A 654 649;FBFA=64A 654 649;FBFB=64A 654 6',\n '49;FBFC=6CC;FBFD=6CC;FBFE=6CC;FBFF=6CC;FC00=64A 654 62C;FC01=64A 654 62D;FC02=64A 654 64',\n '5;FC03=64A 654 649;FC04=64A 654 64A;FC05=628 62C;FC06=628 62D;FC07=628 62E;FC08=628 645;',\n 'FC09=628 649;FC0A=628 64A;FC0B=62A 62C;FC0C=62A 62D;FC0D=62A 62E;FC0E=62A 645;FC0F=62A 6',\n '49;FC10=62A 64A;FC11=62B 62C;FC12=62B 645;FC13=62B 649;FC14=62B 64A;FC15=62C 62D;FC16=62',\n 'C 645;FC17=62D 62C;FC18=62D 645;FC19=62E 62C;FC1A=62E 62D;FC1B=62E 645;FC1C=633 62C;FC1D',\n '=633 62D;FC1E=633 62E;FC1F=633 645;FC20=635 62D;FC21=635 645;FC22=636 62C;FC23=636 62D;F',\n 'C24=636 62E;FC25=636 645;FC26=637 62D;FC27=637 645;FC28=638 645;FC29=639 62C;FC2A=639 64',\n '5;FC2B=63A 62C;FC2C=63A 645;FC2D=641 62C;FC2E=641 62D;FC2F=641 62E;FC30=641 645;FC31=641',\n ' 649;FC32=641 64A;FC33=642 62D;FC34=642 645;FC35=642 649;FC36=642 64A;FC37=643 627;FC38=',\n '643 62C;FC39=643 62D;FC3A=643 62E;FC3B=643 644;FC3C=643 645;FC3D=643 649;FC3E=643 64A;FC',\n '3F=644 62C;FC40=644 62D;FC41=644 62E;FC42=644 645;FC43=644 649;FC44=644 64A;FC45=645 62C',\n ';FC46=645 62D;FC47=645 62E;FC48=645 645;FC49=645 649;FC4A=645 64A;FC4B=646 62C;FC4C=646 ',\n '62D;FC4D=646 62E;FC4E=646 645;FC4F=646 649;FC50=646 64A;FC51=647 62C;FC52=647 645;FC53=6',\n '47 649;FC54=647 64A;FC55=64A 62C;FC56=64A 62D;FC57=64A 62E;FC58=64A 645;FC59=64A 649;FC5',\n 'A=64A 64A;FC5B=630 670;FC5C=631 670;FC5D=649 670;FC5E=20 64C 651;FC5F=20 64D 651;FC60=20',\n ' 64E 651;FC61=20 64F 651;FC62=20 650 651;FC63=20 651 670;FC64=64A 654 631;FC65=64A 654 6',\n '32;FC66=64A 654 645;FC67=64A 654 646;FC68=64A 654 649;FC69=64A 654 64A;FC6A=628 631;FC6B',\n '=628 632;FC6C=628 645;FC6D=628 646;FC6E=628 649;FC6F=628 64A;FC70=62A 631;FC71=62A 632;F',\n 'C72=62A 645;FC73=62A 646;FC74=62A 649;FC75=62A 64A;FC76=62B 631;FC77=62B 632;FC78=62B 64',\n '5;FC79=62B 646;FC7A=62B 649;FC7B=62B 64A;FC7C=641 649;FC7D=641 64A;FC7E=642 649;FC7F=642',\n ' 64A;FC80=643 627;FC81=643 644;FC82=643 645;FC83=643 649;FC84=643 64A;FC85=644 645;FC86=',\n '644 649;FC87=644 64A;FC88=645 627;FC89=645 645;FC8A=646 631;FC8B=646 632;FC8C=646 645;FC',\n '8D=646 646;FC8E=646 649;FC8F=646 64A;FC90=649 670;FC91=64A 631;FC92=64A 632;FC93=64A 645',\n ';FC94=64A 646;FC95=64A 649;FC96=64A 64A;FC97=64A 654 62C;FC98=64A 654 62D;FC99=64A 654 6',\n '2E;FC9A=64A 654 645;FC9B=64A 654 647;FC9C=628 62C;FC9D=628 62D;FC9E=628 62E;FC9F=628 645',\n ';FCA0=628 647;FCA1=62A 62C;FCA2=62A 62D;FCA3=62A 62E;FCA4=62A 645;FCA5=62A 647;FCA6=62B ',\n '645;FCA7=62C 62D;FCA8=62C 645;FCA9=62D 62C;FCAA=62D 645;FCAB=62E 62C;FCAC=62E 645;FCAD=6',\n '33 62C;FCAE=633 62D;FCAF=633 62E;FCB0=633 645;FCB1=635 62D;FCB2=635 62E;FCB3=635 645;FCB',\n '4=636 62C;FCB5=636 62D;FCB6=636 62E;FCB7=636 645;FCB8=637 62D;FCB9=638 645;FCBA=639 62C;',\n 'FCBB=639 645;FCBC=63A 62C;FCBD=63A 645;FCBE=641 62C;FCBF=641 62D;FCC0=641 62E;FCC1=641 6',\n '45;FCC2=642 62D;FCC3=642 645;FCC4=643 62C;FCC5=643 62D;FCC6=643 62E;FCC7=643 644;FCC8=64',\n '3 645;FCC9=644 62C;FCCA=644 62D;FCCB=644 62E;FCCC=644 645;FCCD=644 647;FCCE=645 62C;FCCF',\n '=645 62D;FCD0=645 62E;FCD1=645 645;FCD2=646 62C;FCD3=646 62D;FCD4=646 62E;FCD5=646 645;F',\n 'CD6=646 647;FCD7=647 62C;FCD8=647 645;FCD9=647 670;FCDA=64A 62C;FCDB=64A 62D;FCDC=64A 62',\n 'E;FCDD=64A 645;FCDE=64A 647;FCDF=64A 654 645;FCE0=64A 654 647;FCE1=628 645;FCE2=628 647;',\n 'FCE3=62A 645;FCE4=62A 647;FCE5=62B 645;FCE6=62B 647;FCE7=633 645;FCE8=633 647;FCE9=634 6',\n '45;FCEA=634 647;FCEB=643 644;FCEC=643 645;FCED=644 645;FCEE=646 645;FCEF=646 647;FCF0=64',\n 'A 645;FCF1=64A 647;FCF2=640 64E 651;FCF3=640 64F 651;FCF4=640 650 651;FCF5=637 649;FCF6=',\n '637 64A;FCF7=639 649;FCF8=639 64A;FCF9=63A 649;FCFA=63A 64A;FCFB=633 649;FCFC=633 64A;FC',\n 'FD=634 649;FCFE=634 64A;FCFF=62D 649;FD00=62D 64A;FD01=62C 649;FD02=62C 64A;FD03=62E 649',\n ';FD04=62E 64A;FD05=635 649;FD06=635 64A;FD07=636 649;FD08=636 64A;FD09=634 62C;FD0A=634 ',\n '62D;FD0B=634 62E;FD0C=634 645;FD0D=634 631;FD0E=633 631;FD0F=635 631;FD10=636 631;FD11=6',\n '37 649;FD12=637 64A;FD13=639 649;FD14=639 64A;FD15=63A 649;FD16=63A 64A;FD17=633 649;FD1',\n '8=633 64A;FD19=634 649;FD1A=634 64A;FD1B=62D 649;FD1C=62D 64A;FD1D=62C 649;FD1E=62C 64A;',\n 'FD1F=62E 649;FD20=62E 64A;FD21=635 649;FD22=635 64A;FD23=636 649;FD24=636 64A;FD25=634 6',\n '2C;FD26=634 62D;FD27=634 62E;FD28=634 645;FD29=634 631;FD2A=633 631;FD2B=635 631;FD2C=63',\n '6 631;FD2D=634 62C;FD2E=634 62D;FD2F=634 62E;FD30=634 645;FD31=633 647;FD32=634 647;FD33',\n '=637 645;FD34=633 62C;FD35=633 62D;FD36=633 62E;FD37=634 62C;FD38=634 62D;FD39=634 62E;F',\n 'D3A=637 645;FD3B=638 645;FD3C=627 64B;FD3D=627 64B;FD50=62A 62C 645;FD51=62A 62D 62C;FD5',\n '2=62A 62D 62C;FD53=62A 62D 645;FD54=62A 62E 645;FD55=62A 645 62C;FD56=62A 645 62D;FD57=6',\n '2A 645 62E;FD58=62C 645 62D;FD59=62C 645 62D;FD5A=62D 645 64A;FD5B=62D 645 649;FD5C=633 ',\n '62D 62C;FD5D=633 62C 62D;FD5E=633 62C 649;FD5F=633 645 62D;FD60=633 645 62D;FD61=633 645',\n ' 62C;FD62=633 645 645;FD63=633 645 645;FD64=635 62D 62D;FD65=635 62D 62D;FD66=635 645 64',\n '5;FD67=634 62D 645;FD68=634 62D 645;FD69=634 62C 64A;FD6A=634 645 62E;FD6B=634 645 62E;F',\n 'D6C=634 645 645;FD6D=634 645 645;FD6E=636 62D 649;FD6F=636 62E 645;FD70=636 62E 645;FD71',\n '=637 645 62D;FD72=637 645 62D;FD73=637 645 645;FD74=637 645 64A;FD75=639 62C 645;FD76=63',\n '9 645 645;FD77=639 645 645;FD78=639 645 649;FD79=63A 645 645;FD7A=63A 645 64A;FD7B=63A 6',\n '45 649;FD7C=641 62E 645;FD7D=641 62E 645;FD7E=642 645 62D;FD7F=642 645 645;FD80=644 62D ',\n '645;FD81=644 62D 64A;FD82=644 62D 649;FD83=644 62C 62C;FD84=644 62C 62C;FD85=644 62E 645',\n ';FD86=644 62E 645;FD87=644 645 62D;FD88=644 645 62D;FD89=645 62D 62C;FD8A=645 62D 645;FD',\n '8B=645 62D 64A;FD8C=645 62C 62D;FD8D=645 62C 645;FD8E=645 62E 62C;FD8F=645 62E 645;FD92=',\n '645 62C 62E;FD93=647 645 62C;FD94=647 645 645;FD95=646 62D 645;FD96=646 62D 649;FD97=646',\n ' 62C 645;FD98=646 62C 645;FD99=646 62C 649;FD9A=646 645 64A;FD9B=646 645 649;FD9C=64A 64',\n '5 645;FD9D=64A 645 645;FD9E=628 62E 64A;FD9F=62A 62C 64A;FDA0=62A 62C 649;FDA1=62A 62E 6',\n '4A;FDA2=62A 62E 649;FDA3=62A 645 64A;FDA4=62A 645 649;FDA5=62C 645 64A;FDA6=62C 62D 649;',\n 'FDA7=62C 645 649;FDA8=633 62E 649;FDA9=635 62D 64A;FDAA=634 62D 64A;FDAB=636 62D 64A;FDA',\n 'C=644 62C 64A;FDAD=644 645 64A;FDAE=64A 62D 64A;FDAF=64A 62C 64A;FDB0=64A 645 64A;FDB1=6',\n '45 645 64A;FDB2=642 645 64A;FDB3=646 62D 64A;FDB4=642 645 62D;FDB5=644 62D 645;FDB6=639 ',\n '645 64A;FDB7=643 645 64A;FDB8=646 62C 62D;FDB9=645 62E 64A;FDBA=644 62C 645;FDBB=643 645',\n ' 645;FDBC=644 62C 645;FDBD=646 62C 62D;FDBE=62C 62D 64A;FDBF=62D 62C 64A;FDC0=645 62C 64',\n 'A;FDC1=641 645 64A;FDC2=628 62D 64A;FDC3=643 645 645;FDC4=639 62C 645;FDC5=635 645 645;F',\n 'DC6=633 62E 64A;FDC7=646 62C 64A;FDF0=635 644 6D2;FDF1=642 644 6D2;FDF2=627 644 644 647;',\n 'FDF3=627 643 628 631;FDF4=645 62D 645 62F;FDF5=635 644 639 645;FDF6=631 633 648 644;FDF7',\n '=639 644 64A 647;FDF8=648 633 644 645;FDF9=635 644 649;FDFA=635 644 649 20 627 644 644 6',\n '47 20 639 644 64A 647 20 648 633 644 645;FDFB=62C 644 20 62C 644 627 644 647;FDFC=631 6C',\n 'C 627 644;FE10=2C;FE11=3001;FE12=3002;FE13=3A;FE14=3B;FE15=21;FE16=3F;FE17=3016;FE18=301',\n '7;FE19=2E 2E 2E;FE30=2E 2E;FE31=2014;FE32=2013;FE33=5F;FE34=5F;FE35=28;FE36=29;FE37=7B;F',\n 'E38=7D;FE39=3014;FE3A=3015;FE3B=3010;FE3C=3011;FE3D=300A;FE3E=300B;FE3F=3008;FE40=3009;F',\n 'E41=300C;FE42=300D;FE43=300E;FE44=300F;FE47=5B;FE48=5D;FE49=20 305;FE4A=20 305;FE4B=20 3',\n '05;FE4C=20 305;FE4D=5F;FE4E=5F;FE4F=5F;FE50=2C;FE51=3001;FE52=2E;FE54=3B;FE55=3A;FE56=3F',\n ';FE57=21;FE58=2014;FE59=28;FE5A=29;FE5B=7B;FE5C=7D;FE5D=3014;FE5E=3015;FE5F=23;FE60=26;F',\n 'E61=2A;FE62=2B;FE63=2D;FE64=3C;FE65=3E;FE66=3D;FE68=5C;FE69=24;FE6A=25;FE6B=40;FE70=20 6',\n '4B;FE71=640 64B;FE72=20 64C;FE74=20 64D;FE76=20 64E;FE77=640 64E;FE78=20 64F;FE79=640 64',\n 'F;FE7A=20 650;FE7B=640 650;FE7C=20 651;FE7D=640 651;FE7E=20 652;FE7F=640 652;FE80=621;FE',\n '81=627 653;FE82=627 653;FE83=627 654;FE84=627 654;FE85=648 654;FE86=648 654;FE87=627 655',\n ';FE88=627 655;FE89=64A 654;FE8A=64A 654;FE8B=64A 654;FE8C=64A 654;FE8D=627;FE8E=627;FE8F',\n '=628;FE90=628;FE91=628;FE92=628;FE93=629;FE94=629;FE95=62A;FE96=62A;FE97=62A;FE98=62A;FE',\n '99=62B;FE9A=62B;FE9B=62B;FE9C=62B;FE9D=62C;FE9E=62C;FE9F=62C;FEA0=62C;FEA1=62D;FEA2=62D;',\n 'FEA3=62D;FEA4=62D;FEA5=62E;FEA6=62E;FEA7=62E;FEA8=62E;FEA9=62F;FEAA=62F;FEAB=630;FEAC=63',\n '0;FEAD=631;FEAE=631;FEAF=632;FEB0=632;FEB1=633;FEB2=633;FEB3=633;FEB4=633;FEB5=634;FEB6=',\n '634;FEB7=634;FEB8=634;FEB9=635;FEBA=635;FEBB=635;FEBC=635;FEBD=636;FEBE=636;FEBF=636;FEC',\n '0=636;FEC1=637;FEC2=637;FEC3=637;FEC4=637;FEC5=638;FEC6=638;FEC7=638;FEC8=638;FEC9=639;F',\n 'ECA=639;FECB=639;FECC=639;FECD=63A;FECE=63A;FECF=63A;FED0=63A;FED1=641;FED2=641;FED3=641',\n ';FED4=641;FED5=642;FED6=642;FED7=642;FED8=642;FED9=643;FEDA=643;FEDB=643;FEDC=643;FEDD=6',\n '44;FEDE=644;FEDF=644;FEE0=644;FEE1=645;FEE2=645;FEE3=645;FEE4=645;FEE5=646;FEE6=646;FEE7',\n '=646;FEE8=646;FEE9=647;FEEA=647;FEEB=647;FEEC=647;FEED=648;FEEE=648;FEEF=649;FEF0=649;FE',\n 'F1=64A;FEF2=64A;FEF3=64A;FEF4=64A;FEF5=644 627 653;FEF6=644 627 653;FEF7=644 627 654;FEF',\n '8=644 627 654;FEF9=644 627 655;FEFA=644 627 655;FEFB=644 627;FEFC=644 627;FF01=21;FF02=2',\n '2;FF03=23;FF04=24;FF05=25;FF06=26;FF07=27;FF08=28;FF09=29;FF0A=2A;FF0B=2B;FF0C=2C;FF0D=2',\n 'D;FF0E=2E;FF0F=2F;FF10=30;FF11=31;FF12=32;FF13=33;FF14=34;FF15=35;FF16=36;FF17=37;FF18=3',\n '8;FF19=39;FF1A=3A;FF1B=3B;FF1C=3C;FF1D=3D;FF1E=3E;FF1F=3F;FF20=40;FF21=41;FF22=42;FF23=4',\n '3;FF24=44;FF25=45;FF26=46;FF27=47;FF28=48;FF29=49;FF2A=4A;FF2B=4B;FF2C=4C;FF2D=4D;FF2E=4',\n 'E;FF2F=4F;FF30=50;FF31=51;FF32=52;FF33=53;FF34=54;FF35=55;FF36=56;FF37=57;FF38=58;FF39=5',\n '9;FF3A=5A;FF3B=5B;FF3C=5C;FF3D=5D;FF3E=5E;FF3F=5F;FF40=60;FF41=61;FF42=62;FF43=63;FF44=6',\n '4;FF45=65;FF46=66;FF47=67;FF48=68;FF49=69;FF4A=6A;FF4B=6B;FF4C=6C;FF4D=6D;FF4E=6E;FF4F=6',\n 'F;FF50=70;FF51=71;FF52=72;FF53=73;FF54=74;FF55=75;FF56=76;FF57=77;FF58=78;FF59=79;FF5A=7',\n 'A;FF5B=7B;FF5C=7C;FF5D=7D;FF5E=7E;FF5F=2985;FF60=2986;FF61=3002;FF62=300C;FF63=300D;FF64',\n '=3001;FF65=30FB;FF66=30F2;FF67=30A1;FF68=30A3;FF69=30A5;FF6A=30A7;FF6B=30A9;FF6C=30E3;FF',\n '6D=30E5;FF6E=30E7;FF6F=30C3;FF70=30FC;FF71=30A2;FF72=30A4;FF73=30A6;FF74=30A8;FF75=30AA;',\n 'FF76=30AB;FF77=30AD;FF78=30AF;FF79=30B1;FF7A=30B3;FF7B=30B5;FF7C=30B7;FF7D=30B9;FF7E=30B',\n 'B;FF7F=30BD;FF80=30BF;FF81=30C1;FF82=30C4;FF83=30C6;FF84=30C8;FF85=30CA;FF86=30CB;FF87=3',\n '0CC;FF88=30CD;FF89=30CE;FF8A=30CF;FF8B=30D2;FF8C=30D5;FF8D=30D8;FF8E=30DB;FF8F=30DE;FF90',\n '=30DF;FF91=30E0;FF92=30E1;FF93=30E2;FF94=30E4;FF95=30E6;FF96=30E8;FF97=30E9;FF98=30EA;FF',\n '99=30EB;FF9A=30EC;FF9B=30ED;FF9C=30EF;FF9D=30F3;FF9E=3099;FF9F=309A;FFA0=1160;FFA1=1100;',\n 'FFA2=1101;FFA3=11AA;FFA4=1102;FFA5=11AC;FFA6=11AD;FFA7=1103;FFA8=1104;FFA9=1105;FFAA=11B',\n '0;FFAB=11B1;FFAC=11B2;FFAD=11B3;FFAE=11B4;FFAF=11B5;FFB0=111A;FFB1=1106;FFB2=1107;FFB3=1',\n '108;FFB4=1121;FFB5=1109;FFB6=110A;FFB7=110B;FFB8=110C;FFB9=110D;FFBA=110E;FFBB=110F;FFBC',\n '=1110;FFBD=1111;FFBE=1112;FFC2=1161;FFC3=1162;FFC4=1163;FFC5=1164;FFC6=1165;FFC7=1166;FF',\n 'CA=1167;FFCB=1168;FFCC=1169;FFCD=116A;FFCE=116B;FFCF=116C;FFD2=116D;FFD3=116E;FFD4=116F;',\n 'FFD5=1170;FFD6=1171;FFD7=1172;FFDA=1173;FFDB=1174;FFDC=1175;FFE0=A2;FFE1=A3;FFE2=AC;FFE3',\n '=20 304;FFE4=A6;FFE5=A5;FFE6=20A9;FFE8=2502;FFE9=2190;FFEA=2191;FFEB=2192;FFEC=2193;FFED',\n '=25A0;FFEE=25CB;105C9=105D2 307;105E4=105DA 307;10781=2D0;10782=2D1;10783=E6;10784=299;1',\n '0785=253;10787=2A3;10788=AB66;10789=2A5;1078A=2A4;1078B=256;1078C=257;1078D=1D91;1078E=2',\n '58;1078F=25E;10790=2A9;10791=264;10792=262;10793=260;10794=29B;10795=127;10796=29C;10797',\n '=267;10798=284;10799=2AA;1079A=2AB;1079B=26C;1079C=1DF04;1079D=A78E;1079E=26E;1079F=1DF0',\n '5;107A0=28E;107A1=1DF06;107A2=F8;107A3=276;107A4=277;107A5=71;107A6=27A;107A7=1DF08;107A',\n '8=27D;107A9=27E;107AA=280;107AB=2A8;107AC=2A6;107AD=AB67;107AE=2A7;107AF=288;107B0=2C71;',\n '107B2=28F;107B3=2A1;107B4=2A2;107B5=298;107B6=1C0;107B7=1C1;107B8=1C2;107B9=1DF0A;107BA=',\n '1DF1E;1109A=11099 110BA;1109C=1109B 110BA;110AB=110A5 110BA;1112E=11131 11127;1112F=1113',\n '2 11127;1134B=11347 1133E;1134C=11347 11357;11383=11382 113C9;11385=11384 113BB;1138E=11',\n '38B 113C2;11391=11390 113C9;113C5=113C2 113C2;113C7=113C2 113B8;113C8=113C2 113C9;114BB=',\n '114B9 114BA;114BC=114B9 114B0;114BE=114B9 114BD;115BA=115B8 115AF;115BB=115B9 115AF;1193',\n '8=11935 11930;16121=1611E 1611E;16122=1611E 16129;16123=1611E 1611F;16124=16129 1611F;16',\n '125=1611E 16120;16126=1611E 1611E 1611F;16127=1611E 16129 1611F;16128=1611E 1611E 16120;',\n '16D68=16D67 16D67;16D69=16D63 16D67;16D6A=16D63 16D67 16D67;1CCD6=41;1CCD7=42;1CCD8=43;1',\n 'CCD9=44;1CCDA=45;1CCDB=46;1CCDC=47;1CCDD=48;1CCDE=49;1CCDF=4A;1CCE0=4B;1CCE1=4C;1CCE2=4D',\n ';1CCE3=4E;1CCE4=4F;1CCE5=50;1CCE6=51;1CCE7=52;1CCE8=53;1CCE9=54;1CCEA=55;1CCEB=56;1CCEC=',\n '57;1CCED=58;1CCEE=59;1CCEF=5A;1CCF0=30;1CCF1=31;1CCF2=32;1CCF3=33;1CCF4=34;1CCF5=35;1CCF',\n '6=36;1CCF7=37;1CCF8=38;1CCF9=39;1D15E=1D157 1D165;1D15F=1D158 1D165;1D160=1D158 1D165 1D',\n '16E;1D161=1D158 1D165 1D16F;1D162=1D158 1D165 1D170;1D163=1D158 1D165 1D171;1D164=1D158 ',\n '1D165 1D172;1D1BB=1D1B9 1D165;1D1BC=1D1BA 1D165;1D1BD=1D1B9 1D165 1D16E;1D1BE=1D1BA 1D16',\n '5 1D16E;1D1BF=1D1B9 1D165 1D16F;1D1C0=1D1BA 1D165 1D16F;1D400=41;1D401=42;1D402=43;1D403',\n '=44;1D404=45;1D405=46;1D406=47;1D407=48;1D408=49;1D409=4A;1D40A=4B;1D40B=4C;1D40C=4D;1D4',\n '0D=4E;1D40E=4F;1D40F=50;1D410=51;1D411=52;1D412=53;1D413=54;1D414=55;1D415=56;1D416=57;1',\n 'D417=58;1D418=59;1D419=5A;1D41A=61;1D41B=62;1D41C=63;1D41D=64;1D41E=65;1D41F=66;1D420=67',\n ';1D421=68;1D422=69;1D423=6A;1D424=6B;1D425=6C;1D426=6D;1D427=6E;1D428=6F;1D429=70;1D42A=',\n '71;1D42B=72;1D42C=73;1D42D=74;1D42E=75;1D42F=76;1D430=77;1D431=78;1D432=79;1D433=7A;1D43',\n '4=41;1D435=42;1D436=43;1D437=44;1D438=45;1D439=46;1D43A=47;1D43B=48;1D43C=49;1D43D=4A;1D',\n '43E=4B;1D43F=4C;1D440=4D;1D441=4E;1D442=4F;1D443=50;1D444=51;1D445=52;1D446=53;1D447=54;',\n '1D448=55;1D449=56;1D44A=57;1D44B=58;1D44C=59;1D44D=5A;1D44E=61;1D44F=62;1D450=63;1D451=6',\n '4;1D452=65;1D453=66;1D454=67;1D456=69;1D457=6A;1D458=6B;1D459=6C;1D45A=6D;1D45B=6E;1D45C',\n '=6F;1D45D=70;1D45E=71;1D45F=72;1D460=73;1D461=74;1D462=75;1D463=76;1D464=77;1D465=78;1D4',\n '66=79;1D467=7A;1D468=41;1D469=42;1D46A=43;1D46B=44;1D46C=45;1D46D=46;1D46E=47;1D46F=48;1',\n 'D470=49;1D471=4A;1D472=4B;1D473=4C;1D474=4D;1D475=4E;1D476=4F;1D477=50;1D478=51;1D479=52',\n ';1D47A=53;1D47B=54;1D47C=55;1D47D=56;1D47E=57;1D47F=58;1D480=59;1D481=5A;1D482=61;1D483=',\n '62;1D484=63;1D485=64;1D486=65;1D487=66;1D488=67;1D489=68;1D48A=69;1D48B=6A;1D48C=6B;1D48',\n 'D=6C;1D48E=6D;1D48F=6E;1D490=6F;1D491=70;1D492=71;1D493=72;1D494=73;1D495=74;1D496=75;1D',\n '497=76;1D498=77;1D499=78;1D49A=79;1D49B=7A;1D49C=41;1D49E=43;1D49F=44;1D4A2=47;1D4A5=4A;',\n '1D4A6=4B;1D4A9=4E;1D4AA=4F;1D4AB=50;1D4AC=51;1D4AE=53;1D4AF=54;1D4B0=55;1D4B1=56;1D4B2=5',\n '7;1D4B3=58;1D4B4=59;1D4B5=5A;1D4B6=61;1D4B7=62;1D4B8=63;1D4B9=64;1D4BB=66;1D4BD=68;1D4BE',\n '=69;1D4BF=6A;1D4C0=6B;1D4C1=6C;1D4C2=6D;1D4C3=6E;1D4C5=70;1D4C6=71;1D4C7=72;1D4C8=73;1D4',\n 'C9=74;1D4CA=75;1D4CB=76;1D4CC=77;1D4CD=78;1D4CE=79;1D4CF=7A;1D4D0=41;1D4D1=42;1D4D2=43;1',\n 'D4D3=44;1D4D4=45;1D4D5=46;1D4D6=47;1D4D7=48;1D4D8=49;1D4D9=4A;1D4DA=4B;1D4DB=4C;1D4DC=4D',\n ';1D4DD=4E;1D4DE=4F;1D4DF=50;1D4E0=51;1D4E1=52;1D4E2=53;1D4E3=54;1D4E4=55;1D4E5=56;1D4E6=',\n '57;1D4E7=58;1D4E8=59;1D4E9=5A;1D4EA=61;1D4EB=62;1D4EC=63;1D4ED=64;1D4EE=65;1D4EF=66;1D4F',\n '0=67;1D4F1=68;1D4F2=69;1D4F3=6A;1D4F4=6B;1D4F5=6C;1D4F6=6D;1D4F7=6E;1D4F8=6F;1D4F9=70;1D',\n '4FA=71;1D4FB=72;1D4FC=73;1D4FD=74;1D4FE=75;1D4FF=76;1D500=77;1D501=78;1D502=79;1D503=7A;',\n '1D504=41;1D505=42;1D507=44;1D508=45;1D509=46;1D50A=47;1D50D=4A;1D50E=4B;1D50F=4C;1D510=4',\n 'D;1D511=4E;1D512=4F;1D513=50;1D514=51;1D516=53;1D517=54;1D518=55;1D519=56;1D51A=57;1D51B',\n '=58;1D51C=59;1D51E=61;1D51F=62;1D520=63;1D521=64;1D522=65;1D523=66;1D524=67;1D525=68;1D5',\n '26=69;1D527=6A;1D528=6B;1D529=6C;1D52A=6D;1D52B=6E;1D52C=6F;1D52D=70;1D52E=71;1D52F=72;1',\n 'D530=73;1D531=74;1D532=75;1D533=76;1D534=77;1D535=78;1D536=79;1D537=7A;1D538=41;1D539=42',\n ';1D53B=44;1D53C=45;1D53D=46;1D53E=47;1D540=49;1D541=4A;1D542=4B;1D543=4C;1D544=4D;1D546=',\n '4F;1D54A=53;1D54B=54;1D54C=55;1D54D=56;1D54E=57;1D54F=58;1D550=59;1D552=61;1D553=62;1D55',\n '4=63;1D555=64;1D556=65;1D557=66;1D558=67;1D559=68;1D55A=69;1D55B=6A;1D55C=6B;1D55D=6C;1D',\n '55E=6D;1D55F=6E;1D560=6F;1D561=70;1D562=71;1D563=72;1D564=73;1D565=74;1D566=75;1D567=76;',\n '1D568=77;1D569=78;1D56A=79;1D56B=7A;1D56C=41;1D56D=42;1D56E=43;1D56F=44;1D570=45;1D571=4',\n '6;1D572=47;1D573=48;1D574=49;1D575=4A;1D576=4B;1D577=4C;1D578=4D;1D579=4E;1D57A=4F;1D57B',\n '=50;1D57C=51;1D57D=52;1D57E=53;1D57F=54;1D580=55;1D581=56;1D582=57;1D583=58;1D584=59;1D5',\n '85=5A;1D586=61;1D587=62;1D588=63;1D589=64;1D58A=65;1D58B=66;1D58C=67;1D58D=68;1D58E=69;1',\n 'D58F=6A;1D590=6B;1D591=6C;1D592=6D;1D593=6E;1D594=6F;1D595=70;1D596=71;1D597=72;1D598=73',\n ';1D599=74;1D59A=75;1D59B=76;1D59C=77;1D59D=78;1D59E=79;1D59F=7A;1D5A0=41;1D5A1=42;1D5A2=',\n '43;1D5A3=44;1D5A4=45;1D5A5=46;1D5A6=47;1D5A7=48;1D5A8=49;1D5A9=4A;1D5AA=4B;1D5AB=4C;1D5A',\n 'C=4D;1D5AD=4E;1D5AE=4F;1D5AF=50;1D5B0=51;1D5B1=52;1D5B2=53;1D5B3=54;1D5B4=55;1D5B5=56;1D',\n '5B6=57;1D5B7=58;1D5B8=59;1D5B9=5A;1D5BA=61;1D5BB=62;1D5BC=63;1D5BD=64;1D5BE=65;1D5BF=66;',\n '1D5C0=67;1D5C1=68;1D5C2=69;1D5C3=6A;1D5C4=6B;1D5C5=6C;1D5C6=6D;1D5C7=6E;1D5C8=6F;1D5C9=7',\n '0;1D5CA=71;1D5CB=72;1D5CC=73;1D5CD=74;1D5CE=75;1D5CF=76;1D5D0=77;1D5D1=78;1D5D2=79;1D5D3',\n '=7A;1D5D4=41;1D5D5=42;1D5D6=43;1D5D7=44;1D5D8=45;1D5D9=46;1D5DA=47;1D5DB=48;1D5DC=49;1D5',\n 'DD=4A;1D5DE=4B;1D5DF=4C;1D5E0=4D;1D5E1=4E;1D5E2=4F;1D5E3=50;1D5E4=51;1D5E5=52;1D5E6=53;1',\n 'D5E7=54;1D5E8=55;1D5E9=56;1D5EA=57;1D5EB=58;1D5EC=59;1D5ED=5A;1D5EE=61;1D5EF=62;1D5F0=63',\n ';1D5F1=64;1D5F2=65;1D5F3=66;1D5F4=67;1D5F5=68;1D5F6=69;1D5F7=6A;1D5F8=6B;1D5F9=6C;1D5FA=',\n '6D;1D5FB=6E;1D5FC=6F;1D5FD=70;1D5FE=71;1D5FF=72;1D600=73;1D601=74;1D602=75;1D603=76;1D60',\n '4=77;1D605=78;1D606=79;1D607=7A;1D608=41;1D609=42;1D60A=43;1D60B=44;1D60C=45;1D60D=46;1D',\n '60E=47;1D60F=48;1D610=49;1D611=4A;1D612=4B;1D613=4C;1D614=4D;1D615=4E;1D616=4F;1D617=50;',\n '1D618=51;1D619=52;1D61A=53;1D61B=54;1D61C=55;1D61D=56;1D61E=57;1D61F=58;1D620=59;1D621=5',\n 'A;1D622=61;1D623=62;1D624=63;1D625=64;1D626=65;1D627=66;1D628=67;1D629=68;1D62A=69;1D62B',\n '=6A;1D62C=6B;1D62D=6C;1D62E=6D;1D62F=6E;1D630=6F;1D631=70;1D632=71;1D633=72;1D634=73;1D6',\n '35=74;1D636=75;1D637=76;1D638=77;1D639=78;1D63A=79;1D63B=7A;1D63C=41;1D63D=42;1D63E=43;1',\n 'D63F=44;1D640=45;1D641=46;1D642=47;1D643=48;1D644=49;1D645=4A;1D646=4B;1D647=4C;1D648=4D',\n ';1D649=4E;1D64A=4F;1D64B=50;1D64C=51;1D64D=52;1D64E=53;1D64F=54;1D650=55;1D651=56;1D652=',\n '57;1D653=58;1D654=59;1D655=5A;1D656=61;1D657=62;1D658=63;1D659=64;1D65A=65;1D65B=66;1D65',\n 'C=67;1D65D=68;1D65E=69;1D65F=6A;1D660=6B;1D661=6C;1D662=6D;1D663=6E;1D664=6F;1D665=70;1D',\n '666=71;1D667=72;1D668=73;1D669=74;1D66A=75;1D66B=76;1D66C=77;1D66D=78;1D66E=79;1D66F=7A;',\n '1D670=41;1D671=42;1D672=43;1D673=44;1D674=45;1D675=46;1D676=47;1D677=48;1D678=49;1D679=4',\n 'A;1D67A=4B;1D67B=4C;1D67C=4D;1D67D=4E;1D67E=4F;1D67F=50;1D680=51;1D681=52;1D682=53;1D683',\n '=54;1D684=55;1D685=56;1D686=57;1D687=58;1D688=59;1D689=5A;1D68A=61;1D68B=62;1D68C=63;1D6',\n '8D=64;1D68E=65;1D68F=66;1D690=67;1D691=68;1D692=69;1D693=6A;1D694=6B;1D695=6C;1D696=6D;1',\n 'D697=6E;1D698=6F;1D699=70;1D69A=71;1D69B=72;1D69C=73;1D69D=74;1D69E=75;1D69F=76;1D6A0=77',\n ';1D6A1=78;1D6A2=79;1D6A3=7A;1D6A4=131;1D6A5=237;1D6A8=391;1D6A9=392;1D6AA=393;1D6AB=394;',\n '1D6AC=395;1D6AD=396;1D6AE=397;1D6AF=398;1D6B0=399;1D6B1=39A;1D6B2=39B;1D6B3=39C;1D6B4=39',\n 'D;1D6B5=39E;1D6B6=39F;1D6B7=3A0;1D6B8=3A1;1D6B9=398;1D6BA=3A3;1D6BB=3A4;1D6BC=3A5;1D6BD=',\n '3A6;1D6BE=3A7;1D6BF=3A8;1D6C0=3A9;1D6C1=2207;1D6C2=3B1;1D6C3=3B2;1D6C4=3B3;1D6C5=3B4;1D6',\n 'C6=3B5;1D6C7=3B6;1D6C8=3B7;1D6C9=3B8;1D6CA=3B9;1D6CB=3BA;1D6CC=3BB;1D6CD=3BC;1D6CE=3BD;1',\n 'D6CF=3BE;1D6D0=3BF;1D6D1=3C0;1D6D2=3C1;1D6D3=3C2;1D6D4=3C3;1D6D5=3C4;1D6D6=3C5;1D6D7=3C6',\n ';1D6D8=3C7;1D6D9=3C8;1D6DA=3C9;1D6DB=2202;1D6DC=3B5;1D6DD=3B8;1D6DE=3BA;1D6DF=3C6;1D6E0=',\n '3C1;1D6E1=3C0;1D6E2=391;1D6E3=392;1D6E4=393;1D6E5=394;1D6E6=395;1D6E7=396;1D6E8=397;1D6E',\n '9=398;1D6EA=399;1D6EB=39A;1D6EC=39B;1D6ED=39C;1D6EE=39D;1D6EF=39E;1D6F0=39F;1D6F1=3A0;1D',\n '6F2=3A1;1D6F3=398;1D6F4=3A3;1D6F5=3A4;1D6F6=3A5;1D6F7=3A6;1D6F8=3A7;1D6F9=3A8;1D6FA=3A9;',\n '1D6FB=2207;1D6FC=3B1;1D6FD=3B2;1D6FE=3B3;1D6FF=3B4;1D700=3B5;1D701=3B6;1D702=3B7;1D703=3',\n 'B8;1D704=3B9;1D705=3BA;1D706=3BB;1D707=3BC;1D708=3BD;1D709=3BE;1D70A=3BF;1D70B=3C0;1D70C',\n '=3C1;1D70D=3C2;1D70E=3C3;1D70F=3C4;1D710=3C5;1D711=3C6;1D712=3C7;1D713=3C8;1D714=3C9;1D7',\n '15=2202;1D716=3B5;1D717=3B8;1D718=3BA;1D719=3C6;1D71A=3C1;1D71B=3C0;1D71C=391;1D71D=392;',\n '1D71E=393;1D71F=394;1D720=395;1D721=396;1D722=397;1D723=398;1D724=399;1D725=39A;1D726=39',\n 'B;1D727=39C;1D728=39D;1D729=39E;1D72A=39F;1D72B=3A0;1D72C=3A1;1D72D=398;1D72E=3A3;1D72F=',\n '3A4;1D730=3A5;1D731=3A6;1D732=3A7;1D733=3A8;1D734=3A9;1D735=2207;1D736=3B1;1D737=3B2;1D7',\n '38=3B3;1D739=3B4;1D73A=3B5;1D73B=3B6;1D73C=3B7;1D73D=3B8;1D73E=3B9;1D73F=3BA;1D740=3BB;1',\n 'D741=3BC;1D742=3BD;1D743=3BE;1D744=3BF;1D745=3C0;1D746=3C1;1D747=3C2;1D748=3C3;1D749=3C4',\n ';1D74A=3C5;1D74B=3C6;1D74C=3C7;1D74D=3C8;1D74E=3C9;1D74F=2202;1D750=3B5;1D751=3B8;1D752=',\n '3BA;1D753=3C6;1D754=3C1;1D755=3C0;1D756=391;1D757=392;1D758=393;1D759=394;1D75A=395;1D75',\n 'B=396;1D75C=397;1D75D=398;1D75E=399;1D75F=39A;1D760=39B;1D761=39C;1D762=39D;1D763=39E;1D',\n '764=39F;1D765=3A0;1D766=3A1;1D767=398;1D768=3A3;1D769=3A4;1D76A=3A5;1D76B=3A6;1D76C=3A7;',\n '1D76D=3A8;1D76E=3A9;1D76F=2207;1D770=3B1;1D771=3B2;1D772=3B3;1D773=3B4;1D774=3B5;1D775=3',\n 'B6;1D776=3B7;1D777=3B8;1D778=3B9;1D779=3BA;1D77A=3BB;1D77B=3BC;1D77C=3BD;1D77D=3BE;1D77E',\n '=3BF;1D77F=3C0;1D780=3C1;1D781=3C2;1D782=3C3;1D783=3C4;1D784=3C5;1D785=3C6;1D786=3C7;1D7',\n '87=3C8;1D788=3C9;1D789=2202;1D78A=3B5;1D78B=3B8;1D78C=3BA;1D78D=3C6;1D78E=3C1;1D78F=3C0;',\n '1D790=391;1D791=392;1D792=393;1D793=394;1D794=395;1D795=396;1D796=397;1D797=398;1D798=39',\n '9;1D799=39A;1D79A=39B;1D79B=39C;1D79C=39D;1D79D=39E;1D79E=39F;1D79F=3A0;1D7A0=3A1;1D7A1=',\n '398;1D7A2=3A3;1D7A3=3A4;1D7A4=3A5;1D7A5=3A6;1D7A6=3A7;1D7A7=3A8;1D7A8=3A9;1D7A9=2207;1D7',\n 'AA=3B1;1D7AB=3B2;1D7AC=3B3;1D7AD=3B4;1D7AE=3B5;1D7AF=3B6;1D7B0=3B7;1D7B1=3B8;1D7B2=3B9;1',\n 'D7B3=3BA;1D7B4=3BB;1D7B5=3BC;1D7B6=3BD;1D7B7=3BE;1D7B8=3BF;1D7B9=3C0;1D7BA=3C1;1D7BB=3C2',\n ';1D7BC=3C3;1D7BD=3C4;1D7BE=3C5;1D7BF=3C6;1D7C0=3C7;1D7C1=3C8;1D7C2=3C9;1D7C3=2202;1D7C4=',\n '3B5;1D7C5=3B8;1D7C6=3BA;1D7C7=3C6;1D7C8=3C1;1D7C9=3C0;1D7CA=3DC;1D7CB=3DD;1D7CE=30;1D7CF',\n '=31;1D7D0=32;1D7D1=33;1D7D2=34;1D7D3=35;1D7D4=36;1D7D5=37;1D7D6=38;1D7D7=39;1D7D8=30;1D7',\n 'D9=31;1D7DA=32;1D7DB=33;1D7DC=34;1D7DD=35;1D7DE=36;1D7DF=37;1D7E0=38;1D7E1=39;1D7E2=30;1',\n 'D7E3=31;1D7E4=32;1D7E5=33;1D7E6=34;1D7E7=35;1D7E8=36;1D7E9=37;1D7EA=38;1D7EB=39;1D7EC=30',\n ';1D7ED=31;1D7EE=32;1D7EF=33;1D7F0=34;1D7F1=35;1D7F2=36;1D7F3=37;1D7F4=38;1D7F5=39;1D7F6=',\n '30;1D7F7=31;1D7F8=32;1D7F9=33;1D7FA=34;1D7FB=35;1D7FC=36;1D7FD=37;1D7FE=38;1D7FF=39;1E03',\n '0=430;1E031=431;1E032=432;1E033=433;1E034=434;1E035=435;1E036=436;1E037=437;1E038=438;1E',\n '039=43A;1E03A=43B;1E03B=43C;1E03C=43E;1E03D=43F;1E03E=440;1E03F=441;1E040=442;1E041=443;',\n '1E042=444;1E043=445;1E044=446;1E045=447;1E046=448;1E047=44B;1E048=44D;1E049=44E;1E04A=A6',\n '89;1E04B=4D9;1E04C=456;1E04D=458;1E04E=4E9;1E04F=4AF;1E050=4CF;1E051=430;1E052=431;1E053',\n '=432;1E054=433;1E055=434;1E056=435;1E057=436;1E058=437;1E059=438;1E05A=43A;1E05B=43B;1E0',\n '5C=43E;1E05D=43F;1E05E=441;1E05F=443;1E060=444;1E061=445;1E062=446;1E063=447;1E064=448;1',\n 'E065=44A;1E066=44B;1E067=491;1E068=456;1E069=455;1E06A=45F;1E06B=4AB;1E06C=A651;1E06D=4B',\n '1;1EE00=627;1EE01=628;1EE02=62C;1EE03=62F;1EE05=648;1EE06=632;1EE07=62D;1EE08=637;1EE09=',\n '64A;1EE0A=643;1EE0B=644;1EE0C=645;1EE0D=646;1EE0E=633;1EE0F=639;1EE10=641;1EE11=635;1EE1',\n '2=642;1EE13=631;1EE14=634;1EE15=62A;1EE16=62B;1EE17=62E;1EE18=630;1EE19=636;1EE1A=638;1E',\n 'E1B=63A;1EE1C=66E;1EE1D=6BA;1EE1E=6A1;1EE1F=66F;1EE21=628;1EE22=62C;1EE24=647;1EE27=62D;',\n '1EE29=64A;1EE2A=643;1EE2B=644;1EE2C=645;1EE2D=646;1EE2E=633;1EE2F=639;1EE30=641;1EE31=63',\n '5;1EE32=642;1EE34=634;1EE35=62A;1EE36=62B;1EE37=62E;1EE39=636;1EE3B=63A;1EE42=62C;1EE47=',\n '62D;1EE49=64A;1EE4B=644;1EE4D=646;1EE4E=633;1EE4F=639;1EE51=635;1EE52=642;1EE54=634;1EE5',\n '7=62E;1EE59=636;1EE5B=63A;1EE5D=6BA;1EE5F=66F;1EE61=628;1EE62=62C;1EE64=647;1EE67=62D;1E',\n 'E68=637;1EE69=64A;1EE6A=643;1EE6C=645;1EE6D=646;1EE6E=633;1EE6F=639;1EE70=641;1EE71=635;',\n '1EE72=642;1EE74=634;1EE75=62A;1EE76=62B;1EE77=62E;1EE79=636;1EE7A=638;1EE7B=63A;1EE7C=66',\n 'E;1EE7E=6A1;1EE80=627;1EE81=628;1EE82=62C;1EE83=62F;1EE84=647;1EE85=648;1EE86=632;1EE87=',\n '62D;1EE88=637;1EE89=64A;1EE8B=644;1EE8C=645;1EE8D=646;1EE8E=633;1EE8F=639;1EE90=641;1EE9',\n '1=635;1EE92=642;1EE93=631;1EE94=634;1EE95=62A;1EE96=62B;1EE97=62E;1EE98=630;1EE99=636;1E',\n 'E9A=638;1EE9B=63A;1EEA1=628;1EEA2=62C;1EEA3=62F;1EEA5=648;1EEA6=632;1EEA7=62D;1EEA8=637;',\n '1EEA9=64A;1EEAB=644;1EEAC=645;1EEAD=646;1EEAE=633;1EEAF=639;1EEB0=641;1EEB1=635;1EEB2=64',\n '2;1EEB3=631;1EEB4=634;1EEB5=62A;1EEB6=62B;1EEB7=62E;1EEB8=630;1EEB9=636;1EEBA=638;1EEBB=',\n '63A;1F100=30 2E;1F101=30 2C;1F102=31 2C;1F103=32 2C;1F104=33 2C;1F105=34 2C;1F106=35 2C;',\n '1F107=36 2C;1F108=37 2C;1F109=38 2C;1F10A=39 2C;1F110=28 41 29;1F111=28 42 29;1F112=28 4',\n '3 29;1F113=28 44 29;1F114=28 45 29;1F115=28 46 29;1F116=28 47 29;1F117=28 48 29;1F118=28',\n ' 49 29;1F119=28 4A 29;1F11A=28 4B 29;1F11B=28 4C 29;1F11C=28 4D 29;1F11D=28 4E 29;1F11E=',\n '28 4F 29;1F11F=28 50 29;1F120=28 51 29;1F121=28 52 29;1F122=28 53 29;1F123=28 54 29;1F12',\n '4=28 55 29;1F125=28 56 29;1F126=28 57 29;1F127=28 58 29;1F128=28 59 29;1F129=28 5A 29;1F',\n '12A=3014 53 3015;1F12B=43;1F12C=52;1F12D=43 44;1F12E=57 5A;1F130=41;1F131=42;1F132=43;1F',\n '133=44;1F134=45;1F135=46;1F136=47;1F137=48;1F138=49;1F139=4A;1F13A=4B;1F13B=4C;1F13C=4D;',\n '1F13D=4E;1F13E=4F;1F13F=50;1F140=51;1F141=52;1F142=53;1F143=54;1F144=55;1F145=56;1F146=5',\n '7;1F147=58;1F148=59;1F149=5A;1F14A=48 56;1F14B=4D 56;1F14C=53 44;1F14D=53 53;1F14E=50 50',\n ' 56;1F14F=57 43;1F16A=4D 43;1F16B=4D 44;1F16C=4D 52;1F190=44 4A;1F200=307B 304B;1F201=30',\n 'B3 30B3;1F202=30B5;1F210=624B;1F211=5B57;1F212=53CC;1F213=30C6 3099;1F214=4E8C;1F215=591',\n 'A;1F216=89E3;1F217=5929;1F218=4EA4;1F219=6620;1F21A=7121;1F21B=6599;1F21C=524D;1F21D=5F8',\n 'C;1F21E=518D;1F21F=65B0;1F220=521D;1F221=7D42;1F222=751F;1F223=8CA9;1F224=58F0;1F225=543',\n '9;1F226=6F14;1F227=6295;1F228=6355;1F229=4E00;1F22A=4E09;1F22B=904A;1F22C=5DE6;1F22D=4E2',\n 'D;1F22E=53F3;1F22F=6307;1F230=8D70;1F231=6253;1F232=7981;1F233=7A7A;1F234=5408;1F235=6E8',\n '0;1F236=6709;1F237=6708;1F238=7533;1F239=5272;1F23A=55B6;1F23B=914D;1F240=3014 672C 3015',\n ';1F241=3014 4E09 3015;1F242=3014 4E8C 3015;1F243=3014 5B89 3015;1F244=3014 70B9 3015;1F2',\n '45=3014 6253 3015;1F246=3014 76D7 3015;1F247=3014 52DD 3015;1F248=3014 6557 3015;1F250=5',\n 'F97;1F251=53EF;1FBF0=30;1FBF1=31;1FBF2=32;1FBF3=33;1FBF4=34;1FBF5=35;1FBF6=36;1FBF7=37;1',\n 'FBF8=38;1FBF9=39;2F800=4E3D;2F801=4E38;2F802=4E41;2F803=20122;2F804=4F60;2F805=4FAE;2F80',\n '6=4FBB;2F807=5002;2F808=507A;2F809=5099;2F80A=50E7;2F80B=50CF;2F80C=349E;2F80D=2063A;2F8',\n '0E=514D;2F80F=5154;2F810=5164;2F811=5177;2F812=2051C;2F813=34B9;2F814=5167;2F815=518D;2F',\n '816=2054B;2F817=5197;2F818=51A4;2F819=4ECC;2F81A=51AC;2F81B=51B5;2F81C=291DF;2F81D=51F5;',\n '2F81E=5203;2F81F=34DF;2F820=523B;2F821=5246;2F822=5272;2F823=5277;2F824=3515;2F825=52C7;',\n '2F826=52C9;2F827=52E4;2F828=52FA;2F829=5305;2F82A=5306;2F82B=5317;2F82C=5349;2F82D=5351;',\n '2F82E=535A;2F82F=5373;2F830=537D;2F831=537F;2F832=537F;2F833=537F;2F834=20A2C;2F835=7070',\n ';2F836=53CA;2F837=53DF;2F838=20B63;2F839=53EB;2F83A=53F1;2F83B=5406;2F83C=549E;2F83D=543',\n '8;2F83E=5448;2F83F=5468;2F840=54A2;2F841=54F6;2F842=5510;2F843=5553;2F844=5563;2F845=558',\n '4;2F846=5584;2F847=5599;2F848=55AB;2F849=55B3;2F84A=55C2;2F84B=5716;2F84C=5606;2F84D=571',\n '7;2F84E=5651;2F84F=5674;2F850=5207;2F851=58EE;2F852=57CE;2F853=57F4;2F854=580D;2F855=578',\n 'B;2F856=5832;2F857=5831;2F858=58AC;2F859=214E4;2F85A=58F2;2F85B=58F7;2F85C=5906;2F85D=59',\n '1A;2F85E=5922;2F85F=5962;2F860=216A8;2F861=216EA;2F862=59EC;2F863=5A1B;2F864=5A27;2F865=',\n '59D8;2F866=5A66;2F867=36EE;2F868=36FC;2F869=5B08;2F86A=5B3E;2F86B=5B3E;2F86C=219C8;2F86D',\n '=5BC3;2F86E=5BD8;2F86F=5BE7;2F870=5BF3;2F871=21B18;2F872=5BFF;2F873=5C06;2F874=5F53;2F87',\n '5=5C22;2F876=3781;2F877=5C60;2F878=5C6E;2F879=5CC0;2F87A=5C8D;2F87B=21DE4;2F87C=5D43;2F8',\n '7D=21DE6;2F87E=5D6E;2F87F=5D6B;2F880=5D7C;2F881=5DE1;2F882=5DE2;2F883=382F;2F884=5DFD;2F',\n '885=5E28;2F886=5E3D;2F887=5E69;2F888=3862;2F889=22183;2F88A=387C;2F88B=5EB0;2F88C=5EB3;2',\n 'F88D=5EB6;2F88E=5ECA;2F88F=2A392;2F890=5EFE;2F891=22331;2F892=22331;2F893=8201;2F894=5F2',\n '2;2F895=5F22;2F896=38C7;2F897=232B8;2F898=261DA;2F899=5F62;2F89A=5F6B;2F89B=38E3;2F89C=5',\n 'F9A;2F89D=5FCD;2F89E=5FD7;2F89F=5FF9;2F8A0=6081;2F8A1=393A;2F8A2=391C;2F8A3=6094;2F8A4=2',\n '26D4;2F8A5=60C7;2F8A6=6148;2F8A7=614C;2F8A8=614E;2F8A9=614C;2F8AA=617A;2F8AB=618E;2F8AC=',\n '61B2;2F8AD=61A4;2F8AE=61AF;2F8AF=61DE;2F8B0=61F2;2F8B1=61F6;2F8B2=6210;2F8B3=621B;2F8B4=',\n '625D;2F8B5=62B1;2F8B6=62D4;2F8B7=6350;2F8B8=22B0C;2F8B9=633D;2F8BA=62FC;2F8BB=6368;2F8BC',\n '=6383;2F8BD=63E4;2F8BE=22BF1;2F8BF=6422;2F8C0=63C5;2F8C1=63A9;2F8C2=3A2E;2F8C3=6469;2F8C',\n '4=647E;2F8C5=649D;2F8C6=6477;2F8C7=3A6C;2F8C8=654F;2F8C9=656C;2F8CA=2300A;2F8CB=65E3;2F8',\n 'CC=66F8;2F8CD=6649;2F8CE=3B19;2F8CF=6691;2F8D0=3B08;2F8D1=3AE4;2F8D2=5192;2F8D3=5195;2F8',\n 'D4=6700;2F8D5=669C;2F8D6=80AD;2F8D7=43D9;2F8D8=6717;2F8D9=671B;2F8DA=6721;2F8DB=675E;2F8',\n 'DC=6753;2F8DD=233C3;2F8DE=3B49;2F8DF=67FA;2F8E0=6785;2F8E1=6852;2F8E2=6885;2F8E3=2346D;2',\n 'F8E4=688E;2F8E5=681F;2F8E6=6914;2F8E7=3B9D;2F8E8=6942;2F8E9=69A3;2F8EA=69EA;2F8EB=6AA8;2',\n 'F8EC=236A3;2F8ED=6ADB;2F8EE=3C18;2F8EF=6B21;2F8F0=238A7;2F8F1=6B54;2F8F2=3C4E;2F8F3=6B72',\n ';2F8F4=6B9F;2F8F5=6BBA;2F8F6=6BBB;2F8F7=23A8D;2F8F8=21D0B;2F8F9=23AFA;2F8FA=6C4E;2F8FB=2',\n '3CBC;2F8FC=6CBF;2F8FD=6CCD;2F8FE=6C67;2F8FF=6D16;2F900=6D3E;2F901=6D77;2F902=6D41;2F903=',\n '6D69;2F904=6D78;2F905=6D85;2F906=23D1E;2F907=6D34;2F908=6E2F;2F909=6E6E;2F90A=3D33;2F90B',\n '=6ECB;2F90C=6EC7;2F90D=23ED1;2F90E=6DF9;2F90F=6F6E;2F910=23F5E;2F911=23F8E;2F912=6FC6;2F',\n '913=7039;2F914=701E;2F915=701B;2F916=3D96;2F917=704A;2F918=707D;2F919=7077;2F91A=70AD;2F',\n '91B=20525;2F91C=7145;2F91D=24263;2F91E=719C;2F91F=243AB;2F920=7228;2F921=7235;2F922=7250',\n ';2F923=24608;2F924=7280;2F925=7295;2F926=24735;2F927=24814;2F928=737A;2F929=738B;2F92A=3',\n 'EAC;2F92B=73A5;2F92C=3EB8;2F92D=3EB8;2F92E=7447;2F92F=745C;2F930=7471;2F931=7485;2F932=7',\n '4CA;2F933=3F1B;2F934=7524;2F935=24C36;2F936=753E;2F937=24C92;2F938=7570;2F939=2219F;2F93',\n 'A=7610;2F93B=24FA1;2F93C=24FB8;2F93D=25044;2F93E=3FFC;2F93F=4008;2F940=76F4;2F941=250F3;',\n '2F942=250F2;2F943=25119;2F944=25133;2F945=771E;2F946=771F;2F947=771F;2F948=774A;2F949=40',\n '39;2F94A=778B;2F94B=4046;2F94C=4096;2F94D=2541D;2F94E=784E;2F94F=788C;2F950=78CC;2F951=4',\n '0E3;2F952=25626;2F953=7956;2F954=2569A;2F955=256C5;2F956=798F;2F957=79EB;2F958=412F;2F95',\n '9=7A40;2F95A=7A4A;2F95B=7A4F;2F95C=2597C;2F95D=25AA7;2F95E=25AA7;2F95F=7AEE;2F960=4202;2',\n 'F961=25BAB;2F962=7BC6;2F963=7BC9;2F964=4227;2F965=25C80;2F966=7CD2;2F967=42A0;2F968=7CE8',\n ';2F969=7CE3;2F96A=7D00;2F96B=25F86;2F96C=7D63;2F96D=4301;2F96E=7DC7;2F96F=7E02;2F970=7E4',\n '5;2F971=4334;2F972=26228;2F973=26247;2F974=4359;2F975=262D9;2F976=7F7A;2F977=2633E;2F978',\n '=7F95;2F979=7FFA;2F97A=8005;2F97B=264DA;2F97C=26523;2F97D=8060;2F97E=265A8;2F97F=8070;2F',\n '980=2335F;2F981=43D5;2F982=80B2;2F983=8103;2F984=440B;2F985=813E;2F986=5AB5;2F987=267A7;',\n '2F988=267B5;2F989=23393;2F98A=2339C;2F98B=8201;2F98C=8204;2F98D=8F9E;2F98E=446B;2F98F=82',\n '91;2F990=828B;2F991=829D;2F992=52B3;2F993=82B1;2F994=82B3;2F995=82BD;2F996=82E6;2F997=26',\n 'B3C;2F998=82E5;2F999=831D;2F99A=8363;2F99B=83AD;2F99C=8323;2F99D=83BD;2F99E=83E7;2F99F=8',\n '457;2F9A0=8353;2F9A1=83CA;2F9A2=83CC;2F9A3=83DC;2F9A4=26C36;2F9A5=26D6B;2F9A6=26CD5;2F9A',\n '7=452B;2F9A8=84F1;2F9A9=84F3;2F9AA=8516;2F9AB=273CA;2F9AC=8564;2F9AD=26F2C;2F9AE=455D;2F',\n '9AF=4561;2F9B0=26FB1;2F9B1=270D2;2F9B2=456B;2F9B3=8650;2F9B4=865C;2F9B5=8667;2F9B6=8669;',\n '2F9B7=86A9;2F9B8=8688;2F9B9=870E;2F9BA=86E2;2F9BB=8779;2F9BC=8728;2F9BD=876B;2F9BE=8786;',\n '2F9BF=45D7;2F9C0=87E1;2F9C1=8801;2F9C2=45F9;2F9C3=8860;2F9C4=8863;2F9C5=27667;2F9C6=88D7',\n ';2F9C7=88DE;2F9C8=4635;2F9C9=88FA;2F9CA=34BB;2F9CB=278AE;2F9CC=27966;2F9CD=46BE;2F9CE=46',\n 'C7;2F9CF=8AA0;2F9D0=8AED;2F9D1=8B8A;2F9D2=8C55;2F9D3=27CA8;2F9D4=8CAB;2F9D5=8CC1;2F9D6=8',\n 'D1B;2F9D7=8D77;2F9D8=27F2F;2F9D9=20804;2F9DA=8DCB;2F9DB=8DBC;2F9DC=8DF0;2F9DD=208DE;2F9D',\n 'E=8ED4;2F9DF=8F38;2F9E0=285D2;2F9E1=285ED;2F9E2=9094;2F9E3=90F1;2F9E4=9111;2F9E5=2872E;2',\n 'F9E6=911B;2F9E7=9238;2F9E8=92D7;2F9E9=92D8;2F9EA=927C;2F9EB=93F9;2F9EC=9415;2F9ED=28BFA;',\n '2F9EE=958B;2F9EF=4995;2F9F0=95B7;2F9F1=28D77;2F9F2=49E6;2F9F3=96C3;2F9F4=5DB2;2F9F5=9723',\n ';2F9F6=29145;2F9F7=2921A;2F9F8=4A6E;2F9F9=4A76;2F9FA=97E0;2F9FB=2940A;2F9FC=4AB2;2F9FD=2',\n '9496;2F9FE=980B;2F9FF=980B;2FA00=9829;2FA01=295B6;2FA02=98E2;2FA03=4B33;2FA04=9929;2FA05',\n '=99A7;2FA06=99C2;2FA07=99FE;2FA08=4BCE;2FA09=29B30;2FA0A=9B12;2FA0B=9C40;2FA0C=9CFD;2FA0',\n 'D=4CCE;2FA0E=4CED;2FA0F=9D67;2FA10=2A0CE;2FA11=4CF8;2FA12=2A105;2FA13=2A20E;2FA14=2A291;',\n '2FA15=9EBB;2FA16=4D56;2FA17=9EF9;2FA18=9EFE;2FA19=9F05;2FA1A=9F0F;2FA1B=9F16;2FA1C=9F3B;',\n '2FA1D=2A600',\n].join('');\n\n// Nonzero canonical combining classes.\n// Entry: <cp>:<ccc> or <first>-<last>:<ccc>; uppercase hex; sorted, ';'-joined.\nexport const NFKC16_CCC_PACKED: string = [\n '300-314:E6;315:E8;316-319:DC;31A:E8;31B:D8;31C-320:DC;321-322:CA;323-326:DC;327-328:CA;3',\n '29-333:DC;334-338:1;339-33C:DC;33D-344:E6;345:F0;346:E6;347-349:DC;34A-34C:E6;34D-34E:DC',\n ';350-352:E6;353-356:DC;357:E6;358:E8;359-35A:DC;35B:E6;35C:E9;35D-35E:EA;35F:E9;360-361:',\n 'EA;362:E9;363-36F:E6;483-487:E6;591:DC;592-595:E6;596:DC;597-599:E6;59A:DE;59B:DC;59C-5A',\n '1:E6;5A2-5A7:DC;5A8-5A9:E6;5AA:DC;5AB-5AC:E6;5AD:DE;5AE:E4;5AF:E6;5B0:A;5B1:B;5B2:C;5B3:',\n 'D;5B4:E;5B5:F;5B6:10;5B7:11;5B8:12;5B9-5BA:13;5BB:14;5BC:15;5BD:16;5BF:17;5C1:18;5C2:19;',\n '5C4:E6;5C5:DC;5C7:12;610-617:E6;618:1E;619:1F;61A:20;64B:1B;64C:1C;64D:1D;64E:1E;64F:1F;',\n '650:20;651:21;652:22;653-654:E6;655-656:DC;657-65B:E6;65C:DC;65D-65E:E6;65F:DC;670:23;6D',\n '6-6DC:E6;6DF-6E2:E6;6E3:DC;6E4:E6;6E7-6E8:E6;6EA:DC;6EB-6EC:E6;6ED:DC;711:24;730:E6;731:',\n 'DC;732-733:E6;734:DC;735-736:E6;737-739:DC;73A:E6;73B-73C:DC;73D:E6;73E:DC;73F-741:E6;74',\n '2:DC;743:E6;744:DC;745:E6;746:DC;747:E6;748:DC;749-74A:E6;7EB-7F1:E6;7F2:DC;7F3:E6;7FD:D',\n 'C;816-819:E6;81B-823:E6;825-827:E6;829-82D:E6;859-85B:DC;897-898:E6;899-89B:DC;89C-89F:E',\n '6;8CA-8CE:E6;8CF-8D3:DC;8D4-8E1:E6;8E3:DC;8E4-8E5:E6;8E6:DC;8E7-8E8:E6;8E9:DC;8EA-8EC:E6',\n ';8ED-8EF:DC;8F0:1B;8F1:1C;8F2:1D;8F3-8F5:E6;8F6:DC;8F7-8F8:E6;8F9-8FA:DC;8FB-8FF:E6;93C:',\n '7;94D:9;951:E6;952:DC;953-954:E6;9BC:7;9CD:9;9FE:E6;A3C:7;A4D:9;ABC:7;ACD:9;B3C:7;B4D:9;',\n 'BCD:9;C3C:7;C4D:9;C55:54;C56:5B;CBC:7;CCD:9;D3B-D3C:9;D4D:9;DCA:9;E38-E39:67;E3A:9;E48-E',\n '4B:6B;EB8-EB9:76;EBA:9;EC8-ECB:7A;F18-F19:DC;F35:DC;F37:DC;F39:D8;F71:81;F72:82;F74:84;F',\n '7A-F7D:82;F80:82;F82-F83:E6;F84:9;F86-F87:E6;FC6:DC;1037:7;1039-103A:9;108D:DC;135D-135F',\n ':E6;1714-1715:9;1734:9;17D2:9;17DD:E6;18A9:E4;1939:DE;193A:E6;193B:DC;1A17:E6;1A18:DC;1A',\n '60:9;1A75-1A7C:E6;1A7F:DC;1AB0-1AB4:E6;1AB5-1ABA:DC;1ABB-1ABC:E6;1ABD:DC;1ABF-1AC0:DC;1A',\n 'C1-1AC2:E6;1AC3-1AC4:DC;1AC5-1AC9:E6;1ACA:DC;1ACB-1ACE:E6;1B34:7;1B44:9;1B6B:E6;1B6C:DC;',\n '1B6D-1B73:E6;1BAA-1BAB:9;1BE6:7;1BF2-1BF3:9;1C37:7;1CD0-1CD2:E6;1CD4:1;1CD5-1CD9:DC;1CDA',\n '-1CDB:E6;1CDC-1CDF:DC;1CE0:E6;1CE2-1CE8:1;1CED:DC;1CF4:E6;1CF8-1CF9:E6;1DC0-1DC1:E6;1DC2',\n ':DC;1DC3-1DC9:E6;1DCA:DC;1DCB-1DCC:E6;1DCD:EA;1DCE:D6;1DCF:DC;1DD0:CA;1DD1-1DF5:E6;1DF6:',\n 'E8;1DF7-1DF8:E4;1DF9:DC;1DFA:DA;1DFB:E6;1DFC:E9;1DFD:DC;1DFE:E6;1DFF:DC;20D0-20D1:E6;20D',\n '2-20D3:1;20D4-20D7:E6;20D8-20DA:1;20DB-20DC:E6;20E1:E6;20E5-20E6:1;20E7:E6;20E8:DC;20E9:',\n 'E6;20EA-20EB:1;20EC-20EF:DC;20F0:E6;2CEF-2CF1:E6;2D7F:9;2DE0-2DFF:E6;302A:DA;302B:E4;302',\n 'C:E8;302D:DE;302E-302F:E0;3099-309A:8;A66F:E6;A674-A67D:E6;A69E-A69F:E6;A6F0-A6F1:E6;A80',\n '6:9;A82C:9;A8C4:9;A8E0-A8F1:E6;A92B-A92D:DC;A953:9;A9B3:7;A9C0:9;AAB0:E6;AAB2-AAB3:E6;AA',\n 'B4:DC;AAB7-AAB8:E6;AABE-AABF:E6;AAC1:E6;AAF6:9;ABED:9;FB1E:1A;FE20-FE26:E6;FE27-FE2D:DC;',\n 'FE2E-FE2F:E6;101FD:DC;102E0:DC;10376-1037A:E6;10A0D:DC;10A0F:E6;10A38:E6;10A39:1;10A3A:D',\n 'C;10A3F:9;10AE5:E6;10AE6:DC;10D24-10D27:E6;10D69-10D6D:E6;10EAB-10EAC:E6;10EFD-10EFF:DC;',\n '10F46-10F47:DC;10F48-10F4A:E6;10F4B:DC;10F4C:E6;10F4D-10F50:DC;10F82:E6;10F83:DC;10F84:E',\n '6;10F85:DC;11046:9;11070:9;1107F:9;110B9:9;110BA:7;11100-11102:E6;11133-11134:9;11173:7;',\n '111C0:9;111CA:7;11235:9;11236:7;112E9:7;112EA:9;1133B-1133C:7;1134D:9;11366-1136C:E6;113',\n '70-11374:E6;113CE-113D0:9;11442:9;11446:7;1145E:E6;114C2:9;114C3:7;115BF:9;115C0:7;1163F',\n ':9;116B6:9;116B7:7;1172B:9;11839:9;1183A:7;1193D-1193E:9;11943:7;119E0:9;11A34:9;11A47:9',\n ';11A99:9;11C3F:9;11D42:7;11D44-11D45:9;11D97:9;11F41-11F42:9;1612F:9;16AF0-16AF4:1;16B30',\n '-16B36:E6;16FF0-16FF1:6;1BC9E:1;1D165-1D166:D8;1D167-1D169:1;1D16D:E2;1D16E-1D172:D8;1D1',\n '7B-1D182:DC;1D185-1D189:E6;1D18A-1D18B:DC;1D1AA-1D1AD:E6;1D242-1D244:E6;1E000-1E006:E6;1',\n 'E008-1E018:E6;1E01B-1E021:E6;1E023-1E024:E6;1E026-1E02A:E6;1E08F:E6;1E130-1E136:E6;1E2AE',\n ':E6;1E2EC-1E2EF:E6;1E4EC-1E4ED:E8;1E4EE:DC;1E4EF:E6;1E5EE:E6;1E5EF:DC;1E8D0-1E8D6:DC;1E9',\n '44-1E949:E6;1E94A:7',\n].join('');\n\n// Primary composite pairs (UAX #15 exclusions applied), Hangul excluded.\n// Entry: <starter> <combining>=<composite>; uppercase hex; sorted, ';'-joined.\nexport const NFKC16_COMPOSITION_PACKED: string = [\n '3C 338=226E;3D 338=2260;3E 338=226F;41 300=C0;41 301=C1;41 302=C2;41 303=C3;41 304=100;4',\n '1 306=102;41 307=226;41 308=C4;41 309=1EA2;41 30A=C5;41 30C=1CD;41 30F=200;41 311=202;41',\n ' 323=1EA0;41 325=1E00;41 328=104;42 307=1E02;42 323=1E04;42 331=1E06;43 301=106;43 302=1',\n '08;43 307=10A;43 30C=10C;43 327=C7;44 307=1E0A;44 30C=10E;44 323=1E0C;44 327=1E10;44 32D',\n '=1E12;44 331=1E0E;45 300=C8;45 301=C9;45 302=CA;45 303=1EBC;45 304=112;45 306=114;45 307',\n '=116;45 308=CB;45 309=1EBA;45 30C=11A;45 30F=204;45 311=206;45 323=1EB8;45 327=228;45 32',\n '8=118;45 32D=1E18;45 330=1E1A;46 307=1E1E;47 301=1F4;47 302=11C;47 304=1E20;47 306=11E;4',\n '7 307=120;47 30C=1E6;47 327=122;48 302=124;48 307=1E22;48 308=1E26;48 30C=21E;48 323=1E2',\n '4;48 327=1E28;48 32E=1E2A;49 300=CC;49 301=CD;49 302=CE;49 303=128;49 304=12A;49 306=12C',\n ';49 307=130;49 308=CF;49 309=1EC8;49 30C=1CF;49 30F=208;49 311=20A;49 323=1ECA;49 328=12',\n 'E;49 330=1E2C;4A 302=134;4B 301=1E30;4B 30C=1E8;4B 323=1E32;4B 327=136;4B 331=1E34;4C 30',\n '1=139;4C 30C=13D;4C 323=1E36;4C 327=13B;4C 32D=1E3C;4C 331=1E3A;4D 301=1E3E;4D 307=1E40;',\n '4D 323=1E42;4E 300=1F8;4E 301=143;4E 303=D1;4E 307=1E44;4E 30C=147;4E 323=1E46;4E 327=14',\n '5;4E 32D=1E4A;4E 331=1E48;4F 300=D2;4F 301=D3;4F 302=D4;4F 303=D5;4F 304=14C;4F 306=14E;',\n '4F 307=22E;4F 308=D6;4F 309=1ECE;4F 30B=150;4F 30C=1D1;4F 30F=20C;4F 311=20E;4F 31B=1A0;',\n '4F 323=1ECC;4F 328=1EA;50 301=1E54;50 307=1E56;52 301=154;52 307=1E58;52 30C=158;52 30F=',\n '210;52 311=212;52 323=1E5A;52 327=156;52 331=1E5E;53 301=15A;53 302=15C;53 307=1E60;53 3',\n '0C=160;53 323=1E62;53 326=218;53 327=15E;54 307=1E6A;54 30C=164;54 323=1E6C;54 326=21A;5',\n '4 327=162;54 32D=1E70;54 331=1E6E;55 300=D9;55 301=DA;55 302=DB;55 303=168;55 304=16A;55',\n ' 306=16C;55 308=DC;55 309=1EE6;55 30A=16E;55 30B=170;55 30C=1D3;55 30F=214;55 311=216;55',\n ' 31B=1AF;55 323=1EE4;55 324=1E72;55 328=172;55 32D=1E76;55 330=1E74;56 303=1E7C;56 323=1',\n 'E7E;57 300=1E80;57 301=1E82;57 302=174;57 307=1E86;57 308=1E84;57 323=1E88;58 307=1E8A;5',\n '8 308=1E8C;59 300=1EF2;59 301=DD;59 302=176;59 303=1EF8;59 304=232;59 307=1E8E;59 308=17',\n '8;59 309=1EF6;59 323=1EF4;5A 301=179;5A 302=1E90;5A 307=17B;5A 30C=17D;5A 323=1E92;5A 33',\n '1=1E94;61 300=E0;61 301=E1;61 302=E2;61 303=E3;61 304=101;61 306=103;61 307=227;61 308=E',\n '4;61 309=1EA3;61 30A=E5;61 30C=1CE;61 30F=201;61 311=203;61 323=1EA1;61 325=1E01;61 328=',\n '105;62 307=1E03;62 323=1E05;62 331=1E07;63 301=107;63 302=109;63 307=10B;63 30C=10D;63 3',\n '27=E7;64 307=1E0B;64 30C=10F;64 323=1E0D;64 327=1E11;64 32D=1E13;64 331=1E0F;65 300=E8;6',\n '5 301=E9;65 302=EA;65 303=1EBD;65 304=113;65 306=115;65 307=117;65 308=EB;65 309=1EBB;65',\n ' 30C=11B;65 30F=205;65 311=207;65 323=1EB9;65 327=229;65 328=119;65 32D=1E19;65 330=1E1B',\n ';66 307=1E1F;67 301=1F5;67 302=11D;67 304=1E21;67 306=11F;67 307=121;67 30C=1E7;67 327=1',\n '23;68 302=125;68 307=1E23;68 308=1E27;68 30C=21F;68 323=1E25;68 327=1E29;68 32E=1E2B;68 ',\n '331=1E96;69 300=EC;69 301=ED;69 302=EE;69 303=129;69 304=12B;69 306=12D;69 308=EF;69 309',\n '=1EC9;69 30C=1D0;69 30F=209;69 311=20B;69 323=1ECB;69 328=12F;69 330=1E2D;6A 302=135;6A ',\n '30C=1F0;6B 301=1E31;6B 30C=1E9;6B 323=1E33;6B 327=137;6B 331=1E35;6C 301=13A;6C 30C=13E;',\n '6C 323=1E37;6C 327=13C;6C 32D=1E3D;6C 331=1E3B;6D 301=1E3F;6D 307=1E41;6D 323=1E43;6E 30',\n '0=1F9;6E 301=144;6E 303=F1;6E 307=1E45;6E 30C=148;6E 323=1E47;6E 327=146;6E 32D=1E4B;6E ',\n '331=1E49;6F 300=F2;6F 301=F3;6F 302=F4;6F 303=F5;6F 304=14D;6F 306=14F;6F 307=22F;6F 308',\n '=F6;6F 309=1ECF;6F 30B=151;6F 30C=1D2;6F 30F=20D;6F 311=20F;6F 31B=1A1;6F 323=1ECD;6F 32',\n '8=1EB;70 301=1E55;70 307=1E57;72 301=155;72 307=1E59;72 30C=159;72 30F=211;72 311=213;72',\n ' 323=1E5B;72 327=157;72 331=1E5F;73 301=15B;73 302=15D;73 307=1E61;73 30C=161;73 323=1E6',\n '3;73 326=219;73 327=15F;74 307=1E6B;74 308=1E97;74 30C=165;74 323=1E6D;74 326=21B;74 327',\n '=163;74 32D=1E71;74 331=1E6F;75 300=F9;75 301=FA;75 302=FB;75 303=169;75 304=16B;75 306=',\n '16D;75 308=FC;75 309=1EE7;75 30A=16F;75 30B=171;75 30C=1D4;75 30F=215;75 311=217;75 31B=',\n '1B0;75 323=1EE5;75 324=1E73;75 328=173;75 32D=1E77;75 330=1E75;76 303=1E7D;76 323=1E7F;7',\n '7 300=1E81;77 301=1E83;77 302=175;77 307=1E87;77 308=1E85;77 30A=1E98;77 323=1E89;78 307',\n '=1E8B;78 308=1E8D;79 300=1EF3;79 301=FD;79 302=177;79 303=1EF9;79 304=233;79 307=1E8F;79',\n ' 308=FF;79 309=1EF7;79 30A=1E99;79 323=1EF5;7A 301=17A;7A 302=1E91;7A 307=17C;7A 30C=17E',\n ';7A 323=1E93;7A 331=1E95;A8 300=1FED;A8 301=385;A8 342=1FC1;C2 300=1EA6;C2 301=1EA4;C2 3',\n '03=1EAA;C2 309=1EA8;C4 304=1DE;C5 301=1FA;C6 301=1FC;C6 304=1E2;C7 301=1E08;CA 300=1EC0;',\n 'CA 301=1EBE;CA 303=1EC4;CA 309=1EC2;CF 301=1E2E;D4 300=1ED2;D4 301=1ED0;D4 303=1ED6;D4 3',\n '09=1ED4;D5 301=1E4C;D5 304=22C;D5 308=1E4E;D6 304=22A;D8 301=1FE;DC 300=1DB;DC 301=1D7;D',\n 'C 304=1D5;DC 30C=1D9;E2 300=1EA7;E2 301=1EA5;E2 303=1EAB;E2 309=1EA9;E4 304=1DF;E5 301=1',\n 'FB;E6 301=1FD;E6 304=1E3;E7 301=1E09;EA 300=1EC1;EA 301=1EBF;EA 303=1EC5;EA 309=1EC3;EF ',\n '301=1E2F;F4 300=1ED3;F4 301=1ED1;F4 303=1ED7;F4 309=1ED5;F5 301=1E4D;F5 304=22D;F5 308=1',\n 'E4F;F6 304=22B;F8 301=1FF;FC 300=1DC;FC 301=1D8;FC 304=1D6;FC 30C=1DA;102 300=1EB0;102 3',\n '01=1EAE;102 303=1EB4;102 309=1EB2;103 300=1EB1;103 301=1EAF;103 303=1EB5;103 309=1EB3;11',\n '2 300=1E14;112 301=1E16;113 300=1E15;113 301=1E17;14C 300=1E50;14C 301=1E52;14D 300=1E51',\n ';14D 301=1E53;15A 307=1E64;15B 307=1E65;160 307=1E66;161 307=1E67;168 301=1E78;169 301=1',\n 'E79;16A 308=1E7A;16B 308=1E7B;17F 307=1E9B;1A0 300=1EDC;1A0 301=1EDA;1A0 303=1EE0;1A0 30',\n '9=1EDE;1A0 323=1EE2;1A1 300=1EDD;1A1 301=1EDB;1A1 303=1EE1;1A1 309=1EDF;1A1 323=1EE3;1AF',\n ' 300=1EEA;1AF 301=1EE8;1AF 303=1EEE;1AF 309=1EEC;1AF 323=1EF0;1B0 300=1EEB;1B0 301=1EE9;',\n '1B0 303=1EEF;1B0 309=1EED;1B0 323=1EF1;1B7 30C=1EE;1EA 304=1EC;1EB 304=1ED;226 304=1E0;2',\n '27 304=1E1;228 306=1E1C;229 306=1E1D;22E 304=230;22F 304=231;292 30C=1EF;391 300=1FBA;39',\n '1 301=386;391 304=1FB9;391 306=1FB8;391 313=1F08;391 314=1F09;391 345=1FBC;395 300=1FC8;',\n '395 301=388;395 313=1F18;395 314=1F19;397 300=1FCA;397 301=389;397 313=1F28;397 314=1F29',\n ';397 345=1FCC;399 300=1FDA;399 301=38A;399 304=1FD9;399 306=1FD8;399 308=3AA;399 313=1F3',\n '8;399 314=1F39;39F 300=1FF8;39F 301=38C;39F 313=1F48;39F 314=1F49;3A1 314=1FEC;3A5 300=1',\n 'FEA;3A5 301=38E;3A5 304=1FE9;3A5 306=1FE8;3A5 308=3AB;3A5 314=1F59;3A9 300=1FFA;3A9 301=',\n '38F;3A9 313=1F68;3A9 314=1F69;3A9 345=1FFC;3AC 345=1FB4;3AE 345=1FC4;3B1 300=1F70;3B1 30',\n '1=3AC;3B1 304=1FB1;3B1 306=1FB0;3B1 313=1F00;3B1 314=1F01;3B1 342=1FB6;3B1 345=1FB3;3B5 ',\n '300=1F72;3B5 301=3AD;3B5 313=1F10;3B5 314=1F11;3B7 300=1F74;3B7 301=3AE;3B7 313=1F20;3B7',\n ' 314=1F21;3B7 342=1FC6;3B7 345=1FC3;3B9 300=1F76;3B9 301=3AF;3B9 304=1FD1;3B9 306=1FD0;3',\n 'B9 308=3CA;3B9 313=1F30;3B9 314=1F31;3B9 342=1FD6;3BF 300=1F78;3BF 301=3CC;3BF 313=1F40;',\n '3BF 314=1F41;3C1 313=1FE4;3C1 314=1FE5;3C5 300=1F7A;3C5 301=3CD;3C5 304=1FE1;3C5 306=1FE',\n '0;3C5 308=3CB;3C5 313=1F50;3C5 314=1F51;3C5 342=1FE6;3C9 300=1F7C;3C9 301=3CE;3C9 313=1F',\n '60;3C9 314=1F61;3C9 342=1FF6;3C9 345=1FF3;3CA 300=1FD2;3CA 301=390;3CA 342=1FD7;3CB 300=',\n '1FE2;3CB 301=3B0;3CB 342=1FE7;3CE 345=1FF4;3D2 301=3D3;3D2 308=3D4;406 308=407;410 306=4',\n 'D0;410 308=4D2;413 301=403;415 300=400;415 306=4D6;415 308=401;416 306=4C1;416 308=4DC;4',\n '17 308=4DE;418 300=40D;418 304=4E2;418 306=419;418 308=4E4;41A 301=40C;41E 308=4E6;423 3',\n '04=4EE;423 306=40E;423 308=4F0;423 30B=4F2;427 308=4F4;42B 308=4F8;42D 308=4EC;430 306=4',\n 'D1;430 308=4D3;433 301=453;435 300=450;435 306=4D7;435 308=451;436 306=4C2;436 308=4DD;4',\n '37 308=4DF;438 300=45D;438 304=4E3;438 306=439;438 308=4E5;43A 301=45C;43E 308=4E7;443 3',\n '04=4EF;443 306=45E;443 308=4F1;443 30B=4F3;447 308=4F5;44B 308=4F9;44D 308=4ED;456 308=4',\n '57;474 30F=476;475 30F=477;4D8 308=4DA;4D9 308=4DB;4E8 308=4EA;4E9 308=4EB;627 653=622;6',\n '27 654=623;627 655=625;648 654=624;64A 654=626;6C1 654=6C2;6D2 654=6D3;6D5 654=6C0;928 9',\n '3C=929;930 93C=931;933 93C=934;9C7 9BE=9CB;9C7 9D7=9CC;B47 B3E=B4B;B47 B56=B48;B47 B57=B',\n '4C;B92 BD7=B94;BC6 BBE=BCA;BC6 BD7=BCC;BC7 BBE=BCB;C46 C56=C48;CBF CD5=CC0;CC6 CC2=CCA;C',\n 'C6 CD5=CC7;CC6 CD6=CC8;CCA CD5=CCB;D46 D3E=D4A;D46 D57=D4C;D47 D3E=D4B;DD9 DCA=DDA;DD9 D',\n 'CF=DDC;DD9 DDF=DDE;DDC DCA=DDD;1025 102E=1026;1B05 1B35=1B06;1B07 1B35=1B08;1B09 1B35=1B',\n '0A;1B0B 1B35=1B0C;1B0D 1B35=1B0E;1B11 1B35=1B12;1B3A 1B35=1B3B;1B3C 1B35=1B3D;1B3E 1B35=',\n '1B40;1B3F 1B35=1B41;1B42 1B35=1B43;1E36 304=1E38;1E37 304=1E39;1E5A 304=1E5C;1E5B 304=1E',\n '5D;1E62 307=1E68;1E63 307=1E69;1EA0 302=1EAC;1EA0 306=1EB6;1EA1 302=1EAD;1EA1 306=1EB7;1',\n 'EB8 302=1EC6;1EB9 302=1EC7;1ECC 302=1ED8;1ECD 302=1ED9;1F00 300=1F02;1F00 301=1F04;1F00 ',\n '342=1F06;1F00 345=1F80;1F01 300=1F03;1F01 301=1F05;1F01 342=1F07;1F01 345=1F81;1F02 345=',\n '1F82;1F03 345=1F83;1F04 345=1F84;1F05 345=1F85;1F06 345=1F86;1F07 345=1F87;1F08 300=1F0A',\n ';1F08 301=1F0C;1F08 342=1F0E;1F08 345=1F88;1F09 300=1F0B;1F09 301=1F0D;1F09 342=1F0F;1F0',\n '9 345=1F89;1F0A 345=1F8A;1F0B 345=1F8B;1F0C 345=1F8C;1F0D 345=1F8D;1F0E 345=1F8E;1F0F 34',\n '5=1F8F;1F10 300=1F12;1F10 301=1F14;1F11 300=1F13;1F11 301=1F15;1F18 300=1F1A;1F18 301=1F',\n '1C;1F19 300=1F1B;1F19 301=1F1D;1F20 300=1F22;1F20 301=1F24;1F20 342=1F26;1F20 345=1F90;1',\n 'F21 300=1F23;1F21 301=1F25;1F21 342=1F27;1F21 345=1F91;1F22 345=1F92;1F23 345=1F93;1F24 ',\n '345=1F94;1F25 345=1F95;1F26 345=1F96;1F27 345=1F97;1F28 300=1F2A;1F28 301=1F2C;1F28 342=',\n '1F2E;1F28 345=1F98;1F29 300=1F2B;1F29 301=1F2D;1F29 342=1F2F;1F29 345=1F99;1F2A 345=1F9A',\n ';1F2B 345=1F9B;1F2C 345=1F9C;1F2D 345=1F9D;1F2E 345=1F9E;1F2F 345=1F9F;1F30 300=1F32;1F3',\n '0 301=1F34;1F30 342=1F36;1F31 300=1F33;1F31 301=1F35;1F31 342=1F37;1F38 300=1F3A;1F38 30',\n '1=1F3C;1F38 342=1F3E;1F39 300=1F3B;1F39 301=1F3D;1F39 342=1F3F;1F40 300=1F42;1F40 301=1F',\n '44;1F41 300=1F43;1F41 301=1F45;1F48 300=1F4A;1F48 301=1F4C;1F49 300=1F4B;1F49 301=1F4D;1',\n 'F50 300=1F52;1F50 301=1F54;1F50 342=1F56;1F51 300=1F53;1F51 301=1F55;1F51 342=1F57;1F59 ',\n '300=1F5B;1F59 301=1F5D;1F59 342=1F5F;1F60 300=1F62;1F60 301=1F64;1F60 342=1F66;1F60 345=',\n '1FA0;1F61 300=1F63;1F61 301=1F65;1F61 342=1F67;1F61 345=1FA1;1F62 345=1FA2;1F63 345=1FA3',\n ';1F64 345=1FA4;1F65 345=1FA5;1F66 345=1FA6;1F67 345=1FA7;1F68 300=1F6A;1F68 301=1F6C;1F6',\n '8 342=1F6E;1F68 345=1FA8;1F69 300=1F6B;1F69 301=1F6D;1F69 342=1F6F;1F69 345=1FA9;1F6A 34',\n '5=1FAA;1F6B 345=1FAB;1F6C 345=1FAC;1F6D 345=1FAD;1F6E 345=1FAE;1F6F 345=1FAF;1F70 345=1F',\n 'B2;1F74 345=1FC2;1F7C 345=1FF2;1FB6 345=1FB7;1FBF 300=1FCD;1FBF 301=1FCE;1FBF 342=1FCF;1',\n 'FC6 345=1FC7;1FF6 345=1FF7;1FFE 300=1FDD;1FFE 301=1FDE;1FFE 342=1FDF;2190 338=219A;2192 ',\n '338=219B;2194 338=21AE;21D0 338=21CD;21D2 338=21CF;21D4 338=21CE;2203 338=2204;2208 338=',\n '2209;220B 338=220C;2223 338=2224;2225 338=2226;223C 338=2241;2243 338=2244;2245 338=2247',\n ';2248 338=2249;224D 338=226D;2261 338=2262;2264 338=2270;2265 338=2271;2272 338=2274;227',\n '3 338=2275;2276 338=2278;2277 338=2279;227A 338=2280;227B 338=2281;227C 338=22E0;227D 33',\n '8=22E1;2282 338=2284;2283 338=2285;2286 338=2288;2287 338=2289;2291 338=22E2;2292 338=22',\n 'E3;22A2 338=22AC;22A8 338=22AD;22A9 338=22AE;22AB 338=22AF;22B2 338=22EA;22B3 338=22EB;2',\n '2B4 338=22EC;22B5 338=22ED;3046 3099=3094;304B 3099=304C;304D 3099=304E;304F 3099=3050;3',\n '051 3099=3052;3053 3099=3054;3055 3099=3056;3057 3099=3058;3059 3099=305A;305B 3099=305C',\n ';305D 3099=305E;305F 3099=3060;3061 3099=3062;3064 3099=3065;3066 3099=3067;3068 3099=30',\n '69;306F 3099=3070;306F 309A=3071;3072 3099=3073;3072 309A=3074;3075 3099=3076;3075 309A=',\n '3077;3078 3099=3079;3078 309A=307A;307B 3099=307C;307B 309A=307D;309D 3099=309E;30A6 309',\n '9=30F4;30AB 3099=30AC;30AD 3099=30AE;30AF 3099=30B0;30B1 3099=30B2;30B3 3099=30B4;30B5 3',\n '099=30B6;30B7 3099=30B8;30B9 3099=30BA;30BB 3099=30BC;30BD 3099=30BE;30BF 3099=30C0;30C1',\n ' 3099=30C2;30C4 3099=30C5;30C6 3099=30C7;30C8 3099=30C9;30CF 3099=30D0;30CF 309A=30D1;30',\n 'D2 3099=30D3;30D2 309A=30D4;30D5 3099=30D6;30D5 309A=30D7;30D8 3099=30D9;30D8 309A=30DA;',\n '30DB 3099=30DC;30DB 309A=30DD;30EF 3099=30F7;30F0 3099=30F8;30F1 3099=30F9;30F2 3099=30F',\n 'A;30FD 3099=30FE;105D2 307=105C9;105DA 307=105E4;11099 110BA=1109A;1109B 110BA=1109C;110',\n 'A5 110BA=110AB;11131 11127=1112E;11132 11127=1112F;11347 1133E=1134B;11347 11357=1134C;1',\n '1382 113C9=11383;11384 113BB=11385;1138B 113C2=1138E;11390 113C9=11391;113C2 113B8=113C7',\n ';113C2 113C2=113C5;113C2 113C9=113C8;114B9 114B0=114BC;114B9 114BA=114BB;114B9 114BD=114',\n 'BE;115B8 115AF=115BA;115B9 115AF=115BB;11935 11930=11938;1611E 1611E=16121;1611E 1611F=1',\n '6123;1611E 16120=16125;1611E 16129=16122;16121 1611F=16126;16121 16120=16128;16122 1611F',\n '=16127;16129 1611F=16124;16D63 16D67=16D69;16D67 16D67=16D68;16D69 16D67=16D6A',\n].join('');\n\n// Code points assigned in Unicode 16.0.0 (General_Category != Cn).\n// Entry: <cp> or <first>-<last>; uppercase hex; sorted, ';'-joined.\nexport const NFKC16_ASSIGNED_RANGES_PACKED: string = [\n '0-377;37A-37F;384-38A;38C;38E-3A1;3A3-52F;531-556;559-58A;58D-58F;591-5C7;5D0-5EA;5EF-5F',\n '4;600-70D;70F-74A;74D-7B1;7C0-7FA;7FD-82D;830-83E;840-85B;85E;860-86A;870-88E;890-891;89',\n '7-983;985-98C;98F-990;993-9A8;9AA-9B0;9B2;9B6-9B9;9BC-9C4;9C7-9C8;9CB-9CE;9D7;9DC-9DD;9D',\n 'F-9E3;9E6-9FE;A01-A03;A05-A0A;A0F-A10;A13-A28;A2A-A30;A32-A33;A35-A36;A38-A39;A3C;A3E-A4',\n '2;A47-A48;A4B-A4D;A51;A59-A5C;A5E;A66-A76;A81-A83;A85-A8D;A8F-A91;A93-AA8;AAA-AB0;AB2-AB',\n '3;AB5-AB9;ABC-AC5;AC7-AC9;ACB-ACD;AD0;AE0-AE3;AE6-AF1;AF9-AFF;B01-B03;B05-B0C;B0F-B10;B1',\n '3-B28;B2A-B30;B32-B33;B35-B39;B3C-B44;B47-B48;B4B-B4D;B55-B57;B5C-B5D;B5F-B63;B66-B77;B8',\n '2-B83;B85-B8A;B8E-B90;B92-B95;B99-B9A;B9C;B9E-B9F;BA3-BA4;BA8-BAA;BAE-BB9;BBE-BC2;BC6-BC',\n '8;BCA-BCD;BD0;BD7;BE6-BFA;C00-C0C;C0E-C10;C12-C28;C2A-C39;C3C-C44;C46-C48;C4A-C4D;C55-C5',\n '6;C58-C5A;C5D;C60-C63;C66-C6F;C77-C8C;C8E-C90;C92-CA8;CAA-CB3;CB5-CB9;CBC-CC4;CC6-CC8;CC',\n 'A-CCD;CD5-CD6;CDD-CDE;CE0-CE3;CE6-CEF;CF1-CF3;D00-D0C;D0E-D10;D12-D44;D46-D48;D4A-D4F;D5',\n '4-D63;D66-D7F;D81-D83;D85-D96;D9A-DB1;DB3-DBB;DBD;DC0-DC6;DCA;DCF-DD4;DD6;DD8-DDF;DE6-DE',\n 'F;DF2-DF4;E01-E3A;E3F-E5B;E81-E82;E84;E86-E8A;E8C-EA3;EA5;EA7-EBD;EC0-EC4;EC6;EC8-ECE;ED',\n '0-ED9;EDC-EDF;F00-F47;F49-F6C;F71-F97;F99-FBC;FBE-FCC;FCE-FDA;1000-10C5;10C7;10CD;10D0-1',\n '248;124A-124D;1250-1256;1258;125A-125D;1260-1288;128A-128D;1290-12B0;12B2-12B5;12B8-12BE',\n ';12C0;12C2-12C5;12C8-12D6;12D8-1310;1312-1315;1318-135A;135D-137C;1380-1399;13A0-13F5;13',\n 'F8-13FD;1400-169C;16A0-16F8;1700-1715;171F-1736;1740-1753;1760-176C;176E-1770;1772-1773;',\n '1780-17DD;17E0-17E9;17F0-17F9;1800-1819;1820-1878;1880-18AA;18B0-18F5;1900-191E;1920-192',\n 'B;1930-193B;1940;1944-196D;1970-1974;1980-19AB;19B0-19C9;19D0-19DA;19DE-1A1B;1A1E-1A5E;1',\n 'A60-1A7C;1A7F-1A89;1A90-1A99;1AA0-1AAD;1AB0-1ACE;1B00-1B4C;1B4E-1BF3;1BFC-1C37;1C3B-1C49',\n ';1C4D-1C8A;1C90-1CBA;1CBD-1CC7;1CD0-1CFA;1D00-1F15;1F18-1F1D;1F20-1F45;1F48-1F4D;1F50-1F',\n '57;1F59;1F5B;1F5D;1F5F-1F7D;1F80-1FB4;1FB6-1FC4;1FC6-1FD3;1FD6-1FDB;1FDD-1FEF;1FF2-1FF4;',\n '1FF6-1FFE;2000-2064;2066-2071;2074-208E;2090-209C;20A0-20C0;20D0-20F0;2100-218B;2190-242',\n '9;2440-244A;2460-2B73;2B76-2B95;2B97-2CF3;2CF9-2D25;2D27;2D2D;2D30-2D67;2D6F-2D70;2D7F-2',\n 'D96;2DA0-2DA6;2DA8-2DAE;2DB0-2DB6;2DB8-2DBE;2DC0-2DC6;2DC8-2DCE;2DD0-2DD6;2DD8-2DDE;2DE0',\n '-2E5D;2E80-2E99;2E9B-2EF3;2F00-2FD5;2FF0-303F;3041-3096;3099-30FF;3105-312F;3131-318E;31',\n '90-31E5;31EF-321E;3220-A48C;A490-A4C6;A4D0-A62B;A640-A6F7;A700-A7CD;A7D0-A7D1;A7D3;A7D5-',\n 'A7DC;A7F2-A82C;A830-A839;A840-A877;A880-A8C5;A8CE-A8D9;A8E0-A953;A95F-A97C;A980-A9CD;A9C',\n 'F-A9D9;A9DE-A9FE;AA00-AA36;AA40-AA4D;AA50-AA59;AA5C-AAC2;AADB-AAF6;AB01-AB06;AB09-AB0E;A',\n 'B11-AB16;AB20-AB26;AB28-AB2E;AB30-AB6B;AB70-ABED;ABF0-ABF9;AC00-D7A3;D7B0-D7C6;D7CB-D7FB',\n ';D800-FA6D;FA70-FAD9;FB00-FB06;FB13-FB17;FB1D-FB36;FB38-FB3C;FB3E;FB40-FB41;FB43-FB44;FB',\n '46-FBC2;FBD3-FD8F;FD92-FDC7;FDCF;FDF0-FE19;FE20-FE52;FE54-FE66;FE68-FE6B;FE70-FE74;FE76-',\n 'FEFC;FEFF;FF01-FFBE;FFC2-FFC7;FFCA-FFCF;FFD2-FFD7;FFDA-FFDC;FFE0-FFE6;FFE8-FFEE;FFF9-FFF',\n 'D;10000-1000B;1000D-10026;10028-1003A;1003C-1003D;1003F-1004D;10050-1005D;10080-100FA;10',\n '100-10102;10107-10133;10137-1018E;10190-1019C;101A0;101D0-101FD;10280-1029C;102A0-102D0;',\n '102E0-102FB;10300-10323;1032D-1034A;10350-1037A;10380-1039D;1039F-103C3;103C8-103D5;1040',\n '0-1049D;104A0-104A9;104B0-104D3;104D8-104FB;10500-10527;10530-10563;1056F-1057A;1057C-10',\n '58A;1058C-10592;10594-10595;10597-105A1;105A3-105B1;105B3-105B9;105BB-105BC;105C0-105F3;',\n '10600-10736;10740-10755;10760-10767;10780-10785;10787-107B0;107B2-107BA;10800-10805;1080',\n '8;1080A-10835;10837-10838;1083C;1083F-10855;10857-1089E;108A7-108AF;108E0-108F2;108F4-10',\n '8F5;108FB-1091B;1091F-10939;1093F;10980-109B7;109BC-109CF;109D2-10A03;10A05-10A06;10A0C-',\n '10A13;10A15-10A17;10A19-10A35;10A38-10A3A;10A3F-10A48;10A50-10A58;10A60-10A9F;10AC0-10AE',\n '6;10AEB-10AF6;10B00-10B35;10B39-10B55;10B58-10B72;10B78-10B91;10B99-10B9C;10BA9-10BAF;10',\n 'C00-10C48;10C80-10CB2;10CC0-10CF2;10CFA-10D27;10D30-10D39;10D40-10D65;10D69-10D85;10D8E-',\n '10D8F;10E60-10E7E;10E80-10EA9;10EAB-10EAD;10EB0-10EB1;10EC2-10EC4;10EFC-10F27;10F30-10F5',\n '9;10F70-10F89;10FB0-10FCB;10FE0-10FF6;11000-1104D;11052-11075;1107F-110C2;110CD;110D0-11',\n '0E8;110F0-110F9;11100-11134;11136-11147;11150-11176;11180-111DF;111E1-111F4;11200-11211;',\n '11213-11241;11280-11286;11288;1128A-1128D;1128F-1129D;1129F-112A9;112B0-112EA;112F0-112F',\n '9;11300-11303;11305-1130C;1130F-11310;11313-11328;1132A-11330;11332-11333;11335-11339;11',\n '33B-11344;11347-11348;1134B-1134D;11350;11357;1135D-11363;11366-1136C;11370-11374;11380-',\n '11389;1138B;1138E;11390-113B5;113B7-113C0;113C2;113C5;113C7-113CA;113CC-113D5;113D7-113D',\n '8;113E1-113E2;11400-1145B;1145D-11461;11480-114C7;114D0-114D9;11580-115B5;115B8-115DD;11',\n '600-11644;11650-11659;11660-1166C;11680-116B9;116C0-116C9;116D0-116E3;11700-1171A;1171D-',\n '1172B;11730-11746;11800-1183B;118A0-118F2;118FF-11906;11909;1190C-11913;11915-11916;1191',\n '8-11935;11937-11938;1193B-11946;11950-11959;119A0-119A7;119AA-119D7;119DA-119E4;11A00-11',\n 'A47;11A50-11AA2;11AB0-11AF8;11B00-11B09;11BC0-11BE1;11BF0-11BF9;11C00-11C08;11C0A-11C36;',\n '11C38-11C45;11C50-11C6C;11C70-11C8F;11C92-11CA7;11CA9-11CB6;11D00-11D06;11D08-11D09;11D0',\n 'B-11D36;11D3A;11D3C-11D3D;11D3F-11D47;11D50-11D59;11D60-11D65;11D67-11D68;11D6A-11D8E;11',\n 'D90-11D91;11D93-11D98;11DA0-11DA9;11EE0-11EF8;11F00-11F10;11F12-11F3A;11F3E-11F5A;11FB0;',\n '11FC0-11FF1;11FFF-12399;12400-1246E;12470-12474;12480-12543;12F90-12FF2;13000-13455;1346',\n '0-143FA;14400-14646;16100-16139;16800-16A38;16A40-16A5E;16A60-16A69;16A6E-16ABE;16AC0-16',\n 'AC9;16AD0-16AED;16AF0-16AF5;16B00-16B45;16B50-16B59;16B5B-16B61;16B63-16B77;16B7D-16B8F;',\n '16D40-16D79;16E40-16E9A;16F00-16F4A;16F4F-16F87;16F8F-16F9F;16FE0-16FE4;16FF0-16FF1;1700',\n '0-187F7;18800-18CD5;18CFF-18D08;1AFF0-1AFF3;1AFF5-1AFFB;1AFFD-1AFFE;1B000-1B122;1B132;1B',\n '150-1B152;1B155;1B164-1B167;1B170-1B2FB;1BC00-1BC6A;1BC70-1BC7C;1BC80-1BC88;1BC90-1BC99;',\n '1BC9C-1BCA3;1CC00-1CCF9;1CD00-1CEB3;1CF00-1CF2D;1CF30-1CF46;1CF50-1CFC3;1D000-1D0F5;1D10',\n '0-1D126;1D129-1D1EA;1D200-1D245;1D2C0-1D2D3;1D2E0-1D2F3;1D300-1D356;1D360-1D378;1D400-1D',\n '454;1D456-1D49C;1D49E-1D49F;1D4A2;1D4A5-1D4A6;1D4A9-1D4AC;1D4AE-1D4B9;1D4BB;1D4BD-1D4C3;',\n '1D4C5-1D505;1D507-1D50A;1D50D-1D514;1D516-1D51C;1D51E-1D539;1D53B-1D53E;1D540-1D544;1D54',\n '6;1D54A-1D550;1D552-1D6A5;1D6A8-1D7CB;1D7CE-1DA8B;1DA9B-1DA9F;1DAA1-1DAAF;1DF00-1DF1E;1D',\n 'F25-1DF2A;1E000-1E006;1E008-1E018;1E01B-1E021;1E023-1E024;1E026-1E02A;1E030-1E06D;1E08F;',\n '1E100-1E12C;1E130-1E13D;1E140-1E149;1E14E-1E14F;1E290-1E2AE;1E2C0-1E2F9;1E2FF;1E4D0-1E4F',\n '9;1E5D0-1E5FA;1E5FF;1E7E0-1E7E6;1E7E8-1E7EB;1E7ED-1E7EE;1E7F0-1E7FE;1E800-1E8C4;1E8C7-1E',\n '8D6;1E900-1E94B;1E950-1E959;1E95E-1E95F;1EC71-1ECB4;1ED01-1ED3D;1EE00-1EE03;1EE05-1EE1F;',\n '1EE21-1EE22;1EE24;1EE27;1EE29-1EE32;1EE34-1EE37;1EE39;1EE3B;1EE42;1EE47;1EE49;1EE4B;1EE4',\n 'D-1EE4F;1EE51-1EE52;1EE54;1EE57;1EE59;1EE5B;1EE5D;1EE5F;1EE61-1EE62;1EE64;1EE67-1EE6A;1E',\n 'E6C-1EE72;1EE74-1EE77;1EE79-1EE7C;1EE7E;1EE80-1EE89;1EE8B-1EE9B;1EEA1-1EEA3;1EEA5-1EEA9;',\n '1EEAB-1EEBB;1EEF0-1EEF1;1F000-1F02B;1F030-1F093;1F0A0-1F0AE;1F0B1-1F0BF;1F0C1-1F0CF;1F0D',\n '1-1F0F5;1F100-1F1AD;1F1E6-1F202;1F210-1F23B;1F240-1F248;1F250-1F251;1F260-1F265;1F300-1F',\n '6D7;1F6DC-1F6EC;1F6F0-1F6FC;1F700-1F776;1F77B-1F7D9;1F7E0-1F7EB;1F7F0;1F800-1F80B;1F810-',\n '1F847;1F850-1F859;1F860-1F887;1F890-1F8AD;1F8B0-1F8BB;1F8C0-1F8C1;1F900-1FA53;1FA60-1FA6',\n 'D;1FA70-1FA7C;1FA80-1FA89;1FA8F-1FAC6;1FACE-1FADC;1FADF-1FAE9;1FAF0-1FAF8;1FB00-1FB92;1F',\n 'B94-1FBF9;20000-2A6DF;2A700-2B739;2B740-2B81D;2B820-2CEA1;2CEB0-2EBE0;2EBF0-2EE5D;2F800-',\n '2FA1D;30000-3134A;31350-323AF;E0001;E0020-E007F;E0100-E01EF;F0000-FFFFD;100000-10FFFD',\n].join('');\n\n// Code points with White_Space=Yes in Unicode 16.0.0.\n// Entry: <cp> or <first>-<last>; uppercase hex; sorted, ';'-joined.\nexport const NFKC16_WHITE_SPACE_RANGES_PACKED: string = [\n '9-D;20;85;A0;1680;2000-200A;2028-2029;202F;205F;3000',\n].join('');\n","// Pinned Unicode 16.0.0 NFKC normalization.\n//\n// Keys derived from passphrases must come out identical in every conformant\n// implementation, today and years from now, so this module never delegates to\n// the host engine's String.prototype.normalize — those tables float with the\n// runtime's Unicode version, and two engines on different versions can derive\n// different keys from the same passphrase. The tables here are generated from\n// the Unicode 16.0.0 UCD and pinned. Code points that Unicode 16.0 leaves\n// unassigned are rejected outright: the Unicode stability policy only\n// guarantees normalization stability for code points that are assigned in the\n// pinned version, so passing unassigned input through would re-open the drift.\n//\n// Algorithm (UAX #15, no quick-check fast path): validate scalar values and\n// the assigned-at-16.0 guard, fully decompose through the flat NFKD table\n// (recursion was resolved at table-generation time; Hangul is algorithmic),\n// canonically reorder by combining class, then canonically compose (pair\n// table with composition exclusions applied, plus algorithmic Hangul).\n\nimport {\n NFKC16_ASSIGNED_RANGES_PACKED,\n NFKC16_CCC_PACKED,\n NFKC16_COMPOSITION_PACKED,\n NFKC16_DECOMPOSITION_PACKED,\n NFKC16_WHITE_SPACE_RANGES_PACKED,\n} from './nfkc16-data';\n\nexport type Nfkc16ErrorCode = 'UNPAIRED_SURROGATE' | 'UNASSIGNED_CODEPOINT';\n\nexport class Nfkc16Error extends Error {\n readonly code: Nfkc16ErrorCode;\n /** The offending code point (for UNPAIRED_SURROGATE, the lone surrogate code unit). */\n readonly codePoint: number;\n\n constructor(code: Nfkc16ErrorCode, message: string, codePoint: number) {\n super(message);\n this.name = 'Nfkc16Error';\n this.code = code;\n this.codePoint = codePoint;\n }\n}\n\n// Hangul decomposition/composition is algorithmic (UAX #15 section 3.12).\nconst HANGUL_S_BASE = 0xac00;\nconst HANGUL_L_BASE = 0x1100;\nconst HANGUL_V_BASE = 0x1161;\nconst HANGUL_T_BASE = 0x11a7;\nconst HANGUL_L_COUNT = 19;\nconst HANGUL_V_COUNT = 21;\nconst HANGUL_T_COUNT = 28;\nconst HANGUL_N_COUNT = HANGUL_V_COUNT * HANGUL_T_COUNT; // 588\nconst HANGUL_S_COUNT = HANGUL_L_COUNT * HANGUL_N_COUNT; // 11172\n\nconst MAX_CODE_POINT = 0x10ffff;\n\n// Composition pairs are keyed as starter * 2^21 + combining; both halves are\n// scalar values (<= 0x10FFFF < 2^21), so the packed key stays an exact integer.\nconst COMPOSITION_KEY_SHIFT = 0x200000;\n\ninterface Nfkc16Tables {\n readonly decomposition: ReadonlyMap<number, readonly number[]>;\n readonly ccc: ReadonlyMap<number, number>;\n readonly composition: ReadonlyMap<number, number>;\n /** Flat sorted [start0, end0, start1, end1, ...] pairs for binary search. */\n readonly assignedRanges: Uint32Array;\n readonly whiteSpaceRanges: Uint32Array;\n}\n\nfunction parseDecomposition(packed: string): Map<number, readonly number[]> {\n const out = new Map<number, readonly number[]>();\n for (const entry of packed.split(';')) {\n const eq = entry.indexOf('=');\n const cp = parseInt(entry.slice(0, eq), 16);\n const targets = entry\n .slice(eq + 1)\n .split(' ')\n .map((token) => parseInt(token, 16));\n out.set(cp, targets);\n }\n return out;\n}\n\nfunction parseCcc(packed: string): Map<number, number> {\n const out = new Map<number, number>();\n for (const entry of packed.split(';')) {\n const colon = entry.indexOf(':');\n const value = parseInt(entry.slice(colon + 1), 16);\n const span = entry.slice(0, colon);\n const dash = span.indexOf('-');\n const first = parseInt(dash < 0 ? span : span.slice(0, dash), 16);\n const last = dash < 0 ? first : parseInt(span.slice(dash + 1), 16);\n for (let cp = first; cp <= last; cp++) out.set(cp, value);\n }\n return out;\n}\n\nfunction parseComposition(packed: string): Map<number, number> {\n const out = new Map<number, number>();\n for (const entry of packed.split(';')) {\n const eq = entry.indexOf('=');\n const space = entry.indexOf(' ');\n const starter = parseInt(entry.slice(0, space), 16);\n const combining = parseInt(entry.slice(space + 1, eq), 16);\n out.set(starter * COMPOSITION_KEY_SHIFT + combining, parseInt(entry.slice(eq + 1), 16));\n }\n return out;\n}\n\nfunction parseRanges(packed: string): Uint32Array {\n const entries = packed.split(';');\n const out = new Uint32Array(entries.length * 2);\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i] ?? '';\n const dash = entry.indexOf('-');\n const first = parseInt(dash < 0 ? entry : entry.slice(0, dash), 16);\n const last = dash < 0 ? first : parseInt(entry.slice(dash + 1), 16);\n out[i * 2] = first;\n out[i * 2 + 1] = last;\n }\n return out;\n}\n\nlet cachedTables: Nfkc16Tables | undefined;\n\nfunction tables(): Nfkc16Tables {\n cachedTables ??= {\n decomposition: parseDecomposition(NFKC16_DECOMPOSITION_PACKED),\n ccc: parseCcc(NFKC16_CCC_PACKED),\n composition: parseComposition(NFKC16_COMPOSITION_PACKED),\n assignedRanges: parseRanges(NFKC16_ASSIGNED_RANGES_PACKED),\n whiteSpaceRanges: parseRanges(NFKC16_WHITE_SPACE_RANGES_PACKED),\n };\n return cachedTables;\n}\n\nfunction inRanges(ranges: Uint32Array, codePoint: number): boolean {\n let lo = 0;\n let hi = ranges.length / 2 - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n // The fallbacks are unreachable (mid is in bounds) and fail closed.\n const start = ranges[mid * 2] ?? Number.MAX_SAFE_INTEGER;\n const end = ranges[mid * 2 + 1] ?? -1;\n if (codePoint < start) hi = mid - 1;\n else if (codePoint > end) lo = mid + 1;\n else return true;\n }\n return false;\n}\n\n/** Whether the code point is assigned (General_Category != Cn) in Unicode 16.0.0. */\nexport function isAssigned16(codePoint: number): boolean {\n if (!Number.isInteger(codePoint) || codePoint < 0 || codePoint > MAX_CODE_POINT) return false;\n return inRanges(tables().assignedRanges, codePoint);\n}\n\n/** Whether the code point has White_Space=Yes in Unicode 16.0.0. */\nexport function isWhiteSpace16(codePoint: number): boolean {\n if (!Number.isInteger(codePoint) || codePoint < 0 || codePoint > MAX_CODE_POINT) return false;\n return inRanges(tables().whiteSpaceRanges, codePoint);\n}\n\nfunction unpairedSurrogate(unit: number, index: number): Nfkc16Error {\n return new Nfkc16Error(\n 'UNPAIRED_SURROGATE',\n `unpaired surrogate 0x${unit.toString(16).toUpperCase()} at UTF-16 index ${index}`,\n unit,\n );\n}\n\n/**\n * Decode the input into Unicode scalar values, rejecting lone surrogates, and\n * enforce the assigned-at-16.0 guard. Errors are raised in input order.\n */\nfunction validatedScalarValues(input: string, t: Nfkc16Tables): number[] {\n const codePoints: number[] = [];\n for (let i = 0; i < input.length; i++) {\n const unit = input.charCodeAt(i);\n let codePoint = unit;\n if (unit >= 0xd800 && unit <= 0xdbff) {\n const next = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;\n if (next < 0xdc00 || next > 0xdfff) throw unpairedSurrogate(unit, i);\n codePoint = 0x10000 + ((unit - 0xd800) << 10) + (next - 0xdc00);\n i++;\n } else if (unit >= 0xdc00 && unit <= 0xdfff) {\n throw unpairedSurrogate(unit, i);\n }\n if (!inRanges(t.assignedRanges, codePoint)) {\n throw new Nfkc16Error(\n 'UNASSIGNED_CODEPOINT',\n `code point U+${codePoint.toString(16).toUpperCase().padStart(4, '0')} is not assigned in Unicode 16.0.0`,\n codePoint,\n );\n }\n codePoints.push(codePoint);\n }\n return codePoints;\n}\n\nfunction cccOf(t: Nfkc16Tables, codePoint: number): number {\n return t.ccc.get(codePoint) ?? 0;\n}\n\nfunction decompose(t: Nfkc16Tables, codePoints: readonly number[]): number[] {\n const out: number[] = [];\n for (const cp of codePoints) {\n if (cp >= HANGUL_S_BASE && cp < HANGUL_S_BASE + HANGUL_S_COUNT) {\n const sIndex = cp - HANGUL_S_BASE;\n out.push(HANGUL_L_BASE + Math.floor(sIndex / HANGUL_N_COUNT));\n out.push(HANGUL_V_BASE + Math.floor((sIndex % HANGUL_N_COUNT) / HANGUL_T_COUNT));\n const trailing = sIndex % HANGUL_T_COUNT;\n if (trailing !== 0) out.push(HANGUL_T_BASE + trailing);\n continue;\n }\n const mapped = t.decomposition.get(cp);\n if (mapped !== undefined) {\n for (const target of mapped) out.push(target);\n } else {\n out.push(cp);\n }\n }\n return out;\n}\n\n/** Canonical Ordering Algorithm: stable insertion sort of nonzero-ccc runs. */\nfunction canonicalReorder(t: Nfkc16Tables, codePoints: number[]): void {\n for (let i = 1; i < codePoints.length; i++) {\n const cp = codePoints[i];\n if (cp === undefined) break; // unreachable: i < length\n const combining = cccOf(t, cp);\n if (combining === 0) continue;\n let j = i;\n while (j > 0) {\n const prev = codePoints[j - 1];\n if (prev === undefined || cccOf(t, prev) <= combining) break;\n codePoints[j] = prev;\n j--;\n }\n codePoints[j] = cp;\n }\n}\n\nfunction composePair(t: Nfkc16Tables, a: number, b: number): number | undefined {\n if (\n a >= HANGUL_L_BASE &&\n a < HANGUL_L_BASE + HANGUL_L_COUNT &&\n b >= HANGUL_V_BASE &&\n b < HANGUL_V_BASE + HANGUL_V_COUNT\n ) {\n return (\n HANGUL_S_BASE + ((a - HANGUL_L_BASE) * HANGUL_V_COUNT + (b - HANGUL_V_BASE)) * HANGUL_T_COUNT\n );\n }\n if (\n a >= HANGUL_S_BASE &&\n a < HANGUL_S_BASE + HANGUL_S_COUNT &&\n (a - HANGUL_S_BASE) % HANGUL_T_COUNT === 0 &&\n b > HANGUL_T_BASE &&\n b < HANGUL_T_BASE + HANGUL_T_COUNT\n ) {\n return a + (b - HANGUL_T_BASE);\n }\n return t.composition.get(a * COMPOSITION_KEY_SHIFT + b);\n}\n\n/**\n * Canonical Composition Algorithm. A combining character composes with the\n * last starter when it is not blocked: either it directly follows the starter,\n * or every character in between has a strictly lower combining class (the\n * sequence is canonically ordered, so checking the immediately preceding\n * class suffices). Primary composites are always starters, so a successful\n * composition never changes the trailing combining class.\n */\nfunction compose(t: Nfkc16Tables, codePoints: readonly number[]): number[] {\n const out: number[] = [];\n let starterIdx = -1;\n let lastCcc = 0;\n for (const cp of codePoints) {\n const combining = cccOf(t, cp);\n if (starterIdx >= 0 && (starterIdx === out.length - 1 || lastCcc < combining)) {\n const starter = out[starterIdx];\n const composed = starter === undefined ? undefined : composePair(t, starter, cp);\n if (composed !== undefined) {\n out[starterIdx] = composed;\n continue;\n }\n }\n out.push(cp);\n lastCcc = combining;\n if (combining === 0) starterIdx = out.length - 1;\n }\n return out;\n}\n\nfunction codePointsToString(codePoints: readonly number[]): string {\n let out = '';\n // Chunked to stay clear of engine argument-count limits on long inputs.\n for (let i = 0; i < codePoints.length; i += 1024) {\n out += String.fromCodePoint(...codePoints.slice(i, i + 1024));\n }\n return out;\n}\n\n/**\n * Normalize to NFKC exactly as Unicode 16.0.0 defines it.\n *\n * Throws {@link Nfkc16Error} with code UNPAIRED_SURROGATE when the input is\n * not a well-formed UTF-16 string, and with code UNASSIGNED_CODEPOINT when it\n * contains a code point that Unicode 16.0.0 leaves unassigned (normalization\n * of such input would not be stable across Unicode versions).\n */\nexport function nfkc16(input: string): string {\n const t = tables();\n const codePoints = validatedScalarValues(input, t);\n const decomposed = decompose(t, codePoints);\n canonicalReorder(t, decomposed);\n return codePointsToString(compose(t, decomposed));\n}\n","// cardano-poe-pw-norm-v1: the normative passphrase normalization profile.\n//\n// Two implementations MUST derive a byte-identical CEK from the same\n// passphrase, so the normalization applied before Argon2id is pinned, in\n// order:\n//\n// 1. Bound the raw input (a pre-KDF denial-of-service backstop).\n// 2. NFKC under the pinned Unicode 16.0.0 tables. Input the pinned tables\n// cannot normalize stably — an unpaired surrogate, or a code point that\n// Unicode 16.0 leaves unassigned (a later Unicode version may give it a\n// decomposition and silently change the derived key) — is rejected.\n// 3. Collapse every maximal run of White_Space characters to one U+0020.\n// 4. Trim leading/trailing U+0020.\n// 5. Reject the empty result — a whitespace-only passphrase normalizes to\n// zero bytes, which Argon2id would silently accept, keying the record to\n// a CEK any party can derive.\n// 6. UTF-8-encode; those bytes are the Argon2id password input.\n//\n// Every Unicode-sensitive step resolves against the pinned Unicode 16.0.0\n// data — the NFKC tables and the White_Space property both — never the host\n// engine, whose tables float with its Unicode version.\n\nimport { Nfkc16Error, isWhiteSpace16, nfkc16 } from '../unicode/nfkc16';\nimport { EciesSealedPoeError } from './errors';\n\n// Reference bound on the RAW UTF-8 byte length of a passphrase, enforced before\n// any normalization or hashing work. A deployment-pinned constant, not a wire\n// field; deployments MAY tighten it.\nexport const MAX_PASSPHRASE_INPUT_BYTES = 4096;\n\nconst UTF8 = new TextEncoder();\n\n// One code-point pass implementing profile steps 3 + 4: each maximal\n// White_Space run becomes a single U+0020, and a leading or trailing run is\n// dropped entirely (never emitted), which is exactly collapse-then-trim.\n// `isWhiteSpace16` is the pinned Unicode 16.0 White_Space property —\n// deliberately NOT JavaScript's `\\s`, which also matches U+FEFF, a character\n// the property (and therefore the profile) does not treat as whitespace.\nfunction collapseAndTrimWhiteSpace(input: string): string {\n let out = '';\n let pendingRun = false;\n for (const ch of input) {\n if (isWhiteSpace16(ch.codePointAt(0) as number)) {\n pendingRun = true;\n continue;\n }\n if (pendingRun && out.length > 0) {\n out += ' ';\n }\n pendingRun = false;\n out += ch;\n }\n return out;\n}\n\n// Apply the cardano-poe-pw-norm-v1 profile and return the exact Argon2id\n// password bytes. Throws PASSPHRASE_INPUT_TOO_LONG when the raw input exceeds\n// the pre-normalization bound, ENC_PASSPHRASE_UNNORMALIZABLE when the input\n// cannot normalize stably under Unicode 16.0 (an unpaired surrogate or an\n// unassigned code point), and ENC_PASSPHRASE_EMPTY when the normalized result\n// is the empty string.\nexport function normalizePassphrase(passphrase: string): Uint8Array {\n const rawBytes = UTF8.encode(passphrase);\n if (rawBytes.length > MAX_PASSPHRASE_INPUT_BYTES) {\n throw new EciesSealedPoeError(\n 'PASSPHRASE_INPUT_TOO_LONG',\n `passphrase raw UTF-8 length ${rawBytes.length} exceeds MAX_PASSPHRASE_INPUT_BYTES=${MAX_PASSPHRASE_INPUT_BYTES}`,\n );\n }\n let folded: string;\n try {\n folded = nfkc16(passphrase);\n } catch (error) {\n if (error instanceof Nfkc16Error) {\n throw new EciesSealedPoeError('ENC_PASSPHRASE_UNNORMALIZABLE', error.message, {\n cause: error,\n });\n }\n throw error;\n }\n const normalized = collapseAndTrimWhiteSpace(folded);\n if (normalized.length === 0) {\n throw new EciesSealedPoeError(\n 'ENC_PASSPHRASE_EMPTY',\n 'passphrase normalizes to the empty string',\n );\n }\n return UTF8.encode(normalized);\n}\n","// Passphrase-path sealed PoE: the CEK is derived directly from a normalised\n// passphrase via Argon2id — no ephemeral keypair, no slots, no trial-decrypt\n// loop, and no on-chain slots_mac. The key commitment that `slots_mac`\n// provides on the slots path lives instead in a 32-byte header prepended\n// INSIDE the ciphertext blob (same object, same URI, same fetch), so a\n// chain-only observer gets no offline passphrase-test oracle: testing a guess\n// requires possession of the blob itself.\n//\n// blob = commitment(32) || STREAM chunks\n//\n// The commitment is an HMAC keyed by an HKDF leaf of the CEK over the\n// passphrase-transcript hash, which binds the header fields, the Argon2id\n// parameters, the normalization profile, and the item's hash claim. Open\n// verifies it in constant time BEFORE any chunk is opened; a wrong passphrase\n// is indistinguishable from a tampered record by design.\n\nimport { randomBytes } from '@noble/ciphers/utils.js';\n\nimport { argon2idV13 } from '../kdf/argon2id';\nimport { compareCt } from '../util/compare-ct';\n\nimport { EciesSealedPoeError } from './errors';\nimport { normalizePassphrase } from './passphrase-normalize';\nimport { streamOpen, streamSeal, StreamTamperedError, TAG_SIZE } from './stream';\nimport {\n computePassphraseCommitment,\n computePassphraseHash,\n itemHashesHash,\n passphrasePayloadKey,\n type ItemHashes,\n} from './transcript';\nimport { SEALED_POE_AEAD } from './wrap';\n\nconst CEK_LENGTH = 32 as const;\nconst NONCE_LENGTH = 24 as const;\nconst COMMITMENT_LENGTH = 32 as const;\n// Registry-pinned Argon2id constraints: salt 16..64 bytes; m (KiB) ≥ 65536,\n// t ≥ 3, p ≥ 1; each parameter a uint ≤ 2^32 − 1.\nconst SALT_MIN_LENGTH = 16 as const;\nconst SALT_MAX_LENGTH = 64 as const;\nconst ARGON2_M_MIN = 65536 as const;\nconst ARGON2_T_MIN = 3 as const;\nconst ARGON2_P_MIN = 1 as const;\nconst PARAM_VALUE_MAX = 0xffff_ffff;\n\nexport interface PassphraseParams {\n readonly m: number;\n readonly t: number;\n readonly p: number;\n}\n\n// Producer default: the registry floors for memory and iterations plus the\n// RFC 9106 §4 recommended parallelism.\nconst DEFAULT_PARAMS: PassphraseParams = { m: 65536, t: 3, p: 4 };\n\n// The passphrase-path `enc` envelope as carried on chain: no kem, no slots, no\n// slots_mac — the commitment lives in the ciphertext blob.\nexport interface PassphraseSealedEnvelope {\n readonly scheme: 1;\n readonly aead: typeof SEALED_POE_AEAD;\n readonly nonce: Uint8Array;\n readonly passphrase: {\n readonly alg: 'argon2id';\n readonly salt: Uint8Array;\n readonly params: PassphraseParams;\n };\n}\n\nexport interface PassphraseSealArgs {\n readonly plaintext: Uint8Array;\n // The item's plaintext-hash claim; bound into the commitment so a spliced\n // envelope fails the header check before any chunk opens.\n readonly hashes: ItemHashes;\n readonly passphrase: string;\n // Fresh CSPRNG salt per envelope by default; a fixed or derived salt makes\n // equal passphrases yield equal CEKs across records.\n readonly salt?: Uint8Array;\n readonly params?: PassphraseParams;\n readonly nonce?: Uint8Array;\n}\n\nexport interface PassphraseSealedPoeOutput {\n readonly envelope: PassphraseSealedEnvelope;\n // commitment(32) || STREAM chunks — published as one object.\n readonly blob: Uint8Array;\n}\n\nexport interface PassphraseOpenArgs {\n readonly envelope: PassphraseSealedEnvelope;\n readonly blob: Uint8Array;\n readonly passphrase: string;\n readonly hashes: ItemHashes;\n}\n\n// Every decryption-layer failure — wrong passphrase, tampered salt/params/\n// header, tampered commitment, malformed or tampered stream — collapses to the\n// single TAMPERED_CIPHERTEXT outcome: the response gives an untrusted caller\n// nothing to distinguish.\nexport type PassphraseOpenResult =\n | { readonly matched: true; readonly plaintext: Uint8Array }\n | { readonly matched: false; readonly reason: 'TAMPERED_CIPHERTEXT' };\n\nfunction assertUint32(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 0 || value > PARAM_VALUE_MAX) {\n throw new EciesSealedPoeError(\n 'INVALID_PASSPHRASE_PARAMS',\n `passphrase.params.${name} MUST be a uint in 0..2^32-1, got ${String(value)}`,\n );\n }\n}\n\n// Shape checks shared by seal (over caller inputs) and open (over wire data),\n// run before any KDF or AEAD primitive.\nfunction assertPassphraseBlock(args: {\n salt: Uint8Array;\n params: PassphraseParams;\n nonce: Uint8Array;\n}): void {\n if (args.nonce.length !== NONCE_LENGTH) {\n throw new EciesSealedPoeError(\n 'NONCE_LENGTH_MISMATCH',\n `nonce MUST be exactly ${NONCE_LENGTH} bytes, got ${args.nonce.length}`,\n );\n }\n if (args.salt.length < SALT_MIN_LENGTH) {\n throw new EciesSealedPoeError(\n 'ENC_PASSPHRASE_SALT_TOO_SHORT',\n `passphrase.salt MUST be at least ${SALT_MIN_LENGTH} bytes, got ${args.salt.length}`,\n );\n }\n if (args.salt.length > SALT_MAX_LENGTH) {\n throw new EciesSealedPoeError(\n 'ENC_PASSPHRASE_SALT_TOO_LONG',\n `passphrase.salt MUST be at most ${SALT_MAX_LENGTH} bytes, got ${args.salt.length}`,\n );\n }\n assertUint32(args.params.m, 'm');\n assertUint32(args.params.t, 't');\n assertUint32(args.params.p, 'p');\n if (\n args.params.m < ARGON2_M_MIN ||\n args.params.t < ARGON2_T_MIN ||\n args.params.p < ARGON2_P_MIN\n ) {\n throw new EciesSealedPoeError(\n 'ENC_PASSPHRASE_ARGON2_PARAMS_TOO_LOW',\n `passphrase.params MUST satisfy m >= ${ARGON2_M_MIN}, t >= ${ARGON2_T_MIN}, p >= ${ARGON2_P_MIN}; got m=${args.params.m}, t=${args.params.t}, p=${args.params.p}`,\n );\n }\n}\n\n// CEK = argon2id(password, salt, params, 32) with the Argon2 version pinned at\n// 0x13. `password` is the already-normalized passphrase byte string\n// (cardano-poe-pw-norm-v1 via `normalizePassphrase`) — normalization is a\n// separate, earlier step so its typed rejections fire before any\n// blob-dependent work on the open path.\nasync function argon2Cek(\n password: Uint8Array,\n salt: Uint8Array,\n params: PassphraseParams,\n): Promise<Uint8Array> {\n try {\n return await argon2idV13({\n password,\n salt,\n memSizeKB: params.m,\n iterations: params.t,\n parallelism: params.p,\n outBytes: CEK_LENGTH,\n });\n } catch (cause) {\n throw new EciesSealedPoeError('KDF_DERIVATION_FAILED', 'argon2id rejected the derivation', {\n cause,\n });\n }\n}\n\nfunction commitmentFor(\n envelope: PassphraseSealedEnvelope,\n cek: Uint8Array,\n hashesHash: Uint8Array,\n): Uint8Array {\n const pwHash = computePassphraseHash({\n aead: envelope.aead,\n nonce: envelope.nonce,\n hashesHash,\n salt: envelope.passphrase.salt,\n params: envelope.passphrase.params,\n });\n return computePassphraseCommitment({ cek, pwHash });\n}\n\nexport async function passphraseSealedPoeSeal(\n args: PassphraseSealArgs,\n): Promise<PassphraseSealedPoeOutput> {\n const salt = args.salt ?? randomBytes(SALT_MIN_LENGTH);\n const params = args.params ?? DEFAULT_PARAMS;\n const nonce = args.nonce ?? randomBytes(NONCE_LENGTH);\n assertPassphraseBlock({ salt, params, nonce });\n // The hash claim is digested before any KDF work: a sealed item commits to\n // the plaintext only through it, so an item without a content hash cannot be\n // sealed.\n const hashesHash = itemHashesHash(args.hashes);\n\n const envelope: PassphraseSealedEnvelope = {\n scheme: 1,\n aead: SEALED_POE_AEAD,\n nonce,\n passphrase: { alg: 'argon2id', salt, params: { m: params.m, t: params.t, p: params.p } },\n };\n\n const cek = await argon2Cek(normalizePassphrase(args.passphrase), salt, params);\n const commitment = commitmentFor(envelope, cek, hashesHash);\n const stream = streamSeal({\n payloadKey: passphrasePayloadKey({ cek, nonce }),\n plaintext: args.plaintext,\n });\n\n const blob = new Uint8Array(commitment.length + stream.length);\n blob.set(commitment, 0);\n blob.set(stream, commitment.length);\n return { envelope, blob };\n}\n\nexport async function passphraseSealedPoeOpen(\n args: PassphraseOpenArgs,\n): Promise<PassphraseOpenResult> {\n const { envelope, blob } = args;\n\n // Typed caller-input rejections fire in a pinned order — the item's hash\n // claim, then passphrase normalization, then the envelope shape — and every\n // one of them strictly precedes any blob-dependent generic failure, so a\n // malformed call is reported the same way whatever blob accompanies it.\n const hashesHash = itemHashesHash(args.hashes);\n const password = normalizePassphrase(args.passphrase);\n\n if (envelope.scheme !== 1) {\n throw new EciesSealedPoeError(\n 'UNSUPPORTED_ENVELOPE_SCHEME',\n `envelope.scheme=${String(envelope.scheme)} unsupported (expected 1)`,\n );\n }\n if (envelope.aead !== SEALED_POE_AEAD) {\n throw new EciesSealedPoeError(\n 'UNSUPPORTED_AEAD_ALG',\n `envelope.aead=${String(envelope.aead)} unsupported (expected '${SEALED_POE_AEAD}')`,\n );\n }\n if (envelope.passphrase.alg !== 'argon2id') {\n throw new EciesSealedPoeError(\n 'ENC_PASSPHRASE_ALG_UNSUPPORTED',\n `passphrase.alg=${String(envelope.passphrase.alg)} unsupported (expected 'argon2id')`,\n );\n }\n assertPassphraseBlock({\n salt: envelope.passphrase.salt,\n params: envelope.passphrase.params,\n nonce: envelope.nonce,\n });\n\n // A passphrase-path blob shorter than the 32-byte commitment header plus the\n // 16-byte minimum STREAM (the lone tag of an empty final chunk) cannot be\n // well-formed — rejected before the KDF, so no Argon2 work is spent on it.\n // The blob is public input; the early return reveals nothing.\n if (blob.length < COMMITMENT_LENGTH + TAG_SIZE) {\n return { matched: false, reason: 'TAMPERED_CIPHERTEXT' };\n }\n\n const cek = await argon2Cek(password, envelope.passphrase.salt, envelope.passphrase.params);\n\n // Constant-time commitment check BEFORE any chunk is opened: the commitment\n // (not merely a Poly1305 tag deep in the stream) is what a correct passphrase\n // must reproduce, and a mismatch never begins streaming.\n const expected = commitmentFor(envelope, cek, hashesHash);\n if (!compareCt(expected, blob.subarray(0, COMMITMENT_LENGTH))) {\n return { matched: false, reason: 'TAMPERED_CIPHERTEXT' };\n }\n\n try {\n const plaintext = streamOpen({\n payloadKey: passphrasePayloadKey({ cek, nonce: envelope.nonce }),\n ciphertext: blob.subarray(COMMITMENT_LENGTH),\n });\n return { matched: true, plaintext };\n } catch (e) {\n if (!(e instanceof StreamTamperedError)) throw e;\n return { matched: false, reason: 'TAMPERED_CIPHERTEXT' };\n }\n}\n","// The single seam that turns a structurally-validated but permissive on-wire\n// `enc` block into the discriminated `SealedEnvelope` the unwrap / trial-decrypt\n// path consumes.\n//\n// Every read-path consumer (inbox trial-decrypt, inbox CEK recovery, CLI\n// decrypt orchestrators, the standalone recipient verifier) passes the whole\n// returned envelope plus their `RecipientKeyBundle` straight to\n// `eciesSealedPoeUnwrap` / `eciesSealedPoeTrialDecrypt` — they never rebuild\n// slots themselves. This helper is the ONE place the conversion lives: it\n// dispatches on `enc.kem`, picks the matching per-slot fields, and returns\n// `null` for anything that is not a recognised sealed-recipient envelope\n// (passphrase-only blocks, missing slots, unknown KEM, unknown scheme/aead),\n// preserving every consumer's \"this item is not for the recipient path → no\n// match, no crypto\" branch.\n//\n// crypto-core is a leaf package and must not depend on poe-standard's schema,\n// so the input is a structural shape mirroring the fields the parsed\n// `EncryptionEnvelope` exposes. Anything narrower (per-slot length checks) is\n// re-asserted by `assertEnvelopeStructure` inside the unwrap path; this helper\n// is purely the KEM-driven shape projection.\n\nimport {\n SEALED_POE_AEAD,\n type Mlkem768X25519Slot,\n type SealedEnvelope,\n type X25519Slot,\n} from './wrap';\n\n// Structural mirror of the parsed-but-permissive on-wire slot. Each field is\n// `T | undefined` (not just optional) so the parsed `EncryptionEnvelope` from a\n// consumer compiled with `exactOptionalPropertyTypes` is assignable without a\n// cast: the schema layer cannot know the envelope `kem` from a slot in\n// isolation, so it leaves all three fields optional.\nexport interface ParsedSlotShape {\n readonly epk?: Uint8Array | undefined;\n readonly kem_ct?: Uint8Array | undefined;\n readonly wrap?: Uint8Array | undefined;\n}\n\n// Structural mirror of the parsed-but-permissive `enc` block.\nexport interface ParsedEnvelopeShape {\n readonly scheme?: unknown;\n readonly aead?: string | undefined;\n readonly kem?: string | undefined;\n readonly nonce?: Uint8Array | undefined;\n readonly slots?: ReadonlyArray<ParsedSlotShape> | undefined;\n readonly slots_mac?: Uint8Array | undefined;\n}\n\n// Build the discriminated `SealedEnvelope` from a parsed `enc` block, or return\n// `null` when the block is not a sealed-recipient envelope we can trial-decrypt\n// (passphrase-only, missing slots/nonce/slots_mac, unrecognised KEM, or a slot\n// missing the KEM's required field).\nexport function sealedEnvelopeFromParsed(enc: ParsedEnvelopeShape): SealedEnvelope | null {\n if (enc.scheme !== 1 || enc.aead !== SEALED_POE_AEAD) return null;\n if (enc.nonce === undefined || enc.slots_mac === undefined) return null;\n const slots = enc.slots;\n if (slots === undefined || slots.length < 1) return null;\n\n if (enc.kem === 'x25519') {\n const x25519Slots: X25519Slot[] = [];\n for (const s of slots) {\n if (s.epk === undefined || s.wrap === undefined) return null;\n x25519Slots.push({ epk: s.epk, wrap: s.wrap });\n }\n return {\n scheme: 1,\n aead: SEALED_POE_AEAD,\n kem: 'x25519',\n nonce: enc.nonce,\n slots: x25519Slots,\n slots_mac: enc.slots_mac,\n };\n }\n\n if (enc.kem === 'mlkem768x25519') {\n const hybridSlots: Mlkem768X25519Slot[] = [];\n for (const s of slots) {\n if (s.kem_ct === undefined || s.wrap === undefined) return null;\n hybridSlots.push({ kem_ct: s.kem_ct, wrap: s.wrap });\n }\n return {\n scheme: 1,\n aead: SEALED_POE_AEAD,\n kem: 'mlkem768x25519',\n nonce: enc.nonce,\n slots: hybridSlots,\n slots_mac: enc.slots_mac,\n };\n }\n\n return null;\n}\n"]}