tsdmarc 0.0.0-stage → 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-file-C6u0I5I1.js","names":["NON_PRINTABLE","pyRepr","pyStrRepr","DELIMITER","QUOTE","SHORT_ESCAPES","LATIN1_MAX","pad","errorText","MS_PER_MINUTE","MS_PER_SECOND","WEEKDAYS","MONTHS","formatOffset","DECIMAL_DIGIT","pyInt","WEEKDAYS","MONTHS","ASCII_UPPERCASE","PyIndexError","PyOverflowError","PyValueError","errorText","pySplit","ASCII_LIMIT","ERROR_NAMES","decodeError","isAscii","INVALID","buildTable","decodeError","ESC","LF","SPACE","isIso2022Escape","decodeError","decodeUtf8","isLowSurrogate","encodeError","NEED_INPUT","KB","MB","BUFFER_BLOCK_SIZE","UINT32_MAX","NEED_INPUT","NEED_OUTPUT","EMPTY","EMPTY","Output","concatBytes","pyRepr","concatBytes","errorText","isPlainObject","unquote","CR","FWS","lookup","isAscii","SPACE","TAB","pyRepr","pyRepr","REGEX_SPECIAL","pyRepr","unquote","DOWNLOAD_TIMEOUT_SECONDS","EOL","DIGITS_RE","pyRepr","MS_PER_SECOND","netConnect","connect","sleep","PyValueError","isPlainObject","lookup","HIGH_SURROGATE_MIN","HIGH_SURROGATE_MAX","LOW_SURROGATE_MIN","LOW_SURROGATE_MAX","isLowSurrogate","PyOverflowError","PyValueError","MIN_YEAR","MAX_YEAR","pySplit","PyIndexError","errorText","LF","DASH","MS_PER_SECOND","MAX_FILENAME_BYTES","utf8Length","pyRepr","pyRepr","osConstants","PyValueError","parseEmail","parseEmail","errorText","ValueError","errorText","errorText","PyIndexError","stream","errorText"],"sources":["../src/constants.ts","../src/config.ts","../src/utils/py-str.ts","../src/utils/python.ts","../src/csv.ts","../src/errors.ts","../src/internal/magic.ts","../src/utils/sanitize.ts","../src/log.ts","../src/utils/datetime.ts","../src/utils/timestamps.ts","../src/internal/py.ts","../src/utils/py-codecs-base.ts","../src/utils/py-codecs-data.ts","../src/utils/py-codecs-cjk.ts","../src/utils/py-codecs.ts","../src/internal/bz2.ts","../src/internal/crc.ts","../src/internal/lzma.ts","../src/internal/zlib.ts","../src/internal/zstd.ts","../src/internal/zipfile.ts","../src/utils/text.ts","../src/extract.ts","../src/internal/set-own.ts","../src/serialize.ts","../src/utils/py-binascii.ts","../src/utils/py-email/errors.ts","../src/utils/py-email/utils.ts","../src/utils/py-email/charset.ts","../src/utils/py-email/header.ts","../src/utils/py-email/generator.ts","../src/utils/py-email/message.ts","../src/utils/redact.ts","../src/utils/http.ts","../src/utils/resources.ts","../src/utils/domains.ts","../src/utils/csv-reader.ts","../src/utils/dns-errors.ts","../src/utils/idna-data.ts","../src/utils/dns-text.ts","../src/utils/dns-message.ts","../src/utils/url-split.ts","../src/utils/dns.ts","../src/utils/numeric-host.ts","../src/utils/ip-info.ts","../src/xml/expat-names.ts","../src/xml/expat.ts","../src/xml/text-buffer.ts","../src/xml/unicode.ts","../src/xml/recover.ts","../src/xml/xmltodict.ts","../src/aggregate.ts","../src/utils/py-email/parser.ts","../src/utils/mailparser/addresses.ts","../src/utils/mailparser/dates.ts","../src/utils/mailparser/exceptions.ts","../src/utils/mailparser/received.ts","../src/utils/mailparser/core.ts","../src/utils/email.ts","../src/failure.ts","../src/internal/py-json.ts","../src/parallel.ts","../src/internal/py-json-loads.ts","../src/smtp-tls.ts","../src/report-email.ts","../src/utils/mbox.ts","../src/report-file.ts"],"sourcesContent":["// Port of parsedmarc/constants.py.\n\n/** Version of tsdmarc itself. */\nexport const VERSION: string = '0.0.0';\n\n/** parsedmarc version this port matches feature-for-feature. */\nexport const PARSEDMARC_COMPAT_VERSION: string = '11.2.1';\n\nexport const USER_AGENT: string = `tsdmarc/${VERSION}`;\n\n/** DNS query timeout, in seconds. */\nexport const DEFAULT_DNS_TIMEOUT: number = 2.0;\nexport const DEFAULT_DNS_MAX_RETRIES: number = 0;\n\n/**\n * Recommended mix of public resolvers for cross-provider DNS failover. Not\n * applied automatically: callers opt in by passing\n * `nameservers: RECOMMENDED_DNS_NAMESERVERS`. Mixing providers means a single\n * operator's anycast outage falls through to a different provider.\n */\nexport const RECOMMENDED_DNS_NAMESERVERS: readonly string[] = [\n '1.1.1.1',\n '8.8.8.8',\n];\n","// Centralized parser configuration, ported from parsedmarc/config.py.\n//\n// `ParserConfig` carries every parsing/enrichment option plus the three\n// caches the parser shares across calls: IP address info, seen aggregate\n// report IDs and the reverse DNS map.\n//\n// - `createParserConfig()` builds a config with fresh, isolated caches.\n// - `replaceParserConfig()` derives a variant that keeps sharing the source's\n// caches (Python's `dataclasses.replace`).\n// - `resolveParserConfig()` is what public parsing functions call: an\n// explicit `config` wins and individual options are ignored; otherwise a\n// config is built from the options, bound to the module-default caches so\n// option-style calls keep sharing warm caches.\n// - `parserConfigToState()` / `parserConfigFromState()` move a config to a\n// worker thread. Cache contents never cross: the worker binds its own\n// module-default caches (Python's `__getstate__` / `__setstate__`).\n\nimport { DEFAULT_DNS_MAX_RETRIES, DEFAULT_DNS_TIMEOUT } from './constants';\nimport type { IPAddressInfo, ReverseDNSMap } from './types';\n\nexport interface ExpiringDictOptions {\n maxLen: number;\n maxAgeSeconds: number;\n}\n\n/**\n * An insertion-ordered map whose entries expire after `maxAgeSeconds` and\n * which drops its oldest entry when full. Port of Python's `ExpiringDict`.\n */\nexport class ExpiringDict<K, V> {\n readonly maxLen: number;\n readonly maxAgeSeconds: number;\n private readonly entries = new Map<K, { value: V; setAt: number }>();\n\n constructor(options: ExpiringDictOptions) {\n if (options.maxLen < 1) {\n throw new RangeError('maxLen must be at least 1');\n }\n if (options.maxAgeSeconds < 0) {\n throw new RangeError('maxAgeSeconds must not be negative');\n }\n this.maxLen = options.maxLen;\n this.maxAgeSeconds = options.maxAgeSeconds;\n }\n\n private isExpired(setAt: number, now: number): boolean {\n return now - setAt >= this.maxAgeSeconds * 1000;\n }\n\n /**\n * Drop expired entries. Python's `ExpiringDict` only does so for a key\n * being read, so unread entries live as long as the process. Entries are\n * kept in `setAt` order (see `set()`), so the expired ones are at the\n * front and each is visited once.\n */\n private prune(): void {\n const now = Date.now();\n for (const [key, entry] of this.entries) {\n if (!this.isExpired(entry.setAt, now)) {\n return;\n }\n this.entries.delete(key);\n }\n }\n\n get size(): number {\n this.prune();\n return this.entries.size;\n }\n\n has(key: K): boolean {\n return this.get(key) !== undefined || this.entries.has(key);\n }\n\n get(key: K): V | undefined {\n const entry = this.entries.get(key);\n if (entry === undefined) {\n return undefined;\n }\n if (this.isExpired(entry.setAt, Date.now())) {\n this.entries.delete(key);\n return undefined;\n }\n return entry.value;\n }\n\n set(key: K, value: V): this {\n this.prune();\n // Rewriting restarts the entry's clock, so it goes to the back.\n const isNew = !this.entries.delete(key);\n if (isNew && this.entries.size >= this.maxLen) {\n const oldest = this.entries.keys().next();\n if (oldest.done !== true) {\n this.entries.delete(oldest.value);\n }\n }\n this.entries.set(key, { value, setAt: Date.now() });\n return this;\n }\n\n delete(key: K): boolean {\n return this.entries.delete(key);\n }\n\n clear(): void {\n this.entries.clear();\n }\n\n *keys(): IterableIterator<K> {\n this.prune();\n yield* [...this.entries.keys()];\n }\n}\n\nexport type IPAddressCache = ExpiringDict<string, IPAddressInfo>;\nexport type SeenAggregateReportIds = ExpiringDict<string, boolean>;\n\n/** IP address info cache: 10,000 entries, 4 hour expiry. */\nexport function newIpAddressCache(): IPAddressCache {\n return new ExpiringDict({ maxLen: 10_000, maxAgeSeconds: 14_400 });\n}\n\n/** Seen aggregate report ID cache: 100,000,000 entries, 1 hour expiry. */\nexport function newSeenAggregateReportIds(): SeenAggregateReportIds {\n return new ExpiringDict({ maxLen: 100_000_000, maxAgeSeconds: 3600 });\n}\n\n/** Module-default IP address info cache. */\nexport const IP_ADDRESS_CACHE: IPAddressCache = newIpAddressCache();\n/** Module-default seen aggregate report ID cache. */\nexport const SEEN_AGGREGATE_REPORT_IDS: SeenAggregateReportIds =\n newSeenAggregateReportIds();\n/** Module-default reverse DNS map. */\nexport const REVERSE_DNS_MAP: ReverseDNSMap = new Map();\n\n/** Parsing and enrichment options (everything except the caches). */\nexport interface ParserOptions {\n /** Do not make online requests (DNS, IP database, reverse DNS map, PSL overrides). */\n offline: boolean;\n /** Path to a local MMDB file from IPinfo, MaxMind or DBIP. */\n ipDbPath: string | null;\n /** Always use local/bundled files instead of downloading them. */\n alwaysUseLocalFiles: boolean;\n /** Path to a local reverse DNS map file. */\n reverseDnsMapPath: string | null;\n /** URL of a reverse DNS map file. */\n reverseDnsMapUrl: string | null;\n /** Path to a local PSL overrides file. */\n pslOverridesPath: string | null;\n /** URL of a PSL overrides file. */\n pslOverridesUrl: string | null;\n /** Nameservers for DNS queries (`null`: Cloudflare's public resolvers). */\n nameservers: string[] | null;\n /** DNS query timeout, in seconds. */\n dnsTimeout: number;\n /** Times to retry a DNS query after a timeout or other transient error. */\n dnsRetries: number;\n /** Remove attachment payloads from parsed email results. */\n stripAttachmentPayloads: boolean;\n /** Aggregate reports spanning more hours than this are normalized/split. */\n normalizeTimespanThresholdHours: number;\n /**\n * Largest email accepted, in bytes (UTF-8 for text input); `0` disables\n * the check. Larger emails raise `EmailTooLargeError` and mailboxes move\n * them to the invalid folder, without downloading them where the backend\n * reports the size first. Not in parsedmarc. Default: 50 MiB.\n */\n maxEmailSize: number;\n /**\n * Most MIME parts accepted in an email; `0` disables the check. Lines\n * starting with `--` (an upper bound on boundary parts) are counted before\n * parsing, and the parser counts every message it creates, so parts that\n * need no boundary line count too. Not in parsedmarc. Default: 10,000.\n */\n maxMimeParts: number;\n /**\n * Most header lines accepted in an email, over all its parts (folded\n * lines included); `0` disables the check. Not in parsedmarc.\n * Default: 100,000.\n */\n maxHeaderLines: number;\n /**\n * Most text, in characters, that re-serializing the parts of one email\n * may produce; text with a character outside Latin-1 counts each of its\n * characters twice, as it takes twice the memory. Every part is counted\n * once per level it is flattened at, so this bounds size × nesting\n * depth, which `maxEmailSize` does not; `0` disables the check. Not in\n * parsedmarc. Default: 512 MiB.\n */\n maxExpandedEmailSize: number;\n /**\n * Most source IPs of one aggregate report looked up over the network\n * (reverse DNS, IPinfo API); `0` disables the check. Later IPs get no\n * reverse DNS and only the IP database. Cached IPs don't count. Not in\n * parsedmarc. Default: 100,000.\n */\n maxLookupsPerReport: number;\n /**\n * Most reverse DNS lookups of one aggregate report that may time out or\n * fail (an address with no PTR is an answer, not a failure); `0`\n * disables the check. Later IPs are handled as in\n * {@link ParserOptions.maxLookupsPerReport}. A failed lookup can take\n * seconds, and the report's sender can choose addresses that fail. Not\n * in parsedmarc. Default: 256.\n */\n maxFailedLookupsPerReport: number;\n /**\n * Seconds of network lookups (reverse DNS, IPinfo API) one aggregate\n * report may use in total; `0` disables the check. Later IPs are handled\n * as in {@link ParserOptions.maxLookupsPerReport}. An answer that is not a\n * failure can still be slow, and a sender can make every record cost one.\n * Not in parsedmarc. Default: 600.\n */\n maxLookupTimePerReport: number;\n /**\n * Most records an aggregate report may have once its timespan is\n * normalized into daily buckets; `0` disables the check. Sender-chosen\n * dates and counts turn one `<record>` into one record per day, for up to\n * 2.9 million days. A record with few messages only takes as many days as\n * it has messages. Larger reports raise `InvalidAggregateReport`. Not in\n * parsedmarc. Default: 250,000.\n */\n maxNormalizedRecords: number;\n /**\n * Deepest element nesting accepted in an aggregate report's XML; `0`\n * disables the check. Deeper reports raise `InvalidAggregateReport`. Not\n * in parsedmarc. Default: 100,000.\n */\n maxXmlDepth: number;\n /**\n * Most elements and attributes accepted in an aggregate report's XML; `0`\n * disables the check. Larger reports raise `InvalidAggregateReport`. Not\n * in parsedmarc. Default: 5,000,000.\n */\n maxXmlNodes: number;\n /**\n * Largest SMTP TLS report accepted, in bytes of JSON (UTF-16 code units\n * for text input); `0` disables the check. Larger reports raise\n * `InvalidSMTPTLSReport`. Not in parsedmarc. Default: 10 MiB.\n */\n maxSmtpTlsReportSize: number;\n /**\n * Seconds one email or file may take to parse; `0` disables the check. A\n * worker past it is stopped. Without workers (`nProcs` 1) only a mailbox\n * applies it, at the next keepalive (every 20 records), so only time\n * spent awaiting counts. A mailbox leaves such a message for retry and\n * then moves it to the `Unsaved` folder, without ever deleting it. Not\n * in parsedmarc. Default: 1 hour.\n */\n jobTimeout: number;\n /**\n * JavaScript heap limit of each parsing worker thread, in MiB; `0` keeps\n * the runtime's limit (about 4 GiB per worker on 64-bit Node). A worker\n * over it dies and only its job fails: a mailbox leaves the message for\n * retry and then moves it to the `Unsaved` folder, without ever deleting\n * it. Bun ignores it. Not in parsedmarc. Default: 2 GiB.\n */\n maxWorkerHeapMb: number;\n}\n\n/** Default {@link ParserOptions.maxEmailSize}: 50 MiB. */\nexport const DEFAULT_MAX_EMAIL_SIZE: number = 50 * 1024 * 1024;\n/** Default {@link ParserOptions.maxMimeParts}. */\nexport const DEFAULT_MAX_MIME_PARTS = 10_000;\n/** Default {@link ParserOptions.maxHeaderLines}. */\nexport const DEFAULT_MAX_HEADER_LINES = 100_000;\n/** Default {@link ParserOptions.maxExpandedEmailSize}: 512 MiB. */\nexport const DEFAULT_MAX_EXPANDED_EMAIL_SIZE: number = 512 * 1024 * 1024;\n/** Default {@link ParserOptions.maxNormalizedRecords}. */\nexport const DEFAULT_MAX_NORMALIZED_RECORDS = 250_000;\n/** Default {@link ParserOptions.maxXmlDepth}. */\nexport const DEFAULT_MAX_XML_DEPTH = 100_000;\n/** Default {@link ParserOptions.maxXmlNodes}. */\nexport const DEFAULT_MAX_XML_NODES = 5_000_000;\n/** Default {@link ParserOptions.maxSmtpTlsReportSize}: 10 MiB. */\nexport const DEFAULT_MAX_SMTP_TLS_REPORT_SIZE: number = 10 * 1024 * 1024;\n/** Default {@link ParserOptions.jobTimeout}: one hour. */\nexport const DEFAULT_JOB_TIMEOUT = 3600;\n/** Default {@link ParserOptions.maxWorkerHeapMb}. */\nexport const DEFAULT_MAX_WORKER_HEAP_MB = 2048;\n/** Default {@link ParserOptions.maxLookupsPerReport}. */\nexport const DEFAULT_MAX_LOOKUPS_PER_REPORT = 100_000;\n/** Default {@link ParserOptions.maxFailedLookupsPerReport}. */\nexport const DEFAULT_MAX_FAILED_LOOKUPS_PER_REPORT = 256;\n/** Default {@link ParserOptions.maxLookupTimePerReport}, in seconds. */\nexport const DEFAULT_MAX_LOOKUP_TIME_PER_REPORT = 600;\n\n/** The limits on an email's structure, applied while parsing it. */\nexport type EmailLimits = Pick<\n ParserOptions,\n 'maxMimeParts' | 'maxHeaderLines' | 'maxExpandedEmailSize'\n>;\n\n/** The default {@link EmailLimits}. */\nexport const DEFAULT_EMAIL_LIMITS: EmailLimits = Object.freeze({\n maxMimeParts: DEFAULT_MAX_MIME_PARTS,\n maxHeaderLines: DEFAULT_MAX_HEADER_LINES,\n maxExpandedEmailSize: DEFAULT_MAX_EXPANDED_EMAIL_SIZE,\n});\n\nexport interface ParserCaches {\n ipAddressCache: IPAddressCache;\n /** Seen aggregate reports, keyed on reporter, Report-ID and policy domain (`aggregateReportKey()`). */\n seenAggregateReportIds: SeenAggregateReportIds;\n reverseDnsMap: ReverseDNSMap;\n}\n\n/** Immutable parser configuration: options plus shared caches. */\nexport type ParserConfig = Readonly<ParserOptions & ParserCaches>;\n\nexport const DEFAULT_PARSER_OPTIONS: Readonly<ParserOptions> = Object.freeze({\n offline: false,\n ipDbPath: null,\n alwaysUseLocalFiles: false,\n reverseDnsMapPath: null,\n reverseDnsMapUrl: null,\n pslOverridesPath: null,\n pslOverridesUrl: null,\n nameservers: null,\n dnsTimeout: DEFAULT_DNS_TIMEOUT,\n dnsRetries: DEFAULT_DNS_MAX_RETRIES,\n stripAttachmentPayloads: false,\n normalizeTimespanThresholdHours: 24.0,\n maxEmailSize: DEFAULT_MAX_EMAIL_SIZE,\n maxMimeParts: DEFAULT_MAX_MIME_PARTS,\n maxHeaderLines: DEFAULT_MAX_HEADER_LINES,\n maxExpandedEmailSize: DEFAULT_MAX_EXPANDED_EMAIL_SIZE,\n maxLookupsPerReport: DEFAULT_MAX_LOOKUPS_PER_REPORT,\n maxFailedLookupsPerReport: DEFAULT_MAX_FAILED_LOOKUPS_PER_REPORT,\n maxLookupTimePerReport: DEFAULT_MAX_LOOKUP_TIME_PER_REPORT,\n maxNormalizedRecords: DEFAULT_MAX_NORMALIZED_RECORDS,\n maxXmlDepth: DEFAULT_MAX_XML_DEPTH,\n maxXmlNodes: DEFAULT_MAX_XML_NODES,\n maxSmtpTlsReportSize: DEFAULT_MAX_SMTP_TLS_REPORT_SIZE,\n jobTimeout: DEFAULT_JOB_TIMEOUT,\n maxWorkerHeapMb: DEFAULT_MAX_WORKER_HEAP_MB,\n});\n\nconst OPTION_KEYS = Object.keys(\n DEFAULT_PARSER_OPTIONS,\n) as (keyof ParserOptions)[];\n\nfunction pickOptions(source: Partial<ParserOptions>): Partial<ParserOptions> {\n const picked: Partial<Record<keyof ParserOptions, unknown>> = {};\n for (const key of OPTION_KEYS) {\n if (source[key] !== undefined) {\n picked[key] = source[key];\n }\n }\n return picked as Partial<ParserOptions>;\n}\n\nfunction freezeConfig(\n options: ParserOptions,\n caches: ParserCaches,\n): ParserConfig {\n const nameservers =\n options.nameservers === null\n ? null\n : Object.freeze([...options.nameservers]);\n return Object.freeze({\n ...options,\n nameservers: nameservers as string[] | null,\n ...caches,\n });\n}\n\n/** Build a config. Caches not given are fresh and isolated. */\nexport function createParserConfig(\n options: Partial<ParserOptions & ParserCaches> = {},\n): ParserConfig {\n return freezeConfig(\n { ...DEFAULT_PARSER_OPTIONS, ...pickOptions(options) },\n {\n ipAddressCache: options.ipAddressCache ?? newIpAddressCache(),\n seenAggregateReportIds:\n options.seenAggregateReportIds ?? newSeenAggregateReportIds(),\n reverseDnsMap: options.reverseDnsMap ?? new Map(),\n },\n );\n}\n\n/** Derive a variant of `config` that keeps sharing its caches. */\nexport function replaceParserConfig(\n config: ParserConfig,\n changes: Partial<ParserOptions & ParserCaches>,\n): ParserConfig {\n return createParserConfig({ ...config, ...changes });\n}\n\n/** Options accepted by public parsing functions (individual options or `config`). */\nexport interface ParserConfigInput extends Partial<\n Omit<ParserOptions, 'pslOverridesPath' | 'pslOverridesUrl'>\n> {\n /** When given, the individual options are ignored. */\n config?: ParserConfig | null;\n}\n\n/**\n * Resolve the config for a public parsing call: `input.config` when given,\n * otherwise a config built from the individual options and bound to the\n * module-default caches. PSL override options are only settable through an\n * explicit `config`. The module-default caches ignore the options, so calls\n * with different `offline`, `nameservers` or `ipDbPath` values, or for\n * different tenants, need a `createParserConfig()` each.\n */\nexport function resolveParserConfig(\n input: ParserConfigInput = {},\n): ParserConfig {\n if (input.config) {\n return input.config;\n }\n const {\n pslOverridesPath: _path,\n pslOverridesUrl: _url,\n ...options\n } = pickOptions(input as Partial<ParserOptions>);\n return createParserConfig({\n ...options,\n ipAddressCache: IP_ADDRESS_CACHE,\n seenAggregateReportIds: SEEN_AGGREGATE_REPORT_IDS,\n reverseDnsMap: REVERSE_DNS_MAP,\n });\n}\n\n/** The options of a config, without caches, for sending to a worker. */\nexport function parserConfigToState(config: ParserConfig): ParserOptions {\n const state = { ...DEFAULT_PARSER_OPTIONS, ...pickOptions(config) };\n return {\n ...state,\n nameservers: state.nameservers === null ? null : [...state.nameservers],\n };\n}\n\n/**\n * Rebuild a config from worker state. Missing options take their defaults\n * and the caches bind to this thread's module-default caches.\n */\nexport function parserConfigFromState(\n state: Partial<ParserOptions>,\n): ParserConfig {\n return createParserConfig({\n ...pickOptions(state),\n ipAddressCache: IP_ADDRESS_CACHE,\n seenAggregateReportIds: SEEN_AGGREGATE_REPORT_IDS,\n reverseDnsMap: REVERSE_DNS_MAP,\n });\n}\n","// Python `str` semantics that differ from JavaScript's built-ins.\n//\n// mail-parser and Python's `email` package lean on `str.strip()`,\n// `str.splitlines()`, `str.isspace()`, `str.split()` and `repr()`. Their\n// notions of whitespace and line boundaries are not JavaScript's (`trim()`\n// strips U+FEFF but not U+001C-U+001F or U+0085), so they are ported here.\n\n/** Characters for which Python's `str.isspace()` is true. */\nexport const PY_WHITESPACE_CHARS: string =\n '\\t\\n\\v\\f\\r\\u001c\\u001d\\u001e\\u001f \\u0085\\u00a0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000';\n\n/** Regex character-class body matching Python's `\\s` on `str`. */\nexport const PY_WS_CLASS: string =\n '\\\\t\\\\n\\\\v\\\\f\\\\r\\\\u001c-\\\\u001f \\\\u0085\\\\u00a0\\\\u1680\\\\u2000-\\\\u200a\\\\u2028\\\\u2029\\\\u202f\\\\u205f\\\\u3000';\n\nconst WHITESPACE_SET: ReadonlySet<string> = new Set(PY_WHITESPACE_CHARS);\n\n// Line boundaries of `str.splitlines()`; `\\r\\n` counts as one.\n// oxlint-disable-next-line no-control-regex -- U+001C-U+001E are line boundaries in Python.\nconst LINE_BOUNDARY = /\\r\\n|[\\n\\v\\f\\r\\u001c\\u001d\\u001e\\u0085\\u2028\\u2029]/gu;\nconst WHITESPACE_RUN = new RegExp(`[${PY_WS_CLASS}]+`, 'u');\nconst NON_PRINTABLE = /[\\p{Cc}\\p{Cf}\\p{Cs}\\p{Co}\\p{Cn}\\p{Zl}\\p{Zp}\\p{Zs}]/u;\n\n/** Python's `s.isspace()`: non-empty and only whitespace. */\nexport function pyIsSpace(text: string): boolean {\n if (text.length === 0) {\n return false;\n }\n for (const char of text) {\n if (!WHITESPACE_SET.has(char)) {\n return false;\n }\n }\n return true;\n}\n\nfunction stripSet(chars: string | undefined): (char: string) => boolean {\n if (chars === undefined) {\n return char => WHITESPACE_SET.has(char);\n }\n const set = new Set(chars);\n return char => set.has(char);\n}\n\n/** Python's `s.lstrip(chars)` (whitespace when `chars` is omitted). */\nexport function pyLStrip(text: string, chars?: string): string {\n const strip = stripSet(chars);\n let start = 0;\n while (start < text.length && strip(text.charAt(start))) {\n start += 1;\n }\n return text.slice(start);\n}\n\n/** Python's `s.rstrip(chars)` (whitespace when `chars` is omitted). */\nexport function pyRStrip(text: string, chars?: string): string {\n const strip = stripSet(chars);\n let end = text.length;\n while (end > 0 && strip(text.charAt(end - 1))) {\n end -= 1;\n }\n return text.slice(0, end);\n}\n\n/** Python's `s.strip(chars)` (whitespace when `chars` is omitted). */\nexport function pyStrip(text: string, chars?: string): string {\n return pyRStrip(pyLStrip(text, chars), chars);\n}\n\n/** Python's `s.splitlines(keepends)`. */\nexport function pySplitlines(text: string, keepends = false): string[] {\n const lines: string[] = [];\n let start = 0;\n for (const match of text.matchAll(LINE_BOUNDARY)) {\n const end = match.index + match[0].length;\n lines.push(text.slice(start, keepends ? end : match.index));\n start = end;\n }\n if (start < text.length) {\n lines.push(text.slice(start));\n }\n return lines;\n}\n\n/** Python's `s.split(None, maxsplit)`: split on whitespace runs. */\nexport function pySplitWhitespace(text: string, maxsplit = -1): string[] {\n const parts: string[] = [];\n let rest = pyLStrip(text);\n while (rest.length > 0) {\n if (maxsplit >= 0 && parts.length === maxsplit) {\n parts.push(rest);\n break;\n }\n const match = WHITESPACE_RUN.exec(rest);\n if (match === null) {\n parts.push(rest);\n break;\n }\n parts.push(rest.slice(0, match.index));\n rest = pyLStrip(rest.slice(match.index));\n }\n return parts;\n}\n\n/** Python's `len(s)`: the number of code points. */\nexport function pyLen(text: string): number {\n let count = 0;\n for (const _char of text) {\n count += 1;\n }\n return count;\n}\n\n/** Python's `s[:n]`, counting code points. */\nexport function pySliceStart(text: string, count: number): string {\n let index = 0;\n let seen = 0;\n for (const char of text) {\n if (seen === count) {\n break;\n }\n index += char.length;\n seen += 1;\n }\n return text.slice(0, index);\n}\n\nfunction escapeCodePoint(code: number): string {\n if (code < 0x100) {\n return `\\\\x${code.toString(16).padStart(2, '0')}`;\n }\n if (code < 0x10000) {\n return `\\\\u${code.toString(16).padStart(4, '0')}`;\n }\n return `\\\\U${code.toString(16).padStart(8, '0')}`;\n}\n\nconst REPR_ESCAPES: Readonly<Record<string, string>> = {\n '\\\\': '\\\\\\\\',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n};\n\n/** Python's `repr()` of a `str`. */\nexport function pyRepr(text: string): string {\n const quote = text.includes(\"'\") && !text.includes('\"') ? '\"' : \"'\";\n let output = quote;\n for (const char of text) {\n const escaped = REPR_ESCAPES[char];\n if (escaped !== undefined) {\n output += escaped;\n } else if (char === quote) {\n output += `\\\\${char}`;\n } else if (char !== ' ' && NON_PRINTABLE.test(char)) {\n output += escapeCodePoint(char.codePointAt(0) ?? 0);\n } else {\n output += char;\n }\n }\n return output + quote;\n}\n","// Python's str()/repr() for the values parsedmarc writes into CSV cells and\n// text payloads. JS numbers don't keep Python's int/float distinction, so\n// integral numbers print as ints; use `pyFloatRepr()` where Python has a float.\n\nimport { pyRepr as pyStrRepr } from './py-str';\n\n/** Python's `repr(float)`: shortest round-trip digits, `1.0`, `1e-05`, `inf`. */\nexport function pyFloatRepr(value: number): string {\n if (Number.isNaN(value)) {\n return 'nan';\n }\n if (!Number.isFinite(value)) {\n return value > 0 ? 'inf' : '-inf';\n }\n if (value === 0) {\n return Object.is(value, -0) ? '-0.0' : '0.0';\n }\n // The exponent of the shortest round-trip digits (Math.log10 rounds\n // 9999999999999998 up to 16).\n const [mantissa = '', power = '0'] = value.toExponential().split('e');\n const exponent = Number(power);\n if (exponent < -4 || exponent >= 16) {\n const sign = power.startsWith('-') ? '-' : '+';\n const digits = power.replace(/^[+-]/u, '').padStart(2, '0');\n return `${mantissa}e${sign}${digits}`;\n }\n const text = String(value);\n return text.includes('.') || text.includes('e') ? text : `${text}.0`;\n}\n\n/** A list or dict {@link pyRepr} is writing: its children with key prefixes. */\ninterface ReprContainer {\n open: string;\n close: string;\n entries: [prefix: string, child: unknown][];\n /** The next child to write. */\n index: number;\n}\n\n/** The repr of a scalar, or the container to open. */\nfunction reprScalar(value: unknown): string | ReprContainer {\n if (value === null || value === undefined) {\n return 'None';\n }\n if (typeof value === 'string') {\n // The one `repr(str)` implementation: escapes every character\n // `str.isprintable()` rejects (controls, DEL, NEL, NBSP, ZWSP, ...).\n return pyStrRepr(value);\n }\n if (Array.isArray(value)) {\n return {\n open: '[',\n close: ']',\n entries: value.map((item): [string, unknown] => ['', item]),\n index: 0,\n };\n }\n const object =\n value instanceof Map ? (Object.fromEntries(value) as object) : value;\n if (typeof object === 'object' && !(object instanceof Date)) {\n if (typeof (object as { toJSON?: unknown }).toJSON === 'function') {\n return pyStr(object);\n }\n return {\n open: '{',\n close: '}',\n entries: Object.entries(object).map(([key, item]): [string, unknown] => [\n `${pyStrRepr(key)}: `,\n item,\n ]),\n index: 0,\n };\n }\n return pyStr(value);\n}\n\n/**\n * Python's `repr()` for JSON-like values (strings use single quotes).\n * Written in one pass with an explicit stack: linear in the output, and data\n * nested deeper than the call stack allows still prints.\n */\nexport function pyRepr(value: unknown): string {\n const out: string[] = [];\n const stack: ReprContainer[] = [];\n const write = (repr: string | ReprContainer): void => {\n if (typeof repr === 'string') {\n out.push(repr);\n } else {\n out.push(repr.open);\n stack.push(repr);\n }\n };\n write(reprScalar(value));\n for (let frame = stack.at(-1); frame; frame = stack.at(-1)) {\n const entry = frame.entries[frame.index];\n if (entry === undefined) {\n stack.pop();\n out.push(frame.close);\n continue;\n }\n if (frame.index > 0) {\n out.push(', ');\n }\n frame.index += 1;\n out.push(entry[0]);\n write(reprScalar(entry[1]));\n }\n return out.join('');\n}\n\n/** Python's `str()` for JSON-like values. */\nexport function pyStr(value: unknown): string {\n if (value === null || value === undefined) {\n return 'None';\n }\n if (typeof value === 'boolean') {\n return value ? 'True' : 'False';\n }\n if (typeof value === 'number') {\n if (!Number.isInteger(value)) {\n return pyFloatRepr(value);\n }\n // Python ints print every digit exactly; String() gives the shortest\n // round-trip digits past 2**53 and 1e+21 notation from 1e21.\n return Math.abs(value) >= Number.MAX_SAFE_INTEGER\n ? BigInt(value).toString()\n : String(value);\n }\n if (typeof value === 'bigint') {\n return value.toString();\n }\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value) || value instanceof Map) {\n return pyRepr(value);\n }\n if (typeof value === 'object') {\n // Objects with their own toString (PyDateTime) print with it; plain and\n // null-prototype objects (parsed XML/JSON) print like a Python dict.\n const { toString } = value as { toString?: unknown };\n if (\n typeof toString === 'function' &&\n toString !== Object.prototype.toString\n ) {\n return (value as { toString: () => string }).toString();\n }\n return pyRepr(value);\n }\n return String(value);\n}\n","// CSV writing compatible with Python's `csv.DictWriter` (excel dialect):\n// `,` delimiter, `\"` quoting only when needed (QUOTE_MINIMAL), doubled\n// quotes, `\\r\\n` line endings, `None` as an empty cell, other values via\n// Python's `str()`.\n\nimport { pyStr } from './utils/python';\n\nexport type CsvRow = Record<string, unknown>;\n\nconst DELIMITER = ',';\nconst QUOTE = '\"';\nconst LINE_TERMINATOR = '\\r\\n';\n\nfunction formatCell(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n return pyStr(value);\n}\n\nfunction needsQuotes(cell: string): boolean {\n return (\n cell.includes(DELIMITER) ||\n cell.includes(QUOTE) ||\n cell.includes('\\r') ||\n cell.includes('\\n')\n );\n}\n\nfunction formatLine(cells: string[]): string {\n if (cells.length === 1 && cells[0] === '') {\n // Python writes a lone empty field as \"\" so the row isn't blank.\n return `\"\"${LINE_TERMINATOR}`;\n }\n const quoted = cells.map(cell =>\n needsQuotes(cell)\n ? `${QUOTE}${cell.replaceAll(QUOTE, '\"\"')}${QUOTE}`\n : cell,\n );\n return `${quoted.join(DELIMITER)}${LINE_TERMINATOR}`;\n}\n\nexport interface CsvOptions {\n /**\n * Neutralize spreadsheet formulas (CSV injection): a text cell starting\n * with `=`, `+`, `-`, `@`, a tab or a carriage return gets a leading `'`,\n * so Excel, LibreOffice or Google Sheets show it as text instead of\n * evaluating it. Report data comes from untrusted senders. On by\n * default, like parsedmarc 11.1.0 (`_csv_safe`); `false`\n * writes cells unchanged. Numbers (a negative count) are never changed.\n */\n formulaEscape?: boolean;\n}\n\nconst FORMULA_START = /^[=+\\-@\\t\\r]/u;\n\n/**\n * A text cell with a leading `'` when a spreadsheet would read it as a\n * formula (see {@link CsvOptions.formulaEscape}); other values unchanged.\n */\nexport function csvFormulaEscape(value: unknown): unknown {\n return typeof value === 'string' && FORMULA_START.test(value)\n ? `'${value}`\n : value;\n}\n\n/** Incremental writer, like `csv.DictWriter` over a `StringIO`. */\nexport class CsvDictWriter {\n readonly fieldnames: readonly string[];\n readonly formulaEscape: boolean;\n private text = '';\n\n constructor(fieldnames: readonly string[], options: CsvOptions = {}) {\n this.fieldnames = fieldnames;\n this.formulaEscape = options.formulaEscape !== false;\n }\n\n writeHeader(): void {\n this.text += formatLine([...this.fieldnames]);\n }\n\n /**\n * Write one row. Missing fields are empty; a field not in `fieldnames`\n * throws, like `DictWriter`'s default `extrasaction=\"raise\"`.\n */\n writeRow(row: CsvRow): void {\n const extras = Object.keys(row).filter(\n key => !this.fieldnames.includes(key),\n );\n if (extras.length > 0) {\n throw new RangeError(\n `dict contains fields not in fieldnames: ${extras.map(key => `'${key}'`).join(', ')}`,\n );\n }\n this.text += formatLine(\n this.fieldnames.map(field =>\n formatCell(\n this.formulaEscape ? csvFormulaEscape(row[field]) : row[field],\n ),\n ),\n );\n }\n\n getValue(): string {\n return this.text;\n }\n}\n\n/** Header plus rows, as one CSV string. */\nexport function rowsToCsv(\n fieldnames: readonly string[],\n rows: Iterable<CsvRow>,\n options: CsvOptions = {},\n): string {\n const writer = new CsvDictWriter(fieldnames, options);\n writer.writeHeader();\n for (const row of rows) {\n writer.writeRow(row);\n }\n return writer.getValue();\n}\n\n/**\n * Strip NUL characters from a string cell (parsedmarc's `_csv_safe`).\n * Non-string values are returned unchanged.\n */\nexport function csvSafe(value: unknown): unknown {\n return typeof value === 'string' ? value.replaceAll('\\0', '') : value;\n}\n","// Error hierarchy, ported from parsedmarc/__init__.py and parsedmarc/utils.py.\n//\n// ParserError\n// ├─ InvalidDMARCReport\n// │ ├─ InvalidAggregateReport\n// │ └─ InvalidFailureReport (alias: InvalidForensicReport)\n// ├─ InvalidSMTPTLSReport\n// └─ EmailTooLargeError\n//\n// Every class sets `name` so `error.name` and stack traces match the class.\n\n/** Raised when an error parsing a report occurs. */\nexport class ParserError extends Error {\n override name = 'ParserError';\n}\n\n/** Raised when an invalid DMARC report is encountered. */\nexport class InvalidDMARCReport extends ParserError {\n override name = 'InvalidDMARCReport';\n}\n\n/** Raised when an invalid SMTP TLS report is encountered. */\nexport class InvalidSMTPTLSReport extends ParserError {\n override name = 'InvalidSMTPTLSReport';\n}\n\n/** Raised when an invalid DMARC aggregate report is encountered. */\nexport class InvalidAggregateReport extends InvalidDMARCReport {\n override name = 'InvalidAggregateReport';\n}\n\n/** Raised when an invalid DMARC failure report is encountered. */\nexport class InvalidFailureReport extends InvalidDMARCReport {\n override name = 'InvalidFailureReport';\n}\n\n/** Backward-compatible alias of {@link InvalidFailureReport}. */\nexport const InvalidForensicReport: typeof InvalidFailureReport =\n InvalidFailureReport;\n\n/**\n * Raised when an email is over the configured size or structure limits\n * (`maxEmailSize`, `maxMimeParts`, `maxHeaderLines`,\n * `maxExpandedEmailSize`); parsedmarc has no such limits. Mailbox processing\n * treats the message as invalid.\n */\nexport class EmailTooLargeError extends ParserError {\n override name = 'EmailTooLargeError';\n}\n\n/** The error for an email of `size` bytes over the `limit` (`maxEmailSize`). */\nexport function emailTooLargeError(\n size: number,\n limit: number,\n): EmailTooLargeError {\n return new EmailTooLargeError(\n `Email of ${size} bytes exceeds the ${limit} byte size limit (max_email_size)`,\n );\n}\n\n/** Raised when an error parsing the email occurs. */\nexport class EmailParserError extends Error {\n override name = 'EmailParserError';\n}\n\n/** Raised when an error occurs when downloading a file. */\nexport class DownloadError extends Error {\n override name = 'DownloadError';\n}\n\n/**\n * Enrichment can't work for any record: nothing is wrong with the report\n * being parsed. Unlike a bad record, it must not be skipped, or a report\n * loses all its records and still looks parsed. parsedmarc has no such\n * class.\n */\nexport class EnrichmentError extends Error {\n override name = 'EnrichmentError';\n}\n\nconst MAX_CAUSE_CHAIN = 16;\n\n/**\n * The {@link EnrichmentError} behind `error`, or `null`: report parsers wrap\n * whatever fails in a report-level error, keeping it in `cause`.\n */\nexport function findEnrichmentError(error: unknown): EnrichmentError | null {\n let current = error;\n for (let depth = 0; depth < MAX_CAUSE_CHAIN; depth += 1) {\n if (current instanceof EnrichmentError) {\n return current;\n }\n if (!(current instanceof Error)) {\n return null;\n }\n current = current.cause;\n }\n return null;\n}\n\n/** Raised when the IPinfo API rejects the configured token. */\nexport class InvalidIPinfoAPIKey extends EnrichmentError {\n override name = 'InvalidIPinfoAPIKey';\n}\n\n/** Raised when no IP database can be opened. */\nexport class IPDatabaseError extends EnrichmentError {\n override name = 'IPDatabaseError';\n /** The system error code (`ENOENT`) of a missing file, if any. */\n readonly code: string | undefined;\n\n constructor(message: string, options?: ErrorOptions & { code?: string }) {\n super(message, options);\n this.code = options?.code;\n }\n}\n","// Magic bytes parsedmarc uses to tell report formats apart\n// (parsedmarc/__init__.py: MAGIC_ZIP, MAGIC_GZIP, MAGIC_XML, ...).\n\n/** `PK\\x03\\x04`: a zip archive (local file header). */\nexport const MAGIC_ZIP: readonly number[] = [0x50, 0x4b, 0x03, 0x04];\n/** `\\x1f\\x8b`: a gzip stream. */\nexport const MAGIC_GZIP: readonly number[] = [0x1f, 0x8b];\n/** `<?xml `: XML with a declaration. */\nexport const MAGIC_XML: readonly number[] = [\n 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20,\n];\n/** `<`: XML that starts with an element tag (no declaration). */\nexport const MAGIC_XML_TAG: readonly number[] = [0x3c];\n/** `{`: a JSON object (RFC 8259). */\nexport const MAGIC_JSON: readonly number[] = [0x7b];\n\n/** Python's `data.startswith(magic)` / `data[: len(magic)] == magic`. */\nexport function startsWith(\n data: Uint8Array,\n magic: readonly number[],\n): boolean {\n if (data.length < magic.length) {\n return false;\n }\n return magic.every((byte, index) => data[index] === byte);\n}\n","// parsedmarc.utils.sanitize_for_log().\n\n// Python's str.isprintable() is false for the categories Cc, Cf, Cs, Co, Cn\n// (\\p{C}) and Zs, Zl, Zp (\\p{Z}), except the ASCII space. The Unicode version\n// is the JS engine's (Python 3.14 uses 16.0), so a code point assigned in a\n// newer version counts as printable here and as unassigned there.\nconst NON_PRINTABLE = /[\\p{C}\\p{Z}]/gu;\n\nconst SHORT_ESCAPES: ReadonlyMap<string, string> = new Map([\n ['\\t', '\\\\t'],\n ['\\n', '\\\\n'],\n ['\\r', '\\\\r'],\n]);\n\nconst LATIN1_MAX = 0xff;\nconst BMP_MAX = 0xff_ff;\n\n// Python's `unicode_escape` codec for one character.\nfunction unicodeEscape(char: string): string {\n if (char === ' ') {\n return char;\n }\n const short = SHORT_ESCAPES.get(char);\n if (short !== undefined) {\n return short;\n }\n const code = char.codePointAt(0) ?? 0;\n if (code <= LATIN1_MAX) {\n return `\\\\x${code.toString(16).padStart(2, '0')}`;\n }\n if (code <= BMP_MAX) {\n return `\\\\u${code.toString(16).padStart(4, '0')}`;\n }\n return `\\\\U${code.toString(16).padStart(8, '0')}`;\n}\n\n/**\n * Escapes the non-printable characters of a sender-controlled string so it\n * is safe to put in a log line or an error message.\n *\n * Every character for which Python's `str.isprintable()` is false (CR, LF,\n * tab, ESC, U+2028, NUL, and so on) is replaced by its `unicode_escape`\n * form, e.g. `\\r\\n`. A sender can plant such characters in a header through\n * an RFC 2047 encoded-word (`=?utf-8?q?a=0D=0Ab?=` decodes to a raw CR LF),\n * and an unescaped CR/LF would let it forge extra log lines. The ASCII\n * space, letters in any script, and most emoji pass through unchanged;\n * non-ASCII spaces (NBSP, U+3000) and format characters such as the\n * zero-width joiner or the bidi marks are escaped.\n */\nexport function sanitizeForLog(value: string): string {\n return value.replaceAll(NON_PRINTABLE, unicodeEscape);\n}\n","// Minimal Python-style logging, ported from how parsedmarc uses `logging`.\n//\n// parsedmarc logs through named loggers with handlers (stream, file, syslog,\n// GELF) and filters, and its tests capture records with `assertLogs`. This\n// module provides the same model: `getLogger(name)` returns a shared\n// `Logger`, handlers receive `LogRecord`s, and `captureLogs()` replaces\n// `assertLogs`. Library loggers are silent until a handler is attached, like\n// parsedmarc's `NullHandler` default.\n\nimport { closeSync, openSync, writeSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { sanitizeForLog } from './utils/sanitize';\n\nexport const NOTSET = 0;\nexport const DEBUG = 10;\nexport const INFO = 20;\nexport const WARNING = 30;\nexport const ERROR = 40;\nexport const CRITICAL = 50;\n\nconst LEVEL_NAMES: ReadonlyMap<number, string> = new Map([\n [NOTSET, 'NOTSET'],\n [DEBUG, 'DEBUG'],\n [INFO, 'INFO'],\n [WARNING, 'WARNING'],\n [ERROR, 'ERROR'],\n [CRITICAL, 'CRITICAL'],\n]);\n\n/** Level used when neither the logger nor `setLevel()` chose one. */\nconst DEFAULT_EFFECTIVE_LEVEL = WARNING;\n\n/** Name of the level, or `Level <n>` for custom levels (as in Python). */\nexport function getLevelName(level: number): string {\n return LEVEL_NAMES.get(level) ?? `Level ${level}`;\n}\n\nexport interface LogRecord {\n name: string;\n level: number;\n levelName: string;\n message: string;\n /** Milliseconds since the epoch. */\n created: number;\n /** Error passed to `exception()` / `log(..., { error })`. */\n error?: unknown;\n /** Extra fields, like Python's `extra=`; filters may add to it. */\n extra: Record<string, unknown>;\n}\n\nexport interface LogOptions {\n error?: unknown;\n extra?: Record<string, unknown>;\n}\n\nexport type LogFilter = (record: LogRecord) => boolean;\nexport type LogFormatter = (record: LogRecord) => string;\n\nfunction pad(value: number, width = 2): string {\n return String(value).padStart(width, '0');\n}\n\n/** Python's default `asctime`: local time, `2026-10-24 03:17:13,123`. */\nexport function formatAsctime(created: number): string {\n const date = new Date(created);\n const day = `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n const time = `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n return `${day} ${time},${pad(date.getMilliseconds(), 3)}`;\n}\n\n/**\n * An error for the log, with its message escaped: it can quote report fields\n * and add lines of its own. The stack keeps its line breaks only when the\n * message can be told apart from the frames.\n */\nfunction errorText(error: unknown): string {\n if (!(error instanceof Error)) {\n return sanitizeForLog(String(error));\n }\n const message = sanitizeForLog(error.message);\n if (error.stack === undefined) {\n return `${error.name}: ${message}`;\n }\n return error.stack.includes(error.message)\n ? error.stack.replace(error.message, () => message)\n : sanitizeForLog(error.stack);\n}\n\n/** `LEVEL:name:message`, the format of Python's `assertLogs` output. */\nexport function basicFormat(record: LogRecord): string {\n return `${record.levelName}:${record.name}:${record.message}`;\n}\n\n/** Console format used by `configureLogging()`. */\nexport function consoleFormat(record: LogRecord): string {\n const line = `${record.levelName.padStart(8)}:${record.name}:${record.message}`;\n return record.error === undefined\n ? line\n : `${line}\\n${errorText(record.error)}`;\n}\n\n/** Log file format used by `configureLogging()`. */\nexport function fileFormat(record: LogRecord): string {\n const line = `${formatAsctime(record.created)} - ${record.levelName} - [${record.name}] - ${record.message}`;\n return record.error === undefined\n ? line\n : `${line}\\n${errorText(record.error)}`;\n}\n\nexport abstract class Handler {\n level: number = NOTSET;\n formatter: LogFormatter = basicFormat;\n readonly filters: LogFilter[] = [];\n\n setLevel(level: number): void {\n this.level = level;\n }\n\n setFormatter(formatter: LogFormatter): void {\n this.formatter = formatter;\n }\n\n addFilter(filter: LogFilter): void {\n this.filters.push(filter);\n }\n\n removeFilter(filter: LogFilter): void {\n const index = this.filters.indexOf(filter);\n if (index !== -1) {\n this.filters.splice(index, 1);\n }\n }\n\n format(record: LogRecord): string {\n return this.formatter(record);\n }\n\n /** Apply level and filters, then emit. Errors in `emit` never propagate. */\n handle(record: LogRecord): void {\n if (record.level < this.level) {\n return;\n }\n for (const filter of this.filters) {\n if (!filter(record)) {\n return;\n }\n }\n try {\n this.emit(record);\n } catch (error) {\n this.handleError(record, error);\n }\n }\n\n /** Like Python's `Handler.handleError`: report to stderr, keep going. */\n handleError(record: LogRecord, error: unknown): void {\n process.stderr.write(\n `--- Logging error ---\\n${errorText(error)}\\nMessage: ${record.message}\\n`,\n );\n }\n\n abstract emit(record: LogRecord): void;\n\n flush(): void {\n // Nothing buffered by default.\n }\n\n close(): void {\n // Nothing to release by default.\n }\n}\n\n/** Discards every record. */\nexport class NullHandler extends Handler {\n emit(_record: LogRecord): void {\n // Intentionally empty.\n }\n}\n\nexport interface WritableTextStream {\n write: (text: string) => unknown;\n}\n\n/** Writes formatted records to a stream (stderr by default). */\nexport class StreamHandler extends Handler {\n readonly stream: WritableTextStream;\n\n constructor(stream: WritableTextStream = process.stderr) {\n super();\n this.stream = stream;\n }\n\n emit(record: LogRecord): void {\n this.stream.write(`${this.format(record)}\\n`);\n }\n}\n\n/** Appends formatted records to a file, synchronously and in order. */\nexport class FileHandler extends StreamHandler {\n /** Absolute path of the log file, like Python's `baseFilename`. */\n readonly baseFilename: string;\n private fd: number | null;\n\n constructor(filename: string, mode: 'a' | 'w' = 'a') {\n const baseFilename = path.resolve(filename);\n const fd = openSync(baseFilename, mode);\n super({\n write: (text: string): void => {\n if (this.fd !== null) {\n writeSync(this.fd, text);\n }\n },\n });\n this.baseFilename = baseFilename;\n this.fd = fd;\n }\n\n override close(): void {\n if (this.fd !== null) {\n closeSync(this.fd);\n this.fd = null;\n }\n }\n}\n\nexport class Logger {\n readonly name: string;\n level: number = NOTSET;\n readonly handlers: Handler[] = [];\n readonly filters: LogFilter[] = [];\n disabled = false;\n\n constructor(name: string) {\n this.name = name;\n }\n\n setLevel(level: number): void {\n this.level = level;\n }\n\n getEffectiveLevel(): number {\n return this.level === NOTSET ? DEFAULT_EFFECTIVE_LEVEL : this.level;\n }\n\n isEnabledFor(level: number): boolean {\n return !this.disabled && level >= this.getEffectiveLevel();\n }\n\n addHandler(handler: Handler): void {\n if (!this.handlers.includes(handler)) {\n this.handlers.push(handler);\n }\n }\n\n removeHandler(handler: Handler): void {\n const index = this.handlers.indexOf(handler);\n if (index !== -1) {\n this.handlers.splice(index, 1);\n }\n }\n\n hasHandlers(): boolean {\n return this.handlers.length > 0;\n }\n\n addFilter(filter: LogFilter): void {\n this.filters.push(filter);\n }\n\n removeFilter(filter: LogFilter): void {\n const index = this.filters.indexOf(filter);\n if (index !== -1) {\n this.filters.splice(index, 1);\n }\n }\n\n log(level: number, message: string, options: LogOptions = {}): void {\n if (!this.isEnabledFor(level)) {\n return;\n }\n const record: LogRecord = {\n name: this.name,\n level,\n levelName: getLevelName(level),\n message,\n created: Date.now(),\n extra: { ...options.extra },\n };\n if (options.error !== undefined) {\n record.error = options.error;\n }\n for (const filter of this.filters) {\n if (!filter(record)) {\n return;\n }\n }\n for (const handler of [...this.handlers]) {\n handler.handle(record);\n }\n }\n\n debug(message: string, options?: LogOptions): void {\n this.log(DEBUG, message, options);\n }\n\n info(message: string, options?: LogOptions): void {\n this.log(INFO, message, options);\n }\n\n warning(message: string, options?: LogOptions): void {\n this.log(WARNING, message, options);\n }\n\n error(message: string, options?: LogOptions): void {\n this.log(ERROR, message, options);\n }\n\n critical(message: string, options?: LogOptions): void {\n this.log(CRITICAL, message, options);\n }\n\n /** Log at ERROR with the error attached (Python's `logger.exception`). */\n exception(message: string, error: unknown, options: LogOptions = {}): void {\n this.log(ERROR, message, { ...options, error });\n }\n}\n\nconst loggers = new Map<string, Logger>();\n\n/** Return the shared logger with this name, creating it on first use. */\nexport function getLogger(name: string): Logger {\n let logger = loggers.get(name);\n if (logger === undefined) {\n logger = new Logger(name);\n loggers.set(name, logger);\n }\n return logger;\n}\n\n/** The library logger (parsedmarc's `parsedmarc.log.logger`). */\nexport const logger: Logger = getLogger('tsdmarc');\n\n/**\n * Configure the library logger's handlers: set the level, add a stderr\n * handler if there is none, and add a file handler for `logFile` unless one\n * for the same absolute path is already attached (so repeated calls, e.g. a\n * SIGHUP reload, never write each record twice).\n */\nexport function configureLogging(level: number, logFile?: string | null): void {\n logger.setLevel(level);\n\n const hasStreamHandler = logger.handlers.some(\n handler =>\n handler instanceof StreamHandler && !(handler instanceof FileHandler),\n );\n if (!hasStreamHandler) {\n const handler = new StreamHandler();\n handler.setFormatter(consoleFormat);\n logger.addHandler(handler);\n }\n\n if (logFile) {\n try {\n const logFilePath = path.resolve(logFile);\n const hasFileHandler = logger.handlers.some(\n handler =>\n handler instanceof FileHandler &&\n handler.baseFilename === logFilePath,\n );\n if (!hasFileHandler) {\n const handler = new FileHandler(logFile, 'a');\n handler.setFormatter(fileFormat);\n logger.addHandler(handler);\n }\n } catch (error) {\n logger.warning(`Unable to write to log file: ${String(error)}`);\n }\n }\n}\n\n/** Collects records; used by {@link captureLogs}. */\nexport class CaptureHandler extends Handler {\n readonly records: LogRecord[] = [];\n\n emit(record: LogRecord): void {\n this.records.push(record);\n }\n}\n\nexport interface LogCapture {\n /** Captured records, in order. */\n readonly records: LogRecord[];\n /** Captured records as `LEVEL:name:message` strings (like `assertLogs`). */\n readonly output: string[];\n /** Detach the capture handler and restore the logger's level. */\n restore: () => void;\n}\n\n/**\n * Capture records of `level` and above from a logger, like Python's\n * `assertLogs`. Call `restore()` when done (e.g. in `afterEach`).\n */\nexport function captureLogs(\n target: Logger | string = logger,\n level: number = DEBUG,\n): LogCapture {\n const log = typeof target === 'string' ? getLogger(target) : target;\n const handler = new CaptureHandler();\n handler.setLevel(level);\n const savedLevel = log.level;\n if (log.getEffectiveLevel() > level) {\n log.setLevel(level);\n }\n log.addHandler(handler);\n return {\n records: handler.records,\n get output(): string[] {\n return handler.records.map(basicFormat);\n },\n restore(): void {\n log.removeHandler(handler);\n log.setLevel(savedLevel);\n },\n };\n}\n","// A Python-style datetime: wall-clock fields plus an optional UTC offset.\n//\n// parsedmarc's output depends on Python's distinction between naive\n// datetimes (no offset; interpreted as local time) and aware ones (fixed\n// offset). A JS `Date` is always an instant, so it cannot represent a naive\n// value. `PyDateTime` keeps both forms, with the same conversions Python\n// does: `timestamp()` and `astimezone()` read a naive value as local time\n// (honoring `process.env.TZ`).\n\nconst MS_PER_MINUTE = 60_000;\nconst MS_PER_SECOND = 1000;\nconst MICROSECONDS_PER_MS = 1000;\n\nconst WEEKDAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n] as const;\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n] as const;\n\nexport interface PyDateTimeFields {\n year: number;\n month: number;\n day: number;\n hour?: number;\n minute?: number;\n second?: number;\n microsecond?: number;\n /** Minutes east of UTC; `null` (default) for a naive datetime. */\n utcOffsetMinutes?: number | null;\n}\n\nfunction pad(value: number, width = 2): string {\n return String(Math.trunc(Math.abs(value))).padStart(width, '0');\n}\n\n/**\n * `Date.UTC()` for any year: `Date.UTC` itself maps years 0-99 to 1900-1999,\n * `setUTCFullYear` doesn't.\n */\nfunction utcEpochMs(\n year: number,\n month: number,\n day: number,\n hour = 0,\n minute = 0,\n second = 0,\n ms = 0,\n): number {\n const date = new Date(0);\n date.setUTCFullYear(year, month - 1, day);\n date.setUTCHours(hour, minute, second, ms);\n return date.getTime();\n}\n\nfunction daysInMonth(year: number, month: number): number {\n return new Date(utcEpochMs(year, month + 1, 0)).getUTCDate();\n}\n\n/** Python's `round()` on a float: halves go to the even neighbor. */\nfunction roundHalfEven(value: number): number {\n const floor = Math.floor(value);\n const difference = value - floor;\n if (difference > 0.5) {\n return floor + 1;\n }\n if (difference < 0.5) {\n return floor;\n }\n return floor % 2 === 0 ? floor : floor + 1;\n}\n\nfunction formatOffset(minutes: number, separator: string): string {\n const sign = minutes < 0 ? '-' : '+';\n const absolute = Math.abs(minutes);\n return `${sign}${pad(Math.floor(absolute / 60))}${separator}${pad(absolute % 60)}`;\n}\n\nexport class PyDateTime {\n readonly year: number;\n readonly month: number;\n readonly day: number;\n readonly hour: number;\n readonly minute: number;\n readonly second: number;\n readonly microsecond: number;\n readonly utcOffsetMinutes: number | null;\n\n constructor(fields: PyDateTimeFields) {\n const {\n year,\n month,\n day,\n hour = 0,\n minute = 0,\n second = 0,\n microsecond = 0,\n utcOffsetMinutes = null,\n } = fields;\n const valid =\n Number.isInteger(year) &&\n year >= 1 &&\n year <= 9999 &&\n Number.isInteger(month) &&\n month >= 1 &&\n month <= 12 &&\n Number.isInteger(day) &&\n day >= 1 &&\n day <= daysInMonth(year, month) &&\n Number.isInteger(hour) &&\n hour >= 0 &&\n hour <= 23 &&\n Number.isInteger(minute) &&\n minute >= 0 &&\n minute <= 59 &&\n Number.isInteger(second) &&\n second >= 0 &&\n second <= 59 &&\n Number.isInteger(microsecond) &&\n microsecond >= 0 &&\n microsecond <= 999_999 &&\n (utcOffsetMinutes === null ||\n (Number.isInteger(utcOffsetMinutes) &&\n Math.abs(utcOffsetMinutes) < 24 * 60));\n if (!valid) {\n throw new RangeError(\n `invalid datetime: ${JSON.stringify({ day, hour, microsecond, minute, month, second, utcOffsetMinutes, year })}`,\n );\n }\n this.year = year;\n this.month = month;\n this.day = day;\n this.hour = hour;\n this.minute = minute;\n this.second = second;\n this.microsecond = microsecond;\n this.utcOffsetMinutes = utcOffsetMinutes;\n }\n\n /** Naive datetime in local time from an epoch instant (ms precision). */\n static fromDateLocal(date: Date, microsecond?: number): PyDateTime {\n return new PyDateTime({\n year: date.getFullYear(),\n month: date.getMonth() + 1,\n day: date.getDate(),\n hour: date.getHours(),\n minute: date.getMinutes(),\n second: date.getSeconds(),\n microsecond: microsecond ?? date.getMilliseconds() * MICROSECONDS_PER_MS,\n });\n }\n\n /** Aware datetime with the given offset, from an epoch instant. */\n static fromDateWithOffset(\n date: Date,\n utcOffsetMinutes: number,\n microsecond?: number,\n ): PyDateTime {\n const shifted = new Date(date.getTime() + utcOffsetMinutes * MS_PER_MINUTE);\n return new PyDateTime({\n year: shifted.getUTCFullYear(),\n month: shifted.getUTCMonth() + 1,\n day: shifted.getUTCDate(),\n hour: shifted.getUTCHours(),\n minute: shifted.getUTCMinutes(),\n second: shifted.getUTCSeconds(),\n microsecond:\n microsecond ?? shifted.getUTCMilliseconds() * MICROSECONDS_PER_MS,\n utcOffsetMinutes,\n });\n }\n\n /**\n * Python's `datetime.fromtimestamp(seconds)` (naive, local time), or\n * `datetime.fromtimestamp(seconds, timezone.utc)` with `utc: true`.\n */\n static fromTimestamp(seconds: number, utc = false): PyDateTime {\n // CPython: modf() into whole seconds and a fraction, the fraction rounded\n // half-even to microseconds, carrying into the seconds at 1e6 or below 0.\n let whole = Math.trunc(seconds);\n let microsecond = roundHalfEven((seconds - whole) * 1_000_000);\n if (microsecond >= 1_000_000) {\n whole += 1;\n microsecond -= 1_000_000;\n } else if (microsecond < 0) {\n whole -= 1;\n microsecond += 1_000_000;\n }\n const date = new Date(whole * MS_PER_SECOND);\n return utc\n ? PyDateTime.fromDateWithOffset(date, 0, microsecond)\n : PyDateTime.fromDateLocal(date, microsecond);\n }\n\n /** Python's `datetime.now()` (naive local) or `datetime.now(timezone.utc)`. */\n static now(utc = false): PyDateTime {\n return PyDateTime.fromTimestamp(Date.now() / MS_PER_SECOND, utc);\n }\n\n get isNaive(): boolean {\n return this.utcOffsetMinutes === null;\n }\n\n /** The instant this datetime denotes (naive values are read as local time). */\n toDate(): Date {\n const ms = Math.floor(this.microsecond / MICROSECONDS_PER_MS);\n if (this.utcOffsetMinutes === null) {\n // setFullYear, not the constructor: it maps years 0-99 to 1900-1999.\n const date = new Date(0);\n date.setFullYear(this.year, this.month - 1, this.day);\n date.setHours(this.hour, this.minute, this.second, ms);\n return date;\n }\n const utcMs = utcEpochMs(\n this.year,\n this.month,\n this.day,\n this.hour,\n this.minute,\n this.second,\n ms,\n );\n return new Date(utcMs - this.utcOffsetMinutes * MS_PER_MINUTE);\n }\n\n /** POSIX timestamp in seconds (Python's `datetime.timestamp()`). */\n timestamp(): number {\n // Python divides the exact microsecond count by 1e6 (one rounding).\n const wholeSeconds =\n (this.toDate().getTime() -\n Math.floor(this.microsecond / MICROSECONDS_PER_MS)) /\n MS_PER_SECOND;\n const totalMicro = wholeSeconds * 1_000_000 + this.microsecond;\n return Number.isSafeInteger(totalMicro)\n ? totalMicro / 1_000_000\n : wholeSeconds + this.microsecond / 1_000_000;\n }\n\n /** Python's `astimezone(timezone.utc)`. */\n toUtc(): PyDateTime {\n return PyDateTime.fromDateWithOffset(this.toDate(), 0, this.microsecond);\n }\n\n /** Python's `astimezone()` with no argument: aware, in local time. */\n toLocal(): PyDateTime {\n const date = this.toDate();\n return PyDateTime.fromDateWithOffset(\n date,\n -date.getTimezoneOffset(),\n this.microsecond,\n );\n }\n\n /** Python's `replace(tzinfo=...)`: same wall clock, new (or no) offset. */\n withOffset(utcOffsetMinutes: number | null): PyDateTime {\n return new PyDateTime({ ...this.fields(), utcOffsetMinutes });\n }\n\n /** Python's `replace(...)` for wall-clock fields. */\n replace(changes: Partial<PyDateTimeFields>): PyDateTime {\n return new PyDateTime({ ...this.fields(), ...changes });\n }\n\n /** Add a duration in seconds (Python's `+ timedelta(seconds=...)`). */\n addSeconds(seconds: number): PyDateTime {\n const totalMicro = roundHalfEven(seconds * 1_000_000) + this.microsecond;\n const wallMs = utcEpochMs(\n this.year,\n this.month,\n this.day,\n this.hour,\n this.minute,\n this.second,\n );\n const microRemainder = ((totalMicro % 1_000_000) + 1_000_000) % 1_000_000;\n const shiftedMs =\n wallMs + ((totalMicro - microRemainder) / 1_000_000) * MS_PER_SECOND;\n const shifted = new Date(shiftedMs);\n return new PyDateTime({\n year: shifted.getUTCFullYear(),\n month: shifted.getUTCMonth() + 1,\n day: shifted.getUTCDate(),\n hour: shifted.getUTCHours(),\n minute: shifted.getUTCMinutes(),\n second: shifted.getUTCSeconds(),\n microsecond: microRemainder,\n utcOffsetMinutes: this.utcOffsetMinutes,\n });\n }\n\n /** Midnight of the same day (Python's `datetime.combine(dt.date(), time())`). */\n startOfDay(): PyDateTime {\n return this.replace({ hour: 0, minute: 0, second: 0, microsecond: 0 });\n }\n\n /**\n * Seconds from `other` to this datetime (Python's `(self - other)\n * .total_seconds()`). Both must be naive or both aware, as in Python.\n */\n secondsSince(other: PyDateTime): number {\n if (this.isNaive !== other.isNaive) {\n throw new TypeError(\n \"can't subtract offset-naive and offset-aware datetimes\",\n );\n }\n if (this.isNaive) {\n return (this.wallClockMicros() - other.wallClockMicros()) / 1_000_000;\n }\n return this.timestamp() - other.timestamp();\n }\n\n /** Negative, zero or positive, like comparing Python datetimes. */\n compare(other: PyDateTime): number {\n return Math.sign(this.secondsSince(other));\n }\n\n equals(other: PyDateTime): boolean {\n if (this.isNaive !== other.isNaive) {\n return false;\n }\n return this.compare(other) === 0;\n }\n\n private wallClockMicros(): number {\n const wallMs = utcEpochMs(\n this.year,\n this.month,\n this.day,\n this.hour,\n this.minute,\n this.second,\n );\n return wallMs * MICROSECONDS_PER_MS + this.microsecond;\n }\n\n fields(): PyDateTimeFields {\n return {\n year: this.year,\n month: this.month,\n day: this.day,\n hour: this.hour,\n minute: this.minute,\n second: this.second,\n microsecond: this.microsecond,\n utcOffsetMinutes: this.utcOffsetMinutes,\n };\n }\n\n /** Day of the week, Monday = 0 (Python's `weekday()`). */\n weekday(): number {\n const sundayFirst = new Date(\n utcEpochMs(this.year, this.month, this.day),\n ).getUTCDay();\n return (sundayFirst + 6) % 7;\n }\n\n /**\n * Python's `strftime` for the directives parsedmarc uses: `%Y %y %m %d %H\n * %I %M %S %f %p %z %Z %a %A %b %B %j %%`.\n */\n strftime(format: string): string {\n let result = '';\n for (let index = 0; index < format.length; index += 1) {\n const char = format.charAt(index);\n if (char !== '%' || index === format.length - 1) {\n result += char;\n continue;\n }\n index += 1;\n result += this.directive(format.charAt(index));\n }\n return result;\n }\n\n private directive(code: string): string {\n const weekdayName = WEEKDAYS[(this.weekday() + 1) % 7] ?? '';\n const monthName = MONTHS[this.month - 1] ?? '';\n switch (code) {\n case 'Y':\n return pad(this.year, 4);\n case 'y':\n return pad(this.year % 100);\n case 'm':\n return pad(this.month);\n case 'd':\n return pad(this.day);\n case 'H':\n return pad(this.hour);\n case 'I':\n return pad(this.hour % 12 === 0 ? 12 : this.hour % 12);\n case 'M':\n return pad(this.minute);\n case 'S':\n return pad(this.second);\n case 'f':\n return pad(this.microsecond, 6);\n case 'p':\n return this.hour < 12 ? 'AM' : 'PM';\n case 'z':\n return this.utcOffsetMinutes === null\n ? ''\n : formatOffset(this.utcOffsetMinutes, '');\n case 'Z':\n return this.utcOffsetMinutes === null\n ? ''\n : this.utcOffsetMinutes === 0\n ? 'UTC'\n : `UTC${formatOffset(this.utcOffsetMinutes, ':')}`;\n case 'a':\n return weekdayName.slice(0, 3);\n case 'A':\n return weekdayName;\n case 'b':\n return monthName.slice(0, 3);\n case 'B':\n return monthName;\n case 'j': {\n const start = utcEpochMs(this.year, 1, 1);\n const current = utcEpochMs(this.year, this.month, this.day);\n return pad((current - start) / 86_400_000 + 1, 3);\n }\n case '%':\n return '%';\n default:\n return `%${code}`;\n }\n }\n\n /** Python's `isoformat(sep)`: `2024-01-01T00:00:00[.ffffff][+00:00]`. */\n isoformat(separator = 'T'): string {\n let text = `${pad(this.year, 4)}-${pad(this.month)}-${pad(this.day)}${separator}${pad(this.hour)}:${pad(this.minute)}:${pad(this.second)}`;\n if (this.microsecond !== 0) {\n text += `.${pad(this.microsecond, 6)}`;\n }\n if (this.utcOffsetMinutes !== null) {\n text += formatOffset(this.utcOffsetMinutes, ':');\n }\n return text;\n }\n\n /** Python's `str(datetime)`: ISO format with a space separator. */\n toString(): string {\n return this.isoformat(' ');\n }\n\n /** JSON form, matching Python's `json.dumps(..., default=str)`. */\n toJSON(): string {\n return this.toString();\n }\n}\n","// Timestamp helpers, ported from parsedmarc/utils.py, plus `parseDate`, a\n// port of `dateutil.parser.parse` 2.9.0 with its default `parserinfo`\n// (no `dayfirst`/`yearfirst`, no `fuzzy`, no `tzinfos`): the lexer\n// (`_timelex`), the token loop (`parser._parse`), year/month/day resolution\n// (`_ymd`) and the naive/aware result building, with Python's error\n// messages.\n//\n// Every scan here is linear: input comes from report senders. Linear is still\n// a minute of CPU and 2.5 GB for a 37 MB token, so `parseDate` rejects text\n// that can't be a date before looking at it (dateutil has no such limit).\n\nimport { PyDateTime } from './datetime';\n\n/** Raised when a date string cannot be parsed (dateutil's `ParserError`). */\nexport class DateParseError extends Error {\n override name = 'DateParseError';\n}\n\n/** A `ValueError`/`IndexError` inside dateutil's `_parse`: \"Unknown string format\". */\nclass TokenError extends Error {}\n\nexport interface ParseDateOptions {\n /**\n * Naive datetime supplying the fields the string leaves out (dateutil's\n * `default`). Defaults to today at midnight, local time.\n */\n default?: PyDateTime;\n /**\n * Year that two-digit years are resolved around (dateutil uses the local\n * year when it is imported). Defaults to the current local year.\n */\n currentYear?: number;\n}\n\n// --- Python str predicates -------------------------------------------------\n\nconst DECIMAL_DIGIT = /^\\p{Nd}$/u;\nconst LETTER = /^\\p{L}$/u;\n/** `str.isdigit()` characters that are not decimal digits (Unicode 16). */\nconst EXTRA_DIGIT_RANGES: readonly (readonly [number, number])[] = [\n [0xb2, 0xb3],\n [0xb9, 0xb9],\n [0x13_69, 0x13_71],\n [0x19_da, 0x19_da],\n [0x20_70, 0x20_70],\n [0x20_74, 0x20_79],\n [0x20_80, 0x20_89],\n [0x24_60, 0x24_68],\n [0x24_74, 0x24_7c],\n [0x24_88, 0x24_90],\n [0x24_ea, 0x24_ea],\n [0x24_f5, 0x24_fd],\n [0x24_ff, 0x24_ff],\n [0x27_76, 0x27_7e],\n [0x27_80, 0x27_88],\n [0x27_8a, 0x27_92],\n [0x1_0a_40, 0x1_0a_43],\n [0x1_0e_60, 0x1_0e_68],\n [0x1_10_52, 0x1_10_5a],\n [0x1_f1_00, 0x1_f1_0a],\n];\n/** `str.isspace()` characters. */\nconst PY_SPACE: ReadonlySet<string> = new Set(\n [\n 0x9, 0xa, 0xb, 0xc, 0xd, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x85, 0xa0, 0x16_80,\n 0x20_00, 0x20_01, 0x20_02, 0x20_03, 0x20_04, 0x20_05, 0x20_06, 0x20_07,\n 0x20_08, 0x20_09, 0x20_0a, 0x20_28, 0x20_29, 0x20_2f, 0x20_5f, 0x30_00,\n ].map(code => String.fromCodePoint(code)),\n);\n\nconst isWordChar = (char: string): boolean => LETTER.test(char);\nconst isDecimalChar = (char: string): boolean => DECIMAL_DIGIT.test(char);\n\nfunction isNumChar(char: string): boolean {\n if (isDecimalChar(char)) {\n return true;\n }\n const code = char.codePointAt(0) ?? 0;\n return EXTRA_DIGIT_RANGES.some(([low, high]) => code >= low && code <= high);\n}\n\n/** Python's `str.isdigit()`. */\nfunction isDigitString(value: string): boolean {\n const chars = Array.from(value);\n return chars.length > 0 && chars.every(isNumChar);\n}\n\n/** Value of a decimal digit: digits come in runs of ten starting at zero. */\nfunction decimalValue(char: string): number {\n let code = char.codePointAt(0) ?? 0;\n if (code >= 0x30 && code <= 0x39) {\n return code - 0x30;\n }\n const original = code;\n while (isDecimalChar(String.fromCodePoint(code - 1))) {\n code -= 1;\n }\n return (original - code) % 10;\n}\n\nfunction asciiDigits(chars: readonly string[]): string {\n return chars.map(char => String(decimalValue(char))).join('');\n}\n\n/** Python's `int(str)` on a lexer token: decimal digits only. */\nfunction pyInt(value: string): number {\n const chars = Array.from(value);\n if (\n chars.length === 0 ||\n chars.length > PY_INT_MAX_STR_DIGITS ||\n !chars.every(isDecimalChar)\n ) {\n throw new TokenError();\n }\n return Number(asciiDigits(chars));\n}\n\n/** `sys.get_int_max_str_digits()`: longer strings make `int()` raise ValueError. */\nexport const PY_INT_MAX_STR_DIGITS = 4300;\n\n/** A finite `Decimal` made from a token: integer part and fraction digits. */\ninterface DecimalValue {\n whole: number;\n fraction: string;\n}\n\n/** Python's `float(token)` succeeds: digits with an optional fraction, or inf/nan. */\nfunction isFloatToken(token: string): boolean {\n return splitDecimal(token) !== null || NON_FINITE.test(token);\n}\n\nconst NON_FINITE = /^(?:inf|infinity|nan)$/iu;\n\nfunction splitDecimal(token: string): DecimalValue | null {\n const chars = Array.from(token);\n const dot = chars.indexOf('.');\n const wholeChars = dot === -1 ? chars : chars.slice(0, dot);\n const fractionChars = dot === -1 ? [] : chars.slice(dot + 1);\n if (\n wholeChars.length === 0 ||\n !wholeChars.every(isDecimalChar) ||\n !fractionChars.every(isDecimalChar)\n ) {\n return null;\n }\n return {\n whole: Number(asciiDigits(wholeChars)),\n fraction: asciiDigits(fractionChars),\n };\n}\n\n/** Far over any date, and about 0.7 s of CPU at worst. */\nconst MAX_DATE_LENGTH = 1024 * 1024;\n\n/** dateutil's `_to_decimal`: a finite Decimal, else ValueError. */\nfunction toDecimal(token: string): DecimalValue {\n const value = splitDecimal(token);\n if (value === null) {\n throw new TokenError();\n }\n return value;\n}\n\nconst hasFraction = (value: DecimalValue): boolean =>\n /[1-9]/u.test(value.fraction);\n/** `value > limit` for an integer limit, exactly. */\nconst decimalAbove = (value: DecimalValue, limit: number): boolean =>\n value.whole > limit || (value.whole === limit && hasFraction(value));\n/** `int(60 * (value % 1))`, exactly. */\nfunction sixtiethsOfFraction(value: DecimalValue): number {\n if (!hasFraction(value)) {\n return 0;\n }\n const scale = 10n ** BigInt(value.fraction.length);\n return Number((60n * BigInt(value.fraction)) / scale);\n}\n\n// --- parserinfo ------------------------------------------------------------\n\nconst toIndex = (groups: readonly (readonly string[])[]): Map<string, number> =>\n new Map(\n groups.flatMap((names, index) =>\n names.map(name => [name.toLowerCase(), index] as const),\n ),\n );\n\nconst JUMP: ReadonlySet<string> = new Set([\n ' ',\n '.',\n ',',\n ';',\n '-',\n '/',\n \"'\",\n 'at',\n 'on',\n 'and',\n 'ad',\n 'm',\n 't',\n 'of',\n 'st',\n 'nd',\n 'rd',\n 'th',\n]);\nconst WEEKDAYS = toIndex([\n ['Mon', 'Monday'],\n ['Tue', 'Tuesday'],\n ['Wed', 'Wednesday'],\n ['Thu', 'Thursday'],\n ['Fri', 'Friday'],\n ['Sat', 'Saturday'],\n ['Sun', 'Sunday'],\n]);\nconst MONTHS = toIndex([\n ['Jan', 'January'],\n ['Feb', 'February'],\n ['Mar', 'March'],\n ['Apr', 'April'],\n ['May', 'May'],\n ['Jun', 'June'],\n ['Jul', 'July'],\n ['Aug', 'August'],\n ['Sep', 'Sept', 'September'],\n ['Oct', 'October'],\n ['Nov', 'November'],\n ['Dec', 'December'],\n]);\nconst HMS = toIndex([\n ['h', 'hour', 'hours'],\n ['m', 'minute', 'minutes'],\n ['s', 'second', 'seconds'],\n]);\nconst AMPM = toIndex([\n ['am', 'a'],\n ['pm', 'p'],\n]);\nconst UTCZONE: readonly string[] = ['UTC', 'GMT', 'Z', 'z'];\nconst UTCZONE_LOWER: ReadonlySet<string> = new Set(['utc', 'gmt', 'z']);\nconst ASCII_UPPERCASE = /^[A-Z]+$/u;\n\nconst isJump = (name: string): boolean => JUMP.has(name.toLowerCase());\nconst weekdayOf = (name: string): number | undefined =>\n WEEKDAYS.get(name.toLowerCase());\nconst monthOf = (name: string): number | undefined => {\n const index = MONTHS.get(name.toLowerCase());\n return index === undefined ? undefined : index + 1;\n};\nconst hmsOf = (name: string): number | undefined => HMS.get(name.toLowerCase());\nconst ampmOf = (name: string): number | undefined =>\n AMPM.get(name.toLowerCase());\nconst isPertain = (name: string): boolean => name.toLowerCase() === 'of';\nconst isUtcZone = (name: string): boolean =>\n UTCZONE_LOWER.has(name.toLowerCase());\n/** `parserinfo.tzoffset`: note the case-sensitive lookup in lowercase keys. */\nconst tzOffsetOf = (name: string): number | null =>\n UTCZONE_LOWER.has(name) ? 0 : null;\n\nfunction convertYear(\n year: number,\n centurySpecified: boolean,\n currentYear: number,\n): number {\n if (year >= 100 || centurySpecified) {\n return year;\n }\n let full = year + Math.floor(currentYear / 100) * 100;\n if (full >= currentYear + 50) {\n full -= 100;\n } else if (full < currentYear - 50) {\n full += 100;\n }\n return full;\n}\n\n// --- _timelex --------------------------------------------------------------\n\ntype LexState = 'a' | '0' | 'a.' | '0.';\n\nconst SPLIT_DECIMAL = /([.,])/u;\n\nfunction countDots(token: string): number {\n return token.split('.').length - 1;\n}\n\n/** dateutil's `_timelex.split`: runs of letters, of digits, and single other characters. */\nfunction timelexSplit(input: string): string[] {\n const chars = Array.from(input).filter(char => char !== '\\0');\n const tokens: string[] = [];\n let position = 0;\n while (position < chars.length) {\n const first = chars[position] ?? '';\n position += 1;\n let state: LexState;\n if (isWordChar(first)) {\n state = 'a';\n } else if (isNumChar(first)) {\n state = '0';\n } else {\n tokens.push(PY_SPACE.has(first) ? ' ' : first);\n continue;\n }\n let token = first;\n let tokenLength = 1;\n let seenLetters = false;\n while (position < chars.length) {\n const char = chars[position] ?? '';\n let accepted = true;\n if (state === 'a') {\n seenLetters = true;\n if (isWordChar(char)) {\n // stays a word\n } else if (char === '.') {\n state = 'a.';\n } else {\n accepted = false;\n }\n } else if (state === '0') {\n if (isNumChar(char)) {\n // stays a number\n } else if (char === '.' || (char === ',' && tokenLength >= 2)) {\n state = '0.';\n } else {\n accepted = false;\n }\n } else if (state === 'a.') {\n seenLetters = true;\n if (char === '.' || isWordChar(char)) {\n // stays\n } else if (isNumChar(char) && token.endsWith('.')) {\n state = '0.';\n } else {\n accepted = false;\n }\n } else if (char === '.' || isNumChar(char)) {\n // '0.' stays\n } else if (isWordChar(char) && token.endsWith('.')) {\n state = 'a.';\n } else {\n accepted = false;\n }\n if (!accepted) {\n break;\n }\n token += char;\n tokenLength += 1;\n position += 1;\n }\n\n let rest: string[] = [];\n if (\n (state === 'a.' || state === '0.') &&\n (seenLetters ||\n countDots(token) > 1 ||\n token.endsWith('.') ||\n token.endsWith(','))\n ) {\n const parts = token.split(SPLIT_DECIMAL);\n token = parts[0] ?? '';\n rest = parts.slice(1).filter(Boolean);\n }\n if (state === '0.' && !token.includes('.')) {\n token = token.replaceAll(',', '.');\n }\n tokens.push(token, ...rest);\n }\n return tokens;\n}\n\n// --- _ymd ------------------------------------------------------------------\n\ntype YmdLabel = 'Y' | 'M' | 'D' | null;\n\nfunction isLeap(year: number): boolean {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nconst MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] as const;\n\n/** `calendar.monthrange(year, month)[1]`. */\nfunction monthLength(year: number, month: number): number {\n if (!(month >= 1 && month <= 12)) {\n throw new RangeError(`bad month number ${month}; must be 1-12`);\n }\n return month === 2 && isLeap(year) ? 29 : (MONTH_DAYS[month - 1] ?? 31);\n}\n\nclass Ymd {\n readonly values: number[] = [];\n centurySpecified = false;\n dstridx: number | null = null;\n mstridx: number | null = null;\n ystridx: number | null = null;\n\n get length(): number {\n return this.values.length;\n }\n\n at(index: number): number {\n // Python's negative indexing (`self[mstridx - 1]`).\n const value = this.values.at(index);\n if (value === undefined) {\n throw new TokenError();\n }\n return value;\n }\n\n couldBeDay(value: DecimalValue): boolean {\n if (this.dstridx !== null) {\n return false;\n }\n if (value.whole < 1) {\n return false;\n }\n if (this.mstridx === null) {\n return !decimalAbove(value, 31);\n }\n const month = this.at(this.mstridx);\n const year = this.ystridx === null ? 2000 : this.at(this.ystridx);\n return !decimalAbove(value, monthLength(year, month));\n }\n\n appendString(value: string, label: YmdLabel = null): void {\n let finalLabel = label;\n if (isDigitString(value) && Array.from(value).length > 2) {\n this.centurySpecified = true;\n if (label !== null && label !== 'Y') {\n throw new TokenError();\n }\n finalLabel = 'Y';\n }\n this.push(pyInt(value), finalLabel);\n }\n\n appendNumber(value: DecimalValue | number, label: YmdLabel = null): void {\n const decimal =\n typeof value === 'number' ? { whole: value, fraction: '' } : value;\n let finalLabel = label;\n if (decimalAbove(decimal, 100)) {\n this.centurySpecified = true;\n if (label !== null && label !== 'Y') {\n throw new TokenError();\n }\n finalLabel = 'Y';\n }\n this.push(decimal.whole, finalLabel);\n }\n\n private push(value: number, label: YmdLabel): void {\n this.values.push(value);\n const index = this.values.length - 1;\n if (label === 'M') {\n if (this.mstridx !== null) {\n throw new TokenError();\n }\n this.mstridx = index;\n } else if (label === 'D') {\n if (this.dstridx !== null) {\n throw new TokenError();\n }\n this.dstridx = index;\n } else if (label === 'Y') {\n if (this.ystridx !== null) {\n throw new TokenError();\n }\n this.ystridx = index;\n }\n }\n\n private resolveFromStridxs(\n strids: Map<string, number>,\n ): [number | null, number | null, number | null] {\n if (this.length === 3 && strids.size === 2) {\n const used = new Set(strids.values());\n const missing = [0, 1, 2].find(index => !used.has(index)) ?? 0;\n const key = ['y', 'm', 'd'].find(name => !strids.has(name)) ?? 'y';\n strids.set(key, missing);\n }\n const get = (key: string): number | null => {\n const index = strids.get(key);\n return index === undefined ? null : this.at(index);\n };\n return [get('y'), get('m'), get('d')];\n }\n\n /** `resolve_ymd(yearfirst=False, dayfirst=False)`. */\n resolve(): [number | null, number | null, number | null] {\n const length = this.length;\n const strids = new Map<string, number>();\n if (this.ystridx !== null) {\n strids.set('y', this.ystridx);\n }\n if (this.mstridx !== null) {\n strids.set('m', this.mstridx);\n }\n if (this.dstridx !== null) {\n strids.set('d', this.dstridx);\n }\n if (\n (length === strids.size && length > 0) ||\n (length === 3 && strids.size === 2)\n ) {\n return this.resolveFromStridxs(strids);\n }\n\n let year: number | null = null;\n let month: number | null = null;\n let day: number | null = null;\n const { mstridx } = this;\n if (length > 3) {\n throw new TokenError();\n }\n if (length === 1 || (mstridx !== null && length === 2)) {\n let other: number;\n if (mstridx === null) {\n other = this.at(0);\n } else {\n month = this.at(mstridx);\n other = this.at(mstridx - 1);\n }\n if (length > 1 || mstridx === null) {\n if (other > 31) {\n year = other;\n } else {\n day = other;\n }\n }\n } else if (length === 2) {\n const [first, second] = [this.at(0), this.at(1)];\n if (first > 31) {\n [year, month] = [first, second];\n } else if (second > 31) {\n [month, year] = [first, second];\n } else {\n [month, day] = [first, second];\n }\n } else if (length === 3) {\n const [first, second, third] = [this.at(0), this.at(1), this.at(2)];\n if (mstridx === 0) {\n if (second > 31) {\n [month, year, day] = [first, second, third];\n } else {\n [month, day, year] = [first, second, third];\n }\n } else if (mstridx === 1) {\n if (first > 31) {\n [year, month, day] = [first, second, third];\n } else {\n [day, month, year] = [first, second, third];\n }\n } else if (mstridx === 2) {\n if (second > 31) {\n [day, year, month] = [first, second, third];\n } else {\n [year, day, month] = [first, second, third];\n }\n } else if (first > 31 || this.ystridx === 0) {\n [year, month, day] = [first, second, third];\n } else if (first > 12) {\n [day, month, year] = [first, second, third];\n } else {\n [month, day, year] = [first, second, third];\n }\n }\n return [year, month, day];\n }\n}\n\n// --- parser._parse ---------------------------------------------------------\n\ninterface ParseResult {\n year: number | null;\n month: number | null;\n day: number | null;\n weekday: number | null;\n hour: number | null;\n minute: number | null;\n second: number | null;\n microsecond: number | null;\n tzname: string | null;\n tzoffset: number | null;\n ampm: number | null;\n centurySpecified: boolean;\n}\n\nfunction couldBeTzname(\n res: ParseResult,\n token: string,\n ignoreOffset = false,\n): boolean {\n return (\n res.hour !== null &&\n res.tzname === null &&\n (ignoreOffset || res.tzoffset === null) &&\n Array.from(token).length <= 5 &&\n (ASCII_UPPERCASE.test(token) || UTCZONE.includes(token))\n );\n}\n\nfunction adjustAmpm(hour: number, ampm: number): number {\n if (hour < 12 && ampm === 1) {\n return hour + 12;\n }\n if (hour === 12 && ampm === 0) {\n return 0;\n }\n return hour;\n}\n\n/** `_parsems`: \"I[.F]\" seconds → [seconds, microseconds]. */\nfunction parseMs(value: string): [number, number] {\n if (!value.includes('.')) {\n return [pyInt(value), 0];\n }\n const parts = value.split('.');\n if (parts.length !== 2) {\n throw new TokenError();\n }\n const [whole = '', fraction = ''] = parts;\n const fractionChars = Array.from(fraction);\n while (fractionChars.length < 6) {\n fractionChars.push('0');\n }\n return [pyInt(whole), pyInt(fractionChars.slice(0, 6).join(''))];\n}\n\n/** `_parse_min_sec`: minutes plus a fraction turned into seconds (or null). */\nfunction parseMinSec(value: DecimalValue): [number, number | null] {\n return [value.whole, hasFraction(value) ? sixtiethsOfFraction(value) : null];\n}\n\nclass Tokens {\n readonly items: string[];\n\n // No parameter property: worker threads load this file with Node's\n // type stripping, which rejects them.\n constructor(items: string[]) {\n this.items = items;\n }\n\n get length(): number {\n return this.items.length;\n }\n\n /** `l[index]`, raising (IndexError → \"Unknown string format\") when out of range. */\n get(index: number): string {\n const token = this.items[index];\n if (token === undefined) {\n throw new TokenError();\n }\n return token;\n }\n}\n\nfunction findHmsIndex(index: number, tokens: Tokens): number | null {\n const { length } = tokens;\n if (index + 1 < length && hmsOf(tokens.get(index + 1)) !== undefined) {\n return index + 1;\n }\n if (\n index + 2 < length &&\n tokens.get(index + 1) === ' ' &&\n hmsOf(tokens.get(index + 2)) !== undefined\n ) {\n return index + 2;\n }\n if (index > 0 && hmsOf(tokens.get(index - 1)) !== undefined) {\n return index - 1;\n }\n if (\n index > 1 &&\n index === length - 1 &&\n tokens.get(index - 1) === ' ' &&\n hmsOf(tokens.get(index - 2)) !== undefined\n ) {\n return index - 2;\n }\n return null;\n}\n\nfunction assignHms(res: ParseResult, valueRepr: string, hms: number): void {\n const value = toDecimal(valueRepr);\n if (hms === 0) {\n res.hour = value.whole;\n if (hasFraction(value)) {\n res.minute = sixtiethsOfFraction(value);\n }\n } else if (hms === 1) {\n [res.minute, res.second] = parseMinSec(value);\n } else if (hms === 2) {\n [res.second, res.microsecond] = parseMs(valueRepr);\n }\n}\n\n/** `_parse_numeric_token`; returns the index of the last token consumed. */\nfunction parseNumericToken(\n tokens: Tokens,\n start: number,\n ymd: Ymd,\n res: ParseResult,\n): number {\n let index = start;\n const valueRepr = tokens.get(index);\n let value = toDecimal(valueRepr);\n const chars = Array.from(valueRepr);\n const tokenLength = chars.length;\n const slice = (from: number, to?: number): string =>\n chars.slice(from, to).join('');\n const { length } = tokens;\n\n if (\n ymd.length === 3 &&\n (tokenLength === 2 || tokenLength === 4) &&\n res.hour === null &&\n (index + 1 >= length ||\n (tokens.get(index + 1) !== ':' &&\n hmsOf(tokens.get(index + 1)) === undefined))\n ) {\n // 19990101T23[59]\n res.hour = pyInt(slice(0, 2));\n if (tokenLength === 4) {\n res.minute = pyInt(slice(2));\n }\n } else if (\n tokenLength === 6 ||\n (tokenLength > 6 && chars.indexOf('.') === 6)\n ) {\n // YYMMDD or HHMMSS[.ss]\n if (ymd.length === 0 && !valueRepr.includes('.')) {\n ymd.appendString(slice(0, 2));\n ymd.appendString(slice(2, 4));\n ymd.appendString(slice(4));\n } else {\n res.hour = pyInt(slice(0, 2));\n res.minute = pyInt(slice(2, 4));\n [res.second, res.microsecond] = parseMs(slice(4));\n }\n } else if (tokenLength === 8 || tokenLength === 12 || tokenLength === 14) {\n // YYYYMMDD[hhmm[ss]]\n ymd.appendString(slice(0, 4), 'Y');\n ymd.appendString(slice(4, 6));\n ymd.appendString(slice(6, 8));\n if (tokenLength > 8) {\n res.hour = pyInt(slice(8, 10));\n res.minute = pyInt(slice(10, 12));\n if (tokenLength > 12) {\n res.second = pyInt(slice(12));\n }\n }\n } else if (findHmsIndex(index, tokens) !== null) {\n // HH[ ]h or MM[ ]m or SS[.ss][ ]s\n const hmsIndex = findHmsIndex(index, tokens) ?? index;\n let hms: number;\n if (hmsIndex > index) {\n hms = hmsOf(tokens.get(hmsIndex)) ?? 0;\n index = hmsIndex;\n } else {\n hms = (hmsOf(tokens.get(hmsIndex)) ?? 0) + 1;\n }\n assignHms(res, valueRepr, hms);\n } else if (index + 2 < length && tokens.get(index + 1) === ':') {\n // HH:MM[:SS[.ss]]\n res.hour = value.whole;\n value = toDecimal(tokens.get(index + 2));\n [res.minute, res.second] = parseMinSec(value);\n if (index + 4 < length && tokens.get(index + 3) === ':') {\n [res.second, res.microsecond] = parseMs(tokens.get(index + 4));\n index += 2;\n }\n index += 2;\n } else if (\n index + 1 < length &&\n ['-', '/', '.'].includes(tokens.get(index + 1))\n ) {\n const separator = tokens.get(index + 1);\n ymd.appendString(valueRepr);\n if (index + 2 < length && !isJump(tokens.get(index + 2))) {\n const next = tokens.get(index + 2);\n if (isDigitString(next)) {\n // 01-01[-01]\n ymd.appendString(next);\n } else {\n // 01-Jan[-01]\n const month = monthOf(next);\n if (month === undefined) {\n throw new TokenError();\n }\n ymd.appendNumber(month, 'M');\n }\n if (index + 3 < length && tokens.get(index + 3) === separator) {\n // three members\n const last = tokens.get(index + 4);\n const month = monthOf(last);\n if (month === undefined) {\n ymd.appendString(last);\n } else {\n ymd.appendNumber(month, 'M');\n }\n index += 2;\n }\n index += 1;\n }\n index += 1;\n } else if (index + 1 >= length || isJump(tokens.get(index + 1))) {\n const ampm = index + 2 < length ? ampmOf(tokens.get(index + 2)) : undefined;\n if (ampm === undefined) {\n // year, month or day\n ymd.appendNumber(value);\n } else {\n // 12 am\n res.hour = adjustAmpm(value.whole, ampm);\n index += 1;\n }\n index += 1;\n } else if (ampmOf(tokens.get(index + 1)) !== undefined && value.whole < 24) {\n // 12am\n res.hour = adjustAmpm(value.whole, ampmOf(tokens.get(index + 1)) ?? 0);\n index += 1;\n } else if (ymd.couldBeDay(value)) {\n ymd.appendNumber(value);\n } else {\n throw new TokenError();\n }\n return index;\n}\n\nfunction emptyResult(): ParseResult {\n return {\n year: null,\n month: null,\n day: null,\n weekday: null,\n hour: null,\n minute: null,\n second: null,\n microsecond: null,\n tzname: null,\n tzoffset: null,\n ampm: null,\n centurySpecified: false,\n };\n}\n\n/** Python's `_parse`: null where dateutil returns `(None, None)`. */\nfunction parseTokens(input: string, currentYear: number): ParseResult | null {\n const res = emptyResult();\n const tokens = new Tokens(timelexSplit(input));\n const list = tokens.items;\n const ymd = new Ymd();\n const { length } = tokens;\n let index = 0;\n try {\n while (index < length) {\n const token = tokens.get(index);\n if (isFloatToken(token)) {\n index = parseNumericToken(tokens, index, ymd, res);\n } else if (weekdayOf(token) !== undefined) {\n res.weekday = weekdayOf(token) ?? null;\n } else if (monthOf(token) !== undefined) {\n ymd.appendNumber(monthOf(token) ?? 0, 'M');\n if (index + 1 < length) {\n const next = tokens.get(index + 1);\n if (next === '-' || next === '/') {\n // Jan-01[-99]\n ymd.appendString(tokens.get(index + 2));\n if (index + 3 < length && tokens.get(index + 3) === next) {\n // Jan-01-99\n ymd.appendString(tokens.get(index + 4));\n index += 2;\n }\n index += 2;\n } else if (\n index + 4 < length &&\n next === ' ' &&\n tokens.get(index + 3) === ' ' &&\n isPertain(tokens.get(index + 2))\n ) {\n // Jan of 01: clearly a year\n const yearToken = tokens.get(index + 4);\n if (isDigitString(yearToken)) {\n const year = convertYear(pyInt(yearToken), false, currentYear);\n ymd.appendString(String(year), 'Y');\n }\n index += 4;\n }\n }\n } else if (ampmOf(token) !== undefined) {\n // _ampm_valid without fuzzy: the hour must be set and on a 12-hour clock.\n if (res.hour === null || res.hour < 0 || res.hour > 12) {\n throw new TokenError();\n }\n const ampm = ampmOf(token) ?? 0;\n res.hour = adjustAmpm(res.hour, ampm);\n res.ampm = ampm;\n } else if (couldBeTzname(res, token)) {\n res.tzname = token;\n res.tzoffset = tzOffsetOf(token);\n // \"GMT+3\" means \"my time +3 is GMT\": reverse the sign for the\n // numeric-offset branch below.\n const next = list[index + 1];\n if (next === '+' || next === '-') {\n list[index + 1] = next === '+' ? '-' : '+';\n res.tzoffset = null;\n if (isUtcZone(token)) {\n // With something like GMT+3, the timezone is *not* GMT.\n res.tzname = null;\n }\n }\n } else if (res.hour !== null && (token === '+' || token === '-')) {\n const sign = token === '+' ? 1 : -1;\n const offsetToken = tokens.get(index + 1);\n const offsetChars = Array.from(offsetToken);\n let hourOffset: number;\n let minuteOffset: number;\n if (offsetChars.length === 4) {\n // -0300\n hourOffset = pyInt(offsetChars.slice(0, 2).join(''));\n minuteOffset = pyInt(offsetChars.slice(2).join(''));\n } else if (index + 2 < length && tokens.get(index + 2) === ':') {\n // -03:00\n hourOffset = pyInt(offsetToken);\n minuteOffset = pyInt(tokens.get(index + 3));\n index += 2;\n } else if (offsetChars.length <= 2) {\n // -[0]3\n hourOffset = pyInt(offsetChars.slice(0, 2).join(''));\n minuteOffset = 0;\n } else {\n throw new TokenError();\n }\n res.tzoffset = sign * (hourOffset * 3600 + minuteOffset * 60);\n // A zone name in parentheses: \"-0300 (BRST)\".\n if (\n index + 5 < length &&\n isJump(tokens.get(index + 2)) &&\n tokens.get(index + 3) === '(' &&\n tokens.get(index + 5) === ')' &&\n Array.from(tokens.get(index + 4)).length >= 3 &&\n couldBeTzname(res, tokens.get(index + 4), true)\n ) {\n res.tzname = tokens.get(index + 4);\n index += 4;\n }\n index += 1;\n } else if (!isJump(token)) {\n throw new TokenError();\n }\n index += 1;\n }\n [res.year, res.month, res.day] = ymd.resolve();\n res.centurySpecified = ymd.centurySpecified;\n } catch (error) {\n if (error instanceof TokenError || error instanceof RangeError) {\n return null;\n }\n throw error;\n }\n\n // parserinfo.validate\n if (res.year !== null) {\n res.year = convertYear(res.year, res.centurySpecified, currentYear);\n }\n if (\n (res.tzoffset === 0 && !res.tzname) ||\n res.tzname === 'Z' ||\n res.tzname === 'z'\n ) {\n res.tzname = 'UTC';\n res.tzoffset = 0;\n } else if (res.tzoffset !== 0 && res.tzname && isUtcZone(res.tzname)) {\n res.tzoffset = 0;\n }\n return res;\n}\n\n// --- result building -------------------------------------------------------\n\nconst C_INT_MAX = 2_147_483_647;\n\n/** `datetime.replace(**fields)` range checks, with CPython 3.14's messages. */\nfunction checkFields(fields: PyDateTimeFieldsLike): void {\n for (const value of Object.values(fields)) {\n if (value > C_INT_MAX) {\n throw new RangeError('Python int too large to convert to C int');\n }\n }\n const { year, month, day, hour, minute, second, microsecond } = fields;\n if (year < 1 || year > 9999) {\n throw new DateFieldError(`year must be in 1..9999, not ${year}`);\n }\n if (month < 1 || month > 12) {\n throw new DateFieldError(`month must be in 1..12, not ${month}`);\n }\n const days = monthLength(year, month);\n if (day < 1 || day > days) {\n throw new DateFieldError(\n `day ${day} must be in range 1..${days} for month ${month} in year ${year}`,\n );\n }\n const ranges = [\n ['hour', hour, 23],\n ['minute', minute, 59],\n ['second', second, 59],\n ['microsecond', microsecond, 999_999],\n ] as const;\n for (const [name, value, max] of ranges) {\n if (value < 0 || value > max) {\n throw new DateFieldError(`${name} must be in 0..${max}, not ${value}`);\n }\n }\n}\n\ninterface PyDateTimeFieldsLike {\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n second: number;\n microsecond: number;\n}\n\n/** A `ValueError` from `datetime.replace`/`monthrange`, reported as `ParserError`. */\nclass DateFieldError extends Error {}\n\n/** `_build_naive`: the parsed fields over the default, plus the weekday jump. */\nfunction buildNaive(res: ParseResult, defaults: PyDateTime): PyDateTime {\n const fields: PyDateTimeFieldsLike = {\n year: res.year ?? defaults.year,\n month: res.month ?? defaults.month,\n day: res.day ?? defaults.day,\n hour: res.hour ?? defaults.hour,\n minute: res.minute ?? defaults.minute,\n second: res.second ?? defaults.second,\n microsecond: res.microsecond ?? defaults.microsecond,\n };\n if (res.day === null) {\n // If the default day exceeds the last day of the month, fall back to\n // the end of the month.\n let days: number;\n try {\n days = monthLength(fields.year, fields.month);\n } catch (error) {\n throw new DateFieldError((error as Error).message);\n }\n if (fields.day > days) {\n fields.day = days;\n }\n }\n checkFields(fields);\n let naive = new PyDateTime(fields);\n if (res.weekday !== null && !res.day) {\n // relativedelta(weekday=N): forward to the next such weekday.\n const days = (res.weekday - naive.weekday() + 7) % 7;\n if (days) {\n const date = new Date(0);\n date.setUTCFullYear(naive.year, naive.month - 1, naive.day + days);\n if (date.getUTCFullYear() > 9999) {\n throw new RangeError('date value out of range');\n }\n naive = naive.replace({\n year: date.getUTCFullYear(),\n month: date.getUTCMonth() + 1,\n day: date.getUTCDate(),\n });\n }\n }\n return naive;\n}\n\n/** `repr(timedelta(seconds=n))`. */\nfunction timedeltaRepr(seconds: number): string {\n const days = Math.floor(seconds / 86_400);\n const rest = seconds - days * 86_400;\n const parts: string[] = [];\n if (days) {\n parts.push(`days=${days}`);\n }\n if (rest) {\n parts.push(`seconds=${rest}`);\n }\n return `datetime.timedelta(${parts.length ? parts.join(', ') : '0'})`;\n}\n\nfunction withFixedOffset(naive: PyDateTime, seconds: number): PyDateTime {\n if (Math.abs(seconds) >= 86_400) {\n // dateutil returns the datetime; Python fails as soon as it is used.\n throw new RangeError(\n `offset must be a timedelta strictly between -timedelta(hours=24) and timedelta(hours=24), not ${timedeltaRepr(seconds)}`,\n );\n }\n return naive.withOffset(seconds / 60);\n}\n\n// --- tz.tzlocal ------------------------------------------------------------\n\ninterface LocalZone {\n stdOffset: number;\n dstOffset: number;\n names: [string, string];\n}\n\n/**\n * ICU's English short names standing in for tzdata's abbreviations (which\n * Python's `time.tzname` reports): en-US knows the North American ones,\n * other English locales know BST, CET/CEST, WET, IST, AEST, NZST, SAST...\n * The first name that is not a bare \"GMT+1\"-style offset wins.\n */\nconst ZONE_NAME_LOCALES = [\n 'en-US',\n 'en-GB',\n 'en-AU',\n 'en-IN',\n 'en-IE',\n 'en-ZA',\n 'en-NZ',\n 'en-SG',\n] as const;\nconst GMT_OFFSET_NAME = /^GMT[+-]/u;\n\nfunction zoneName(date: Date): string {\n const tz = process.env.TZ;\n const options: Intl.DateTimeFormatOptions = { timeZoneName: 'short' };\n let name = '';\n for (const locale of ZONE_NAME_LOCALES) {\n let format: Intl.DateTimeFormat;\n try {\n format = new Intl.DateTimeFormat(\n locale,\n tz ? { ...options, timeZone: tz } : options,\n );\n } catch {\n // An invalid TZ: ICU's default zone.\n format = new Intl.DateTimeFormat(locale, options);\n }\n name =\n format.formatToParts(date).find(part => part.type === 'timeZoneName')\n ?.value ?? '';\n if (!GMT_OFFSET_NAME.test(name)) {\n return name;\n }\n }\n return name;\n}\n\nconst offsetAt = (ms: number): number => -new Date(ms).getTimezoneOffset();\n\nconst localZones = new Map<string, LocalZone>();\n\n/** Python's `time.timezone`/`altzone`/`tzname`, from January and July of this year. */\nfunction localZone(): LocalZone {\n const year = new Date().getFullYear();\n const key = `${process.env.TZ ?? ''}|${year}`;\n let zone = localZones.get(key);\n if (zone === undefined) {\n zone = computeLocalZone(year);\n localZones.set(key, zone);\n }\n return zone;\n}\n\nfunction computeLocalZone(year: number): LocalZone {\n const january = new Date(year, 0, 1);\n const july = new Date(year, 6, 1);\n const januaryOffset = offsetAt(january.getTime());\n const julyOffset = offsetAt(july.getTime());\n if (januaryOffset > julyOffset) {\n // Southern hemisphere: DST is in January.\n return {\n stdOffset: julyOffset,\n dstOffset: januaryOffset,\n names: [zoneName(july), zoneName(january)],\n };\n }\n return {\n stdOffset: januaryOffset,\n dstOffset: julyOffset,\n names: [zoneName(january), zoneName(july)],\n };\n}\n\nfunction wallMs(dt: PyDateTime): number {\n const date = new Date(0);\n date.setUTCFullYear(dt.year, dt.month - 1, dt.day);\n date.setUTCHours(dt.hour, dt.minute, dt.second);\n return date.getTime();\n}\n\n/** `tzlocal._isdst(dt)` with `dt.fold = fold`. */\nfunction localIsDst(zone: LocalZone, wall: number, fold: number): boolean {\n const saved = zone.dstOffset - zone.stdOffset;\n if (!saved) {\n return false;\n }\n // _naive_is_dst: `tm_isdst` of the wall time read as standard time. JS\n // has no isdst flag; \"at the zone's DST offset\" stands in for it (an\n // offset that is neither, like LMT before 1883, is not DST).\n const naiveIsDst = (ms: number): boolean =>\n offsetAt(ms - zone.stdOffset * 60_000) === zone.dstOffset;\n const dst = naiveIsDst(wall);\n const ambiguous = !dst && dst !== naiveIsDst(wall - saved * 60_000);\n return ambiguous ? fold === 0 : dst;\n}\n\n/** `naive.replace(tzinfo=tz.tzlocal())` plus `_assign_tzname` and the UTC fallback. */\nfunction withLocalZone(\n naive: PyDateTime,\n zone: LocalZone,\n tzname: string,\n): PyDateTime {\n const wall = wallMs(naive);\n let isDst = localIsDst(zone, wall, 0);\n if (zone.names[isDst ? 1 : 0] !== tzname) {\n const folded = localIsDst(zone, wall, 1);\n if (zone.names[folded ? 1 : 0] === tzname) {\n isDst = folded;\n }\n }\n if (zone.names[isDst ? 1 : 0] !== tzname && UTCZONE.includes(tzname)) {\n return naive.withOffset(0);\n }\n return naive.withOffset(isDst ? zone.dstOffset : zone.stdOffset);\n}\n\n/** `_build_tzaware` without `tzinfos`. */\nfunction buildAware(naive: PyDateTime, res: ParseResult): PyDateTime {\n if (res.tzname) {\n const zone = localZone();\n if (zone.names.includes(res.tzname)) {\n return withLocalZone(naive, zone, res.tzname);\n }\n }\n if (res.tzoffset === 0) {\n return naive.withOffset(0);\n }\n if (res.tzoffset) {\n return withFixedOffset(naive, res.tzoffset);\n }\n // No zone, or a zone name dateutil doesn't know (it warns and returns a\n // naive datetime).\n return naive;\n}\n\nfunction defaultDatetime(): PyDateTime {\n return PyDateTime.now().startOfDay();\n}\n\n/**\n * Parse a date/time string like `dateutil.parser.parse(timestr)`. Missing\n * fields come from `options.default` (today at midnight); a numeric offset\n * or UTC zone name makes the result aware, an unknown zone name is ignored.\n */\nexport function parseDate(\n input: string,\n options: ParseDateOptions = {},\n): PyDateTime {\n if (input.length > MAX_DATE_LENGTH) {\n throw new DateParseError(\n `String of ${input.length} characters is too long to be a date`,\n );\n }\n const currentYear = options.currentYear ?? new Date().getFullYear();\n const res = parseTokens(input, currentYear);\n if (res === null) {\n throw new DateParseError(`Unknown string format: ${input}`);\n }\n const isEmpty =\n res.year === null &&\n res.month === null &&\n res.day === null &&\n res.weekday === null &&\n res.hour === null &&\n res.minute === null &&\n res.second === null &&\n res.microsecond === null &&\n res.tzname === null &&\n res.tzoffset === null &&\n res.ampm === null;\n if (isEmpty) {\n throw new DateParseError(`String does not contain a date: ${input}`);\n }\n let naive: PyDateTime;\n try {\n naive = buildNaive(res, options.default ?? defaultDatetime());\n } catch (error) {\n if (error instanceof DateFieldError) {\n throw new DateParseError(`${error.message}: ${input}`);\n }\n throw error;\n }\n return buildAware(naive, res);\n}\n\n/** Python's `datetime.fromtimestamp(int(timestamp))`: naive, local time. */\nexport function timestampToDatetime(timestamp: number | string): PyDateTime {\n return PyDateTime.fromTimestamp(Math.trunc(Number(timestamp)));\n}\n\n/** A UNIX timestamp as local `YYYY-MM-DD HH:MM:SS`. */\nexport function timestampToHuman(timestamp: number | string): string {\n return timestampToDatetime(timestamp).strftime('%Y-%m-%d %H:%M:%S');\n}\n\n/**\n * Remove RFC 5322 comments from a header value. Comments nest and may hold\n * quoted-pairs such as `\\)`, so this counts depth instead of using a regex;\n * an unclosed comment runs to the end of the value.\n */\nexport function stripComments(value: string): string {\n let out = '';\n let depth = 0;\n let escaped = false;\n for (const char of value) {\n if (depth) {\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '(') {\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n }\n } else if (char === '(') {\n depth = 1;\n } else {\n out += char;\n }\n }\n return out;\n}\n\nexport interface HumanTimestampOptions {\n /** Convert the result to UTC. */\n toUtc?: boolean;\n /** Treat a timestamp without a UTC offset as UTC instead of local time. */\n assumeUtc?: boolean;\n}\n\n/** Parse a human-readable timestamp (Python's `human_timestamp_to_datetime`). */\nexport function humanTimestampToDatetime(\n humanTimestamp: string,\n options: HumanTimestampOptions = {},\n): PyDateTime {\n const cleaned = stripComments(humanTimestamp.replaceAll('-0000', '')).trim();\n let datetime = parseDate(cleaned);\n if (options.assumeUtc && datetime.isNaive) {\n datetime = datetime.withOffset(0);\n }\n return options.toUtc ? datetime.toUtc() : datetime;\n}\n\n/** Parse a human-readable timestamp into a UNIX timestamp (whole seconds). */\nexport function humanTimestampToUnixTimestamp(\n humanTimestamp: string,\n options: Pick<HumanTimestampOptions, 'assumeUtc'> = {},\n): number {\n const datetime = humanTimestampToDatetime(\n humanTimestamp.replaceAll('T', ' '),\n options,\n );\n return Math.trunc(datetime.timestamp());\n}\n","// Python semantics the parsers rely on when they walk parsed JSON/XML:\n// `d[key]` raising KeyError/TypeError, `x in y`, `type(x)` names, and\n// parsedmarc's `_exc_origin()` debug suffix. Errors carry Python's messages\n// so wrapped error text matches parsedmarc's.\n\nimport { DEBUG, logger } from '../log';\nimport { pyRepr } from '../utils/python';\nimport { PY_INT_MAX_STR_DIGITS } from '../utils/timestamps';\n\n/** Python's `KeyError`; `message` is `repr(key)` like `str(KeyError(key))`. */\nexport class KeyError extends Error {\n override name = 'KeyError';\n readonly key: unknown;\n\n constructor(key: unknown) {\n super(pyRepr(key));\n this.key = key;\n }\n}\n\n/** Python's `TypeError`, for wrong-type subscripts and membership tests. */\nexport class PyTypeError extends TypeError {\n override name = 'TypeError';\n}\n\n/** Python's `AttributeError`, e.g. calling `.lower()` on `None`. */\nexport class PyAttributeError extends Error {\n override name = 'AttributeError';\n}\n\n/** Python's `IndexError`, e.g. `list index out of range`. */\nexport class PyIndexError extends RangeError {\n override name = 'IndexError';\n}\n\n/** Python's `OverflowError`. */\nexport class PyOverflowError extends RangeError {\n override name = 'OverflowError';\n}\n\n/** Python's `ValueError`. */\nexport class PyValueError extends Error {\n override name = 'ValueError';\n}\n\nexport type PyDict = Record<string, unknown>;\n\n/** True for a JSON object (Python `dict`), false for arrays, null, scalars. */\nexport function isDict(value: unknown): value is PyDict {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Python's `type(value).__name__` for JSON-like values. */\nexport function pyTypeName(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NoneType';\n }\n if (Array.isArray(value)) {\n return 'list';\n }\n switch (typeof value) {\n case 'string':\n return 'str';\n case 'boolean':\n return 'bool';\n case 'bigint':\n return 'int';\n case 'number':\n return Number.isInteger(value) ? 'int' : 'float';\n case 'object':\n return 'dict';\n default:\n return typeof value;\n }\n}\n\n/** Python's `repr(type(value))`, e.g. `<class 'dict'>`. */\nexport function pyTypeRepr(value: unknown): string {\n return `<class '${pyTypeName(value)}'>`;\n}\n\n/** Python's `value[key]` on a dict, raising KeyError/TypeError like Python. */\nexport function getItem(value: unknown, key: string): unknown {\n if (isDict(value)) {\n if (!Object.hasOwn(value, key)) {\n throw new KeyError(key);\n }\n return value[key];\n }\n const type = pyTypeName(value);\n // CPython 3.14 wording: only the str message quotes the key's type.\n if (type === 'str') {\n throw new PyTypeError(\"string indices must be integers, not 'str'\");\n }\n if (type === 'list') {\n throw new PyTypeError('list indices must be integers or slices, not str');\n }\n throw new PyTypeError(`'${type}' object is not subscriptable`);\n}\n\n/** Python's `dict.get(key)`; `undefined` (missing) and `null` both mean None. */\nexport function getOptional(value: unknown, key: string): unknown {\n if (!isDict(value)) {\n throw noAttribute(value, 'get');\n }\n return Object.hasOwn(value, key) ? value[key] : undefined;\n}\n\n/** Python's `key in container` for dicts, lists and strings. */\nexport function pyContains(container: unknown, key: unknown): boolean {\n if (isDict(container)) {\n return typeof key === 'string' && Object.hasOwn(container, key);\n }\n if (Array.isArray(container)) {\n return container.includes(key);\n }\n if (typeof container === 'string') {\n if (typeof key !== 'string') {\n throw new PyTypeError(\n `'in <string>' requires string as left operand, not ${pyTypeName(key)}`,\n );\n }\n return container.includes(key);\n }\n throw new PyTypeError(\n `argument of type '${pyTypeName(container)}' is not a container or iterable`,\n );\n}\n\n/** Python's `for item in value` over parsed JSON/XML data. */\nexport function pyIter(value: unknown): unknown[] {\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === 'string') {\n return [...value];\n }\n if (isDict(value)) {\n return Object.keys(value);\n }\n throw new PyTypeError(`'${pyTypeName(value)}' object is not iterable`);\n}\n\n/**\n * Python's `value in frozenset_of_strings`: dicts and lists are unhashable,\n * so the membership test itself raises TypeError.\n */\nexport function pyFrozensetContains(\n set: ReadonlySet<string>,\n value: unknown,\n): boolean {\n if (isDict(value) || Array.isArray(value)) {\n const type = pyTypeName(value);\n throw new PyTypeError(\n `cannot use '${type}' as a set element (unhashable type: '${type}')`,\n );\n }\n return typeof value === 'string' && set.has(value);\n}\n\n/** Python's `separator.join(items)`: every item must be a str. */\nexport function pyStrJoin(\n separator: string,\n items: readonly unknown[],\n): string {\n for (const [index, item] of items.entries()) {\n if (typeof item !== 'string') {\n throw new PyTypeError(\n `sequence item ${index}: expected str instance, ${pyTypeName(item)} found`,\n );\n }\n }\n return items.join(separator);\n}\n\n/** Python's `bool(value)` for JSON-like values. */\nexport function pyTruthy(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n if (isDict(value)) {\n return Object.keys(value).length > 0;\n }\n return Boolean(value);\n}\n\n/** Python's `str(error)`. */\nexport function errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * parsedmarc's `_exc_origin()`: ` (raised at <file>:<line>)` for the frame\n * that threw, only when the library logger is at DEBUG; `\"\"` otherwise.\n */\nexport function excOrigin(error: unknown): string {\n if (!logger.isEnabledFor(DEBUG) || !(error instanceof Error)) {\n return '';\n }\n const frame = (error.stack ?? '')\n .split('\\n')\n .slice(1)\n .find(line => line.trimStart().startsWith('at '));\n if (frame === undefined) {\n return '';\n }\n const location = frame.includes('(')\n ? frame.slice(frame.lastIndexOf('(') + 1, frame.lastIndexOf(')'))\n : frame.trim().slice(3);\n const match = /^(?<file>.*):(?<line>\\d+):\\d+$/u.exec(location);\n if (!match?.groups) {\n return '';\n }\n return ` (raised at ${match.groups.file}:${match.groups.line})`;\n}\n\n/** Python's `AttributeError` for `value.<attribute>`. */\nexport function noAttribute(\n value: unknown,\n attribute: string,\n): PyAttributeError {\n return new PyAttributeError(\n `'${pyTypeName(value)}' object has no attribute '${attribute}'`,\n );\n}\n\n/** Python's `value.lower()`: only strings have it. */\nexport function pyLower(value: unknown): string {\n if (typeof value !== 'string') {\n throw noAttribute(value, 'lower');\n }\n return value.toLowerCase();\n}\n\n/** Python's `value.split(separator)`: only strings have it. */\nexport function pySplit(value: unknown, separator: string): string[] {\n if (typeof value !== 'string') {\n throw noAttribute(value, 'split');\n }\n return value.split(separator);\n}\n\n/**\n * Python's `value.copy()` (shallow) for dicts and lists; other types have\n * no `copy`. A list copy is typed as a dict because the callers go on to\n * subscript it, which raises TypeError for a list as in Python.\n */\nexport function dictCopy(value: unknown): PyDict {\n if (Array.isArray(value)) {\n return [...value] as unknown as PyDict;\n }\n if (!isDict(value)) {\n throw noAttribute(value, 'copy');\n }\n return { ...value };\n}\n\n/**\n * The characters `int()` strips around its argument (CPython's\n * `Py_UNICODE_ISSPACE` minus the C0 separators `\\x1c`-`\\x1f`, which\n * `_PyUnicode_TransformDecimalAndSpaceToASCII` doesn't map to a space).\n * Unlike JS `trim()`, U+FEFF is not whitespace and U+0085 is.\n */\nconst INT_WHITESPACE: ReadonlySet<string> = new Set(\n '\\t\\n\\v\\f\\r \\u0085\\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000',\n);\n\n/** Strip {@link INT_WHITESPACE} from both ends (a loop: no regex backtracking). */\nfunction stripIntWhitespace(text: string): string {\n let start = 0;\n let end = text.length;\n while (start < end && INT_WHITESPACE.has(text.charAt(start))) {\n start += 1;\n }\n while (end > start && INT_WHITESPACE.has(text.charAt(end - 1))) {\n end -= 1;\n }\n return text.slice(start, end);\n}\n\n/** Python's base-10 int literal: any Unicode decimal digits, `_` between. */\nconst INT_LITERAL = /^[+-]?\\p{Nd}+(?:_\\p{Nd}+)*$/u;\nconst DECIMAL_DIGIT = /^\\p{Nd}$/u;\nconst ASCII_ZERO = 0x30;\nconst DIGITS_PER_RUN = 10;\n\n/**\n * The value of a Unicode decimal digit. Unicode encodes every `Nd` digit in\n * runs of ten consecutive code points, 0 to 9, so the value is the offset\n * from the start of its run modulo 10.\n */\nfunction decimalDigitValue(codePoint: number): number {\n if (codePoint < ASCII_ZERO + DIGITS_PER_RUN) {\n return codePoint - ASCII_ZERO;\n }\n let start = codePoint;\n while (DECIMAL_DIGIT.test(String.fromCodePoint(start - 1))) {\n start -= 1;\n }\n return (codePoint - start) % DIGITS_PER_RUN;\n}\n\n/** A safe integer as a number, anything larger as an exact bigint. */\nexport function intValue(value: bigint): number | bigint {\n return value >= BigInt(Number.MIN_SAFE_INTEGER) &&\n value <= BigInt(Number.MAX_SAFE_INTEGER)\n ? Number(value)\n : value;\n}\n\n/** Code points of `repr()` that CPython's `%.200R` keeps in error messages. */\nconst ERROR_REPR_LENGTH = 200;\n\n/** `\"%.200R\" % value`: the repr cut to its first 200 code points. */\nfunction truncatedRepr(value: unknown): string {\n const repr = pyRepr(value);\n let end = 0;\n for (let kept = 0; kept < ERROR_REPR_LENGTH && end < repr.length; kept += 1) {\n end += (repr.codePointAt(end) ?? 0) > 0xff_ff ? 2 : 1;\n }\n return repr.slice(0, end);\n}\n\n/** Python's error for a decimal integer over `sys.get_int_max_str_digits()`. */\nexport function intDigitsError(digits: number): PyValueError {\n return new PyValueError(\n `Exceeds the limit (${PY_INT_MAX_STR_DIGITS} digits) for integer string conversion: value has ${digits} digits; use sys.set_int_max_str_digits() to increase the limit`,\n );\n}\n\n/**\n * Python's `int(value)` for strings, numbers and booleans, exact: values\n * beyond ±2^53 come back as a `bigint` (Python ints are unbounded).\n */\nexport function pyIntExact(value: unknown): number | bigint {\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n if (typeof value === 'bigint') {\n return intValue(value);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new PyValueError(\n `cannot convert float ${Number.isNaN(value) ? 'NaN' : 'infinity'} to integer`,\n );\n }\n return intValue(BigInt(Math.trunc(value)));\n }\n if (typeof value === 'string') {\n const text = stripIntWhitespace(value);\n if (!INT_LITERAL.test(text)) {\n throw new PyValueError(\n `invalid literal for int() with base 10: ${truncatedRepr(value)}`,\n );\n }\n // sys.get_int_max_str_digits(): every digit counts, leading zeros too.\n let digitCount = 0;\n for (const char of text) {\n if (char !== '_' && char !== '+' && char !== '-') {\n digitCount += 1;\n }\n }\n if (digitCount > PY_INT_MAX_STR_DIGITS) {\n throw intDigitsError(digitCount);\n }\n let digits = '';\n for (const char of text) {\n if (char === '_' || char === '+' || char === '-') {\n digits += char === '-' ? '-' : '';\n continue;\n }\n digits += String(decimalDigitValue(char.codePointAt(0) as number));\n }\n return intValue(BigInt(digits));\n }\n throw new PyTypeError(\n `int() argument must be a string, a bytes-like object or a real number, not '${pyTypeName(value)}'`,\n );\n}\n\n/**\n * Python's `int(value)` as a JS number, for values that are small in\n * practice (message UIDs); see {@link pyIntExact} for the exact form.\n */\nexport function pyInt(value: unknown): number {\n return Number(pyIntExact(value));\n}\n","// Shared pieces of the Python codec ports (py-codecs.ts, py-codecs-cjk.ts):\n// error classes, Python's decode error handlers and a fast text builder.\n\n/** Python's `LookupError` (unknown codec). */\nexport class LookupError extends Error {\n override name = 'LookupError';\n}\n\n/** Python's `UnicodeError`. */\nexport class UnicodeError extends Error {\n override name = 'UnicodeError';\n}\n\n/** Python's `UnicodeDecodeError`. */\nexport class UnicodeDecodeError extends UnicodeError {\n override name = 'UnicodeDecodeError';\n}\n\n/** Python's `UnicodeEncodeError`. */\nexport class UnicodeEncodeError extends UnicodeError {\n override name = 'UnicodeEncodeError';\n}\n\n/** Python's codec error handlers that the email code uses. */\nexport type CodecErrors =\n | 'strict'\n | 'replace'\n | 'ignore'\n | 'surrogateescape'\n | 'backslashreplace';\n\nexport const ASCII_LIMIT = 0x80;\nexport const LATIN1_LIMIT = 0x100;\nexport const REPLACEMENT = '�';\nconst REPLACEMENT_UNIT = 0xfffd;\n\n/** A decode call: the codec (Python module name), input and error handler. */\nexport interface ErrorContext {\n codec: string;\n bytes: Uint8Array;\n errors: CodecErrors;\n}\n\n// The name Python reports in UnicodeDecodeError messages.\nconst ERROR_NAMES: Readonly<Record<string, string>> = {\n ascii: 'ascii',\n latin_1: 'latin-1',\n utf_7: 'utf7',\n utf_8: 'utf-8',\n utf_8_sig: 'utf-8',\n utf_16: 'utf-16',\n utf_16_be: 'utf-16-be',\n utf_16_le: 'utf-16-le',\n utf_32: 'utf-32',\n utf_32_be: 'utf-32-be',\n utf_32_le: 'utf-32-le',\n raw_unicode_escape: 'rawunicodeescape',\n};\n\nfunction failDecode(\n context: ErrorContext,\n start: number,\n end: number,\n reason: string,\n): never {\n const name = ERROR_NAMES[context.codec] ?? context.codec;\n if (end - start === 1) {\n const byte = (context.bytes[start] ?? 0).toString(16).padStart(2, '0');\n throw new UnicodeDecodeError(\n `'${name}' codec can't decode byte 0x${byte} in position ${start}: ${reason}`,\n );\n }\n throw new UnicodeDecodeError(\n `'${name}' codec can't decode bytes in position ${start}-${end - 1}: ${reason}`,\n );\n}\n\n// CPython's surrogateescape handler escapes at most this many bytes per\n// call, stopping at the first ASCII byte; decoding resumes after them.\nconst SURROGATEESCAPE_MAX = 4;\n\n/**\n * Python's decode error handlers for the bytes `start..end`: appends the\n * replacement text to `output` and returns where decoding resumes, or\n * throws a {@link UnicodeDecodeError}.\n */\nexport function decodeError(\n output: TextBuilder,\n context: ErrorContext,\n start: number,\n end: number,\n reason: string,\n): number {\n const { bytes } = context;\n switch (context.errors) {\n case 'replace':\n output.unit(REPLACEMENT_UNIT);\n return end;\n case 'ignore':\n return end;\n case 'surrogateescape': {\n let resume = start;\n while (\n resume - start < SURROGATEESCAPE_MAX &&\n resume < end &&\n (bytes[resume] ?? 0) >= ASCII_LIMIT\n ) {\n resume += 1;\n }\n if (resume === start) {\n return failDecode(context, start, end, reason);\n }\n for (let index = start; index < resume; index += 1) {\n output.unit(0xdc00 + (bytes[index] ?? 0));\n }\n return resume;\n }\n case 'backslashreplace':\n for (let index = start; index < end; index += 1) {\n output.text(`\\\\x${(bytes[index] ?? 0).toString(16).padStart(2, '0')}`);\n }\n return end;\n default:\n return failDecode(context, start, end, reason);\n }\n}\n\nconst CHUNK_UNITS = 0x2000;\nconst ASCII_DECODER = new TextDecoder('utf-8', { ignoreBOM: true });\n\nfunction isAscii(bytes: Uint8Array): boolean {\n // Indexed loops: typed array iterators are slow on JavaScriptCore.\n for (let index = 0; index < bytes.length; index += 1) {\n if ((bytes[index] ?? 0) >= ASCII_LIMIT) {\n return false;\n }\n }\n return true;\n}\n\n// `fromCharCode.apply` takes a typed array as is; spreading it iterates\n// element by element and is several times slower on JavaScriptCore.\nfunction fromCharCodes(units: Uint16Array | Uint8Array): string {\n return Reflect.apply(String.fromCharCode, null, units) as string;\n}\n\n/** UTF-16 code units (or Latin-1 bytes) as a string, in chunks. */\nexport function unitsToString(units: Uint16Array | Uint8Array): string {\n if (units instanceof Uint8Array && isAscii(units)) {\n return ASCII_DECODER.decode(units);\n }\n if (units.length <= CHUNK_UNITS) {\n return fromCharCodes(units);\n }\n const parts: string[] = [];\n for (let start = 0; start < units.length; start += CHUNK_UNITS) {\n parts.push(fromCharCodes(units.subarray(start, start + CHUNK_UNITS)));\n }\n return parts.join('');\n}\n\nconst LITTLE_ENDIAN = new Uint8Array(Uint16Array.of(1).buffer)[0] === 1;\nconst UTF16LE_DECODER = new TextDecoder('utf-16le', { ignoreBOM: true });\n\n/**\n * Code units known to hold no surrogates (BMP characters only) as a\n * string: TextDecoder is much faster than `fromCharCode` for these on\n * JavaScriptCore. It would replace lone surrogates, hence the restriction.\n */\nexport function bmpUnitsToString(units: Uint16Array): string {\n return LITTLE_ENDIAN ? UTF16LE_DECODER.decode(units) : unitsToString(units);\n}\n\nconst BUILDER_UNITS = 0x10000;\n// Most decoded text is a short header word: the buffer starts small and\n// doubles, instead of costing every decode 128 KiB.\nconst BUILDER_INITIAL_UNITS = 0x100;\n// Shorter pieces are copied into the builder's buffer instead of being\n// kept as separate strings.\nconst SHORT_COPY = 256;\n\n/**\n * Collects decoded text as UTF-16 code units: one string concatenation per\n * 64 Ki units instead of one per character, which is what makes decoding\n * large attachments fast.\n */\nexport class TextBuilder {\n private buffer = new Uint16Array(BUILDER_INITIAL_UNITS);\n private length = 0;\n private readonly parts: string[] = [];\n\n /** Append one UTF-16 code unit. */\n unit(unit: number): void {\n if (this.length === this.buffer.length) {\n this.makeRoom();\n }\n this.buffer[this.length] = unit;\n this.length += 1;\n }\n\n /** Append a code point (two units above U+FFFF). */\n codePoint(code: number): void {\n if (code > 0xffff) {\n const offset = code - 0x10000;\n this.unit(0xd800 + (offset >> 10));\n this.unit(0xdc00 + (offset & 0x3ff));\n } else {\n this.unit(code);\n }\n }\n\n /** Append bytes as Latin-1 (or ASCII) characters. */\n latin1(bytes: Uint8Array): void {\n if (bytes.length <= SHORT_COPY) {\n for (let index = 0; index < bytes.length; index += 1) {\n this.unit(bytes[index] ?? 0);\n }\n return;\n }\n this.flush();\n this.parts.push(unitsToString(bytes));\n }\n\n /** Append a string. */\n text(text: string): void {\n if (text.length <= SHORT_COPY) {\n for (let index = 0; index < text.length; index += 1) {\n this.unit(text.charCodeAt(index));\n }\n return;\n }\n this.flush();\n this.parts.push(text);\n }\n\n private makeRoom(): void {\n if (this.buffer.length === BUILDER_UNITS) {\n this.flush();\n return;\n }\n const larger = new Uint16Array(this.buffer.length * 2);\n larger.set(this.buffer);\n this.buffer = larger;\n }\n\n private flush(): void {\n if (this.length > 0) {\n this.parts.push(unitsToString(this.buffer.subarray(0, this.length)));\n this.length = 0;\n }\n }\n\n toString(): string {\n this.flush();\n return this.parts.join('');\n }\n}\n","// Generated by tools/fixtures/generate_codecs.py from CPython 3.14.7. Do not edit.\n// Codec aliases and decoding data of Python's `encodings` package.\n\n/** Python codec module names that are text encodings. */\nexport const PY_TEXT_CODECS: readonly string[] = [\n 'ascii',\n 'big5',\n 'big5hkscs',\n 'charmap',\n 'cp037',\n 'cp1006',\n 'cp1026',\n 'cp1125',\n 'cp1140',\n 'cp1250',\n 'cp1251',\n 'cp1252',\n 'cp1253',\n 'cp1254',\n 'cp1255',\n 'cp1256',\n 'cp1257',\n 'cp1258',\n 'cp273',\n 'cp424',\n 'cp437',\n 'cp500',\n 'cp720',\n 'cp737',\n 'cp775',\n 'cp850',\n 'cp852',\n 'cp855',\n 'cp856',\n 'cp857',\n 'cp858',\n 'cp860',\n 'cp861',\n 'cp862',\n 'cp863',\n 'cp864',\n 'cp865',\n 'cp866',\n 'cp869',\n 'cp874',\n 'cp875',\n 'cp932',\n 'cp949',\n 'cp950',\n 'euc_jis_2004',\n 'euc_jisx0213',\n 'euc_jp',\n 'euc_kr',\n 'gb18030',\n 'gb2312',\n 'gbk',\n 'hp_roman8',\n 'hz',\n 'idna',\n 'iso2022_jp',\n 'iso2022_jp_1',\n 'iso2022_jp_2',\n 'iso2022_jp_2004',\n 'iso2022_jp_3',\n 'iso2022_jp_ext',\n 'iso2022_kr',\n 'iso8859_1',\n 'iso8859_10',\n 'iso8859_11',\n 'iso8859_13',\n 'iso8859_14',\n 'iso8859_15',\n 'iso8859_16',\n 'iso8859_2',\n 'iso8859_3',\n 'iso8859_4',\n 'iso8859_5',\n 'iso8859_6',\n 'iso8859_7',\n 'iso8859_8',\n 'iso8859_9',\n 'johab',\n 'koi8_r',\n 'koi8_t',\n 'koi8_u',\n 'kz1048',\n 'latin_1',\n 'mac_arabic',\n 'mac_croatian',\n 'mac_cyrillic',\n 'mac_farsi',\n 'mac_greek',\n 'mac_iceland',\n 'mac_latin2',\n 'mac_roman',\n 'mac_romanian',\n 'mac_turkish',\n 'palmos',\n 'ptcp154',\n 'punycode',\n 'raw_unicode_escape',\n 'shift_jis',\n 'shift_jis_2004',\n 'shift_jisx0213',\n 'tis_620',\n 'undefined',\n 'unicode_escape',\n 'utf_16',\n 'utf_16_be',\n 'utf_16_le',\n 'utf_32',\n 'utf_32_be',\n 'utf_32_le',\n 'utf_7',\n 'utf_8',\n 'utf_8_sig',\n];\n\n/** `encodings.aliases.aliases`, restricted to text encodings. */\nexport const PY_CODEC_ALIASES: Readonly<Record<string, string>> = {\n '037': 'cp037',\n '1026': 'cp1026',\n '1125': 'cp1125',\n '1140': 'cp1140',\n '1250': 'cp1250',\n '1251': 'cp1251',\n '1252': 'cp1252',\n '1253': 'cp1253',\n '1254': 'cp1254',\n '1255': 'cp1255',\n '1256': 'cp1256',\n '1257': 'cp1257',\n '1258': 'cp1258',\n '273': 'cp273',\n '424': 'cp424',\n '437': 'cp437',\n '500': 'cp500',\n '646': 'ascii',\n '775': 'cp775',\n '850': 'cp850',\n '852': 'cp852',\n '855': 'cp855',\n '857': 'cp857',\n '858': 'cp858',\n '860': 'cp860',\n '861': 'cp861',\n '862': 'cp862',\n '863': 'cp863',\n '864': 'cp864',\n '865': 'cp865',\n '866': 'cp866',\n '869': 'cp869',\n '874': 'cp874',\n '8859': 'latin_1',\n '932': 'cp932',\n '936': 'gbk',\n '949': 'cp949',\n '950': 'cp950',\n 'ansi_x3.4_1968': 'ascii',\n 'ansi_x3.4_1986': 'ascii',\n ansi_x3_4_1968: 'ascii',\n arabic: 'iso8859_6',\n asmo_708: 'iso8859_6',\n big5_hkscs: 'big5hkscs',\n big5_tw: 'big5',\n chinese: 'gb2312',\n cp00858: 'cp858',\n cp01140: 'cp1140',\n cp1051: 'hp_roman8',\n cp1361: 'johab',\n cp154: 'ptcp154',\n cp367: 'ascii',\n cp65001: 'utf_8',\n cp819: 'latin_1',\n cp866u: 'cp1125',\n cp936: 'gbk',\n cp_gr: 'cp869',\n cp_is: 'cp861',\n csHPRoman8: 'hp_roman8',\n csascii: 'ascii',\n csbig5: 'big5',\n cseuckr: 'euc_kr',\n csibm00858: 'cp858',\n csibm01140: 'cp1140',\n csibm037: 'cp037',\n csibm1026: 'cp1026',\n csibm273: 'cp273',\n csibm424: 'cp424',\n csibm500: 'cp500',\n csibm855: 'cp855',\n csibm857: 'cp857',\n csibm858: 'cp858',\n csibm860: 'cp860',\n csibm861: 'cp861',\n csibm863: 'cp863',\n csibm864: 'cp864',\n csibm865: 'cp865',\n csibm866: 'cp866',\n csibm869: 'cp869',\n csiso2022jp: 'iso2022_jp',\n csiso2022kr: 'iso2022_kr',\n csiso58gb231280: 'gb2312',\n csisolatin1: 'latin_1',\n csisolatin2: 'iso8859_2',\n csisolatin3: 'iso8859_3',\n csisolatin4: 'iso8859_4',\n csisolatin5: 'iso8859_9',\n csisolatin6: 'iso8859_10',\n csisolatinarabic: 'iso8859_6',\n csisolatincyrillic: 'iso8859_5',\n csisolatingreek: 'iso8859_7',\n csisolatinhebrew: 'iso8859_8',\n cskoi8r: 'koi8_r',\n cspc775baltic: 'cp775',\n cspc850multilingual: 'cp850',\n cspc862latinhebrew: 'cp862',\n cspc8codepage437: 'cp437',\n cspcp852: 'cp852',\n csptcp154: 'ptcp154',\n csshiftjis: 'shift_jis',\n cyrillic: 'iso8859_5',\n cyrillic_asian: 'ptcp154',\n ebcdic_cp_be: 'cp500',\n ebcdic_cp_ca: 'cp037',\n ebcdic_cp_ch: 'cp500',\n ebcdic_cp_he: 'cp424',\n ebcdic_cp_nl: 'cp037',\n ebcdic_cp_us: 'cp037',\n ebcdic_cp_wt: 'cp037',\n ebcdic_us_37_euro: 'cp1140',\n ecma_114: 'iso8859_6',\n ecma_118: 'iso8859_7',\n elot_928: 'iso8859_7',\n euc_cn: 'gb2312',\n euc_jis2004: 'euc_jis_2004',\n euccn: 'gb2312',\n eucgb2312_cn: 'gb2312',\n eucjis2004: 'euc_jis_2004',\n eucjisx0213: 'euc_jisx0213',\n eucjp: 'euc_jp',\n euckr: 'euc_kr',\n gb18030_2000: 'gb18030',\n gb2312_1980: 'gb2312',\n gb2312_80: 'gb2312',\n greek: 'iso8859_7',\n greek8: 'iso8859_7',\n hebrew: 'iso8859_8',\n hkscs: 'big5hkscs',\n hz_gb: 'hz',\n hz_gb_2312: 'hz',\n hzgb: 'hz',\n ibm00858: 'cp858',\n ibm01140: 'cp1140',\n ibm037: 'cp037',\n ibm039: 'cp037',\n ibm1026: 'cp1026',\n ibm1051: 'hp_roman8',\n ibm1125: 'cp1125',\n ibm1140: 'cp1140',\n ibm273: 'cp273',\n ibm367: 'ascii',\n ibm424: 'cp424',\n ibm437: 'cp437',\n ibm500: 'cp500',\n ibm775: 'cp775',\n ibm819: 'latin_1',\n ibm850: 'cp850',\n ibm852: 'cp852',\n ibm855: 'cp855',\n ibm857: 'cp857',\n ibm858: 'cp858',\n ibm860: 'cp860',\n ibm861: 'cp861',\n ibm862: 'cp862',\n ibm863: 'cp863',\n ibm864: 'cp864',\n ibm865: 'cp865',\n ibm866: 'cp866',\n ibm869: 'cp869',\n iso2022jp: 'iso2022_jp',\n iso2022jp_1: 'iso2022_jp_1',\n iso2022jp_2: 'iso2022_jp_2',\n iso2022jp_2004: 'iso2022_jp_2004',\n iso2022jp_3: 'iso2022_jp_3',\n iso2022jp_ext: 'iso2022_jp_ext',\n iso2022kr: 'iso2022_kr',\n iso646_us: 'ascii',\n iso8859: 'latin_1',\n iso8859_1: 'latin_1',\n iso_2022_jp: 'iso2022_jp',\n iso_2022_jp_1: 'iso2022_jp_1',\n iso_2022_jp_2: 'iso2022_jp_2',\n iso_2022_jp_2004: 'iso2022_jp_2004',\n iso_2022_jp_3: 'iso2022_jp_3',\n iso_2022_jp_ext: 'iso2022_jp_ext',\n iso_2022_kr: 'iso2022_kr',\n 'iso_646.irv_1991': 'ascii',\n iso_8859_1: 'latin_1',\n iso_8859_10: 'iso8859_10',\n iso_8859_10_1992: 'iso8859_10',\n iso_8859_11: 'iso8859_11',\n iso_8859_11_2001: 'iso8859_11',\n iso_8859_13: 'iso8859_13',\n iso_8859_14: 'iso8859_14',\n iso_8859_14_1998: 'iso8859_14',\n iso_8859_15: 'iso8859_15',\n iso_8859_16: 'iso8859_16',\n iso_8859_16_2001: 'iso8859_16',\n iso_8859_1_1987: 'latin_1',\n iso_8859_2: 'iso8859_2',\n iso_8859_2_1987: 'iso8859_2',\n iso_8859_3: 'iso8859_3',\n iso_8859_3_1988: 'iso8859_3',\n iso_8859_4: 'iso8859_4',\n iso_8859_4_1988: 'iso8859_4',\n iso_8859_5: 'iso8859_5',\n iso_8859_5_1988: 'iso8859_5',\n iso_8859_6: 'iso8859_6',\n iso_8859_6_1987: 'iso8859_6',\n iso_8859_7: 'iso8859_7',\n iso_8859_7_1987: 'iso8859_7',\n iso_8859_8: 'iso8859_8',\n iso_8859_8_1988: 'iso8859_8',\n iso_8859_8_e: 'iso8859_8',\n iso_8859_8_i: 'iso8859_8',\n iso_8859_9: 'iso8859_9',\n iso_8859_9_1989: 'iso8859_9',\n iso_celtic: 'iso8859_14',\n iso_ir_100: 'latin_1',\n iso_ir_101: 'iso8859_2',\n iso_ir_109: 'iso8859_3',\n iso_ir_110: 'iso8859_4',\n iso_ir_126: 'iso8859_7',\n iso_ir_127: 'iso8859_6',\n iso_ir_138: 'iso8859_8',\n iso_ir_144: 'iso8859_5',\n iso_ir_148: 'iso8859_9',\n iso_ir_157: 'iso8859_10',\n iso_ir_166: 'tis_620',\n iso_ir_199: 'iso8859_14',\n iso_ir_226: 'iso8859_16',\n iso_ir_58: 'gb2312',\n iso_ir_6: 'ascii',\n jisx0213: 'euc_jis_2004',\n korean: 'euc_kr',\n ks_c_5601: 'euc_kr',\n ks_c_5601_1987: 'euc_kr',\n ks_x_1001: 'euc_kr',\n ksc5601: 'euc_kr',\n ksx1001: 'euc_kr',\n kz_1048: 'kz1048',\n l1: 'latin_1',\n l10: 'iso8859_16',\n l2: 'iso8859_2',\n l3: 'iso8859_3',\n l4: 'iso8859_4',\n l5: 'iso8859_9',\n l6: 'iso8859_10',\n l7: 'iso8859_13',\n l8: 'iso8859_14',\n l9: 'iso8859_15',\n latin: 'latin_1',\n latin1: 'latin_1',\n latin10: 'iso8859_16',\n latin2: 'iso8859_2',\n latin3: 'iso8859_3',\n latin4: 'iso8859_4',\n latin5: 'iso8859_9',\n latin6: 'iso8859_10',\n latin7: 'iso8859_13',\n latin8: 'iso8859_14',\n latin9: 'iso8859_15',\n mac_centeuro: 'mac_latin2',\n maccentraleurope: 'mac_latin2',\n maccyrillic: 'mac_cyrillic',\n macgreek: 'mac_greek',\n maciceland: 'mac_iceland',\n macintosh: 'mac_roman',\n maclatin2: 'mac_latin2',\n macroman: 'mac_roman',\n macturkish: 'mac_turkish',\n ms1361: 'johab',\n ms874: 'cp874',\n ms932: 'cp932',\n ms936: 'gbk',\n ms949: 'cp949',\n ms950: 'cp950',\n ms_kanji: 'cp932',\n mskanji: 'cp932',\n pc_multilingual_850_euro: 'cp858',\n pt154: 'ptcp154',\n r8: 'hp_roman8',\n rk1048: 'kz1048',\n roman8: 'hp_roman8',\n ruscii: 'cp1125',\n s_jis: 'shift_jis',\n s_jis_2004: 'shift_jis_2004',\n s_jisx0213: 'shift_jisx0213',\n shiftjis: 'shift_jis',\n shiftjis2004: 'shift_jis_2004',\n shiftjisx0213: 'shift_jisx0213',\n sjis: 'shift_jis',\n sjis_2004: 'shift_jis_2004',\n sjisx0213: 'shift_jisx0213',\n strk1048_2002: 'kz1048',\n thai: 'iso8859_11',\n tis620: 'tis_620',\n tis_620_0: 'tis_620',\n tis_620_2529_0: 'tis_620',\n tis_620_2529_1: 'tis_620',\n u16: 'utf_16',\n u32: 'utf_32',\n u7: 'utf_7',\n u8: 'utf_8',\n u_jis: 'euc_jp',\n uhc: 'cp949',\n ujis: 'euc_jp',\n unicode_1_1_utf_7: 'utf_7',\n unicodebigunmarked: 'utf_16_be',\n unicodelittleunmarked: 'utf_16_le',\n us: 'ascii',\n us_ascii: 'ascii',\n utf: 'utf_8',\n utf16: 'utf_16',\n utf32: 'utf_32',\n utf7: 'utf_7',\n utf8: 'utf_8',\n utf8_ucs2: 'utf_8',\n utf8_ucs4: 'utf_8',\n utf_16be: 'utf_16_be',\n utf_16le: 'utf_16_le',\n utf_32be: 'utf_32_be',\n utf_32le: 'utf_32_le',\n windows_1250: 'cp1250',\n windows_1251: 'cp1251',\n windows_1252: 'cp1252',\n windows_1253: 'cp1253',\n windows_1254: 'cp1254',\n windows_1255: 'cp1255',\n windows_1256: 'cp1256',\n windows_1257: 'cp1257',\n windows_1258: 'cp1258',\n windows_31j: 'cp932',\n windows_874: 'cp874',\n x_mac_japanese: 'shift_jis',\n x_mac_korean: 'euc_kr',\n x_mac_simp_chinese: 'gb2312',\n x_mac_trad_chinese: 'big5',\n};\n\n/**\n * Decoding tables of the charmap codecs. U+FFFE marks a byte the codec\n * cannot decode; 128-character tables cover bytes 0x80-0xFF of\n * ASCII-compatible codecs.\n */\nexport const PY_CHARMAP_TABLES: Readonly<Record<string, string>> = {\n cp037:\n '\\u0000\\u0001\\u0002\\u0003\\u009c\\t\\u0086\\u007f\\u0097\\u008d\\u008e\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u009d\\u0085\\b\\u0087\\u0018\\u0019\\u0092\\u008f\\u001c\\u001d\\u001e\\u001f\\u0080\\u0081\\u0082\\u0083\\u0084\\n\\u0017\\u001b\\u0088\\u0089\\u008a\\u008b\\u008c\\u0005\\u0006\\u0007\\u0090\\u0091\\u0016\\u0093\\u0094\\u0095\\u0096\\u0004\\u0098\\u0099\\u009a\\u009b\\u0014\\u0015\\u009e\\u001a  âäàáãåçñ¢.<(+|&éêëèíîïìß!$*);¬-/ÂÄÀÁÃÅÇѦ,%_>?øÉÊËÈÍÎÏÌ`:#@\\'=\"Øabcdefghi«»ðýþ±°jklmnopqrªºæ¸Æ¤µ~stuvwxyz¡¿ÐÝÞ®^£¥·©§¶¼½¾[]¯¨´×{ABCDEFGHI\\u00adôöòóõ}JKLMNOPQR¹ûüùúÿ\\\\÷STUVWXYZ²ÔÖÒÓÕ0123456789³ÛÜÙÚ\\u009f',\n cp1006:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ۰۱۲۳۴۵۶۷۸۹،؛\\u00ad؟ﺁﺍﺎﺎﺏﺑﭖﭘﺓﺕﺗﭦﭨﺙﺛﺝﺟﭺﭼﺡﺣﺥﺧﺩﮄﺫﺭﮌﺯﮊﺱﺳﺵﺷﺹﺻﺽﺿﻁﻅﻉﻊﻋﻌﻍﻎﻏﻐﻑﻓﻕﻗﻙﻛﮒﮔﻝﻟﻠﻡﻣﮞﻥﻧﺅﻭﮦﮨﮩﮪﺀﺉﺊﺋﻱﻲﻳﮰﮮﹼﹽ',\n cp1026:\n '\\u0000\\u0001\\u0002\\u0003\\u009c\\t\\u0086\\u007f\\u0097\\u008d\\u008e\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u009d\\u0085\\b\\u0087\\u0018\\u0019\\u0092\\u008f\\u001c\\u001d\\u001e\\u001f\\u0080\\u0081\\u0082\\u0083\\u0084\\n\\u0017\\u001b\\u0088\\u0089\\u008a\\u008b\\u008c\\u0005\\u0006\\u0007\\u0090\\u0091\\u0016\\u0093\\u0094\\u0095\\u0096\\u0004\\u0098\\u0099\\u009a\\u009b\\u0014\\u0015\\u009e\\u001a  âäàáãå{ñÇ.<(+!&éêëèíîïìßĞİ*);^-/ÂÄÀÁÃÅ[Ñş,%_>?øÉÊËÈÍÎÏÌı:ÖŞ\\'=ÜØabcdefghi«»}`¦±°jklmnopqrªºæ¸Æ¤µöstuvwxyz¡¿]$@®¢£¥·©§¶¼½¾¬|¯¨´×çABCDEFGHI\\u00adô~òóõğJKLMNOPQR¹û\\\\ùúÿü÷STUVWXYZ²Ô#ÒÓÕ0123456789³Û\"ÙÚ\\u009f',\n cp1125:\n 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ ',\n cp1140:\n '\\u0000\\u0001\\u0002\\u0003\\u009c\\t\\u0086\\u007f\\u0097\\u008d\\u008e\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u009d\\u0085\\b\\u0087\\u0018\\u0019\\u0092\\u008f\\u001c\\u001d\\u001e\\u001f\\u0080\\u0081\\u0082\\u0083\\u0084\\n\\u0017\\u001b\\u0088\\u0089\\u008a\\u008b\\u008c\\u0005\\u0006\\u0007\\u0090\\u0091\\u0016\\u0093\\u0094\\u0095\\u0096\\u0004\\u0098\\u0099\\u009a\\u009b\\u0014\\u0015\\u009e\\u001a  âäàáãåçñ¢.<(+|&éêëèíîïìß!$*);¬-/ÂÄÀÁÃÅÇѦ,%_>?øÉÊËÈÍÎÏÌ`:#@\\'=\"Øabcdefghi«»ðýþ±°jklmnopqrªºæ¸Æ€µ~stuvwxyz¡¿ÐÝÞ®^£¥·©§¶¼½¾[]¯¨´×{ABCDEFGHI\\u00adôöòóõ}JKLMNOPQR¹ûüùúÿ\\\\÷STUVWXYZ²ÔÖÒÓÕ0123456789³ÛÜÙÚ\\u009f',\n cp1250:\n '€\\ufffe‚\\ufffe„…†‡\\ufffe‰Š‹ŚŤŽŹ\\ufffe‘’“”•–—\\ufffe™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬\\u00ad®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙',\n cp1251:\n 'ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—\\ufffe™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬\\u00ad®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя',\n cp1252:\n '€\\ufffe‚ƒ„…†‡ˆ‰Š‹Œ\\ufffeŽ\\ufffe\\ufffe‘’“”•–—˜™š›œ\\ufffežŸ ¡¢£¤¥¦§¨©ª«¬\\u00ad®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ',\n cp1253:\n '€\\ufffe‚ƒ„…†‡\\ufffe‰\\ufffe‹\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe‘’“”•–—\\ufffe™\\ufffe›\\ufffe\\ufffe\\ufffe\\ufffe ΅Ά£¤¥¦§¨©\\ufffe«¬\\u00ad®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ\\ufffeΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ\\ufffe',\n cp1254:\n '€\\ufffe‚ƒ„…†‡ˆ‰Š‹Œ\\ufffe\\ufffe\\ufffe\\ufffe‘’“”•–—˜™š›œ\\ufffe\\ufffeŸ ¡¢£¤¥¦§¨©ª«¬\\u00ad®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ',\n cp1255:\n '€\\ufffe‚ƒ„…†‡ˆ‰\\ufffe‹\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe‘’“”•–—˜™\\ufffe›\\ufffe\\ufffe\\ufffe\\ufffe ¡¢£₪¥¦§¨©×«¬\\u00ad®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹ\\ufffeֻּֽ־ֿ׀ׁׂ׃װױײ׳״\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffeאבגדהוזחטיךכלםמןנסעףפץצקרשת\\ufffe\\ufffe‎‏\\ufffe',\n cp1256:\n '€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬\\u00ad®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے',\n cp1257:\n '€\\ufffe‚\\ufffe„…†‡\\ufffe‰\\ufffe‹\\ufffe¨ˇ¸\\ufffe‘’“”•–—\\ufffe™\\ufffe›\\ufffe¯˛\\ufffe \\ufffe¢£¤\\ufffe¦§Ø©Ŗ«¬\\u00ad®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙',\n cp1258:\n '€\\ufffe‚ƒ„…†‡ˆ‰\\ufffe‹Œ\\ufffe\\ufffe\\ufffe\\ufffe‘’“”•–—˜™\\ufffe›œ\\ufffe\\ufffeŸ ¡¢£¤¥¦§¨©ª«¬\\u00ad®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ',\n cp273:\n '\\u0000\\u0001\\u0002\\u0003\\u009c\\t\\u0086\\u007f\\u0097\\u008d\\u008e\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u009d\\u0085\\b\\u0087\\u0018\\u0019\\u0092\\u008f\\u001c\\u001d\\u001e\\u001f\\u0080\\u0081\\u0082\\u0083\\u0084\\n\\u0017\\u001b\\u0088\\u0089\\u008a\\u008b\\u008c\\u0005\\u0006\\u0007\\u0090\\u0091\\u0016\\u0093\\u0094\\u0095\\u0096\\u0004\\u0098\\u0099\\u009a\\u009b\\u0014\\u0015\\u009e\\u001a  â{àáãåçñÄ.<(+!&éêëèíîïì~Ü$*);^-/Â[ÀÁÃÅÇÑö,%_>?øÉÊËÈÍÎÏÌ`:#§\\'=\"Øabcdefghi«»ðýþ±°jklmnopqrªºæ¸Æ¤µßstuvwxyz¡¿ÐÝÞ®¢£¥·©@¶¼½¾¬|‾¨´×äABCDEFGHI\\u00adô¦òóõüJKLMNOPQR¹û}ùúÿÖ÷STUVWXYZ²Ô\\\\ÒÓÕ0123456789³Û]ÙÚ\\u009f',\n cp424:\n '\\u0000\\u0001\\u0002\\u0003\\u009c\\t\\u0086\\u007f\\u0097\\u008d\\u008e\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u009d\\u0085\\b\\u0087\\u0018\\u0019\\u0092\\u008f\\u001c\\u001d\\u001e\\u001f\\u0080\\u0081\\u0082\\u0083\\u0084\\n\\u0017\\u001b\\u0088\\u0089\\u008a\\u008b\\u008c\\u0005\\u0006\\u0007\\u0090\\u0091\\u0016\\u0093\\u0094\\u0095\\u0096\\u0004\\u0098\\u0099\\u009a\\u009b\\u0014\\u0015\\u009e\\u001a אבגדהוזחט¢.<(+|&יךכלםמןנס!$*);¬-/עףפץצקרש¦,%_>?\\ufffeת\\ufffe\\ufffe \\ufffe\\ufffe\\ufffe‗`:#@\\'=\"\\ufffeabcdefghi«»\\ufffe\\ufffe\\ufffe±°jklmnopqr\\ufffe\\ufffe\\ufffe¸\\ufffe¤µ~stuvwxyz\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe®^£¥·©§¶¼½¾[]¯¨´×{ABCDEFGHI\\u00ad\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe}JKLMNOPQR¹\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\\\÷STUVWXYZ²\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe0123456789³\\ufffe\\ufffe\\ufffe\\ufffe\\u009f',\n cp437:\n 'ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ',\n cp500:\n '\\u0000\\u0001\\u0002\\u0003\\u009c\\t\\u0086\\u007f\\u0097\\u008d\\u008e\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u009d\\u0085\\b\\u0087\\u0018\\u0019\\u0092\\u008f\\u001c\\u001d\\u001e\\u001f\\u0080\\u0081\\u0082\\u0083\\u0084\\n\\u0017\\u001b\\u0088\\u0089\\u008a\\u008b\\u008c\\u0005\\u0006\\u0007\\u0090\\u0091\\u0016\\u0093\\u0094\\u0095\\u0096\\u0004\\u0098\\u0099\\u009a\\u009b\\u0014\\u0015\\u009e\\u001a  âäàáãåçñ[.<(+!&éêëèíîïìß]$*);^-/ÂÄÀÁÃÅÇѦ,%_>?øÉÊËÈÍÎÏÌ`:#@\\'=\"Øabcdefghi«»ðýþ±°jklmnopqrªºæ¸Æ¤µ~stuvwxyz¡¿ÐÝÞ®¢£¥·©§¶¼½¾¬|¯¨´×{ABCDEFGHI\\u00adôöòóõ}JKLMNOPQR¹ûüùúÿ\\\\÷STUVWXYZ²ÔÖÒÓÕ0123456789³ÛÜÙÚ\\u009f',\n cp720:\n '\\u0080\\u0081éâ\\u0084à\\u0086çêëèïî\\u008d\\u008e\\u008f\\u0090ّْô¤ـûùءآأؤ£إئابةتثجحخدذرزسشص«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ضطظعغفµقكلمنهوىي≡ًٌٍَُِ≈°∙·√ⁿ²■ ',\n cp737:\n 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ ',\n cp775:\n 'ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£Ø×¤ĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’\\u00ad±“¾¶§÷„°∙·¹³²■ ',\n cp850:\n 'ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´\\u00ad±‗¾¶§÷¸°¨·¹³²■ ',\n cp852:\n 'ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´\\u00ad˝˛ˇ˘§÷¸°¨˙űŘř■ ',\n cp855:\n 'ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№\\u00adыЫзЗшШэЭщЩчЧ§■ ',\n cp856:\n 'אבגדהוזחטיךכלםמןנסעףפץצקרשת\\ufffe£\\ufffe×\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe®¬½¼\\ufffe«»░▒▓│┤\\ufffe\\ufffe\\ufffe©╣║╗╝¢¥┐└┴┬├─┼\\ufffe\\ufffe╚╔╩╦╠═╬¤\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe┘┌█▄¦\\ufffe▀\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffeµ\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe¯´\\u00ad±‗¾¶§÷¸°¨·¹³²■ ',\n cp857:\n 'ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ\\ufffeÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ\\ufffe×ÚÛÙìÿ¯´\\u00ad±\\ufffe¾¶§÷¸°¨·¹³²■ ',\n cp858:\n 'ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´\\u00ad±‗¾¶§÷¸°¨·¹³²■ ',\n cp860:\n 'ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñѪº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ',\n cp861:\n 'ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ',\n cp862:\n 'אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ',\n cp863:\n 'ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ',\n cp864:\n '\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\"#$٪&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\u007f°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ\\ufffe\\ufffeﻻﻼ\\ufffe \\u00adﺂ£¤ﺄ\\ufffe\\ufffeﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■\\ufffe',\n cp865:\n 'ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ',\n cp866:\n 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ ',\n cp869:\n '\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffeΆ\\ufffe·¬¦‘’Έ―ΉΊΪΌ\\ufffe\\ufffeΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄\\u00ad±υφχ§ψ΅°¨ωϋΰώ■ ',\n cp874:\n '€\\ufffe\\ufffe\\ufffe\\ufffe…\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe‘’“”•–—\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู\\ufffe\\ufffe\\ufffe\\ufffe฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛\\ufffe\\ufffe\\ufffe\\ufffe',\n cp875:\n '\\u0000\\u0001\\u0002\\u0003\\u009c\\t\\u0086\\u007f\\u0097\\u008d\\u008e\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u009d\\u0085\\b\\u0087\\u0018\\u0019\\u0092\\u008f\\u001c\\u001d\\u001e\\u001f\\u0080\\u0081\\u0082\\u0083\\u0084\\n\\u0017\\u001b\\u0088\\u0089\\u008a\\u008b\\u008c\\u0005\\u0006\\u0007\\u0090\\u0091\\u0016\\u0093\\u0094\\u0095\\u0096\\u0004\\u0098\\u0099\\u009a\\u009b\\u0014\\u0015\\u009e\\u001a ΑΒΓΔΕΖΗΘΙ[.<(+!&ΚΛΜΝΞΟΠΡΣ]$*);^-/ΤΥΦΧΨΩΪΫ|,%_>?¨ΆΈΉ ΊΌΎΏ`:#@\\'=\"΅abcdefghiαβγδεζ°jklmnopqrηθικλμ´~stuvwxyzνξοπρσ£άέήϊίόύϋώςτυφχψ{ABCDEFGHI\\u00adωΐΰ‘―}JKLMNOPQR±½\\u001a·’¦\\\\\\u001aSTUVWXYZ²§\\u001a\\u001a«¬0123456789³©\\u001a\\u001a»\\u009f',\n hp_roman8:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±\\ufffe',\n iso8859_1:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ¡¢£¤¥¦§¨©ª«¬\\u00ad®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ',\n iso8859_10:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ĄĒĢĪĨͧĻĐŠŦŽ\\u00adŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ',\n iso8859_11:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู\\ufffe\\ufffe\\ufffe\\ufffe฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛\\ufffe\\ufffe\\ufffe\\ufffe',\n iso8859_13:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ”¢£¤„¦§Ø©Ŗ«¬\\u00ad®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’',\n iso8859_14:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ\\u00ad®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ',\n iso8859_15:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ¡¢£€¥Š§š©ª«¬\\u00ad®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ',\n iso8859_16:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ĄąŁ€„Чš©Ș«Ź\\u00adźŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ',\n iso8859_2:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f Ą˘Ł¤ĽŚ§¨ŠŞŤŹ\\u00adŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙',\n iso8859_3:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f Ħ˘£¤\\ufffeĤ§¨İŞĞĴ\\u00ad\\ufffeݰħ²³´µĥ·¸ışğĵ½\\ufffeżÀÁÂ\\ufffeÄĊĈÇÈÉÊËÌÍÎÏ\\ufffeÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ\\ufffeäċĉçèéêëìíîï\\ufffeñòóôġö÷ĝùúûüŭŝ˙',\n iso8859_4:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ĄĸŖ¤Ĩϧ¨ŠĒĢŦ\\u00adޝ°ą˛ŗ´ĩšēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖרŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙',\n iso8859_5:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ЁЂЃЄЅІЇЈЉЊЋЌ\\u00adЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ',\n iso8859_6:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f \\ufffe\\ufffe\\ufffe¤\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe،\\u00ad\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe؛\\ufffe\\ufffe\\ufffe؟\\ufffeءآأؤإئابةتثجحخدذرزسشصضطظعغ\\ufffe\\ufffe\\ufffe\\ufffe\\ufffeـفقكلمنهوىيًٌٍَُِّْ\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe',\n iso8859_7:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ‘’£€₯¦§¨©ͺ«¬\\u00ad\\ufffe―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ\\ufffeΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ\\ufffe',\n iso8859_8:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f \\ufffe¢£¤¥¦§¨©×«¬\\u00ad®¯°±²³´µ¶·¸¹÷»¼½¾\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe\\ufffe‗אבגדהוזחטיךכלםמןנסעףפץצקרשת\\ufffe\\ufffe‎‏\\ufffe',\n iso8859_9:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f ¡¢£¤¥¦§¨©ª«¬\\u00ad®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ',\n koi8_r:\n '─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ',\n koi8_t:\n 'қғ‚Ғ„…†‡\\ufffe‰ҳ‹ҲҷҶ\\ufffeҚ‘’“”•–—\\ufffe™\\ufffe›\\ufffe\\ufffe\\ufffe\\ufffe\\ufffeӯӮё¤ӣ¦§\\ufffe\\ufffe\\ufffe«¬\\u00ad®\\ufffe°±²Ё\\ufffeӢ¶·\\ufffe№\\ufffe»\\ufffe\\ufffe\\ufffe©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ',\n koi8_u:\n '─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ',\n kz1048:\n 'ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—\\ufffe™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬\\u00ad®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя',\n mac_arabic:\n 'Ä ÇÉÑÖÜáàâäں«çéèêëí…îïñó»ôö÷úùûü !\"#$٪&\\'()*+،-./٠١٢٣٤٥٦٧٨٩:؛<=>؟❊ءآأؤإئابةتثجحخدذرزسشصضطظعغ[\\\\]^_ـفقكلمنهوىيًٌٍَُِّْپٹچەڤگڈڑ{|}ژے',\n mac_croatian:\n 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈ƫȅ ÀÃÕŒœĐ—“”‘’÷◊\\uf8ff©⁄€‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ',\n mac_cyrillic:\n 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю€',\n mac_farsi:\n 'Ä ÇÉÑÖÜáàâäں«çéèêëí…îïñó»ôö÷úùûü !\"#$٪&\\'()*+،-./۰۱۲۳۴۵۶۷۸۹:؛<=>؟❊ءآأؤإئابةتثجحخدذرزسشصضطظعغ[\\\\]^_ـفقكلمنهوىيًٌٍَُِّْپٹچەڤگڈڑ{|}ژے',\n mac_greek:\n 'Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦€ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ\\u00ad',\n mac_iceland:\n 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ\\uf8ffÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ',\n mac_latin2:\n 'ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ',\n mac_roman:\n 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ\\uf8ffÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ',\n mac_romanian:\n 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂȘ∞±≤≥¥µ∂∑∏π∫ªºΩăș¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›Țț‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ\\uf8ffÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ',\n mac_turkish:\n 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ\\uf8ffÒÚÛÙ\\uf8a0ˆ˜¯˘˙˚¸˝˛ˇ',\n palmos:\n '€\\u0081‚ƒ„…†‡ˆ‰Š‹Œ♦♣♥♠‘’“”•–—˜™š›œ\\u009d\\u009eŸ ¡¢£¤¥¦§¨©ª«¬\\u00ad®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ',\n ptcp154:\n 'ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя',\n tis_620:\n '\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f\\ufffeกขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู\\ufffe\\ufffe\\ufffe\\ufffe฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛\\ufffe\\ufffe\\ufffe\\ufffe',\n};\n\n/** Decoding table of a CJK multibyte codec (see py-codecs.ts). */\nexport interface PyMultibyteTable {\n /** Codec whose table this one patches (`=` entries inherit from it). */\n readonly base?: string;\n /** Bytes 0x80-0xFF decoded alone; a space is a lead (or invalid) byte. */\n readonly single: string;\n /**\n * Two-byte sequences by lead byte (hex): one code point per trail byte\n * from 0x40, a space where Python fails, U+FFFF where the text is in\n * `multi`. Missing entries at the end are spaces (`=` with a base).\n */\n readonly rows: Readonly<Record<string, string>>;\n /** EUC-JP's JIS X 0212 sequences (0x8F, second byte, third byte). */\n readonly triples?: Readonly<Record<string, string>>;\n /** Sequences (hex) that decode to more than one character. */\n readonly multi?: Readonly<Record<string, string>>;\n}\n\n/** Python's CJK multibyte codecs (`_codecs_cn`, `_codecs_hk`, `_codecs_jp`...). */\nexport const PY_MULTIBYTE_TABLES: Readonly<Record<string, PyMultibyteTable>> = {\n big5: {\n rows: {\n a1: ' ,、。.•;:?!︰…‥﹐、﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚ ﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅‾ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢﹣﹤﹥﹦∼∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂♁☉↑↓←→↖↗↙↘∥∣/',\n a2: '\/\$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁▂▃▄▅▆▇█▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭ ╮╰╯═╞╪╡◢◣◥◤╱╲╳0123456789ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ〡〢〣〤〥〦〧〨〩十卄卅ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv',\n a3: 'wxyzΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏ ㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ˙ˉˊˇˋ',\n a4: '一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才 丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙',\n a5: '世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外 央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全',\n a6: '共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年 式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣',\n a7: '作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍 均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠',\n a8: '杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒 芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵',\n a9: '咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居 屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊',\n aa: '昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠 炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附',\n ab: '陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品 哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷',\n ac: '拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗 活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄',\n ad: '耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥 迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪',\n ae: '哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙 恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓',\n af: '浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷 砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃',\n b0: '虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡 陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀',\n b1: '娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽 情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺',\n b2: '毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶 瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼',\n b3: '莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途 部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠',\n b4: '婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍 插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋',\n b5: '溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘 窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁',\n b6: '詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑 間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼',\n b7: '媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業 楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督',\n b8: '睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫 腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊',\n b9: '辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴 飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇',\n ba: '愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢 滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬',\n bb: '罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤 說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜',\n bc: '劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂 慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃',\n bd: '瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯 翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞',\n be: '輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉 鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡',\n bf: '濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊 縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚',\n c0: '錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇 嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬',\n c1: '瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪 薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁',\n c2: '駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘 癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦',\n c3: '鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸 獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類',\n c4: '願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼 纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴',\n c5: '護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬 禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒',\n c6: '讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲 ヾゝゞ々ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんァアィイゥウェ',\n c7: 'エォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユ ョヨラリルレロヮワヰヱヲンヴヵヶДЕЁЖЗИЙКЛМУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя①②③④⑤⑥⑦⑧⑨⑩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽',\n c9: '乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕 氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋',\n ca: '汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘 吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇',\n cb: '杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓 芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢',\n cc: '坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋 怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲',\n cd: '泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺 矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏',\n ce: '哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛 峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺',\n cf: '柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂 洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀',\n d0: '穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪 苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱',\n d1: '唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧 恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤',\n d2: '毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸 牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐',\n d3: '笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢 荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐',\n d4: '酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅 唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏',\n d5: '崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟 捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉',\n d6: '淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏 痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟',\n d7: '耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷 蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪',\n d8: '釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷 堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔',\n d9: '惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒 晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞',\n da: '湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖 琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥',\n db: '罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳 菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺',\n dc: '軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈 隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆',\n dd: '媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤 搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼',\n de: '毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓 煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓',\n df: '稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯 腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤',\n e0: '觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿 遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠',\n e1: '凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠 寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉',\n e2: '榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊 漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓',\n e3: '禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞 耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻',\n e4: '裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍 銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘',\n e5: '噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉 憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒',\n e6: '澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙 獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟',\n e7: '膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢 蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧',\n e8: '踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓 銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮',\n e9: '噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺 憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸',\n ea: '澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙 瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘',\n eb: '蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠 諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌',\n ec: '錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕 魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎',\n ed: '檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶 瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞',\n ee: '蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞 謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜',\n ef: '鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰 鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶',\n f0: '璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒 臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧',\n f1: '蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪 鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰',\n f2: '徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛 礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕',\n f3: '譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦 鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲',\n f4: '嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩 禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿',\n f5: '鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛 鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥',\n f6: '蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺 騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚',\n f7: '糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊 驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾',\n f8: '讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏 齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚',\n f9: '纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊 龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘',\n },\n single:\n ' ',\n },\n big5hkscs: {\n base: 'big5',\n multi: {\n '8862': 'Ê̄',\n '8864': 'Ê̌',\n '88a3': 'ê̄',\n '88a5': 'ê̌',\n },\n rows: {\n '87': '䏰䰲䘃䖦䕸𧉧䵷䖳𧲱䳢𧳅㮕䜶䝄䱇䱀𤊿𣘗𧍒𦺋𧃒䱗𪍑䝏䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡晍囻=綕夝𨮹㷴霴𧯯寛𡵞媤㘥𩺰嫑宷峼杮薓𩥅瑡璝',\n '88': '㇀㇁㇂㇃㇄𠄌㇅𠃑𠃍㇆㇇𠃋𡿨㇈𠃊㇉㇊㇋㇌𠄎㇍㇎ĀÁǍÀĒÉĚÈŌÓǑÒ\\uffffẾ\\uffffỀÊāáǎàɑēéěèīíǐìōóǒòūúǔùǖǘǚ==================================ǜü\\uffffế\\uffffềêɡ⏚⏛',\n '89': '𪎩𡅅=攊==丽滝鵎釟==𧜵撑会伨侨兖兴农凤务动医华发变团声处备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织经统缆缷艺苏药视设询车轧轮==================================琑糼緍楆竉刧====醌碸酞肼=贋胶𠧧==肟黇䳍鷉鸌䰾𩷶𧀎鸊𪄳㗁=溚舾甙=䤑马骏龙禇𨑬𡷊𠗐𢫦两亁亀亇亿仫伷㑌侽㹈倃傈㑽㒓㒥円夅凛凼刅争剹劐匧㗇厩㕑厰㕓参吣㕭㕲㚁咓咣咴咹哐哯唘唣唨㖘唿㖥㖿嗗㗅',\n '8a': '𧶄唥=𠱂𠴕𥄫喐𢳆㧬𠍁蹆𤶸𩓥䁓𨂾睺𢰸㨴䟕𨅝𦧲𤷪擝𠵼𠾴𠳕𡃴撍蹾𠺖𠰋𠽤𢲩𨉖𤓓=𠵆𩩍𨃩䟴𤺧𢳂骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕=䏙𦂥撴哣𢵌𢯊𡁷㧻𡁯==================================𦛚𦜖𧦠擪𥁒𠱃蹨𢆡𨭌𠜱=䠋𠆩㿺塳𢶍=𤗈𠓼𦂗𠽌𠶖啹䂻䎺=䪴𢩦𡂝膪飵𠶜捹㧾𢝵跀嚡摼㹃=𪘁𠸉𢫏𢳉=𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻==𧕴𢺋𢈈𪙛𨳍𠹺𠰴𦠜羓𡃏𢠃𢤹㗻𥇣𠺌𠾍𠺪㾓𠼰𠵇𡅏𠹌=𠺫𠮩𠵈𡃀𡄽㿹𢚖搲𠾭',\n '8b': '𣏴𧘹𢯎𠵾𠵿𢱑𢱕㨘𠺘𡃇𠼮𪘲𦭐𨳒𨶙𨳊閪哌苄喹=𩻃鰦骶𧝞𢷮煀腭胬尜𦕲脴㞗卟𨂽醶𠻺𠸏𠹷𠻻㗝𤷫㘉𠳖嚯𢞵𡃉𠸐𠹸𡁸𡅈𨈇𡑕𠹹𤹐𢶤婔𡀝𡀞𡃵𡃶垜𠸑==================================𧚔𨋍𠾵𠹻𥅾㜃𠾶𡆀𥋘𪊽𤧚𡠺𤅷𨉼墙剨㘚𥜽箲孨䠀䬬鼧䧧鰟鮍𥭴𣄽嗻㗲嚉丨夂𡯁屮靑𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺灬爫丬犭𤣩罒礻糹罓𦉪㓁=𦍋耂肀𦘒𦥑卝衤见𧢲讠贝钅镸长门𨸏韦页风飞饣𩠐鱼鸟黄歯龜丷𠂇阝户钢',\n '8c': '倻淾𩱳龦㷉袏𤅎灷峵䬠𥇍㕙𥴰愢𨨲辧釶熑朙玺𣊁𪄇㲋𡦀䬐磤琂冮𨜏䀉橣𪊺䈣蘏𠩯稪𩥇𨫪靕灍匤𢁾鏴盙𨧣龧矝亣俰傼丯众龨吴綋墒壐𡶶庒庙忂𢜒斋==================================𣏹椙橃𣱣泿=爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩袐龪躹龫迏蕟駠鈡龬𨶹𡐿䁱䊢娚===顨杫䉶圽=藖𤥻芿𧄍䲁𦵴嵻𦬕𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶=峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤𦱁諌侴𠈹妿腬顖𩣺弻',\n '8d': '𠮟=𢇁𨥭䄂䚻𩁹㼇龳𪆵䃸㟖䛷𦱆䅼𨚲𧏿䕭㣔𥒚䕡䔛䶉䱻䵶䗪㿈𤬏㙡䓞䒽䇭崾嵈嵖㷼㠏嶤嶹㠠㠸幂庽弥徃㤈㤔㤿㥍惗愽峥㦉憷憹懏㦸戬抐拥挘㧸嚱==================================㨃揢揻搇摚㩋擀崕嘡龟㪗斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖㯝橥橴橱檂㯬檙㯲檫檵櫔櫶殁毁毪汵沪㳋洂洆洦涁㳯涤涱渕渘温溆𨧀溻滢滚齿滨滩漤漴㵆𣽁澁澾㵪㵵熷岙㶊瀬㶑灐灔灯灿炉𠌥䏁㗱𠻘',\n '8e': '𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑𦒍䇊竚竝竪䇯咲𥰁笋筕笩𥌎𥳾箢筯莜𥮴𦱿篐萡箒=𥴠㶭𥱥蒒篺=簵𥳁籄粃𤢂粦晽𤕸糉糇糦籴糳糵===================================繧䔝𦹄絝𦻖璍綉綫焵綳=𤁗𦀩緤㴓緵𡟹緥𨍭=𦄡𦅚繮纒䌫鑬縧罀罁罇礶𦋐駡羗𦍑羣𡙡𠁨䕜𣝦䔃𨌺翺𦒉=耈耝=耯𪂇𦳃耻耼聡𢜔䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩𠬍𦩒𣵾俹𡓽蓢荢𦬊𤦧𣔰𡝳𣷸芪椛芳䇛',\n '8f': '蕋苐茚𠸖𡞴㛁𣅽𣕚艻苢茘𣺋𦶣𦬅𦮗𣗎㶿茝嗬莅䔋𦶥莬=菓㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘=𦮖𦹷𦹃蓞=莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖==================================𨘥𨘻藁𧂈蘂𡖂𧃍䕫䕪蘨㙈𡢢号𧎚虾蝱𪃸蟮𢰧螱蟚蠏噡虬桖䘏衅衆𧗠𣶹𧗤衞袜䙛袴袵揁装睷𧜏覇覊==覧覼𨨥觧𧤤𧪽誜瞓釾誐𧩙竩𧬺𣾏䜓𧬸煼謌謟𥐰𥕥謿譌譍誩𤩺讐讛誯𡛟䘕衏貛𧵔𧶏貫㜥𧵓賖𧶘𧶽贒贃𡤐賛灜贑𤳉㻐',\n '90': '趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭𨍥𨐒辥錃𪊟𠩐辳䤪𨧞𨔽𣶻廸𣉢迹𪀔𨚼𨔁𢌥㦀𦻗逷𨔼𧪾遡𨕬𨘋邨𨜓郄𨛦邮=酧㫰醩釄粬𨤳𡺉鈎沟鉁鉢𥖹=𨫆𣲛𨬌𥗛==================================𠴱錬鍫𨫡𨯫炏嫃𨫢𨫥䥥鉄𨯬𨰹𨯿鍳鑛躼閅閦鐦閠濶䊹𢙺𨛘𡉼𣸮䧟氜陻隖䅬隣𦻕懚隶磵𨫠隽双䦡𦲸𠉴𦐐𩂯𩃥𤫑𡤕𣌊霱虂霶䨏䔽䖅𤫩灵孁霛=𩇕靗孊𩇫靟鐥僐𣂷𣂼鞉鞟鞱鞾韀韒韠𥑬韮琜𩐳=韵𩐝𧥺䫑頴頳顋顦㬎𧅵㵑𠘰𤅜',\n '91': '𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬鍸餹𤨩䭲𩡗𩤅駵騌騻騐驘𥜥㛄𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃𣁽魐魀𩴾婅𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈==================================鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴麐麕麞麢䴴麪麯𤍤黁㭠㧥㴝伲㞾𨰫鼂鼈䮖鐤𦶢鼗=鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸𤍈𤩑玞𨯚𡣺禟𨥾𨸶鍩鏳𨩄鋬鎁鏋𨥬𤒹爗㻫睲穃烐𤑳𤏸煾𡟯炣𡢾𣖙㻇𡢅𥐯𡟸㜢𡛻𡠹㛡𡝴𡣑𥽋㜣𡛀坛𤨥𡏾𡊨',\n '92': '𡏆𡒶蔃𣚦=葕𤦔𧅥𣸱𥕜𣻻𧁒䓴𣛮𩦝𦼦柹㜳㰕㷧塬𡤢栐䁗𣜿𤃡𤂋𤄏𦰡哋嚞𦚱嚒𠿟𠮨𠸍鏆𨬓鎜仸儫㠙𤐶亼𠑥𠍿佋侊𥙑婨𠆫𠏋㦙𠌊𠐔㐵伩𠋀𨺳𠉵諚𠈌亘==================================働儍侢伃𤨎𣺊佂倮偬傁俌俥偘僼====湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠䓝𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡=䙺熌𤎌𠰠𤦬𡃤槑𠸝=㻞璙琔瑖玘䮎𤪼𤂍叐㖄爏𤃉喴𠍅响𠯆圝鉝雴鍦埝垍坿㘾壋媙𨩆𡛺𡝯𡜐娬妸銏婾嫏娒𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃',\n '93': '媁𨯗𠐓鏠璌𡌃焅䥲鐈𨧻鎽㞠尞岞幞幈𡦖𡥼𣫮廍孏𡤃𡤄㜁𡢠㛝𡛾㛓脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠恾𢡠𢘫忛㺸𢖯𢖾𩂈𦽳懀𠀾𠁆𢘛憙憘恵𢲛𢴇𤛔𩅍==================================摱𤙥𢭪㨩𢬢𣑐𩣪𢹸挷𪑛撶挱揑𤧣𢵧护𢲡搻敫楲㯴𣂎𣊭𤦉𣊫唍𣋠𡣙𩐿曎𣊉𣆳㫠䆐𥖄𨬢𥖏𡛼𥕛𥐥磮𣄃𡠪𣈴㑤𣈏𣆂𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢𣏾瓐㮖枏𤘪梶栞㯄檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋',\n '94': '銉𨀞𨧜鑧涥漋𤧬=𣽿㶏渄𤀼娽渊塇洤硂焻𤌚𤉶烱牐犇犔𤞏𤜥兹𤪤𠗫瑺𣻸𣙟𤩊𤤗𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌琼鎇琷䒟𦷪䕑疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻==================================㷍𤩎㻿𤧅𤣳釺圲鍂𨫣𡡤僟𥈡𥇧睸𣈲眎眏睻𤚗𣞁㩞𤣰琸璛㺿𤪺𤫇䃈𤪖𦆮錇𥖁砞碍碈磒珐祙𧝁𥛣䄎=蒖禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺𡝮㖗啫㕰㚪𠇔𠰍竢婙𢛵𥪯𥪜娍𠉛磰娪𥯆竾䇹籝籭䈑𥮳𥺼𥺦糍𤧹𡞰粎籼粮檲緜縇緓罎𦉡',\n '95': '𦅜𧭈綗𥺂䉪𦭵𠤖柖𠁎𣗏埄𦐒𦏸𤥢翝笧𠠬𥫩𥵃笌𥸎駦虅驣樜𣐿㧢𤧷𦖭騟𦖠蒀𧄧𦳑䓪脷䐂胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧蘐𧈛媆䅿𡡀嬫𡢡嫤𡣘蚠蜨𣶏蠭𧐢娂==================================衮佅袇袿裦襥襍𥚃襔𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵䛏㟲訽訜𩑈彍鈫𤊄旔焩烄𡡅鵭貟賩𧷜妚矃姰䍮㛔踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻=啱䤆醻鐄𨩋䁢𨫼鐧𨰝𨰻蓥訫閙閧閗閖𨴴瑅㻂𤣿𤩂𤏪㻧𣈥随𨻧𨹦𨹥㻌𤧭𤩸𣿮琒瑫㻼靁𩂰',\n '96': '桇䨝𩂓𥟟=鍨𨦉𨰦𨬯𦎾銺嬑譩䤼珹𤈛鞛靱餸𠼦巁𨯅𤪲頟𩓚鋶𩗗釥䓀𨭐𤩧𨭤飜𨩅㼀鈪䤥萔餻饍𧬆㷽馛䭯馪驜𨭥𥣈檏騡嫾騯𩣱䮐𩥈馼䮽䮗鍽塲𡌂堢𤦸==================================𡓨硄𢜟𣶸棅㵽鑘㤧慐𢞁𢥫愇鱏鱓鱻鰵鰐魿鯏𩸭鮟𪇵𪃾鴡䲮𤄄鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰萠藮𦸀𣟗𦁤秢𣖜𣙀䤭𤧞㵢鏛銾鍈𠊿碹鉷鑍俤㑀遤𥕝砽硔碶硋𡝗𣇉𤥁㚚佲濚濙=瀞吔𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗=𡞵𨩉',\n '97': '愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖𠼝葲𦳀𡐓𤋺𢰦𤏁妔𣶷𦝁綨𦅛𦂤𤦹𤦋𨧺鋥珢㻩璴𨭣𡢟㻡𤪳櫘珳珻㻖𤨾𤪔𡟙𤩦𠎧𡐤𤧥瑈𤤖炥𤥶銄珦鍟𠓾錱𨫎𨨖鎆𨯧𥗕䤵𨪂煫==================================𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂𤩐𡡒䔮鐁㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹𨪁𡡢鍴㳍𠪴䪖㦊僴㵩㵌𡎜煵䋻𨈘渏𩃤䓫浗𧹏灧沯㳖𣿭𣸭渂漌㵯𠏵畑㚼㓈䚀㻚䡱姄鉮䤾轁𨰜𦯀堒埈㛖𡑒烾𤍢𤩱𢿣𡊰𢎽梹楧𡎘𣓥𧯴𣛟𨪃𣟖𣏺𤲟樚𣚭𦲷萾䓟䓎',\n '98': '𦴦𦵑𦲂𦿞漗𧄉茽𡜺菭𦲀𧁓𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎鎐暚𤊥婮娫𤊓樫𣻹𧜶𤑛𤋊焝𤉙𨧡侰𦴨峂𤓎𧹍𤎽樌𤉖𡌄炦焳𤏩㶥泟勇𤩏繥姫崯㷳彜𤩝𡟟綤萦==================================咅𣫺𣌀𠈔坾𠣕𠘙㿥𡾞𪊶瀃𩅛嵰玏糓𨩙𩐠俈翧狍猐𧫴猸猹𥛶獁獈㺩𧬘遬燵𤣲珡臶㻊県㻑沢国琙琞琟㻢㻰㻴㻺瓓㼎㽓畂畭畲疍㽼痈痜㿀癍㿗癴㿜発𤽜熈嘣覀塩䀝睃䀹条䁅㗛瞘䁪䁯属瞾矋売砘点砜䂨砹硇硑硦葈𥔵礳栃礲䄃',\n '99': '䄉禑禙辻稆込䅧窑䆲窼艹䇄竏竛䇏両筢筬筻簒簛䉠䉺类粜䊌粸䊔糭输烀𠳏総緔緐緽羮羴犟䎗耠耥笹耮耱联㷌垴炠肷胩䏭脌猪脎脒畠脔䐁㬹腖腙腚==================================䐓堺腼膄䐥膓䐭膥埯臁臤艔䒏芦艶苊苘苿䒰荗险榊萅烵葤惣蒈䔄蒾蓡蓸蔐蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘坔蹱嗵躰䠷軎転軤軭軲辷迁迊迌逳駄䢭飠鈓䤞鈨鉘鉫銱銮銿',\n '9a': '鋣鋫鋳鋴鋽鍃鎄鎭䥅䥑麿鐗匁鐝鐭鐾䥪鑔鑹锭関䦧间阳䧥枠䨤靀䨵鞲韂噔䫤惨颹䬙飱塄餎餙冴餜餷饂饝饢䭰駅䮝騼鬏窃魩鮁鯝鯱鯴䱭鰠㝯𡯂鵉鰺==================================黾噐鶓鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀铁㞹𠗕𠘕𠙶𡚺块煳𠫂𠫍𠮿呪吆𠯋咞𠯻𠰻𠱓𠱥𠱼惧𠲍噺𠲵𠳝𠳭𠵯𠶲𠷈楕鰯螥𠸄𠸎𠻗𠾐𠼭𠹳尠𠾼帋𡁜𡁏𡁶朞𡁻𡂈𡂖㙇𡂿𡃓𡄯𡄻卤蒭𡋣𡍵𡌶讁𡕷𡘙𡟃𡟇乸炻𡠭𡥪',\n '9b': '𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕𢁅槩㛈𢉼𢏗𢏺𢜪𢡱𢥏苽𢥧𢦓𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌=𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳𣁦𣌟𣏞徱晈暿𧩹𣕧𣗳=𤦺=𣘚𣜖=𠍆墵朎==================================椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚䣐䪸𤄙𨪚𤋮𤌍𤀻𤌴𤎖𤩅𠗊凒𠘑妟𡺨㮾𣳿𤐄𤓖垈𤙴㦛𤜯𨗨𩧉㝢𢇃譞𨭎=𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆𠝹軚𥀬劏圿煱𥊙𥐙𣽊𤪧喼𥑆𥑮𦭒=㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿𥡝偦㓻𣏌=𥤃䝼𨥈𥪮𥮉𥰆𡶐垡煑=𦄂𧰒遖𦆲𤾚譢𦐂𦑊',\n '9c': '嵛𦯷=𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧晉=嚹𤔡𦛼乪𤤴陖涏𦲽㘘襷𦞙𦡮𦐑𦡞=𦣇筂𩃀𠨑𦤦=𦤹穅=𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙=𦮝䛐𦲤画补𦶮墶==================================㜜𢖍𧁋𧇍㱔𧊀𧊅銁𢅺𧊋錰𧋦𤧐氹钟𧑐𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹==䔿暶𩲭𩢤襃𧟌𧡘囖䃟𡘊㦡𣜯𨃨𡏅熭荦𧧝𩆨=䲷𧂯𨦫𧧽𧨊𧬋𧵦𤅺筃祾𨀉澵𪋟樃𨌘厢𦸇鎿栶靝𨅯𨀣𦦵𡏭𣈯𨁈嶅𨰰𨂃圕頣𨥉嶫𤦈斾槕叒𤪥𣾁㰑朶𨂐𨃴𨄮𡾡𨅏',\n '9d': '𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺揦𨥖砈鉕𨦸䏲𨧧䏟𨧨𨭆𨯔姸𨰉=𨿅𩃬=𩄐𩄼㷷𩅞𤫊运犏嚋𩓧𩗩𩖰𩖸𩜲𩣑𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达嗁==================================辺𢒰边𤪓䔉繿潖檱仪㓤𨬬𧢝㜺躀𡟵𨀤𨭬𨮙𧨾𦚯㷫𧙕𣲷𥘵𥥖亚𥺁𦉘嚿𠹭踎孭𣺈𤲞揞=𡟶𡡻攰嘭𥱊吚𥌑㷆𩶘䱽嘢嘞罉𥻘奵𣵀蝰东𠿪𠵉𣚺脗鵞贘瘻鱅癎瞹鍅吲腈苷嘥脲萘肽嗪祢噃吖𠺝㗎嘅嗱曱𨋢㘭甴嗰喺咗啲𠱁𠲖廐𥅈𠹶𢱢',\n '9e': '𠺢麫絚嗞𡁵抝靭咔賍燶酶揼掹揾啩𢭃鱲𢺳冚㓟𠶧冧呍唞唓癦踭𦢊疱肶蠄螆裇膶萜𡃁䓬猄𤜆宐茋𦢓噻𢛴𧴯𤆣𧵳𦻐𧊶酰𡇙鈈𣳼𪚩𠺬𠻹牦𡲢䝎𤿂𧿹𠿫䃺==================================鱝攟𢶠䣳𤟠𩵼𠿬𠸊=𧖣𠿭=𦁈𡆇熣纎鵐业丄㕷嬍沲卧㚬㧜卽㚥𤘘墚𤭮舭呋垪𥪕𠥹=㩒𢑥獴𩺬䴉鯭𣳾𩼰䱛𤾩𩖞𩿞葜𣶶𧊲𦞳𣜠挮紥𣻷𣸬㨪逈勌㹴㙺䗩𠒎癀嫰𠺶硺𧼮墧䂿噼鮋嵴癔𪐴麅䳡=㟻愙𣃚𤏲=噝𡊩垧𤥣𩸆刴𧂮㖭=鵼',\n '9f': '籖鬹埞𡝬屓擓𩓐𦌵𧅤蚭𠴨𦴢𤫢𠵱=凾𡼏嶎霃𡷑麁遌笟鬂峑箣扨挵髿篏鬪籾=籂粆鰕篼鬉=鰛𤤾齚啳寃俽麘俲剠㸆勑坧偖妷帒韈鶫轜呩鞴饀鞺匬愰==================================椬叚鰊鴂䰻陁榀傦畆𡝭駚剳=酙隁酜=酑𨺗捿𦴣櫊嘑醎畺抅𠏼獏籰𥰡𣳽=𤤙盖鮝个𠳔莾衂=届槀=坺刟巵从氱𠇲伹咜哚劚趂㗾=㗳=歒酼龥鮗頮颴骺麨麄煺笔=毺蠘罸=嘠𪙊蹷齓=跔蹏鸜踁抂𨍽踨蹵竓𤩷稾磘泪詧瘇',\n a0: '𨩚鼦泎蟖痃𪊲硓咢贌狢獱謭猂瓱賫𤪻蘯徺袠䒷=𡠻𦸅=詾𢔛=惽癧髗鵄鍮鮏蟵==賷猬霡鮰㗖犲䰇籑饊𦅙慙䰄麖慽=坟慯抦戹=㩜懢厪𣏵捤栂㗒==================================嵗𨯂迚𨸹=僙𡵆礆匲阸𠼻䁥=矾=糂𥼚糚稭聦聣絍甅瓲覔舚朌聢𧒆聛瓰脃眤覉𦟌畓𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦=覩=涹蟁𤀑瓧㷛煶悤憜㳑=恷=罱𨬭=惩䭾删㰘𣳇𥻗𧙖𥔱𡥄𡋾𩤃𦷜𧂭峁𦆭𨨏𣙷𠃮𦡆𤼎䕢嬟𦍌齐麦𦉫',\n c6: '=================================================================================================①②③④⑤⑥⑦⑧⑨⑩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ丶丿亅亠冂冖冫勹匸卩厶夊宀巛⼳广 彐彡攴 疒 辵 ¨ˆヽヾゝゞ 々〆〇ー[]✽ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじ',\n c7: 'すずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんァアィイ==================================ゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶАБВГДЕЁЖЗИЙК',\n c8: 'ЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя⇧↸↹㇏𠃌乚𠂊刂䒑==================================龰冈龱𧘇========================================¬¦'"㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌⺍⺕⺜⺝⺥⺧⺪⺬⺮⺶⺼⺾⻆⻊⻌⻍⻏⻖⻗⻞⻣===ʃɐɛɔɵœøŋʊɪ',\n f9: '======================================================================================================================================================碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯■',\n fa: '𠕇鋛𠗟𣿅蕌䊵珯况㙉𤥂𨧤鍄𡧛苮𣳈砼杄拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓=𠍾徤𠎀𠍇滛𠐟=儁㑺儎顬㝃萖𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂蝽𠖳𣲙冲冸==================================鴴凉减凑㳜凓𤪦决凢卂凭菍椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠蘍𦬓=𨫞啉滙𣾀𠥔𣿬匳=𠯢泋𡜦栛珕恊㺪㣌𡛨燝䒢卭却𨚫卾=𡖖𡘓矦厓𨪛厠厫厮玧𥝲㽙玜叁叅汉义埾叙㪫𠮏叠𣿫𢶣叶𠱷吓灹唫晗浛呭𦭓𠵴啝咏咤䞦𡜍𠻝㶴𠵍',\n fb: '𨦼𢚘啇䳭启琗喆喩=𡣗𤀺䕒𤐵暳𡂴嘷曍𣊊暤暭噍噏磱囱鞇叾圀囯园𨭦㘣𡉏坆𤆥汮炋坂㚱𦱾埦𡐖堃𡑔𤍣堦𤯵塜墪㕡壠壜𡈼壻寿坃𪅐𤉸鏓㖡够梦㛃湙==================================𡘾娤啓𡚒蔅姉𠵎𦲁𦴪𡟜姙𡟻𡞲𦶦浱𡠨𡛕姹𦹅媫婣㛦𤦩=㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広勐孶斈孼𧨎䀄䡝𠈄寕慠𡨴𥧌𠖥寳宝䴐尅𡭄尓珎尔𡲥𦬨屉䣝岅峩峯嶋𡷹𡸷崐崘嵆𡺤岺巗苼㠭𤤁𢁉𢅳芇㠶㯂帮檊=幺𤒼𠳓厦亷=厨𡝱帉廴𨒂',\n fc: '廹廻㢠廼栾鐛弍𠇁弢㫞䢮𡌺强𦢈𢏐=𢑱彣鞽𦹮彲鍀𨨶徧嶶㵟𥉐𡽪𧃸𢙨釖𠊞𨨩怱暅𡡷㥣㷇㘹垐𢞴祱㹀悞=悳𤦂𤦏𧩓璤僡媠慤萤慂慈𦻒憁凴𠙖憇宪𣾷==================================𢡟懓𨮝𩥝懐㤲𢦀𢣁怣慜攞掋𠄘担𡝰拕𢸍捬𤧟㨗搸揸𡎎𡟼=澊𢸶頔𤂌𥜝擡擥鑻㩦携㩗敍漖𤨨𤨣斅敭敟𣁾斵𤥀䬷旑䃘𡠩无旣忟𣐀昘𣇷𣇸晄𣆤𣆥晋𠹵晧𥇦晳=𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂=杧杢𤇍𩃭柗䓩栢湐鈼栁𣏦𦶠桝',\n fd: '𣑯槡樋𨫟楳棃𣗍椁椀㴲㨁𣘼㮀枬楡𨩊䋼椶榘㮡𠏉荣傐槹𣙙𢄪橅𣜃檝㯳枱櫈𩆜㰍欝𠤣惞欵歴𢟍溵𣫛𠎵𡥘㝀吡𣭚毡𣻼毜氷𢒋𤣱𦭑汚舦汹𣶼䓅𣶽𤆤𤤌𤤀==================================𣳉㛥㳫𠴲鮃𣇹𢒑羏样𦴥𦶡𦷫涖浜湼漄𤥿𤂅𦹲蔳𦽴凇==萮𨬡=𣸯瑓𣾂秌湏媑𣁋濸㜍澝𣸰滺𡒗𤀽䕕鏰潄潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀𦇝灋灾炧炁烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊=岜𤍥煏鍢𤋁焬𤑚𤨧𤨢熺𨯨炽爎',\n fe: '鑂爕夑鑃爤鍁𥘅爮牀𤥴梽牕牗㹕𣁄栍漽犂=猫𤠣𨠫䣭𨠄猨献珏玪𠰺𦨮珉瑉𤇢𡛧𤨤昣㛅𤦷𤦍𤧻珷琕椃𤨦琹𠗃㻗=𢢭瑠𨺲瑇珤瑶莹瑬㜰瑴鏱樬璂䥓𤪌==================================𤅟𤩹𨮏孆𨰃𡢞瓈𡦈甎=甞𨻙𡩋寗𨺬鎅畍畊畧畮𤾂㼄𤴓疎瑝疞疴瘂瘬癑癏癯癶𦏵皐臯㟸𦤑𦤎皡皥皷盌𦾟葢𥂝𥅽𡸜眞眦着撯𥈠睘𣊬瞯𨥤𨥨𡛁矴=𡍶𤨒棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗禝𧬹礼禩渪𧄦㺨秆𩄍秔',\n },\n single:\n '================================================================================================================================',\n },\n cp932: {\n base: 'shift_jis',\n rows: {\n '81': '================================~∥==========================-====================¢£=======================================================¬',\n '87': '①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ=㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡========㍻=〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪',\n ed: '纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏=塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱',\n ee: '犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙=蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑==ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"',\n f0: '\\ue000\\ue001\\ue002\\ue003\\ue004\\ue005\\ue006\\ue007\\ue008\\ue009\\ue00a\\ue00b\\ue00c\\ue00d\\ue00e\\ue00f\\ue010\\ue011\\ue012\\ue013\\ue014\\ue015\\ue016\\ue017\\ue018\\ue019\\ue01a\\ue01b\\ue01c\\ue01d\\ue01e\\ue01f\\ue020\\ue021\\ue022\\ue023\\ue024\\ue025\\ue026\\ue027\\ue028\\ue029\\ue02a\\ue02b\\ue02c\\ue02d\\ue02e\\ue02f\\ue030\\ue031\\ue032\\ue033\\ue034\\ue035\\ue036\\ue037\\ue038\\ue039\\ue03a\\ue03b\\ue03c\\ue03d\\ue03e=\\ue03f\\ue040\\ue041\\ue042\\ue043\\ue044\\ue045\\ue046\\ue047\\ue048\\ue049\\ue04a\\ue04b\\ue04c\\ue04d\\ue04e\\ue04f\\ue050\\ue051\\ue052\\ue053\\ue054\\ue055\\ue056\\ue057\\ue058\\ue059\\ue05a\\ue05b\\ue05c\\ue05d\\ue05e\\ue05f\\ue060\\ue061\\ue062\\ue063\\ue064\\ue065\\ue066\\ue067\\ue068\\ue069\\ue06a\\ue06b\\ue06c\\ue06d\\ue06e\\ue06f\\ue070\\ue071\\ue072\\ue073\\ue074\\ue075\\ue076\\ue077\\ue078\\ue079\\ue07a\\ue07b\\ue07c\\ue07d\\ue07e\\ue07f\\ue080\\ue081\\ue082\\ue083\\ue084\\ue085\\ue086\\ue087\\ue088\\ue089\\ue08a\\ue08b\\ue08c\\ue08d\\ue08e\\ue08f\\ue090\\ue091\\ue092\\ue093\\ue094\\ue095\\ue096\\ue097\\ue098\\ue099\\ue09a\\ue09b\\ue09c\\ue09d\\ue09e\\ue09f\\ue0a0\\ue0a1\\ue0a2\\ue0a3\\ue0a4\\ue0a5\\ue0a6\\ue0a7\\ue0a8\\ue0a9\\ue0aa\\ue0ab\\ue0ac\\ue0ad\\ue0ae\\ue0af\\ue0b0\\ue0b1\\ue0b2\\ue0b3\\ue0b4\\ue0b5\\ue0b6\\ue0b7\\ue0b8\\ue0b9\\ue0ba\\ue0bb',\n f1: '\\ue0bc\\ue0bd\\ue0be\\ue0bf\\ue0c0\\ue0c1\\ue0c2\\ue0c3\\ue0c4\\ue0c5\\ue0c6\\ue0c7\\ue0c8\\ue0c9\\ue0ca\\ue0cb\\ue0cc\\ue0cd\\ue0ce\\ue0cf\\ue0d0\\ue0d1\\ue0d2\\ue0d3\\ue0d4\\ue0d5\\ue0d6\\ue0d7\\ue0d8\\ue0d9\\ue0da\\ue0db\\ue0dc\\ue0dd\\ue0de\\ue0df\\ue0e0\\ue0e1\\ue0e2\\ue0e3\\ue0e4\\ue0e5\\ue0e6\\ue0e7\\ue0e8\\ue0e9\\ue0ea\\ue0eb\\ue0ec\\ue0ed\\ue0ee\\ue0ef\\ue0f0\\ue0f1\\ue0f2\\ue0f3\\ue0f4\\ue0f5\\ue0f6\\ue0f7\\ue0f8\\ue0f9\\ue0fa=\\ue0fb\\ue0fc\\ue0fd\\ue0fe\\ue0ff\\ue100\\ue101\\ue102\\ue103\\ue104\\ue105\\ue106\\ue107\\ue108\\ue109\\ue10a\\ue10b\\ue10c\\ue10d\\ue10e\\ue10f\\ue110\\ue111\\ue112\\ue113\\ue114\\ue115\\ue116\\ue117\\ue118\\ue119\\ue11a\\ue11b\\ue11c\\ue11d\\ue11e\\ue11f\\ue120\\ue121\\ue122\\ue123\\ue124\\ue125\\ue126\\ue127\\ue128\\ue129\\ue12a\\ue12b\\ue12c\\ue12d\\ue12e\\ue12f\\ue130\\ue131\\ue132\\ue133\\ue134\\ue135\\ue136\\ue137\\ue138\\ue139\\ue13a\\ue13b\\ue13c\\ue13d\\ue13e\\ue13f\\ue140\\ue141\\ue142\\ue143\\ue144\\ue145\\ue146\\ue147\\ue148\\ue149\\ue14a\\ue14b\\ue14c\\ue14d\\ue14e\\ue14f\\ue150\\ue151\\ue152\\ue153\\ue154\\ue155\\ue156\\ue157\\ue158\\ue159\\ue15a\\ue15b\\ue15c\\ue15d\\ue15e\\ue15f\\ue160\\ue161\\ue162\\ue163\\ue164\\ue165\\ue166\\ue167\\ue168\\ue169\\ue16a\\ue16b\\ue16c\\ue16d\\ue16e\\ue16f\\ue170\\ue171\\ue172\\ue173\\ue174\\ue175\\ue176\\ue177',\n f2: '\\ue178\\ue179\\ue17a\\ue17b\\ue17c\\ue17d\\ue17e\\ue17f\\ue180\\ue181\\ue182\\ue183\\ue184\\ue185\\ue186\\ue187\\ue188\\ue189\\ue18a\\ue18b\\ue18c\\ue18d\\ue18e\\ue18f\\ue190\\ue191\\ue192\\ue193\\ue194\\ue195\\ue196\\ue197\\ue198\\ue199\\ue19a\\ue19b\\ue19c\\ue19d\\ue19e\\ue19f\\ue1a0\\ue1a1\\ue1a2\\ue1a3\\ue1a4\\ue1a5\\ue1a6\\ue1a7\\ue1a8\\ue1a9\\ue1aa\\ue1ab\\ue1ac\\ue1ad\\ue1ae\\ue1af\\ue1b0\\ue1b1\\ue1b2\\ue1b3\\ue1b4\\ue1b5\\ue1b6=\\ue1b7\\ue1b8\\ue1b9\\ue1ba\\ue1bb\\ue1bc\\ue1bd\\ue1be\\ue1bf\\ue1c0\\ue1c1\\ue1c2\\ue1c3\\ue1c4\\ue1c5\\ue1c6\\ue1c7\\ue1c8\\ue1c9\\ue1ca\\ue1cb\\ue1cc\\ue1cd\\ue1ce\\ue1cf\\ue1d0\\ue1d1\\ue1d2\\ue1d3\\ue1d4\\ue1d5\\ue1d6\\ue1d7\\ue1d8\\ue1d9\\ue1da\\ue1db\\ue1dc\\ue1dd\\ue1de\\ue1df\\ue1e0\\ue1e1\\ue1e2\\ue1e3\\ue1e4\\ue1e5\\ue1e6\\ue1e7\\ue1e8\\ue1e9\\ue1ea\\ue1eb\\ue1ec\\ue1ed\\ue1ee\\ue1ef\\ue1f0\\ue1f1\\ue1f2\\ue1f3\\ue1f4\\ue1f5\\ue1f6\\ue1f7\\ue1f8\\ue1f9\\ue1fa\\ue1fb\\ue1fc\\ue1fd\\ue1fe\\ue1ff\\ue200\\ue201\\ue202\\ue203\\ue204\\ue205\\ue206\\ue207\\ue208\\ue209\\ue20a\\ue20b\\ue20c\\ue20d\\ue20e\\ue20f\\ue210\\ue211\\ue212\\ue213\\ue214\\ue215\\ue216\\ue217\\ue218\\ue219\\ue21a\\ue21b\\ue21c\\ue21d\\ue21e\\ue21f\\ue220\\ue221\\ue222\\ue223\\ue224\\ue225\\ue226\\ue227\\ue228\\ue229\\ue22a\\ue22b\\ue22c\\ue22d\\ue22e\\ue22f\\ue230\\ue231\\ue232\\ue233',\n f3: '\\ue234\\ue235\\ue236\\ue237\\ue238\\ue239\\ue23a\\ue23b\\ue23c\\ue23d\\ue23e\\ue23f\\ue240\\ue241\\ue242\\ue243\\ue244\\ue245\\ue246\\ue247\\ue248\\ue249\\ue24a\\ue24b\\ue24c\\ue24d\\ue24e\\ue24f\\ue250\\ue251\\ue252\\ue253\\ue254\\ue255\\ue256\\ue257\\ue258\\ue259\\ue25a\\ue25b\\ue25c\\ue25d\\ue25e\\ue25f\\ue260\\ue261\\ue262\\ue263\\ue264\\ue265\\ue266\\ue267\\ue268\\ue269\\ue26a\\ue26b\\ue26c\\ue26d\\ue26e\\ue26f\\ue270\\ue271\\ue272=\\ue273\\ue274\\ue275\\ue276\\ue277\\ue278\\ue279\\ue27a\\ue27b\\ue27c\\ue27d\\ue27e\\ue27f\\ue280\\ue281\\ue282\\ue283\\ue284\\ue285\\ue286\\ue287\\ue288\\ue289\\ue28a\\ue28b\\ue28c\\ue28d\\ue28e\\ue28f\\ue290\\ue291\\ue292\\ue293\\ue294\\ue295\\ue296\\ue297\\ue298\\ue299\\ue29a\\ue29b\\ue29c\\ue29d\\ue29e\\ue29f\\ue2a0\\ue2a1\\ue2a2\\ue2a3\\ue2a4\\ue2a5\\ue2a6\\ue2a7\\ue2a8\\ue2a9\\ue2aa\\ue2ab\\ue2ac\\ue2ad\\ue2ae\\ue2af\\ue2b0\\ue2b1\\ue2b2\\ue2b3\\ue2b4\\ue2b5\\ue2b6\\ue2b7\\ue2b8\\ue2b9\\ue2ba\\ue2bb\\ue2bc\\ue2bd\\ue2be\\ue2bf\\ue2c0\\ue2c1\\ue2c2\\ue2c3\\ue2c4\\ue2c5\\ue2c6\\ue2c7\\ue2c8\\ue2c9\\ue2ca\\ue2cb\\ue2cc\\ue2cd\\ue2ce\\ue2cf\\ue2d0\\ue2d1\\ue2d2\\ue2d3\\ue2d4\\ue2d5\\ue2d6\\ue2d7\\ue2d8\\ue2d9\\ue2da\\ue2db\\ue2dc\\ue2dd\\ue2de\\ue2df\\ue2e0\\ue2e1\\ue2e2\\ue2e3\\ue2e4\\ue2e5\\ue2e6\\ue2e7\\ue2e8\\ue2e9\\ue2ea\\ue2eb\\ue2ec\\ue2ed\\ue2ee\\ue2ef',\n f4: '\\ue2f0\\ue2f1\\ue2f2\\ue2f3\\ue2f4\\ue2f5\\ue2f6\\ue2f7\\ue2f8\\ue2f9\\ue2fa\\ue2fb\\ue2fc\\ue2fd\\ue2fe\\ue2ff\\ue300\\ue301\\ue302\\ue303\\ue304\\ue305\\ue306\\ue307\\ue308\\ue309\\ue30a\\ue30b\\ue30c\\ue30d\\ue30e\\ue30f\\ue310\\ue311\\ue312\\ue313\\ue314\\ue315\\ue316\\ue317\\ue318\\ue319\\ue31a\\ue31b\\ue31c\\ue31d\\ue31e\\ue31f\\ue320\\ue321\\ue322\\ue323\\ue324\\ue325\\ue326\\ue327\\ue328\\ue329\\ue32a\\ue32b\\ue32c\\ue32d\\ue32e=\\ue32f\\ue330\\ue331\\ue332\\ue333\\ue334\\ue335\\ue336\\ue337\\ue338\\ue339\\ue33a\\ue33b\\ue33c\\ue33d\\ue33e\\ue33f\\ue340\\ue341\\ue342\\ue343\\ue344\\ue345\\ue346\\ue347\\ue348\\ue349\\ue34a\\ue34b\\ue34c\\ue34d\\ue34e\\ue34f\\ue350\\ue351\\ue352\\ue353\\ue354\\ue355\\ue356\\ue357\\ue358\\ue359\\ue35a\\ue35b\\ue35c\\ue35d\\ue35e\\ue35f\\ue360\\ue361\\ue362\\ue363\\ue364\\ue365\\ue366\\ue367\\ue368\\ue369\\ue36a\\ue36b\\ue36c\\ue36d\\ue36e\\ue36f\\ue370\\ue371\\ue372\\ue373\\ue374\\ue375\\ue376\\ue377\\ue378\\ue379\\ue37a\\ue37b\\ue37c\\ue37d\\ue37e\\ue37f\\ue380\\ue381\\ue382\\ue383\\ue384\\ue385\\ue386\\ue387\\ue388\\ue389\\ue38a\\ue38b\\ue38c\\ue38d\\ue38e\\ue38f\\ue390\\ue391\\ue392\\ue393\\ue394\\ue395\\ue396\\ue397\\ue398\\ue399\\ue39a\\ue39b\\ue39c\\ue39d\\ue39e\\ue39f\\ue3a0\\ue3a1\\ue3a2\\ue3a3\\ue3a4\\ue3a5\\ue3a6\\ue3a7\\ue3a8\\ue3a9\\ue3aa\\ue3ab',\n f5: '\\ue3ac\\ue3ad\\ue3ae\\ue3af\\ue3b0\\ue3b1\\ue3b2\\ue3b3\\ue3b4\\ue3b5\\ue3b6\\ue3b7\\ue3b8\\ue3b9\\ue3ba\\ue3bb\\ue3bc\\ue3bd\\ue3be\\ue3bf\\ue3c0\\ue3c1\\ue3c2\\ue3c3\\ue3c4\\ue3c5\\ue3c6\\ue3c7\\ue3c8\\ue3c9\\ue3ca\\ue3cb\\ue3cc\\ue3cd\\ue3ce\\ue3cf\\ue3d0\\ue3d1\\ue3d2\\ue3d3\\ue3d4\\ue3d5\\ue3d6\\ue3d7\\ue3d8\\ue3d9\\ue3da\\ue3db\\ue3dc\\ue3dd\\ue3de\\ue3df\\ue3e0\\ue3e1\\ue3e2\\ue3e3\\ue3e4\\ue3e5\\ue3e6\\ue3e7\\ue3e8\\ue3e9\\ue3ea=\\ue3eb\\ue3ec\\ue3ed\\ue3ee\\ue3ef\\ue3f0\\ue3f1\\ue3f2\\ue3f3\\ue3f4\\ue3f5\\ue3f6\\ue3f7\\ue3f8\\ue3f9\\ue3fa\\ue3fb\\ue3fc\\ue3fd\\ue3fe\\ue3ff\\ue400\\ue401\\ue402\\ue403\\ue404\\ue405\\ue406\\ue407\\ue408\\ue409\\ue40a\\ue40b\\ue40c\\ue40d\\ue40e\\ue40f\\ue410\\ue411\\ue412\\ue413\\ue414\\ue415\\ue416\\ue417\\ue418\\ue419\\ue41a\\ue41b\\ue41c\\ue41d\\ue41e\\ue41f\\ue420\\ue421\\ue422\\ue423\\ue424\\ue425\\ue426\\ue427\\ue428\\ue429\\ue42a\\ue42b\\ue42c\\ue42d\\ue42e\\ue42f\\ue430\\ue431\\ue432\\ue433\\ue434\\ue435\\ue436\\ue437\\ue438\\ue439\\ue43a\\ue43b\\ue43c\\ue43d\\ue43e\\ue43f\\ue440\\ue441\\ue442\\ue443\\ue444\\ue445\\ue446\\ue447\\ue448\\ue449\\ue44a\\ue44b\\ue44c\\ue44d\\ue44e\\ue44f\\ue450\\ue451\\ue452\\ue453\\ue454\\ue455\\ue456\\ue457\\ue458\\ue459\\ue45a\\ue45b\\ue45c\\ue45d\\ue45e\\ue45f\\ue460\\ue461\\ue462\\ue463\\ue464\\ue465\\ue466\\ue467',\n f6: '\\ue468\\ue469\\ue46a\\ue46b\\ue46c\\ue46d\\ue46e\\ue46f\\ue470\\ue471\\ue472\\ue473\\ue474\\ue475\\ue476\\ue477\\ue478\\ue479\\ue47a\\ue47b\\ue47c\\ue47d\\ue47e\\ue47f\\ue480\\ue481\\ue482\\ue483\\ue484\\ue485\\ue486\\ue487\\ue488\\ue489\\ue48a\\ue48b\\ue48c\\ue48d\\ue48e\\ue48f\\ue490\\ue491\\ue492\\ue493\\ue494\\ue495\\ue496\\ue497\\ue498\\ue499\\ue49a\\ue49b\\ue49c\\ue49d\\ue49e\\ue49f\\ue4a0\\ue4a1\\ue4a2\\ue4a3\\ue4a4\\ue4a5\\ue4a6=\\ue4a7\\ue4a8\\ue4a9\\ue4aa\\ue4ab\\ue4ac\\ue4ad\\ue4ae\\ue4af\\ue4b0\\ue4b1\\ue4b2\\ue4b3\\ue4b4\\ue4b5\\ue4b6\\ue4b7\\ue4b8\\ue4b9\\ue4ba\\ue4bb\\ue4bc\\ue4bd\\ue4be\\ue4bf\\ue4c0\\ue4c1\\ue4c2\\ue4c3\\ue4c4\\ue4c5\\ue4c6\\ue4c7\\ue4c8\\ue4c9\\ue4ca\\ue4cb\\ue4cc\\ue4cd\\ue4ce\\ue4cf\\ue4d0\\ue4d1\\ue4d2\\ue4d3\\ue4d4\\ue4d5\\ue4d6\\ue4d7\\ue4d8\\ue4d9\\ue4da\\ue4db\\ue4dc\\ue4dd\\ue4de\\ue4df\\ue4e0\\ue4e1\\ue4e2\\ue4e3\\ue4e4\\ue4e5\\ue4e6\\ue4e7\\ue4e8\\ue4e9\\ue4ea\\ue4eb\\ue4ec\\ue4ed\\ue4ee\\ue4ef\\ue4f0\\ue4f1\\ue4f2\\ue4f3\\ue4f4\\ue4f5\\ue4f6\\ue4f7\\ue4f8\\ue4f9\\ue4fa\\ue4fb\\ue4fc\\ue4fd\\ue4fe\\ue4ff\\ue500\\ue501\\ue502\\ue503\\ue504\\ue505\\ue506\\ue507\\ue508\\ue509\\ue50a\\ue50b\\ue50c\\ue50d\\ue50e\\ue50f\\ue510\\ue511\\ue512\\ue513\\ue514\\ue515\\ue516\\ue517\\ue518\\ue519\\ue51a\\ue51b\\ue51c\\ue51d\\ue51e\\ue51f\\ue520\\ue521\\ue522\\ue523',\n f7: '\\ue524\\ue525\\ue526\\ue527\\ue528\\ue529\\ue52a\\ue52b\\ue52c\\ue52d\\ue52e\\ue52f\\ue530\\ue531\\ue532\\ue533\\ue534\\ue535\\ue536\\ue537\\ue538\\ue539\\ue53a\\ue53b\\ue53c\\ue53d\\ue53e\\ue53f\\ue540\\ue541\\ue542\\ue543\\ue544\\ue545\\ue546\\ue547\\ue548\\ue549\\ue54a\\ue54b\\ue54c\\ue54d\\ue54e\\ue54f\\ue550\\ue551\\ue552\\ue553\\ue554\\ue555\\ue556\\ue557\\ue558\\ue559\\ue55a\\ue55b\\ue55c\\ue55d\\ue55e\\ue55f\\ue560\\ue561\\ue562=\\ue563\\ue564\\ue565\\ue566\\ue567\\ue568\\ue569\\ue56a\\ue56b\\ue56c\\ue56d\\ue56e\\ue56f\\ue570\\ue571\\ue572\\ue573\\ue574\\ue575\\ue576\\ue577\\ue578\\ue579\\ue57a\\ue57b\\ue57c\\ue57d\\ue57e\\ue57f\\ue580\\ue581\\ue582\\ue583\\ue584\\ue585\\ue586\\ue587\\ue588\\ue589\\ue58a\\ue58b\\ue58c\\ue58d\\ue58e\\ue58f\\ue590\\ue591\\ue592\\ue593\\ue594\\ue595\\ue596\\ue597\\ue598\\ue599\\ue59a\\ue59b\\ue59c\\ue59d\\ue59e\\ue59f\\ue5a0\\ue5a1\\ue5a2\\ue5a3\\ue5a4\\ue5a5\\ue5a6\\ue5a7\\ue5a8\\ue5a9\\ue5aa\\ue5ab\\ue5ac\\ue5ad\\ue5ae\\ue5af\\ue5b0\\ue5b1\\ue5b2\\ue5b3\\ue5b4\\ue5b5\\ue5b6\\ue5b7\\ue5b8\\ue5b9\\ue5ba\\ue5bb\\ue5bc\\ue5bd\\ue5be\\ue5bf\\ue5c0\\ue5c1\\ue5c2\\ue5c3\\ue5c4\\ue5c5\\ue5c6\\ue5c7\\ue5c8\\ue5c9\\ue5ca\\ue5cb\\ue5cc\\ue5cd\\ue5ce\\ue5cf\\ue5d0\\ue5d1\\ue5d2\\ue5d3\\ue5d4\\ue5d5\\ue5d6\\ue5d7\\ue5d8\\ue5d9\\ue5da\\ue5db\\ue5dc\\ue5dd\\ue5de\\ue5df',\n f8: '\\ue5e0\\ue5e1\\ue5e2\\ue5e3\\ue5e4\\ue5e5\\ue5e6\\ue5e7\\ue5e8\\ue5e9\\ue5ea\\ue5eb\\ue5ec\\ue5ed\\ue5ee\\ue5ef\\ue5f0\\ue5f1\\ue5f2\\ue5f3\\ue5f4\\ue5f5\\ue5f6\\ue5f7\\ue5f8\\ue5f9\\ue5fa\\ue5fb\\ue5fc\\ue5fd\\ue5fe\\ue5ff\\ue600\\ue601\\ue602\\ue603\\ue604\\ue605\\ue606\\ue607\\ue608\\ue609\\ue60a\\ue60b\\ue60c\\ue60d\\ue60e\\ue60f\\ue610\\ue611\\ue612\\ue613\\ue614\\ue615\\ue616\\ue617\\ue618\\ue619\\ue61a\\ue61b\\ue61c\\ue61d\\ue61e=\\ue61f\\ue620\\ue621\\ue622\\ue623\\ue624\\ue625\\ue626\\ue627\\ue628\\ue629\\ue62a\\ue62b\\ue62c\\ue62d\\ue62e\\ue62f\\ue630\\ue631\\ue632\\ue633\\ue634\\ue635\\ue636\\ue637\\ue638\\ue639\\ue63a\\ue63b\\ue63c\\ue63d\\ue63e\\ue63f\\ue640\\ue641\\ue642\\ue643\\ue644\\ue645\\ue646\\ue647\\ue648\\ue649\\ue64a\\ue64b\\ue64c\\ue64d\\ue64e\\ue64f\\ue650\\ue651\\ue652\\ue653\\ue654\\ue655\\ue656\\ue657\\ue658\\ue659\\ue65a\\ue65b\\ue65c\\ue65d\\ue65e\\ue65f\\ue660\\ue661\\ue662\\ue663\\ue664\\ue665\\ue666\\ue667\\ue668\\ue669\\ue66a\\ue66b\\ue66c\\ue66d\\ue66e\\ue66f\\ue670\\ue671\\ue672\\ue673\\ue674\\ue675\\ue676\\ue677\\ue678\\ue679\\ue67a\\ue67b\\ue67c\\ue67d\\ue67e\\ue67f\\ue680\\ue681\\ue682\\ue683\\ue684\\ue685\\ue686\\ue687\\ue688\\ue689\\ue68a\\ue68b\\ue68c\\ue68d\\ue68e\\ue68f\\ue690\\ue691\\ue692\\ue693\\ue694\\ue695\\ue696\\ue697\\ue698\\ue699\\ue69a\\ue69b',\n f9: '\\ue69c\\ue69d\\ue69e\\ue69f\\ue6a0\\ue6a1\\ue6a2\\ue6a3\\ue6a4\\ue6a5\\ue6a6\\ue6a7\\ue6a8\\ue6a9\\ue6aa\\ue6ab\\ue6ac\\ue6ad\\ue6ae\\ue6af\\ue6b0\\ue6b1\\ue6b2\\ue6b3\\ue6b4\\ue6b5\\ue6b6\\ue6b7\\ue6b8\\ue6b9\\ue6ba\\ue6bb\\ue6bc\\ue6bd\\ue6be\\ue6bf\\ue6c0\\ue6c1\\ue6c2\\ue6c3\\ue6c4\\ue6c5\\ue6c6\\ue6c7\\ue6c8\\ue6c9\\ue6ca\\ue6cb\\ue6cc\\ue6cd\\ue6ce\\ue6cf\\ue6d0\\ue6d1\\ue6d2\\ue6d3\\ue6d4\\ue6d5\\ue6d6\\ue6d7\\ue6d8\\ue6d9\\ue6da=\\ue6db\\ue6dc\\ue6dd\\ue6de\\ue6df\\ue6e0\\ue6e1\\ue6e2\\ue6e3\\ue6e4\\ue6e5\\ue6e6\\ue6e7\\ue6e8\\ue6e9\\ue6ea\\ue6eb\\ue6ec\\ue6ed\\ue6ee\\ue6ef\\ue6f0\\ue6f1\\ue6f2\\ue6f3\\ue6f4\\ue6f5\\ue6f6\\ue6f7\\ue6f8\\ue6f9\\ue6fa\\ue6fb\\ue6fc\\ue6fd\\ue6fe\\ue6ff\\ue700\\ue701\\ue702\\ue703\\ue704\\ue705\\ue706\\ue707\\ue708\\ue709\\ue70a\\ue70b\\ue70c\\ue70d\\ue70e\\ue70f\\ue710\\ue711\\ue712\\ue713\\ue714\\ue715\\ue716\\ue717\\ue718\\ue719\\ue71a\\ue71b\\ue71c\\ue71d\\ue71e\\ue71f\\ue720\\ue721\\ue722\\ue723\\ue724\\ue725\\ue726\\ue727\\ue728\\ue729\\ue72a\\ue72b\\ue72c\\ue72d\\ue72e\\ue72f\\ue730\\ue731\\ue732\\ue733\\ue734\\ue735\\ue736\\ue737\\ue738\\ue739\\ue73a\\ue73b\\ue73c\\ue73d\\ue73e\\ue73f\\ue740\\ue741\\ue742\\ue743\\ue744\\ue745\\ue746\\ue747\\ue748\\ue749\\ue74a\\ue74b\\ue74c\\ue74d\\ue74e\\ue74f\\ue750\\ue751\\ue752\\ue753\\ue754\\ue755\\ue756\\ue757',\n fa: 'ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊=兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯',\n fb: '涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神=祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙',\n fc: '髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑',\n },\n single:\n '\\u0080===============================\\uf8f0============================================================================================\\uf8f1\\uf8f2\\uf8f3',\n },\n cp949: {\n base: 'euc_kr',\n rows: {\n '81': '= ====== ====== ',\n '82': '= ====== ====== ',\n '83': '= ====== ====== ',\n '84': '= ====== ====== ',\n '85': '= ====== ====== ',\n '86': '= ====== ====== ',\n '87': '= ====== ====== ',\n '88': '= ====== ====== ',\n '89': '= ====== ====== ',\n '8a': '= ====== ====== ',\n '8b': '= ====== ====== ',\n '8c': '= ====== ====== ',\n '8d': '= ====== ====== ',\n '8e': '= ====== ====== ',\n '8f': '= ====== ====== ',\n '90': '= ====== ====== ',\n '91': '= ====== ====== ',\n '92': '= ====== ====== ',\n '93': '= ====== ====== ',\n '94': '= ====== ====== ',\n '95': '= ====== ====== ',\n '96': '= ====== ====== ',\n '97': '= ====== ====== ',\n '98': '= ====== ====== ',\n '99': '= ====== ====== ',\n '9a': '= ====== ====== ',\n '9b': '= ====== ====== ',\n '9c': '= ====== ====== ',\n '9d': '= ====== ====== ',\n '9e': '= ====== ====== ',\n '9f': '= ====== ====== ',\n a0: '= ====== ====== ',\n a1: '= ====== ====== ',\n a2: '= ====== ====== ',\n a3: '= ====== ====== ',\n a4: '= ====== ====== ===================================================ㅤ',\n a5: '= ====== ====== ',\n a6: '= ====== ====== ',\n a7: '= ====== ====== ',\n a8: '= ====== ====== ',\n a9: '= ====== ====== ',\n aa: '= ====== ====== ',\n ab: '= ====== ====== ',\n ac: '= ====== ====== ',\n ad: '= ====== ====== ',\n ae: '= ====== ====== ',\n af: '= ====== ====== ',\n b0: '= ====== ====== ',\n b1: '= ====== ====== ',\n b2: '= ====== ====== ',\n b3: '= ====== ====== ',\n b4: '= ====== ====== ',\n b5: '= ====== ====== ',\n b6: '= ====== ====== ',\n b7: '= ====== ====== ',\n b8: '= ====== ====== ',\n b9: '= ====== ====== ',\n ba: '= ====== ====== ',\n bb: '= ====== ====== ',\n bc: '= ====== ====== ',\n bd: '= ====== ====== ',\n be: '= ====== ====== ',\n bf: '= ====== ====== ',\n c0: '= ====== ====== ',\n c1: '= ====== ====== ',\n c2: '= ====== ====== ',\n c3: '= ====== ====== ',\n c4: '= ====== ====== ',\n c5: '= ====== ====== ',\n c6: '= ====== ====== ',\n },\n single:\n '================================================================================================================================',\n },\n cp950: {\n base: 'big5',\n rows: {\n a1: '=====‧========﹑===================================================================================================================¯================================~==============⊕⊙',\n a2: '=∕﹨=¥=¢£',\n a3: '=================================================================================================================================================================€',\n f9: '======================================================================================================================================================碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓',\n },\n single:\n '================================================================================================================================',\n },\n euc_jp: {\n rows: {\n '8e': ' 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚',\n a1: '  、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\〜‖|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+−±×÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇',\n a2: ' ◆□■△▲▽▼※〒→←↑↓〓 ∈∋⊆⊇⊂⊃∪∩ ∧∨¬⇒⇔∀∃ ∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬ ʼn♯♭♪†‡¶ ◯',\n a3: ' 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz',\n a4: ' ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん',\n a5: ' ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ',\n a6: ' ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ αβγδεζηθικλμνξοπρστυφχψω',\n a7: ' АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ абвгдеёжзийклмнопрстуфхцчшщъыьэюя',\n a8: ' ─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂',\n b0: ' 亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭',\n b1: ' 院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応',\n b2: ' 押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改',\n b3: ' 魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱',\n b4: ' 粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄',\n b5: ' 機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京',\n b6: ' 供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈',\n b7: ' 掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲',\n b8: ' 検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向',\n b9: ' 后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込',\n ba: ' 此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷',\n bb: ' 察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時',\n bc: ' 次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周',\n bd: ' 宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償',\n be: ' 勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾',\n bf: ' 拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾',\n c0: ' 澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線',\n c1: ' 繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎',\n c2: ' 臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只',\n c3: ' 叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵',\n c4: ' 帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓',\n c5: ' 邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到',\n c6: ' 董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入',\n c7: ' 如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦',\n c8: ' 函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美',\n c9: ' 鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服',\n ca: ' 福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋',\n cb: ' 法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満',\n cc: ' 漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒',\n cd: ' 諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃',\n ce: ' 痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯',\n cf: ' 蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕',\n d0: ' 弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲',\n d1: ' 僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨',\n d2: ' 辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨',\n d3: ' 咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉',\n d4: ' 圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩',\n d5: ' 奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓',\n d6: ' 屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏',\n d7: ' 廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚',\n d8: ' 悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛',\n d9: ' 戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼',\n da: ' 據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼',\n db: ' 曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍',\n dc: ' 棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣',\n dd: ' 檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾',\n de: ' 沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌',\n df: ' 漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼',\n e0: ' 燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱',\n e1: ' 瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰',\n e2: ' 癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬',\n e3: ' 磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐',\n e4: ' 筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆',\n e5: ' 紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺',\n e6: ' 罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋',\n e7: ' 隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙',\n e8: ' 茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈',\n e9: ' 蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙',\n ea: ' 蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞',\n eb: ' 襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫',\n ec: ' 譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊',\n ed: ' 蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸',\n ee: ' 遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮',\n ef: ' 錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞',\n f0: ' 陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰',\n f1: ' 顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷',\n f2: ' 髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈',\n f3: ' 鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠',\n f4: ' 堯槇遙瑤凜熙',\n },\n single:\n ' ',\n triples: {\n a2: ' ˘ˇ¸˙˝¯˛˚~΄΅ ¡¦¿ ºª©®™¤№',\n a6: ' ΆΈΉΊΪ Ό ΎΫ Ώ άέήίϊΐόςύϋΰώ',\n a7: ' ЂЃЄЅІЇЈЉЊЋЌЎЏ ђѓєѕіїјљњћќўџ',\n a9: ' ÆĐ Ħ IJ ŁĿ ŊØŒ ŦÞ æđðħıijĸłŀʼnŋøœßŧþ',\n aa: ' ÁÀÄÂĂǍĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ ĜĞĢĠĤÍÌÏÎǏİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑŐŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴÝŸŶŹŽŻ',\n ab: ' áàäâăǎāąåãćĉčçċďéèëêěėēęǵĝğ ġĥíìïîǐ īįĩĵķĺľļńňņñóòöôǒőōõŕřŗśŝšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż',\n b0: ' 丂丄丅丌丒丟丣两丨丫丮丯丰丵乀乁乄乇乑乚乜乣乨乩乴乵乹乿亍亖亗亝亯亹仃仐仚仛仠仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾侁侂侄',\n b1: ' 侅侉侊侌侎侐侒侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀俁俅俆俈俉俋俌俍俏俒俜俠俢俰俲俼俽俿倀倁倄倇倊倌倎倐倓倗倘倛倜倝倞倢倧倮倰倲倳倵偀偁偂偅偆偊偌偎偑偒偓偗偙偟偠偢偣偦偧偪偭偰偱倻傁傃傄傆傊傎傏傐',\n b2: ' 傒傓傔傖傛傜傞傟傠傡傢傪傯傰傹傺傽僀僃僄僇僌僎僐僓僔僘僜僝僟僢僤僦僨僩僯僱僶僺僾儃儆儇儈儋儌儍儎僲儐儗儙儛儜儝儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊兏兓兕兗兘兟兤兦兾冃冄冋冎冘冝冡冣冭冸冺冼冾冿凂',\n b3: ' 凈减凑凒凓凕凘凞凢凥凮凲凳凴凷刁刂刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌勏勑勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋',\n b4: ' 匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾卂卌卋卙卛卡卣卥卬卭卲卹卾厃厇厈厎厓厔厙厝厡厤厪厫厯厲厴厵厷厸厺厽叀叅叏叒叓叕叚叝叞叠另叧叵吂吓吚吡吧吨吪启吱吴吵呃呄呇呍呏呞呢呤呦呧呩呫呭呮呴呿',\n b5: ' 咁咃咅咈咉咍咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊响哎哠哪哬哯哶哼哾哿唀唁唅唈唉唌唍唎唕唪唫唲唵唶唻唼唽啁啇啉啊啍啐啑啘啚啛啞啠啡啤啦啿喁喂喆喈喎喏喑喒喓喔喗喣喤喭喲喿嗁嗃嗆嗉嗋嗌嗎嗑嗒',\n b6: ' 嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊嘍嘎嘏嘐嘑嘒嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀噁噃噄噆噉噋噍噏噔噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚嚝嚞嚟嚦嚧嚨嚩嚫嚬嚭嚱嚳嚷嚾囅囉囊囋囏囐囌囍囙囜囝囟囡囤囥囦囧囨囱囫园',\n b7: ' 囶囷圁圂圇圊圌圑圕圚圛圝圠圢圣圤圥圩圪圬圮圯圳圴圽圾圿坅坆坌坍坒坢坥坧坨坫坭坮坯坰坱坳坴坵坷坹坺坻坼坾垁垃垌垔垗垙垚垜垝垞垟垡垕垧垨垩垬垸垽埇埈埌埏埕埝埞埤埦埧埩埭埰埵埶埸埽埾埿堃堄堈堉埡',\n b8: ' 堌堍堛堞堟堠堦堧堭堲堹堿塉塌塍塏塐塕塟塡塤塧塨塸塼塿墀墁墇墈墉墊墌墍墏墐墔墖墝墠墡墢墦墩墱墲壄墼壂壈壍壎壐壒壔壖壚壝壡壢壩壳夅夆夋夌夒夓夔虁夝夡夣夤夨夯夰夳夵夶夿奃奆奒奓奙奛奝奞奟奡奣奫奭',\n b9: ' 奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼姁姃姄姈姊姍姒姝姞姟姣姤姧姮姯姱姲姴姷娀娄娌娍娎娒娓娞娣娤娧娨娪娭娰婄婅婇婈婌婐婕婞婣婥婧婭婷婺婻婾媋媐媓媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿',\n ba: ' 嫄嫆嫈嫏嫚嫜嫠嫥嫪嫮嫵嫶嫽嬀嬁嬈嬗嬴嬙嬛嬝嬡嬥嬭嬸孁孋孌孒孖孞孨孮孯孼孽孾孿宁宄宆宊宎宐宑宓宔宖宨宩宬宭宯宱宲宷宺宼寀寁寍寏寖寗寘寙寚寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩',\n bb: ' 屭屰屴屵屺屻屼屽岇岈岊岏岒岝岟岠岢岣岦岪岲岴岵岺峉峋峒峝峗峮峱峲峴崁崆崍崒崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿嶁嶃嶈嶊嶒嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋巐巎巘巙巠巤',\n bc: ' 巩巸巹帀帇帍帒帔帕帘帟帠帮帨帲帵帾幋幐幉幑幖幘幛幜幞幨幪幫幬幭幮幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜弝弡弢弣弤弨弫弬弮弰弴弶弻弽弿彀彄彅彇彍彐彔彘彛彠彣彤彧',\n bd: ' 彯彲彴彵彸彺彽彾徉徍徏徖徜徝徢徧徫徤徬徯徰徱徸忄忇忈忉忋忐忑忒忓忔忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊怍怓怔怗怘怚怟怤怭怳怵恀恇恈恉恌恑恔恖恗恝恡恧恱恾恿悂悆悈悊悎悑悓悕悘悝悞悢悤悥您悰悱悷',\n be: ' 悻悾惂惄惈惉惊惋惎惏惔惕惙惛惝惞惢惥惲惵惸惼惽愂愇愊愌愐愑愒愓愔愖愗愙愜愞愢愪愫愰愱愵愶愷愹慁慅慆慉慞慠慬慲慸慻慼慿憀憁憃憄憋憍憒憓憗憘憜憝憟憠憥憨憪憭憸憹憼懀懁懂懎懏懕懜懝懞懟懡懢懧懩懥',\n bf: ' 懬懭懯戁戃戄戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌扐扑扒扔扖扚扜扤扭扯扳扺扽抍抎抏抐抦抨抳抶抷抺抾抿拄拎拕拖拚拪拲拴拼拽挃挄挊挋挍挐挓挖挘挩挪挭挵挶挹挼捁捂捃捄捆捊捋捎捒捓捔捘捛捥捦捬捭捱捴捵',\n c0: ' 捸捼捽捿掂掄掇掊掐掔掕掙掚掞掤掦掭掮掯掽揁揅揈揎揑揓揔揕揜揠揥揪揬揲揳揵揸揹搉搊搐搒搔搘搞搠搢搤搥搩搪搯搰搵搽搿摋摏摑摒摓摔摚摛摜摝摟摠摡摣摭摳摴摻摽撅撇撏撐撑撘撙撛撝撟撡撣撦撨撬撳撽撾撿',\n c1: ' 擄擉擊擋擌擎擐擑擕擗擤擥擩擪擭擰擵擷擻擿攁攄攈攉攊攏攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉敐敒敔敟敠敧敫敺敽斁斅斊斒斕斘斝斠斣斦斮斲斳斴斿旂旈旉旎旐旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉昍昑昒昕昖昝',\n c2: ' 昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌暍暐暒暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎曏曔曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾杅杇杈杌杔杕杝',\n c3: ' 杦杬杮杴杶杻极构枎枏枑枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙栝栟栨栧栬栭栯栰栱栳栻栿桄桅桊桌桕桗桘桛桫桮桯桰桱桲桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌棏',\n c4: ' 棐棑棓棖棙棜棝棥棨棪棫棬棭棰棱棵棶棻棼棽椆椉椊椐椑椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀榍榒榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀樁樃樏樑樕樚樝樠樤樨樰樲',\n c5: ' 樴樷樻樾樿橅橆橉橊橎橐橑橒橕橖橛橤橧橪橱橳橾檁檃檆檇檉檋檑檛檝檞檟檥檫檯檰檱檴檽檾檿櫆櫉櫈櫌櫐櫔櫕櫖櫜櫝櫤櫧櫬櫰櫱櫲櫼櫽欂欃欆欇欉欏欐欑欗欛欞欤欨欫欬欯欵欶欻欿歆歊歍歒歖歘歝歠歧歫歮歰歵歽',\n c6: ' 歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉氍氎氐氒氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋汍汏汒汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆泍泏泐泑泒泔泖',\n c7: ' 泚泜泠泧泩泫泬泮泲泴洄洇洊洎洏洑洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎淏淖淛淝淟淠淢淥淩淯淰淴淶淼渀渄渞渢渧渲渶渹渻渼湄湅湈湉湋湏湑湒湓湔湗湜湝湞',\n c8: ' 湢湣湨湳湻湽溍溓溙溠溧溭溮溱溳溻溿滀滁滃滇滈滊滍滎滏滫滭滮滹滻滽漄漈漊漌漍漖漘漚漛漦漩漪漯漰漳漶漻漼漭潏潑潒潓潗潙潚潝潞潡潢潨潬潽潾澃澇澈澋澌澍澐澒澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊',\n c9: ' 濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇瀍瀗瀠瀣瀯瀴瀷瀹瀼灃灄灈灉灊灋灔灕灝灞灎灤灥灬灮灵灶灾炁炅炆炔炕炖炗炘炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃焄焅焆焇焋焌焏焞焠焫焭焯焰焱焸煁煅煆煇煊煋煐煒煗煚煜煞煠',\n ca: ' 煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀燁燄燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚爝爟爤爫爯爴爸爹牁牂牃牅牎牏牐牓牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉犍犎犓犛犨犭犮犱犴犾狁狇狉狌狕狖狘狟狥狳狴狺狻',\n cb: ' 狾猂猄猅猇猋猍猒猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽獃獍獐獒獖獘獝獞獟獠獦獧獩獫獬獮獯獱獷獹獼玀玁玃玅玆玎玐玓玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿珅珆珉珋珌珏珒珓珖珙珝珡珣珦珧珩珴珵珷珹珺珻珽',\n cc: ' 珿琀琁琄琇琊琑琚琛琤琦琨琩琪琫琬琭琮琯琰琱琹瑀瑃瑄瑆瑇瑋瑍瑑瑒瑗瑝瑢瑦瑧瑨瑫瑭瑮瑱瑲璀璁璅璆璇璉璏璐璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌瓐瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆',\n cd: ' 甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎畐畒畗畞畟畡畯畱畹畺畻畼畽畾疁疅疐疒疓疕疙疜疢疤疴疺疿痀痁痄痆痌痎痏痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌瘏瘒瘓瘕瘖瘙瘛瘜瘝瘞瘣瘥瘦瘩瘭瘲瘳瘵瘸瘹',\n ce: ' 瘺瘼癊癀癁癃癄癅癉癋癕癙癟癤癥癭癮癯癱癴皁皅皌皍皕皛皜皝皟皠皢皣皤皥皦皧皨皪皭皽盁盅盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾睂睅睆睊睍睎睏睒睖睗睜睞睟睠睢',\n cf: ' 睤睧睪睬睰睲睳睴睺睽瞀瞄瞌瞍瞔瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉砍砎砑砝砡砢砣砭砮砰砵砷硃硄硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊碏碔碘碡碝碞碟碤碨碬碭碰碱碲碳',\n d0: ' 碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌礐礚礜礞礟礠礥礧礩礭礱礴礵礻礽礿祄祅祆祊祋祏祑祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊秏秔秖秚秝秞',\n d1: ' 秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜穝穟穠穥穧穪穭穵穸穾窀窂窅窆窊窋窐窑窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰',\n d2: ' 笱笴笽笿筀筁筇筎筕筠筤筦筩筪筭筯筲筳筷箄箉箎箐箑箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾簁簂簃簄簆簉簋簌簎簏簙簛簠簥簦簨簬簱簳簴簶簹簺籆籊籕籑籒籓籙籚籛籜籝籞',\n d3: ' 籡籣籧籩籭籮籰籲籹籼籽粆粇粏粔粞粠粦粰粶粷粺粻粼粿糄糇糈糉糍糏糓糔糕糗糙糚糝糦糩糫糵紃紇紈紉紏紑紒紓紖紝紞紣紦紪紭紱紼紽紾絀絁絇絈絍絑絓絗絙絚絜絝絥絧絪絰絸絺絻絿綁綂綃綅綆綈綋綌綍綑綖綗綝',\n d4: ' 綞綦綧綪綳綶綷綹緂緃緄緅緆緌緍緎緗緙縀緢緥緦緪緫緭緱緵緶緹緺縈縐縑縕縗縜縝縠縧縨縬縭縯縳縶縿繄繅繇繎繐繒繘繟繡繢繥繫繮繯繳繸繾纁纆纇纊纍纑纕纘纚纝纞缼缻缽缾缿罃罄罇罏罒罓罛罜罝罡罣罤罥罦罭',\n d5: ' 罱罽罾罿羀羋羍羏羐羑羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎翏翛翟翣翥翨翬翮翯翲翺翽翾翿耇耈耊耍耎耏耑耓耔耖耝耞耟耠耤耦耬耮耰耴耵耷耹耺耼耾聀聄聠聤聦聭聱聵肁肈肎肜肞肦肧肫肸肹胈胍胏胒胔胕胗胘胠胭胮',\n d6: ' 胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷膁膐膄膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎臏臕臗臛臝臞臡臤臫臬臰臱臲臵臶臸臹臽臿舀舃舏舓舔舙舚舝舡舢舨舲舴舺艃艄艅艆',\n d7: ' 艋艎艏艑艖艜艠艣艧艭艴艻艽艿芀芁芃芄芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆苐苕苚苠苢苤苨苪苭苯苶苷苽苾茀茁茇茈茊茋荔茛茝茞茟茡茢茬茭茮茰茳茷茺茼茽荂荃荄荇荍荎荑荕荖荗荰荸',\n d8: ' 荽荿莀莂莄莆莍莒莔莕莘莙莛莜莝莦莧莩莬莾莿菀菇菉菏菐菑菔菝荓菨菪菶菸菹菼萁萆萊萏萑萕萙莭萯萹葅葇葈葊葍葏葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽蒁蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌蓏蓓',\n d9: ' 蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎蔐蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆蕏蕐蕑蕒蕓蕖蕙蕜蕝蕞蕟蕠蕡蕢蕤蕫蕯蕹蕺蕻蕽蕿薁薅薆薉薋薌薏薓薘薝薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼',\n da: ' 藿蘀蘄蘅蘍蘎蘐蘑蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙虝虠虡虢虣虤虩虬虯虵虶虷虺蚍蚑蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀蛁蛃蛅蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎蜏蜐蜓蜔蜙蜞蜟蜡蜣',\n db: ' 蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾蝀蝃蝅蝍蝘蝝蝡蝤蝥蝯蝱蝲蝻螃螄螅螆螇螈螉螋螌螐螓螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿蟁蟈蟉蟊蟎蟕蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿蠁蠃蠆蠉蠊蠋蠐蠙蠒蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵',\n dc: ' 蠺蠼衁衃衅衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊裋裌裍裎裑裒裓裛裞裧裯裰裱裵裷褁褆褍褎褏褕褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉襏襒襗襚襛襜襡襢襣襫襮襰襳襵襺',\n dd: ' 襻襼襽覉覍覐覔覕覛覜覟覠覥覰覴覵覶覷覼觔觕觖觗觘觥觩觫觭觱觳觶觹觽觿訄訅訇訏訑訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉詍詎詓詖詗詘詜詝詡詥詧詵詶詷詹詺詻詾詿誀誃誆誋誏誐誒誖誗誙誟誧誩誮誯誳',\n de: ' 誶誷誻誾諃諆諈諉諊諑諓諔諕諗諝諟諬諰諴諵諶諼諿謅謆謋謑謜謞謟謊謭謰謷謼譂譃譄譅譆譈譒譓譔譙譍譞譣譭譶譸譹譼譾讁讄讅讋讍讏讔讕讜讞讟谸谹谽谾豅豇豉豋豏豑豓豔豗豘豛豝豙豣豤豦豨豩豭豳豵豶豻豾貆',\n df: ' 貇貋貐貒貓貙貛貜貤貹貺賅賆賉賋賏賖賕賙賝賡賨賬賯賰賲賵賷賸賾賿贁贃贉贒贗贛赥赩赬赮赿趂趄趈趍趐趑趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽踁踄踅踆踋踑踔踖踠踡踢',\n e0: ' 踣踦踧踱踳踶踷踸踹踽蹀蹁蹋蹍蹎蹏蹔蹛蹜蹝蹞蹡蹢蹩蹬蹭蹯蹰蹱蹹蹺蹻躂躃躉躐躒躕躚躛躝躞躢躧躩躭躮躳躵躺躻軀軁軃軄軇軏軑軔軜軨軮軰軱軷軹軺軭輀輂輇輈輏輐輖輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀轁',\n e1: ' 轃轇轏轑轒轓轔轕轘轝轞轥辝辠辡辤辥辦辵辶辸达迀迁迆迊迋迍运迒迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿遃遄遌遛遝遢遦遧遬遰遴遹邅邈邋邌邎邐邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃',\n e2: ' 郄郅郇郈郕郗郘郙郜郝郟郥郒郶郫郯郰郴郾郿鄀鄄鄅鄆鄈鄍鄐鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈酏酓酗酙酚酛酡酤酧酭酴酹酺酻醁醃醅醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿',\n e3: ' 釂釃釅釓釔釗釙釚釞釤釥釩釪釬釭釮釯釰釱釷釹釻釽鈀鈁鈄鈅鈆鈇鈉鈊鈌鈐鈒鈓鈖鈘鈜鈝鈣鈤鈥鈦鈨鈮鈯鈰鈳鈵鈶鈸鈹鈺鈼鈾鉀鉂鉃鉆鉇鉊鉍鉎鉏鉑鉘鉙鉜鉝鉠鉡鉥鉧鉨鉩鉮鉯鉰鉵鉶鉷鉸鉹鉻鉼鉽鉿銈銉銊銍銎銒銗',\n e4: ' 銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿鋀鋁鋂鋃鋅鋆鋇鋈鋋鋌鋍鋎鋐鋓鋕鋗鋘鋙鋜鋝鋟鋠鋡鋣鋥鋧鋨鋬鋮鋰鋹鋻鋿錀錂錈錍錑錔錕錜錝錞錟錡錤錥錧錩錪錳錴錶錷鍇鍈鍉鍐鍑鍒鍕鍗鍘鍚鍞鍤鍥鍧鍩鍪鍭鍯鍰鍱鍳鍴鍶',\n e5: ' 鍺鍽鍿鎀鎁鎂鎈鎊鎋鎍鎏鎒鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩鏁鏄鏅鏆鏇鏉鏊鏋鏌鏍鏓鏙鏜鏞鏟鏢鏦鏧鏹鏷鏸鏺鏻鏽鐁鐂鐄鐈鐉鐍鐎鐏鐕鐖鐗鐟鐮鐯鐱鐲鐳鐴鐻鐿鐽鑃鑅鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹',\n e6: ' 镾閄閈閌閍閎閝閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋闐闑闒闓闙闚闝闞闟闠闤闦阝阞阢阤阥阦阬阱阳阷阸阹阺阼阽陁陒陔陖陗陘陡陮陴陻陼陾陿隁隂隃隄隉隑隖隚隝隟隤隥隦隩隮隯隳隺雊雒嶲雘雚雝雞雟雩雯雱雺霂',\n e7: ' 霃霅霉霚霛霝霡霢霣霨霱霳靁靃靊靎靏靕靗靘靚靛靣靧靪靮靳靶靷靸靻靽靿鞀鞉鞕鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿韁韄韅韇韉韊韌韍韎韐韑韔韗韘韙韝韞韠韛韡韤韯韱韴韷韸韺頇頊頙頍頎頔頖頜頞頠頣頦',\n e8: ' 頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱餲餳餴餵餹餺餻餼饀饁饆饇饈饍饎饔饘饙饛饜饞饟饠馛馝馟馦馰馱馲馵',\n e9: ' 馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌騐騑騖騞騠騢騣騤騧騭騮騳騵騶騸驇驁驄驊驋驌驎驑驔驖驝骪骬骮骯骲骴骵骶骹骻骾骿髁髃髆髈髎髐髒髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿鬀鬁鬂鬃',\n ea: ' 鬄鬅鬈鬉鬋鬌鬍鬎鬐鬒鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪魫魬魭魮魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋鮍鮏鮐鮔鮚鮝鮞鮦鮧鮩鮬鮰鮱鮲鮷鮸鮻鮼鮾鮿鯁鯇鯈鯎鯐鯗鯘鯝鯟鯥鯧鯪鯫鯯鯳鯷鯸',\n eb: ' 鯹鯺鯽鯿鰀鰂鰋鰏鰑鰖鰘鰙鰚鰜鰞鰢鰣鰦鰧鰨鰩鰪鰱鰵鰶鰷鰽鱁鱃鱄鱅鱉鱊鱎鱏鱐鱓鱔鱖鱘鱛鱝鱞鱟鱣鱩鱪鱜鱫鱨鱮鱰鱲鱵鱷鱻鳦鳲鳷鳹鴋鴂鴑鴗鴘鴜鴝鴞鴯鴰鴲鴳鴴鴺鴼鵅鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻',\n ec: ' 鵼鵾鶃鶄鶆鶊鶍鶎鶒鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎鸐鸑鸒鸕鸖鸙鸜鸝鹺鹻鹼麀麂麃麄麅麇麎麏麖麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵',\n ed: ' 黸黿鼂鼃鼉鼏鼐鼑鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿齁齃齄齅齆齇齓齕齖齗齘齚齝齞齨齩齭齮齯齰齱齳齵齺齽龏龐龑龒龔龖龗龞龡龢龣龥',\n },\n },\n euc_kr: {\n rows: {\n a1: '  、。·‥…¨〃\\u00ad―∥\∼‘’“”〔〕〈〉《》「」『』【】±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬',\n a2: ' ⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®',\n a3: ' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[₩]^_`abcdefghijklmnopqrstuvwxyz{|} ̄',\n a4: ' ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ ㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ',\n a5: ' ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ αβγδεζηθικλμνξοπρστυφχψω',\n a6: ' ─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃╄╅╆╇╈╉╊',\n a7: ' ㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎀㎁㎂㎃㎄㎺㎻㎼㎽㎾㎿㎐㎑㎒㎓㎔Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆',\n a8: ' ÆÐªĦ IJ ĿŁØŒºÞŦŊ ㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮½⅓⅔¼¾⅛⅜⅝⅞',\n a9: ' æđðħıijĸŀłøœßþŧŋʼn㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂¹²³⁴ⁿ₁₂₃₄',\n aa: ' ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん',\n ab: ' ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ',\n ac: ' АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ абвгдеёжзийклмнопрстуфхцчшщъыьэюя',\n b0: ' 가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆',\n b1: ' 괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸',\n b2: ' 깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙',\n b3: ' 끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝',\n b4: ' 뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥',\n b5: ' 덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸',\n b6: ' 땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗',\n b7: ' 래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩',\n b8: ' 륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼',\n b9: ' 묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗',\n ba: ' 벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤',\n bb: ' 빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤',\n bc: ' 샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭',\n bd: ' 숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰',\n be: ' 쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎',\n bf: ' 에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨',\n c0: ' 웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊',\n c1: ' 점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓',\n c2: ' 징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻',\n c3: ' 찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층',\n c4: ' 치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼',\n c5: ' 큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜',\n c6: ' 퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁',\n c7: ' 퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠',\n c8: ' 혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝',\n ca: ' 伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕',\n cb: ' 匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢',\n cc: ' 瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械',\n cd: ' 棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜',\n ce: ' 科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾',\n cf: ' 區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴',\n d0: ' 鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣',\n d1: ' 朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩羅蘿螺裸邏那樂洛烙珞落諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉',\n d2: ' 納臘蠟衲囊娘廊朗浪狼郎乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧老蘆虜路露駑魯鷺碌祿綠菉錄鹿論壟弄濃籠聾膿農惱牢磊腦賂雷尿壘屢樓淚漏累縷陋嫩訥杻紐勒肋凜凌稜綾能菱陵尼泥匿溺多茶',\n d3: ' 丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃',\n d4: ' 棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅',\n d5: ' 蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣',\n d6: ' 煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼',\n d7: ' 遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬',\n d8: ' 立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅',\n d9: ' 蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文',\n da: ' 汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑',\n db: ' 發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖',\n dc: ' 碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦',\n dd: ' 孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥',\n de: ' 脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索',\n df: ' 傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署',\n e0: ' 胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬',\n e1: ' 聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁',\n e2: ' 戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧',\n e3: ' 嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁',\n e4: ' 沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額',\n e5: ' 櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬',\n e6: ' 旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒',\n e7: ' 簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳',\n e8: ' 烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療',\n e9: ' 窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓',\n ea: ' 運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜',\n eb: ' 濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼',\n ec: ' 議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄',\n ed: ' 立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長',\n ee: ' 障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱',\n ef: ' 煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖',\n f0: ' 靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫',\n f1: ' 踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只',\n f2: ' 咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯',\n f3: ' 鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策',\n f4: ' 責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢',\n f5: ' 椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃',\n f6: ' 贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託',\n f7: ' 鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑',\n f8: ' 阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃',\n f9: ' 品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航',\n fa: ' 行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型',\n fb: ' 形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵',\n fc: ' 禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆',\n fd: ' 爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰',\n },\n single:\n ' ',\n },\n gb18030: {\n base: 'gbk',\n rows: {\n a1: '\\ue4c6\\ue4c7\\ue4c8\\ue4c9\\ue4ca\\ue4cb\\ue4cc\\ue4cd\\ue4ce\\ue4cf\\ue4d0\\ue4d1\\ue4d2\\ue4d3\\ue4d4\\ue4d5\\ue4d6\\ue4d7\\ue4d8\\ue4d9\\ue4da\\ue4db\\ue4dc\\ue4dd\\ue4de\\ue4df\\ue4e0\\ue4e1\\ue4e2\\ue4e3\\ue4e4\\ue4e5\\ue4e6\\ue4e7\\ue4e8\\ue4e9\\ue4ea\\ue4eb\\ue4ec\\ue4ed\\ue4ee\\ue4ef\\ue4f0\\ue4f1\\ue4f2\\ue4f3\\ue4f4\\ue4f5\\ue4f6\\ue4f7\\ue4f8\\ue4f9\\ue4fa\\ue4fb\\ue4fc\\ue4fd\\ue4fe\\ue4ff\\ue500\\ue501\\ue502\\ue503\\ue504=\\ue505\\ue506\\ue507\\ue508\\ue509\\ue50a\\ue50b\\ue50c\\ue50d\\ue50e\\ue50f\\ue510\\ue511\\ue512\\ue513\\ue514\\ue515\\ue516\\ue517\\ue518\\ue519\\ue51a\\ue51b\\ue51c\\ue51d\\ue51e\\ue51f\\ue520\\ue521\\ue522\\ue523\\ue524\\ue525',\n a2: '\\ue526\\ue527\\ue528\\ue529\\ue52a\\ue52b\\ue52c\\ue52d\\ue52e\\ue52f\\ue530\\ue531\\ue532\\ue533\\ue534\\ue535\\ue536\\ue537\\ue538\\ue539\\ue53a\\ue53b\\ue53c\\ue53d\\ue53e\\ue53f\\ue540\\ue541\\ue542\\ue543\\ue544\\ue545\\ue546\\ue547\\ue548\\ue549\\ue54a\\ue54b\\ue54c\\ue54d\\ue54e\\ue54f\\ue550\\ue551\\ue552\\ue553\\ue554\\ue555\\ue556\\ue557\\ue558\\ue559\\ue55a\\ue55b\\ue55c\\ue55d\\ue55e\\ue55f\\ue560\\ue561\\ue562\\ue563\\ue564=\\ue565\\ue566\\ue567\\ue568\\ue569\\ue56a\\ue56b\\ue56c\\ue56d\\ue56e\\ue56f\\ue570\\ue571\\ue572\\ue573\\ue574\\ue575\\ue576\\ue577\\ue578\\ue579\\ue57a\\ue57b\\ue57c\\ue57d\\ue57e\\ue57f\\ue580\\ue581\\ue582\\ue583\\ue584\\ue585==========\\ue766\\ue767\\ue768\\ue769\\ue76a\\ue76b==================================================€\\ue76d==========\\ue76e\\ue76f============\\ue770\\ue771',\n a3: '\\ue586\\ue587\\ue588\\ue589\\ue58a\\ue58b\\ue58c\\ue58d\\ue58e\\ue58f\\ue590\\ue591\\ue592\\ue593\\ue594\\ue595\\ue596\\ue597\\ue598\\ue599\\ue59a\\ue59b\\ue59c\\ue59d\\ue59e\\ue59f\\ue5a0\\ue5a1\\ue5a2\\ue5a3\\ue5a4\\ue5a5\\ue5a6\\ue5a7\\ue5a8\\ue5a9\\ue5aa\\ue5ab\\ue5ac\\ue5ad\\ue5ae\\ue5af\\ue5b0\\ue5b1\\ue5b2\\ue5b3\\ue5b4\\ue5b5\\ue5b6\\ue5b7\\ue5b8\\ue5b9\\ue5ba\\ue5bb\\ue5bc\\ue5bd\\ue5be\\ue5bf\\ue5c0\\ue5c1\\ue5c2\\ue5c3\\ue5c4=\\ue5c5\\ue5c6\\ue5c7\\ue5c8\\ue5c9\\ue5ca\\ue5cb\\ue5cc\\ue5cd\\ue5ce\\ue5cf\\ue5d0\\ue5d1\\ue5d2\\ue5d3\\ue5d4\\ue5d5\\ue5d6\\ue5d7\\ue5d8\\ue5d9\\ue5da\\ue5db\\ue5dc\\ue5dd\\ue5de\\ue5df\\ue5e0\\ue5e1\\ue5e2\\ue5e3\\ue5e4\\ue5e5',\n a4: '\\ue5e6\\ue5e7\\ue5e8\\ue5e9\\ue5ea\\ue5eb\\ue5ec\\ue5ed\\ue5ee\\ue5ef\\ue5f0\\ue5f1\\ue5f2\\ue5f3\\ue5f4\\ue5f5\\ue5f6\\ue5f7\\ue5f8\\ue5f9\\ue5fa\\ue5fb\\ue5fc\\ue5fd\\ue5fe\\ue5ff\\ue600\\ue601\\ue602\\ue603\\ue604\\ue605\\ue606\\ue607\\ue608\\ue609\\ue60a\\ue60b\\ue60c\\ue60d\\ue60e\\ue60f\\ue610\\ue611\\ue612\\ue613\\ue614\\ue615\\ue616\\ue617\\ue618\\ue619\\ue61a\\ue61b\\ue61c\\ue61d\\ue61e\\ue61f\\ue620\\ue621\\ue622\\ue623\\ue624=\\ue625\\ue626\\ue627\\ue628\\ue629\\ue62a\\ue62b\\ue62c\\ue62d\\ue62e\\ue62f\\ue630\\ue631\\ue632\\ue633\\ue634\\ue635\\ue636\\ue637\\ue638\\ue639\\ue63a\\ue63b\\ue63c\\ue63d\\ue63e\\ue63f\\ue640\\ue641\\ue642\\ue643\\ue644\\ue645===================================================================================\\ue772\\ue773\\ue774\\ue775\\ue776\\ue777\\ue778\\ue779\\ue77a\\ue77b\\ue77c',\n a5: '\\ue646\\ue647\\ue648\\ue649\\ue64a\\ue64b\\ue64c\\ue64d\\ue64e\\ue64f\\ue650\\ue651\\ue652\\ue653\\ue654\\ue655\\ue656\\ue657\\ue658\\ue659\\ue65a\\ue65b\\ue65c\\ue65d\\ue65e\\ue65f\\ue660\\ue661\\ue662\\ue663\\ue664\\ue665\\ue666\\ue667\\ue668\\ue669\\ue66a\\ue66b\\ue66c\\ue66d\\ue66e\\ue66f\\ue670\\ue671\\ue672\\ue673\\ue674\\ue675\\ue676\\ue677\\ue678\\ue679\\ue67a\\ue67b\\ue67c\\ue67d\\ue67e\\ue67f\\ue680\\ue681\\ue682\\ue683\\ue684=\\ue685\\ue686\\ue687\\ue688\\ue689\\ue68a\\ue68b\\ue68c\\ue68d\\ue68e\\ue68f\\ue690\\ue691\\ue692\\ue693\\ue694\\ue695\\ue696\\ue697\\ue698\\ue699\\ue69a\\ue69b\\ue69c\\ue69d\\ue69e\\ue69f\\ue6a0\\ue6a1\\ue6a2\\ue6a3\\ue6a4\\ue6a5======================================================================================\\ue77d\\ue77e\\ue77f\\ue780\\ue781\\ue782\\ue783\\ue784',\n a6: '\\ue6a6\\ue6a7\\ue6a8\\ue6a9\\ue6aa\\ue6ab\\ue6ac\\ue6ad\\ue6ae\\ue6af\\ue6b0\\ue6b1\\ue6b2\\ue6b3\\ue6b4\\ue6b5\\ue6b6\\ue6b7\\ue6b8\\ue6b9\\ue6ba\\ue6bb\\ue6bc\\ue6bd\\ue6be\\ue6bf\\ue6c0\\ue6c1\\ue6c2\\ue6c3\\ue6c4\\ue6c5\\ue6c6\\ue6c7\\ue6c8\\ue6c9\\ue6ca\\ue6cb\\ue6cc\\ue6cd\\ue6ce\\ue6cf\\ue6d0\\ue6d1\\ue6d2\\ue6d3\\ue6d4\\ue6d5\\ue6d6\\ue6d7\\ue6d8\\ue6d9\\ue6da\\ue6db\\ue6dc\\ue6dd\\ue6de\\ue6df\\ue6e0\\ue6e1\\ue6e2\\ue6e3\\ue6e4=\\ue6e5\\ue6e6\\ue6e7\\ue6e8\\ue6e9\\ue6ea\\ue6eb\\ue6ec\\ue6ed\\ue6ee\\ue6ef\\ue6f0\\ue6f1\\ue6f2\\ue6f3\\ue6f4\\ue6f5\\ue6f6\\ue6f7\\ue6f8\\ue6f9\\ue6fa\\ue6fb\\ue6fc\\ue6fd\\ue6fe\\ue6ff\\ue700\\ue701\\ue702\\ue703\\ue704\\ue705========================\\ue785\\ue786\\ue787\\ue788\\ue789\\ue78a\\ue78b\\ue78c========================\\ue78d\\ue78e\\ue78f\\ue790\\ue791\\ue792\\ue793============\\ue794\\ue795=====\\ue796==\\ue797\\ue798\\ue799\\ue79a\\ue79b\\ue79c\\ue79d\\ue79e\\ue79f',\n a7: '\\ue706\\ue707\\ue708\\ue709\\ue70a\\ue70b\\ue70c\\ue70d\\ue70e\\ue70f\\ue710\\ue711\\ue712\\ue713\\ue714\\ue715\\ue716\\ue717\\ue718\\ue719\\ue71a\\ue71b\\ue71c\\ue71d\\ue71e\\ue71f\\ue720\\ue721\\ue722\\ue723\\ue724\\ue725\\ue726\\ue727\\ue728\\ue729\\ue72a\\ue72b\\ue72c\\ue72d\\ue72e\\ue72f\\ue730\\ue731\\ue732\\ue733\\ue734\\ue735\\ue736\\ue737\\ue738\\ue739\\ue73a\\ue73b\\ue73c\\ue73d\\ue73e\\ue73f\\ue740\\ue741\\ue742\\ue743\\ue744=\\ue745\\ue746\\ue747\\ue748\\ue749\\ue74a\\ue74b\\ue74c\\ue74d\\ue74e\\ue74f\\ue750\\ue751\\ue752\\ue753\\ue754\\ue755\\ue756\\ue757\\ue758\\ue759\\ue75a\\ue75b\\ue75c\\ue75d\\ue75e\\ue75f\\ue760\\ue761\\ue762\\ue763\\ue764\\ue765=================================\\ue7a0\\ue7a1\\ue7a2\\ue7a3\\ue7a4\\ue7a5\\ue7a6\\ue7a7\\ue7a8\\ue7a9\\ue7aa\\ue7ab\\ue7ac\\ue7ad\\ue7ae=================================\\ue7af\\ue7b0\\ue7b1\\ue7b2\\ue7b3\\ue7b4\\ue7b5\\ue7b6\\ue7b7\\ue7b8\\ue7b9\\ue7ba\\ue7bb',\n a8: '======================================================================================\\ue7bc\\ue7bd\\ue7be\\ue7bf\\ue7c0\\ue7c1\\ue7c2\\ue7c3\\ue7c4\\ue7c5\\ue7c6===========================\\ue7c7==ǹ=\\ue7c9\\ue7ca\\ue7cb\\ue7cc=====================================\\ue7cd\\ue7ce\\ue7cf\\ue7d0\\ue7d1\\ue7d2\\ue7d3\\ue7d4\\ue7d5\\ue7d6\\ue7d7\\ue7d8\\ue7d9\\ue7da\\ue7db\\ue7dc\\ue7dd\\ue7de\\ue7df\\ue7e0\\ue7e1',\n a9: '========================\\ue7e2==\\ue7e3=\\ue7e4\\ue7e5\\ue7e6=========================================〾⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻=\\ue7f4\\ue7f5\\ue7f6\\ue7f7\\ue7f8\\ue7f9\\ue7fa\\ue7fb\\ue7fc\\ue7fd\\ue7fe\\ue7ff\\ue800============================================================================\\ue801\\ue802\\ue803\\ue804\\ue805\\ue806\\ue807\\ue808\\ue809\\ue80a\\ue80b\\ue80c\\ue80d\\ue80e\\ue80f',\n aa: '=================================================================================================\\ue000\\ue001\\ue002\\ue003\\ue004\\ue005\\ue006\\ue007\\ue008\\ue009\\ue00a\\ue00b\\ue00c\\ue00d\\ue00e\\ue00f\\ue010\\ue011\\ue012\\ue013\\ue014\\ue015\\ue016\\ue017\\ue018\\ue019\\ue01a\\ue01b\\ue01c\\ue01d\\ue01e\\ue01f\\ue020\\ue021\\ue022\\ue023\\ue024\\ue025\\ue026\\ue027\\ue028\\ue029\\ue02a\\ue02b\\ue02c\\ue02d\\ue02e\\ue02f\\ue030\\ue031\\ue032\\ue033\\ue034\\ue035\\ue036\\ue037\\ue038\\ue039\\ue03a\\ue03b\\ue03c\\ue03d\\ue03e\\ue03f\\ue040\\ue041\\ue042\\ue043\\ue044\\ue045\\ue046\\ue047\\ue048\\ue049\\ue04a\\ue04b\\ue04c\\ue04d\\ue04e\\ue04f\\ue050\\ue051\\ue052\\ue053\\ue054\\ue055\\ue056\\ue057\\ue058\\ue059\\ue05a\\ue05b\\ue05c\\ue05d',\n ab: '=================================================================================================\\ue05e\\ue05f\\ue060\\ue061\\ue062\\ue063\\ue064\\ue065\\ue066\\ue067\\ue068\\ue069\\ue06a\\ue06b\\ue06c\\ue06d\\ue06e\\ue06f\\ue070\\ue071\\ue072\\ue073\\ue074\\ue075\\ue076\\ue077\\ue078\\ue079\\ue07a\\ue07b\\ue07c\\ue07d\\ue07e\\ue07f\\ue080\\ue081\\ue082\\ue083\\ue084\\ue085\\ue086\\ue087\\ue088\\ue089\\ue08a\\ue08b\\ue08c\\ue08d\\ue08e\\ue08f\\ue090\\ue091\\ue092\\ue093\\ue094\\ue095\\ue096\\ue097\\ue098\\ue099\\ue09a\\ue09b\\ue09c\\ue09d\\ue09e\\ue09f\\ue0a0\\ue0a1\\ue0a2\\ue0a3\\ue0a4\\ue0a5\\ue0a6\\ue0a7\\ue0a8\\ue0a9\\ue0aa\\ue0ab\\ue0ac\\ue0ad\\ue0ae\\ue0af\\ue0b0\\ue0b1\\ue0b2\\ue0b3\\ue0b4\\ue0b5\\ue0b6\\ue0b7\\ue0b8\\ue0b9\\ue0ba\\ue0bb',\n ac: '=================================================================================================\\ue0bc\\ue0bd\\ue0be\\ue0bf\\ue0c0\\ue0c1\\ue0c2\\ue0c3\\ue0c4\\ue0c5\\ue0c6\\ue0c7\\ue0c8\\ue0c9\\ue0ca\\ue0cb\\ue0cc\\ue0cd\\ue0ce\\ue0cf\\ue0d0\\ue0d1\\ue0d2\\ue0d3\\ue0d4\\ue0d5\\ue0d6\\ue0d7\\ue0d8\\ue0d9\\ue0da\\ue0db\\ue0dc\\ue0dd\\ue0de\\ue0df\\ue0e0\\ue0e1\\ue0e2\\ue0e3\\ue0e4\\ue0e5\\ue0e6\\ue0e7\\ue0e8\\ue0e9\\ue0ea\\ue0eb\\ue0ec\\ue0ed\\ue0ee\\ue0ef\\ue0f0\\ue0f1\\ue0f2\\ue0f3\\ue0f4\\ue0f5\\ue0f6\\ue0f7\\ue0f8\\ue0f9\\ue0fa\\ue0fb\\ue0fc\\ue0fd\\ue0fe\\ue0ff\\ue100\\ue101\\ue102\\ue103\\ue104\\ue105\\ue106\\ue107\\ue108\\ue109\\ue10a\\ue10b\\ue10c\\ue10d\\ue10e\\ue10f\\ue110\\ue111\\ue112\\ue113\\ue114\\ue115\\ue116\\ue117\\ue118\\ue119',\n ad: '=================================================================================================\\ue11a\\ue11b\\ue11c\\ue11d\\ue11e\\ue11f\\ue120\\ue121\\ue122\\ue123\\ue124\\ue125\\ue126\\ue127\\ue128\\ue129\\ue12a\\ue12b\\ue12c\\ue12d\\ue12e\\ue12f\\ue130\\ue131\\ue132\\ue133\\ue134\\ue135\\ue136\\ue137\\ue138\\ue139\\ue13a\\ue13b\\ue13c\\ue13d\\ue13e\\ue13f\\ue140\\ue141\\ue142\\ue143\\ue144\\ue145\\ue146\\ue147\\ue148\\ue149\\ue14a\\ue14b\\ue14c\\ue14d\\ue14e\\ue14f\\ue150\\ue151\\ue152\\ue153\\ue154\\ue155\\ue156\\ue157\\ue158\\ue159\\ue15a\\ue15b\\ue15c\\ue15d\\ue15e\\ue15f\\ue160\\ue161\\ue162\\ue163\\ue164\\ue165\\ue166\\ue167\\ue168\\ue169\\ue16a\\ue16b\\ue16c\\ue16d\\ue16e\\ue16f\\ue170\\ue171\\ue172\\ue173\\ue174\\ue175\\ue176\\ue177',\n ae: '=================================================================================================\\ue178\\ue179\\ue17a\\ue17b\\ue17c\\ue17d\\ue17e\\ue17f\\ue180\\ue181\\ue182\\ue183\\ue184\\ue185\\ue186\\ue187\\ue188\\ue189\\ue18a\\ue18b\\ue18c\\ue18d\\ue18e\\ue18f\\ue190\\ue191\\ue192\\ue193\\ue194\\ue195\\ue196\\ue197\\ue198\\ue199\\ue19a\\ue19b\\ue19c\\ue19d\\ue19e\\ue19f\\ue1a0\\ue1a1\\ue1a2\\ue1a3\\ue1a4\\ue1a5\\ue1a6\\ue1a7\\ue1a8\\ue1a9\\ue1aa\\ue1ab\\ue1ac\\ue1ad\\ue1ae\\ue1af\\ue1b0\\ue1b1\\ue1b2\\ue1b3\\ue1b4\\ue1b5\\ue1b6\\ue1b7\\ue1b8\\ue1b9\\ue1ba\\ue1bb\\ue1bc\\ue1bd\\ue1be\\ue1bf\\ue1c0\\ue1c1\\ue1c2\\ue1c3\\ue1c4\\ue1c5\\ue1c6\\ue1c7\\ue1c8\\ue1c9\\ue1ca\\ue1cb\\ue1cc\\ue1cd\\ue1ce\\ue1cf\\ue1d0\\ue1d1\\ue1d2\\ue1d3\\ue1d4\\ue1d5',\n af: '=================================================================================================\\ue1d6\\ue1d7\\ue1d8\\ue1d9\\ue1da\\ue1db\\ue1dc\\ue1dd\\ue1de\\ue1df\\ue1e0\\ue1e1\\ue1e2\\ue1e3\\ue1e4\\ue1e5\\ue1e6\\ue1e7\\ue1e8\\ue1e9\\ue1ea\\ue1eb\\ue1ec\\ue1ed\\ue1ee\\ue1ef\\ue1f0\\ue1f1\\ue1f2\\ue1f3\\ue1f4\\ue1f5\\ue1f6\\ue1f7\\ue1f8\\ue1f9\\ue1fa\\ue1fb\\ue1fc\\ue1fd\\ue1fe\\ue1ff\\ue200\\ue201\\ue202\\ue203\\ue204\\ue205\\ue206\\ue207\\ue208\\ue209\\ue20a\\ue20b\\ue20c\\ue20d\\ue20e\\ue20f\\ue210\\ue211\\ue212\\ue213\\ue214\\ue215\\ue216\\ue217\\ue218\\ue219\\ue21a\\ue21b\\ue21c\\ue21d\\ue21e\\ue21f\\ue220\\ue221\\ue222\\ue223\\ue224\\ue225\\ue226\\ue227\\ue228\\ue229\\ue22a\\ue22b\\ue22c\\ue22d\\ue22e\\ue22f\\ue230\\ue231\\ue232\\ue233',\n d7: '==========================================================================================================================================================================================\\ue810\\ue811\\ue812\\ue813\\ue814',\n f8: '=================================================================================================\\ue234\\ue235\\ue236\\ue237\\ue238\\ue239\\ue23a\\ue23b\\ue23c\\ue23d\\ue23e\\ue23f\\ue240\\ue241\\ue242\\ue243\\ue244\\ue245\\ue246\\ue247\\ue248\\ue249\\ue24a\\ue24b\\ue24c\\ue24d\\ue24e\\ue24f\\ue250\\ue251\\ue252\\ue253\\ue254\\ue255\\ue256\\ue257\\ue258\\ue259\\ue25a\\ue25b\\ue25c\\ue25d\\ue25e\\ue25f\\ue260\\ue261\\ue262\\ue263\\ue264\\ue265\\ue266\\ue267\\ue268\\ue269\\ue26a\\ue26b\\ue26c\\ue26d\\ue26e\\ue26f\\ue270\\ue271\\ue272\\ue273\\ue274\\ue275\\ue276\\ue277\\ue278\\ue279\\ue27a\\ue27b\\ue27c\\ue27d\\ue27e\\ue27f\\ue280\\ue281\\ue282\\ue283\\ue284\\ue285\\ue286\\ue287\\ue288\\ue289\\ue28a\\ue28b\\ue28c\\ue28d\\ue28e\\ue28f\\ue290\\ue291',\n f9: '=================================================================================================\\ue292\\ue293\\ue294\\ue295\\ue296\\ue297\\ue298\\ue299\\ue29a\\ue29b\\ue29c\\ue29d\\ue29e\\ue29f\\ue2a0\\ue2a1\\ue2a2\\ue2a3\\ue2a4\\ue2a5\\ue2a6\\ue2a7\\ue2a8\\ue2a9\\ue2aa\\ue2ab\\ue2ac\\ue2ad\\ue2ae\\ue2af\\ue2b0\\ue2b1\\ue2b2\\ue2b3\\ue2b4\\ue2b5\\ue2b6\\ue2b7\\ue2b8\\ue2b9\\ue2ba\\ue2bb\\ue2bc\\ue2bd\\ue2be\\ue2bf\\ue2c0\\ue2c1\\ue2c2\\ue2c3\\ue2c4\\ue2c5\\ue2c6\\ue2c7\\ue2c8\\ue2c9\\ue2ca\\ue2cb\\ue2cc\\ue2cd\\ue2ce\\ue2cf\\ue2d0\\ue2d1\\ue2d2\\ue2d3\\ue2d4\\ue2d5\\ue2d6\\ue2d7\\ue2d8\\ue2d9\\ue2da\\ue2db\\ue2dc\\ue2dd\\ue2de\\ue2df\\ue2e0\\ue2e1\\ue2e2\\ue2e3\\ue2e4\\ue2e5\\ue2e6\\ue2e7\\ue2e8\\ue2e9\\ue2ea\\ue2eb\\ue2ec\\ue2ed\\ue2ee\\ue2ef',\n fa: '=================================================================================================\\ue2f0\\ue2f1\\ue2f2\\ue2f3\\ue2f4\\ue2f5\\ue2f6\\ue2f7\\ue2f8\\ue2f9\\ue2fa\\ue2fb\\ue2fc\\ue2fd\\ue2fe\\ue2ff\\ue300\\ue301\\ue302\\ue303\\ue304\\ue305\\ue306\\ue307\\ue308\\ue309\\ue30a\\ue30b\\ue30c\\ue30d\\ue30e\\ue30f\\ue310\\ue311\\ue312\\ue313\\ue314\\ue315\\ue316\\ue317\\ue318\\ue319\\ue31a\\ue31b\\ue31c\\ue31d\\ue31e\\ue31f\\ue320\\ue321\\ue322\\ue323\\ue324\\ue325\\ue326\\ue327\\ue328\\ue329\\ue32a\\ue32b\\ue32c\\ue32d\\ue32e\\ue32f\\ue330\\ue331\\ue332\\ue333\\ue334\\ue335\\ue336\\ue337\\ue338\\ue339\\ue33a\\ue33b\\ue33c\\ue33d\\ue33e\\ue33f\\ue340\\ue341\\ue342\\ue343\\ue344\\ue345\\ue346\\ue347\\ue348\\ue349\\ue34a\\ue34b\\ue34c\\ue34d',\n fb: '=================================================================================================\\ue34e\\ue34f\\ue350\\ue351\\ue352\\ue353\\ue354\\ue355\\ue356\\ue357\\ue358\\ue359\\ue35a\\ue35b\\ue35c\\ue35d\\ue35e\\ue35f\\ue360\\ue361\\ue362\\ue363\\ue364\\ue365\\ue366\\ue367\\ue368\\ue369\\ue36a\\ue36b\\ue36c\\ue36d\\ue36e\\ue36f\\ue370\\ue371\\ue372\\ue373\\ue374\\ue375\\ue376\\ue377\\ue378\\ue379\\ue37a\\ue37b\\ue37c\\ue37d\\ue37e\\ue37f\\ue380\\ue381\\ue382\\ue383\\ue384\\ue385\\ue386\\ue387\\ue388\\ue389\\ue38a\\ue38b\\ue38c\\ue38d\\ue38e\\ue38f\\ue390\\ue391\\ue392\\ue393\\ue394\\ue395\\ue396\\ue397\\ue398\\ue399\\ue39a\\ue39b\\ue39c\\ue39d\\ue39e\\ue39f\\ue3a0\\ue3a1\\ue3a2\\ue3a3\\ue3a4\\ue3a5\\ue3a6\\ue3a7\\ue3a8\\ue3a9\\ue3aa\\ue3ab',\n fc: '=================================================================================================\\ue3ac\\ue3ad\\ue3ae\\ue3af\\ue3b0\\ue3b1\\ue3b2\\ue3b3\\ue3b4\\ue3b5\\ue3b6\\ue3b7\\ue3b8\\ue3b9\\ue3ba\\ue3bb\\ue3bc\\ue3bd\\ue3be\\ue3bf\\ue3c0\\ue3c1\\ue3c2\\ue3c3\\ue3c4\\ue3c5\\ue3c6\\ue3c7\\ue3c8\\ue3c9\\ue3ca\\ue3cb\\ue3cc\\ue3cd\\ue3ce\\ue3cf\\ue3d0\\ue3d1\\ue3d2\\ue3d3\\ue3d4\\ue3d5\\ue3d6\\ue3d7\\ue3d8\\ue3d9\\ue3da\\ue3db\\ue3dc\\ue3dd\\ue3de\\ue3df\\ue3e0\\ue3e1\\ue3e2\\ue3e3\\ue3e4\\ue3e5\\ue3e6\\ue3e7\\ue3e8\\ue3e9\\ue3ea\\ue3eb\\ue3ec\\ue3ed\\ue3ee\\ue3ef\\ue3f0\\ue3f1\\ue3f2\\ue3f3\\ue3f4\\ue3f5\\ue3f6\\ue3f7\\ue3f8\\ue3f9\\ue3fa\\ue3fb\\ue3fc\\ue3fd\\ue3fe\\ue3ff\\ue400\\ue401\\ue402\\ue403\\ue404\\ue405\\ue406\\ue407\\ue408\\ue409',\n fd: '=================================================================================================\\ue40a\\ue40b\\ue40c\\ue40d\\ue40e\\ue40f\\ue410\\ue411\\ue412\\ue413\\ue414\\ue415\\ue416\\ue417\\ue418\\ue419\\ue41a\\ue41b\\ue41c\\ue41d\\ue41e\\ue41f\\ue420\\ue421\\ue422\\ue423\\ue424\\ue425\\ue426\\ue427\\ue428\\ue429\\ue42a\\ue42b\\ue42c\\ue42d\\ue42e\\ue42f\\ue430\\ue431\\ue432\\ue433\\ue434\\ue435\\ue436\\ue437\\ue438\\ue439\\ue43a\\ue43b\\ue43c\\ue43d\\ue43e\\ue43f\\ue440\\ue441\\ue442\\ue443\\ue444\\ue445\\ue446\\ue447\\ue448\\ue449\\ue44a\\ue44b\\ue44c\\ue44d\\ue44e\\ue44f\\ue450\\ue451\\ue452\\ue453\\ue454\\ue455\\ue456\\ue457\\ue458\\ue459\\ue45a\\ue45b\\ue45c\\ue45d\\ue45e\\ue45f\\ue460\\ue461\\ue462\\ue463\\ue464\\ue465\\ue466\\ue467',\n fe: '================⺁\\ue816\\ue817\\ue818⺄㑳㑇⺈⺋\\ue81e㖞㘚㘎⺌⺗㥮㤘\\ue826㧏㧟㩳㧐\\ue82b\\ue82c㭎㱮㳠⺧\\ue831\\ue832⺪䁖䅟⺮䌷⺳⺶⺷\\ue83b䎱䎬⺻䏝䓖䙡䙌\\ue843=䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶\\ue854\\ue855䲣䲟䲠䲡䱷䲢䴓䴔䴕䴖䴗䴘䴙䶮\\ue864\\ue468\\ue469\\ue46a\\ue46b\\ue46c\\ue46d\\ue46e\\ue46f\\ue470\\ue471\\ue472\\ue473\\ue474\\ue475\\ue476\\ue477\\ue478\\ue479\\ue47a\\ue47b\\ue47c\\ue47d\\ue47e\\ue47f\\ue480\\ue481\\ue482\\ue483\\ue484\\ue485\\ue486\\ue487\\ue488\\ue489\\ue48a\\ue48b\\ue48c\\ue48d\\ue48e\\ue48f\\ue490\\ue491\\ue492\\ue493\\ue494\\ue495\\ue496\\ue497\\ue498\\ue499\\ue49a\\ue49b\\ue49c\\ue49d\\ue49e\\ue49f\\ue4a0\\ue4a1\\ue4a2\\ue4a3\\ue4a4\\ue4a5\\ue4a6\\ue4a7\\ue4a8\\ue4a9\\ue4aa\\ue4ab\\ue4ac\\ue4ad\\ue4ae\\ue4af\\ue4b0\\ue4b1\\ue4b2\\ue4b3\\ue4b4\\ue4b5\\ue4b6\\ue4b7\\ue4b8\\ue4b9\\ue4ba\\ue4bb\\ue4bc\\ue4bd\\ue4be\\ue4bf\\ue4c0\\ue4c1\\ue4c2\\ue4c3\\ue4c4\\ue4c5',\n },\n single:\n '================================================================================================================================',\n },\n gb2312: {\n rows: {\n a1: '  、。・ˉˇ¨〃々―~‖…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓',\n a2: ' ⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩ ㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩ ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ',\n a3: ' !"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄',\n a4: ' ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん',\n a5: ' ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ',\n a6: ' ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ αβγδεζηθικλμνξοπρστυφχψω',\n a7: ' АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ абвгдеёжзийклмнопрстуфхцчшщъыьэюя',\n a8: ' āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüê ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ',\n a9: ' ─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋',\n b0: ' 啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥',\n b1: ' 薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳',\n b2: ' 病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖',\n b3: ' 场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚',\n b4: ' 础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮',\n b5: ' 怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠',\n b6: ' 丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二',\n b7: ' 贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服',\n b8: ' 浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹',\n b9: ' 埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈',\n ba: ' 骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖',\n bb: ' 弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕',\n bc: ' 肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件',\n bd: ' 健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸',\n be: ' 尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻',\n bf: ' 俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀',\n c0: ' 馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐',\n c1: ' 痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿',\n c2: ' 隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫',\n c3: ' 谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸',\n c4: ' 摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁',\n c5: ' 拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗',\n c6: ' 啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐',\n c7: ' 恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠',\n c8: ' 取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁',\n c9: ' 伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳',\n ca: ' 省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱',\n cb: ' 恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔',\n cc: ' 獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃',\n cd: ' 汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威',\n ce: ' 巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺',\n cf: ' 稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓',\n d0: ' 小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄',\n d1: ' 选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶',\n d2: ' 摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐',\n d3: ' 印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉',\n d4: ' 浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧',\n d5: ' 铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政',\n d6: ' 帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑',\n d7: ' 住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座',\n d8: ' 亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝',\n d9: ' 佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼',\n da: ' 凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺',\n db: ' 邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝',\n dc: ' 堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥',\n dd: ' 荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺',\n de: ' 蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖',\n df: ' 摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼',\n e0: ' 唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼',\n e1: ' 帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺',\n e2: ' 狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂',\n e3: ' 恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾',\n e4: ' 洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑',\n e5: ' 濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣',\n e6: ' 妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩',\n e7: ' 纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬',\n e8: ' 琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹',\n e9: ' 椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋',\n ea: ' 辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰',\n eb: ' 搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻',\n ec: ' 臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐',\n ed: ' 怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨',\n ee: ' 睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪',\n ef: ' 铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔',\n f0: ' 稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙',\n f1: ' 瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃',\n f2: ' 颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒',\n f3: ' 蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋',\n f4: ' 簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤',\n f5: ' 酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜',\n f6: ' 觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋',\n f7: ' 鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄',\n },\n single:\n ' ',\n },\n gbk: {\n base: 'gb2312',\n rows: {\n '81': '丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪乫乬乭乮乯乲乴乵乶乷乸乹乺乻乼乽乿亀亁亂亃亄亅亇亊=亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂伃伄伅伆伇伈伋伌伒伓伔伕伖伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾伿佀佁佂佄佅佇佈佉佊佋佌佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢',\n '82': '侤侫侭侰侱侲侳侴侶侷侸侹侺侻侼侽侾俀俁係俆俇俈俉俋俌俍俒俓俔俕俖俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿倀倁倂倃倄倅倆倇倈倉倊=個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯倰倱倲倳倴倵倶倷倸倹倻倽倿偀偁偂偄偅偆偉偊偋偍偐偑偒偓偔偖偗偘偙偛偝偞偟偠偡偢偣偤偦偧偨偩偪偫偭偮偯偰偱偲偳側偵偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傤傦傪傫傭傮傯傰傱傳傴債傶傷傸傹傼',\n '83': '傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎僐僑僒僓僔僕僗僘僙僛僜僝僞僟僠僡僢僣僤僥僨僩僪僫僯僰僱僲僴僶僷僸價僺僼僽僾僿儀儁儂儃億儅儈=儉儊儌儍儎儏儐儑儓儔儕儖儗儘儙儚儛儜儝儞償儠儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾兂兇兊兌兎兏児兒兓兗兘兙兛兝兞兟兠兡兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦冧冨冩冪冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒凓凔凕凖凗',\n '84': '凘凙凚凜凞凟凢凣凥処凧凨凩凪凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄剅剆則剈剉剋剎剏剒剓剕剗剘=剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳剴創剶剷剸剹剺剻剼剾劀劃劄劅劆劇劉劊劋劌劍劎劏劑劒劔劕劖劗劘劙劚劜劤劥劦劧劮劯劰労劵劶劷劸効劺劻劼劽勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務勚勛勜勝勞勠勡勢勣勥勦勧勨勩勪勫勬勭勮勯勱勲勳勴勵勶勷勸勻勼勽匁匂匃匄匇匉匊匋匌匎',\n '85': '匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯匰匱匲匳匴匵匶匷匸匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏=厐厑厒厓厔厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯厰厱厲厳厴厵厷厸厹厺厼厽厾叀參叄叅叆叇収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝呞呟呠呡呣呥呧呩呪呫呬呭呮呯呰呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡',\n '86': '咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠員哢哣哤哫哬哯哰哱哴哵哶哷哸哹哻哾唀唂唃唄唅唈唊唋唌唍唎唒唓唕唖唗唘唙唚唜唝唞唟唡唥唦=唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋啌啍啎問啑啒啓啔啗啘啙啚啛啝啞啟啠啢啣啨啩啫啯啰啱啲啳啴啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠喡喢喣喤喥喦喨喩喪喫喬喭單喯喰喲喴営喸喺喼喿嗀嗁嗂嗃嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗嗘嗙嗚嗛嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸嗹嗺嗻嗼嗿嘂嘃嘄嘅',\n '87': '嘆嘇嘊嘋嘍嘐嘑嘒嘓嘔嘕嘖嘗嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀噁噂噃噄噅噆噇噈噉噊噋噏噐噑噒噓噕噖噚噛噝噞噟噠噡=噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽噾噿嚀嚁嚂嚃嚄嚇嚈嚉嚊嚋嚌嚍嚐嚑嚒嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚰嚱嚲嚳嚴嚵嚶嚸嚹嚺嚻嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囋囌囍囎囏囐囑囒囓囕囖囘囙囜団囥囦囧囨囩囪囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國圌圍圎圏圐圑',\n '88': '園圓圔圕圖圗團圙圚圛圝圞圠圡圢圤圥圦圧圫圱圲圴圵圶圷圸圼圽圿坁坃坄坅坆坈坉坋坒坓坔坕坖坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀=垁垇垈垉垊垍垎垏垐垑垔垕垖垗垘垙垚垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹垺垻垼垽垾垿埀埁埄埅埆埇埈埉埊埌埍埐埑埓埖埗埛埜埞埡埢埣埥埦埧埨埩埪埫埬埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥堦堧堨堩堫堬堭堮堯報堲堳場堶堷堸堹堺堻堼堽',\n '89': '堾堿塀塁塂塃塅塆塇塈塉塊塋塎塏塐塒塓塕塖塗塙塚塛塜塝塟塠塡塢塣塤塦塧塨塩塪塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塿墂墄墆墇墈墊墋墌=墍墎墏墐墑墔墕墖増墘墛墜墝墠墡墢墣墤墥墦墧墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墽墾墿壀壂壃壄壆壇壈壉壊壋壌壍壎壏壐壒壓壔壖壗壘壙壚壛壜壝壞壟壠壡壢壣壥壦壧壨壩壪壭壯壱売壴壵壷壸壺壻壼壽壾壿夀夁夃夅夆夈変夊夋夌夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻',\n '8a': '夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛奜奝奞奟奡奣奤奦奧奨奩奪奫奬奭奮奯奰奱奲奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦=妧妬妭妰妱妳妴妵妶妷妸妺妼妽妿姀姁姂姃姄姅姇姈姉姌姍姎姏姕姖姙姛姞姟姠姡姢姤姦姧姩姪姫姭姮姯姰姱姲姳姴姵姶姷姸姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪娫娬娭娮娯娰娳娵娷娸娹娺娻娽娾娿婁婂婃婄婅婇婈婋婌婍婎婏婐婑婒婓婔婖婗婘婙婛婜婝婞婟婠',\n '8b': '婡婣婤婥婦婨婩婫婬婭婮婯婰婱婲婳婸婹婻婼婽婾媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媓媔媕媖媗媘媙媜媝媞媟媠媡媢媣媤媥媦媧媨媩媫媬=媭媮媯媰媱媴媶媷媹媺媻媼媽媿嫀嫃嫄嫅嫆嫇嫈嫊嫋嫍嫎嫏嫐嫑嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬嫭嫮嫯嫰嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬳嬵嬶嬸嬹嬺嬻嬼嬽嬾嬿孁孂孃孄孅孆孇',\n '8c': '孈孉孊孋孌孍孎孏孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏=寑寔寕寖寗寘寙寚寛寜寠寢寣實寧審寪寫寬寭寯寱寲寳寴寵寶寷寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧屨屩屪屫屬屭屰屲屳屴屵屶屷屸屻屼屽屾岀岃岄岅岆岇岉岊岋岎岏岒岓岕岝岞岟岠岡岤岥岦岧岨',\n '8d': '岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅峆峇峈峉峊峌峍峎峏峐峑峓峔峕峖峗峘峚峛峜峝峞峟峠峢峣峧峩峫峬峮峯峱峲峳峴峵島峷峸峹峺峼峽峾峿崀=崁崄崅崈崉崊崋崌崍崏崐崑崒崓崕崗崘崙崚崜崝崟崠崡崢崣崥崨崪崫崬崯崰崱崲崳崵崶崷崸崹崺崻崼崿嵀嵁嵂嵃嵄嵅嵆嵈嵉嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵙嵚嵜嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵪嵭嵮嵰嵱嵲嵳嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶚嶛嶜嶞嶟嶠',\n '8e': '嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巆巇巈巉巊巋巌巎巏巐巑巒巓巔巕巖巗巘巙巚巜巟巠巣巤巪巬巭=巰巵巶巸巹巺巻巼巿帀帄帇帉帊帋帍帎帒帓帗帞帟帠帡帢帣帤帥帨帩帪師帬帯帰帲帳帴帵帶帹帺帾帿幀幁幃幆幇幈幉幊幋幍幎幏幐幑幒幓幖幗幘幙幚幜幝幟幠幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨庩庪庫庬庮庯庰庱庲庴庺庻庼庽庿廀廁廂廃廄廅',\n '8f': '廆廇廈廋廌廍廎廏廐廔廕廗廘廙廚廜廝廞廟廠廡廢廣廤廥廦廧廩廫廬廭廮廯廰廱廲廳廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤=弨弫弬弮弰弲弳弴張弶強弸弻弽弾弿彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢徣徤徥徦徧復徫徬徯徰徱徲徳徴徶徸徹徺徻徾徿忀忁忂忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇',\n '90': '怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰怱怲怳怴怶怷怸怹怺怽怾恀恄恅恆恇恈恉恊恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀=悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽悾悿惀惁惂惃惄惇惈惉惌惍惎惏惐惒惓惔惖惗惙惛惞惡惢惣惤惥惪惱惲惵惷惸惻惼惽惾惿愂愃愄愅愇愊愋愌愐愑愒愓愔愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾慀慁慂慃慄慅慆',\n '91': '慇慉態慍慏慐慒慓慔慖慗慘慙慚慛慜慞慟慠慡慣慤慥慦慩慪慫慬慭慮慯慱慲慳慴慶慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憌憍憏憐憑憒憓憕=憖憗憘憙憚憛憜憞憟憠憡憢憣憤憥憦憪憫憭憮憯憰憱憲憳憴憵憶憸憹憺憻憼憽憿懀懁懃懄懅懆懇應懌懍懎懏懐懓懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懧懨懩懪懫懬懭懮懯懰懱懲懳懴懶懷懸懹懺懻懼懽懾戀戁戂戃戄戅戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸戹戺戻戼扂扄扅扆扊',\n '92': '扏扐払扖扗扙扚扜扝扞扟扠扡扢扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋抌抍抎抏抐抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁=拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳挴挵挶挷挸挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖捗捘捙捚捛捜捝捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙掚掛掜掝掞掟採掤掦掫掯掱掲掵掶掹掻掽掿揀',\n '93': '揁揂揃揅揇揈揊揋揌揑揓揔揕揗揘揙揚換揜揝揟揢揤揥揦揧揨揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆搇搈搉搊損搎搑搒搕搖搗搘搙搚搝搟搢搣搤=搥搧搨搩搫搮搯搰搱搲搳搵搶搷搸搹搻搼搾摀摂摃摉摋摌摍摎摏摐摑摓摕摖摗摙摚摛摜摝摟摠摡摢摣摤摥摦摨摪摫摬摮摯摰摱摲摳摴摵摶摷摻摼摽摾摿撀撁撃撆撈撉撊撋撌撍撎撏撐撓撔撗撘撚撛撜撝撟撠撡撢撣撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆擇擈擉擊擋擌擏擑擓擔擕擖擙據',\n '94': '擛擜擝擟擠擡擣擥擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攁攂攃攄攅攆攇攈攊攋攌攍攎攏攐攑攓攔攕攖攗攙攚攛攜攝攞攟攠攡=攢攣攤攦攧攨攩攪攬攭攰攱攲攳攷攺攼攽敀敁敂敃敄敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數敹敺敻敼敽敾敿斀斁斂斃斄斅斆斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱斲斳斴斵斶斷斸斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘旙旚旛旜旝旞旟旡旣旤旪旫',\n '95': '旲旳旴旵旸旹旻旼旽旾旿昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷昸昹昺昻昽昿晀時晄晅晆晇晈晉晊晍晎晐晑晘=晙晛晜晝晞晠晢晣晥晧晩晪晫晬晭晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘暙暚暛暜暞暟暠暡暢暣暤暥暦暩暪暫暬暭暯暰暱暲暳暵暶暷暸暺暻暼暽暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曚曞曟曠曡曢曣曤曥曧曨曪曫曬曭曮曯曱曵曶書曺曻曽朁朂會',\n '96': '朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠朡朢朣朤朥朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗杘杙杚杛杝杢杣杤杦杧杫杬杮東杴杶=杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹枺枻枼枽枾枿柀柂柅柆柇柈柉柊柋柌柍柎柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵柶柷柸柹柺査柼柾栁栂栃栄栆栍栐栒栔栕栘栙栚栛栜栞栟栠栢栣栤栥栦栧栨栫栬栭栮栯栰栱栴栵栶栺栻栿桇桋桍桏桒桖桗桘桙桚桛',\n '97': '桜桝桞桟桪桬桭桮桯桰桱桲桳桵桸桹桺桻桼桽桾桿梀梂梄梇梈梉梊梋梌梍梎梐梑梒梔梕梖梘梙梚梛梜條梞梟梠梡梣梤梥梩梪梫梬梮梱梲梴梶梷梸=梹梺梻梼梽梾梿棁棃棄棅棆棇棈棊棌棎棏棐棑棓棔棖棗棙棛棜棝棞棟棡棢棤棥棦棧棨棩棪棫棬棭棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆椇椈椉椊椌椏椑椓椔椕椖椗椘椙椚椛検椝椞椡椢椣椥椦椧椨椩椪椫椬椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楕楖楘楙楛楜楟',\n '98': '楡楢楤楥楧楨楩楪楬業楯楰楲楳楴極楶楺楻楽楾楿榁榃榅榊榋榌榎榏榐榑榒榓榖榗榙榚榝榞榟榠榡榢榣榤榥榦榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽=榾榿槀槂槃槄槅槆槇槈槉構槍槏槑槒槓槕槖槗様槙槚槜槝槞槡槢槣槤槥槦槧槨槩槪槫槬槮槯槰槱槳槴槵槶槷槸槹槺槻槼槾樀樁樂樃樄樅樆樇樈樉樋樌樍樎樏樐樑樒樓樔樕樖標樚樛樜樝樞樠樢樣樤樥樦樧権樫樬樭樮樰樲樳樴樶樷樸樹樺樻樼樿橀橁橂橃橅橆橈橉橊橋橌橍橎橏橑橒橓橔橕橖橗橚',\n '99': '橜橝橞機橠橢橣橤橦橧橨橩橪橫橬橭橮橯橰橲橳橴橵橶橷橸橺橻橽橾橿檁檂檃檅檆檇檈檉檊檋檌檍檏檒檓檔檕檖檘檙檚檛檜檝檞檟檡檢檣檤檥檦=檧檨檪檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欥欦欨欩欪欫欬欭欮',\n '9a': '欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍歎歏歐歑歒歓歔歕歖歗歘歚歛歜歝歞歟歠歡歨歩歫歬歭歮歯歰歱歲歳歴歵歶歷歸歺歽歾歿殀殅殈=殌殎殏殐殑殔殕殗殘殙殜殝殞殟殠殢殣殤殥殦殧殨殩殫殬殭殮殯殰殱殲殶殸殹殺殻殼殽殾毀毃毄毆毇毈毉毊毌毎毐毑毘毚毜毝毞毟毠毢毣毤毥毦毧毨毩毬毭毮毰毱毲毴毶毷毸毺毻毼毾毿氀氁氂氃氄氈氉氊氋氌氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋汌汍汎汏汑汒汓汖汘',\n '9b': '汙汚汢汣汥汦汧汫汬汭汮汯汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘=泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟洠洡洢洣洤洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽浾浿涀涁涃涄涆涇涊涋涍涏涐涒涖涗涘涙涚涜涢涥涬涭涰涱涳涴涶涷涹涺涻涼涽涾淁淂淃淈淉淊',\n '9c': '淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽淾淿渀渁渂渃渄渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵=渶渷渹渻渼渽渾渿湀湁湂湅湆湇湈湉湊湋湌湏湐湑湒湕湗湙湚湜湝湞湠湡湢湣湤湥湦湧湨湩湪湬湭湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溇溈溊溋溌溍溎溑溒溓溔溕準溗溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪滫滬滭滮滯',\n '9d': '滰滱滲滳滵滶滷滸滺滻滼滽滾滿漀漁漃漄漅漇漈漊漋漌漍漎漐漑漒漖漗漘漙漚漛漜漝漞漟漡漢漣漥漦漧漨漬漮漰漲漴漵漷漸漹漺漻漼漽漿潀潁潂=潃潄潅潈潉潊潌潎潏潐潑潒潓潔潕潖潗潙潚潛潝潟潠潡潣潤潥潧潨潩潪潫潬潯潰潱潳潵潶潷潹潻潽潾潿澀澁澂澃澅澆澇澊澋澏澐澑澒澓澔澕澖澗澘澙澚澛澝澞澟澠澢澣澤澥澦澨澩澪澫澬澭澮澯澰澱澲澴澵澷澸澺澻澼澽澾澿濁濃濄濅濆濇濈濊濋濌濍濎濏濐濓濔濕濖濗濘濙濚濛濜濝濟濢濣濤濥',\n '9e': '濦濧濨濩濪濫濬濭濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀒瀓瀔瀕瀖瀗瀘瀙瀜瀝瀞瀟瀠瀡瀢瀤瀥瀦瀧瀨瀩瀪=瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀶瀷瀸瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灍灎灐灑灒灓灔灕灖灗灘灙灚灛灜灝灟灠灡灢灣灤灥灦灧灨灩灪灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞炟炠炡炢炣炤炥炦炧炨炩炪炰炲炴炵炶為炾炿烄烅烆烇烉烋烌烍烎烏烐烑烒烓烔烕烖烗烚',\n '9f': '烜烝烞烠烡烢烣烥烪烮烰烱烲烳烴烵烶烸烺烻烼烾烿焀焁焂焃焄焅焆焇焈焋焌焍焎焏焑焒焔焗焛焜焝焞焟焠無焢焣焤焥焧焨焩焪焫焬焭焮焲焳焴=焵焷焸焹焺焻焼焽焾焿煀煁煂煃煄煆煇煈煉煋煍煏煐煑煒煓煔煕煖煗煘煙煚煛煝煟煠煡煢煣煥煩煪煫煬煭煯煰煱煴煵煶煷煹煻煼煾煿熀熁熂熃熅熆熇熈熉熋熌熍熎熐熑熒熓熕熖熗熚熛熜熝熞熡熢熣熤熥熦熧熩熪熫熭熮熯熰熱熲熴熶熷熸熺熻熼熽熾熿燀燁燂燄燅燆燇燈燉燊燋燌燍燏燐燑燒燓',\n a0: '燖燗燘燙燚燛燜燝燞營燡燢燣燤燦燨燩燪燫燬燭燯燰燱燲燳燴燵燶燷燸燺燻燼燽燾燿爀爁爂爃爄爅爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚=爛爜爞爟爠爡爢爣爤爥爦爧爩爫爭爮爯爲爳爴爺爼爾牀牁牂牃牄牅牆牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅犆犇犈犉犌犎犐犑犓犔犕犖犗犘犙犚犛犜犝犞犠犡犢犣犤犥犦犧犨犩犪犫犮犱犲犳犵犺犻犼犽犾犿狀狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛',\n a1: '====================================================================================================·=====—',\n a2: '=================================================================================================ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ',\n a6: '================================================================================================================================================================︵︶︹︺︿﹀︽︾﹁﹂﹃﹄==︻︼︷︸︱=︳︴',\n a8: 'ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇=█▉▊▋▌▍▎▏▓▔▕▼▽◢◣◤◥☉⊕〒〝〞=====================================ɑ=ńň=ɡ',\n a9: '〡〢〣〤〥〦〧〨〩㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦=℡㈱=‐===ー゛゜ヽヾ〆ゝゞ﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚﹛﹜﹝﹞﹟﹠﹡=﹢﹣﹤﹥﹦﹨﹩﹪﹫=============〇',\n aa: '狜狝狟狢狣狤狥狦狧狪狫狵狶狹狽狾狿猀猂猄猅猆猇猈猉猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀獁獂獃獄獅獆獇獈=獉獊獋獌獎獏獑獓獔獕獖獘獙獚獛獜獝獞獟獡獢獣獤獥獦獧獨獩獪獫獮獰獱',\n ab: '獲獳獴獵獶獷獸獹獺獻獼獽獿玀玁玂玃玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣玤玥玦玧玨玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃珄珅珆珇=珋珌珎珒珓珔珕珖珗珘珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳珴珵珶珷',\n ac: '珸珹珺珻珼珽現珿琀琁琂琄琇琈琋琌琍琎琑琒琓琔琕琖琗琘琙琜琝琞琟琠琡琣琤琧琩琫琭琯琱琲琷琸琹琺琻琽琾琿瑀瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍=瑎瑏瑐瑑瑒瑓瑔瑖瑘瑝瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑮瑯瑱瑲瑳瑴瑵瑸瑹瑺',\n ad: '瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑璒璓璔璕璖璗璘璙璚璛璝璟璠璡璢璣璤璥璦璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇=瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓓瓔瓕瓖瓗瓘瓙瓚瓛瓝瓟瓡瓥瓧瓨瓩瓪瓫瓬瓭瓰瓱瓲',\n ae: '瓳瓵瓸瓹瓺瓻瓼瓽瓾甀甁甂甃甅甆甇甈甉甊甋甌甎甐甒甔甕甖甗甛甝甞甠甡產産甤甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘=畝畞畟畠畡畢畣畤畧畨畩畫畬畭畮畯異畱畳畵當畷畺畻畼畽畾疀疁疂疄疅疇',\n af: '疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦疧疨疩疪疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇=瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄',\n b0: '癅癆癇癈癉癊癋癎癏癐癑癒癓癕癗癘癙癚癛癝癟癠癡癢癤癥癦癧癨癩癪癬癭癮癰癱癲癳癴癵癶癷癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛=皜皝皞皟皠皡皢皣皥皦皧皨皩皪皫皬皭皯皰皳皵皶皷皸皹皺皻皼皽皾盀盁盃',\n b1: '盄盇盉盋盌盓盕盙盚盜盝盞盠盡盢監盤盦盧盨盩盪盫盬盭盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎眏眐眑眒眓眔眕眖眗眘眛眜眝眞眡眣眤眥眧眪眫=眬眮眰眱眲眳眴眹眻眽眾眿睂睄睅睆睈睉睊睋睌睍睎睏睒睓睔睕睖睗睘睙睜',\n b2: '睝睞睟睠睤睧睩睪睭睮睯睰睱睲睳睴睵睶睷睸睺睻睼瞁瞂瞃瞆瞇瞈瞉瞊瞋瞏瞐瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶瞷瞸瞹瞺=瞼瞾矀矁矂矃矄矅矆矇矈矉矊矋矌矎矏矐矑矒矓矔矕矖矘矙矚矝矞矟矠矡矤',\n b3: '矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃砄砅砆砇砈砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚=硛硜硞硟硠硡硢硣硤硥硦硧硨硩硯硰硱硲硳硴硵硶硸硹硺硻硽硾硿碀碁碂碃',\n b4: '碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨碩碪碫碬碭碮碯碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚磛磜磝磞磟磠磡磢磣=磤磥磦磧磩磪磫磭磮磯磰磱磳磵磶磸磹磻磼磽磾磿礀礂礃礄礆礇礈礉礊礋礌',\n b5: '礍礎礏礐礑礒礔礕礖礗礘礙礚礛礜礝礟礠礡礢礣礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礵礶礷礸礹礽礿祂祃祄祅祇祊祋祌祍祎祏祐祑祒祔祕祘祙祡祣=祤祦祩祪祫祬祮祰祱祲祳祴祵祶祹祻祼祽祾祿禂禃禆禇禈禉禋禌禍禎禐禑禒',\n b6: '禓禔禕禖禗禘禙禛禜禝禞禟禠禡禢禣禤禥禦禨禩禪禫禬禭禮禯禰禱禲禴禵禶禷禸禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙秚秛秜秝秞秠秡秢秥秨秪=秬秮秱秲秳秴秵秶秷秹秺秼秾秿稁稄稅稇稈稉稊稌稏稐稑稒稓稕稖稘稙稛稜',\n b7: '稝稟稡稢稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稴稵稶稸稺稾穀穁穂穃穄穅穇穈穉穊穋穌積穎穏穐穒穓穔穕穖穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨=穩穪穫穬穭穮穯穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢',\n b8: '窣窤窧窩窪窫窮窯窰窱窲窴窵窶窷窸窹窺窻窼窽窾竀竁竂竃竄竅竆竇竈竉竊竌竍竎竏竐竑竒竓竔竕竗竘竚竛竜竝竡竢竤竧竨竩竪竫竬竮竰竱竲竳=竴竵競竷竸竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭',\n b9: '笯笰笲笴笵笶笷笹笻笽笿筀筁筂筃筄筆筈筊筍筎筓筕筗筙筜筞筟筡筣筤筥筦筧筨筩筪筫筬筭筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆箇箈箉箊箋箌箎箏=箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹箺箻箼箽箾箿節篂篃範',\n ba: '篅篈築篊篋篍篎篏篐篒篔篕篖篗篘篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲篳篴篵篶篸篹篺篻篽篿簀簁簂簃簄簅簆簈簉簊簍簎簐簑簒簓簔簕簗簘簙=簚簛簜簝簞簠簡簢簣簤簥簨簩簫簬簭簮簯簰簱簲簳簴簵簶簷簹簺簻簼簽簾籂',\n bb: '籃籄籅籆籇籈籉籊籋籌籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲籵籶籷籸籹籺籾籿粀粁粂粃粄粅粆粇=粈粊粋粌粍粎粏粐粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴粵粶粷粸粺粻',\n bc: '粿糀糂糃糄糆糉糋糎糏糐糑糒糓糔糘糚糛糝糞糡糢糣糤糥糦糧糩糪糫糬糭糮糰糱糲糳糴糵糶糷糹糺糼糽糾糿紀紁紂紃約紅紆紇紈紉紋紌納紎紏紐=紑紒紓純紕紖紗紘紙級紛紜紝紞紟紡紣紤紥紦紨紩紪紬紭紮細紱紲紳紴紵紶',\n bd: '紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絯絰統絲絳絴絵絶=絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘',\n be: '継続綛綜綝綞綟綠綡綢綣綤綥綧綨綩綪綫綬維綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙=線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺',\n bf: '緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹=縺縼總績縿繀繂繃繄繅繆繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝',\n c0: '繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纜纝纞=纮纴纻纼绖绤绬绹缊缐缞缷缹缻缼缽缾缿罀罁罃罆罇罈罉罊罋罌罍罎罏罒罓',\n c1: '罖罙罛罜罝罞罠罣罤罥罦罧罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂羃羄羅羆羇羈羉羋羍羏羐羑羒羓羕羖羗羘羙羛羜羠羢羣羥羦羨義羪羫羬羭羮羱=羳羴羵羶羷羺羻羾翀翂翃翄翆翇翈翉翋翍翏翐翑習翓翖翗翙翚翛翜翝翞翢翣',\n c2: '翤翧翨翪翫翬翭翯翲翴翵翶翷翸翹翺翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫耬耭耮耯耰耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗=聙聛聜聝聞聟聠聡聢聣聤聥聦聧聨聫聬聭聮聯聰聲聳聴聵聶職聸聹聺聻聼聽',\n c3: '聾肁肂肅肈肊肍肎肏肐肑肒肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇胈胉胊胋胏胐胑胒胓胔胕胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋=脌脕脗脙脛脜脝脟脠脡脢脣脤脥脦脧脨脩脪脫脭脮脰脳脴脵脷脹脺脻脼脽脿',\n c4: '腀腁腂腃腄腅腇腉腍腎腏腒腖腗腘腛腜腝腞腟腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃膄膅膆膇膉膋膌膍膎膐膒膓膔膕膖膗膙膚膞膟膠膡膢膤膥=膧膩膫膬膭膮膯膰膱膲膴膵膶膷膸膹膼膽膾膿臄臅臇臈臉臋臍臎臏臐臑臒臓',\n c5: '臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臤臥臦臨臩臫臮臯臰臱臲臵臶臷臸臹臺臽臿舃與興舉舊舋舎舏舑舓舕舖舗舘舙舚舝舠舤舥舦舧舩舮舲舺舼舽舿=艀艁艂艃艅艆艈艊艌艍艎艐艑艒艓艔艕艖艗艙艛艜艝艞艠艡艢艣艤艥艦艧艩',\n c6: '艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸=苺苼苽苾苿茀茊茋茍茐茒茓茖茘茙茝茞茟茠茡茢茣茤茥茦茩茪茮茰茲茷茻茽',\n c7: '茾茿荁荂荄荅荈荊荋荌荍荎荓荕荖荗荘荙荝荢荰荱荲荳荴荵荶荹荺荾荿莀莁莂莃莄莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡莢莣莤莥莦莧莬莭莮=莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭',\n c8: '菮華菳菴菵菶菷菺菻菼菾菿萀萂萅萇萈萉萊萐萒萓萔萕萖萗萙萚萛萞萟萠萡萢萣萩萪萫萬萭萮萯萰萲萳萴萵萶萷萹萺萻萾萿葀葁葂葃葄葅葇葈葉=葊葋葌葍葎葏葐葒葓葔葕葖葘葝葞葟葠葢葤葥葦葧葨葪葮葯葰葲葴葷葹葻葼',\n c9: '葽葾葿蒀蒁蒃蒄蒅蒆蒊蒍蒏蒐蒑蒒蒓蒔蒕蒖蒘蒚蒛蒝蒞蒟蒠蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗=蓘蓙蓚蓛蓜蓞蓡蓢蓤蓧蓨蓩蓪蓫蓭蓮蓯蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓽蓾蔀蔁蔂',\n ca: '蔃蔄蔅蔆蔇蔈蔉蔊蔋蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢蔣蔤蔥蔦蔧蔨蔩蔪蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔾蔿蕀蕁蕂蕄蕅蕆蕇蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕=蕗蕘蕚蕛蕜蕝蕟蕠蕡蕢蕣蕥蕦蕧蕩蕪蕫蕬蕭蕮蕯蕰蕱蕳蕵蕶蕷蕸蕼蕽蕿薀薁',\n cb: '薂薃薆薈薉薊薋薌薍薎薐薑薒薓薔薕薖薗薘薙薚薝薞薟薠薡薢薣薥薦薧薩薫薬薭薱薲薳薴薵薶薸薺薻薼薽薾薿藀藂藃藄藅藆藇藈藊藋藌藍藎藑藒=藔藖藗藘藙藚藛藝藞藟藠藡藢藣藥藦藧藨藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸',\n cc: '藹藺藼藽藾蘀蘁蘂蘃蘄蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘒蘓蘔蘕蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡蘢蘣蘤蘥蘦蘨蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘹蘺蘻蘽蘾蘿虀=虁虂虃虄虅虆虇虈虉虊虋虌虒虓處虖虗虘虙虛虜虝號虠虡虣虤虥虦虧虨虩虪',\n cd: '虭虯虰虲虳虴虵虶虷虸蚃蚄蚅蚆蚇蚈蚉蚎蚏蚐蚑蚒蚔蚖蚗蚘蚙蚚蚛蚞蚟蚠蚡蚢蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻蚼蚽蚾蚿蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜=蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖',\n ce: '蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀蝁蝂蝃蝄蝅蝆蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚蝛蝜蝝蝞蝟蝡蝢蝦蝧蝨蝩蝪蝫蝬蝭蝯蝱蝲蝳蝵=蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎螏螐螑螒螔螕螖螘螙螚螛螜螝螞螠螡螢螣螤',\n cf: '螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁蟂蟃蟄蟅蟇蟈蟉蟌蟍蟎蟏蟐蟔蟕蟖蟗蟘蟙蟚蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸=蟺蟻蟼蟽蟿蠀蠁蠂蠄蠅蠆蠇蠈蠉蠋蠌蠍蠎蠏蠐蠑蠒蠔蠗蠘蠙蠚蠜蠝蠞蠟蠠蠣',\n d0: '蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠳蠴蠵蠶蠷蠸蠺蠻蠽蠾蠿衁衂衃衆衇衈衉衊衋衎衏衐衑衒術衕衖衘衚衛衜衝衞衟衠衦衧衪衭衯衱衳衴衵衶衸衹衺=衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗袘袙袚袛袝袞袟袠袡袣袥袦袧袨袩袪',\n d1: '袬袮袯袰袲袳袴袵袶袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚裛補裝裞裠裡裦裧裩裪裫裬裭裮裯裲裵裶裷裺裻製裿褀褁褃褄褅褆複褈=褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟褠褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷',\n d2: '褸褹褺褻褼褽褾褿襀襂襃襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襠襡襢襣襤襥襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襼=襽襾覀覂覄覅覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡',\n d3: '覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴觵觶觷觸觹觺=觻觼觽觾觿訁訂訃訄訅訆計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝',\n d4: '訞訟訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訿詀詁詂詃詄詅詆詇詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞=詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詺詻詼詽詾詿誀',\n d5: '誁誂誃誄誅誆誇誈誋誌認誎誏誐誑誒誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂=諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣',\n d6: '諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡謢謣=謤謥謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅',\n d7: '譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥譧譨譩譪譫譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆=讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讬讱讻诇诐诪谉谞',\n d8: '谸谹谺谻谼谽谾谿豀豂豃豄豅豈豊豋豍豎豏豐豑豒豓豔豖豗豘豙豛豜豝豞豟豠豣豤豥豦豧豨豩豬豭豮豯豰豱豲豴豵豶豷豻豼豽豾豿貀貁貃貄貆貇=貈貋貍貎貏貐貑貒貓貕貖貗貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭',\n d9: '貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬=賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍',\n da: '贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸赹赺赻赼赽赾赿趀趂趃趆趇趈趉趌趍趎趏趐趒趓趕趖趗趘趙趚趛趜趝趞趠趡=趢趤趥趦趧趨趩趪趫趬趭趮趯趰趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔',\n db: '跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾跿踀踁踂踃踄踆踇踈踋踍踎踐踑踒踓踕踖踗踘踙踚踛踜踠踡踤踥踦踧踨踫踭踰踲踳踴踶踷踸踻踼踾=踿蹃蹅蹆蹌蹍蹎蹏蹐蹓蹔蹕蹖蹗蹘蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹧蹨蹪蹫蹮蹱',\n dc: '蹳蹵蹷蹸蹹蹺蹻蹽蹾躀躂躃躄躆躈躉躊躋躌躍躎躑躒躓躕躖躗躘躙躚躛躝躟躠躡躢躣躤躥躦躧躨躩躪躭躮躰躱躳躴躵躶躷躸躹躻躼躽躾躿軀軁軂=軃軄軅軆軇軈軉車軋軌軍軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤',\n dd: '軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡輢輣=輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄',\n de: '轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆=迉迊迋迌迍迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘',\n df: '這逜連逤逥逧逨逩逪逫逬逰週進逳逴逷逹逺逽逿遀遃遅遆遈遉遊運遌過達違遖遙遚遜遝遞遟遠遡遤遦遧適遪遫遬遯遰遱遲遳遶遷選遹遺遻遼遾邁=還邅邆邇邉邊邌邍邎邏邐邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀',\n e0: '郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄚鄛鄜=鄝鄟鄠鄡鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄰鄲鄳鄴鄵鄶鄷鄸鄺鄻鄼鄽鄾鄿酀酁酂酄',\n e1: '酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀醁醂醃醄醆醈醊醎醏醓醔醕醖醗醘醙醜醝醞醟醠醡醤醥醦醧醨醩醫醬醰醱醲醳醶醷醸醹醻=醼醽醾醿釀釁釂釃釄釅釆釈釋釐釒釓釔釕釖釗釘釙釚釛針釞釟釠釡釢釣釤釥',\n e2: '釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡鈢鈣鈤=鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅',\n e3: '鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅=銆銇銈銉銊銋銌銍銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧',\n e4: '銨銩銪銫銬銭銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨=鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉',\n e5: '錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉=鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍫',\n e6: '鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫=鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏋鏌鏍',\n e7: '鏎鏏鏐鏑鏒鏓鏔鏕鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍=鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮',\n e8: '鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑬鑭鑮鑯=鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钑钖钘铇铏铓铔铚铦铻锜锠',\n e9: '锧锳锽镃镈镋镕镚镠镮镴镵長镸镹镺镻镼镽镾門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪=閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋',\n ea: '闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧闬闿阇阓阘阛阞阠阣阤阥阦阧阨阩阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗=陘陙陚陜陝陞陠陣陥陦陫陭陮陯陰陱陳陸陹険陻陼陽陾陿隀隁隂隃隄隇隉隊',\n eb: '隌階隑隒隓隕隖隚際隝隞隟隠隡隢隣隤隥隦隨隩險隫隬隭隮隯隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖雗雘雙雚雛雜雝雞雟雡離難雤雥雦雧雫=雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗霘霙霚霛霝霟霠',\n ec: '霡霢霣霤霥霦霧霨霩霫霬霮霯霱霳霴霵霶霷霺霻霼霽霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑靔靕靗靘靚靜靝靟靣靤靦靧靨靪靫靬靭靮靯靰靱=靲靵靷靸靹靺靻靽靾靿鞀鞁鞂鞃鞄鞆鞇鞈鞉鞊鞌鞎鞏鞐鞓鞕鞖鞗鞙鞚鞛鞜鞝',\n ed: '鞞鞟鞡鞢鞤鞥鞦鞧鞨鞩鞪鞬鞮鞰鞱鞳鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣=韤韥韨韮韯韰韱韲韴韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎',\n ee: '頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額=顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮',\n ef: '顯顰顱顲顳顴颋颎颒颕颙颣風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍飏飐飔飖飗飛飜飝飠飡飢飣飤=飥飦飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇',\n f0: '餈餉養餋餌餎餏餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡餢餣餤餥餦餧館餩餪餫餬餭餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉=饊饋饌饍饎饏饐饑饒饓饖饗饘饙饚饛饜饝饞饟饠饡饢饤饦饳饸饹饻饾馂馃馉',\n f1: '馌馎馚馛馜馝馞馟馠馡馢馣馤馦馧馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘=駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹',\n f2: '駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸=騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙',\n f3: '驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫驲骃骉骍骎骔骕骙骦骩骪骫骬骭骮骯骲骳骴骵骹骻骽骾骿髃髄髆髇髈髉髊髍髎髏髐髒體髕髖髗髙髚髛髜=髝髞髠髢髣髤髥髧髨髩髪髬髮髰髱髲髳髴髵髶髷髸髺髼髽髾髿鬀鬁鬂鬄鬅鬆',\n f4: '鬇鬉鬊鬋鬌鬍鬎鬐鬑鬒鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬠鬡鬢鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬰鬱鬳鬴鬵鬶鬷鬸鬹鬺鬽鬾鬿魀魆魊魋魌魎魐魒魓魕魖魗魘魙魚=魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻',\n f5: '魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺=鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛',\n f6: '鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚=鰛鰜鰝鰞鰟鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻',\n f7: '鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺=鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾鲿鳀鳁鳂鳈鳉鳑鳒鳚鳛鳠鳡',\n f8: '鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡=鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂',\n f9: '鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁=鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢',\n fa: '鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡=鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂',\n fb: '鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽麀=麁麃麄麅麆麉麊麌麍麎麏麐麑麔麕麖麗麘麙麚麛麜麞麠麡麢麣麤麥麧麨麩麪',\n fc: '麫麬麭麮麯麰麱麲麳麵麶麷麹麺麼麿黀黁黂黃黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰黱黲黳黴黵黶黷黸黺黽黿鼀鼁鼂鼃鼄鼅=鼆鼇鼈鼉鼊鼌鼏鼑鼒鼔鼕鼖鼘鼚鼛鼜鼝鼞鼟鼡鼣鼤鼥鼦鼧鼨鼩鼪鼫鼭鼮鼰鼱',\n fd: '鼲鼳鼴鼵鼶鼸鼺鼼鼿齀齁齂齃齅齆齇齈齉齊齋齌齍齎齏齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸=齹齺齻齼齽齾龁龂龍龎龏龐龑龒龓龔龕龖龗龘龜龝龞龡龢龣龤龥郎凉秊裏隣',\n fe: '兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩',\n },\n single:\n '================================================================================================================================',\n },\n shift_jis: {\n rows: {\n '81': ' 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\〜‖|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+−±× ÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓 ∈∋⊆⊇⊂⊃∪∩ ∧∨¬⇒⇔∀∃ ∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬ ʼn♯♭♪†‡¶ ◯',\n '82': ' 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん',\n '83': 'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ αβγδεζηθικλμνξοπρστυφχψω',\n '84': 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ абвгдеёжзийклмн опрстуфхцчшщъыьэюя ─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂',\n '88': ' 亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭',\n '89': '院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円 園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改',\n '8a': '魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫 橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄',\n '8b': '機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救 朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈',\n '8c': '掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨 劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向',\n '8d': '后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降 項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷',\n '8e': '察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止 死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周',\n '8f': '宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳 準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾',\n '90': '拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨 逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線',\n '91': '繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻 操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只',\n '92': '叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄 逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓',\n '93': '邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬 凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入',\n '94': '如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅 楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美',\n '95': '鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷 斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋',\n '96': '法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆 摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒',\n '97': '諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲 沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯',\n '98': '蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕 弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲',\n '99': '僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭 凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨',\n '9a': '咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸 噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩',\n '9b': '奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀 它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏',\n '9c': '廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠 怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛',\n '9d': '戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫 捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼',\n '9e': '曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎 梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣',\n '9f': '檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯 麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌',\n e0: '漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝 烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱',\n e1: '瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿 痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬',\n e2: '磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰 窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆',\n e3: '紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷 縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋',\n e4: '隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤 艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈',\n e5: '蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬 蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞',\n e6: '襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧 諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊',\n e7: '蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜 轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮',\n e8: '錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙 閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰',\n e9: '顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃 騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈',\n ea: '鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯 黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙',\n },\n single:\n ' 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ ',\n },\n};\n\n/** GB18030 four-byte BMP area: `[linear index, first code point]` runs. */\nexport const PY_GB18030_RANGES: readonly (readonly [number, number])[] = [\n [0, 128],\n [36, 165],\n [38, 169],\n [45, 178],\n [50, 184],\n [81, 216],\n [89, 226],\n [95, 235],\n [96, 238],\n [100, 244],\n [103, 248],\n [104, 251],\n [105, 253],\n [109, 258],\n [126, 276],\n [133, 284],\n [148, 300],\n [172, 325],\n [175, 329],\n [179, 334],\n [208, 364],\n [306, 463],\n [307, 465],\n [308, 467],\n [309, 469],\n [310, 471],\n [311, 473],\n [312, 475],\n [313, 477],\n [341, 506],\n [428, 594],\n [443, 610],\n [544, 712],\n [545, 716],\n [558, 730],\n [741, 930],\n [742, 938],\n [749, 962],\n [750, 970],\n [805, 1026],\n [819, 1104],\n [820, 1106],\n [7922, 8209],\n [7924, 8215],\n [7925, 8218],\n [7927, 8222],\n [7934, 8231],\n [7943, 8241],\n [7944, 8244],\n [7945, 8246],\n [7950, 8252],\n [8062, 8365],\n [8148, 8452],\n [8149, 8454],\n [8152, 8458],\n [8164, 8471],\n [8174, 8482],\n [8236, 8556],\n [8240, 8570],\n [8262, 8596],\n [8264, 8602],\n [8374, 8713],\n [8380, 8720],\n [8381, 8722],\n [8384, 8726],\n [8388, 8731],\n [8390, 8737],\n [8392, 8740],\n [8393, 8742],\n [8394, 8748],\n [8396, 8751],\n [8401, 8760],\n [8406, 8766],\n [8416, 8777],\n [8419, 8781],\n [8424, 8787],\n [8437, 8802],\n [8439, 8808],\n [8445, 8816],\n [8482, 8854],\n [8485, 8858],\n [8496, 8870],\n [8521, 8896],\n [8603, 8979],\n [8936, 9322],\n [8946, 9372],\n [9046, 9548],\n [9050, 9588],\n [9063, 9616],\n [9066, 9622],\n [9076, 9634],\n [9092, 9652],\n [9100, 9662],\n [9108, 9672],\n [9111, 9676],\n [9113, 9680],\n [9131, 9702],\n [9162, 9735],\n [9164, 9738],\n [9218, 9793],\n [9219, 9795],\n [11329, 11906],\n [11331, 11909],\n [11334, 11913],\n [11336, 11917],\n [11346, 11928],\n [11361, 11944],\n [11363, 11947],\n [11366, 11951],\n [11370, 11956],\n [11372, 11960],\n [11375, 11964],\n [11389, 11979],\n [11682, 12284],\n [11686, 12292],\n [11687, 12312],\n [11692, 12319],\n [11694, 12330],\n [11714, 12351],\n [11716, 12436],\n [11723, 12447],\n [11725, 12535],\n [11730, 12543],\n [11736, 12586],\n [11982, 12842],\n [11989, 12850],\n [12102, 12964],\n [12336, 13200],\n [12348, 13215],\n [12350, 13218],\n [12384, 13253],\n [12393, 13263],\n [12395, 13267],\n [12397, 13270],\n [12510, 13384],\n [12553, 13428],\n [12851, 13727],\n [12962, 13839],\n [12973, 13851],\n [13738, 14617],\n [13823, 14703],\n [13919, 14801],\n [13933, 14816],\n [14080, 14964],\n [14298, 15183],\n [14585, 15471],\n [14698, 15585],\n [15583, 16471],\n [15847, 16736],\n [16318, 17208],\n [16434, 17325],\n [16438, 17330],\n [16481, 17374],\n [16729, 17623],\n [17102, 17997],\n [17122, 18018],\n [17315, 18212],\n [17320, 18218],\n [17402, 18301],\n [17418, 18318],\n [17859, 18760],\n [17909, 18811],\n [17911, 18814],\n [17915, 18820],\n [17916, 18823],\n [17936, 18844],\n [17939, 18848],\n [17961, 18872],\n [18664, 19576],\n [18703, 19620],\n [18814, 19738],\n [18962, 19887],\n [19043, 40870],\n [33469, 59244],\n [33470, 59336],\n [33471, 59367],\n [33484, 59413],\n [33485, 59417],\n [33490, 59423],\n [33497, 59431],\n [33501, 59437],\n [33505, 59443],\n [33513, 59452],\n [33520, 59460],\n [33536, 59478],\n [33550, 59493],\n [37845, 63789],\n [37921, 63866],\n [37948, 63894],\n [38029, 63976],\n [38038, 63986],\n [38064, 64016],\n [38065, 64018],\n [38066, 64021],\n [38069, 64025],\n [38075, 64034],\n [38076, 64037],\n [38078, 64042],\n [39108, 65074],\n [39109, 65093],\n [39113, 65107],\n [39114, 65112],\n [39115, 65127],\n [39116, 65132],\n [39265, 65375],\n [39394, 65510],\n];\n\n/**\n * EUC-KR (KS X 1001:1998 Annex 3) make-up sequences: syllable indexes of\n * jamo bytes 0xA1-0xBE (-1 where invalid).\n */\nexport const PY_EUC_KR_JAMO: Readonly<\n Record<'choseong' | 'jongseong', readonly number[]>\n> = {\n choseong: [\n 0, 1, -1, 2, -1, -1, 3, 4, 5, -1, -1, -1, -1, -1, -1, -1, 6, 7, 8, -1, 9,\n 10, 11, 12, 13, 14, 15, 16, 17, 18,\n ],\n jongseong: [\n 1, 2, 3, 4, 5, 6, 7, -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, -1, 18, 19,\n 20, 21, 22, -1, 23, 24, 25, 26, 27,\n ],\n};\n","// CPython's CJK codecs (Modules/cjkcodecs): the multibyte decoders, the\n// ISO-2022-JP family and HZ, with CPython's own tables (generated by\n// tools/fixtures/generate_codecs.py, so the output doesn't depend on the\n// runtime's TextDecoder) and the same error ranges and reasons.\n\nimport {\n ASCII_LIMIT,\n decodeError,\n type ErrorContext,\n TextBuilder,\n} from './py-codecs-base';\nimport {\n PY_EUC_KR_JAMO,\n PY_GB18030_RANGES,\n PY_MULTIBYTE_TABLES,\n type PyMultibyteTable,\n} from './py-codecs-data';\n\nconst ILLEGAL = 'illegal multibyte sequence';\nconst INCOMPLETE = 'incomplete multibyte sequence';\n\nconst FIRST_TRAIL = 0x40;\nconst INVALID = -1;\nconst MULTI = -2;\nconst INVALID_CHAR = ' ';\nconst INHERIT_CHAR = '=';\nconst MULTI_CHAR = '￿';\n\n/** A codec's table, expanded for lookups by integer. */\ninterface MultibyteTable {\n /** Code point of bytes 0x80-0xFF alone, or {@link INVALID}. */\n readonly single: Int32Array;\n /** By `(lead - 0x80) << 8 | trail`: code point, INVALID or MULTI. */\n readonly pairs: Int32Array;\n /** EUC-JP's SS3 sequences, by `(second - 0x80) << 8 | third`. */\n readonly triples: Int32Array | null;\n /** Text of the MULTI entries, by `lead << 8 | trail`. */\n readonly multi: ReadonlyMap<number, string>;\n}\n\nconst TABLES = new Map<string, MultibyteTable>();\n\nfunction fillRows(\n target: Int32Array,\n rows: Readonly<Record<string, string>>,\n multi: Map<number, string>,\n extra: Readonly<Record<string, string>> | undefined,\n hasBase: boolean,\n): void {\n for (const [leadHex, row] of Object.entries(rows)) {\n const lead = Number.parseInt(leadHex, 16);\n let trail = FIRST_TRAIL;\n for (const char of row) {\n const index = ((lead - 0x80) << 8) | trail;\n if (char === INVALID_CHAR) {\n target[index] = INVALID;\n } else if (char === MULTI_CHAR) {\n target[index] = MULTI;\n const key = (lead << 8) | trail;\n multi.set(key, extra?.[key.toString(16).padStart(4, '0')] ?? '');\n } else if (char !== INHERIT_CHAR || !hasBase) {\n target[index] = char.codePointAt(0) ?? INVALID;\n }\n trail += 1;\n }\n }\n}\n\nfunction buildTable(codec: string): MultibyteTable {\n const raw: PyMultibyteTable | undefined = PY_MULTIBYTE_TABLES[codec];\n if (raw === undefined) {\n throw new Error(`no multibyte table for ${codec}`);\n }\n const base = raw.base === undefined ? undefined : multibyteTable(raw.base);\n const single = new Int32Array(ASCII_LIMIT).fill(INVALID);\n const pairs = new Int32Array(ASCII_LIMIT << 8).fill(INVALID);\n const multi = new Map<number, string>(base?.multi);\n if (base !== undefined) {\n single.set(base.single);\n pairs.set(base.pairs);\n }\n let index = 0;\n for (const char of raw.single) {\n if (char === INVALID_CHAR) {\n single[index] = INVALID;\n } else if (char !== INHERIT_CHAR) {\n single[index] = char.codePointAt(0) ?? INVALID;\n }\n index += 1;\n }\n fillRows(pairs, raw.rows, multi, raw.multi, base !== undefined);\n let triples: Int32Array | null = null;\n if (raw.triples !== undefined) {\n triples = new Int32Array(ASCII_LIMIT << 8).fill(INVALID);\n fillRows(triples, raw.triples, multi, raw.multi, false);\n }\n if (codec === 'cp949') {\n fillUnifiedHangul(pairs, multibyteTable('euc_kr'));\n }\n return { single, pairs, triples, multi };\n}\n\nfunction multibyteTable(codec: string): MultibyteTable {\n let table = TABLES.get(codec);\n if (table === undefined) {\n table = buildTable(codec);\n TABLES.set(codec, table);\n }\n return table;\n}\n\nconst HANGUL_FIRST = 0xac00;\nconst HANGUL_LAST = 0xd7a3;\n\n// The Unified Hangul Code area of cp949 holds, in order, the Hangul\n// syllables that KS X 1001 (euc_kr) lacks; the generator checks this.\nfunction fillUnifiedHangul(pairs: Int32Array, eucKr: MultibyteTable): void {\n const known = new Set<number>(eucKr.pairs);\n const syllables: number[] = [];\n for (let code = HANGUL_FIRST; code <= HANGUL_LAST; code += 1) {\n if (!known.has(code)) {\n syllables.push(code);\n }\n }\n let next = 0;\n for (let lead = 0x81; lead <= 0xc6; lead += 1) {\n const lastTrail = lead <= 0xa0 ? 0xfe : 0xa0;\n for (let trail = 0x41; trail <= lastTrail; trail += 1) {\n const inArea =\n trail <= 0x5a || (trail >= 0x61 && trail <= 0x7a) || trail >= 0x81;\n if (inArea) {\n pairs[((lead - 0x80) << 8) | trail] = syllables[next] ?? INVALID;\n next += 1;\n }\n }\n }\n}\n\n/** The table entry for `lead`, `trail` (both bytes). */\nfunction lookupPair(\n table: MultibyteTable,\n lead: number,\n trail: number,\n): number {\n return lead < ASCII_LIMIT\n ? INVALID\n : (table.pairs[((lead - 0x80) << 8) | trail] ?? INVALID);\n}\n\nfunction emit(\n output: TextBuilder,\n table: MultibyteTable,\n code: number,\n key: number,\n): void {\n if (code === MULTI) {\n output.text(table.multi.get(key) ?? '');\n } else {\n output.codePoint(code);\n }\n}\n\n/** Copies the run of ASCII bytes at `start`; returns where it ends. */\nfunction copyAscii(\n bytes: Uint8Array,\n start: number,\n output: TextBuilder,\n): number {\n let end = start;\n while (end < bytes.length && (bytes[end] ?? 0) < ASCII_LIMIT) {\n end += 1;\n }\n output.latin1(bytes.subarray(start, end));\n return end;\n}\n\nconst EUC_JP_SS3 = 0x8f;\nconst EUC_KR_JAMO_LEAD = 0xa4;\nconst EUC_KR_JAMO_FILLER = 0xd4;\nconst EUC_KR_SEQUENCE = 8;\nconst SYLLABLES_PER_CHOSEONG = 588;\nconst SYLLABLES_PER_JUNGSEONG = 28;\n\n// KS X 1001:1998 Annex 3 make-up sequence (A4D4 A4xx A4yy A4zz) at `index`:\n// the syllable, or null when invalid.\nfunction eucKrJamo(bytes: Uint8Array, index: number): number | null {\n if (\n bytes[index + 2] !== EUC_KR_JAMO_LEAD ||\n bytes[index + 4] !== EUC_KR_JAMO_LEAD ||\n bytes[index + 6] !== EUC_KR_JAMO_LEAD\n ) {\n return null;\n }\n const choByte = bytes[index + 3] ?? 0;\n const jungByte = bytes[index + 5] ?? 0;\n const jongByte = bytes[index + 7] ?? 0;\n const cho =\n choByte >= 0xa1 && choByte <= 0xbe\n ? (PY_EUC_KR_JAMO.choseong[choByte - 0xa1] ?? -1)\n : -1;\n const jung = jungByte >= 0xbf && jungByte <= 0xd3 ? jungByte - 0xbf : -1;\n let jong = -1;\n if (jongByte === EUC_KR_JAMO_FILLER) {\n jong = 0;\n } else if (jongByte >= 0xa1 && jongByte <= 0xbe) {\n jong = PY_EUC_KR_JAMO.jongseong[jongByte - 0xa1] ?? -1;\n }\n if (cho < 0 || jung < 0 || jong < 0) {\n return null;\n }\n return (\n HANGUL_FIRST +\n cho * SYLLABLES_PER_CHOSEONG +\n jung * SYLLABLES_PER_JUNGSEONG +\n jong\n );\n}\n\nconst GB18030_BMP_SEQUENCES = 39_420;\nconst GB18030_FIRST_SUPPLEMENTARY_LEAD = 15;\n\n// GB18030 four-byte sequence at `index` (second byte already 0x30-0x39):\n// the code point, or null when invalid.\nfunction gb18030FourBytes(bytes: Uint8Array, index: number): number | null {\n const b1 = bytes[index] ?? 0;\n const b3 = bytes[index + 2] ?? 0;\n const b4 = bytes[index + 3] ?? 0;\n if (\n b1 < 0x81 ||\n b1 > 0xfe ||\n b3 < 0x81 ||\n b3 > 0xfe ||\n b4 < 0x30 ||\n b4 > 0x39\n ) {\n return null;\n }\n const c1 = b1 - 0x81;\n const c2 = (bytes[index + 1] ?? 0) - 0x30;\n const c3 = b3 - 0x81;\n const c4 = b4 - 0x30;\n if (c1 < 4) {\n const linear = (c1 * 10 + c2) * 1260 + c3 * 10 + c4;\n if (linear >= GB18030_BMP_SEQUENCES) {\n return null;\n }\n // Last range starting at or before `linear`.\n let low = 0;\n let high = PY_GB18030_RANGES.length - 1;\n while (low < high) {\n const middle = (low + high + 1) >> 1;\n if ((PY_GB18030_RANGES[middle]?.[0] ?? 0) <= linear) {\n low = middle;\n } else {\n high = middle - 1;\n }\n }\n const [start = 0, first = 0] = PY_GB18030_RANGES[low] ?? [];\n return first + linear - start;\n }\n if (c1 >= GB18030_FIRST_SUPPLEMENTARY_LEAD) {\n const code =\n 0x10000 +\n ((c1 - GB18030_FIRST_SUPPLEMENTARY_LEAD) * 10 + c2) * 1260 +\n c3 * 10 +\n c4;\n return code <= 0x10ffff ? code : null;\n }\n return null;\n}\n\n/**\n * Bytes a lead byte needs (counting itself), as CPython's decoder checks\n * them with `REQUIRE_INBUF`.\n */\nfunction sequenceWidth(\n codec: string,\n bytes: Uint8Array,\n index: number,\n): number {\n const byte = bytes[index] ?? 0;\n if (codec === 'euc_jp' && byte === EUC_JP_SS3) {\n return 3;\n }\n if (codec === 'gb18030') {\n const second = bytes[index + 1];\n if (second !== undefined && second >= 0x30 && second <= 0x39) {\n return 4;\n }\n }\n if (\n codec === 'euc_kr' &&\n byte === EUC_KR_JAMO_LEAD &&\n bytes[index + 1] === EUC_KR_JAMO_FILLER\n ) {\n return EUC_KR_SEQUENCE;\n }\n return 2;\n}\n\n// shift_jis rejects these lead bytes without looking at the next byte.\nfunction isShiftJisLead(byte: number): boolean {\n return (byte >= 0x81 && byte <= 0x9f) || (byte >= 0xe0 && byte <= 0xea);\n}\n\n/** Python's table-driven CJK codecs (big5, gbk, euc_kr, shift_jis...). */\nfunction decodeMultibyte(context: ErrorContext): string {\n const { bytes, codec } = context;\n const table = multibyteTable(codec);\n const output = new TextBuilder();\n let index = 0;\n while (index < bytes.length) {\n const byte = bytes[index] ?? 0;\n if (byte < ASCII_LIMIT) {\n index = copyAscii(bytes, index, output);\n continue;\n }\n const single = table.single[byte - ASCII_LIMIT] ?? INVALID;\n if (single !== INVALID) {\n output.codePoint(single);\n index += 1;\n continue;\n }\n if (codec === 'shift_jis' && !isShiftJisLead(byte)) {\n index = decodeError(output, context, index, index + 1, ILLEGAL);\n continue;\n }\n const width = sequenceWidth(codec, bytes, index);\n if (index + width > bytes.length) {\n index = decodeError(output, context, index, bytes.length, INCOMPLETE);\n continue;\n }\n const trail = bytes[index + 1] ?? 0;\n let code: number | null = null;\n if (width === 2) {\n code = lookupPair(table, byte, trail);\n } else if (width === 3) {\n const third = bytes[index + 2] ?? 0;\n code =\n trail < ASCII_LIMIT\n ? INVALID\n : (table.triples?.[((trail - 0x80) << 8) | third] ?? INVALID);\n } else if (width === 4) {\n code = gb18030FourBytes(bytes, index);\n } else {\n code = eucKrJamo(bytes, index);\n }\n if (code === null || code === INVALID) {\n index = decodeError(output, context, index, index + 1, ILLEGAL);\n continue;\n }\n emit(output, table, code, (byte << 8) | trail);\n index += width;\n }\n return output.toString();\n}\n\n// ISO-2022 (CPython's _codecs_iso2022.c), for the JIS X 0208/0212/0201\n// variants. Character sets are named by their final byte, with 0x80 added\n// for double-byte sets.\nconst ESC = 0x1b;\nconst LF = 0x0a;\nconst SPACE = 0x20;\nconst MAX_ESCAPE_LENGTH = 16;\nconst DBCS = 0x80;\nconst CHARSET_ASCII = 0x42; // 'B'\nconst JISX0208 = 0x42 | DBCS;\nconst JISX0208_OLD = 0x40 | DBCS; // '@'\nconst JISX0212 = 0x44 | DBCS; // 'D'\nconst JISX0201_ROMAN = 0x4a; // 'J'\nconst JISX0201_KATAKANA = 0x49; // 'I'\n\nconst ISO2022_CHARSETS: Readonly<Record<string, readonly number[]>> = {\n iso2022_jp: [JISX0208, JISX0201_ROMAN, JISX0208_OLD],\n iso2022_jp_1: [JISX0208, JISX0212, JISX0201_ROMAN, JISX0208_OLD],\n iso2022_jp_ext: [\n JISX0208,\n JISX0212,\n JISX0201_ROMAN,\n JISX0201_KATAKANA,\n JISX0208_OLD,\n ],\n};\n\nfunction isEscapeEnd(byte: number): boolean {\n return (byte >= 0x41 && byte <= 0x5a) || byte === 0x40;\n}\n\nfunction isIso2022Escape(byte: number | undefined): boolean {\n // ( ) $ . &\n return (\n byte === 0x28 ||\n byte === 0x29 ||\n byte === 0x24 ||\n byte === 0x2e ||\n byte === 0x26\n );\n}\n\ninterface Iso2022State {\n /** G0 and G1 designations. */\n g: [number, number];\n}\n\n/** `iso2022processesc()`: 0 on success, -1 for too few bytes, or the error length. */\nfunction processEscape(\n bytes: Uint8Array,\n index: number,\n charsets: readonly number[],\n state: Iso2022State,\n): { result: number; length: number } {\n const left = bytes.length - index;\n let length = 0;\n let position = 1;\n for (; position < MAX_ESCAPE_LENGTH; position += 1) {\n if (position >= left) {\n return { result: -1, length: 0 };\n }\n const byte = bytes[index + position] ?? 0;\n if (isEscapeEnd(byte)) {\n length = position + 1;\n break;\n }\n // USE_JISX0208_EXT: skip \"&@\" (JIS X 0208-1990 announcer).\n if (\n position + 1 < left &&\n byte === 0x26 &&\n bytes[index + position + 1] === 0x40\n ) {\n position += 2;\n }\n }\n if (position >= MAX_ESCAPE_LENGTH) {\n return { result: 1, length: 0 };\n }\n const second = bytes[index + 1] ?? 0;\n const third = bytes[index + 2] ?? 0;\n let charset: number;\n let designation: 0 | 1;\n switch (length) {\n case 3:\n if (second === 0x24) {\n charset = third | DBCS;\n designation = 0;\n } else if (second === 0x28 || second === 0x29) {\n charset = third;\n designation = second === 0x28 ? 0 : 1;\n } else {\n return { result: 3, length: 0 };\n }\n break;\n case 4: {\n if (second !== 0x24) {\n return { result: 4, length: 0 };\n }\n charset = (bytes[index + 3] ?? 0) | DBCS;\n if (third === 0x28 || third === 0x29) {\n designation = third === 0x28 ? 0 : 1;\n } else {\n return { result: 4, length: 0 };\n }\n break;\n }\n case 6:\n if (\n bytes[index + 3] === ESC &&\n bytes[index + 4] === 0x24 &&\n bytes[index + 5] === 0x42\n ) {\n charset = JISX0208;\n designation = 0;\n } else {\n return { result: 6, length: 0 };\n }\n break;\n default:\n return { result: length, length: 0 };\n }\n if (charset !== CHARSET_ASCII && !charsets.includes(charset)) {\n return { result: length, length: 0 };\n }\n state.g[designation] = charset;\n return { result: 0, length };\n}\n\nfunction inJisRange(byte: number): boolean {\n return byte >= 0x21 && byte <= 0x7e;\n}\n\n// One character of a designated set: the code point, or INVALID.\nfunction iso2022Char(\n charset: number,\n first: number,\n second: number,\n eucJp: MultibyteTable,\n): number {\n switch (charset) {\n case JISX0201_ROMAN:\n if (first === 0x5c) {\n return 0xa5;\n }\n if (first === 0x7e) {\n return 0x203e;\n }\n return first;\n case JISX0201_KATAKANA:\n return first >= 0x21 && first <= 0x5f ? 0xff40 + first : INVALID;\n case JISX0212:\n return inJisRange(first) && inJisRange(second)\n ? (eucJp.triples?.[(first << 8) | (second | DBCS)] ?? INVALID)\n : INVALID;\n default:\n // JIS X 0208 (both designations), as EUC-JP stores it.\n return inJisRange(first) && inJisRange(second)\n ? lookupPair(eucJp, first | DBCS, second | DBCS)\n : INVALID;\n }\n}\n\nfunction decodeIso2022(context: ErrorContext): string {\n const { bytes } = context;\n const charsets = ISO2022_CHARSETS[context.codec] ?? [];\n const eucJp = multibyteTable('euc_jp');\n const state: Iso2022State = { g: [CHARSET_ASCII, CHARSET_ASCII] };\n const output = new TextBuilder();\n let escapeThroughout = false;\n let index = 0;\n const fail = (length: number, reason = ILLEGAL): void => {\n const end = reason === INCOMPLETE ? bytes.length : index + length;\n index = decodeError(output, context, index, end, reason);\n };\n while (index < bytes.length) {\n const byte = bytes[index] ?? 0;\n if (escapeThroughout) {\n // Not an ISO-2022 escape: copied through up to its final byte.\n output.unit(byte);\n index += 1;\n if (isEscapeEnd(byte)) {\n escapeThroughout = false;\n }\n continue;\n }\n if (byte === ESC) {\n if (index + 1 >= bytes.length) {\n fail(0, INCOMPLETE);\n continue;\n }\n if (isIso2022Escape(bytes[index + 1])) {\n const { result, length } = processEscape(bytes, index, charsets, state);\n if (result === -1) {\n fail(0, INCOMPLETE);\n } else if (result > 0) {\n fail(result);\n } else {\n index += length;\n }\n continue;\n }\n output.unit(ESC);\n escapeThroughout = true;\n index += 1;\n continue;\n }\n if (byte < SPACE || byte === LF) {\n // C0 controls pass through (SI/SO too: these variants don't shift).\n output.unit(byte);\n index += 1;\n continue;\n }\n if (byte >= ASCII_LIMIT) {\n fail(1);\n continue;\n }\n const charset = state.g[0];\n if (charset === CHARSET_ASCII) {\n index = copyIso2022Ascii(bytes, index, output);\n continue;\n }\n const width = charset & DBCS ? 2 : 1;\n if (index + width > bytes.length) {\n fail(0, INCOMPLETE);\n continue;\n }\n const code = iso2022Char(charset, byte, bytes[index + 1] ?? 0, eucJp);\n if (code === INVALID) {\n fail(width);\n continue;\n }\n output.codePoint(code);\n index += width;\n }\n return output.toString();\n}\n\n// Printable ASCII in the ASCII set (stops at ESC and controls).\nfunction copyIso2022Ascii(\n bytes: Uint8Array,\n start: number,\n output: TextBuilder,\n): number {\n let end = start;\n while (end < bytes.length) {\n const byte = bytes[end] ?? 0;\n if (byte < SPACE || byte >= ASCII_LIMIT) {\n break;\n }\n end += 1;\n }\n output.latin1(bytes.subarray(start, end));\n return end;\n}\n\nconst TILDE = 0x7e;\n\n/** CPython's `hz` codec (GB2312 between `~{` and `~}`). */\nfunction decodeHz(context: ErrorContext): string {\n const { bytes } = context;\n const gb2312 = multibyteTable('gb2312');\n const output = new TextBuilder();\n let gbMode = false;\n let index = 0;\n while (index < bytes.length) {\n const byte = bytes[index] ?? 0;\n if (byte === TILDE) {\n const next = bytes[index + 1];\n if (next === undefined) {\n index = decodeError(output, context, index, bytes.length, INCOMPLETE);\n continue;\n }\n if (next === TILDE && !gbMode) {\n output.unit(TILDE);\n } else if (next === 0x7b && !gbMode) {\n gbMode = true;\n } else if (next === LF && !gbMode) {\n // line continuation\n } else if (next === 0x7d && gbMode) {\n gbMode = false;\n } else {\n index = decodeError(output, context, index, index + 1, ILLEGAL);\n continue;\n }\n index += 2;\n continue;\n }\n if (byte >= ASCII_LIMIT) {\n index = decodeError(output, context, index, index + 1, ILLEGAL);\n continue;\n }\n if (!gbMode) {\n output.unit(byte);\n index += 1;\n continue;\n }\n const second = bytes[index + 1];\n if (second === undefined) {\n index = decodeError(output, context, index, bytes.length, INCOMPLETE);\n continue;\n }\n const code =\n inJisRange(byte) && inJisRange(second)\n ? lookupPair(gb2312, byte | DBCS, second | DBCS)\n : INVALID;\n if (code === INVALID) {\n index = decodeError(output, context, index, index + 1, ILLEGAL);\n continue;\n }\n output.codePoint(code);\n index += 2;\n }\n return output.toString();\n}\n\n/**\n * Decode with one of CPython's CJK codecs, or return undefined when the\n * codec isn't one of them.\n */\nexport function decodeCjk(context: ErrorContext): string | undefined {\n if (Object.hasOwn(PY_MULTIBYTE_TABLES, context.codec)) {\n return decodeMultibyte(context);\n }\n if (Object.hasOwn(ISO2022_CHARSETS, context.codec)) {\n return decodeIso2022(context);\n }\n if (context.codec === 'hz') {\n return decodeHz(context);\n }\n return undefined;\n}\n","// Python codec semantics for decoding and encoding email text.\n//\n// mail-parser and Python's `email` package decode bytes with Python's codecs\n// (`bytes.decode(charset, errors)`), and fall back when the codec is unknown\n// (`LookupError`) or the bytes are invalid (`UnicodeError`). Matching their\n// output needs the same codec names, the same tables and the same error\n// handlers, which WHATWG `TextDecoder` does not provide: there `iso-8859-1`\n// and `ascii` are windows-1252 and never fail, and its CJK tables differ\n// between Node and Bun. So:\n//\n// - names resolve through Python's alias table and `normalize_encoding()`;\n// - UTF-7/8/16/32, ASCII, Latin-1 and raw-unicode-escape are implemented\n// here, and the single-byte codecs use CPython's own tables;\n// - the CJK codecs (big5, cp950, big5hkscs, gb2312, gbk, gb18030, hz,\n// euc_kr, cp949, euc_jp, shift_jis, cp932, iso2022_jp, iso2022_jp_1,\n// iso2022_jp_ext) are ports of CPython's decoders with its tables\n// (py-codecs-cjk.ts);\n// - the JIS X 0213 codecs (euc_jis_2004, euc_jisx0213, shift_jis_2004,\n// shift_jisx0213, iso2022_jp_2004, iso2022_jp_3) and iso2022_jp_2 are\n// approximated with `TextDecoder`.\n//\n// Codecs that are none of these (iso2022_kr, johab, idna, punycode,\n// unicode_escape) raise `LookupError`, as if Python did not know them.\n//\n// Valid input takes fast paths (TextDecoder for UTF-8, bulk conversion for\n// ASCII/Latin-1/charmaps); the exact per-byte loops run only when there is\n// something to report.\n\nimport {\n ASCII_LIMIT,\n type CodecErrors,\n decodeError,\n type ErrorContext,\n LATIN1_LIMIT,\n LookupError,\n REPLACEMENT,\n TextBuilder,\n UnicodeDecodeError,\n UnicodeEncodeError,\n UnicodeError,\n unitsToString,\n bmpUnitsToString,\n} from './py-codecs-base';\nimport { decodeCjk } from './py-codecs-cjk';\nimport {\n PY_CHARMAP_TABLES,\n PY_CODEC_ALIASES,\n PY_TEXT_CODECS,\n} from './py-codecs-data';\n\nexport {\n type CodecErrors,\n LookupError,\n UnicodeDecodeError,\n UnicodeEncodeError,\n UnicodeError,\n} from './py-codecs-base';\n\nconst NON_TEXT_CODECS: ReadonlySet<string> = new Set([\n 'base64',\n 'base_64',\n 'base64_codec',\n 'bz2',\n 'bz2_codec',\n 'hex',\n 'hex_codec',\n 'qp',\n 'quopri',\n 'quopri_codec',\n 'quoted_printable',\n 'quotedprintable',\n 'rot13',\n 'rot_13',\n 'uu',\n 'uu_codec',\n 'zip',\n 'zlib',\n 'zlib_codec',\n]);\n\n/** Python's `ValueError(\"embedded null character\")` for a codec name with NUL. */\nexport class EmbeddedNullError extends Error {\n override name = 'ValueError';\n\n constructor() {\n super('embedded null character');\n }\n}\n\nconst TEXT_CODECS: ReadonlySet<string> = new Set(PY_TEXT_CODECS);\n\n// Python codecs without a port, approximated with these WHATWG labels.\nconst WHATWG_CODECS: Readonly<Record<string, string>> = {\n euc_jis_2004: 'euc-jp',\n euc_jisx0213: 'euc-jp',\n iso2022_jp_2: 'iso-2022-jp',\n iso2022_jp_2004: 'iso-2022-jp',\n iso2022_jp_3: 'iso-2022-jp',\n shift_jis_2004: 'shift_jis',\n shift_jisx0213: 'shift_jis',\n};\n\nconst UNDEFINED_MARK = 0xfffe;\nconst NAME_CHAR = /^[\\p{L}\\p{N}.]$/u;\n\n/** Python's `encodings.normalize_encoding()` (after lowercasing). */\nexport function normalizeEncoding(encoding: string): string {\n let output = '';\n let punct = false;\n for (const char of encoding.toLowerCase()) {\n if (NAME_CHAR.test(char)) {\n if (punct && output.length > 0) {\n output += '_';\n }\n if (char.charCodeAt(0) < ASCII_LIMIT) {\n output += char;\n }\n punct = false;\n } else {\n punct = true;\n }\n }\n return output;\n}\n\n/**\n * Resolve a codec name like `codecs.lookup()`, returning Python's module\n * name (`utf_8`, `iso8859_15`, ...). Throws {@link LookupError} for unknown\n * names and for non-text codecs (`base64`, `rot13`...).\n */\nexport function lookupCodec(encoding: string): string {\n // Python rejects the name before looking it up (`bytes.decode`,\n // `str.encode`, `str(b, enc)` and `codecs.lookup` all parse it as a C\n // string), so mail-parser's LookupError fallback never sees it.\n if (encoding.includes('\\0')) {\n throw new EmbeddedNullError();\n }\n const normalized = normalizeEncoding(encoding);\n if (NON_TEXT_CODECS.has(normalized)) {\n throw new LookupError(\n `'${encoding}' is not a text encoding; use codecs.decode() to handle arbitrary codecs`,\n );\n }\n if (normalized === 'cp65001') {\n return 'utf_8';\n }\n const aliased =\n PY_CODEC_ALIASES[normalized] ??\n PY_CODEC_ALIASES[normalized.replaceAll('.', '_')];\n for (const candidate of [aliased, normalized]) {\n if (candidate !== undefined && TEXT_CODECS.has(candidate)) {\n return candidate;\n }\n }\n throw new LookupError(`unknown encoding: ${encoding}`);\n}\n\nconst UTF8_STRICT = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });\nconst UTF8_LENIENT = new TextDecoder('utf-8', { ignoreBOM: true });\n\n/** Index of the first byte at or above `limit` from `start`, or the length. */\nfunction firstAtLeast(bytes: Uint8Array, limit: number, start = 0): number {\n for (let index = start; index < bytes.length; index += 1) {\n if ((bytes[index] ?? 0) >= limit) {\n return index;\n }\n }\n return bytes.length;\n}\n\nfunction decodeAscii(context: ErrorContext): string {\n const { bytes } = context;\n let invalid = firstAtLeast(bytes, ASCII_LIMIT);\n if (invalid === bytes.length) {\n return unitsToString(bytes);\n }\n const output = new TextBuilder();\n let start = 0;\n while (invalid < bytes.length) {\n output.latin1(bytes.subarray(start, invalid));\n start = decodeError(\n output,\n context,\n invalid,\n invalid + 1,\n 'ordinal not in range(128)',\n );\n invalid = firstAtLeast(bytes, ASCII_LIMIT, start);\n }\n output.latin1(bytes.subarray(start));\n return output.toString();\n}\n\nconst UTF8_ERRORS = [\n 'invalid start byte',\n 'unexpected end of data',\n 'invalid continuation byte',\n] as const;\n\n/**\n * Length of the valid UTF-8 sequence at `index`; for an invalid one,\n * `-(length * 4 + reason)` with `reason` an index into UTF8_ERRORS (no\n * allocation: this runs once per invalid byte).\n */\nfunction utf8Sequence(bytes: Uint8Array, index: number): number {\n const byte = bytes[index] ?? 0;\n let needed: number;\n let lower = 0x80;\n let upper = 0xbf;\n if (byte >= 0xc2 && byte <= 0xdf) {\n needed = 1;\n } else if (byte >= 0xe0 && byte <= 0xef) {\n needed = 2;\n lower = byte === 0xe0 ? 0xa0 : 0x80;\n upper = byte === 0xed ? 0x9f : 0xbf;\n } else if (byte >= 0xf0 && byte <= 0xf4) {\n needed = 3;\n lower = byte === 0xf0 ? 0x90 : 0x80;\n upper = byte === 0xf4 ? 0x8f : 0xbf;\n } else {\n return -4;\n }\n for (let offset = 1; offset <= needed; offset += 1) {\n const next = bytes[index + offset];\n if (next === undefined) {\n return -(offset * 4 + 1);\n }\n const min = offset === 1 ? lower : 0x80;\n const max = offset === 1 ? upper : 0xbf;\n if (next < min || next > max) {\n return -(offset * 4 + 2);\n }\n }\n return needed + 1;\n}\n\n// UTF-8 as CPython decodes it: one error per maximal invalid subpart. Valid\n// runs are decoded in bulk with TextDecoder.\nfunction decodeUtf8(context: ErrorContext, start = 0): string {\n const { bytes } = context;\n const input = start === 0 ? bytes : bytes.subarray(start);\n try {\n return UTF8_STRICT.decode(input);\n } catch {\n // Invalid somewhere: report it exactly below.\n }\n const output = new TextBuilder();\n let runStart = start;\n let index = start;\n while (index < bytes.length) {\n if ((bytes[index] ?? 0) < ASCII_LIMIT) {\n index += 1;\n continue;\n }\n const sequence = utf8Sequence(bytes, index);\n if (sequence > 0) {\n index += sequence;\n continue;\n }\n if (runStart < index) {\n output.text(UTF8_LENIENT.decode(bytes.subarray(runStart, index)));\n }\n const length = -sequence >> 2;\n const reason = UTF8_ERRORS[-sequence & 3] ?? '';\n index = decodeError(output, context, index, index + length, reason);\n runStart = index;\n }\n if (runStart < bytes.length) {\n output.text(UTF8_LENIENT.decode(bytes.subarray(runStart)));\n }\n return output.toString();\n}\n\n// Python names UTF-16/32 errors after the byte order in use.\nfunction withByteOrder(\n context: ErrorContext,\n bits: 16 | 32,\n little: boolean,\n): ErrorContext {\n return { ...context, codec: `utf_${bits}_${little ? 'le' : 'be'}` };\n}\n\nfunction decodeUtf16(\n input: ErrorContext,\n littleEndian: boolean | null,\n): string {\n const { bytes } = input;\n let start = 0;\n let little = littleEndian ?? true;\n if (littleEndian === null && bytes.length >= 2) {\n if (bytes[0] === 0xff && bytes[1] === 0xfe) {\n start = 2;\n } else if (bytes[0] === 0xfe && bytes[1] === 0xff) {\n start = 2;\n little = false;\n }\n }\n const context = withByteOrder(input, 16, little);\n const output = new TextBuilder();\n let index = start;\n while (index < bytes.length) {\n if (index + 1 >= bytes.length) {\n index = decodeError(\n output,\n context,\n index,\n bytes.length,\n 'truncated data',\n );\n continue;\n }\n const first = bytes[index] ?? 0;\n const second = bytes[index + 1] ?? 0;\n const unit = little ? first | (second << 8) : (first << 8) | second;\n if (unit >= 0xd800 && unit <= 0xdbff) {\n const third = bytes[index + 2];\n const fourth = bytes[index + 3];\n if (third === undefined || fourth === undefined) {\n index = decodeError(\n output,\n context,\n index,\n bytes.length,\n 'unexpected end of data',\n );\n continue;\n }\n const low = little ? third | (fourth << 8) : (third << 8) | fourth;\n if (low >= 0xdc00 && low <= 0xdfff) {\n output.unit(unit);\n output.unit(low);\n index += 4;\n continue;\n }\n index = decodeError(\n output,\n context,\n index,\n index + 2,\n 'illegal UTF-16 surrogate',\n );\n continue;\n }\n if (unit >= 0xdc00 && unit <= 0xdfff) {\n index = decodeError(\n output,\n context,\n index,\n index + 2,\n 'illegal encoding',\n );\n continue;\n }\n output.unit(unit);\n index += 2;\n }\n return output.toString();\n}\n\nfunction decodeUtf32(\n input: ErrorContext,\n littleEndian: boolean | null,\n): string {\n const { bytes } = input;\n let start = 0;\n let little = littleEndian ?? true;\n if (littleEndian === null && bytes.length >= 4) {\n const bom = Array.from(bytes.subarray(0, 4)).join(',');\n if (bom === '255,254,0,0') {\n start = 4;\n } else if (bom === '0,0,254,255') {\n start = 4;\n little = false;\n }\n }\n const context = withByteOrder(input, 32, little);\n const output = new TextBuilder();\n let index = start;\n while (index < bytes.length) {\n if (index + 3 >= bytes.length) {\n index = decodeError(\n output,\n context,\n index,\n bytes.length,\n 'truncated data',\n );\n continue;\n }\n const b0 = bytes[index] ?? 0;\n const b1 = bytes[index + 1] ?? 0;\n const b2 = bytes[index + 2] ?? 0;\n const b3 = bytes[index + 3] ?? 0;\n const code = little\n ? (b0 | (b1 << 8) | (b2 << 16) | (b3 << 24)) >>> 0\n : ((b0 << 24) | (b1 << 16) | (b2 << 8) | b3) >>> 0;\n if (code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff)) {\n index = decodeError(\n output,\n context,\n index,\n index + 4,\n code > 0x10ffff\n ? 'code point not in range(0x110000)'\n : 'code point in surrogate code point range(0xd800, 0xe000)',\n );\n continue;\n }\n output.codePoint(code);\n index += 4;\n }\n return output.toString();\n}\n\n// UTF-7 (RFC 2152), ported from CPython's PyUnicode_DecodeUTF7Stateful.\nconst PLUS = 0x2b;\nconst MINUS = 0x2d;\n\nfunction base64Value(byte: number): number {\n if (byte >= 0x41 && byte <= 0x5a) {\n return byte - 0x41;\n }\n if (byte >= 0x61 && byte <= 0x7a) {\n return byte - 0x61 + 26;\n }\n if (byte >= 0x30 && byte <= 0x39) {\n return byte - 0x30 + 52;\n }\n if (byte === PLUS) {\n return 62;\n }\n if (byte === 0x2f) {\n return 63;\n }\n return -1;\n}\n\nfunction decodesDirect(byte: number): boolean {\n return byte < ASCII_LIMIT && byte !== PLUS;\n}\n\nfunction isHighSurrogate(unit: number): boolean {\n return unit >= 0xd800 && unit <= 0xdbff;\n}\n\nfunction isLowSurrogate(unit: number): boolean {\n return unit >= 0xdc00 && unit <= 0xdfff;\n}\n\ninterface Utf7State {\n inShift: boolean;\n bits: number;\n buffer: number;\n surrogate: number;\n /** Where the current shift sequence (its `+`) starts. */\n shiftStart: number;\n}\n\n// One base-64 character of a shift sequence.\nfunction utf7ShiftByte(\n state: Utf7State,\n value: number,\n output: TextBuilder,\n): void {\n state.buffer = (state.buffer << 6) | value;\n state.bits += 6;\n if (state.bits < 16) {\n return;\n }\n const unit = state.buffer >>> (state.bits - 16);\n state.bits -= 16;\n state.buffer &= (1 << state.bits) - 1;\n if (state.surrogate !== 0) {\n if (isLowSurrogate(unit)) {\n output.unit(state.surrogate);\n output.unit(unit);\n state.surrogate = 0;\n return;\n }\n output.unit(state.surrogate);\n state.surrogate = 0;\n }\n if (isHighSurrogate(unit)) {\n state.surrogate = unit;\n } else {\n output.unit(unit);\n }\n}\n\n// The end of a base-64 section at `index` (a byte that isn't base 64):\n// returns where decoding continues.\nfunction leaveUtf7Shift(\n context: ErrorContext,\n state: Utf7State,\n index: number,\n output: TextBuilder,\n): number {\n const byte = context.bytes[index] ?? 0;\n state.inShift = false;\n if (state.bits >= 6) {\n return decodeError(\n output,\n context,\n state.shiftStart,\n index + 1,\n 'partial character in shift sequence',\n );\n }\n if (state.bits > 0 && state.buffer !== 0) {\n return decodeError(\n output,\n context,\n state.shiftStart,\n index + 1,\n 'non-zero padding bits in shift sequence',\n );\n }\n if (state.surrogate !== 0 && decodesDirect(byte)) {\n output.unit(state.surrogate);\n }\n state.surrogate = 0;\n // '-' is absorbed; other terminating characters are kept.\n return byte === MINUS ? index + 1 : index;\n}\n\nfunction decodeUtf7(context: ErrorContext): string {\n const { bytes } = context;\n const output = new TextBuilder();\n const state: Utf7State = {\n inShift: false,\n bits: 0,\n buffer: 0,\n surrogate: 0,\n shiftStart: 0,\n };\n let index = 0;\n for (;;) {\n while (index < bytes.length) {\n const byte = bytes[index] ?? 0;\n if (state.inShift) {\n const value = base64Value(byte);\n if (value >= 0) {\n index += 1;\n utf7ShiftByte(state, value, output);\n } else {\n index = leaveUtf7Shift(context, state, index, output);\n }\n continue;\n }\n if (byte === PLUS) {\n const next = bytes[index + 1];\n if (next === MINUS) {\n output.unit(PLUS);\n index += 2;\n } else if (next !== undefined && base64Value(next) < 0) {\n index = decodeError(\n output,\n context,\n index,\n index + 2,\n 'ill-formed sequence',\n );\n } else {\n state.inShift = true;\n state.surrogate = 0;\n state.bits = 0;\n state.buffer = 0;\n state.shiftStart = index;\n index += 1;\n }\n continue;\n }\n if (decodesDirect(byte)) {\n let end = index + 1;\n while (end < bytes.length && decodesDirect(bytes[end] ?? 0)) {\n end += 1;\n }\n output.latin1(bytes.subarray(index, end));\n index = end;\n continue;\n }\n index = decodeError(\n output,\n context,\n index,\n index + 1,\n 'unexpected special character',\n );\n }\n const unterminated =\n state.inShift &&\n (state.surrogate !== 0 ||\n state.bits >= 6 ||\n (state.bits > 0 && state.buffer !== 0));\n state.inShift = false;\n if (!unterminated) {\n break;\n }\n index = decodeError(\n output,\n context,\n state.shiftStart,\n bytes.length,\n 'unterminated shift sequence',\n );\n if (index >= bytes.length) {\n break;\n }\n }\n return output.toString();\n}\n\nconst HEX_DIGIT = /^[0-9a-fA-F]$/u;\n\nfunction decodeRawUnicodeEscape(context: ErrorContext): string {\n const { bytes } = context;\n const output = new TextBuilder();\n let index = 0;\n while (index < bytes.length) {\n const byte = bytes[index] ?? 0;\n if (byte !== 0x5c) {\n let end = index + 1;\n while (end < bytes.length && bytes[end] !== 0x5c) {\n end += 1;\n }\n output.latin1(bytes.subarray(index, end));\n index = end;\n continue;\n }\n // Only an odd run of backslashes before `u`/`U` starts an escape.\n let run = 0;\n while (bytes[index + run] === 0x5c) {\n run += 1;\n }\n const next = bytes[index + run];\n if (run % 2 === 0 || (next !== 0x75 && next !== 0x55)) {\n output.text('\\\\'.repeat(run));\n index += run;\n continue;\n }\n output.text('\\\\'.repeat(run - 1));\n const escapeStart = index + run - 1;\n const digits = next === 0x75 ? 4 : 8;\n let hex = '';\n let position = escapeStart + 2;\n while (\n hex.length < digits &&\n HEX_DIGIT.test(String.fromCharCode(bytes[position] ?? 0))\n ) {\n hex += String.fromCharCode(bytes[position] ?? 0);\n position += 1;\n }\n const code = hex.length < digits ? -1 : Number.parseInt(hex, 16);\n if (code === -1) {\n index = decodeError(\n output,\n context,\n escapeStart,\n position,\n `truncated \\\\${next === 0x75 ? 'u' : 'U'}XXXX escape`,\n );\n } else if (code > 0x10ffff) {\n index = decodeError(\n output,\n context,\n escapeStart,\n position,\n '\\\\Uxxxxxxxx out of range',\n );\n } else {\n output.codePoint(code);\n index = position;\n }\n }\n return output.toString();\n}\n\nconst CHARMAP_CACHE = new Map<string, Uint16Array>();\n\n// A charmap table as 256 code units (U+FFFE where undefined).\nfunction charmapUnits(codec: string, table: string): Uint16Array {\n let units = CHARMAP_CACHE.get(codec);\n if (units === undefined) {\n units = new Uint16Array(LATIN1_LIMIT);\n const offset = table.length === LATIN1_LIMIT ? 0 : ASCII_LIMIT;\n for (let byte = 0; byte < offset; byte += 1) {\n units[byte] = byte;\n }\n for (let index = 0; index < table.length; index += 1) {\n units[offset + index] = table.charCodeAt(index);\n }\n CHARMAP_CACHE.set(codec, units);\n }\n return units;\n}\n\nfunction decodeCharmap(input: ErrorContext, table: string): string {\n const units = charmapUnits(input.codec, table);\n // Python reports these errors as the 'charmap' codec's.\n const context = { ...input, codec: 'charmap' };\n const { bytes } = context;\n // Fast path: map every byte into one array, up to the first undefined one.\n const mapped = new Uint16Array(bytes.length);\n let index = 0;\n for (; index < bytes.length; index += 1) {\n const unit = units[bytes[index] ?? 0] ?? UNDEFINED_MARK;\n if (unit === UNDEFINED_MARK) {\n break;\n }\n mapped[index] = unit;\n }\n if (index === bytes.length) {\n return bmpUnitsToString(mapped);\n }\n const output = new TextBuilder();\n output.text(bmpUnitsToString(mapped.subarray(0, index)));\n while (index < bytes.length) {\n const unit = units[bytes[index] ?? 0] ?? UNDEFINED_MARK;\n if (unit === UNDEFINED_MARK) {\n index = decodeError(\n output,\n context,\n index,\n index + 1,\n 'character maps to <undefined>',\n );\n } else {\n output.unit(unit);\n index += 1;\n }\n }\n return output.toString();\n}\n\nconst ESC = 0x1b;\nconst ISO2022_ESCAPES: ReadonlySet<string> = new Set([\n '(B',\n '(J',\n '(I',\n '$@',\n '$B',\n]);\n\nfunction isIso2022Escape(bytes: Uint8Array, index: number): boolean {\n return (\n bytes[index] === ESC &&\n ISO2022_ESCAPES.has(\n String.fromCharCode(bytes[index + 1] ?? 0, bytes[index + 2] ?? 0),\n )\n );\n}\n\n// WHATWG's iso-2022-jp decoder rejects an escape sequence directly followed\n// by another one (as when two encoded words are joined); Python accepts it.\n// The first sequence has no effect, so drop it.\nfunction dropRedundantEscapes(bytes: Uint8Array): Uint8Array {\n const output = new Uint8Array(bytes.length);\n let length = 0;\n for (let index = 0; index < bytes.length; index += 1) {\n if (isIso2022Escape(bytes, index) && isIso2022Escape(bytes, index + 3)) {\n index += 2;\n continue;\n }\n output[length] = bytes[index] ?? 0;\n length += 1;\n }\n return output.subarray(0, length);\n}\n\n// Approximation for the codecs without a port (see WHATWG_CODECS).\nfunction decodeWhatwg(context: ErrorContext, label: string): string {\n const bytes =\n label === 'iso-2022-jp'\n ? dropRedundantEscapes(context.bytes)\n : context.bytes;\n if (context.errors === 'strict') {\n try {\n return new TextDecoder(label, { fatal: true, ignoreBOM: true }).decode(\n bytes,\n );\n } catch {\n throw new UnicodeDecodeError(\n `'${context.codec}' codec can't decode bytes: illegal multibyte sequence`,\n );\n }\n }\n const text = new TextDecoder(label, { ignoreBOM: true }).decode(bytes);\n // WHATWG only reports errors as U+FFFD.\n return context.errors === 'ignore' ? text.replaceAll(REPLACEMENT, '') : text;\n}\n\n/**\n * Python's `bytes.decode(encoding, errors)`. Throws {@link LookupError} for\n * unknown codecs and {@link UnicodeDecodeError} under `strict`.\n */\nexport function pyDecode(\n bytes: Uint8Array,\n encoding: string,\n errors: CodecErrors = 'strict',\n): string {\n const codec = lookupCodec(encoding);\n const context: ErrorContext = { codec, bytes, errors };\n switch (codec) {\n case 'ascii':\n return decodeAscii(context);\n case 'latin_1':\n return unitsToString(bytes);\n case 'utf_7':\n return decodeUtf7(context);\n case 'utf_8':\n return decodeUtf8(context);\n case 'utf_8_sig':\n return decodeUtf8(\n context,\n bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf ? 3 : 0,\n );\n case 'utf_16':\n return decodeUtf16(context, null);\n case 'utf_16_le':\n return decodeUtf16(context, true);\n case 'utf_16_be':\n return decodeUtf16(context, false);\n case 'utf_32':\n return decodeUtf32(context, null);\n case 'utf_32_le':\n return decodeUtf32(context, true);\n case 'utf_32_be':\n return decodeUtf32(context, false);\n case 'raw_unicode_escape':\n return decodeRawUnicodeEscape(context);\n case 'undefined':\n throw new UnicodeError('undefined encoding');\n default:\n break;\n }\n const table = PY_CHARMAP_TABLES[codec];\n if (table !== undefined) {\n return decodeCharmap(context, table);\n }\n const cjk = decodeCjk(context);\n if (cjk !== undefined) {\n return cjk;\n }\n const label = WHATWG_CODECS[codec];\n if (label !== undefined) {\n return decodeWhatwg(context, label);\n }\n throw new LookupError(`unknown encoding: ${encoding}`);\n}\n\nfunction escapeForBackslash(code: number): string {\n if (code < LATIN1_LIMIT) {\n return `\\\\x${code.toString(16).padStart(2, '0')}`;\n }\n if (code < 0x10000) {\n return `\\\\u${code.toString(16).padStart(4, '0')}`;\n }\n return `\\\\U${code.toString(16).padStart(8, '0')}`;\n}\n\n/** A growable byte buffer for the encoders' slow paths. */\nclass ByteBuilder {\n private buffer: Uint8Array;\n length = 0;\n\n constructor(capacity: number) {\n this.buffer = new Uint8Array(Math.max(capacity, 16));\n }\n\n push(byte: number): void {\n if (this.length === this.buffer.length) {\n this.grow(1);\n }\n this.buffer[this.length] = byte;\n this.length += 1;\n }\n\n bytes(bytes: Uint8Array): void {\n if (this.length + bytes.length > this.buffer.length) {\n this.grow(bytes.length);\n }\n this.buffer.set(bytes, this.length);\n this.length += bytes.length;\n }\n\n private grow(extra: number): void {\n const next = new Uint8Array(\n Math.max(this.buffer.length * 2, this.length + extra),\n );\n next.set(this.buffer.subarray(0, this.length));\n this.buffer = next;\n }\n\n result(): Uint8Array {\n return this.buffer.subarray(0, this.length);\n }\n}\n\nconst TEXT_ENCODER = new TextEncoder();\n\n/** Code point at UTF-16 index `index` of `text`. */\nfunction codePointAt(text: string, index: number): number {\n return text.codePointAt(index) ?? 0;\n}\n\nfunction encodeError(\n codec: string,\n text: string,\n unitIndex: number,\n position: number,\n limit: number,\n reason: string,\n): never {\n const first = codePointAt(text, unitIndex);\n let end = position + 1;\n let next = unitIndex + (first > 0xffff ? 2 : 1);\n while (next < text.length) {\n const code = codePointAt(text, next);\n if (code < limit) {\n break;\n }\n end += 1;\n next += code > 0xffff ? 2 : 1;\n }\n if (end - position === 1) {\n throw new UnicodeEncodeError(\n `'${codec}' codec can't encode character '${escapeForBackslash(first)}' in position ${position}: ${reason}`,\n );\n }\n throw new UnicodeEncodeError(\n `'${codec}' codec can't encode characters in position ${position}-${end - 1}: ${reason}`,\n );\n}\n\n// Index of the first UTF-16 unit at or above `limit`, or the length.\nfunction firstUnitAtLeast(text: string, limit: number): number {\n for (let index = 0; index < text.length; index += 1) {\n if (text.charCodeAt(index) >= limit) {\n return index;\n }\n }\n return text.length;\n}\n\nfunction encodeLimited(\n text: string,\n codec: string,\n limit: number,\n errors: CodecErrors,\n): Uint8Array {\n const firstInvalid = firstUnitAtLeast(text, limit);\n if (\n firstInvalid === text.length &&\n (limit === ASCII_LIMIT ||\n firstUnitAtLeast(text, ASCII_LIMIT) === text.length)\n ) {\n // ASCII: the same bytes as UTF-8, and TextEncoder is native.\n return TEXT_ENCODER.encode(text);\n }\n const output = new Uint8Array(text.length);\n for (let index = 0; index < firstInvalid; index += 1) {\n output[index] = text.charCodeAt(index);\n }\n if (firstInvalid === text.length) {\n return output;\n }\n // Exact slow path: Python counts positions in code points.\n const builder = new ByteBuilder(text.length);\n builder.bytes(output.subarray(0, firstInvalid));\n let position = firstInvalid;\n let index = firstInvalid;\n while (index < text.length) {\n const code = codePointAt(text, index);\n const units = code > 0xffff ? 2 : 1;\n if (code < limit) {\n builder.push(code);\n } else if (\n errors === 'surrogateescape' &&\n code >= 0xdc80 &&\n code <= 0xdcff\n ) {\n builder.push(code - 0xdc00);\n } else if (errors === 'replace') {\n builder.push(0x3f);\n } else if (errors === 'backslashreplace') {\n builder.bytes(TEXT_ENCODER.encode(escapeForBackslash(code)));\n } else if (errors !== 'ignore') {\n encodeError(\n codec,\n text,\n index,\n position,\n limit,\n `ordinal not in range(${limit})`,\n );\n }\n index += units;\n position += 1;\n }\n return builder.result();\n}\n\nfunction encodeUtf8(text: string, errors: CodecErrors): Uint8Array {\n if (text.isWellFormed()) {\n return TEXT_ENCODER.encode(text);\n }\n // Lone surrogates: encode the well-formed runs in bulk.\n const builder = new ByteBuilder(text.length * 3);\n let position = 0;\n let runStart = 0;\n let index = 0;\n while (index < text.length) {\n const code = codePointAt(text, index);\n const units = code > 0xffff ? 2 : 1;\n if (code >= 0xd800 && code <= 0xdfff) {\n builder.bytes(TEXT_ENCODER.encode(text.slice(runStart, index)));\n if (errors === 'surrogateescape' && code >= 0xdc80 && code <= 0xdcff) {\n builder.push(code - 0xdc00);\n } else if (errors === 'replace') {\n builder.push(0x3f);\n } else if (errors === 'backslashreplace') {\n builder.bytes(TEXT_ENCODER.encode(escapeForBackslash(code)));\n } else if (errors !== 'ignore') {\n throw new UnicodeEncodeError(\n `'utf-8' codec can't encode character '\\\\u${code.toString(16)}' in position ${position}: surrogates not allowed`,\n );\n }\n runStart = index + 1;\n }\n index += units;\n position += 1;\n }\n builder.bytes(TEXT_ENCODER.encode(text.slice(runStart)));\n return builder.result();\n}\n\n/** Python's `raw-unicode-escape` encoding. */\nfunction encodeRawUnicodeEscape(text: string): Uint8Array {\n const firstWide = firstUnitAtLeast(text, LATIN1_LIMIT);\n const builder = new ByteBuilder(text.length);\n for (let index = 0; index < firstWide; index += 1) {\n builder.push(text.charCodeAt(index));\n }\n let index = firstWide;\n while (index < text.length) {\n const code = codePointAt(text, index);\n if (code < LATIN1_LIMIT) {\n builder.push(code);\n } else {\n const escape =\n code < 0x10000\n ? `\\\\u${code.toString(16).padStart(4, '0')}`\n : `\\\\U${code.toString(16).padStart(8, '0')}`;\n builder.bytes(TEXT_ENCODER.encode(escape));\n }\n index += code > 0xffff ? 2 : 1;\n }\n return builder.result();\n}\n\n/**\n * Python's `str.encode(encoding, errors)` for the codecs the email code\n * needs: UTF-8, ASCII, Latin-1 and raw-unicode-escape.\n */\nexport function pyEncode(\n text: string,\n encoding: string,\n errors: CodecErrors = 'strict',\n): Uint8Array {\n const codec = lookupCodec(encoding);\n switch (codec) {\n case 'utf_8':\n return encodeUtf8(text, errors);\n case 'ascii':\n return encodeLimited(text, 'ascii', ASCII_LIMIT, errors);\n case 'latin_1':\n return encodeLimited(text, 'latin-1', LATIN1_LIMIT, errors);\n case 'raw_unicode_escape':\n return encodeRawUnicodeEscape(text);\n default:\n throw new LookupError(`encoding not supported for encoding: ${encoding}`);\n }\n}\n","// Port of the libbzip2 1.0.8 decompressor (decompress.c, bzlib.c\n// BZ2_bzDecompress / unRLE_obuf_to_output_FAST, huffman.c) and of Python's\n// `bz2.BZ2Decompressor` loop around it (Modules/_bz2module.c), as zipfile\n// uses it for ZIP_BZIP2 members.\n//\n// Like the zlib port, this follows the C state machine closely because the\n// outcome of a corrupt or truncated member depends on it: libbzip2 only\n// reports BZ_DATA_ERROR (\"Invalid data stream\") for corrupt data, a\n// truncated stream just stops producing output, and CPython's loop stops as\n// soon as the input is used up, even if libbzip2 still holds output.\n\n/** Python's `OSError` raised by `BZ2Decompressor`. */\nexport class Bz2Error extends Error {\n override name = 'OSError';\n}\n\nconst NEED_INPUT = 0;\nconst BLOCK_READY = 1;\ntype Pause = typeof NEED_INPUT | typeof BLOCK_READY;\n\nconst BZ_N_GROUPS = 6;\nconst BZ_G_SIZE = 50;\nconst BZ_MAX_ALPHA_SIZE = 258;\nconst BZ_MAX_CODE_LEN = 23;\nconst BZ_MAX_SELECTORS = 2 + 900_000 / BZ_G_SIZE;\nconst BZ_RUNA = 0;\nconst BZ_RUNB = 1;\nconst MTFA_SIZE = 4096;\nconst MTFL_SIZE = 16;\nconst BLOCK_UNIT = 100_000;\n\n/** CPython's output buffer block sizes (pycore_blocks_output_buffer.h). */\nconst KB = 1024;\nconst MB = 1024 * KB;\nconst BUFFER_BLOCK_SIZE = [\n 32 * KB,\n 64 * KB,\n 256 * KB,\n MB,\n 4 * MB,\n 8 * MB,\n 16 * MB,\n 16 * MB,\n 32 * MB,\n 32 * MB,\n 32 * MB,\n 32 * MB,\n 64 * MB,\n 64 * MB,\n 128 * MB,\n 128 * MB,\n 256 * MB,\n];\n\n/** randtable.c `BZ2_rNums`, for (deprecated) randomised blocks. */\nconst R_NUMS: readonly number[] = (\n '619,720,127,481,931,816,813,233,566,247,985,724,205,454,863,491,741,24' +\n '2,949,214,733,859,335,708,621,574,73,654,730,472,419,436,278,496,867,2' +\n '10,399,680,480,51,878,465,811,169,869,675,611,697,867,561,862,687,507,' +\n '283,482,129,807,591,733,623,150,238,59,379,684,877,625,169,643,105,170' +\n ',607,520,932,727,476,693,425,174,647,73,122,335,530,442,853,695,249,44' +\n '5,515,909,545,703,919,874,474,882,500,594,612,641,801,220,162,819,984,' +\n '589,513,495,799,161,604,958,533,221,400,386,867,600,782,382,596,414,17' +\n '1,516,375,682,485,911,276,98,553,163,354,666,933,424,341,533,870,227,7' +\n '30,475,186,263,647,537,686,600,224,469,68,770,919,190,373,294,822,808,' +\n '206,184,943,795,384,383,461,404,758,839,887,715,67,618,276,204,918,873' +\n ',777,604,560,951,160,578,722,79,804,96,409,713,940,652,934,970,447,318' +\n ',353,859,672,112,785,645,863,803,350,139,93,354,99,820,908,609,772,154' +\n ',274,580,184,79,626,630,742,653,282,762,623,680,81,927,626,789,125,411' +\n ',521,938,300,821,78,343,175,128,250,170,774,972,275,999,639,495,78,352' +\n ',126,857,956,358,619,580,124,737,594,701,612,669,112,134,694,363,992,8' +\n '09,743,168,974,944,375,748,52,600,747,642,182,862,81,344,805,988,739,5' +\n '11,655,814,334,249,515,897,955,664,981,649,113,974,459,893,228,433,837' +\n ',553,268,926,240,102,654,459,51,686,754,806,760,493,403,415,394,687,70' +\n '0,946,670,656,610,738,392,760,799,887,653,978,321,576,617,626,502,894,' +\n '679,243,440,680,879,194,572,640,724,926,56,204,700,707,151,457,449,797' +\n ',195,791,558,945,679,297,59,87,824,713,663,412,693,342,606,134,108,571' +\n ',364,631,212,174,643,304,329,343,97,430,751,497,314,983,374,822,928,14' +\n '0,206,73,263,980,736,876,478,430,305,170,514,364,692,829,82,855,953,67' +\n '6,246,369,970,294,750,807,827,150,790,288,923,804,378,215,828,592,281,' +\n '565,555,710,82,896,831,547,261,524,462,293,465,502,56,661,821,976,991,' +\n '658,869,905,758,745,193,768,550,608,933,378,286,215,979,792,961,61,688' +\n ',793,644,986,403,106,366,905,644,372,567,466,434,645,210,389,550,919,1' +\n '35,780,773,635,389,707,100,626,958,165,504,920,176,193,713,857,265,203' +\n ',50,668,108,645,990,626,197,510,357,358,850,858,364,936,638' +\n ''\n)\n .split(',')\n .map(Number);\n\n/** bzlib's CRC-32 (MSB first, polynomial 0x04c11db7). */\nconst CRC_TABLE: Uint32Array = (() => {\n const table = new Uint32Array(256);\n for (let index = 0; index < 256; index += 1) {\n let crc = index << 24;\n for (let bit = 0; bit < 8; bit += 1) {\n crc = crc & 0x80_00_00_00 ? (crc << 1) ^ 0x04_c1_1d_b7 : crc << 1;\n }\n table[index] = crc >>> 0;\n }\n return table;\n})();\n\n/** BZ_UPDATE_CRC. */\nfunction updateCrc(crc: number, byte: number): number {\n return (\n ((crc << 8) ^ (CRC_TABLE[((crc >>> 24) ^ byte) & 0xff] as number)) >>> 0\n );\n}\n\nclass DataError extends Error {}\n\n/**\n * Python's `bz2.BZ2Decompressor` as zipfile drives it: `decompress(data)`\n * with no output limit, except that output stops at `cap` bytes (see\n * `capped`).\n */\nexport class Bz2Decompressor {\n /** Python's `BZ2Decompressor.eof`. */\n eof = false;\n /** The last call stopped at `cap` bytes with more output pending. */\n capped = false;\n\n // Input (CPython keeps unconsumed input for the next call).\n private input: Uint8Array = new Uint8Array(0);\n private position = 0;\n private bsBuff = 0;\n private bsLive = 0;\n\n // Output of the current call.\n private output: Uint8Array = new Uint8Array(0);\n private outputLength = 0;\n private availOut = 0;\n\n // DState.\n private inOutput = false;\n private blockSize100k = 0;\n private tt: Uint32Array = new Uint32Array(0);\n private storedBlockCrc = 0;\n private storedCombinedCrc = 0;\n private calculatedBlockCrc = 0;\n private calculatedCombinedCrc = 0;\n private blockRandomised = false;\n private origPtr = 0;\n private saveNblock = 0;\n private stateOutLen = 0;\n private stateOutCh = 0;\n private k0 = 0;\n private tPos = 0;\n private nblockUsed = 0;\n private rNToGo = 0;\n private rTPos = 0;\n private readonly machine: Generator<Pause, void, void> = this.run();\n\n /**\n * `BZ2Decompressor.decompress(data)`; throws {@link Bz2Error} on corrupt\n * data.\n */\n decompress(data: Uint8Array, _maxLength: number, cap: number): Uint8Array {\n if (this.eof) {\n throw new Error('End of stream already reached');\n }\n const rest = this.input.subarray(this.position);\n const input = new Uint8Array(rest.length + data.length);\n input.set(rest);\n input.set(data, rest.length);\n this.input = input;\n this.position = 0;\n this.capped = false;\n let blocks = 0;\n let boundary = BUFFER_BLOCK_SIZE[0] as number;\n this.output = new Uint8Array(Math.min(boundary, cap));\n this.outputLength = 0;\n this.availOut = this.output.length;\n for (;;) {\n const streamEnd = this.bzDecompress();\n if (streamEnd) {\n this.eof = true;\n break;\n }\n const availIn = this.input.length - this.position;\n if (this.availOut === 0 && this.outputLength >= cap) {\n // Python's buffer would have room for more output here, unless this\n // is also one of its block boundaries and the input is used up.\n this.capped = !(this.outputLength === boundary && availIn === 0);\n break;\n }\n if (availIn === 0) {\n break;\n }\n if (this.availOut === 0) {\n blocks += 1;\n boundary +=\n BUFFER_BLOCK_SIZE[Math.min(blocks, BUFFER_BLOCK_SIZE.length - 1)] ??\n 0;\n this.grow(Math.min(boundary, cap));\n }\n }\n return this.output.subarray(0, this.outputLength);\n }\n\n private grow(size: number): void {\n const grown = new Uint8Array(size);\n grown.set(this.output.subarray(0, this.outputLength));\n this.output = grown;\n this.availOut = size - this.outputLength;\n }\n\n /** BZ2_bzDecompress: true at the end of the stream. */\n private bzDecompress(): boolean {\n try {\n for (;;) {\n if (this.inOutput) {\n if (\n this.blockRandomised ? this.unRleRandomised() : this.unRleFast()\n ) {\n throw new DataError();\n }\n if (\n this.nblockUsed !== this.saveNblock + 1 ||\n this.stateOutLen !== 0\n ) {\n return false;\n }\n if (~this.calculatedBlockCrc >>> 0 !== this.storedBlockCrc) {\n throw new DataError();\n }\n this.calculatedCombinedCrc =\n (((this.calculatedCombinedCrc << 1) |\n (this.calculatedCombinedCrc >>> 31)) ^\n ~this.calculatedBlockCrc) >>>\n 0;\n this.inOutput = false;\n }\n const step = this.machine.next();\n if (step.done === true) {\n if (this.calculatedCombinedCrc !== this.storedCombinedCrc) {\n throw new DataError();\n }\n return true;\n }\n if (step.value === NEED_INPUT) {\n return false;\n }\n this.inOutput = true;\n }\n } catch (error) {\n if (error instanceof DataError) {\n throw new Bz2Error('Invalid data stream');\n }\n throw error;\n }\n }\n\n /** Pull input bytes until `count` bits are buffered (GET_BITS). */\n private fill(count: number): boolean {\n while (this.bsLive < count) {\n if (this.position >= this.input.length) {\n return false;\n }\n this.bsBuff =\n ((this.bsBuff << 8) | (this.input[this.position] as number)) >>> 0;\n this.position += 1;\n this.bsLive += 8;\n }\n return true;\n }\n\n private take(count: number): number {\n this.bsLive -= count;\n return (this.bsBuff >>> this.bsLive) & ((1 << count) - 1);\n }\n\n private *bits(count: number): Generator<Pause, number, void> {\n while (!this.fill(count)) {\n yield NEED_INPUT;\n }\n return this.take(count);\n }\n\n private *uint32(): Generator<Pause, number, void> {\n let value = 0;\n for (let index = 0; index < 4; index += 1) {\n value = ((value << 8) | (yield* this.bits(8))) >>> 0;\n }\n return value;\n }\n\n private *expect(bytes: readonly number[]): Generator<Pause, void, void> {\n for (const byte of bytes) {\n if ((yield* this.bits(8)) !== byte) {\n throw new DataError();\n }\n }\n }\n\n // BZ2_decompress: yields BLOCK_READY when a block can be output.\n private *run(): Generator<Pause, void, void> {\n for (const byte of [0x42, 0x5a, 0x68]) {\n if ((yield* this.bits(8)) !== byte) {\n throw new DataError();\n }\n }\n const level = yield* this.bits(8);\n if (level < 0x31 || level > 0x39) {\n throw new DataError();\n }\n this.blockSize100k = level - 0x30;\n this.tt = new Uint32Array(this.blockSize100k * BLOCK_UNIT);\n for (;;) {\n const first = yield* this.bits(8);\n if (first === 0x17) {\n break;\n }\n if (first !== 0x31) {\n throw new DataError();\n }\n yield* this.expect([0x41, 0x59, 0x26, 0x53, 0x59]);\n this.storedBlockCrc = yield* this.uint32();\n yield* this.block();\n yield BLOCK_READY;\n }\n yield* this.expect([0x72, 0x45, 0x38, 0x50, 0x90]);\n this.storedCombinedCrc = yield* this.uint32();\n }\n\n // oxlint-disable-next-line max-lines-per-function, complexity -- a 1:1 port of BZ2_decompress\n private *block(): Generator<Pause, void, void> {\n this.blockRandomised = (yield* this.bits(1)) === 1;\n let origPtr = 0;\n for (let index = 0; index < 3; index += 1) {\n origPtr = (origPtr << 8) | (yield* this.bits(8));\n }\n if (origPtr > 10 + BLOCK_UNIT * this.blockSize100k) {\n throw new DataError();\n }\n this.origPtr = origPtr;\n\n // The mapping table.\n const inUse16: boolean[] = [];\n for (let index = 0; index < 16; index += 1) {\n inUse16.push((yield* this.bits(1)) === 1);\n }\n const seqToUnseq = new Uint8Array(256);\n let nInUse = 0;\n const inUse = new Uint8Array(256);\n for (let high = 0; high < 16; high += 1) {\n if (inUse16[high] === true) {\n for (let low = 0; low < 16; low += 1) {\n if ((yield* this.bits(1)) === 1) {\n inUse[high * 16 + low] = 1;\n }\n }\n }\n }\n for (let index = 0; index < 256; index += 1) {\n if (inUse[index] === 1) {\n seqToUnseq[nInUse] = index;\n nInUse += 1;\n }\n }\n if (nInUse === 0) {\n throw new DataError();\n }\n const alphaSize = nInUse + 2;\n\n // The selectors.\n const nGroups = yield* this.bits(3);\n if (nGroups < 2 || nGroups > BZ_N_GROUPS) {\n throw new DataError();\n }\n let nSelectors = yield* this.bits(15);\n if (nSelectors < 1) {\n throw new DataError();\n }\n const selectorMtf = new Uint8Array(BZ_MAX_SELECTORS);\n for (let index = 0; index < nSelectors; index += 1) {\n let value = 0;\n while ((yield* this.bits(1)) !== 0) {\n value += 1;\n if (value >= nGroups) {\n throw new DataError();\n }\n }\n if (index < BZ_MAX_SELECTORS) {\n selectorMtf[index] = value;\n }\n }\n if (nSelectors > BZ_MAX_SELECTORS) {\n nSelectors = BZ_MAX_SELECTORS;\n }\n const selector = new Uint8Array(BZ_MAX_SELECTORS);\n const groupOrder = [0, 1, 2, 3, 4, 5];\n for (let index = 0; index < nSelectors; index += 1) {\n let value = selectorMtf[index] as number;\n const picked = groupOrder[value] as number;\n while (value > 0) {\n groupOrder[value] = groupOrder[value - 1] as number;\n value -= 1;\n }\n groupOrder[0] = picked;\n selector[index] = picked;\n }\n\n // The coding tables.\n const lengths: Uint8Array[] = [];\n for (let group = 0; group < nGroups; group += 1) {\n const groupLengths = new Uint8Array(BZ_MAX_ALPHA_SIZE);\n let current = yield* this.bits(5);\n for (let symbol = 0; symbol < alphaSize; symbol += 1) {\n for (;;) {\n if (current < 1 || current > 20) {\n throw new DataError();\n }\n if ((yield* this.bits(1)) === 0) {\n break;\n }\n current += (yield* this.bits(1)) === 0 ? 1 : -1;\n }\n groupLengths[symbol] = current;\n }\n lengths.push(groupLengths);\n }\n const limits: Int32Array[] = [];\n const bases: Int32Array[] = [];\n const perms: Int32Array[] = [];\n const minLens: number[] = [];\n for (const groupLengths of lengths) {\n let minLen = 32;\n let maxLen = 0;\n for (let symbol = 0; symbol < alphaSize; symbol += 1) {\n const length = groupLengths[symbol] as number;\n maxLen = Math.max(maxLen, length);\n minLen = Math.min(minLen, length);\n }\n const limit = new Int32Array(BZ_MAX_ALPHA_SIZE);\n const base = new Int32Array(BZ_MAX_ALPHA_SIZE);\n const perm = new Int32Array(BZ_MAX_ALPHA_SIZE);\n createDecodeTables(\n limit,\n base,\n perm,\n groupLengths,\n minLen,\n maxLen,\n alphaSize,\n );\n limits.push(limit);\n bases.push(base);\n perms.push(perm);\n minLens.push(minLen);\n }\n\n // The MTF values.\n const eob = nInUse + 1;\n const nblockMax = BLOCK_UNIT * this.blockSize100k;\n let groupNo = -1;\n let groupPos = 0;\n let gMinlen = 0;\n let gLimit = limits[0] as Int32Array;\n let gBase = bases[0] as Int32Array;\n let gPerm = perms[0] as Int32Array;\n const unzftab = new Int32Array(256);\n const mtfa = new Uint8Array(MTFA_SIZE);\n const mtfbase = new Int32Array(256 / MTFL_SIZE);\n {\n let kk = MTFA_SIZE - 1;\n for (let ii = 256 / MTFL_SIZE - 1; ii >= 0; ii -= 1) {\n for (let jj = MTFL_SIZE - 1; jj >= 0; jj -= 1) {\n mtfa[kk] = ii * MTFL_SIZE + jj;\n kk -= 1;\n }\n mtfbase[ii] = kk + 1;\n }\n }\n const tt = this.tt;\n let nblock = 0;\n\n // GET_MTF_VAL. `nextGroup` and `finish` are shared by the fast path\n // (enough input buffered for any code: at most 21 bits) and the\n // resumable one.\n const nextGroup = (): void => {\n if (groupPos === 0) {\n groupNo += 1;\n if (groupNo >= nSelectors) {\n throw new DataError();\n }\n groupPos = BZ_G_SIZE;\n const gSel = selector[groupNo] as number;\n gMinlen = minLens[gSel] as number;\n gLimit = limits[gSel] as Int32Array;\n gPerm = perms[gSel] as Int32Array;\n gBase = bases[gSel] as Int32Array;\n }\n groupPos -= 1;\n };\n const finish = (zn: number, zvec: number): number => {\n const index = zvec - (gBase[zn] as number);\n if (index < 0 || index >= BZ_MAX_ALPHA_SIZE) {\n throw new DataError();\n }\n return gPerm[index] as number;\n };\n const mtfValFast = (): number => {\n nextGroup();\n let zn = gMinlen;\n this.fill(zn);\n let zvec = this.take(zn);\n for (;;) {\n if (zn > 20) {\n throw new DataError();\n }\n if (zvec <= (gLimit[zn] as number)) {\n return finish(zn, zvec);\n }\n zn += 1;\n this.fill(1);\n zvec = (zvec << 1) | this.take(1);\n }\n };\n const mtfValSlow = function* (\n this: Bz2Decompressor,\n ): Generator<Pause, number, void> {\n nextGroup();\n let zn = gMinlen;\n while (!this.fill(zn)) {\n yield NEED_INPUT;\n }\n let zvec = this.take(zn);\n for (;;) {\n if (zn > 20) {\n throw new DataError();\n }\n if (zvec <= (gLimit[zn] as number)) {\n return finish(zn, zvec);\n }\n zn += 1;\n while (!this.fill(1)) {\n yield NEED_INPUT;\n }\n zvec = (zvec << 1) | this.take(1);\n }\n }.bind(this);\n const fastInput = (): boolean => this.input.length - this.position >= 4;\n\n let nextSym = fastInput() ? mtfValFast() : yield* mtfValSlow();\n for (;;) {\n if (nextSym === eob) {\n break;\n }\n if (nextSym === BZ_RUNA || nextSym === BZ_RUNB) {\n let es = -1;\n let n = 1;\n do {\n if (n >= 2 * 1024 * 1024) {\n throw new DataError();\n }\n es += nextSym === BZ_RUNA ? n : 2 * n;\n n *= 2;\n nextSym = fastInput() ? mtfValFast() : yield* mtfValSlow();\n } while (nextSym === BZ_RUNA || nextSym === BZ_RUNB);\n es += 1;\n const uc = seqToUnseq[mtfa[mtfbase[0] as number] as number] as number;\n unzftab[uc] = (unzftab[uc] as number) + es;\n while (es > 0) {\n if (nblock >= nblockMax) {\n throw new DataError();\n }\n tt[nblock] = uc;\n nblock += 1;\n es -= 1;\n }\n continue;\n }\n if (nblock >= nblockMax) {\n throw new DataError();\n }\n let uc: number;\n let nn = nextSym - 1;\n if (nn < MTFL_SIZE) {\n const pp = mtfbase[0] as number;\n uc = mtfa[pp + nn] as number;\n while (nn > 0) {\n mtfa[pp + nn] = mtfa[pp + nn - 1] as number;\n nn -= 1;\n }\n mtfa[pp] = uc;\n } else {\n let lno = Math.floor(nn / MTFL_SIZE);\n const off = nn % MTFL_SIZE;\n let pp = (mtfbase[lno] as number) + off;\n uc = mtfa[pp] as number;\n while (pp > (mtfbase[lno] as number)) {\n mtfa[pp] = mtfa[pp - 1] as number;\n pp -= 1;\n }\n mtfbase[lno] = (mtfbase[lno] as number) + 1;\n while (lno > 0) {\n mtfbase[lno] = (mtfbase[lno] as number) - 1;\n mtfa[mtfbase[lno] as number] = mtfa[\n (mtfbase[lno - 1] as number) + MTFL_SIZE - 1\n ] as number;\n lno -= 1;\n }\n mtfbase[0] = (mtfbase[0] as number) - 1;\n mtfa[mtfbase[0] as number] = uc;\n if (mtfbase[0] === 0) {\n let kk = MTFA_SIZE - 1;\n for (let ii = 256 / MTFL_SIZE - 1; ii >= 0; ii -= 1) {\n for (let jj = MTFL_SIZE - 1; jj >= 0; jj -= 1) {\n mtfa[kk] = mtfa[(mtfbase[ii] as number) + jj] as number;\n kk -= 1;\n }\n mtfbase[ii] = kk + 1;\n }\n }\n }\n const symbol = seqToUnseq[uc] as number;\n unzftab[symbol] = (unzftab[symbol] as number) + 1;\n tt[nblock] = symbol;\n nblock += 1;\n nextSym = fastInput() ? mtfValFast() : yield* mtfValSlow();\n }\n\n if (this.origPtr < 0 || this.origPtr >= nblock) {\n throw new DataError();\n }\n for (let index = 0; index <= 255; index += 1) {\n const count = unzftab[index] as number;\n if (count < 0 || count > nblock) {\n throw new DataError();\n }\n }\n const cftab = new Int32Array(257);\n for (let index = 1; index <= 256; index += 1) {\n cftab[index] =\n (unzftab[index - 1] as number) + (cftab[index - 1] as number);\n }\n for (let index = 0; index <= 256; index += 1) {\n const value = cftab[index] as number;\n if (value < 0 || value > nblock) {\n throw new DataError();\n }\n if (index > 0 && (cftab[index - 1] as number) > value) {\n throw new DataError();\n }\n }\n this.stateOutLen = 0;\n this.stateOutCh = 0;\n this.calculatedBlockCrc = 0xff_ff_ff_ff;\n for (let index = 0; index < nblock; index += 1) {\n const uc = (tt[index] as number) & 0xff;\n const target = cftab[uc] as number;\n tt[target] = ((tt[target] as number) | (index << 8)) >>> 0;\n cftab[uc] = target + 1;\n }\n this.saveNblock = nblock;\n this.tPos = (tt[this.origPtr] as number) >>> 8;\n this.nblockUsed = 0;\n if (this.blockRandomised) {\n this.rNToGo = 0;\n this.rTPos = 0;\n this.k0 = this.getFast();\n this.nblockUsed += 1;\n this.k0 ^= this.randMask();\n } else {\n this.k0 = this.getFast();\n this.nblockUsed += 1;\n }\n }\n\n /** BZ_GET_FAST; the bound check never fails on a well-formed T vector. */\n private getFast(): number {\n if (this.tPos >= BLOCK_UNIT * this.blockSize100k) {\n throw new DataError();\n }\n const entry = this.tt[this.tPos] as number;\n this.tPos = entry >>> 8;\n return entry & 0xff;\n }\n\n /** BZ_RAND_UPD_MASK, then BZ_RAND_MASK. */\n private randMask(): number {\n if (this.rNToGo === 0) {\n this.rNToGo = R_NUMS[this.rTPos] as number;\n this.rTPos += 1;\n if (this.rTPos === 512) {\n this.rTPos = 0;\n }\n }\n this.rNToGo -= 1;\n return this.rNToGo === 1 ? 1 : 0;\n }\n\n private writeByte(byte: number): void {\n this.output[this.outputLength] = byte;\n this.outputLength += 1;\n this.availOut -= 1;\n this.calculatedBlockCrc = updateCrc(this.calculatedBlockCrc, byte);\n }\n\n /** unRLE_obuf_to_output_FAST, randomised branch: true if corrupt. */\n private unRleRandomised(): boolean {\n const end = this.saveNblock + 1;\n for (;;) {\n for (;;) {\n if (this.availOut === 0) {\n return false;\n }\n if (this.stateOutLen === 0) {\n break;\n }\n this.writeByte(this.stateOutCh);\n this.stateOutLen -= 1;\n }\n if (this.nblockUsed === end) {\n return false;\n }\n if (this.nblockUsed > end) {\n return true;\n }\n this.stateOutLen = 1;\n this.stateOutCh = this.k0;\n let k1 = this.getFast() ^ this.randMask();\n this.nblockUsed += 1;\n if (this.nblockUsed === end) {\n continue;\n }\n if (k1 !== this.k0) {\n this.k0 = k1;\n continue;\n }\n this.stateOutLen = 2;\n k1 = this.getFast() ^ this.randMask();\n this.nblockUsed += 1;\n if (this.nblockUsed === end) {\n continue;\n }\n if (k1 !== this.k0) {\n this.k0 = k1;\n continue;\n }\n this.stateOutLen = 3;\n k1 = this.getFast() ^ this.randMask();\n this.nblockUsed += 1;\n if (this.nblockUsed === end) {\n continue;\n }\n if (k1 !== this.k0) {\n this.k0 = k1;\n continue;\n }\n k1 = this.getFast() ^ this.randMask();\n this.nblockUsed += 1;\n this.stateOutLen = k1 + 4;\n this.k0 = this.getFast() ^ this.randMask();\n this.nblockUsed += 1;\n }\n }\n\n /**\n * unRLE_obuf_to_output_FAST, non-randomised branch (with its read-ahead\n * and `goto s_state_out_len_eq_one`): true if corrupt. Works on local\n * copies of the state, like the C code, for speed.\n */\n // oxlint-disable-next-line complexity, max-statements -- mirrors the C loop\n private unRleFast(): boolean {\n const tt = this.tt;\n const output = this.output;\n const end = this.saveNblock + 1;\n const tPosLimit = BLOCK_UNIT * this.blockSize100k;\n let crc = this.calculatedBlockCrc;\n let ch = this.stateOutCh;\n let len = this.stateOutLen;\n let used = this.nblockUsed;\n let k0 = this.k0;\n let tPos = this.tPos;\n let out = this.outputLength;\n let avail = this.availOut;\n let jumpToLastByte = false;\n let corrupt = false;\n // BZ_GET_FAST_C\n const getFast = (): number => {\n if (tPos >= tPosLimit) {\n throw new DataError();\n }\n const entry = tt[tPos] as number;\n tPos = entry >>> 8;\n return entry & 0xff;\n };\n const write = (): void => {\n output[out] = ch;\n out += 1;\n avail -= 1;\n crc = updateCrc(crc, ch);\n };\n for (;;) {\n if (jumpToLastByte || len > 0) {\n if (!jumpToLastByte) {\n while (len !== 1 && avail > 0) {\n output[out] = ch;\n out += 1;\n avail -= 1;\n crc = updateCrc(crc, ch);\n len -= 1;\n }\n if (avail === 0) {\n break;\n }\n }\n jumpToLastByte = false;\n if (avail === 0) {\n len = 1;\n break;\n }\n write();\n }\n if (used > end) {\n corrupt = true;\n break;\n }\n if (used === end) {\n len = 0;\n break;\n }\n ch = k0;\n let k1 = getFast();\n used += 1;\n if (k1 !== k0) {\n k0 = k1;\n jumpToLastByte = true;\n continue;\n }\n if (used === end) {\n jumpToLastByte = true;\n continue;\n }\n len = 2;\n k1 = getFast();\n used += 1;\n if (used === end) {\n continue;\n }\n if (k1 !== k0) {\n k0 = k1;\n continue;\n }\n len = 3;\n k1 = getFast();\n used += 1;\n if (used === end) {\n continue;\n }\n if (k1 !== k0) {\n k0 = k1;\n continue;\n }\n k1 = getFast();\n used += 1;\n len = k1 + 4;\n k0 = getFast();\n used += 1;\n }\n this.calculatedBlockCrc = crc;\n this.stateOutCh = ch;\n this.stateOutLen = len;\n this.nblockUsed = used;\n this.k0 = k0;\n this.tPos = tPos;\n this.outputLength = out;\n this.availOut = avail;\n return corrupt;\n }\n}\n\n/** huffman.c BZ2_hbCreateDecodeTables. */\nfunction createDecodeTables(\n limit: Int32Array,\n base: Int32Array,\n perm: Int32Array,\n length: Uint8Array,\n minLen: number,\n maxLen: number,\n alphaSize: number,\n): void {\n let pp = 0;\n for (let len = minLen; len <= maxLen; len += 1) {\n for (let symbol = 0; symbol < alphaSize; symbol += 1) {\n if (length[symbol] === len) {\n perm[pp] = symbol;\n pp += 1;\n }\n }\n }\n base.fill(0, 0, BZ_MAX_CODE_LEN);\n for (let symbol = 0; symbol < alphaSize; symbol += 1) {\n const index = (length[symbol] as number) + 1;\n base[index] = (base[index] as number) + 1;\n }\n for (let index = 1; index < BZ_MAX_CODE_LEN; index += 1) {\n base[index] = (base[index] as number) + (base[index - 1] as number);\n }\n limit.fill(0, 0, BZ_MAX_CODE_LEN);\n let vec = 0;\n for (let len = minLen; len <= maxLen; len += 1) {\n vec += (base[len + 1] as number) - (base[len] as number);\n limit[len] = vec - 1;\n vec <<= 1;\n }\n for (let len = minLen + 1; len <= maxLen; len += 1) {\n base[len] = (((limit[len - 1] as number) + 1) << 1) - (base[len] as number);\n }\n}\n","// Incremental CRC-32 (IEEE 802.3, as zlib.crc32): the decompressors check\n// it over output produced across several calls.\n\nconst TABLE: Uint32Array = (() => {\n const table = new Uint32Array(256);\n for (let n = 0; n < 256; n += 1) {\n let c = n;\n for (let k = 0; k < 8; k += 1) {\n c = c & 1 ? 0xed_b8_83_20 ^ (c >>> 1) : c >>> 1;\n }\n table[n] = c >>> 0;\n }\n return table;\n})();\n\n/** Python's `zlib.crc32(data[start:end], crc)`. */\nexport function crc32Update(\n crc: number,\n data: Uint8Array,\n start = 0,\n end: number = data.length,\n): number {\n let value = ~crc;\n for (let index = start; index < end; index += 1) {\n value =\n (TABLE[(value ^ (data[index] as number)) & 0xff] as number) ^\n (value >>> 8);\n }\n return ~value >>> 0;\n}\n","// Port of the raw LZMA1 decoder of liblzma 5.8 (lzma_decoder.c,\n// range_decoder.h, lz_decoder.h) and of the wrappers zipfile puts around it\n// for ZIP_LZMA members: zipfile's `LZMADecompressor` (a 4-byte header and\n// the LZMA properties, then `lzma.LZMADecompressor(FORMAT_RAW, ...)`) and\n// CPython's decompress loop (Modules/_lzmamodule.c).\n//\n// The checks are liblzma's: the first range coder byte must be 0, match\n// distances must point inside the data decoded so far (and the\n// dictionary), the stream must end with an end-of-payload marker after\n// which the range coder is \"finished\". A truncated stream is not an error.\n\n/** Python's `lzma.LZMAError`. */\nexport class LzmaError extends Error {\n override name = 'LZMAError';\n}\n\nconst RC_TOP_VALUE = 1 << 24;\nconst RC_BIT_MODEL_TOTAL_BITS = 11;\nconst RC_BIT_MODEL_TOTAL = 1 << RC_BIT_MODEL_TOTAL_BITS;\nconst RC_MOVE_BITS = 5;\nconst PROB_INIT = RC_BIT_MODEL_TOTAL >>> 1;\n\nconst STATES = 12;\nconst LIT_STATES = 7;\nconst POS_STATES_MAX = 1 << 4;\nconst MATCH_LEN_MIN = 2;\nconst LEN_LOW_BITS = 3;\nconst LEN_MID_BITS = 3;\nconst LEN_HIGH_BITS = 8;\nconst LEN_LOW_SYMBOLS = 1 << LEN_LOW_BITS;\nconst LEN_MID_SYMBOLS = 1 << LEN_MID_BITS;\nconst DIST_STATES = 4;\nconst DIST_SLOT_BITS = 6;\nconst DIST_SLOTS = 1 << DIST_SLOT_BITS;\nconst DIST_MODEL_START = 4;\nconst DIST_MODEL_END = 14;\nconst FULL_DISTANCES = 1 << (DIST_MODEL_END / 2);\nconst ALIGN_BITS = 4;\nconst ALIGN_SIZE = 1 << ALIGN_BITS;\nconst LZMA_LCLP_MAX = 4;\nconst UINT32_MAX = 0xff_ff_ff_ff;\n/** liblzma's smallest dictionary. */\nconst DICT_SIZE_MIN = 4096;\n\ninterface LengthDecoder {\n choice: Uint16Array;\n low: Uint16Array[];\n mid: Uint16Array[];\n high: Uint16Array;\n}\n\nfunction probabilities(count: number): Uint16Array {\n return new Uint16Array(count).fill(PROB_INIT);\n}\n\nfunction lengthDecoder(): LengthDecoder {\n const low: Uint16Array[] = [];\n const mid: Uint16Array[] = [];\n for (let index = 0; index < POS_STATES_MAX; index += 1) {\n low.push(probabilities(LEN_LOW_SYMBOLS));\n mid.push(probabilities(LEN_MID_SYMBOLS));\n }\n return {\n choice: probabilities(2),\n high: probabilities(1 << LEN_HIGH_BITS),\n low,\n mid,\n };\n}\n\n/** LZMA1 properties (`lzma._decode_filter_properties(FILTER_LZMA1, ...)`). */\ninterface LzmaProperties {\n lc: number;\n lp: number;\n pb: number;\n dictSize: number;\n}\n\n/** liblzma `lzma_lzma_props_decode`; null for LZMA_OPTIONS_ERROR. */\nfunction decodeProperties(props: Uint8Array): LzmaProperties | null {\n if (props.length !== 5) {\n return null;\n }\n let byte = props[0] as number;\n if (byte > (4 * 5 + 4) * 9 + 8) {\n return null;\n }\n const pb = Math.floor(byte / (9 * 5));\n byte -= pb * 9 * 5;\n const lp = Math.floor(byte / 9);\n const lc = byte - lp * 9;\n if (lc + lp > LZMA_LCLP_MAX) {\n return null;\n }\n const dictSize =\n ((props[1] as number) |\n ((props[2] as number) << 8) |\n ((props[3] as number) << 16) |\n ((props[4] as number) << 24)) >>>\n 0;\n return { dictSize, lc, lp, pb };\n}\n\n/** Thrown inside a symbol when the input runs out (the symbol is retried). */\nconst NEED_INPUT = Symbol('need input');\n/** Thrown when the next byte would pass the output cap. */\nconst NEED_OUTPUT = Symbol('need output');\n/** More than any symbol needs (liblzma: LZMA_IN_REQUIRED = 21). */\nconst IN_REQUIRED = 64;\n\n/**\n * `lzma.LZMADecompressor(FORMAT_RAW, filters=[LZMA1])`, without an output\n * limit except `cap` (see `capped`).\n *\n * liblzma decodes a symbol in a resumable way when the input runs out in\n * the middle of it. Here a symbol is instead decoded again from the start\n * once more input arrives: near the end of the input (where a symbol could\n * run out of bytes) the probability updates are logged so they can be\n * rolled back. The result is the same since decoding is deterministic.\n */\nclass RawLzma1Decoder {\n eof = false;\n capped = false;\n\n private input: Uint8Array = new Uint8Array(0);\n private position = 0;\n private initBytes = 0;\n private range = UINT32_MAX;\n private code = 0;\n /** Everything decoded so far: the dictionary and the output. */\n private history: Uint8Array = new Uint8Array(0);\n private total = 0;\n private outputLimit = 0;\n private readonly dictSize: number;\n private readonly posMask: number;\n private readonly literalMask: number;\n private readonly lc: number;\n private readonly literal: Uint16Array;\n private readonly isMatch = probabilities(STATES * POS_STATES_MAX);\n private readonly isRep = probabilities(STATES);\n private readonly isRep0 = probabilities(STATES);\n private readonly isRep1 = probabilities(STATES);\n private readonly isRep2 = probabilities(STATES);\n private readonly isRep0Long = probabilities(STATES * POS_STATES_MAX);\n private readonly distSlot: Uint16Array[] = [];\n private readonly posSpecial = probabilities(FULL_DISTANCES - DIST_MODEL_END);\n private readonly posAlign = probabilities(ALIGN_SIZE);\n private readonly matchLength = lengthDecoder();\n private readonly repLength = lengthDecoder();\n private state = 0;\n private rep0 = 0;\n private rep1 = 0;\n private rep2 = 0;\n private rep3 = 0;\n /** Probability updates of the current symbol, when they may be undone. */\n private undo: { probs: Uint16Array; index: number; value: number }[] | null =\n null;\n\n constructor(properties: LzmaProperties) {\n // lz_decoder.c: at least 4 KiB, rounded up to a multiple of 16.\n const size = Math.max(properties.dictSize, DICT_SIZE_MIN);\n this.dictSize = Math.ceil(size / 16) * 16;\n this.posMask = (1 << properties.pb) - 1;\n this.lc = properties.lc;\n this.literalMask =\n ((0x1_00 << properties.lp) - (0x1_00 >>> properties.lc)) >>> 0;\n this.literal = probabilities(0x3_00 << (properties.lc + properties.lp));\n for (let index = 0; index < DIST_STATES; index += 1) {\n this.distSlot.push(probabilities(DIST_SLOTS));\n }\n }\n\n decompress(data: Uint8Array, cap: number): Uint8Array {\n // Bytes of a symbol that ran out of input are decoded again with the\n // new data (CPython keeps liblzma's unconsumed input the same way).\n const rest = this.input.subarray(this.position);\n if (rest.length === 0) {\n this.input = data;\n } else {\n this.input = new Uint8Array(rest.length + data.length);\n this.input.set(rest);\n this.input.set(data, rest.length);\n }\n this.position = 0;\n this.capped = false;\n const start = this.total;\n this.outputLimit = start + cap;\n try {\n this.readInit();\n while (this.initBytes === 5 && !this.eof) {\n this.eof = this.decodeSymbol();\n }\n } catch (error) {\n if (error === NEED_OUTPUT) {\n this.capped = true;\n } else if (error === NEED_INPUT) {\n // CPython stops calling lzma_code() once the input is used up.\n } else if (error instanceof CorruptData) {\n throw new LzmaError('Corrupt input data');\n } else {\n throw error;\n }\n }\n // Bytes before `total` are never written again: a view is enough.\n return this.history.subarray(start, this.total);\n }\n\n /** rc_read_init: five bytes, the first of which must be 0. */\n private readInit(): void {\n while (this.initBytes < 5) {\n if (this.position >= this.input.length) {\n throw NEED_INPUT;\n }\n const byte = this.input[this.position] as number;\n if (this.initBytes === 0 && byte !== 0) {\n throw new CorruptData();\n }\n this.code = ((this.code << 8) | byte) >>> 0;\n this.position += 1;\n this.initBytes += 1;\n }\n }\n\n /** One LZMA symbol, retried from its start if the input runs out. */\n private decodeSymbol(): boolean {\n if (this.input.length - this.position >= IN_REQUIRED) {\n this.undo = null;\n return this.symbol();\n }\n const saved = {\n code: this.code,\n position: this.position,\n range: this.range,\n rep0: this.rep0,\n rep1: this.rep1,\n rep2: this.rep2,\n rep3: this.rep3,\n state: this.state,\n };\n const undo: { probs: Uint16Array; index: number; value: number }[] = [];\n this.undo = undo;\n try {\n return this.symbol();\n } catch (error) {\n if (error === NEED_INPUT) {\n for (let index = undo.length - 1; index >= 0; index -= 1) {\n const entry = undo[index] as (typeof undo)[number];\n entry.probs[entry.index] = entry.value;\n }\n Object.assign(this, saved);\n }\n throw error;\n } finally {\n this.undo = null;\n }\n }\n\n /** rc_normalize: pull a byte when the range gets small. */\n private normalize(): void {\n if (this.range < RC_TOP_VALUE) {\n if (this.position >= this.input.length) {\n throw NEED_INPUT;\n }\n this.range = (this.range << 8) >>> 0;\n this.code =\n ((this.code << 8) | (this.input[this.position] as number)) >>> 0;\n this.position += 1;\n }\n }\n\n /** rc_bit: decode one bit with `probs[index]`. */\n private bit(probs: Uint16Array, index: number): number {\n this.normalize();\n const prob = probs[index] as number;\n this.undo?.push({ index, probs, value: prob });\n const bound = (this.range >>> RC_BIT_MODEL_TOTAL_BITS) * prob;\n if (this.code < bound) {\n this.range = bound;\n probs[index] = prob + ((RC_BIT_MODEL_TOTAL - prob) >>> RC_MOVE_BITS);\n return 0;\n }\n this.range = (this.range - bound) >>> 0;\n this.code = (this.code - bound) >>> 0;\n probs[index] = prob - (prob >>> RC_MOVE_BITS);\n return 1;\n }\n\n /** Bit tree of `limit` leaves; returns symbol - limit. */\n private bitTree(probs: Uint16Array, limit: number): number {\n let symbol = 1;\n while (symbol < limit) {\n symbol = (symbol << 1) | this.bit(probs, symbol);\n }\n return symbol - limit;\n }\n\n private length(decoder: LengthDecoder, posState: number): number {\n if (this.bit(decoder.choice, 0) === 0) {\n return (\n MATCH_LEN_MIN +\n this.bitTree(decoder.low[posState] as Uint16Array, LEN_LOW_SYMBOLS)\n );\n }\n if (this.bit(decoder.choice, 1) === 0) {\n return (\n MATCH_LEN_MIN +\n LEN_LOW_SYMBOLS +\n this.bitTree(decoder.mid[posState] as Uint16Array, LEN_MID_SYMBOLS)\n );\n }\n return (\n MATCH_LEN_MIN +\n LEN_LOW_SYMBOLS +\n LEN_MID_SYMBOLS +\n this.bitTree(decoder.high, 1 << LEN_HIGH_BITS)\n );\n }\n\n /** dict_is_distance_valid: `dict.full > distance`. */\n private distanceValid(distance: number): boolean {\n return Math.min(this.total, this.dictSize) > distance;\n }\n\n private byteAt(distance: number): number {\n return this.history[this.total - distance - 1] as number;\n }\n\n private put(byte: number): void {\n if (this.total >= this.outputLimit) {\n throw NEED_OUTPUT;\n }\n if (this.total >= this.history.length) {\n const grown = new Uint8Array(\n Math.max(64 * 1024, this.history.length * 2),\n );\n grown.set(this.history);\n this.history = grown;\n }\n this.history[this.total] = byte;\n this.total += 1;\n }\n\n /** A literal; `state` was already updated. */\n private decodeLiteral(matched: boolean): number {\n const previous = this.total > 0 ? this.byteAt(0) : 0;\n const base =\n 3 * ((((this.total << 8) + previous) & this.literalMask) << this.lc);\n let symbol = 1;\n if (!matched) {\n while (symbol < 0x1_00) {\n symbol = (symbol << 1) | this.bit(this.literal, base + symbol);\n }\n return symbol & 0xff;\n }\n let matchByte = this.byteAt(this.rep0) << 1;\n let offset = 0x1_00;\n while (symbol < 0x1_00) {\n const matchBit = matchByte & offset;\n const bit = this.bit(this.literal, base + offset + matchBit + symbol);\n symbol = (symbol << 1) | bit;\n offset &= bit === 0 ? ~matchBit : matchBit;\n matchByte <<= 1;\n }\n return symbol & 0xff;\n }\n\n /** A simple match's distance; UINT32_MAX is the end marker. */\n private decodeDistance(length: number): number {\n const lengthState =\n length < DIST_STATES + MATCH_LEN_MIN\n ? length - MATCH_LEN_MIN\n : DIST_STATES - 1;\n const slot = this.bitTree(\n this.distSlot[lengthState] as Uint16Array,\n DIST_SLOTS,\n );\n if (slot < DIST_MODEL_START) {\n return slot;\n }\n let limit = (slot >>> 1) - 1;\n let distance = 2 + (slot & 1);\n if (slot < DIST_MODEL_END) {\n distance = (distance << limit) >>> 0;\n // probs = pos_special + rep0 - slot - 1, indexed from 1.\n const base = distance - slot - 1;\n let symbol = 1;\n for (let bitIndex = 0; bitIndex < limit; bitIndex += 1) {\n const bit = this.bit(this.posSpecial, base + symbol);\n symbol = (symbol << 1) | bit;\n if (bit === 1) {\n distance = (distance + (1 << bitIndex)) >>> 0;\n }\n }\n return distance;\n }\n // rc_direct\n limit -= ALIGN_BITS;\n for (let count = limit; count > 0; count -= 1) {\n this.normalize();\n this.range >>>= 1;\n this.code = (this.code - this.range) >>> 0;\n const bound = (0 - (this.code >>> 31)) >>> 0;\n this.code = (this.code + (this.range & bound)) >>> 0;\n distance = ((distance << 1) + ((bound + 1) >>> 0)) >>> 0;\n }\n distance = (distance << ALIGN_BITS) >>> 0;\n let symbol = 0;\n for (let offset = 1; offset < ALIGN_SIZE; offset <<= 1) {\n if (this.bit(this.posAlign, offset + symbol) === 1) {\n symbol += offset;\n }\n }\n return (distance + symbol) >>> 0;\n }\n\n /** lzma_decode, one symbol: true at the end of the stream. */\n private symbol(): boolean {\n const posState = this.total & this.posMask;\n const state = this.state;\n if (this.bit(this.isMatch, state * POS_STATES_MAX + posState) === 0) {\n let matched = false;\n if (state < LIT_STATES) {\n this.state = state <= 3 ? 0 : state - 3;\n } else {\n this.state = state <= 9 ? state - 3 : state - 6;\n matched = true;\n }\n this.put(this.decodeLiteral(matched));\n return false;\n }\n let length: number;\n if (this.bit(this.isRep, state) === 0) {\n // Simple match.\n this.state = state < LIT_STATES ? 7 : 10;\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n length = this.length(this.matchLength, posState);\n this.rep0 = this.decodeDistance(length);\n if (this.rep0 === UINT32_MAX) {\n // End of payload marker: the range coder must be finished.\n this.normalize();\n if (this.code !== 0) {\n throw new CorruptData();\n }\n return true;\n }\n if (!this.distanceValid(this.rep0)) {\n throw new CorruptData();\n }\n } else {\n // Repeated match.\n if (!this.distanceValid(0)) {\n throw new CorruptData();\n }\n if (this.bit(this.isRep0, state) === 0) {\n if (\n this.bit(this.isRep0Long, state * POS_STATES_MAX + posState) === 0\n ) {\n this.state = state < LIT_STATES ? 9 : 11;\n this.put(this.byteAt(this.rep0));\n return false;\n }\n } else {\n let distance: number;\n if (this.bit(this.isRep1, state) === 0) {\n distance = this.rep1;\n } else {\n if (this.bit(this.isRep2, state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n this.state = state < LIT_STATES ? 8 : 11;\n length = this.length(this.repLength, posState);\n }\n for (let index = 0; index < length; index += 1) {\n this.put(this.byteAt(this.rep0));\n }\n return false;\n }\n}\n\nclass CorruptData extends Error {}\n\n/**\n * zipfile's `LZMADecompressor`: reads the 4-byte zip LZMA header and the\n * properties, then decodes raw LZMA1.\n */\nexport class ZipLzmaDecompressor {\n capped = false;\n\n private decoder: RawLzma1Decoder | null = null;\n private unconsumed: Uint8Array = new Uint8Array(0);\n\n get eof(): boolean {\n return this.decoder?.eof ?? false;\n }\n\n decompress(data: Uint8Array, _maxLength: number, cap: number): Uint8Array {\n let input = data;\n if (this.decoder === null) {\n const joined = new Uint8Array(this.unconsumed.length + data.length);\n joined.set(this.unconsumed);\n joined.set(data, this.unconsumed.length);\n this.unconsumed = joined;\n if (joined.length <= 4) {\n return new Uint8Array(0);\n }\n const propertiesSize =\n (joined[2] as number) | ((joined[3] as number) << 8);\n if (joined.length <= 4 + propertiesSize) {\n return new Uint8Array(0);\n }\n const properties = decodeProperties(\n joined.subarray(4, 4 + propertiesSize),\n );\n if (properties === null) {\n throw new LzmaError('Invalid or unsupported options');\n }\n this.decoder = new RawLzma1Decoder(properties);\n input = joined.subarray(4 + propertiesSize);\n this.unconsumed = new Uint8Array(0);\n }\n const output = this.decoder.decompress(input, cap);\n this.capped = this.decoder.capped;\n return output;\n }\n}\n","// Port of zlib 1.3's inflate() (inflate.c, inftrees.c) and of Python's\n// `zlib.decompressobj()` wrapper around it (Modules/zlibmodule.c), for raw\n// deflate (wbits -15, used by zipfile) and gzip (wbits 31, used by\n// parsedmarc's `_decompress_gzip_bounded`).\n//\n// node:zlib is not used because its behavior differs between Node, Bun and\n// Deno, and because parsedmarc's results depend on zlib details node:zlib\n// does not expose: where a stream stops when the output limit is reached\n// (`max_length`), how much input is left unconsumed, which error is reported\n// first, and the exact error messages. The state machine below follows\n// inflate.c state by state: it pulls input one byte at a time only when it\n// needs more bits, and checks for output space only right before writing a\n// byte, so it stops and fails at exactly the same points as zlib.\n\nimport { crc32Update } from './crc';\n\n/** Python's `zlib.error`. */\nexport class ZlibError extends Error {\n override name = 'error';\n}\n\nconst Z_DATA_ERROR = -3;\nconst NEED_INPUT = 0;\nconst NEED_OUTPUT = 1;\ntype Pause = typeof NEED_INPUT | typeof NEED_OUTPUT;\n\nconst MAX_BITS = 15;\nconst WINDOW_SIZE = 32_768;\nconst FIRST_BLOCK = 32 * 1024;\n/** Table entry symbol for an unused code of an incomplete code. */\nconst INVALID = 0xff_ff;\nconst END_OF_BLOCK = 256;\n/** Fixed-code symbols 286, 287 and distances 30, 31 are invalid. */\nconst LENGTH_SYMBOLS = 286;\nconst DISTANCE_SYMBOLS = 30;\n\nconst ORDER = [\n 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15,\n];\nconst LENGTH_BASE = [\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67,\n 83, 99, 115, 131, 163, 195, 227, 258,\n];\nconst LENGTH_EXTRA = [\n 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5,\n 5, 5, 0,\n];\nconst DIST_BASE = [\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769,\n 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12_289, 16_385, 24_577,\n];\nconst DIST_EXTRA = [\n 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11,\n 11, 12, 12, 13, 13,\n];\n\n/**\n * A decoding table in two levels, like zlib's: `rootBits` input bits index\n * the root table, and a code longer than that continues in a subtable placed\n * after it. An entry is `(codeLength << 16) | symbol`, usable once\n * `codeLength` bits (the whole code, also in subtables) are available; a\n * negative entry points to a subtable (see {@link subtableEntry}). A flat\n * table would take 2^15 writes per code, for a block that is 30 bytes long.\n */\ninterface HuffmanTable {\n entries: Int32Array;\n mask: number;\n rootBits: number;\n}\n\n/** inftrees.c `codetype`: CODES, LENS or DISTS. */\nexport const TableKind = { Codes: 0, Dists: 2, Lens: 1 } as const;\ntype TableKindValue = (typeof TableKind)[keyof typeof TableKind];\n\n/** Root table bits per kind: inflate.c's 7, 9 and 6. */\nconst ROOT_BITS = [7, 9, 6] as const;\n/** Low bits of a decoded subtable pointer: the subtable's index bits. */\nconst SUBTABLE_BITS = 4;\nconst SUBTABLE_MASK = (1 << SUBTABLE_BITS) - 1;\n\n/** The entry for the code under `pointer` (a negative root entry). */\nfunction subtableEntry(\n entries: Int32Array,\n pointer: number,\n hold: number,\n rootBits: number,\n): number {\n const packed = ~pointer;\n const index = (hold >>> rootBits) & ((1 << (packed & SUBTABLE_MASK)) - 1);\n return entries[(packed >>> SUBTABLE_BITS) + index] as number;\n}\n\nfunction reverseBits(code: number, length: number): number {\n let reversed = 0;\n for (let bit = 0; bit < length; bit += 1) {\n reversed = (reversed << 1) | ((code >>> bit) & 1);\n }\n return reversed;\n}\n\n// Scratch space of buildTable(): off-heap allocations would be most of the\n// cost of a table, and a block can be 30 bytes.\nconst counts = new Uint16Array(MAX_BITS + 1);\nconst nextCode = new Uint16Array(MAX_BITS + 1);\nconst codes = new Uint16Array(320);\nconst longest = new Uint8Array(1 << 9);\nconst offsets = new Int32Array(1 << 9);\n\n/**\n * inftrees.c `inflate_table()`: `null` for an over-subscribed or (where\n * zlib rejects it) incomplete code.\n */\nexport function buildTable(\n lengths: Uint8Array,\n start: number,\n count: number,\n kind: TableKindValue,\n /** Reused for the entries when large enough. */\n buffer?: Int32Array,\n): HuffmanTable | null {\n counts.fill(0);\n for (let symbol = 0; symbol < count; symbol += 1) {\n const length = lengths[start + symbol] as number;\n counts[length] = (counts[length] as number) + 1;\n }\n let max = MAX_BITS;\n while (max >= 1 && counts[max] === 0) {\n max -= 1;\n }\n if (max === 0) {\n // No symbols: zlib builds a 1-bit table of invalid entries so the\n // error is reported when a code is decoded.\n const invalid = (1 << 16) | INVALID;\n return { entries: Int32Array.of(invalid, invalid), mask: 1, rootBits: 1 };\n }\n let left = 1;\n for (let length = 1; length <= MAX_BITS; length += 1) {\n left <<= 1;\n left -= counts[length] as number;\n if (left < 0) {\n return null;\n }\n }\n if (left > 0 && (kind === TableKind.Codes || max !== 1)) {\n return null;\n }\n // Canonical codes: consecutive values per length, shorter codes first.\n let code = 0;\n for (let length = 1; length <= MAX_BITS; length += 1) {\n nextCode[length] = code;\n code = (code + (counts[length] as number)) << 1;\n }\n const rootBits = Math.min(max, ROOT_BITS[kind]);\n const rootSize = 1 << rootBits;\n const mask = rootSize - 1;\n // Each symbol's code, as the bit-reversed index it is looked up by, and the\n // longest code under each root entry, which sets its subtable's size.\n const hasSubtables = max > rootBits;\n if (hasSubtables) {\n longest.fill(0, 0, rootSize);\n }\n for (let symbol = 0; symbol < count; symbol += 1) {\n const length = lengths[start + symbol] as number;\n if (length === 0) {\n continue;\n }\n const assigned = nextCode[length] as number;\n nextCode[length] = assigned + 1;\n const reversed = reverseBits(assigned, length);\n codes[symbol] = reversed;\n if (length > rootBits && length > (longest[reversed & mask] as number)) {\n longest[reversed & mask] = length;\n }\n }\n // Subtables follow the root table.\n let size = rootSize;\n if (hasSubtables) {\n for (let root = 0; root < rootSize; root += 1) {\n const deepest = longest[root] as number;\n if (deepest > 0) {\n offsets[root] = size;\n size += 1 << (deepest - rootBits);\n }\n }\n }\n const entries =\n buffer !== undefined && size <= buffer.length\n ? buffer\n : new Int32Array(size);\n if (left > 0) {\n // Only an incomplete 1-bit code leaves entries unfilled.\n entries.fill((1 << 16) | INVALID);\n }\n if (hasSubtables) {\n for (let root = 0; root < rootSize; root += 1) {\n const deepest = longest[root] as number;\n if (deepest > 0) {\n const offset = offsets[root] as number;\n entries[root] = ~((offset << SUBTABLE_BITS) | (deepest - rootBits));\n }\n }\n }\n for (let symbol = 0; symbol < count; symbol += 1) {\n const length = lengths[start + symbol] as number;\n if (length === 0) {\n continue;\n }\n const entry = (length << 16) | symbol;\n const reversed = codes[symbol] as number;\n if (length <= rootBits) {\n for (let index = reversed; index < rootSize; index += 1 << length) {\n entries[index] = entry;\n }\n continue;\n }\n const root = reversed & mask;\n const offset = offsets[root] as number;\n const subtableSize = 1 << ((longest[root] as number) - rootBits);\n const step = 1 << (length - rootBits);\n for (\n let index = reversed >>> rootBits;\n index < subtableSize;\n index += step\n ) {\n entries[offset + index] = entry;\n }\n }\n return { entries, mask, rootBits };\n}\n\nconst FIXED_TABLES: { lengths: HuffmanTable; distances: HuffmanTable } =\n (() => {\n const lengths = new Uint8Array(288);\n lengths.fill(8, 0, 144);\n lengths.fill(9, 144, 256);\n lengths.fill(7, 256, 280);\n lengths.fill(8, 280, 288);\n const distances = new Uint8Array(32).fill(5);\n return {\n distances: buildTable(distances, 0, 32, TableKind.Dists) as HuffmanTable,\n lengths: buildTable(lengths, 0, 288, TableKind.Lens) as HuffmanTable,\n };\n })();\n\nconst EMPTY = new Uint8Array(0);\n/** Over zlib's ENOUGH_LENS (852) and ENOUGH_DISTS (592). */\nconst ENTRIES_BUFFER_SIZE = 2048;\n/** inflate_fast() needs 6 input bytes and 258 bytes of output space. */\nconst FAST_INPUT = 6;\nconst FAST_OUTPUT = 258;\n\n/**\n * Python's `zlib.decompressobj(wbits)` for wbits -15 (raw) and 31 (gzip).\n */\nexport class ZlibDecompressor {\n /** Python's `Decompress.eof`. */\n eof = false;\n\n private readonly gzip: boolean;\n private input: Uint8Array = EMPTY;\n private position = 0;\n private hold = 0;\n private bits = 0;\n /** The last 32 KiB of earlier output (the window), then this call's. */\n private buffer: Uint8Array = EMPTY;\n /** Where this call's output starts in `buffer`. */\n private start = 0;\n /** Next write position in `buffer`. */\n private out = 0;\n /** `start + max_length`: zlib stops when it needs to write here. */\n private outEnd = 0;\n /** Bytes produced by earlier calls. */\n private totalBefore = 0;\n private crcFrom = 0;\n private check = 0;\n private failure: ZlibError | null = null;\n private readonly machine: Generator<Pause, void, void>;\n // A dynamic block's tables live until the next one, so they are reused\n // (per decompressor: decoding pauses at the end of the input).\n private readonly codeLengths = new Uint8Array(19);\n private readonly symbolLengths = new Uint8Array(320);\n private readonly codeEntries = new Int32Array(\n 1 << ROOT_BITS[TableKind.Codes],\n );\n private readonly lengthEntries = new Int32Array(ENTRIES_BUFFER_SIZE);\n private readonly distanceEntries = new Int32Array(ENTRIES_BUFFER_SIZE);\n\n constructor(wbits: -15 | 31) {\n this.gzip = wbits === 31;\n this.machine = this.run();\n }\n\n /** Python's `Decompress.unconsumed_tail`. */\n get unconsumedTail(): Uint8Array {\n return this.eof ? EMPTY : this.input.subarray(this.position);\n }\n\n /**\n * Python's `Decompress.decompress(data, max_length)`; `maxLength` 0\n * means unlimited. Throws {@link ZlibError} on corrupt data.\n */\n decompress(data: Uint8Array, maxLength = 0): Uint8Array {\n if (this.failure !== null) {\n throw this.failure;\n }\n this.input = data;\n this.position = 0;\n this.startOutput(maxLength === 0 ? Number.POSITIVE_INFINITY : maxLength);\n this.pump(true);\n return this.finishOutput();\n }\n\n /**\n * Python's `Decompress.flush()`: decompress the unconsumed tail without\n * an output limit. Like CPython, errors here are not raised: the output\n * produced before the error is returned.\n */\n flush(): Uint8Array {\n if (this.failure !== null) {\n return EMPTY;\n }\n this.input = this.unconsumedTail;\n this.position = 0;\n this.startOutput(Number.POSITIVE_INFINITY);\n this.pump(false);\n return this.finishOutput();\n }\n\n private startOutput(limit: number): void {\n const keep = Math.min(WINDOW_SIZE, this.totalBefore);\n const buffer = new Uint8Array(keep + Math.min(limit, FIRST_BLOCK));\n buffer.set(this.buffer.subarray(this.out - keep, this.out));\n this.buffer = buffer;\n this.start = keep;\n this.out = keep;\n this.outEnd = keep + limit;\n this.crcFrom = keep;\n }\n\n private finishOutput(): Uint8Array {\n this.updateCheck();\n this.totalBefore += this.out - this.start;\n return this.buffer.subarray(this.start, this.out);\n }\n\n private pump(raise: boolean): void {\n if (this.eof) {\n return;\n }\n let step: IteratorResult<Pause, void>;\n try {\n // NEED_OUTPUT is only yielded at `outEnd`: either way, stop.\n step = this.machine.next();\n } catch (error) {\n if (error instanceof ZlibError) {\n this.failure = error;\n if (!raise) {\n return;\n }\n }\n throw error;\n }\n if (step.done === true) {\n this.eof = true;\n }\n }\n\n /** Make room for `needed` more bytes (never past `outEnd`). */\n private grow(needed: number): void {\n const size = Math.min(\n this.outEnd,\n Math.max(this.out + needed, this.buffer.length * 2),\n );\n const grown = new Uint8Array(size);\n grown.set(this.buffer.subarray(0, this.out));\n this.buffer = grown;\n }\n\n private get total(): number {\n return this.totalBefore + this.out - this.start;\n }\n\n private updateCheck(): void {\n if (this.gzip && this.out > this.crcFrom) {\n this.check = crc32Update(this.check, this.buffer, this.crcFrom, this.out);\n }\n this.crcFrom = this.out;\n }\n\n private error(message: string): ZlibError {\n return new ZlibError(\n `Error ${Z_DATA_ERROR} while decompressing data: ${message}`,\n );\n }\n\n /** NEEDBITS(count) for count <= 16: false when input runs out. */\n private pull(count: number): boolean {\n while (this.bits < count) {\n if (this.position >= this.input.length) {\n return false;\n }\n this.hold |= (this.input[this.position] as number) << this.bits;\n this.position += 1;\n this.bits += 8;\n }\n return true;\n }\n\n private drop(count: number): void {\n this.hold >>>= count;\n this.bits -= count;\n }\n\n // Read a 16-bit little-endian word (two of these make NEEDBITS(32)).\n private *word(): Generator<Pause, number, void> {\n while (!this.pull(16)) {\n yield NEED_INPUT;\n }\n const value = this.hold & 0xff_ff;\n this.drop(16);\n return value;\n }\n\n private *bitsValue(count: number): Generator<Pause, number, void> {\n while (!this.pull(count)) {\n yield NEED_INPUT;\n }\n const value = this.hold & ((1 << count) - 1);\n this.drop(count);\n return value;\n }\n\n /**\n * One table lookup, pulling input bytes until the code is complete\n * (inflate.c LEN/DIST/CODELENS loops); -1 when input runs out.\n */\n private lookup(table: HuffmanTable): number {\n for (;;) {\n let entry = table.entries[this.hold & table.mask] as number;\n if (entry < 0) {\n entry = subtableEntry(table.entries, entry, this.hold, table.rootBits);\n }\n if (entry >>> 16 <= this.bits) {\n this.drop(entry >>> 16);\n return entry & 0xff_ff;\n }\n if (this.position >= this.input.length) {\n return -1;\n }\n this.hold |= (this.input[this.position] as number) << this.bits;\n this.position += 1;\n this.bits += 8;\n }\n }\n\n private *decode(table: HuffmanTable): Generator<Pause, number, void> {\n let symbol = this.lookup(table);\n while (symbol < 0) {\n yield NEED_INPUT;\n symbol = this.lookup(table);\n }\n return symbol;\n }\n\n // Wait until a byte can be written at `out`.\n private *room(): Generator<Pause, void, void> {\n while (this.out >= this.outEnd) {\n yield NEED_OUTPUT;\n }\n if (this.out >= this.buffer.length) {\n this.grow(1);\n }\n }\n\n private *run(): Generator<Pause, void, void> {\n if (this.gzip) {\n yield* this.gzipHeader();\n }\n let last = false;\n while (!last) {\n const header = yield* this.bitsValue(3);\n last = (header & 1) === 1;\n const type = header >>> 1;\n if (type === 0) {\n yield* this.storedBlock();\n } else if (type === 1) {\n yield* this.codes(FIXED_TABLES.lengths, FIXED_TABLES.distances);\n } else if (type === 2) {\n const tables = yield* this.dynamicTables();\n yield* this.codes(tables.lengths, tables.distances);\n } else {\n throw this.error('invalid block type');\n }\n }\n // BYTEBITS: go to a byte boundary.\n this.drop(this.bits & 7);\n if (this.gzip) {\n yield* this.gzipTrailer();\n }\n }\n\n private crcWord(word: number): void {\n this.check = crc32Update(\n this.check,\n Uint8Array.of(word & 0xff, word >>> 8),\n );\n }\n\n private *gzipHeader(): Generator<Pause, void, void> {\n const magic = yield* this.word();\n if (magic !== 0x8b_1f) {\n throw this.error('incorrect header check');\n }\n this.check = 0;\n this.crcWord(magic);\n while (!this.pull(16)) {\n yield NEED_INPUT;\n }\n const flags = this.hold & 0xff_ff;\n if ((flags & 0xff) !== 8) {\n throw this.error('unknown compression method');\n }\n if (flags & 0xe0_00) {\n throw this.error('unknown header flags set');\n }\n this.drop(16);\n const headerCrc = (flags & 0x02_00) !== 0;\n const crcWord = (word: number): void => {\n if (headerCrc) {\n this.crcWord(word);\n }\n };\n crcWord(flags);\n // TIME (32 bits) and OS (16 bits).\n for (let index = 0; index < 3; index += 1) {\n crcWord(yield* this.word());\n }\n if (flags & 0x04_00) {\n const extraLength = yield* this.word();\n crcWord(extraLength);\n yield* this.skipInput(extraLength, headerCrc);\n }\n for (const flag of [0x08_00, 0x10_00]) {\n if (flags & flag) {\n yield* this.skipString(headerCrc);\n }\n }\n if (headerCrc) {\n while (!this.pull(16)) {\n yield NEED_INPUT;\n }\n if ((this.hold & 0xff_ff) !== (this.check & 0xff_ff)) {\n throw this.error('header crc mismatch');\n }\n this.drop(16);\n }\n this.check = 0;\n }\n\n // EXTRA: skip header bytes straight from the input.\n private *skipInput(\n length: number,\n headerCrc: boolean,\n ): Generator<Pause, void, void> {\n let left = length;\n while (left > 0) {\n if (this.position >= this.input.length) {\n yield NEED_INPUT;\n continue;\n }\n const end = Math.min(this.position + left, this.input.length);\n if (headerCrc) {\n this.check = crc32Update(this.check, this.input, this.position, end);\n }\n left -= end - this.position;\n this.position = end;\n }\n }\n\n // NAME / COMMENT: skip a zero-terminated header string.\n private *skipString(headerCrc: boolean): Generator<Pause, void, void> {\n for (;;) {\n if (this.position >= this.input.length) {\n yield NEED_INPUT;\n continue;\n }\n const byte = this.input[this.position] as number;\n if (headerCrc) {\n this.check = crc32Update(\n this.check,\n this.input,\n this.position,\n this.position + 1,\n );\n }\n this.position += 1;\n if (byte === 0) {\n return;\n }\n }\n }\n\n private *gzipTrailer(): Generator<Pause, void, void> {\n const crcLow = yield* this.word();\n const crcHigh = yield* this.word();\n this.updateCheck();\n if (((crcHigh << 16) | crcLow) >>> 0 !== this.check) {\n throw this.error('incorrect data check');\n }\n const sizeLow = yield* this.word();\n const sizeHigh = yield* this.word();\n if (((sizeHigh << 16) | sizeLow) >>> 0 !== this.total % 2 ** 32) {\n throw this.error('incorrect length check');\n }\n }\n\n private *storedBlock(): Generator<Pause, void, void> {\n this.drop(this.bits & 7);\n const length = yield* this.word();\n const complement = yield* this.word();\n if (length !== (complement ^ 0xff_ff)) {\n throw this.error('invalid stored block lengths');\n }\n let left = length;\n while (left > 0) {\n if (this.position >= this.input.length) {\n yield NEED_INPUT;\n continue;\n }\n yield* this.room();\n const copy = Math.min(\n left,\n this.input.length - this.position,\n this.buffer.length - this.out,\n );\n this.buffer.set(\n this.input.subarray(this.position, this.position + copy),\n this.out,\n );\n this.out += copy;\n this.position += copy;\n left -= copy;\n }\n }\n\n private *dynamicTables(): Generator<\n Pause,\n { lengths: HuffmanTable; distances: HuffmanTable },\n void\n > {\n while (!this.pull(14)) {\n yield NEED_INPUT;\n }\n const lengthCount = (this.hold & 31) + 257;\n const distanceCount = ((this.hold >>> 5) & 31) + 1;\n const codeCount = ((this.hold >>> 10) & 15) + 4;\n this.drop(14);\n if (lengthCount > 286 || distanceCount > 30) {\n throw this.error('too many length or distance symbols');\n }\n const { codeLengths, symbolLengths: lengths } = this;\n codeLengths.fill(0);\n for (let index = 0; index < codeCount; index += 1) {\n codeLengths[ORDER[index] as number] = yield* this.bitsValue(3);\n }\n const codeTable = buildTable(\n codeLengths,\n 0,\n 19,\n TableKind.Codes,\n this.codeEntries,\n );\n if (codeTable === null) {\n throw this.error('invalid code lengths set');\n }\n const total = lengthCount + distanceCount;\n let have = 0;\n while (have < total) {\n let symbol = yield* this.decode(codeTable);\n if (symbol === INVALID) {\n // zlib's invalid entry in an empty code-length code has value 0.\n symbol = 0;\n }\n if (symbol < 16) {\n lengths[have] = symbol;\n have += 1;\n continue;\n }\n let repeat: number;\n let value = 0;\n if (symbol === 16) {\n while (!this.pull(2)) {\n yield NEED_INPUT;\n }\n if (have === 0) {\n throw this.error('invalid bit length repeat');\n }\n value = lengths[have - 1] as number;\n repeat = 3 + (yield* this.bitsValue(2));\n } else if (symbol === 17) {\n repeat = 3 + (yield* this.bitsValue(3));\n } else {\n repeat = 11 + (yield* this.bitsValue(7));\n }\n if (have + repeat > total) {\n throw this.error('invalid bit length repeat');\n }\n lengths.fill(value, have, have + repeat);\n have += repeat;\n }\n if (lengths[END_OF_BLOCK] === 0) {\n throw this.error('invalid code -- missing end-of-block');\n }\n const lengthTable = buildTable(\n lengths,\n 0,\n lengthCount,\n TableKind.Lens,\n this.lengthEntries,\n );\n if (lengthTable === null) {\n throw this.error('invalid literal/lengths set');\n }\n const distanceTable = buildTable(\n lengths,\n lengthCount,\n distanceCount,\n TableKind.Dists,\n this.distanceEntries,\n );\n if (distanceTable === null) {\n throw this.error('invalid distances set');\n }\n return { distances: distanceTable, lengths: lengthTable };\n }\n\n private *codes(\n lengthTable: HuffmanTable,\n distanceTable: HuffmanTable,\n ): Generator<Pause, void, void> {\n for (;;) {\n if (\n this.input.length - this.position >= FAST_INPUT &&\n this.out + FAST_OUTPUT <= this.outEnd\n ) {\n if (this.out + FAST_OUTPUT > this.buffer.length) {\n this.grow(FAST_OUTPUT);\n }\n if (this.fastCodes(lengthTable, distanceTable)) {\n return;\n }\n continue;\n }\n // inflate.c's slow path, one symbol at a time.\n const symbol = yield* this.decode(lengthTable);\n if (symbol < END_OF_BLOCK) {\n yield* this.room();\n this.buffer[this.out] = symbol;\n this.out += 1;\n continue;\n }\n if (symbol === END_OF_BLOCK) {\n return;\n }\n if (symbol >= LENGTH_SYMBOLS) {\n throw this.error('invalid literal/length code');\n }\n const lengthIndex = symbol - 257;\n const length =\n (LENGTH_BASE[lengthIndex] as number) +\n (yield* this.bitsValue(LENGTH_EXTRA[lengthIndex] as number));\n const distanceSymbol = yield* this.decode(distanceTable);\n if (distanceSymbol >= DISTANCE_SYMBOLS) {\n throw this.error('invalid distance code');\n }\n const distance =\n (DIST_BASE[distanceSymbol] as number) +\n (yield* this.bitsValue(DIST_EXTRA[distanceSymbol] as number));\n for (let left = length; left > 0; left -= 1) {\n yield* this.room();\n if (distance > this.total) {\n throw this.error('invalid distance too far back');\n }\n this.buffer[this.out] = this.buffer[this.out - distance] as number;\n this.out += 1;\n }\n }\n }\n\n /**\n * inffast.c `inflate_fast()`: decode while at least 6 input bytes (one\n * length/distance pair needs at most 48 bits) and 258 bytes of output\n * space are available. Returns true at the end of the block.\n */\n // oxlint-disable-next-line complexity -- mirrors inflate_fast\n private fastCodes(\n lengthTable: HuffmanTable,\n distanceTable: HuffmanTable,\n ): boolean {\n const input = this.input;\n const buffer = this.buffer;\n const lengthEntries = lengthTable.entries;\n const lengthMask = lengthTable.mask;\n const distanceEntries = distanceTable.entries;\n const distanceMask = distanceTable.mask;\n const lengthRootBits = lengthTable.rootBits;\n const distanceRootBits = distanceTable.rootBits;\n const lastInput = input.length - (FAST_INPUT - 1);\n const lastOutput = Math.min(this.outEnd, buffer.length) - FAST_OUTPUT;\n const totalBase = this.totalBefore - this.start;\n let position = this.position;\n let hold = this.hold;\n let bits = this.bits;\n let out = this.out;\n let endOfBlock = false;\n let failure: string | null = null;\n while (position < lastInput && out <= lastOutput) {\n if (bits < 15) {\n hold |= (input[position] as number) << bits;\n hold |= (input[position + 1] as number) << (bits + 8);\n position += 2;\n bits += 16;\n }\n let entry = lengthEntries[hold & lengthMask] as number;\n if (entry < 0) {\n entry = subtableEntry(lengthEntries, entry, hold, lengthRootBits);\n }\n let size = entry >>> 16;\n hold >>>= size;\n bits -= size;\n const symbol = entry & 0xff_ff;\n if (symbol < END_OF_BLOCK) {\n buffer[out] = symbol;\n out += 1;\n continue;\n }\n if (symbol === END_OF_BLOCK) {\n endOfBlock = true;\n break;\n }\n if (symbol >= LENGTH_SYMBOLS) {\n failure = 'invalid literal/length code';\n break;\n }\n let length = LENGTH_BASE[symbol - 257] as number;\n let extra = LENGTH_EXTRA[symbol - 257] as number;\n if (extra > 0) {\n if (bits < extra) {\n hold |= (input[position] as number) << bits;\n position += 1;\n bits += 8;\n }\n length += hold & ((1 << extra) - 1);\n hold >>>= extra;\n bits -= extra;\n }\n if (bits < 15) {\n hold |= (input[position] as number) << bits;\n hold |= (input[position + 1] as number) << (bits + 8);\n position += 2;\n bits += 16;\n }\n entry = distanceEntries[hold & distanceMask] as number;\n if (entry < 0) {\n entry = subtableEntry(distanceEntries, entry, hold, distanceRootBits);\n }\n size = entry >>> 16;\n hold >>>= size;\n bits -= size;\n const distanceSymbol = entry & 0xff_ff;\n if (distanceSymbol >= DISTANCE_SYMBOLS) {\n failure = 'invalid distance code';\n break;\n }\n let distance = DIST_BASE[distanceSymbol] as number;\n extra = DIST_EXTRA[distanceSymbol] as number;\n if (extra > 0) {\n while (bits < extra) {\n hold |= (input[position] as number) << bits;\n position += 1;\n bits += 8;\n }\n distance += hold & ((1 << extra) - 1);\n hold >>>= extra;\n bits -= extra;\n }\n if (distance > totalBase + out) {\n failure = 'invalid distance too far back';\n break;\n }\n for (let index = 0; index < length; index += 1) {\n buffer[out] = buffer[out - distance] as number;\n out += 1;\n }\n }\n // Return whole unused bytes to the input, like inflate_fast.\n const unused = bits >>> 3;\n position -= unused;\n bits -= unused << 3;\n this.position = position;\n this.hold = hold & ((1 << bits) - 1);\n this.bits = bits;\n this.out = out;\n if (failure !== null) {\n throw this.error(failure);\n }\n return endOfBlock;\n }\n}\n","// Port of the libzstd 1.5.7 frame decoder (lib/decompress/zstd_decompress.c,\n// zstd_decompress_block.c, huf_decompress.c, lib/common/fse_decompress.c,\n// entropy_common.c, bitstream.h, xxhash.h) and of the loop CPython 3.14's\n// `compression.zstd.ZstdDecompressor().decompress(data)` runs around\n// ZSTD_decompressStream() (Modules/_zstd/decompressor.c), as zipfile uses it\n// for ZIP_ZSTANDARD members.\n//\n// Why a port and not a library: the result of a corrupt or truncated member\n// (which error, after which output) depends on libzstd's exact control flow:\n// its streaming stages, the single-pass shortcut it takes when the whole\n// frame fits in CPython's output buffer, the ring output buffer, where\n// literals are staged, the x86-64 BMI2 fast Huffman loops (which skip the\n// end-of-stream checks of the generic loops) and the 64-bit bit-container\n// arithmetic. This file follows the C code path by path, including the\n// arithmetic of corrupt streams, so it raises the same ZSTD_getErrorName()\n// message at the same point.\n//\n// Not ported: wildcopy writes past the end of a copy (they only matter when\n// a corrupt frame later reads stale ring-buffer memory) and the legacy\n// (v0.5–v0.7) frame formats, which the system libzstd also decodes; a legacy\n// frame here produces no output and never ends.\n\n/** Python's `compression.zstd.ZstdError`. */\nexport class ZstdError extends Error {\n override name = 'ZstdError';\n}\n\n/** lib/common/error_private.c ERR_getErrorString(). */\nconst ERROR_NAMES = {\n GENERIC: 'Error (generic)',\n checksum_wrong: \"Restored data doesn't match checksum\",\n corruption_detected: 'Data corruption detected',\n dictionary_corrupted: 'Dictionary is corrupted',\n dictionary_wrong: 'Dictionary mismatch',\n dstSize_tooSmall: 'Destination buffer is too small',\n frameParameter_unsupported: 'Unsupported frame parameter',\n frameParameter_windowTooLarge: 'Frame requires too much memory for decoding',\n literals_headerWrong:\n \"Header of Literals' block doesn't respect format specification\",\n prefix_unknown: 'Unknown frame descriptor',\n srcSize_wrong: 'Src size is incorrect',\n} as const;\ntype ErrorCode = keyof typeof ERROR_NAMES;\n\n/** An internal RETURN_ERROR(); converted to ZstdError at the API. */\nclass Fail extends Error {\n readonly code: ErrorCode;\n\n constructor(code: ErrorCode) {\n super(code);\n this.code = code;\n }\n}\n\nfunction fail(code: ErrorCode): never {\n throw new Fail(code);\n}\n\nconst EMPTY = new Uint8Array(0);\nconst ZSTD_MAGICNUMBER = 0xfd_2f_b5_28;\nconst ZSTD_MAGIC_SKIPPABLE_START = 0x18_4d_2a_50;\nconst ZSTD_MAGIC_SKIPPABLE_MASK = 0xff_ff_ff_f0;\nconst FRAMEHEADERSIZE_PREFIX = 5;\nconst FRAMEHEADERSIZE_MIN = 6;\nconst SKIPPABLEHEADERSIZE = 8;\nconst BLOCK_HEADER_SIZE = 3;\nconst BLOCKSIZE_MAX = 1 << 17;\nconst WINDOWLOG_MAX = 31;\nconst WINDOWLOG_ABSOLUTEMIN = 10;\n/** ZSTD_MAXWINDOWSIZE_DEFAULT: (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) + 1. */\nconst MAX_WINDOW_SIZE = 2 ** 27 + 1;\nconst WILDCOPY_OVERLENGTH = 32;\nconst LITBUFFEREXTRASIZE = 1 << 16;\nconst MIN_CBLOCK_SIZE = 2;\nconst MIN_LITERALS_FOR_4_STREAMS = 6;\nconst LONGNBSEQ = 0x7f_00;\nconst CONTENTSIZE_UNKNOWN = 2n ** 64n - 1n;\nconst DID_FIELD_SIZE = [0, 1, 2, 4];\nconst FCS_FIELD_SIZE = [0, 2, 4, 8];\nconst HUF_TABLELOG_MAX = 12;\nconst HUF_DECODER_FAST_TABLELOG = 11;\nconst FSE_MIN_TABLELOG = 5;\nconst FSE_TABLELOG_ABSOLUTE_MAX = 15;\nconst MAX_LL = 35;\nconst MAX_ML = 52;\nconst MAX_OFF = 31;\nconst LL_FSE_LOG = 9;\nconst ML_FSE_LOG = 9;\nconst OFF_FSE_LOG = 8;\n\nconst KB = 1024;\nconst MB = 1024 * KB;\n/** CPython's output buffer block sizes (pycore_blocks_output_buffer.h). */\nconst BUFFER_BLOCK_SIZE = [\n 32 * KB,\n 64 * KB,\n 256 * KB,\n MB,\n 4 * MB,\n 8 * MB,\n 16 * MB,\n 16 * MB,\n 32 * MB,\n 32 * MB,\n 32 * MB,\n 32 * MB,\n 64 * MB,\n 64 * MB,\n 128 * MB,\n 128 * MB,\n 256 * MB,\n];\n\nfunction byteAt(data: Uint8Array, index: number): number {\n return data[index] ?? 0;\n}\n\nfunction le16(data: Uint8Array, index: number): number {\n return byteAt(data, index) | (byteAt(data, index + 1) << 8);\n}\n\nfunction le24(data: Uint8Array, index: number): number {\n return le16(data, index) | (byteAt(data, index + 2) << 16);\n}\n\nfunction le32(data: Uint8Array, index: number): number {\n return (le24(data, index) | (byteAt(data, index + 3) << 24)) >>> 0;\n}\n\nfunction le64(data: Uint8Array, index: number): bigint {\n return BigInt(le32(data, index)) | (BigInt(le32(data, index + 4)) << 32n);\n}\n\n/** ZSTD_highbit32 (value > 0). */\nfunction highbit32(value: number): number {\n return 31 - Math.clz32(value);\n}\n\nfunction ctz32(value: number): number {\n return 31 - Math.clz32(value & -value);\n}\n\nfunction ctz64(hi: number, lo: number): number {\n return lo === 0 ? 32 + ctz32(hi) : ctz32(lo);\n}\n\n/** Low 32 bits of the 64-bit value (hi, lo) shifted right by 0..63. */\nfunction shiftRight64Low(hi: number, lo: number, shift: number): number {\n if (shift === 0) {\n return lo;\n }\n if (shift < 32) {\n return ((lo >>> shift) | (hi << (32 - shift))) >>> 0;\n }\n return hi >>> (shift - 32);\n}\n\n/** High 32 bits of the 64-bit value (hi, lo) shifted left by 0..63. */\nfunction shiftLeft64High(hi: number, lo: number, shift: number): number {\n if (shift === 0) {\n return hi;\n }\n if (shift < 32) {\n return ((hi << shift) | (lo >>> (32 - shift))) >>> 0;\n }\n return (lo << (shift - 32)) >>> 0;\n}\n\nfunction mask(bits: number): number {\n return bits >= 32 ? 0xff_ff_ff_ff : (1 << bits) - 1;\n}\n\n// ---------------------------------------------------------------------------\n// bitstream.h: BIT_DStream_t, a backward bit reader with a 64-bit container.\n\nconst BIT_UNFINISHED = 0;\nconst BIT_END_OF_BUFFER = 1;\nconst BIT_COMPLETED = 2;\nconst BIT_OVERFLOW = 3;\n/** `bitD->ptr` once it points to the static zeroFilled word. */\nconst ZERO_FILLED = -1;\n\nclass BitStream {\n buf: Uint8Array = EMPTY;\n start = 0;\n limitPtr = 0;\n ptr = 0;\n hi = 0;\n lo = 0;\n consumed = 0;\n\n private load(at: number): void {\n this.lo = le32(this.buf, at);\n this.hi = le32(this.buf, at + 4);\n }\n\n /** BIT_initDStream; false for an error. */\n init(buf: Uint8Array, start: number, size: number): boolean {\n this.buf = buf;\n if (size < 1) {\n this.start = 0;\n this.limitPtr = 0;\n this.ptr = 0;\n this.hi = 0;\n this.lo = 0;\n this.consumed = 0;\n return false;\n }\n this.start = start;\n this.limitPtr = start + 8;\n const lastByte = byteAt(buf, start + size - 1);\n this.consumed = lastByte ? 8 - highbit32(lastByte) : 0;\n if (size >= 8) {\n this.ptr = start + size - 8;\n this.load(this.ptr);\n return lastByte !== 0;\n }\n this.ptr = start;\n let lo = 0;\n let hi = 0;\n for (let index = 0; index < size; index += 1) {\n const byte = byteAt(buf, start + index);\n if (index < 4) {\n lo |= byte << (8 * index);\n } else {\n hi |= byte << (8 * (index - 4));\n }\n }\n this.lo = lo >>> 0;\n this.hi = hi >>> 0;\n if (lastByte === 0) {\n return false;\n }\n this.consumed += (8 - size) * 8;\n return true;\n }\n\n /** BIT_lookBits (getMiddleBits with `start & 63`). */\n look(bits: number): number {\n const shift = (((64 - this.consumed - bits) % 64) + 64) % 64;\n return (shiftRight64Low(this.hi, this.lo, shift) & mask(bits)) >>> 0;\n }\n\n /** BIT_lookBitsFast (bits >= 1). */\n lookFast(bits: number): number {\n const high = shiftLeft64High(this.hi, this.lo, this.consumed & 63);\n return bits >= 32 ? high : high >>> (32 - bits);\n }\n\n read(bits: number): number {\n const value = this.look(bits);\n this.consumed += bits;\n return value;\n }\n\n readFast(bits: number): number {\n const value = this.lookFast(bits);\n this.consumed += bits;\n return value;\n }\n\n private reloadInternal(): number {\n this.ptr -= this.consumed >>> 3;\n this.consumed &= 7;\n this.load(this.ptr);\n return BIT_UNFINISHED;\n }\n\n reloadFast(): number {\n if (this.ptr < this.limitPtr) {\n return BIT_OVERFLOW;\n }\n return this.reloadInternal();\n }\n\n reload(): number {\n if (this.consumed > 64) {\n this.ptr = ZERO_FILLED;\n return BIT_OVERFLOW;\n }\n if (this.ptr >= this.limitPtr) {\n return this.reloadInternal();\n }\n if (this.ptr === this.start) {\n return this.consumed < 64 ? BIT_END_OF_BUFFER : BIT_COMPLETED;\n }\n let bytes = this.consumed >>> 3;\n let result = BIT_UNFINISHED;\n if (this.ptr - bytes < this.start) {\n bytes = this.ptr - this.start;\n result = BIT_END_OF_BUFFER;\n }\n this.ptr -= bytes;\n this.consumed -= bytes * 8;\n this.load(this.ptr);\n return result;\n }\n\n ended(): boolean {\n return this.ptr === this.start && this.consumed === 64;\n }\n}\n\n// ---------------------------------------------------------------------------\n// xxhash.h XXH64 (seed 0), on 64-bit values held as two 32-bit halves.\n\nconst P64_1: [number, number] = [0x9e_37_79_b1, 0x85_eb_ca_87];\nconst P64_2: [number, number] = [0xc2_b2_ae_3d, 0x27_d4_eb_4f];\nconst P64_3: [number, number] = [0x16_56_67_b1, 0x9e_37_79_f9];\nconst P64_4: [number, number] = [0x85_eb_ca_77, 0xc2_b2_ae_63];\nconst P64_5: [number, number] = [0x27_d4_eb_2f, 0x16_56_67_c5];\n\ntype U64 = [number, number];\n\nfunction add64(a: U64, b: U64): U64 {\n const lo = a[1] + b[1];\n const hi = (a[0] + b[0] + (lo > 0xff_ff_ff_ff ? 1 : 0)) >>> 0;\n return [hi, lo >>> 0];\n}\n\nfunction mul64(a: U64, b: U64): U64 {\n const al = a[1];\n const bl = b[1];\n const al0 = al & 0xff_ff;\n const al1 = al >>> 16;\n const bl0 = bl & 0xff_ff;\n const bl1 = bl >>> 16;\n const p00 = al0 * bl0;\n const p01 = al0 * bl1;\n const p10 = al1 * bl0;\n const p11 = al1 * bl1;\n const middle = (p00 >>> 16) + (p01 & 0xff_ff) + (p10 & 0xff_ff);\n const lo = (((middle & 0xff_ff) << 16) | (p00 & 0xff_ff)) >>> 0;\n let hi = p11 + (p01 >>> 16) + (p10 >>> 16) + (middle >>> 16);\n hi = (hi + Math.imul(a[0], bl) + Math.imul(al, b[0])) >>> 0;\n return [hi, lo];\n}\n\nfunction rotl64(a: U64, bits: number): U64 {\n const [hi, lo] = a;\n if (bits === 32) {\n return [lo, hi];\n }\n if (bits < 32) {\n return [\n ((hi << bits) | (lo >>> (32 - bits))) >>> 0,\n ((lo << bits) | (hi >>> (32 - bits))) >>> 0,\n ];\n }\n const shift = bits - 32;\n return [\n ((lo << shift) | (hi >>> (32 - shift))) >>> 0,\n ((hi << shift) | (lo >>> (32 - shift))) >>> 0,\n ];\n}\n\nfunction xor64(a: U64, b: U64): U64 {\n return [(a[0] ^ b[0]) >>> 0, (a[1] ^ b[1]) >>> 0];\n}\n\nfunction shr64(a: U64, bits: number): U64 {\n if (bits >= 32) {\n return [0, a[0] >>> (bits - 32)];\n }\n return [a[0] >>> bits, ((a[1] >>> bits) | (a[0] << (32 - bits))) >>> 0];\n}\n\nfunction read64(data: Uint8Array, index: number): U64 {\n return [le32(data, index + 4), le32(data, index)];\n}\n\nfunction xxhRound(acc: U64, input: U64): U64 {\n return mul64(rotl64(add64(acc, mul64(input, P64_2)), 31), P64_1);\n}\n\nfunction xxhMergeRound(acc: U64, value: U64): U64 {\n return add64(mul64(xor64(acc, xxhRound([0, 0], value)), P64_1), P64_4);\n}\n\n/** XXH64_state_t with seed 0. */\nclass Xxh64 {\n private total = 0;\n private v1: U64 = add64(P64_1, P64_2);\n private v2: U64 = P64_2;\n private v3: U64 = [0, 0];\n private v4: U64 = [\n (-P64_1[0] - (P64_1[1] === 0 ? 0 : 1)) >>> 0,\n -P64_1[1] >>> 0,\n ];\n private readonly buffer = new Uint8Array(32);\n private buffered = 0;\n\n update(data: Uint8Array, start: number, end: number): void {\n this.total += end - start;\n let index = start;\n if (this.buffered + (end - index) < 32) {\n this.buffer.set(data.subarray(index, end), this.buffered);\n this.buffered += end - index;\n return;\n }\n if (this.buffered > 0) {\n const take = 32 - this.buffered;\n this.buffer.set(data.subarray(index, index + take), this.buffered);\n index += take;\n this.stripe(this.buffer, 0);\n this.buffered = 0;\n }\n while (index + 32 <= end) {\n this.stripe(data, index);\n index += 32;\n }\n if (index < end) {\n this.buffer.set(data.subarray(index, end));\n this.buffered = end - index;\n }\n }\n\n private stripe(data: Uint8Array, index: number): void {\n this.v1 = xxhRound(this.v1, read64(data, index));\n this.v2 = xxhRound(this.v2, read64(data, index + 8));\n this.v3 = xxhRound(this.v3, read64(data, index + 16));\n this.v4 = xxhRound(this.v4, read64(data, index + 24));\n }\n\n /** Low 32 bits of XXH64_digest(). */\n digestLow32(): number {\n let hash: U64;\n if (this.total >= 32) {\n hash = add64(\n add64(rotl64(this.v1, 1), rotl64(this.v2, 7)),\n add64(rotl64(this.v3, 12), rotl64(this.v4, 18)),\n );\n hash = xxhMergeRound(hash, this.v1);\n hash = xxhMergeRound(hash, this.v2);\n hash = xxhMergeRound(hash, this.v3);\n hash = xxhMergeRound(hash, this.v4);\n } else {\n hash = add64(this.v3, P64_5);\n }\n hash = add64(hash, [\n Math.floor(this.total / 2 ** 32) >>> 0,\n this.total >>> 0,\n ]);\n const data = this.buffer;\n let index = 0;\n let length = this.buffered;\n while (length >= 8) {\n hash = xor64(hash, xxhRound([0, 0], read64(data, index)));\n hash = add64(mul64(rotl64(hash, 27), P64_1), P64_4);\n index += 8;\n length -= 8;\n }\n if (length >= 4) {\n hash = xor64(hash, mul64([0, le32(data, index)], P64_1));\n hash = add64(mul64(rotl64(hash, 23), P64_2), P64_3);\n index += 4;\n length -= 4;\n }\n while (length > 0) {\n hash = xor64(hash, mul64([0, byteAt(data, index)], P64_5));\n hash = mul64(rotl64(hash, 11), P64_1);\n index += 1;\n length -= 1;\n }\n hash = xor64(hash, shr64(hash, 33));\n hash = mul64(hash, P64_2);\n hash = xor64(hash, shr64(hash, 29));\n hash = mul64(hash, P64_3);\n hash = xor64(hash, shr64(hash, 32));\n return hash[1];\n }\n}\n\n// ---------------------------------------------------------------------------\n// entropy_common.c FSE_readNCount and HUF_readStats, fse_decompress.c.\n// Every caller maps their errors to corruption_detected, so they throw it.\n\ninterface NCount {\n size: number;\n maxSymbolValue: number;\n tableLog: number;\n}\n\nfunction readNCount(\n norm: Int16Array,\n maxSymbolValue: number,\n src: Uint8Array,\n start: number,\n size: number,\n): NCount {\n if (size < 8) {\n const buffer = new Uint8Array(8);\n buffer.set(src.subarray(start, start + Math.max(size, 0)));\n const result = readNCountBody(norm, maxSymbolValue, buffer, 0, 8);\n if (result.size > size) {\n fail('corruption_detected');\n }\n return result;\n }\n return readNCountBody(norm, maxSymbolValue, src, start, size);\n}\n\n// oxlint-disable-next-line max-lines-per-function, complexity -- 1:1 port of FSE_readNCount_body\nfunction readNCountBody(\n norm: Int16Array,\n maxSymbolValue: number,\n src: Uint8Array,\n start: number,\n size: number,\n): NCount {\n const iend = start + size;\n let ip = start;\n let charnum = 0;\n const maxSV1 = maxSymbolValue + 1;\n let previous0 = false;\n norm.fill(0, 0, maxSV1);\n let bitStream = le32(src, ip);\n let nbBits = (bitStream & 0xf) + FSE_MIN_TABLELOG;\n if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) {\n fail('corruption_detected');\n }\n const tableLog = nbBits;\n bitStream >>>= 4;\n let bitCount = 4;\n let remaining = (1 << nbBits) + 1;\n let threshold = 1 << nbBits;\n nbBits += 1;\n const advance = (): void => {\n if (ip <= iend - 7 || ip + (bitCount >> 3) <= iend - 4) {\n ip += bitCount >> 3;\n bitCount &= 7;\n } else {\n bitCount -= 8 * (iend - 4 - ip);\n bitCount &= 31;\n ip = iend - 4;\n }\n bitStream = le32(src, ip) >>> bitCount;\n };\n for (;;) {\n if (previous0) {\n let repeats = ctz32((~bitStream | 0x80_00_00_00) >>> 0) >> 1;\n while (repeats >= 12) {\n charnum += 3 * 12;\n if (ip <= iend - 7) {\n ip += 3;\n } else {\n bitCount -= 8 * (iend - 7 - ip);\n bitCount &= 31;\n ip = iend - 4;\n }\n bitStream = le32(src, ip) >>> bitCount;\n repeats = ctz32((~bitStream | 0x80_00_00_00) >>> 0) >> 1;\n }\n charnum += 3 * repeats;\n bitStream >>>= 2 * repeats;\n bitCount += 2 * repeats;\n charnum += bitStream & 3;\n bitCount += 2;\n if (charnum >= maxSV1) {\n break;\n }\n advance();\n }\n const max = 2 * threshold - 1 - remaining;\n let count: number;\n if ((bitStream & (threshold - 1)) >>> 0 < max) {\n count = bitStream & (threshold - 1);\n bitCount += nbBits - 1;\n } else {\n count = bitStream & (2 * threshold - 1);\n if (count >= threshold) {\n count -= max;\n }\n bitCount += nbBits;\n }\n count -= 1;\n if (count >= 0) {\n remaining -= count;\n } else {\n remaining += count;\n }\n norm[charnum] = count;\n charnum += 1;\n previous0 = count === 0;\n if (remaining < threshold) {\n if (remaining <= 1) {\n break;\n }\n nbBits = highbit32(remaining) + 1;\n threshold = 1 << (nbBits - 1);\n }\n if (charnum >= maxSV1) {\n break;\n }\n advance();\n }\n if (remaining !== 1) {\n fail('corruption_detected');\n }\n if (charnum > maxSV1) {\n fail('corruption_detected');\n }\n if (bitCount > 32) {\n fail('corruption_detected');\n }\n ip += (bitCount + 7) >> 3;\n return { maxSymbolValue: charnum - 1, size: ip - start, tableLog };\n}\n\n/** FSE decoding table (fse_decompress.c FSE_DTable). */\ninterface FseTable {\n tableLog: number;\n fastMode: boolean;\n symbol: Uint8Array;\n newState: Uint16Array;\n nbBits: Uint8Array;\n}\n\n/** FSE_TABLESTEP. */\nfunction tableStep(tableSize: number): number {\n return (tableSize >>> 1) + (tableSize >>> 3) + 3;\n}\n\n/**\n * The symbol spreading shared by FSE_buildDTable_internal and\n * ZSTD_buildFSETable: returns the symbol of each cell and the\n * nextState/nbBits columns.\n */\nfunction spreadSymbols(\n norm: Int16Array,\n maxSymbolValue: number,\n tableLog: number,\n): {\n symbols: Uint8Array;\n nextState: Uint16Array;\n nbBits: Uint8Array;\n fastMode: boolean;\n} {\n const tableSize = 1 << tableLog;\n const symbols = new Uint8Array(tableSize);\n const symbolNext = new Uint16Array(maxSymbolValue + 1);\n let highThreshold = tableSize - 1;\n let fastMode = true;\n const largeLimit = 1 << (tableLog - 1);\n for (let symbol = 0; symbol <= maxSymbolValue; symbol += 1) {\n const count = norm[symbol] as number;\n if (count === -1) {\n symbols[highThreshold] = symbol;\n highThreshold -= 1;\n symbolNext[symbol] = 1;\n } else {\n if (count >= largeLimit) {\n fastMode = false;\n }\n symbolNext[symbol] = count;\n }\n }\n const tableMask = tableSize - 1;\n const step = tableStep(tableSize);\n let position = 0;\n for (let symbol = 0; symbol <= maxSymbolValue; symbol += 1) {\n const count = norm[symbol] as number;\n for (let index = 0; index < count; index += 1) {\n symbols[position] = symbol;\n position = (position + step) & tableMask;\n while (position > highThreshold) {\n position = (position + step) & tableMask;\n }\n }\n }\n if (position !== 0) {\n // FSE_buildDTable_internal's ERROR(GENERIC); unreachable after a\n // successful FSE_readNCount.\n fail('corruption_detected');\n }\n const nextState = new Uint16Array(tableSize);\n const nbBits = new Uint8Array(tableSize);\n for (let cell = 0; cell < tableSize; cell += 1) {\n const symbol = symbols[cell] as number;\n const next = symbolNext[symbol] as number;\n symbolNext[symbol] = next + 1;\n const bits = tableLog - highbit32(next);\n nbBits[cell] = bits;\n nextState[cell] = ((next << bits) - tableSize) & 0xff_ff;\n }\n return { fastMode, nbBits, nextState, symbols };\n}\n\nfunction buildFseTable(\n norm: Int16Array,\n maxSymbolValue: number,\n tableLog: number,\n): FseTable {\n const spread = spreadSymbols(norm, maxSymbolValue, tableLog);\n return {\n fastMode: spread.fastMode,\n nbBits: spread.nbBits,\n newState: spread.nextState,\n symbol: spread.symbols,\n tableLog,\n };\n}\n\nclass FseState {\n state = 0;\n\n private readonly table: FseTable;\n private readonly bits: BitStream;\n\n constructor(table: FseTable, bits: BitStream) {\n this.table = table;\n this.bits = bits;\n this.state = bits.read(table.tableLog);\n bits.reload();\n }\n\n decode(): number {\n const { table, bits } = this;\n const cell = this.state;\n const nbBits = table.nbBits[cell] as number;\n const symbol = table.symbol[cell] as number;\n const low = table.fastMode ? bits.readFast(nbBits) : bits.read(nbBits);\n this.state = (table.newState[cell] as number) + low;\n return symbol;\n }\n}\n\n/** FSE_decompress_wksp_bmi2 with maxLog 6 (Huffman weights). */\nfunction fseDecompressWeights(\n dst: Uint8Array,\n dstCapacity: number,\n src: Uint8Array,\n start: number,\n size: number,\n): number {\n const norm = new Int16Array(256);\n const header = readNCount(norm, 255, src, start, size);\n if (header.tableLog > 6) {\n fail('corruption_detected');\n }\n const table = buildFseTable(norm, header.maxSymbolValue, header.tableLog);\n const bits = new BitStream();\n if (!bits.init(src, start + header.size, size - header.size)) {\n fail('corruption_detected');\n }\n const state1 = new FseState(table, bits);\n const state2 = new FseState(table, bits);\n if (bits.reload() === BIT_OVERFLOW) {\n fail('corruption_detected');\n }\n let op = 0;\n const omax = dstCapacity;\n const olimit = omax - 3;\n for (;;) {\n const status = bits.reload();\n if (!(status === BIT_UNFINISHED && op < olimit)) {\n break;\n }\n dst[op] = state1.decode();\n dst[op + 1] = state2.decode();\n dst[op + 2] = state1.decode();\n dst[op + 3] = state2.decode();\n op += 4;\n }\n for (;;) {\n if (op > omax - 2) {\n fail('corruption_detected');\n }\n dst[op] = state1.decode();\n op += 1;\n if (bits.reload() === BIT_OVERFLOW) {\n dst[op] = state2.decode();\n op += 1;\n break;\n }\n if (op > omax - 2) {\n fail('corruption_detected');\n }\n dst[op] = state2.decode();\n op += 1;\n if (bits.reload() === BIT_OVERFLOW) {\n dst[op] = state1.decode();\n op += 1;\n break;\n }\n }\n return op;\n}\n\ninterface HufStats {\n size: number;\n nbSymbols: number;\n tableLog: number;\n}\n\n/** HUF_readStats with hwSize 256: weights[] and rankStats[0..12]. */\nfunction readStats(\n weights: Uint8Array,\n rankStats: Uint32Array,\n src: Uint8Array,\n start: number,\n size: number,\n): HufStats {\n if (!size) {\n fail('corruption_detected');\n }\n let iSize = byteAt(src, start);\n let oSize: number;\n if (iSize >= 128) {\n oSize = iSize - 127;\n iSize = (oSize + 1) >> 1;\n if (iSize + 1 > size) {\n fail('corruption_detected');\n }\n if (oSize >= 256) {\n fail('corruption_detected');\n }\n for (let index = 0; index < oSize; index += 2) {\n const byte = byteAt(src, start + 1 + index / 2);\n weights[index] = byte >> 4;\n weights[index + 1] = byte & 15;\n }\n } else {\n if (iSize + 1 > size) {\n fail('corruption_detected');\n }\n oSize = fseDecompressWeights(weights, 255, src, start + 1, iSize);\n }\n rankStats.fill(0, 0, HUF_TABLELOG_MAX + 1);\n let weightTotal = 0;\n for (let index = 0; index < oSize; index += 1) {\n const weight = weights[index] as number;\n if (weight > HUF_TABLELOG_MAX) {\n fail('corruption_detected');\n }\n rankStats[weight] = (rankStats[weight] as number) + 1;\n weightTotal += (1 << weight) >> 1;\n }\n if (weightTotal === 0) {\n fail('corruption_detected');\n }\n const tableLog = highbit32(weightTotal) + 1;\n if (tableLog > HUF_TABLELOG_MAX) {\n fail('corruption_detected');\n }\n const rest = (1 << tableLog) - weightTotal;\n const verif = 1 << highbit32(rest);\n const lastWeight = highbit32(rest) + 1;\n if (verif !== rest) {\n fail('corruption_detected');\n }\n weights[oSize] = lastWeight;\n rankStats[lastWeight] = (rankStats[lastWeight] as number) + 1;\n const rank1 = rankStats[1] as number;\n if (rank1 < 2 || rank1 & 1) {\n fail('corruption_detected');\n }\n return { nbSymbols: oSize + 1, size: iSize + 1, tableLog };\n}\n\n// ---------------------------------------------------------------------------\n// huf_decompress.c. The DTable keeps maxTableLog 12 (ZSTD_HUFFDTABLE_CAPACITY_LOG).\n\nconst HUF_MAX_TABLE_LOG = 12;\n\nclass HufTable {\n tableType = 0;\n tableLog = 0;\n /** X1 entries: (byte << 8) | nbBits. */\n readonly x1 = new Uint16Array(1 << HUF_MAX_TABLE_LOG);\n /** X2 entries: sequence | nbBits << 16 | length << 24. */\n readonly x2 = new Uint32Array(1 << HUF_MAX_TABLE_LOG);\n}\n\n/** HUF_readDTableX1_wksp. */\nfunction readDTableX1(\n table: HufTable,\n src: Uint8Array,\n start: number,\n size: number,\n): number {\n const weights = new Uint8Array(256);\n const rankVal = new Uint32Array(HUF_TABLELOG_MAX + 1);\n const stats = readStats(weights, rankVal, src, start, size);\n const { nbSymbols } = stats;\n let { tableLog } = stats;\n const targetTableLog = Math.min(\n HUF_MAX_TABLE_LOG + 1,\n HUF_DECODER_FAST_TABLELOG,\n );\n // HUF_rescaleStats\n if (tableLog < targetTableLog) {\n const scale = targetTableLog - tableLog;\n for (let symbol = 0; symbol < nbSymbols; symbol += 1) {\n const weight = weights[symbol] as number;\n weights[symbol] = weight === 0 ? 0 : weight + scale;\n }\n for (let weight = targetTableLog; weight > scale; weight -= 1) {\n rankVal[weight] = rankVal[weight - scale] as number;\n }\n for (let weight = scale; weight > 0; weight -= 1) {\n rankVal[weight] = 0;\n }\n tableLog = targetTableLog;\n }\n if (tableLog > HUF_MAX_TABLE_LOG + 1) {\n fail('corruption_detected');\n }\n table.tableType = 0;\n table.tableLog = tableLog;\n const rankStart = new Uint32Array(HUF_TABLELOG_MAX + 2);\n let nextRankStart = 0;\n for (let weight = 0; weight < tableLog + 1; weight += 1) {\n rankStart[weight] = nextRankStart;\n nextRankStart += rankVal[weight] as number;\n }\n const symbols = new Uint8Array(256);\n for (let symbol = 0; symbol < nbSymbols; symbol += 1) {\n const weight = weights[symbol] as number;\n const position = rankStart[weight] as number;\n rankStart[weight] = position + 1;\n symbols[position] = symbol;\n }\n let symbol = rankVal[0] as number;\n let uStart = 0;\n for (let weight = 1; weight < tableLog + 1; weight += 1) {\n const symbolCount = rankVal[weight] as number;\n const length = (1 << weight) >> 1;\n const nbBits = tableLog + 1 - weight;\n for (let index = 0; index < symbolCount; index += 1) {\n const entry = ((symbols[symbol + index] as number) << 8) | nbBits;\n table.x1.fill(entry, uStart, uStart + length);\n uStart += length;\n }\n symbol += symbolCount;\n }\n return stats.size;\n}\n\nfunction deltX2(\n symbol: number,\n nbBits: number,\n baseSeq: number,\n level: number,\n): number {\n const sequence = level === 1 ? symbol : baseSeq + (symbol << 8);\n return (sequence + (nbBits << 16) + level * 2 ** 24) >>> 0;\n}\n\n/** HUF_fillDTableX2ForWeight. */\nfunction fillX2ForWeight(\n dt: Uint32Array,\n rank: number,\n sorted: Uint8Array,\n begin: number,\n end: number,\n nbBits: number,\n tableLog: number,\n baseSeq: number,\n level: number,\n): void {\n const length = 2 ** ((tableLog - nbBits) & 0x1f);\n let position = rank;\n for (let index = begin; index !== end; index += 1) {\n const entry = deltX2(sorted[index] as number, nbBits, baseSeq, level);\n dt.fill(entry, position, position + length);\n position += length;\n }\n}\n\n/** HUF_fillDTableX2Level2. */\nfunction fillX2Level2(\n dt: Uint32Array,\n base: number,\n targetLog: number,\n consumedBits: number,\n rankVal: Uint32Array,\n minWeight: number,\n maxWeight1: number,\n sorted: Uint8Array,\n rankStart: Uint32Array,\n nbBitsBaseline: number,\n baseSeq: number,\n): void {\n if (minWeight > 1) {\n const length = 2 ** ((targetLog - consumedBits) & 0x1f);\n const entry = deltX2(baseSeq, consumedBits, 0, 1);\n const skipSize = rankVal[minWeight] as number;\n if (length === 2) {\n dt.fill(entry, base, base + 2);\n } else if (length === 4) {\n dt.fill(entry, base, base + 4);\n } else {\n for (let index = 0; index < skipSize; index += 8) {\n dt.fill(entry, base + index, base + index + 8);\n }\n }\n }\n for (let weight = minWeight; weight < maxWeight1; weight += 1) {\n const begin = rankStart[weight] as number;\n const end = rankStart[weight + 1] as number;\n const nbBits = nbBitsBaseline - weight;\n fillX2ForWeight(\n dt,\n base + (rankVal[weight] as number),\n sorted,\n begin,\n end,\n nbBits + consumedBits,\n targetLog,\n baseSeq,\n 2,\n );\n }\n}\n\n/** HUF_readDTableX2_wksp. */\nfunction readDTableX2(\n table: HufTable,\n src: Uint8Array,\n start: number,\n size: number,\n): number {\n let maxTableLog = HUF_MAX_TABLE_LOG;\n const rankStats = new Uint32Array(HUF_TABLELOG_MAX + 1);\n const rankStart0 = new Uint32Array(HUF_TABLELOG_MAX + 3);\n const weights = new Uint8Array(256);\n const stats = readStats(weights, rankStats, src, start, size);\n const { tableLog, nbSymbols } = stats;\n if (tableLog > maxTableLog) {\n fail('corruption_detected');\n }\n if (\n tableLog <= HUF_DECODER_FAST_TABLELOG &&\n maxTableLog > HUF_DECODER_FAST_TABLELOG\n ) {\n maxTableLog = HUF_DECODER_FAST_TABLELOG;\n }\n let maxW = tableLog;\n while (rankStats[maxW] === 0) {\n maxW -= 1;\n }\n // rankStart = rankStart0 + 1\n let nextRankStart = 0;\n for (let weight = 1; weight < maxW + 1; weight += 1) {\n rankStart0[weight + 1] = nextRankStart;\n nextRankStart += rankStats[weight] as number;\n }\n rankStart0[1] = nextRankStart;\n rankStart0[maxW + 2] = nextRankStart;\n const sorted = new Uint8Array(256);\n for (let symbol = 0; symbol < nbSymbols; symbol += 1) {\n const weight = weights[symbol] as number;\n const position = rankStart0[weight + 1] as number;\n rankStart0[weight + 1] = position + 1;\n sorted[position] = symbol;\n }\n rankStart0[1] = 0;\n const rankVal: Uint32Array[] = [];\n for (let index = 0; index < HUF_TABLELOG_MAX; index += 1) {\n rankVal.push(new Uint32Array(HUF_TABLELOG_MAX + 1));\n }\n const rankVal0 = rankVal[0] as Uint32Array;\n const rescale = maxTableLog - tableLog - 1;\n let nextRankVal = 0;\n for (let weight = 1; weight < maxW + 1; weight += 1) {\n rankVal0[weight] = nextRankVal;\n nextRankVal += (rankStats[weight] as number) * 2 ** (weight + rescale);\n }\n const minBits = tableLog + 1 - maxW;\n for (\n let consumed = minBits;\n consumed < maxTableLog - minBits + 1;\n consumed += 1\n ) {\n const column = rankVal[consumed] as Uint32Array;\n for (let weight = 1; weight < maxW + 1; weight += 1) {\n column[weight] = (rankVal0[weight] as number) >>> consumed;\n }\n }\n // HUF_fillDTableX2\n const nbBitsBaseline = tableLog + 1;\n const scaleLog = nbBitsBaseline - maxTableLog;\n const minBitsFill = nbBitsBaseline - maxW;\n const wEnd = maxW + 1;\n for (let weight = 1; weight < wEnd; weight += 1) {\n const begin = rankStart0[weight] as number;\n const end = rankStart0[weight + 1] as number;\n const nbBits = nbBitsBaseline - weight;\n if (maxTableLog - nbBits >= minBitsFill) {\n let position = rankVal0[weight] as number;\n const length = 2 ** ((maxTableLog - nbBits) & 0x1f);\n const minWeight = Math.max(nbBits + scaleLog, 1);\n for (let index = begin; index !== end; index += 1) {\n fillX2Level2(\n table.x2,\n position,\n maxTableLog,\n nbBits,\n rankVal[nbBits] as Uint32Array,\n minWeight,\n wEnd,\n sorted,\n rankStart0,\n nbBitsBaseline,\n sorted[index] as number,\n );\n position += length;\n }\n } else {\n fillX2ForWeight(\n table.x2,\n rankVal0[weight] as number,\n sorted,\n begin,\n end,\n nbBits,\n maxTableLog,\n 0,\n 1,\n );\n }\n }\n table.tableLog = maxTableLog;\n table.tableType = 1;\n return stats.size;\n}\n\n// Huffman decoding loops. `out` receives the literals; writes past the end\n// of a stream's segment land in the next segment, like in C.\n\nfunction decodeSymbolX1(\n bits: BitStream,\n dt: Uint16Array,\n dtLog: number,\n): number {\n const entry = dt[bits.lookFast(dtLog)] as number;\n bits.consumed += entry & 0xff;\n return entry >>> 8;\n}\n\n/** HUF_decodeStreamX1; returns the end position (always pEnd). */\nfunction decodeStreamX1(\n out: Uint8Array,\n start: number,\n bits: BitStream,\n pEnd: number,\n dt: Uint16Array,\n dtLog: number,\n): void {\n let p = start;\n if (pEnd - p > 3) {\n for (;;) {\n const status = bits.reload();\n if (!(status === BIT_UNFINISHED && p < pEnd - 3)) {\n break;\n }\n for (let index = 0; index < 4; index += 1) {\n out[p] = decodeSymbolX1(bits, dt, dtLog);\n p += 1;\n }\n }\n } else {\n bits.reload();\n }\n while (p < pEnd) {\n out[p] = decodeSymbolX1(bits, dt, dtLog);\n p += 1;\n }\n}\n\nfunction decodeSymbolX2(\n out: Uint8Array,\n p: number,\n bits: BitStream,\n dt: Uint32Array,\n dtLog: number,\n): number {\n const entry = dt[bits.lookFast(dtLog)] as number;\n out[p] = entry & 0xff;\n out[p + 1] = (entry >>> 8) & 0xff;\n bits.consumed += (entry >>> 16) & 0xff;\n return entry >>> 24;\n}\n\n/** HUF_decodeStreamX2; returns the end position. */\nfunction decodeStreamX2(\n out: Uint8Array,\n start: number,\n bits: BitStream,\n pEnd: number,\n dt: Uint32Array,\n dtLog: number,\n): number {\n let p = start;\n if (pEnd - p >= 8) {\n const unrolled = dtLog <= 11 ? 5 : 4;\n const bound = dtLog <= 11 ? pEnd - 9 : pEnd - 7;\n for (;;) {\n const status = bits.reload();\n if (!(status === BIT_UNFINISHED && p < bound)) {\n break;\n }\n for (let index = 0; index < unrolled; index += 1) {\n p += decodeSymbolX2(out, p, bits, dt, dtLog);\n }\n }\n } else {\n bits.reload();\n }\n if (pEnd - p >= 2) {\n for (;;) {\n const status = bits.reload();\n if (!(status === BIT_UNFINISHED && p <= pEnd - 2)) {\n break;\n }\n p += decodeSymbolX2(out, p, bits, dt, dtLog);\n }\n while (p <= pEnd - 2) {\n p += decodeSymbolX2(out, p, bits, dt, dtLog);\n }\n }\n if (p < pEnd) {\n // HUF_decodeLastSymbolX2\n const entry = dt[bits.lookFast(dtLog)] as number;\n out[p] = entry & 0xff;\n const nbBits = (entry >>> 16) & 0xff;\n if (entry >>> 24 === 1) {\n bits.consumed += nbBits;\n } else if (bits.consumed < 64) {\n bits.consumed += nbBits;\n if (bits.consumed > 64) {\n bits.consumed = 64;\n }\n }\n p += 1;\n }\n return p;\n}\n\n/** HUF_decompress1X1/1X2_usingDTable_internal (generic body). */\nfunction decompress1X(\n table: HufTable,\n out: Uint8Array,\n dstSize: number,\n src: Uint8Array,\n start: number,\n size: number,\n): void {\n const bits = new BitStream();\n if (!bits.init(src, start, size)) {\n fail('corruption_detected');\n }\n if (table.tableType === 0) {\n decodeStreamX1(out, 0, bits, dstSize, table.x1, table.tableLog);\n } else {\n decodeStreamX2(out, 0, bits, dstSize, table.x2, table.tableLog);\n }\n if (!bits.ended()) {\n fail('corruption_detected');\n }\n}\n\n/** The jump table of a 4-stream block. */\ninterface Streams {\n starts: number[];\n lengths: number[];\n}\n\nfunction readJumpTable(src: Uint8Array, start: number, size: number): Streams {\n const length1 = le16(src, start);\n const length2 = le16(src, start + 2);\n const length3 = le16(src, start + 4);\n const length4 = size - (length1 + length2 + length3 + 6);\n const start1 = start + 6;\n return {\n lengths: [length1, length2, length3, length4],\n starts: [\n start1,\n start1 + length1,\n start1 + length1 + length2,\n start1 + length1 + length2 + length3,\n ],\n };\n}\n\n/** HUF_decompress4X1_usingDTable_internal_body (generic). */\nfunction decompress4X1Generic(\n table: HufTable,\n out: Uint8Array,\n dstSize: number,\n src: Uint8Array,\n start: number,\n size: number,\n): void {\n if (size < 10 || dstSize < 6) {\n fail('corruption_detected');\n }\n const { starts, lengths } = readJumpTable(src, start, size);\n const segmentSize = Math.floor((dstSize + 3) / 4);\n const opStarts = [0, segmentSize, 2 * segmentSize, 3 * segmentSize];\n if ((lengths[3] as number) < 0 || (lengths[3] as number) > size) {\n fail('corruption_detected');\n }\n if ((opStarts[3] as number) > dstSize) {\n fail('corruption_detected');\n }\n const streams = [0, 1, 2, 3].map(() => new BitStream());\n for (let index = 0; index < 4; index += 1) {\n if (\n !(streams[index] as BitStream).init(\n src,\n starts[index] as number,\n lengths[index] as number,\n )\n ) {\n fail('corruption_detected');\n }\n }\n const dt = table.x1;\n const dtLog = table.tableLog;\n const op = [...opStarts];\n const olimit = dstSize - 3;\n if (dstSize - (op[3] as number) >= 8) {\n let endSignal = true;\n while (endSignal && (op[3] as number) < olimit) {\n for (let round = 0; round < 4; round += 1) {\n for (let index = 0; index < 4; index += 1) {\n out[op[index] as number] = decodeSymbolX1(\n streams[index] as BitStream,\n dt,\n dtLog,\n );\n op[index] = (op[index] as number) + 1;\n }\n }\n let signal = true;\n for (const stream of streams) {\n signal = stream.reloadFast() === BIT_UNFINISHED && signal;\n }\n endSignal = signal;\n }\n }\n for (let index = 0; index < 3; index += 1) {\n if ((op[index] as number) > (opStarts[index + 1] as number)) {\n fail('corruption_detected');\n }\n }\n for (let index = 0; index < 4; index += 1) {\n const end = index === 3 ? dstSize : (opStarts[index + 1] as number);\n decodeStreamX1(\n out,\n op[index] as number,\n streams[index] as BitStream,\n end,\n dt,\n dtLog,\n );\n }\n if (!streams.every(stream => stream.ended())) {\n fail('corruption_detected');\n }\n}\n\n/** HUF_decompress4X2_usingDTable_internal_body (generic). */\nfunction decompress4X2Generic(\n table: HufTable,\n out: Uint8Array,\n dstSize: number,\n src: Uint8Array,\n start: number,\n size: number,\n): void {\n if (size < 10 || dstSize < 6) {\n fail('corruption_detected');\n }\n const { starts, lengths } = readJumpTable(src, start, size);\n const segmentSize = Math.floor((dstSize + 3) / 4);\n const opStarts = [0, segmentSize, 2 * segmentSize, 3 * segmentSize];\n if ((lengths[3] as number) < 0 || (lengths[3] as number) > size) {\n fail('corruption_detected');\n }\n if ((opStarts[3] as number) > dstSize) {\n fail('corruption_detected');\n }\n const streams = [0, 1, 2, 3].map(() => new BitStream());\n for (let index = 0; index < 4; index += 1) {\n if (\n !(streams[index] as BitStream).init(\n src,\n starts[index] as number,\n lengths[index] as number,\n )\n ) {\n fail('corruption_detected');\n }\n }\n const dt = table.x2;\n const dtLog = table.tableLog;\n const op = [...opStarts];\n const olimit = dstSize - 7;\n const decode = (index: number): void => {\n op[index] =\n (op[index] as number) +\n decodeSymbolX2(\n out,\n op[index] as number,\n streams[index] as BitStream,\n dt,\n dtLog,\n );\n };\n if (dstSize - (op[3] as number) >= 8) {\n let endSignal = true;\n while (endSignal && (op[3] as number) < olimit) {\n for (let round = 0; round < 4; round += 1) {\n decode(0);\n }\n for (let round = 0; round < 4; round += 1) {\n decode(1);\n }\n let signal = (streams[0] as BitStream).reloadFast() === BIT_UNFINISHED;\n signal =\n (streams[1] as BitStream).reloadFast() === BIT_UNFINISHED && signal;\n for (let round = 0; round < 4; round += 1) {\n decode(2);\n }\n for (let round = 0; round < 4; round += 1) {\n decode(3);\n }\n signal =\n (streams[2] as BitStream).reloadFast() === BIT_UNFINISHED && signal;\n signal =\n (streams[3] as BitStream).reloadFast() === BIT_UNFINISHED && signal;\n for (let round = 0; round < 4; round += 1) {\n for (let index = 0; index < 4; index += 1) {\n decode(index);\n }\n }\n let last = true;\n for (const stream of streams) {\n last = stream.reloadFast() === BIT_UNFINISHED && last;\n }\n // C overwrites the `endSignal &= ...` of the first two pairs.\n void signal;\n endSignal = last;\n }\n }\n for (let index = 0; index < 3; index += 1) {\n if ((op[index] as number) > (opStarts[index + 1] as number)) {\n fail('corruption_detected');\n }\n }\n for (let index = 0; index < 4; index += 1) {\n const end = index === 3 ? dstSize : (opStarts[index + 1] as number);\n decodeStreamX2(\n out,\n op[index] as number,\n streams[index] as BitStream,\n end,\n dt,\n dtLog,\n );\n }\n if (!streams.every(stream => stream.ended())) {\n fail('corruption_detected');\n }\n}\n\n/** HUF_DecompressFastArgs. */\ninterface FastArgs {\n ip: number[];\n op: number[];\n bitsHi: number[];\n bitsLo: number[];\n ilowest: number;\n oend: number;\n iend: number[];\n}\n\n/**\n * HUF_DecompressFastArgs_init: null for \"use the fallback\", throws for\n * corruption.\n */\nfunction fastArgsInit(\n table: HufTable,\n dstSize: number,\n src: Uint8Array,\n start: number,\n size: number,\n): FastArgs | null {\n if (dstSize === 0) {\n return null;\n }\n if (size < 10) {\n fail('corruption_detected');\n }\n if (table.tableLog !== HUF_DECODER_FAST_TABLELOG) {\n return null;\n }\n const length1 = le16(src, start);\n const length2 = le16(src, start + 2);\n const length3 = le16(src, start + 4);\n const length4 = size - (length1 + length2 + length3 + 6);\n const iend0 = start + 6;\n const iend = [\n iend0,\n iend0 + length1,\n iend0 + length1 + length2,\n iend0 + length1 + length2 + length3,\n ];\n if (\n length1 < 8 ||\n length2 < 8 ||\n length3 < 8 ||\n (length4 >= 0 && length4 < 8)\n ) {\n return null;\n }\n if (length4 < 0 || length4 > size) {\n fail('corruption_detected');\n }\n const ip = [\n (iend[1] as number) - 8,\n (iend[2] as number) - 8,\n (iend[3] as number) - 8,\n start + size - 8,\n ];\n const quarter = Math.floor((dstSize + 3) / 4);\n const op = [0, quarter, 2 * quarter, 3 * quarter];\n if ((op[3] as number) >= dstSize) {\n return null;\n }\n const bitsHi: number[] = [];\n const bitsLo: number[] = [];\n for (const at of ip) {\n // HUF_initFastDStream\n const lastByte = byteAt(src, at + 7);\n const consumed = lastByte ? 8 - highbit32(lastByte) : 0;\n const [hi, lo] = read64(src, at);\n const value: U64 = [hi, (lo | 1) >>> 0];\n bitsHi.push(shiftLeft64High(value[0], value[1], consumed));\n bitsLo.push(consumed === 0 ? value[1] : (value[1] << consumed) >>> 0);\n }\n return { bitsHi, bitsLo, ilowest: start, iend, ip, oend: dstSize, op };\n}\n\nfunction shiftBits(args: FastArgs, stream: number, shift: number): void {\n const hi = args.bitsHi[stream] as number;\n const lo = args.bitsLo[stream] as number;\n args.bitsHi[stream] = shiftLeft64High(hi, lo, shift);\n args.bitsLo[stream] =\n shift >= 32 ? 0 : shift === 0 ? lo : (lo << shift) >>> 0;\n}\n\n/** HUF_4X1_RELOAD_STREAM / HUF_4X2_RELOAD_STREAM (without op += 5). */\nfunction reloadFastStream(\n args: FastArgs,\n src: Uint8Array,\n stream: number,\n): void {\n const ctz = ctz64(\n args.bitsHi[stream] as number,\n args.bitsLo[stream] as number,\n );\n const nbBits = ctz & 7;\n const nbBytes = ctz >> 3;\n const at = (args.ip[stream] as number) - nbBytes;\n args.ip[stream] = at;\n const [hi, lo] = read64(src, at);\n args.bitsHi[stream] = hi;\n args.bitsLo[stream] = (lo | 1) >>> 0;\n shiftBits(args, stream, nbBits);\n}\n\n/** HUF_decompress4X1_usingDTable_internal_fast_c_loop (= the BMI2 asm loop). */\nfunction fastLoopX1(\n args: FastArgs,\n out: Uint8Array,\n src: Uint8Array,\n dt: Uint16Array,\n): void {\n for (;;) {\n const oiters = Math.floor((args.oend - (args.op[3] as number)) / 5);\n const iiters = Math.floor(((args.ip[0] as number) - args.ilowest) / 7);\n const iters = Math.min(oiters, iiters);\n const olimit = (args.op[3] as number) + iters * 5;\n if (args.op[3] === olimit) {\n return;\n }\n for (let stream = 1; stream < 4; stream += 1) {\n if ((args.ip[stream] as number) < (args.ip[stream - 1] as number)) {\n return;\n }\n }\n do {\n for (let symbol = 0; symbol < 5; symbol += 1) {\n for (let stream = 0; stream < 4; stream += 1) {\n const entry = dt[(args.bitsHi[stream] as number) >>> 21] as number;\n shiftBits(args, stream, entry & 0x3f);\n out[(args.op[stream] as number) + symbol] = (entry >>> 8) & 0xff;\n }\n }\n for (let stream = 0; stream < 4; stream += 1) {\n args.op[stream] = (args.op[stream] as number) + 5;\n reloadFastStream(args, src, stream);\n }\n } while ((args.op[3] as number) < olimit);\n }\n}\n\n/** HUF_decompress4X2_usingDTable_internal_fast_c_loop (= the BMI2 asm loop). */\nfunction fastLoopX2(\n args: FastArgs,\n out: Uint8Array,\n src: Uint8Array,\n dt: Uint32Array,\n): void {\n const oend = [\n args.op[1] as number,\n args.op[2] as number,\n args.op[3] as number,\n args.oend,\n ];\n const decode = (stream: number): void => {\n const entry = dt[(args.bitsHi[stream] as number) >>> 21] as number;\n const at = args.op[stream] as number;\n out[at] = entry & 0xff;\n out[at + 1] = (entry >>> 8) & 0xff;\n shiftBits(args, stream, (entry >>> 16) & 0x3f);\n args.op[stream] = at + (entry >>> 24);\n };\n for (;;) {\n let iters = Math.floor(((args.ip[0] as number) - args.ilowest) / 7);\n for (let stream = 0; stream < 4; stream += 1) {\n const room = (oend[stream] as number) - (args.op[stream] as number);\n // size_t arithmetic: a negative room wraps to a huge value.\n const oiters =\n room < 0 ? Number.POSITIVE_INFINITY : Math.floor(room / 10);\n iters = Math.min(iters, oiters);\n }\n const olimit = (args.op[3] as number) + iters * 5;\n if (args.op[3] === olimit) {\n return;\n }\n for (let stream = 1; stream < 4; stream += 1) {\n if ((args.ip[stream] as number) < (args.ip[stream - 1] as number)) {\n return;\n }\n }\n do {\n for (let symbol = 0; symbol < 5; symbol += 1) {\n decode(0);\n decode(1);\n decode(2);\n }\n decode(3);\n for (let stream = 0; stream < 4; stream += 1) {\n decode(3);\n reloadFastStream(args, src, stream);\n }\n } while ((args.op[3] as number) < olimit);\n }\n}\n\n/**\n * HUF_decompress4X?_usingDTable_internal_fast: false for \"use the\n * fallback\"; the finishing streams start at `ilowest` and only the input\n * and output positions are validated, not the end of each bitstream.\n */\nfunction decompress4XFast(\n table: HufTable,\n out: Uint8Array,\n dstSize: number,\n src: Uint8Array,\n start: number,\n size: number,\n): boolean {\n const args = fastArgsInit(table, dstSize, src, start, size);\n if (args === null) {\n return false;\n }\n if (table.tableType === 0) {\n fastLoopX1(args, out, src, table.x1);\n } else {\n fastLoopX2(args, out, src, table.x2);\n }\n const segmentSize = Math.floor((dstSize + 3) / 4);\n let segmentEnd = 0;\n for (let stream = 0; stream < 4; stream += 1) {\n segmentEnd =\n segmentSize <= dstSize - segmentEnd ? segmentEnd + segmentSize : dstSize;\n // HUF_initRemainingDStream\n const op = args.op[stream] as number;\n const ip = args.ip[stream] as number;\n if (op > segmentEnd) {\n fail('corruption_detected');\n }\n if (ip < (args.iend[stream] as number) - 8) {\n fail('corruption_detected');\n }\n const bits = new BitStream();\n bits.buf = src;\n const [hi, lo] = read64(src, ip);\n bits.hi = hi;\n bits.lo = lo;\n bits.consumed = ctz64(\n args.bitsHi[stream] as number,\n args.bitsLo[stream] as number,\n );\n bits.start = args.ilowest;\n bits.limitPtr = args.ilowest + 8;\n bits.ptr = ip;\n if (table.tableType === 0) {\n decodeStreamX1(\n out,\n op,\n bits,\n segmentEnd,\n table.x1,\n HUF_DECODER_FAST_TABLELOG,\n );\n } else if (\n decodeStreamX2(\n out,\n op,\n bits,\n segmentEnd,\n table.x2,\n HUF_DECODER_FAST_TABLELOG,\n ) !== segmentEnd\n ) {\n fail('corruption_detected');\n }\n }\n return true;\n}\n\n/** HUF_decompress4X_usingDTable (BMI2 build: fast loop, then generic). */\nfunction decompress4X(\n table: HufTable,\n out: Uint8Array,\n dstSize: number,\n src: Uint8Array,\n start: number,\n size: number,\n): void {\n if (decompress4XFast(table, out, dstSize, src, start, size)) {\n return;\n }\n if (table.tableType === 0) {\n decompress4X1Generic(table, out, dstSize, src, start, size);\n } else {\n decompress4X2Generic(table, out, dstSize, src, start, size);\n }\n}\n\nconst ALGO_TIME: readonly (readonly [number, number, number, number])[] = [\n [0, 0, 1, 1],\n [0, 0, 1, 1],\n [150, 216, 381, 119],\n [170, 205, 514, 112],\n [177, 199, 539, 110],\n [197, 194, 644, 107],\n [221, 192, 735, 107],\n [256, 189, 881, 106],\n [359, 188, 1167, 109],\n [582, 187, 1570, 114],\n [688, 187, 1712, 122],\n [825, 186, 1965, 136],\n [976, 185, 2131, 150],\n [1180, 186, 2070, 175],\n [1377, 185, 1731, 202],\n [1412, 185, 1695, 202],\n];\n\n/** HUF_selectDecoder: true for the double-symbol decoder (X2). */\nfunction selectX2(dstSize: number, srcSize: number): boolean {\n const q = srcSize >= dstSize ? 15 : Math.floor((srcSize * 16) / dstSize);\n const d256 = Math.floor(dstSize / 256);\n const row = ALGO_TIME[q] as readonly [number, number, number, number];\n const time0 = (row[0] + row[1] * d256) >>> 0;\n let time1 = (row[2] + row[3] * d256) >>> 0;\n time1 = (time1 + (time1 >>> 5)) >>> 0;\n return time1 < time0;\n}\n\n// ---------------------------------------------------------------------------\n// zstd_decompress_block.c: sequence tables.\n\nconst LL_BASE = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 28,\n 32, 40, 48, 64, 0x80, 0x1_00, 0x2_00, 0x4_00, 0x8_00, 0x10_00, 0x20_00,\n 0x40_00, 0x80_00, 0x1_00_00,\n];\nconst LL_BITS = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 6,\n 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n];\nconst ML_BASE = [\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\n 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 39, 41, 43, 47, 51, 59,\n 67, 83, 99, 0x83, 0x1_03, 0x2_03, 0x4_03, 0x8_03, 0x10_03, 0x20_03, 0x40_03,\n 0x80_03, 0x1_00_03,\n];\nconst ML_BITS = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 7, 8, 9, 10, 11, 12, 13,\n 14, 15, 16,\n];\nconst OF_BASE = [\n 0, 1, 1, 5, 0xd, 0x1d, 0x3d, 0x7d, 0xfd, 0x1_fd, 0x3_fd, 0x7_fd, 0xf_fd,\n 0x1f_fd, 0x3f_fd, 0x7f_fd, 0xff_fd, 0x1_ff_fd, 0x3_ff_fd, 0x7_ff_fd,\n 0xf_ff_fd, 0x1f_ff_fd, 0x3f_ff_fd, 0x7f_ff_fd, 0xff_ff_fd, 0x1_ff_ff_fd,\n 0x3_ff_ff_fd, 0x7_ff_ff_fd, 0xf_ff_ff_fd, 0x1f_ff_ff_fd, 0x3f_ff_ff_fd,\n 0x7f_ff_ff_fd,\n];\nconst OF_BITS = Array.from({ length: 32 }, (_, index) => index);\nconst LL_DEFAULT_NORM = [\n 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,\n 2, 1, 1, 1, 1, 1, -1, -1, -1, -1,\n];\nconst ML_DEFAULT_NORM = [\n 1, 4, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1,\n -1, -1, -1,\n];\nconst OF_DEFAULT_NORM = [\n 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1,\n -1, -1, -1, -1,\n];\n\n/** ZSTD_seqSymbol table. */\ninterface SeqTable {\n tableLog: number;\n nextState: Uint16Array;\n nbAdditionalBits: Uint8Array;\n nbBits: Uint8Array;\n baseValue: Uint32Array;\n}\n\n/** ZSTD_buildFSETable. */\nfunction buildSeqTable(\n norm: Int16Array,\n maxSymbolValue: number,\n baseValue: readonly number[],\n nbAdditionalBits: readonly number[],\n tableLog: number,\n): SeqTable {\n const spread = spreadSymbols(norm, maxSymbolValue, tableLog);\n const size = 1 << tableLog;\n const table: SeqTable = {\n baseValue: new Uint32Array(size),\n nbAdditionalBits: new Uint8Array(size),\n nbBits: spread.nbBits,\n nextState: spread.nextState,\n tableLog,\n };\n for (let cell = 0; cell < size; cell += 1) {\n const symbol = spread.symbols[cell] as number;\n table.baseValue[cell] = baseValue[symbol] as number;\n table.nbAdditionalBits[cell] = nbAdditionalBits[symbol] as number;\n }\n return table;\n}\n\n/** ZSTD_buildSeqTable_rle. */\nfunction rleSeqTable(baseValue: number, nbAdditionalBits: number): SeqTable {\n return {\n baseValue: Uint32Array.of(baseValue),\n nbAdditionalBits: Uint8Array.of(nbAdditionalBits),\n nbBits: Uint8Array.of(0),\n nextState: Uint16Array.of(0),\n tableLog: 0,\n };\n}\n\nfunction defaultSeqTable(\n norm: readonly number[],\n baseValue: readonly number[],\n nbAdditionalBits: readonly number[],\n tableLog: number,\n): SeqTable {\n return buildSeqTable(\n Int16Array.from(norm),\n norm.length - 1,\n baseValue,\n nbAdditionalBits,\n tableLog,\n );\n}\n\nconst LL_DEFAULT_TABLE = defaultSeqTable(LL_DEFAULT_NORM, LL_BASE, LL_BITS, 6);\nconst OF_DEFAULT_TABLE = defaultSeqTable(OF_DEFAULT_NORM, OF_BASE, OF_BITS, 5);\nconst ML_DEFAULT_TABLE = defaultSeqTable(ML_DEFAULT_NORM, ML_BASE, ML_BITS, 6);\n\nclass SeqState {\n state = 0;\n\n readonly table: SeqTable;\n\n constructor(table: SeqTable, bits: BitStream) {\n this.table = table;\n this.state = bits.read(table.tableLog);\n bits.reload();\n }\n}\n\ninterface Sequence {\n litLength: number;\n matchLength: number;\n /** size_t; negative values stand for 2^64 + value. */\n offset: number;\n}\n\n/** An unsigned (size_t) `value > limit`, negative values being huge. */\nfunction above(value: number, limit: number): boolean {\n if (value < 0 && limit < 0) {\n return value > limit;\n }\n if (value < 0 || limit < 0) {\n return value < 0;\n }\n return value > limit;\n}\n\n/** Growable byte memory addressed from 0 (outBuff or the caller's buffer). */\nclass Memory {\n data: Uint8Array = new Uint8Array(0);\n\n ensure(end: number): void {\n if (end > this.data.length) {\n const grown = new Uint8Array(\n Math.max(end, this.data.length * 2, 64 * 1024),\n );\n grown.set(this.data);\n this.data = grown;\n }\n }\n}\n\nconst NOT_IN_DST = 0;\nconst IN_DST = 1;\nconst SPLIT = 2;\nconst LIT_MEM = 0;\nconst LIT_EXTRA = 1;\nconst LIT_SRC = 2;\n\n// ---------------------------------------------------------------------------\n// zstd_decompress.c: frame headers.\n\nconst FRAME = 0;\nconst SKIPPABLE_FRAME = 1;\n\n/** ZSTD_FrameHeader. */\ninterface FrameParams {\n frameContentSize: bigint;\n windowSize: bigint;\n blockSizeMax: number;\n frameType: number;\n headerSize: number;\n dictID: number;\n checksumFlag: boolean;\n}\n\n/** ZSTD_getFrameHeader_advanced: `need` > 0 asks for more bytes. */\ninterface FrameHeaderResult {\n need: number;\n params: FrameParams | null;\n}\n\n/** ZSTD_frameHeaderSize_internal (size >= 5). */\nfunction frameHeaderSize(src: Uint8Array, start: number): number {\n const fhd = byteAt(src, start + FRAMEHEADERSIZE_PREFIX - 1);\n const dictID = fhd & 3;\n const singleSegment = (fhd >> 5) & 1;\n const fcsId = fhd >> 6;\n return (\n FRAMEHEADERSIZE_PREFIX +\n (singleSegment ? 0 : 1) +\n (DID_FIELD_SIZE[dictID] as number) +\n (FCS_FIELD_SIZE[fcsId] as number) +\n (singleSegment && !fcsId ? 1 : 0)\n );\n}\n\nfunction getFrameHeader(\n src: Uint8Array,\n start: number,\n size: number,\n): FrameHeaderResult {\n if (size < FRAMEHEADERSIZE_PREFIX) {\n if (size > 0) {\n const toCopy = Math.min(4, size);\n const buffer = new Uint8Array(4);\n new DataView(buffer.buffer).setUint32(0, ZSTD_MAGICNUMBER, true);\n buffer.set(src.subarray(start, start + toCopy));\n if (le32(buffer, 0) !== ZSTD_MAGICNUMBER) {\n new DataView(buffer.buffer).setUint32(\n 0,\n ZSTD_MAGIC_SKIPPABLE_START,\n true,\n );\n buffer.set(src.subarray(start, start + toCopy));\n if (\n (le32(buffer, 0) & ZSTD_MAGIC_SKIPPABLE_MASK) >>> 0 !==\n ZSTD_MAGIC_SKIPPABLE_START\n ) {\n fail('prefix_unknown');\n }\n }\n }\n return { need: FRAMEHEADERSIZE_PREFIX, params: null };\n }\n const magic = le32(src, start);\n if (magic !== ZSTD_MAGICNUMBER) {\n if (\n (magic & ZSTD_MAGIC_SKIPPABLE_MASK) >>> 0 ===\n ZSTD_MAGIC_SKIPPABLE_START\n ) {\n if (size < SKIPPABLEHEADERSIZE) {\n return { need: SKIPPABLEHEADERSIZE, params: null };\n }\n return {\n need: 0,\n params: {\n blockSizeMax: 0,\n checksumFlag: false,\n dictID: magic - ZSTD_MAGIC_SKIPPABLE_START,\n frameContentSize: BigInt(le32(src, start + 4)),\n frameType: SKIPPABLE_FRAME,\n headerSize: SKIPPABLEHEADERSIZE,\n windowSize: 0n,\n },\n };\n }\n fail('prefix_unknown');\n }\n const headerSize = frameHeaderSize(src, start);\n if (size < headerSize) {\n return { need: headerSize, params: null };\n }\n const fhd = byteAt(src, start + 4);\n let pos = start + 5;\n const dictIDSizeCode = fhd & 3;\n const checksumFlag = ((fhd >> 2) & 1) === 1;\n const singleSegment = ((fhd >> 5) & 1) === 1;\n const fcsID = fhd >> 6;\n let windowSize = 0n;\n let dictID = 0;\n let frameContentSize = CONTENTSIZE_UNKNOWN;\n if (fhd & 0x08) {\n fail('frameParameter_unsupported');\n }\n if (!singleSegment) {\n const wlByte = byteAt(src, pos);\n pos += 1;\n const windowLog = (wlByte >> 3) + WINDOWLOG_ABSOLUTEMIN;\n if (windowLog > WINDOWLOG_MAX) {\n fail('frameParameter_windowTooLarge');\n }\n windowSize = 1n << BigInt(windowLog);\n windowSize += (windowSize >> 3n) * BigInt(wlByte & 7);\n }\n if (dictIDSizeCode === 1) {\n dictID = byteAt(src, pos);\n pos += 1;\n } else if (dictIDSizeCode === 2) {\n dictID = le16(src, pos);\n pos += 2;\n } else if (dictIDSizeCode === 3) {\n dictID = le32(src, pos);\n pos += 4;\n }\n if (fcsID === 0) {\n if (singleSegment) {\n frameContentSize = BigInt(byteAt(src, pos));\n }\n } else if (fcsID === 1) {\n frameContentSize = BigInt(le16(src, pos) + 256);\n } else if (fcsID === 2) {\n frameContentSize = BigInt(le32(src, pos));\n } else {\n frameContentSize = le64(src, pos);\n }\n if (singleSegment) {\n windowSize = frameContentSize;\n }\n return {\n need: 0,\n params: {\n blockSizeMax: Number(\n windowSize < BigInt(BLOCKSIZE_MAX) ? windowSize : BigInt(BLOCKSIZE_MAX),\n ),\n checksumFlag,\n dictID,\n frameContentSize,\n frameType: FRAME,\n headerSize,\n windowSize,\n },\n };\n}\n\n/** zstd_legacy.h ZSTD_isLegacy with ZSTD_LEGACY_SUPPORT 5. */\nfunction isLegacy(src: Uint8Array, start: number, size: number): boolean {\n if (size < 4) {\n return false;\n }\n const magic = le32(src, start);\n return (\n magic === 0xfd_2f_b5_25 ||\n magic === 0xfd_2f_b5_26 ||\n magic === 0xfd_2f_b5_27\n );\n}\n\n/** readSkippableFrameSize. */\nfunction readSkippableFrameSize(\n src: Uint8Array,\n start: number,\n size: number,\n): number {\n if (size < SKIPPABLEHEADERSIZE) {\n fail('srcSize_wrong');\n }\n const sizeU32 = le32(src, start + 4);\n if ((sizeU32 + SKIPPABLEHEADERSIZE) >>> 0 < sizeU32) {\n fail('frameParameter_unsupported');\n }\n const skippableSize = SKIPPABLEHEADERSIZE + sizeU32;\n if (skippableSize > size) {\n fail('srcSize_wrong');\n }\n return skippableSize;\n}\n\nconst BT_RAW = 0;\nconst BT_RLE = 1;\nconst BT_COMPRESSED = 2;\nconst BT_RESERVED = 3;\n\ninterface BlockProperties {\n cSize: number;\n lastBlock: boolean;\n blockType: number;\n origSize: number;\n}\n\n/** ZSTD_getcBlockSize. */\nfunction getcBlockSize(\n src: Uint8Array,\n start: number,\n size: number,\n): BlockProperties {\n if (size < BLOCK_HEADER_SIZE) {\n fail('srcSize_wrong');\n }\n const header = le24(src, start);\n const cSize = header >>> 3;\n const blockType = (header >>> 1) & 3;\n const properties = {\n blockType,\n cSize,\n lastBlock: (header & 1) === 1,\n origSize: cSize,\n };\n if (blockType === BT_RLE) {\n return { ...properties, cSize: 1 };\n }\n if (blockType === BT_RESERVED) {\n fail('corruption_detected');\n }\n return properties;\n}\n\n/** ZSTD_findFrameSizeInfo().compressedSize; -1 for an error. */\nfunction findFrameCompressedSize(\n src: Uint8Array,\n start: number,\n size: number,\n): number {\n try {\n if (isLegacy(src, start, size)) {\n // Legacy frames are out of scope (see the header comment).\n return -1;\n }\n if (\n size >= SKIPPABLEHEADERSIZE &&\n (le32(src, start) & ZSTD_MAGIC_SKIPPABLE_MASK) >>> 0 ===\n ZSTD_MAGIC_SKIPPABLE_START\n ) {\n return readSkippableFrameSize(src, start, size);\n }\n const header = getFrameHeader(src, start, size);\n if (header.need > 0 || header.params === null) {\n return -1;\n }\n let ip = start + header.params.headerSize;\n let remaining = size - header.params.headerSize;\n for (;;) {\n const block = getcBlockSize(src, ip, remaining);\n if (BLOCK_HEADER_SIZE + block.cSize > remaining) {\n return -1;\n }\n ip += BLOCK_HEADER_SIZE + block.cSize;\n remaining -= BLOCK_HEADER_SIZE + block.cSize;\n if (block.lastBlock) {\n break;\n }\n }\n if (header.params.checksumFlag) {\n if (remaining < 4) {\n return -1;\n }\n ip += 4;\n }\n return ip - start;\n } catch (error) {\n if (error instanceof Fail) {\n return -1;\n }\n throw error;\n }\n}\n\n// ---------------------------------------------------------------------------\n// The decoder state: ZSTD_DCtx / ZSTD_DStream.\n\nconst STAGE_GET_FRAME_HEADER_SIZE = 0;\nconst STAGE_DECODE_BLOCK_HEADER = 1;\nconst STAGE_DECOMPRESS_BLOCK = 2;\nconst STAGE_DECOMPRESS_LAST_BLOCK = 3;\nconst STAGE_CHECK_CHECKSUM = 4;\nconst STAGE_SKIP_FRAME = 5;\n\nconst STREAM_INIT = 0;\nconst STREAM_LOAD_HEADER = 1;\nconst STREAM_READ = 2;\nconst STREAM_LOAD = 3;\nconst STREAM_FLUSH = 4;\n\ninterface Input {\n data: Uint8Array;\n pos: number;\n size: number;\n}\n\n/**\n * The part of CPython's output buffer ZSTD_decompressStream() sees: `pos`\n * and `pyEnd` are positions in the current CPython block; `size` is `pyEnd`\n * or less, where `cap` cuts the output short.\n */\nclass Output {\n readonly chunks: Uint8Array[] = [];\n kept = 0;\n pos = 0;\n size = 0;\n pyEnd = 0;\n truncated = false;\n\n write(data: Uint8Array): void {\n const room = Math.max(0, this.size - this.pos);\n if (data.length > room) {\n this.truncated = true;\n }\n const kept = data.subarray(0, Math.min(room, data.length));\n if (kept.length > 0) {\n this.chunks.push(kept.slice());\n this.kept += kept.length;\n }\n this.pos += data.length;\n }\n}\n\ninterface FrameResult {\n decoded: number;\n consumed: number;\n}\n\nclass ZstdStream {\n legacy = false;\n\n // ZSTD_DCtx\n private stage = STAGE_GET_FRAME_HEADER_SIZE;\n private expected = 0;\n private bType = BT_RESERVED;\n private rleSize = 0;\n private decodedSize = 0;\n private frame: FrameParams = {\n blockSizeMax: 0,\n checksumFlag: false,\n dictID: 0,\n frameContentSize: 0n,\n frameType: FRAME,\n headerSize: 0,\n windowSize: 0n,\n };\n private previousDstEnd: number | null = null;\n private prefixStart: number | null = null;\n private virtualStart: number | null = null;\n private dictEnd: number | null = null;\n private mem: Memory = new Memory();\n private readonly outBuff: Memory = this.mem;\n private readonly huf = new HufTable();\n private llTable: SeqTable = LL_DEFAULT_TABLE;\n private ofTable: SeqTable = OF_DEFAULT_TABLE;\n private mlTable: SeqTable = ML_DEFAULT_TABLE;\n private rep: number[] = [1, 4, 8];\n private litEntropy = false;\n private fseEntropy = false;\n private xxh = new Xxh64();\n private validateChecksum = false;\n private litLocation = NOT_IN_DST;\n private litBuffer = 0;\n private litBufferEnd = 0;\n private litKind = LIT_EXTRA;\n private litSrc: Uint8Array = EMPTY;\n private litPtr = 0;\n private litSize = 0;\n private readonly litExtra = new Uint8Array(\n LITBUFFEREXTRASIZE + WILDCOPY_OVERLENGTH,\n );\n\n // ZSTD_DStream\n private streamStage = STREAM_INIT;\n private readonly headerBuffer = new Uint8Array(18);\n private lhSize = 0;\n private inBuff: Uint8Array = EMPTY;\n private inBuffSize = 0;\n private inPos = 0;\n private outBuffSize = 0;\n private outStart = 0;\n private outEnd = 0;\n private hostageByte = false;\n\n /** ZSTD_decompressStream; 0 once the frame is decoded and flushed. */\n // oxlint-disable-next-line max-lines-per-function, complexity -- 1:1 port of ZSTD_decompressStream\n decompressStream(input: Input, out: Output): number {\n const istart = input.pos;\n const iend = input.size;\n let ip = istart;\n let someMoreWork = true;\n while (someMoreWork) {\n if (this.streamStage === STREAM_INIT) {\n this.streamStage = STREAM_LOAD_HEADER;\n this.lhSize = 0;\n this.inPos = 0;\n this.outStart = 0;\n this.outEnd = 0;\n this.hostageByte = false;\n }\n if (this.streamStage === STREAM_LOAD_HEADER) {\n let header: FrameHeaderResult;\n try {\n header = getFrameHeader(this.headerBuffer, 0, this.lhSize);\n } catch (error) {\n if (\n error instanceof Fail &&\n isLegacy(input.data, istart, iend - istart)\n ) {\n this.legacy = true;\n input.pos = iend;\n return 1;\n }\n throw error;\n }\n if (header.need !== 0) {\n const toLoad = header.need - this.lhSize;\n const remaining = iend - ip;\n if (toLoad > remaining) {\n this.headerBuffer.set(input.data.subarray(ip, iend), this.lhSize);\n this.lhSize += remaining;\n input.pos = iend;\n getFrameHeader(this.headerBuffer, 0, this.lhSize);\n return (\n Math.max(FRAMEHEADERSIZE_MIN, header.need) -\n this.lhSize +\n BLOCK_HEADER_SIZE\n );\n }\n this.headerBuffer.set(\n input.data.subarray(ip, ip + toLoad),\n this.lhSize,\n );\n this.lhSize = header.need;\n ip += toLoad;\n continue;\n }\n const params = header.params as FrameParams;\n this.frame = params;\n if (\n params.frameContentSize !== CONTENTSIZE_UNKNOWN &&\n params.frameType !== SKIPPABLE_FRAME &&\n BigInt(out.pyEnd - out.pos) >= params.frameContentSize\n ) {\n const cSize = findFrameCompressedSize(\n input.data,\n istart,\n iend - istart,\n );\n if (cSize >= 0 && cSize <= iend - istart) {\n // Single-pass shortcut: ZSTD_decompress_usingDDict on the frame.\n this.decompressMultiFrame(out, input.data, istart, cSize);\n ip = istart + cSize;\n this.expected = 0;\n this.streamStage = STREAM_INIT;\n someMoreWork = false;\n continue;\n }\n }\n this.decompressBegin();\n if (\n (le32(this.headerBuffer, 0) & ZSTD_MAGIC_SKIPPABLE_MASK) >>> 0 ===\n ZSTD_MAGIC_SKIPPABLE_START\n ) {\n this.expected = le32(this.headerBuffer, 4);\n this.stage = STAGE_SKIP_FRAME;\n } else {\n this.decodeFrameHeader(this.headerBuffer, 0, this.lhSize);\n this.expected = BLOCK_HEADER_SIZE;\n this.stage = STAGE_DECODE_BLOCK_HEADER;\n }\n const frame = this.frame;\n if (frame.windowSize < 1n << BigInt(WINDOWLOG_ABSOLUTEMIN)) {\n frame.windowSize = 1n << BigInt(WINDOWLOG_ABSOLUTEMIN);\n }\n if (frame.windowSize > BigInt(MAX_WINDOW_SIZE)) {\n fail('frameParameter_windowTooLarge');\n }\n const windowSize = Number(frame.windowSize);\n const neededInBuffSize = Math.max(frame.blockSizeMax, 4);\n const blockSize = Math.min(\n windowSize,\n BLOCKSIZE_MAX,\n frame.blockSizeMax,\n );\n const neededRBSize = BigInt(\n windowSize + blockSize * 2 + WILDCOPY_OVERLENGTH * 2,\n );\n const neededOutBuffSize = Number(\n frame.frameContentSize < neededRBSize\n ? frame.frameContentSize\n : neededRBSize,\n );\n if (\n this.inBuffSize < neededInBuffSize ||\n this.outBuffSize < neededOutBuffSize\n ) {\n this.inBuff = new Uint8Array(neededInBuffSize);\n this.inBuffSize = neededInBuffSize;\n this.outBuffSize = neededOutBuffSize;\n }\n this.streamStage = STREAM_READ;\n }\n if (this.streamStage === STREAM_READ) {\n const neededInSize = this.nextSrcSizeWithInputSize(iend - ip);\n if (neededInSize === 0) {\n this.streamStage = STREAM_INIT;\n someMoreWork = false;\n continue;\n }\n if (iend - ip >= neededInSize) {\n this.decompressContinueStream(input.data, ip, neededInSize);\n ip += neededInSize;\n continue;\n }\n if (ip === iend) {\n someMoreWork = false;\n continue;\n }\n this.streamStage = STREAM_LOAD;\n }\n if (this.streamStage === STREAM_LOAD) {\n const neededInSize = this.expected;\n const toLoad = neededInSize - this.inPos;\n let loadedSize: number;\n if (this.stage === STAGE_SKIP_FRAME) {\n loadedSize = Math.min(toLoad, iend - ip);\n } else {\n if (toLoad > this.inBuffSize - this.inPos) {\n fail('corruption_detected');\n }\n loadedSize = Math.min(toLoad, iend - ip);\n this.inBuff.set(input.data.subarray(ip, ip + loadedSize), this.inPos);\n }\n ip += loadedSize;\n this.inPos += loadedSize;\n if (loadedSize < toLoad) {\n someMoreWork = false;\n continue;\n }\n this.inPos = 0;\n this.decompressContinueStream(this.inBuff, 0, neededInSize);\n continue;\n }\n if (this.streamStage === STREAM_FLUSH) {\n const toFlushSize = this.outEnd - this.outStart;\n const flushedSize = Math.min(\n Math.max(0, out.size - out.pos),\n toFlushSize,\n );\n out.write(\n this.outBuff.data.subarray(\n this.outStart,\n this.outStart + flushedSize,\n ),\n );\n this.outStart += flushedSize;\n if (flushedSize === toFlushSize) {\n this.streamStage = STREAM_READ;\n if (\n BigInt(this.outBuffSize) < this.frame.frameContentSize &&\n this.outStart + this.frame.blockSizeMax > this.outBuffSize\n ) {\n this.outStart = 0;\n this.outEnd = 0;\n }\n continue;\n }\n someMoreWork = false;\n }\n }\n input.pos = ip;\n if (this.expected === 0) {\n if (this.outEnd === this.outStart) {\n if (this.hostageByte) {\n if (input.pos >= input.size) {\n this.streamStage = STREAM_READ;\n return 1;\n }\n input.pos += 1;\n }\n return 0;\n }\n if (!this.hostageByte) {\n input.pos -= 1;\n this.hostageByte = true;\n }\n return 1;\n }\n return this.expected;\n }\n\n /** ZSTD_decompressBegin. */\n private decompressBegin(): void {\n this.expected = FRAMEHEADERSIZE_PREFIX;\n this.stage = STAGE_GET_FRAME_HEADER_SIZE;\n this.decodedSize = 0;\n this.previousDstEnd = null;\n this.prefixStart = null;\n this.virtualStart = null;\n this.dictEnd = null;\n this.huf.tableType = 0;\n this.huf.tableLog = 0;\n this.litEntropy = false;\n this.fseEntropy = false;\n this.bType = BT_RESERVED;\n this.rep = [1, 4, 8];\n }\n\n /** ZSTD_decodeFrameHeader (no dictionary: dctx->dictID is 0). */\n private decodeFrameHeader(\n src: Uint8Array,\n start: number,\n headerSize: number,\n ): void {\n const header = getFrameHeader(src, start, headerSize);\n if (header.need > 0 || header.params === null) {\n fail('srcSize_wrong');\n }\n this.frame = header.params;\n if (this.frame.dictID !== 0) {\n fail('dictionary_wrong');\n }\n this.validateChecksum = this.frame.checksumFlag;\n this.xxh = new Xxh64();\n }\n\n /** ZSTD_checkContinuity. */\n private checkContinuity(dst: number, dstSize: number): void {\n if (dst !== this.previousDstEnd && dstSize > 0) {\n this.dictEnd = this.previousDstEnd;\n this.virtualStart =\n dst - ((this.previousDstEnd ?? 0) - (this.prefixStart ?? 0));\n this.prefixStart = dst;\n this.previousDstEnd = dst;\n }\n }\n\n private nextSrcSizeWithInputSize(inputSize: number): number {\n if (\n this.stage !== STAGE_DECOMPRESS_BLOCK &&\n this.stage !== STAGE_DECOMPRESS_LAST_BLOCK\n ) {\n return this.expected;\n }\n if (this.bType !== BT_RAW) {\n return this.expected;\n }\n return Math.max(1, Math.min(inputSize, this.expected));\n }\n\n /** ZSTD_decompressContinueStream (buffered output mode). */\n private decompressContinueStream(\n src: Uint8Array,\n start: number,\n size: number,\n ): void {\n const isSkipFrame = this.stage === STAGE_SKIP_FRAME;\n const dstSize = isSkipFrame ? 0 : this.outBuffSize - this.outStart;\n const decodedSize = this.decompressContinue(\n this.outStart,\n dstSize,\n src,\n start,\n size,\n );\n if (!decodedSize && !isSkipFrame) {\n this.streamStage = STREAM_READ;\n } else {\n this.outEnd = this.outStart + decodedSize;\n this.streamStage = STREAM_FLUSH;\n }\n }\n\n private finishFrameAfterLastBlock(): void {\n if (this.frame.checksumFlag) {\n this.expected = 4;\n this.stage = STAGE_CHECK_CHECKSUM;\n } else {\n this.expected = 0;\n this.stage = STAGE_GET_FRAME_HEADER_SIZE;\n }\n }\n\n /** ZSTD_decompressContinue for the stages streaming reaches. */\n // oxlint-disable-next-line max-lines-per-function, complexity -- 1:1 port of ZSTD_decompressContinue\n private decompressContinue(\n dst: number,\n dstCapacity: number,\n src: Uint8Array,\n start: number,\n size: number,\n ): number {\n if (size !== this.nextSrcSizeWithInputSize(size)) {\n fail('srcSize_wrong');\n }\n this.mem = this.outBuff;\n this.checkContinuity(dst, dstCapacity);\n if (this.stage === STAGE_DECODE_BLOCK_HEADER) {\n const block = getcBlockSize(src, start, BLOCK_HEADER_SIZE);\n if (block.cSize > this.frame.blockSizeMax) {\n fail('corruption_detected');\n }\n this.expected = block.cSize;\n this.bType = block.blockType;\n this.rleSize = block.origSize;\n if (block.cSize) {\n this.stage = block.lastBlock\n ? STAGE_DECOMPRESS_LAST_BLOCK\n : STAGE_DECOMPRESS_BLOCK;\n return 0;\n }\n if (block.lastBlock) {\n this.finishFrameAfterLastBlock();\n } else {\n this.expected = BLOCK_HEADER_SIZE;\n this.stage = STAGE_DECODE_BLOCK_HEADER;\n }\n return 0;\n }\n if (\n this.stage === STAGE_DECOMPRESS_BLOCK ||\n this.stage === STAGE_DECOMPRESS_LAST_BLOCK\n ) {\n let rSize: number;\n if (this.bType === BT_COMPRESSED) {\n rSize = this.decompressBlock(dst, dstCapacity, src, start, size, true);\n this.expected = 0;\n } else if (this.bType === BT_RAW) {\n if (size > dstCapacity) {\n fail('dstSize_tooSmall');\n }\n this.mem.ensure(dst + size);\n this.mem.data.set(src.subarray(start, start + size), dst);\n rSize = size;\n this.expected -= rSize;\n } else if (this.bType === BT_RLE) {\n if (this.rleSize > dstCapacity) {\n fail('dstSize_tooSmall');\n }\n this.mem.ensure(dst + this.rleSize);\n this.mem.data.fill(byteAt(src, start), dst, dst + this.rleSize);\n rSize = this.rleSize;\n this.expected = 0;\n } else {\n fail('corruption_detected');\n }\n if (rSize > this.frame.blockSizeMax) {\n fail('corruption_detected');\n }\n this.decodedSize += rSize;\n if (this.validateChecksum) {\n this.xxh.update(this.mem.data, dst, dst + rSize);\n }\n this.previousDstEnd = dst + rSize;\n if (this.expected > 0) {\n return rSize;\n }\n if (this.stage === STAGE_DECOMPRESS_LAST_BLOCK) {\n if (\n this.frame.frameContentSize !== CONTENTSIZE_UNKNOWN &&\n BigInt(this.decodedSize) !== this.frame.frameContentSize\n ) {\n fail('corruption_detected');\n }\n this.finishFrameAfterLastBlock();\n } else {\n this.stage = STAGE_DECODE_BLOCK_HEADER;\n this.expected = BLOCK_HEADER_SIZE;\n }\n return rSize;\n }\n if (this.stage === STAGE_CHECK_CHECKSUM) {\n if (\n this.validateChecksum &&\n this.xxh.digestLow32() !== le32(src, start)\n ) {\n fail('checksum_wrong');\n }\n this.expected = 0;\n this.stage = STAGE_GET_FRAME_HEADER_SIZE;\n return 0;\n }\n if (this.stage === STAGE_SKIP_FRAME) {\n this.expected = 0;\n this.stage = STAGE_GET_FRAME_HEADER_SIZE;\n return 0;\n }\n return fail('GENERIC');\n }\n\n /**\n * ZSTD_decompress_usingDDict(zds, op, oend - op, istart, cSize, NULL) for\n * the single-pass shortcut, writing into CPython's output buffer.\n */\n private decompressMultiFrame(\n out: Output,\n src: Uint8Array,\n start: number,\n size: number,\n ): void {\n const scratch = new Memory();\n this.mem = scratch;\n let dst = 0;\n let dstCapacity = out.pyEnd - out.pos;\n let ip = start;\n let remaining = size;\n let moreThan1Frame = false;\n while (remaining >= FRAMEHEADERSIZE_PREFIX) {\n if (isLegacy(src, ip, remaining)) {\n // Out of scope (see the header comment): treat as no output.\n this.legacy = true;\n break;\n }\n if (remaining >= 4) {\n const magic = le32(src, ip);\n if (\n (magic & ZSTD_MAGIC_SKIPPABLE_MASK) >>> 0 ===\n ZSTD_MAGIC_SKIPPABLE_START\n ) {\n const skippableSize = readSkippableFrameSize(src, ip, remaining);\n ip += skippableSize;\n remaining -= skippableSize;\n continue;\n }\n }\n this.decompressBegin();\n this.checkContinuity(dst, dstCapacity);\n let result: FrameResult;\n try {\n result = this.decompressFrame(dst, dstCapacity, src, ip, remaining);\n } catch (error) {\n if (\n error instanceof Fail &&\n error.code === 'prefix_unknown' &&\n moreThan1Frame\n ) {\n fail('srcSize_wrong');\n }\n throw error;\n }\n dst += result.decoded;\n dstCapacity -= result.decoded;\n ip += result.consumed;\n remaining -= result.consumed;\n moreThan1Frame = true;\n }\n if (remaining && !this.legacy) {\n fail('srcSize_wrong');\n }\n out.write(scratch.data.subarray(0, dst));\n this.mem = this.outBuff;\n }\n\n /** ZSTD_decompressFrame. */\n private decompressFrame(\n dst: number,\n dstCapacity: number,\n src: Uint8Array,\n start: number,\n size: number,\n ): FrameResult {\n const oend = dst + dstCapacity;\n let op = dst;\n let ip = start;\n let remaining = size;\n if (remaining < FRAMEHEADERSIZE_MIN + BLOCK_HEADER_SIZE) {\n fail('srcSize_wrong');\n }\n const headerSize = frameHeaderSize(src, ip);\n if (remaining < headerSize + BLOCK_HEADER_SIZE) {\n fail('srcSize_wrong');\n }\n this.decodeFrameHeader(src, ip, headerSize);\n ip += headerSize;\n remaining -= headerSize;\n for (;;) {\n const block = getcBlockSize(src, ip, remaining);\n ip += BLOCK_HEADER_SIZE;\n remaining -= BLOCK_HEADER_SIZE;\n if (block.cSize > remaining) {\n fail('srcSize_wrong');\n }\n let decodedSize: number;\n if (block.blockType === BT_COMPRESSED) {\n decodedSize = this.decompressBlock(\n op,\n oend - op,\n src,\n ip,\n block.cSize,\n false,\n );\n } else if (block.blockType === BT_RAW) {\n if (block.cSize > oend - op) {\n fail('dstSize_tooSmall');\n }\n this.mem.ensure(op + block.cSize);\n this.mem.data.set(src.subarray(ip, ip + block.cSize), op);\n decodedSize = block.cSize;\n } else {\n if (block.origSize > oend - op) {\n fail('dstSize_tooSmall');\n }\n this.mem.ensure(op + block.origSize);\n this.mem.data.fill(byteAt(src, ip), op, op + block.origSize);\n decodedSize = block.origSize;\n }\n if (this.validateChecksum) {\n this.xxh.update(this.mem.data, op, op + decodedSize);\n }\n op += decodedSize;\n ip += block.cSize;\n remaining -= block.cSize;\n if (block.lastBlock) {\n break;\n }\n }\n if (\n this.frame.frameContentSize !== CONTENTSIZE_UNKNOWN &&\n BigInt(op - dst) !== this.frame.frameContentSize\n ) {\n fail('corruption_detected');\n }\n if (this.frame.checksumFlag) {\n if (remaining < 4) {\n fail('checksum_wrong');\n }\n if (this.xxh.digestLow32() !== le32(src, ip)) {\n fail('checksum_wrong');\n }\n ip += 4;\n remaining -= 4;\n }\n return { consumed: ip - start, decoded: op - dst };\n }\n\n // -------------------------------------------------------------------------\n // zstd_decompress_block.c\n\n /** ZSTD_decompressBlock_internal. */\n private decompressBlock(\n dst: number,\n dstCapacity: number,\n src: Uint8Array,\n start: number,\n size: number,\n streaming: boolean,\n ): number {\n const blockSizeMax = this.frame.blockSizeMax;\n if (size > blockSizeMax) {\n fail('srcSize_wrong');\n }\n const litCSize = this.decodeLiterals(\n src,\n start,\n size,\n dst,\n dstCapacity,\n streaming,\n );\n let ip = start + litCSize;\n let remaining = size - litCSize;\n const historyEnd = dst + Math.min(dstCapacity, blockSizeMax);\n const totalHistorySize = historyEnd - (this.virtualStart ?? 0);\n const headers = this.decodeSeqHeaders(src, ip, remaining);\n const { nbSeq } = headers;\n ip += headers.size;\n remaining -= headers.size;\n if (dstCapacity === 0 && nbSeq > 0) {\n fail('dstSize_tooSmall');\n }\n let usePrefetchDecoder = false;\n if (totalHistorySize > 1 << 24 && nbSeq > 8) {\n // ZSTD_getOffsetInfo(OFTptr).longOffsetShare >= 7 (64-bit)\n const table = this.ofTable;\n let share = 0;\n for (let cell = 0; cell < 1 << table.tableLog; cell += 1) {\n if ((table.nbAdditionalBits[cell] as number) > 22) {\n share += 1;\n }\n }\n share <<= OFF_FSE_LOG - table.tableLog;\n usePrefetchDecoder = share >= 7;\n }\n if (usePrefetchDecoder) {\n return this.sequencesLong(dst, dstCapacity, src, ip, remaining, nbSeq);\n }\n if (this.litLocation === SPLIT) {\n return this.sequencesSplit(dst, dstCapacity, src, ip, remaining, nbSeq);\n }\n return this.sequences(dst, dstCapacity, src, ip, remaining, nbSeq);\n }\n\n /** ZSTD_allocateLiteralsBuffer. */\n private allocateLiterals(\n dst: number,\n dstCapacity: number,\n litSize: number,\n streaming: boolean,\n expectedWriteSize: number,\n splitImmediately: boolean,\n ): void {\n const blockSizeMax = this.frame.blockSizeMax;\n if (\n !streaming &&\n dstCapacity >\n blockSizeMax + WILDCOPY_OVERLENGTH + litSize + WILDCOPY_OVERLENGTH\n ) {\n this.litBuffer = dst + blockSizeMax + WILDCOPY_OVERLENGTH;\n this.litBufferEnd = this.litBuffer + litSize;\n this.litLocation = IN_DST;\n this.litKind = LIT_MEM;\n } else if (litSize <= LITBUFFEREXTRASIZE) {\n this.litBuffer = 0;\n this.litBufferEnd = litSize;\n this.litLocation = NOT_IN_DST;\n this.litKind = LIT_EXTRA;\n } else {\n if (splitImmediately) {\n this.litBuffer =\n dst +\n expectedWriteSize -\n litSize +\n LITBUFFEREXTRASIZE -\n WILDCOPY_OVERLENGTH;\n this.litBufferEnd = this.litBuffer + litSize - LITBUFFEREXTRASIZE;\n } else {\n this.litBuffer = dst + expectedWriteSize - litSize;\n this.litBufferEnd = dst + expectedWriteSize;\n }\n this.litLocation = SPLIT;\n this.litKind = LIT_MEM;\n }\n }\n\n /** Store literal bytes where ZSTD_allocateLiteralsBuffer put them. */\n private storeLiterals(literals: Uint8Array, splitImmediately: boolean): void {\n const litSize = literals.length;\n if (this.litLocation === NOT_IN_DST) {\n this.litExtra.set(literals, 0);\n return;\n }\n if (this.litLocation === IN_DST) {\n this.mem.ensure(this.litBuffer + litSize);\n this.mem.data.set(literals, this.litBuffer);\n return;\n }\n if (splitImmediately) {\n const head = litSize - LITBUFFEREXTRASIZE;\n this.mem.ensure(this.litBuffer + head);\n this.mem.data.set(literals.subarray(0, head), this.litBuffer);\n this.litExtra.set(literals.subarray(head), 0);\n return;\n }\n // Decoded into dst, then the tail moves to litExtraBuffer and the head\n // is shifted forward (ZSTD_decodeLiteralsBlock, ZSTD_split).\n const data = (): Uint8Array => this.mem.data;\n this.mem.ensure(this.litBufferEnd);\n data().set(literals, this.litBuffer);\n this.litExtra.set(\n data().subarray(\n this.litBufferEnd - LITBUFFEREXTRASIZE,\n this.litBufferEnd,\n ),\n 0,\n );\n const target = this.litBuffer + LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH;\n this.mem.ensure(target + litSize - LITBUFFEREXTRASIZE);\n data().copyWithin(\n target,\n this.litBuffer,\n this.litBuffer + litSize - LITBUFFEREXTRASIZE,\n );\n this.litBuffer = target;\n this.litBufferEnd -= WILDCOPY_OVERLENGTH;\n }\n\n /** ZSTD_decodeLiteralsBlock; returns the bytes read. */\n // oxlint-disable-next-line max-lines-per-function, complexity -- 1:1 port of ZSTD_decodeLiteralsBlock\n private decodeLiterals(\n src: Uint8Array,\n start: number,\n size: number,\n dst: number,\n dstCapacity: number,\n streaming: boolean,\n ): number {\n if (size < MIN_CBLOCK_SIZE) {\n fail('corruption_detected');\n }\n const first = byteAt(src, start);\n const litEncType = first & 3;\n const blockSizeMax = this.frame.blockSizeMax;\n const lhlCode = (first >> 2) & 3;\n const expectedWriteSize = Math.min(blockSizeMax, dstCapacity);\n if (litEncType === 3 || litEncType === 2) {\n if (litEncType === 3 && !this.litEntropy) {\n fail('dictionary_corrupted');\n }\n if (size < 5) {\n fail('corruption_detected');\n }\n const lhc = le32(src, start);\n let singleStream = false;\n let lhSize: number;\n let litSize: number;\n let litCSize: number;\n if (lhlCode <= 1) {\n singleStream = lhlCode === 0;\n lhSize = 3;\n litSize = (lhc >>> 4) & 0x3_ff;\n litCSize = (lhc >>> 14) & 0x3_ff;\n } else if (lhlCode === 2) {\n lhSize = 4;\n litSize = (lhc >>> 4) & 0x3f_ff;\n litCSize = lhc >>> 18;\n } else {\n lhSize = 5;\n litSize = (lhc >>> 4) & 0x3_ff_ff;\n litCSize = (lhc >>> 22) + byteAt(src, start + 4) * 1024;\n }\n if (litSize > blockSizeMax) {\n fail('corruption_detected');\n }\n if (!singleStream && litSize < MIN_LITERALS_FOR_4_STREAMS) {\n fail('literals_headerWrong');\n }\n if (litCSize + lhSize > size) {\n fail('corruption_detected');\n }\n if (expectedWriteSize < litSize) {\n fail('dstSize_tooSmall');\n }\n this.allocateLiterals(\n dst,\n dstCapacity,\n litSize,\n streaming,\n expectedWriteSize,\n false,\n );\n const literals = new Uint8Array(litSize + 2 * WILDCOPY_OVERLENGTH);\n const hufStart = start + lhSize;\n let hufFailed = false;\n try {\n this.decodeHuffmanLiterals(\n litEncType === 3,\n singleStream,\n literals,\n litSize,\n src,\n hufStart,\n litCSize,\n );\n } catch (error) {\n if (!(error instanceof Fail)) {\n throw error;\n }\n hufFailed = true;\n }\n this.storeLiterals(literals.subarray(0, litSize), false);\n if (hufFailed) {\n fail('corruption_detected');\n }\n this.litPtr = this.litBuffer;\n this.litSize = litSize;\n this.litEntropy = true;\n return litCSize + lhSize;\n }\n let lhSize: number;\n let litSize: number;\n if (lhlCode === 1) {\n lhSize = 2;\n if (litEncType === 1 && size < 3) {\n fail('corruption_detected');\n }\n litSize = le16(src, start) >> 4;\n } else if (lhlCode === 3) {\n lhSize = 3;\n if (size < (litEncType === 1 ? 4 : 3)) {\n fail('corruption_detected');\n }\n litSize = le24(src, start) >> 4;\n } else {\n lhSize = 1;\n litSize = first >> 3;\n }\n if (litSize > blockSizeMax) {\n fail('corruption_detected');\n }\n if (expectedWriteSize < litSize) {\n fail('dstSize_tooSmall');\n }\n this.allocateLiterals(\n dst,\n dstCapacity,\n litSize,\n streaming,\n expectedWriteSize,\n true,\n );\n if (litEncType === 1) {\n // set_rle\n this.storeLiterals(\n new Uint8Array(litSize).fill(byteAt(src, start + lhSize)),\n true,\n );\n this.litPtr = this.litBuffer;\n this.litSize = litSize;\n return lhSize + 1;\n }\n // set_basic\n if (lhSize + litSize + WILDCOPY_OVERLENGTH > size) {\n if (litSize + lhSize > size) {\n fail('corruption_detected');\n }\n this.storeLiterals(\n src.subarray(start + lhSize, start + lhSize + litSize),\n true,\n );\n this.litPtr = this.litBuffer;\n this.litSize = litSize;\n return lhSize + litSize;\n }\n this.litKind = LIT_SRC;\n this.litSrc = src;\n this.litPtr = start + lhSize;\n this.litSize = litSize;\n this.litBufferEnd = this.litPtr + litSize;\n this.litLocation = NOT_IN_DST;\n return lhSize + litSize;\n }\n\n /** The HUF_* calls of ZSTD_decodeLiteralsBlock (set_compressed/repeat). */\n private decodeHuffmanLiterals(\n repeat: boolean,\n singleStream: boolean,\n out: Uint8Array,\n litSize: number,\n src: Uint8Array,\n start: number,\n size: number,\n ): void {\n const table = this.huf;\n if (repeat) {\n if (singleStream) {\n decompress1X(table, out, litSize, src, start, size);\n } else {\n decompress4X(table, out, litSize, src, start, size);\n }\n return;\n }\n if (singleStream) {\n // HUF_decompress1X1_DCtx_wksp\n const headerSize = readDTableX1(table, src, start, size);\n if (headerSize >= size) {\n fail('srcSize_wrong');\n }\n decompress1X(\n table,\n out,\n litSize,\n src,\n start + headerSize,\n size - headerSize,\n );\n return;\n }\n // HUF_decompress4X_hufOnly_wksp\n if (litSize === 0) {\n fail('dstSize_tooSmall');\n }\n if (size === 0) {\n fail('corruption_detected');\n }\n const headerSize = selectX2(litSize, size)\n ? readDTableX2(table, src, start, size)\n : readDTableX1(table, src, start, size);\n if (headerSize >= size) {\n fail('srcSize_wrong');\n }\n decompress4X(\n table,\n out,\n litSize,\n src,\n start + headerSize,\n size - headerSize,\n );\n }\n\n /** ZSTD_decodeSeqHeaders + ZSTD_buildSeqTable. */\n private decodeSeqHeaders(\n src: Uint8Array,\n start: number,\n size: number,\n ): { nbSeq: number; size: number } {\n const iend = start + size;\n let ip = start;\n if (size < 1) {\n fail('srcSize_wrong');\n }\n let nbSeq = byteAt(src, ip);\n ip += 1;\n if (nbSeq > 0x7f) {\n if (nbSeq === 0xff) {\n if (ip + 2 > iend) {\n fail('srcSize_wrong');\n }\n nbSeq = le16(src, ip) + LONGNBSEQ;\n ip += 2;\n } else {\n if (ip >= iend) {\n fail('srcSize_wrong');\n }\n nbSeq = ((nbSeq - 0x80) << 8) + byteAt(src, ip);\n ip += 1;\n }\n }\n if (nbSeq === 0) {\n if (ip !== iend) {\n fail('corruption_detected');\n }\n return { nbSeq, size: ip - start };\n }\n if (ip + 1 > iend) {\n fail('srcSize_wrong');\n }\n const types = byteAt(src, ip);\n if (types & 3) {\n fail('corruption_detected');\n }\n ip += 1;\n const build = (\n type: number,\n max: number,\n maxLog: number,\n baseValue: readonly number[],\n bits: readonly number[],\n defaultTable: SeqTable,\n current: SeqTable,\n ): { table: SeqTable; size: number } => {\n const available = iend - ip;\n if (type === 1) {\n // set_rle\n if (!available) {\n fail('corruption_detected');\n }\n const symbol = byteAt(src, ip);\n if (symbol > max) {\n fail('corruption_detected');\n }\n return {\n size: 1,\n table: rleSeqTable(\n baseValue[symbol] as number,\n bits[symbol] as number,\n ),\n };\n }\n if (type === 0) {\n return { size: 0, table: defaultTable };\n }\n if (type === 3) {\n if (!this.fseEntropy) {\n fail('corruption_detected');\n }\n return { size: 0, table: current };\n }\n const norm = new Int16Array(256);\n const header = readNCount(norm, max, src, ip, available);\n if (header.tableLog > maxLog) {\n fail('corruption_detected');\n }\n return {\n size: header.size,\n table: buildSeqTable(\n norm,\n header.maxSymbolValue,\n baseValue,\n bits,\n header.tableLog,\n ),\n };\n };\n const ll = build(\n types >> 6,\n MAX_LL,\n LL_FSE_LOG,\n LL_BASE,\n LL_BITS,\n LL_DEFAULT_TABLE,\n this.llTable,\n );\n this.llTable = ll.table;\n ip += ll.size;\n const of = build(\n (types >> 4) & 3,\n MAX_OFF,\n OFF_FSE_LOG,\n OF_BASE,\n OF_BITS,\n OF_DEFAULT_TABLE,\n this.ofTable,\n );\n this.ofTable = of.table;\n ip += of.size;\n const ml = build(\n (types >> 2) & 3,\n MAX_ML,\n ML_FSE_LOG,\n ML_BASE,\n ML_BITS,\n ML_DEFAULT_TABLE,\n this.mlTable,\n );\n this.mlTable = ml.table;\n ip += ml.size;\n return { nbSeq, size: ip - start };\n }\n\n // Sequences.\n\n private litByteSource(): Uint8Array {\n if (this.litKind === LIT_MEM) {\n return this.mem.data;\n }\n return this.litKind === LIT_EXTRA ? this.litExtra : this.litSrc;\n }\n\n /** Copy `length` literals to `op` (forward: dst is before src). */\n private copyLiterals(op: number, length: number): void {\n this.mem.ensure(op + length);\n const data = this.mem.data;\n if (this.litKind === LIT_MEM) {\n this.mem.ensure(this.litPtr + length);\n this.mem.data.copyWithin(op, this.litPtr, this.litPtr + length);\n } else {\n const source = this.litByteSource();\n for (let index = 0; index < length; index += 1) {\n data[op + index] = source[this.litPtr + index] ?? 0;\n }\n }\n this.litPtr += length;\n }\n\n /** LZ77 copy (source before destination, overlap repeats bytes). */\n private copyMatch(op: number, match: number, length: number): void {\n this.mem.ensure(op + length);\n const data = this.mem.data;\n if (op - match >= length) {\n data.copyWithin(op, match, match + length);\n return;\n }\n for (let index = 0; index < length; index += 1) {\n data[op + index] = data[match + index] as number;\n }\n }\n\n /**\n * ZSTD_execSequence / ZSTD_execSequenceSplitLitBuffer: the checks of their\n * *End variants (the fast paths can't fail them), then the copies.\n */\n private execSequence(\n op: number,\n oend: number,\n sequence: Sequence,\n litLimit: number,\n split: boolean,\n ): number {\n const oLitEnd = op + sequence.litLength;\n const sequenceLength = sequence.litLength + sequence.matchLength;\n if (above(sequenceLength, oend - op)) {\n fail('dstSize_tooSmall');\n }\n if (above(sequence.litLength, litLimit - this.litPtr)) {\n fail('corruption_detected');\n }\n if (split && op > this.litPtr && op < this.litPtr + sequence.litLength) {\n fail('dstSize_tooSmall');\n }\n this.copyLiterals(op, sequence.litLength);\n const prefixStart = this.prefixStart ?? 0;\n let matchLength = sequence.matchLength;\n let target = oLitEnd;\n let match = oLitEnd - sequence.offset;\n if (above(sequence.offset, oLitEnd - prefixStart)) {\n if (above(sequence.offset, oLitEnd - (this.virtualStart ?? 0))) {\n fail('corruption_detected');\n }\n const dictEnd = this.dictEnd ?? 0;\n match = dictEnd - (prefixStart - match);\n this.mem.ensure(Math.max(oLitEnd + matchLength, dictEnd));\n if (match + matchLength <= dictEnd) {\n this.mem.data.copyWithin(oLitEnd, match, match + matchLength);\n return op + sequenceLength;\n }\n const length1 = dictEnd - match;\n this.mem.data.copyWithin(oLitEnd, match, match + length1);\n target = oLitEnd + length1;\n matchLength -= length1;\n match = prefixStart;\n }\n this.copyMatch(target, match, matchLength);\n return op + sequenceLength;\n }\n\n private decodeSequence(\n bits: BitStream,\n ll: SeqState,\n ml: SeqState,\n of: SeqState,\n prevOffset: number[],\n isLastSeq: boolean,\n ): Sequence {\n const llCell = ll.state;\n const mlCell = ml.state;\n const ofCell = of.state;\n const llBase = ll.table.baseValue[llCell] as number;\n const mlBase = ml.table.baseValue[mlCell] as number;\n const ofBase = of.table.baseValue[ofCell] as number;\n const llBits = ll.table.nbAdditionalBits[llCell] as number;\n const mlBits = ml.table.nbAdditionalBits[mlCell] as number;\n const ofBits = of.table.nbAdditionalBits[ofCell] as number;\n const totalBits = llBits + mlBits + ofBits;\n let offset: number;\n if (ofBits > 1) {\n offset = ofBase + bits.readFast(ofBits);\n prevOffset[2] = prevOffset[1] as number;\n prevOffset[1] = prevOffset[0] as number;\n prevOffset[0] = offset;\n } else {\n const ll0 = llBase === 0 ? 1 : 0;\n if (ofBits === 0) {\n offset = prevOffset[ll0] as number;\n prevOffset[1] = prevOffset[1 - ll0] as number;\n prevOffset[0] = offset;\n } else {\n offset = ofBase + ll0 + bits.readFast(1);\n let temp =\n offset === 3\n ? (prevOffset[0] as number) - 1\n : (prevOffset[offset] as number);\n if (temp === 0) {\n temp = -1;\n }\n if (offset !== 1) {\n prevOffset[2] = prevOffset[1] as number;\n }\n prevOffset[1] = prevOffset[0] as number;\n prevOffset[0] = temp;\n offset = temp;\n }\n }\n let matchLength = mlBase;\n if (mlBits > 0) {\n matchLength += bits.readFast(mlBits);\n }\n if (totalBits >= 57 - (LL_FSE_LOG + ML_FSE_LOG + OFF_FSE_LOG)) {\n bits.reload();\n }\n let litLength = llBase;\n if (llBits > 0) {\n litLength += bits.readFast(llBits);\n }\n if (!isLastSeq) {\n ll.state =\n (ll.table.nextState[llCell] as number) +\n bits.read(ll.table.nbBits[llCell] as number);\n ml.state =\n (ml.table.nextState[mlCell] as number) +\n bits.read(ml.table.nbBits[mlCell] as number);\n of.state =\n (of.table.nextState[ofCell] as number) +\n bits.read(of.table.nbBits[ofCell] as number);\n bits.reload();\n }\n return { litLength, matchLength, offset };\n }\n\n /** The common start of the ZSTD_decompressSequences* bodies. */\n private startSequences(\n src: Uint8Array,\n start: number,\n size: number,\n ): {\n bits: BitStream;\n ll: SeqState;\n of: SeqState;\n ml: SeqState;\n prevOffset: number[];\n } {\n this.fseEntropy = true;\n const prevOffset = [...this.rep];\n const bits = new BitStream();\n if (!bits.init(src, start, size)) {\n fail('corruption_detected');\n }\n const ll = new SeqState(this.llTable, bits);\n const of = new SeqState(this.ofTable, bits);\n const ml = new SeqState(this.mlTable, bits);\n return { bits, ll, ml, of, prevOffset };\n }\n\n private saveRep(prevOffset: number[]): void {\n this.rep = prevOffset.map(value => value >>> 0);\n }\n\n /** ZSTD_decompressSequences_body. */\n private sequences(\n dst: number,\n maxDstSize: number,\n src: Uint8Array,\n start: number,\n size: number,\n nbSeqIn: number,\n ): number {\n const oend =\n this.litLocation === NOT_IN_DST ? dst + maxDstSize : this.litBuffer;\n let op = dst;\n const litEnd = this.litPtr + this.litSize;\n if (nbSeqIn) {\n const state = this.startSequences(src, start, size);\n for (let nbSeq = nbSeqIn; nbSeq; nbSeq -= 1) {\n const sequence = this.decodeSequence(\n state.bits,\n state.ll,\n state.ml,\n state.of,\n state.prevOffset,\n nbSeq === 1,\n );\n op = this.execSequence(op, oend, sequence, litEnd, false);\n }\n if (!state.bits.ended()) {\n fail('corruption_detected');\n }\n this.saveRep(state.prevOffset);\n }\n const lastLLSize = litEnd - this.litPtr;\n if (above(lastLLSize, oend - op)) {\n fail('dstSize_tooSmall');\n }\n this.copyLiterals(op, lastLLSize);\n op += lastLLSize;\n return op - dst;\n }\n\n /** Switch from the literals in dst to litExtraBuffer (ZSTD_split). */\n private switchToExtraLiterals(): void {\n this.litKind = LIT_EXTRA;\n this.litPtr = 0;\n this.litLocation = NOT_IN_DST;\n }\n\n /** ZSTD_decompressSequences_bodySplitLitBuffer. */\n // oxlint-disable-next-line max-lines-per-function -- 1:1 port\n private sequencesSplit(\n dst: number,\n maxDstSize: number,\n src: Uint8Array,\n start: number,\n size: number,\n nbSeqIn: number,\n ): number {\n const oend = dst + maxDstSize;\n let op = dst;\n let litBufferEnd = this.litBufferEnd;\n const dstLitEnd = this.litBufferEnd;\n if (nbSeqIn) {\n const state = this.startSequences(src, start, size);\n let nbSeq = nbSeqIn;\n let sequence: Sequence = { litLength: 0, matchLength: 0, offset: 0 };\n let broke = false;\n for (; nbSeq; nbSeq -= 1) {\n sequence = this.decodeSequence(\n state.bits,\n state.ll,\n state.ml,\n state.of,\n state.prevOffset,\n nbSeq === 1,\n );\n if (this.litPtr + sequence.litLength > dstLitEnd) {\n broke = true;\n break;\n }\n op = this.execSequence(op, oend, sequence, litBufferEnd, true);\n }\n if (broke && nbSeq > 0) {\n const leftoverLit = dstLitEnd - this.litPtr;\n if (leftoverLit) {\n if (above(leftoverLit, oend - op)) {\n fail('dstSize_tooSmall');\n }\n this.copyLiterals(op, leftoverLit);\n sequence.litLength -= leftoverLit;\n op += leftoverLit;\n }\n this.switchToExtraLiterals();\n litBufferEnd = LITBUFFEREXTRASIZE;\n op = this.execSequence(op, oend, sequence, litBufferEnd, false);\n nbSeq -= 1;\n }\n for (; nbSeq > 0; nbSeq -= 1) {\n const next = this.decodeSequence(\n state.bits,\n state.ll,\n state.ml,\n state.of,\n state.prevOffset,\n nbSeq === 1,\n );\n op = this.execSequence(op, oend, next, litBufferEnd, false);\n }\n if (!state.bits.ended()) {\n fail('corruption_detected');\n }\n this.saveRep(state.prevOffset);\n }\n if (this.litLocation === SPLIT) {\n const lastLLSize = litBufferEnd - this.litPtr;\n if (above(lastLLSize, oend - op)) {\n fail('dstSize_tooSmall');\n }\n this.copyLiterals(op, lastLLSize);\n op += lastLLSize;\n this.switchToExtraLiterals();\n litBufferEnd = LITBUFFEREXTRASIZE;\n }\n const lastLLSize = litBufferEnd - this.litPtr;\n if (above(lastLLSize, oend - op)) {\n fail('dstSize_tooSmall');\n }\n this.copyLiterals(op, lastLLSize);\n op += lastLLSize;\n return op - dst;\n }\n\n /** ZSTD_decompressSequencesLong_body (prefetching decoder). */\n // oxlint-disable-next-line max-lines-per-function, complexity -- 1:1 port\n private sequencesLong(\n dst: number,\n maxDstSize: number,\n src: Uint8Array,\n start: number,\n size: number,\n nbSeq: number,\n ): number {\n const oend =\n this.litLocation === IN_DST ? this.litBuffer : dst + maxDstSize;\n let op = dst;\n let litBufferEnd = this.litBufferEnd;\n const dstLitEnd = this.litBufferEnd;\n const execStored = (sequence: Sequence): void => {\n if (\n this.litLocation === SPLIT &&\n this.litPtr + sequence.litLength > dstLitEnd\n ) {\n const leftoverLit = dstLitEnd - this.litPtr;\n if (leftoverLit) {\n if (above(leftoverLit, oend - op)) {\n fail('dstSize_tooSmall');\n }\n this.copyLiterals(op, leftoverLit);\n sequence.litLength -= leftoverLit;\n op += leftoverLit;\n }\n this.switchToExtraLiterals();\n litBufferEnd = LITBUFFEREXTRASIZE;\n op = this.execSequence(op, oend, sequence, litBufferEnd, false);\n return;\n }\n op = this.execSequence(\n op,\n oend,\n sequence,\n litBufferEnd,\n this.litLocation === SPLIT,\n );\n };\n if (nbSeq) {\n const stored = 8;\n const sequences: Sequence[] = [];\n const seqAdvance = Math.min(nbSeq, stored);\n const state = this.startSequences(src, start, size);\n let seqNb = 0;\n for (; seqNb < seqAdvance; seqNb += 1) {\n sequences[seqNb] = this.decodeSequence(\n state.bits,\n state.ll,\n state.ml,\n state.of,\n state.prevOffset,\n seqNb === nbSeq - 1,\n );\n }\n for (; seqNb < nbSeq; seqNb += 1) {\n const sequence = this.decodeSequence(\n state.bits,\n state.ll,\n state.ml,\n state.of,\n state.prevOffset,\n seqNb === nbSeq - 1,\n );\n execStored(sequences[(seqNb - stored) & 7] as Sequence);\n sequences[seqNb & 7] = sequence;\n }\n if (!state.bits.ended()) {\n fail('corruption_detected');\n }\n seqNb -= seqAdvance;\n for (; seqNb < nbSeq; seqNb += 1) {\n execStored(sequences[seqNb & 7] as Sequence);\n }\n this.saveRep(state.prevOffset);\n }\n if (this.litLocation === SPLIT) {\n const lastLLSize = litBufferEnd - this.litPtr;\n if (above(lastLLSize, oend - op)) {\n fail('dstSize_tooSmall');\n }\n this.copyLiterals(op, lastLLSize);\n op += lastLLSize;\n this.litKind = LIT_EXTRA;\n this.litPtr = 0;\n litBufferEnd = LITBUFFEREXTRASIZE;\n }\n const lastLLSize = litBufferEnd - this.litPtr;\n if (above(lastLLSize, oend - op)) {\n fail('dstSize_tooSmall');\n }\n this.copyLiterals(op, lastLLSize);\n op += lastLLSize;\n return op - dst;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Modules/_zstd/decompressor.c\n\n/**\n * `compression.zstd.ZstdDecompressor` as zipfile drives it:\n * `decompress(data)` with no output limit, except that output stops at\n * `cap` bytes (see `capped`). Throws {@link ZstdError}.\n */\nexport class ZstdDecompressor {\n /** Python's `ZstdDecompressor.eof`. */\n eof = false;\n /** The last call stopped at `cap` bytes with more output pending. */\n capped = false;\n\n private readonly stream = new ZstdStream();\n\n decompress(data: Uint8Array, _maxLength: number, cap: number): Uint8Array {\n this.capped = false;\n if (this.eof) {\n throw new Error('Already at the end of a Zstandard frame.');\n }\n if (this.stream.legacy) {\n return EMPTY;\n }\n const input: Input = { data, pos: 0, size: data.length };\n const out = new Output();\n let blocks = 0;\n const startBlock = (size: number): void => {\n out.pos = 0;\n out.pyEnd = size;\n out.size = Math.min(size, cap - out.kept);\n };\n startBlock(BUFFER_BLOCK_SIZE[0] as number);\n try {\n for (;;) {\n const result = this.stream.decompressStream(input, out);\n if (this.stream.legacy) {\n break;\n }\n if (result === 0) {\n this.eof = true;\n break;\n }\n if (out.pos >= out.size) {\n if (out.size < out.pyEnd || out.kept >= cap) {\n this.capped = true;\n break;\n }\n blocks += 1;\n startBlock(\n BUFFER_BLOCK_SIZE[\n Math.min(blocks, BUFFER_BLOCK_SIZE.length - 1)\n ] as number,\n );\n } else if (input.pos === input.size) {\n break;\n }\n }\n } catch (error) {\n if (error instanceof Fail) {\n throw new ZstdError(\n `Unable to decompress Zstandard data: ${ERROR_NAMES[error.code]}`,\n );\n }\n throw error;\n }\n if (out.truncated) {\n this.capped = true;\n }\n const result = new Uint8Array(out.kept);\n let offset = 0;\n for (const chunk of out.chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n}\n","// Port of the read path of CPython 3.14's `zipfile` (Lib/zipfile/__init__.py)\n// that parsedmarc's `extract_report()` runs:\n//\n// zipfile.ZipFile(BytesIO(data)).open(namelist()[0]).read(limit + 1)\n//\n// Every check, its order and its error message follow CPython, including\n// the `io.BytesIO` seek/read errors a corrupt archive can trigger\n// (`negative seek value -45`). Sizes and offsets are bigints because zip64\n// fields are unsigned 64-bit values and Python's ints are unbounded.\n//\n// The only deliberate difference: bzip2, LZMA and Zstandard members are\n// never decompressed past the bytes requested (Python's decompressors have\n// no output limit in zipfile). See `readFirstZipMember()`.\n\nimport { pyDecode } from '../utils/py-codecs';\nimport { pyRepr } from '../utils/py-str';\nimport { Bz2Decompressor } from './bz2';\nimport { crc32Update } from './crc';\nimport { ZipLzmaDecompressor } from './lzma';\nimport { ZlibDecompressor } from './zlib';\nimport { ZstdDecompressor } from './zstd';\n\n/** Python's `zipfile.BadZipFile`. */\nexport class BadZipFile extends Error {\n override name = 'BadZipFile';\n}\n\n/** Python's `NotImplementedError`. */\nexport class NotImplementedError extends Error {\n override name = 'NotImplementedError';\n}\n\n/** Python's `RuntimeError`. */\nexport class PyRuntimeError extends Error {\n override name = 'RuntimeError';\n}\n\n/** Python's `EOFError`. */\nexport class PyEOFError extends Error {\n override name = 'EOFError';\n}\n\n/** Python's `OSError`. */\nexport class PyOSError extends Error {\n override name = 'OSError';\n}\n\n/** Python's `ValueError` (from `io.BytesIO.seek`). */\nclass PyValueError extends Error {\n override name = 'ValueError';\n}\n\n/** Python's `OverflowError` (64-bit zip fields that don't fit `ssize_t`). */\nclass PyOverflowError extends Error {\n override name = 'OverflowError';\n}\n\n/** Python's `IndexError`. */\nclass PyIndexError extends Error {\n override name = 'IndexError';\n}\n\nconst SSIZE_MAX = 2n ** 63n - 1n;\n\n/** The subset of `io.BytesIO` zipfile uses, with CPython's errors. */\nclass BytesIO {\n private position = 0n;\n private readonly data: Uint8Array;\n\n constructor(data: Uint8Array) {\n this.data = data;\n }\n\n get size(): bigint {\n return BigInt(this.data.length);\n }\n\n seek(offset: bigint, whence: 0 | 2 = 0): bigint {\n if (offset > SSIZE_MAX || offset < -SSIZE_MAX - 1n) {\n throw new PyOverflowError('Python int too large to convert to C ssize_t');\n }\n if (offset < 0n && whence === 0) {\n throw new PyValueError(`negative seek value ${offset}`);\n }\n const position = whence === 2 ? offset + this.size : offset;\n this.position = position < 0n ? 0n : position;\n return this.position;\n }\n\n tell(): bigint {\n return this.position;\n }\n\n /** `read(count)`; a negative count reads to the end. */\n read(count: bigint | number): Uint8Array {\n const wanted = BigInt(count);\n if (wanted > SSIZE_MAX) {\n throw new PyOverflowError(\"cannot fit 'int' into an index-sized integer\");\n }\n if (this.position >= this.size) {\n return new Uint8Array(0);\n }\n const available = this.size - this.position;\n const length = wanted < 0n || wanted > available ? available : wanted;\n const start = Number(this.position);\n this.position += length;\n return this.data.subarray(start, start + Number(length));\n }\n}\n\nfunction readUint16(data: Uint8Array, offset: number): number {\n return (data[offset] as number) | ((data[offset + 1] as number) << 8);\n}\n\nfunction readUint32(data: Uint8Array, offset: number): number {\n return (\n (readUint16(data, offset) | (readUint16(data, offset + 2) << 16)) >>> 0\n );\n}\n\nfunction readUint64(data: Uint8Array, offset: number): bigint {\n return (\n BigInt(readUint32(data, offset)) |\n (BigInt(readUint32(data, offset + 4)) << 32n)\n );\n}\n\nfunction hasSignature(\n data: Uint8Array,\n offset: number,\n signature: readonly number[],\n): boolean {\n return signature.every((byte, index) => data[offset + index] === byte);\n}\n\nconst STRING_END_ARCHIVE = [0x50, 0x4b, 0x05, 0x06];\nconst STRING_CENTRAL_DIR = [0x50, 0x4b, 0x01, 0x02];\nconst STRING_FILE_HEADER = [0x50, 0x4b, 0x03, 0x04];\nconst STRING_END_ARCHIVE64_LOCATOR = [0x50, 0x4b, 0x06, 0x07];\nconst STRING_END_ARCHIVE64 = [0x50, 0x4b, 0x06, 0x06];\nconst SIZE_END_CENT_DIR = 22;\nconst SIZE_CENTRAL_DIR = 46;\nconst SIZE_FILE_HEADER = 30;\nconst SIZE_END_CENT_DIR64_LOCATOR = 20;\nconst SIZE_END_CENT_DIR64 = 56;\nconst ZIP_MAX_COMMENT = 0xff_ff;\nconst MAX_EXTRACT_VERSION = 63;\n\nconst MASK_ENCRYPTED = 1 << 0;\nconst MASK_COMPRESSED_PATCH = 1 << 5;\nconst MASK_STRONG_ENCRYPTION = 1 << 6;\nconst MASK_UTF_FILENAME = 1 << 11;\n\nconst ZIP_STORED = 0;\nconst ZIP_DEFLATED = 8;\nconst ZIP_BZIP2 = 12;\nconst ZIP_LZMA = 14;\nconst ZIP_ZSTANDARD = 93;\n\nconst UINT32_MAX = 0xff_ff_ff_ffn;\nconst UINT64_MAX = 0xff_ff_ff_ff_ff_ff_ff_ffn;\n\n/** zipfile's `_EndRecData` result (\"end of central directory\" record). */\ninterface EndRecord {\n diskNumber: number;\n diskStart: number;\n size: bigint;\n offset: bigint;\n /** File offset of the record (`_ECD_LOCATION`). */\n location: bigint;\n}\n\nfunction unpackEndRecord(data: Uint8Array, location: bigint): EndRecord {\n return {\n diskNumber: readUint16(data, 4),\n diskStart: readUint16(data, 6),\n location,\n offset: BigInt(readUint32(data, 16)),\n size: BigInt(readUint32(data, 12)),\n };\n}\n\n/** zipfile `_EndRecData64`: update `endrec` from the zip64 records. */\nfunction endRecData64(\n file: BytesIO,\n location: bigint,\n endrec: EndRecord,\n): EndRecord {\n let offset = location - BigInt(SIZE_END_CENT_DIR64_LOCATOR);\n if (offset < 0n) {\n return endrec;\n }\n file.seek(offset);\n let data = file.read(SIZE_END_CENT_DIR64_LOCATOR);\n if (data.length !== SIZE_END_CENT_DIR64_LOCATOR) {\n throw new PyOSError('Unknown I/O error');\n }\n if (!hasSignature(data, 0, STRING_END_ARCHIVE64_LOCATOR)) {\n return endrec;\n }\n const diskNumber = readUint32(data, 4);\n const relativeOffset = readUint64(data, 8);\n const disks = readUint32(data, 16);\n if (diskNumber !== 0 || disks > 1) {\n throw new BadZipFile('zipfiles that span multiple disks are not supported');\n }\n offset -= BigInt(SIZE_END_CENT_DIR64);\n if (relativeOffset > offset) {\n throw new BadZipFile('Corrupt zip64 end of central directory locator');\n }\n file.seek(relativeOffset);\n let extraSize = offset - relativeOffset;\n data = file.read(SIZE_END_CENT_DIR64);\n if (data.length !== SIZE_END_CENT_DIR64) {\n throw new PyOSError('Unknown I/O error');\n }\n if (\n !hasSignature(data, 0, STRING_END_ARCHIVE64) &&\n relativeOffset !== offset\n ) {\n // Maybe prepended data: assume no \"zip64 extensible data\".\n file.seek(offset);\n extraSize = 0n;\n data = file.read(SIZE_END_CENT_DIR64);\n if (data.length !== SIZE_END_CENT_DIR64) {\n throw new PyOSError('Unknown I/O error');\n }\n }\n if (!hasSignature(data, 0, STRING_END_ARCHIVE64)) {\n throw new BadZipFile('Zip64 end of central directory record not found');\n }\n const recordSize = readUint64(data, 4);\n const directorySize = readUint64(data, 40);\n const directoryOffset = readUint64(data, 48);\n if (\n directoryOffset + directorySize !== relativeOffset ||\n recordSize + 12n !== BigInt(SIZE_END_CENT_DIR64) + extraSize\n ) {\n throw new BadZipFile('Corrupt zip64 end of central directory record');\n }\n return {\n diskNumber: readUint32(data, 16),\n diskStart: readUint32(data, 20),\n location: offset - extraSize,\n offset: directoryOffset,\n size: directorySize,\n };\n}\n\n/** zipfile `_EndRecData`: `null` when no end record is found. */\nfunction endRecData(file: BytesIO): EndRecord | null {\n const fileSize = file.seek(0n, 2);\n file.seek(BigInt(-SIZE_END_CENT_DIR), 2);\n let data = file.read(SIZE_END_CENT_DIR);\n if (\n data.length === SIZE_END_CENT_DIR &&\n hasSignature(data, 0, STRING_END_ARCHIVE) &&\n data[20] === 0 &&\n data[21] === 0\n ) {\n const location = fileSize - BigInt(SIZE_END_CENT_DIR);\n return endRecData64(file, location, unpackEndRecord(data, location));\n }\n const maxCommentStart = Math.max(\n Number(fileSize) - ZIP_MAX_COMMENT - SIZE_END_CENT_DIR,\n 0,\n );\n file.seek(BigInt(maxCommentStart));\n data = file.read(ZIP_MAX_COMMENT + SIZE_END_CENT_DIR);\n const start = lastIndexOf(data, STRING_END_ARCHIVE);\n if (start < 0) {\n return null;\n }\n const record = data.subarray(start, start + SIZE_END_CENT_DIR);\n if (record.length !== SIZE_END_CENT_DIR) {\n // The archive is corrupt.\n return null;\n }\n const location = BigInt(maxCommentStart + start);\n return endRecData64(file, location, unpackEndRecord(record, location));\n}\n\nfunction lastIndexOf(data: Uint8Array, needle: readonly number[]): number {\n for (let index = data.length - needle.length; index >= 0; index -= 1) {\n if (hasSignature(data, index, needle)) {\n return index;\n }\n }\n return -1;\n}\n\n/** Python's `repr(bytes)`. */\nexport function pyBytesRepr(data: Uint8Array): string {\n const quote = data.includes(0x27) && !data.includes(0x22) ? '\"' : \"'\";\n let body = '';\n for (const byte of data) {\n if (byte === 0x5c) {\n body += '\\\\\\\\';\n } else if (byte === quote.charCodeAt(0)) {\n body += `\\\\${quote}`;\n } else if (byte === 0x09) {\n body += '\\\\t';\n } else if (byte === 0x0a) {\n body += '\\\\n';\n } else if (byte === 0x0d) {\n body += '\\\\r';\n } else if (byte < 0x20 || byte >= 0x7f) {\n body += `\\\\x${byte.toString(16).padStart(2, '0')}`;\n } else {\n body += String.fromCharCode(byte);\n }\n }\n return `b${quote}${body}${quote}`;\n}\n\n/** zipfile `_sanitize_filename` on POSIX: cut at the first NUL. */\nfunction sanitizeFilename(filename: string): string {\n const nul = filename.indexOf('\\0');\n return nul >= 0 ? filename.slice(0, nul) : filename;\n}\n\n/** The `ZipInfo` attributes the read path uses. */\ninterface ZipInfo {\n origFilename: string;\n filename: string;\n flagBits: number;\n compressType: number;\n crc: number;\n compressSize: bigint;\n fileSize: bigint;\n headerOffset: bigint;\n extra: Uint8Array;\n endOffset: bigint | null;\n}\n\n/** `ZipInfo._decodeExtra`: zip64 sizes and the Unicode path field. */\nfunction decodeExtra(info: ZipInfo, filenameCrc: number): void {\n let extra = info.extra;\n while (extra.length >= 4) {\n const type = readUint16(extra, 0);\n const length = readUint16(extra, 2);\n if (length + 4 > extra.length) {\n throw new BadZipFile(\n `Corrupt extra field ${type.toString(16).padStart(4, '0')} (size=${length})`,\n );\n }\n const data = extra.subarray(4, length + 4);\n if (type === 0x00_01) {\n decodeZip64Extra(info, data);\n } else if (type === 0x70_75) {\n decodeUnicodePathExtra(info, data, filenameCrc);\n }\n extra = extra.subarray(length + 4);\n }\n}\n\nfunction decodeZip64Extra(info: ZipInfo, field: Uint8Array): void {\n let data = field;\n const take = (name: string): bigint => {\n if (data.length < 8) {\n throw new BadZipFile(`Corrupt zip64 extra field. ${name} not found.`);\n }\n const value = readUint64(data, 0);\n data = data.subarray(8);\n return value;\n };\n if (info.fileSize === UINT64_MAX || info.fileSize === UINT32_MAX) {\n info.fileSize = take('File size');\n }\n if (info.compressSize === UINT32_MAX) {\n info.compressSize = take('Compress size');\n }\n if (info.headerOffset === UINT32_MAX) {\n info.headerOffset = take('Header offset');\n }\n}\n\nfunction decodeUnicodePathExtra(\n info: ZipInfo,\n data: Uint8Array,\n filenameCrc: number,\n): void {\n if (data.length < 5) {\n throw new BadZipFile('Corrupt unicode path extra field (0x7075)');\n }\n if (data[0] !== 1 || readUint32(data, 1) !== filenameCrc) {\n return;\n }\n let name: string;\n try {\n name = pyDecode(data.subarray(5), 'utf-8');\n } catch {\n throw new BadZipFile(\n 'Corrupt unicode path extra field (0x7075): invalid utf-8 bytes',\n );\n }\n // An empty name only triggers a warning in Python.\n if (name !== '') {\n info.filename = sanitizeFilename(name);\n }\n}\n\n/** `ZipFile._RealGetContents`: parse every central directory entry. */\nfunction realGetContents(file: BytesIO): {\n filelist: ZipInfo[];\n nameToInfo: Map<string, ZipInfo>;\n} {\n const endrec = endRecData(file);\n if (endrec === null) {\n throw new BadZipFile('File is not a zip file');\n }\n const concat = endrec.location - endrec.size - endrec.offset;\n const startDir = endrec.offset + concat;\n if (startDir < 0n) {\n throw new BadZipFile('Bad offset for central directory');\n }\n file.seek(startDir);\n const directory = new BytesIO(file.read(endrec.size));\n const filelist: ZipInfo[] = [];\n const nameToInfo = new Map<string, ZipInfo>();\n let total = 0n;\n while (total < endrec.size) {\n const centdir = directory.read(SIZE_CENTRAL_DIR);\n if (centdir.length !== SIZE_CENTRAL_DIR) {\n throw new BadZipFile('Truncated central directory');\n }\n if (!hasSignature(centdir, 0, STRING_CENTRAL_DIR)) {\n throw new BadZipFile('Bad magic number for central directory');\n }\n const filenameLength = readUint16(centdir, 28);\n const extraLength = readUint16(centdir, 30);\n const commentLength = readUint16(centdir, 32);\n const rawFilename = directory.read(filenameLength);\n const filenameCrc = crc32Update(0, rawFilename);\n const flagBits = readUint16(centdir, 8);\n const filename = pyDecode(\n rawFilename,\n flagBits & MASK_UTF_FILENAME ? 'utf-8' : 'cp437',\n );\n const extra = directory.read(extraLength);\n directory.read(commentLength);\n const info: ZipInfo = {\n compressSize: BigInt(readUint32(centdir, 20)),\n compressType: readUint16(centdir, 10),\n crc: readUint32(centdir, 16),\n endOffset: null,\n extra,\n fileSize: BigInt(readUint32(centdir, 24)),\n filename: sanitizeFilename(filename),\n flagBits,\n headerOffset: BigInt(readUint32(centdir, 42)),\n origFilename: filename,\n };\n const extractVersion = centdir[6] as number;\n if (extractVersion > MAX_EXTRACT_VERSION) {\n throw new NotImplementedError(\n `zip file version ${Math.floor(extractVersion / 10)}.${extractVersion % 10}`,\n );\n }\n decodeExtra(info, filenameCrc);\n info.headerOffset += concat;\n filelist.push(info);\n nameToInfo.set(info.filename, info);\n total +=\n BigInt(SIZE_CENTRAL_DIR) +\n BigInt(filenameLength + extraLength + commentLength);\n }\n // `reversed(sorted(filelist, key=header_offset))`: sorted() is stable.\n const sorted = filelist.toSorted((a, b) =>\n a.headerOffset < b.headerOffset\n ? -1\n : Number(a.headerOffset > b.headerOffset),\n );\n let endOffset = startDir;\n for (const info of sorted.toReversed()) {\n info.endOffset = endOffset;\n endOffset = info.headerOffset;\n }\n return { filelist, nameToInfo };\n}\n\n/** zipfile `_SharedFile`: a position of its own over the archive. */\nclass SharedFile {\n private readonly file: BytesIO;\n private position: bigint;\n\n constructor(file: BytesIO, position: bigint) {\n this.file = file;\n this.position = position;\n }\n\n tell(): bigint {\n return this.position;\n }\n\n /** `seek(offset, whence=1)`. */\n skip(offset: number): void {\n this.file.seek(this.position + BigInt(offset));\n this.position = this.file.tell();\n }\n\n read(count: bigint | number): Uint8Array {\n this.file.seek(this.position);\n const data = this.file.read(count);\n this.position = this.file.tell();\n return data;\n }\n}\n\n/** A decompressor as `ZipExtFile` drives it. */\ninterface MemberDecompressor {\n eof: boolean;\n /** True when output was cut at `cap` (see `ZipExtFile.read1`). */\n capped?: boolean;\n decompress: (data: Uint8Array, maxLength: number, cap: number) => Uint8Array;\n readonly unconsumedTail?: Uint8Array;\n flush?: () => Uint8Array;\n}\n\nclass DeflateDecompressor implements MemberDecompressor {\n private readonly zlib = new ZlibDecompressor(-15);\n\n get eof(): boolean {\n return this.zlib.eof;\n }\n\n get unconsumedTail(): Uint8Array {\n return this.zlib.unconsumedTail;\n }\n\n decompress(data: Uint8Array, maxLength: number): Uint8Array {\n return this.zlib.decompress(data, maxLength);\n }\n\n flush(): Uint8Array {\n return this.zlib.flush();\n }\n}\n\n/** zipfile `_check_compression` + `_get_decompressor`. */\nfunction getDecompressor(compressType: number): MemberDecompressor | null {\n switch (compressType) {\n case ZIP_STORED:\n return null;\n case ZIP_DEFLATED:\n return new DeflateDecompressor();\n case ZIP_BZIP2:\n return new Bz2Decompressor();\n case ZIP_LZMA:\n return new ZipLzmaDecompressor();\n case ZIP_ZSTANDARD:\n return new ZstdDecompressor();\n default:\n throw new NotImplementedError('That compression method is not supported');\n }\n}\n\nfunction concatBytes(first: Uint8Array, second: Uint8Array): Uint8Array {\n if (first.length === 0) {\n return second;\n }\n if (second.length === 0) {\n return first;\n }\n const joined = new Uint8Array(first.length + second.length);\n joined.set(first);\n joined.set(second, first.length);\n return joined;\n}\n\nconst MIN_READ_SIZE = 4096;\n\n/** zipfile `ZipExtFile`, reading only (no seek, no decryption). */\nclass ZipExtFile {\n private readonly decompressor: MemberDecompressor | null;\n private compressLeft: bigint;\n private left: bigint;\n private eof = false;\n private runningCrc = 0;\n /** Python checks the CRC only when it has every byte of the member. */\n private crcUnknown = false;\n\n private readonly file: SharedFile;\n private readonly info: ZipInfo;\n\n constructor(file: SharedFile, info: ZipInfo) {\n this.file = file;\n this.info = info;\n this.compressLeft = info.compressSize;\n this.left = info.fileSize;\n this.decompressor = getDecompressor(info.compressType);\n }\n\n /** `read(n)` for `n >= 0` on a freshly opened member. */\n read(count: number): Uint8Array {\n const chunks: Uint8Array[] = [];\n let length = 0;\n let wanted = count;\n while (wanted > 0 && !this.eof) {\n const data = this.read1(wanted);\n if (wanted < data.length) {\n chunks.push(data.subarray(0, wanted));\n length += wanted;\n break;\n }\n chunks.push(data);\n length += data.length;\n wanted -= data.length;\n }\n if (chunks.length === 1) {\n return chunks[0] as Uint8Array;\n }\n const result = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n\n /** `_read1(n)`. */\n private read1(count: number): Uint8Array {\n if (this.eof || count <= 0) {\n return new Uint8Array(0);\n }\n const decompressor = this.decompressor;\n let data: Uint8Array;\n if (decompressor === null) {\n data = this.read2(count);\n this.eof = this.compressLeft <= 0n;\n } else if (this.info.compressType === ZIP_DEFLATED) {\n data = decompressor.unconsumedTail ?? new Uint8Array(0);\n if (count > data.length) {\n data = concatBytes(data, this.read2(count - data.length));\n }\n const maxLength = Math.max(count, MIN_READ_SIZE);\n data = decompressor.decompress(data, maxLength, maxLength);\n this.eof =\n decompressor.eof ||\n (this.compressLeft <= 0n &&\n (decompressor.unconsumedTail?.length ?? 0) === 0);\n if (this.eof && decompressor.flush !== undefined) {\n data = concatBytes(data, decompressor.flush());\n }\n } else {\n data = this.read2(count);\n // Python decompresses the whole chunk; output past `count` bytes is\n // only needed for the CRC, so it is bounded here.\n data = decompressor.decompress(data, 0, count);\n this.eof = decompressor.eof || this.compressLeft <= 0n;\n if (decompressor.capped === true) {\n this.crcUnknown = true;\n }\n }\n if (BigInt(data.length) > this.left) {\n data = data.subarray(0, Number(this.left));\n }\n this.left -= BigInt(data.length);\n if (this.left <= 0n) {\n this.eof = true;\n this.crcUnknown = false;\n }\n this.updateCrc(data);\n return data;\n }\n\n /** `_read2(n)`. */\n private read2(count: number): Uint8Array {\n if (this.compressLeft <= 0n) {\n return new Uint8Array(0);\n }\n let wanted = BigInt(Math.max(count, MIN_READ_SIZE));\n if (wanted > this.compressLeft) {\n wanted = this.compressLeft;\n }\n const data = this.file.read(wanted);\n this.compressLeft -= BigInt(data.length);\n if (data.length === 0) {\n throw new PyEOFError('');\n }\n return data;\n }\n\n /** `_update_crc`. */\n private updateCrc(data: Uint8Array): void {\n this.runningCrc = crc32Update(this.runningCrc, data);\n if (this.eof && !this.crcUnknown && this.runningCrc !== this.info.crc) {\n throw new BadZipFile(`Bad CRC-32 for file ${pyRepr(this.info.filename)}`);\n }\n }\n}\n\n/** `ZipFile.open(name)` for reading, without a password. */\nfunction openMember(file: BytesIO, info: ZipInfo, name: string): ZipExtFile {\n const shared = new SharedFile(file, info.headerOffset);\n const header = shared.read(SIZE_FILE_HEADER);\n if (header.length !== SIZE_FILE_HEADER) {\n throw new BadZipFile('Truncated file header');\n }\n if (!hasSignature(header, 0, STRING_FILE_HEADER)) {\n throw new BadZipFile('Bad magic number for file header');\n }\n const headerName = shared.read(readUint16(header, 26));\n const headerExtraLength = readUint16(header, 28);\n if (headerExtraLength) {\n shared.skip(headerExtraLength);\n }\n if (info.flagBits & MASK_COMPRESSED_PATCH) {\n throw new NotImplementedError('compressed patched data (flag bit 5)');\n }\n if (info.flagBits & MASK_STRONG_ENCRYPTION) {\n throw new NotImplementedError('strong encryption (flag bit 6)');\n }\n const headerNameText = pyDecode(\n headerName,\n readUint16(header, 6) & MASK_UTF_FILENAME ? 'utf-8' : 'cp437',\n );\n if (headerNameText !== info.origFilename) {\n throw new BadZipFile(\n `File name in directory ${pyRepr(info.origFilename)} and header ${pyBytesRepr(headerName)} differ.`,\n );\n }\n if (\n info.endOffset !== null &&\n shared.tell() + info.compressSize > info.endOffset &&\n // Python only warns when the entry starts where the next one does.\n info.endOffset !== info.headerOffset\n ) {\n throw new BadZipFile(\n `Overlapped entries: ${pyRepr(info.origFilename)} (possible zip bomb)`,\n );\n }\n if (info.flagBits & MASK_ENCRYPTED) {\n throw new PyRuntimeError(\n `File ${pyRepr(name)} is encrypted, password required for extraction`,\n );\n }\n return new ZipExtFile(shared, info);\n}\n\n/**\n * `zipfile.ZipFile(BytesIO(data)).open(namelist()[0]).read(count)`, with\n * the exceptions CPython 3.14 raises for corrupt archives.\n *\n * zipfile decompresses bzip2, LZMA and Zstandard members one input chunk at\n * a time with no output limit. Here their output stops at `count` bytes, so\n * a member that decompresses to more than that comes back as `count` bytes\n * (too big for the caller) even where CPython would go on to find corrupt\n * data or a bad CRC further on, or run out of memory on a bomb. `count`\n * may be a function of the member's compression method.\n */\nexport function readFirstZipMember(\n data: Uint8Array,\n count: number | ((compressType: number) => number),\n): Uint8Array {\n const file = new BytesIO(data);\n const { filelist, nameToInfo } = realGetContents(file);\n const first = filelist[0];\n if (first === undefined) {\n throw new PyIndexError('list index out of range');\n }\n const info = nameToInfo.get(first.filename) as ZipInfo;\n const member = openMember(file, info, first.filename);\n return member.read(\n typeof count === 'number' ? count : count(info.compressType),\n );\n}\n\n/** Zip compression methods decoded by the slow pure-TypeScript codecs. */\nexport const SLOW_ZIP_METHODS: ReadonlyMap<number, string> = new Map([\n [ZIP_BZIP2, 'bzip2'],\n [ZIP_LZMA, 'LZMA'],\n [ZIP_ZSTANDARD, 'Zstandard'],\n]);\n","// UTF-8 decoding with Python's error handlers. `TextDecoder` only offers\n// \"replace\" and \"fatal\"; parsedmarc often decodes with `errors=\"ignore\"`,\n// which drops invalid sequences instead of inserting U+FFFD.\n\nexport type DecodeErrors = 'strict' | 'replace' | 'ignore';\n\nconst STRICT = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });\nconst REPLACE = new TextDecoder('utf-8', { ignoreBOM: true });\n\n/** Length of the valid UTF-8 sequence at `index`, or 0 if invalid there. */\nfunction sequenceLength(bytes: Uint8Array, index: number): number {\n const first = bytes[index] ?? 0;\n if (first < 0x80) {\n return 1;\n }\n let length: number;\n let lower = 0x80;\n let upper = 0xbf;\n if (first >= 0xc2 && first <= 0xdf) {\n length = 2;\n } else if (first >= 0xe0 && first <= 0xef) {\n length = 3;\n if (first === 0xe0) {\n lower = 0xa0;\n } else if (first === 0xed) {\n upper = 0x9f;\n }\n } else if (first >= 0xf0 && first <= 0xf4) {\n length = 4;\n if (first === 0xf0) {\n lower = 0x90;\n } else if (first === 0xf4) {\n upper = 0x8f;\n }\n } else {\n return 0;\n }\n for (let offset = 1; offset < length; offset += 1) {\n const byte = bytes[index + offset];\n if (byte === undefined) {\n return 0;\n }\n const min = offset === 1 ? lower : 0x80;\n const max = offset === 1 ? upper : 0xbf;\n if (byte < min || byte > max) {\n return 0;\n }\n }\n return length;\n}\n\n/** Decode UTF-8 like Python's `bytes.decode(\"utf-8\", errors=...)`. */\nexport function decodeUtf8(\n bytes: Uint8Array,\n errors: DecodeErrors = 'strict',\n): string {\n if (errors === 'strict') {\n return STRICT.decode(bytes);\n }\n if (errors === 'replace') {\n return REPLACE.decode(bytes);\n }\n try {\n return STRICT.decode(bytes);\n } catch {\n // Fall through to the slow path only for invalid input.\n }\n // The valid sequences, moved together in one copy: a view per valid run\n // would cost a hundred times the size of input that alternates with\n // invalid bytes.\n const kept = new Uint8Array(bytes.length);\n let keptLength = 0;\n let index = 0;\n while (index < bytes.length) {\n const length = sequenceLength(bytes, index);\n for (let offset = 0; offset < length; offset += 1) {\n kept[keptLength] = bytes[index + offset] ?? 0;\n keptLength += 1;\n }\n index += Math.max(length, 1);\n }\n return STRICT.decode(kept.subarray(0, keptLength));\n}\n","// Report extraction, ported from parsedmarc/__init__.py: detect zip, gzip,\n// XML or JSON content and return the report text.\n//\n// Decompression is capped at MAX_DECOMPRESSED_REPORT_SIZE (100 MiB): report\n// attachments come from anyone who can send mail to a monitored mailbox, and\n// deflate reaches ~1000:1 on degenerate input. gzip and zip go through ports\n// of zlib's inflate and of CPython's `zipfile` (src/internal) so results and\n// error messages match parsedmarc on corrupt input too.\n\nimport { createReadStream } from 'node:fs';\n\nimport { ParserError } from './errors';\nimport {\n MAGIC_GZIP,\n MAGIC_JSON,\n MAGIC_XML,\n MAGIC_XML_TAG,\n MAGIC_ZIP,\n startsWith,\n} from './internal/magic';\nimport { errorText, excOrigin } from './internal/py';\nimport { readFirstZipMember, SLOW_ZIP_METHODS } from './internal/zipfile';\nimport { ZlibDecompressor } from './internal/zlib';\nimport { decodeUtf8 } from './utils/text';\n\n/** Largest decompressed report accepted, in bytes. */\nexport const MAX_DECOMPRESSED_REPORT_SIZE: number = 100 * 1024 * 1024;\n\n/**\n * Largest decompressed zip member accepted for the bzip2, LZMA and\n * Zstandard methods (12, 14, 93), in bytes. Their pure-TypeScript decoders\n * are much slower than inflate, and a 1 KB bzip2 member can expand to the\n * 100 MiB cap, costing seconds of CPU per attachment. Report senders use\n * deflate (RFC 7489 asks for zip or gzip), so these methods only need to\n * handle small reports. Not in parsedmarc.\n */\nexport const MAX_DECOMPRESSED_SLOW_CODEC_SIZE: number = 10 * 1024 * 1024;\n\nconst BASE64_TEXT = /^[A-Za-z0-9+/]*={0,2}$/u;\n\nexport interface ExtractOptions {\n /** Override the decompression cap (tests); defaults to 100 MiB. */\n maxDecompressedSize?: number;\n /**\n * Override the cap for bzip2, LZMA and Zstandard zip members (tests);\n * defaults to 10 MiB, and never exceeds `maxDecompressedSize`.\n */\n maxSlowCodecSize?: number;\n /**\n * Largest stream or file read, in bytes; `0` disables the check. Defaults\n * to 100 MiB, the largest report once decompressed. Not in parsedmarc.\n */\n maxInputSize?: number;\n /** Told how many bytes were decompressed (not called for plain content). */\n onDecompressed?: (size: number) => void;\n}\n\n/**\n * Python's `base64.b64decode(text, validate=True)`: `null` when the text is\n * not strict base64 (Python raises `binascii.Error` and parsedmarc then\n * returns the text unchanged).\n */\nfunction strictBase64Decode(text: string): Uint8Array | null {\n if (!BASE64_TEXT.test(text)) {\n return null;\n }\n const data = text.replace(/=+$/u, '');\n const padding = text.length - data.length;\n const remainder = data.length % 4;\n if (remainder === 1) {\n return null;\n }\n if (remainder !== 0 && padding < 4 - remainder) {\n return null;\n }\n return new Uint8Array(Buffer.from(data, 'base64'));\n}\n\nfunction limitError(limit: number): ParserError {\n return new ParserError(`Decompressed report exceeds the ${limit} byte limit`);\n}\n\nfunction concatBytes(first: Uint8Array, second: Uint8Array): Uint8Array {\n if (second.length === 0) {\n return first;\n }\n const joined = new Uint8Array(first.length + second.length);\n joined.set(first);\n joined.set(second, first.length);\n return joined;\n}\n\n/**\n * Decompress the first member of a gzip stream, refusing to produce more\n * than `limit` bytes (parsedmarc's `_decompress_gzip_bounded`). Corrupt\n * data raises zlib's errors (`Error -3 while decompressing data: ...`);\n * trailing bytes after the first member are ignored.\n */\nexport function decompressGzipBounded(\n data: Uint8Array,\n limit: number = MAX_DECOMPRESSED_REPORT_SIZE,\n): Uint8Array {\n const decompressor = new ZlibDecompressor(31);\n const decompressed = decompressor.decompress(data, limit + 1);\n if (decompressed.length > limit) {\n throw limitError(limit);\n }\n // Bounded: a call that returned fewer than `limit + 1` bytes consumed all\n // of its input or reached the end of the stream.\n const result = concatBytes(decompressed, decompressor.flush());\n if (!decompressor.eof) {\n throw new ParserError('Incomplete or truncated gzip stream');\n }\n return result;\n}\n\ninterface Limits {\n limit: number;\n slowCodecLimit: number;\n onDecompressed?: ((size: number) => void) | undefined;\n}\n\n/**\n * Read the first member of a zip archive, bounded to `limit` bytes, or to\n * `slowCodecLimit` for the bzip2, LZMA and Zstandard methods.\n */\nfunction readZipReport(data: Uint8Array, limits: Limits): Uint8Array {\n const chosen = { limit: limits.limit, codec: '' };\n const member = readFirstZipMember(data, compressType => {\n const codec = SLOW_ZIP_METHODS.get(compressType);\n if (codec !== undefined && limits.slowCodecLimit < limits.limit) {\n chosen.limit = limits.slowCodecLimit;\n chosen.codec = codec;\n }\n return chosen.limit + 1;\n });\n if (member.length > chosen.limit) {\n if (chosen.codec) {\n throw new ParserError(\n `Decompressed ${chosen.codec} report exceeds the ${chosen.limit} byte limit for bzip2, LZMA and Zstandard zip members`,\n );\n }\n throw limitError(chosen.limit);\n }\n return member;\n}\n\nfunction extractFromBytes(data: Uint8Array, limits: Limits): string {\n const { limit } = limits;\n if (startsWith(data, MAGIC_ZIP)) {\n const member = readZipReport(data, limits);\n limits.onDecompressed?.(member.length);\n return decodeUtf8(member, 'ignore');\n }\n if (startsWith(data, MAGIC_GZIP)) {\n const decompressed = decompressGzipBounded(data, limit);\n limits.onDecompressed?.(decompressed.length);\n return decodeUtf8(decompressed, 'ignore');\n }\n if (\n startsWith(data, MAGIC_XML) ||\n startsWith(data, MAGIC_XML_TAG) ||\n startsWith(data, MAGIC_JSON)\n ) {\n return decodeUtf8(data, 'ignore');\n }\n throw new ParserError('Not a valid zip, gzip, json, or xml file');\n}\n\nfunction invalidArchive(error: unknown): ParserError {\n return new ParserError(\n `Invalid archive file: ${errorText(error)}${excOrigin(error)}`,\n { cause: error },\n );\n}\n\n/**\n * Extract report text from zip- or gzip-compressed content, or return\n * plain XML/JSON content decoded as-is. A string is first decoded as strict\n * base64; a string that is not valid base64 is returned unchanged.\n */\nexport function extractReport(\n content: string | Uint8Array | ArrayBuffer,\n options: ExtractOptions = {},\n): string {\n const limits: Limits = {\n limit: options.maxDecompressedSize ?? MAX_DECOMPRESSED_REPORT_SIZE,\n slowCodecLimit:\n options.maxSlowCodecSize ?? MAX_DECOMPRESSED_SLOW_CODEC_SIZE,\n onDecompressed: options.onDecompressed,\n };\n let data: Uint8Array;\n if (typeof content === 'string') {\n const decoded = strictBase64Decode(content.replaceAll(/[\\r\\n]/gu, ''));\n if (decoded === null) {\n return content;\n }\n data = decoded;\n } else {\n data = content instanceof Uint8Array ? content : new Uint8Array(content);\n }\n try {\n return extractFromBytes(data, limits);\n } catch (error) {\n throw invalidArchive(error);\n }\n}\n\nexport type ReportStream =\n | AsyncIterable<Uint8Array | string>\n | ReadableStream<Uint8Array>;\n\n/** Read a whole stream, failing as soon as it passes `limit` bytes. */\nasync function readBounded(\n stream: ReportStream,\n limit: number,\n): Promise<Buffer> {\n const chunks: Uint8Array[] = [];\n let size = 0;\n for await (const chunk of stream as AsyncIterable<Uint8Array | string>) {\n if (typeof chunk === 'string') {\n throw new ParserError('File objects must be opened in binary (rb) mode');\n }\n size += chunk.length;\n if (limit > 0 && size > limit) {\n throw new ParserError(`Report input exceeds the ${limit} byte limit`);\n }\n chunks.push(chunk);\n }\n return Buffer.concat(chunks);\n}\n\n/**\n * Read a whole stream and extract the report from it. A stream that yields\n * text instead of bytes is rejected, like a Python file opened in text mode.\n */\nexport async function extractReportFromStream(\n stream: ReportStream,\n options: ExtractOptions = {},\n): Promise<string> {\n let data: Buffer;\n try {\n data = await readBounded(\n stream,\n options.maxInputSize ?? MAX_DECOMPRESSED_REPORT_SIZE,\n );\n } catch (error) {\n throw invalidArchive(error);\n }\n return extractReport(data, options);\n}\n\n/** Extract the report from a file. */\nexport async function extractReportFromFilePath(\n filePath: string,\n options: ExtractOptions = {},\n): Promise<string> {\n let data: Uint8Array;\n try {\n data = await readBounded(\n createReadStream(filePath),\n options.maxInputSize ?? MAX_DECOMPRESSED_REPORT_SIZE,\n );\n } catch (error) {\n if ((error as { code?: string }).code === 'ENOENT') {\n throw new ParserError('File was not found', { cause: error });\n }\n throw error;\n }\n return extractReport(data, options);\n}\n","// Shared by every module that copies keys from untrusted data into objects.\n\n/**\n * Set `target[key]` as an own enumerable property. Plain assignment of a\n * key from untrusted data (`__proto__`) would change the prototype instead.\n */\nexport function setOwn(\n target: Record<string, unknown>,\n key: string,\n value: unknown,\n): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n}\n","// Key conversion between the camelCase API and the snake_case output format.\n//\n// parsedmarc's JSON/CSV/Elasticsearch/... output uses snake_case keys, and the\n// bundled dashboards query those names. tsdmarc's API uses camelCase, and\n// every output integration converts at the boundary with `toSnakeCaseKeys()`.\n//\n// Values under an \"opaque\" key are copied without converting their keys:\n// `headers` holds raw email header names (\"Received\", \"X-Mailer\") that are\n// data, not field names.\n//\n// Report parsers also pass reporter data through untouched where parsedmarc\n// does (an override reason dict, an `<identifiers>` child parsedmarc doesn't\n// know, an SMTP TLS `contact-info` object). Such values are branded with\n// `markRaw()` and objects mixing known fields with raw keys are built with\n// `mixedObject()`, so the conversion never renames keys that are data\n// (`<toString>` stays `toString`, `<envelopeFrom>` doesn't become\n// `envelope_from`). The brands are non-enumerable symbols: a structured\n// clone (worker_threads) drops them, so `parallel.ts` carries them across\n// with `getRawMarks()`/`restoreRawMarks()`.\n\nimport { setOwn } from './internal/set-own';\n\nconst UPPERCASE_LETTER = /[A-Z]/gu;\nconst UNDERSCORE_LETTER = /_([a-z])/gu;\n/** `ipAddress`, `sha256`: starts lowercase, letters and digits only. */\nconst CAMEL_KEY = /^[a-z][a-zA-Z0-9]*$/u;\n/** `ip_address`: lowercase words joined by `_`, each starting with a letter. */\nconst SNAKE_KEY = /^[a-z][a-z0-9]*(?:_[a-z][a-z0-9]*)+$/u;\n\nconst DEFAULT_OPAQUE_KEYS: ReadonlySet<string> = new Set(['headers']);\n\n/** Brand of a value that is report data: no key inside it is converted. */\nconst RAW = Symbol('tsdmarc.raw');\n/** On a mixed object: the own keys whose names and values are data. */\nconst RAW_KEYS = Symbol('tsdmarc.rawKeys');\n/**\n * On a mixed object: raw entries whose key collides with a known camelCase\n * field (`<envelopeFrom>` next to `envelope_from`). JS can't hold both under\n * one name, so they only appear in the converted (snake_case) output.\n */\nconst SHADOWED_RAW_ENTRIES = Symbol('tsdmarc.shadowedRawEntries');\n\ninterface Branded {\n [RAW]?: true;\n [RAW_KEYS]?: ReadonlySet<string>;\n [SHADOWED_RAW_ENTRIES]?: readonly (readonly [string, unknown])[];\n}\n\nfunction brand(\n target: object,\n symbol: typeof RAW | typeof RAW_KEYS | typeof SHADOWED_RAW_ENTRIES,\n value: unknown,\n): void {\n Object.defineProperty(target, symbol, { value, configurable: true });\n}\n\n/**\n * Mark a value taken verbatim from a report (parsed XML/JSON) so key\n * conversion copies it unchanged. Scalars are returned as they are.\n */\nexport function markRaw<T>(value: T): T {\n if (typeof value === 'object' && value !== null && !Object.isFrozen(value)) {\n brand(value, RAW, true);\n }\n return value;\n}\n\n/** One entry of {@link mixedObject}: a known field or a raw report key. */\nexport interface MixedEntry {\n key: string;\n value: unknown;\n /** True for a key from the report, kept verbatim (name and value). */\n raw: boolean;\n}\n\n/**\n * Build an object that holds known (camelCase) fields and raw report keys,\n * in output order. Key conversion renames only the known fields.\n */\nexport function mixedObject(\n entries: readonly MixedEntry[],\n): Record<string, unknown> {\n const known = new Set(entries.filter(e => !e.raw).map(e => e.key));\n const result: Record<string, unknown> = {};\n const rawKeys = new Set<string>();\n const shadowed: [string, unknown][] = [];\n for (const { key, value, raw } of entries) {\n if (!raw) {\n setOwn(result, key, value);\n } else if (known.has(key)) {\n shadowed.push([key, markRaw(value)]);\n } else {\n rawKeys.add(key);\n setOwn(result, key, markRaw(value));\n }\n }\n brand(result, RAW_KEYS, rawKeys);\n if (shadowed.length > 0) {\n brand(result, SHADOWED_RAW_ENTRIES, shadowed);\n }\n return result;\n}\n\n/** The raw-data brands of one object, in a structured-clone-safe form. */\nexport interface RawMarks {\n /** Branded by {@link markRaw}. */\n raw: boolean;\n /** The raw keys of a {@link mixedObject}, or null. */\n rawKeys: string[] | null;\n /** The shadowed raw entries of a {@link mixedObject}, or null. */\n shadowed: [string, unknown][] | null;\n}\n\n/** The brands on `value`, or null when it has none. */\nexport function getRawMarks(value: object): RawMarks | null {\n const branded = value as Branded;\n const raw = branded[RAW] === true;\n const rawKeys = branded[RAW_KEYS];\n const shadowed = branded[SHADOWED_RAW_ENTRIES];\n if (!raw && rawKeys === undefined && shadowed === undefined) {\n return null;\n }\n return {\n raw,\n rawKeys: rawKeys === undefined ? null : [...rawKeys],\n shadowed:\n shadowed === undefined\n ? null\n : shadowed.map(([key, child]) => [key, child]),\n };\n}\n\n/** Put back the brands read by {@link getRawMarks} (after a structured clone). */\nexport function restoreRawMarks(value: object, marks: RawMarks): void {\n if (marks.raw) {\n markRaw(value);\n }\n if (marks.rawKeys !== null) {\n brand(value, RAW_KEYS, new Set(marks.rawKeys));\n }\n if (marks.shadowed !== null) {\n brand(\n value,\n SHADOWED_RAW_ENTRIES,\n marks.shadowed.map(([key, child]) => [key, markRaw(child)] as const),\n );\n }\n}\n\n/**\n * Convert one camelCase key to snake_case (`ipAddress` → `ip_address`).\n * Keys that aren't plain camelCase (`x-mailer`, `@lang`, `Header_From`) are\n * data from the report and are returned unchanged.\n */\nexport function camelToSnake(key: string): string {\n if (!CAMEL_KEY.test(key)) {\n return key;\n }\n return key.replace(UPPERCASE_LETTER, letter => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Convert one snake_case key to camelCase (`ip_address` → `ipAddress`).\n * Keys that aren't plain snake_case are returned unchanged, so the two\n * functions are inverses for every key either produces.\n */\nexport function snakeToCamel(key: string): string {\n if (!SNAKE_KEY.test(key)) {\n return key;\n }\n return key.replace(UNDERSCORE_LETTER, (_match, letter: string) =>\n letter.toUpperCase(),\n );\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/** How a value is copied by {@link convertKeys}. */\nconst CONVERT = 0;\n/** Raw report data: copied without converting any key. */\nconst RAW_COPY = 1;\n/** Under an opaque key: a structured clone. */\nconst OPAQUE = 2;\ntype CopyMode = typeof CONVERT | typeof RAW_COPY | typeof OPAQUE;\n\n/** A child to copy: its key in the copy (null: appended to an array). */\ntype CopyEntry = readonly [key: string | null, child: unknown, mode: CopyMode];\n\n/** A container being filled, with the children still to copy into it. */\ninterface CopyFrame {\n target: Record<string, unknown> | unknown[];\n entries: readonly CopyEntry[];\n index: number;\n}\n\ninterface StartedCopy {\n copy: unknown;\n frame: CopyFrame | null;\n}\n\n/**\n * Start copying one value: scalars and other objects are copied (or kept)\n * at once; arrays and plain objects get an empty copy and a frame listing\n * the children to fill it with.\n */\nfunction startCopy(\n value: unknown,\n requestedMode: CopyMode,\n convert: (key: string) => string,\n opaqueKeys: ReadonlySet<string>,\n): StartedCopy {\n if (requestedMode === OPAQUE) {\n return { copy: structuredClone(value), frame: null };\n }\n let mode = requestedMode;\n let source = value;\n if (\n typeof source === 'object' &&\n source !== null &&\n (source as Branded)[RAW]\n ) {\n mode = RAW_COPY;\n }\n if (Array.isArray(source)) {\n const target: unknown[] = [];\n const entries = source.map(item => [null, item, mode] as const);\n return { copy: target, frame: { target, entries, index: 0 } };\n }\n if (mode === CONVERT && source instanceof Map) {\n source = Object.fromEntries(source);\n }\n if (!isPlainObject(source)) {\n return { copy: source, frame: null };\n }\n const target: Record<string, unknown> = {};\n const entries: CopyEntry[] = [];\n const rawKeys = mode === CONVERT ? (source as Branded)[RAW_KEYS] : undefined;\n for (const [key, child] of Object.entries(source)) {\n if (mode === RAW_COPY || rawKeys?.has(key)) {\n entries.push([key, child, RAW_COPY]);\n } else {\n entries.push([\n convert(key),\n child,\n opaqueKeys.has(key) ? OPAQUE : CONVERT,\n ]);\n }\n }\n if (mode === CONVERT) {\n for (const [key, child] of (source as Branded)[SHADOWED_RAW_ENTRIES] ??\n []) {\n entries.push([key, child, RAW_COPY]);\n }\n }\n return { copy: target, frame: { target, entries, index: 0 } };\n}\n\n/**\n * Deep-copy `value`, converting keys outside raw data. Iterative, so data\n * nested deeper than the call stack allows is still copied.\n */\nfunction convertKeys(\n value: unknown,\n convert: (key: string) => string,\n opaqueKeys: ReadonlySet<string>,\n): unknown {\n const root = startCopy(value, CONVERT, convert, opaqueKeys);\n const stack: CopyFrame[] = root.frame ? [root.frame] : [];\n let frame = stack.at(-1);\n while (frame) {\n const entry = frame.entries[frame.index];\n if (entry === undefined) {\n stack.pop();\n frame = stack.at(-1);\n continue;\n }\n frame.index += 1;\n const [key, child, mode] = entry;\n const started = startCopy(child, mode, convert, opaqueKeys);\n if (key === null) {\n (frame.target as unknown[]).push(started.copy);\n } else {\n // setOwn: a key from the data (an email header named `__proto__`)\n // must become an own property, not the prototype.\n setOwn(frame.target as Record<string, unknown>, key, started.copy);\n }\n if (started.frame) {\n stack.push(started.frame);\n frame = started.frame;\n }\n }\n return root.copy;\n}\n\n/**\n * Deep-copy `value`, converting every object key from camelCase to\n * snake_case, except inside values whose key is in `opaqueKeys`.\n */\nexport function toSnakeCaseKeys(\n value: unknown,\n opaqueKeys: ReadonlySet<string> = DEFAULT_OPAQUE_KEYS,\n): unknown {\n return convertKeys(value, camelToSnake, opaqueKeys);\n}\n\n/**\n * Deep-copy `value`, converting every object key from snake_case to\n * camelCase, except inside values whose key is in `opaqueKeys`. The inverse of\n * {@link toSnakeCaseKeys}.\n */\nexport function toCamelCaseKeys(\n value: unknown,\n opaqueKeys: ReadonlySet<string> = DEFAULT_OPAQUE_KEYS,\n): unknown {\n return convertKeys(value, snakeToCamel, opaqueKeys);\n}\n\n/**\n * The deepest nesting of objects and arrays a parsed report may hold.\n * parsedmarc keeps some reporter elements verbatim (unknown `<identifiers>`\n * children, a dict-shaped field), so their nesting reaches the output;\n * `JSON.stringify()`, `structuredClone()` and SDK serializers recurse and\n * would overflow the call stack on deep enough data. libxml2 (parsedmarc's\n * recovering parser) caps nesting at 256 elements; this allows at least that\n * much XML even when every level also adds a list of repeated elements.\n */\nexport const MAX_REPORT_DEPTH = 512;\n\n/** Whether `item` is an array or a plain object. */\nfunction isContainer(item: object): boolean {\n const prototype: unknown = Object.getPrototypeOf(item);\n return (\n Array.isArray(item) || prototype === Object.prototype || prototype === null\n );\n}\n\n/**\n * Whether arrays and plain objects in `value` nest deeper than `limit`. The\n * day buckets of a record share its objects, so each one is walked once per\n * depth it is reached at, not once per reference.\n */\nexport function nestsDeeperThan(value: unknown, limit: number): boolean {\n // Iterative: the value may be too deep for recursion.\n const pending: [unknown, number][] = [[value, 0]];\n const deepestWalk = new Map<object, number>();\n for (let next = pending.pop(); next; next = pending.pop()) {\n const [item, depth] = next;\n if (typeof item !== 'object' || item === null || !isContainer(item)) {\n continue;\n }\n if (depth >= limit) {\n return true;\n }\n if ((deepestWalk.get(item) ?? -1) >= depth) {\n continue;\n }\n deepestWalk.set(item, depth);\n for (const child of Object.values(item)) {\n pending.push([child, depth + 1]);\n }\n // Raw entries shadowed by a known field still reach the output.\n for (const [, child] of (item as Branded)[SHADOWED_RAW_ENTRIES] ?? []) {\n pending.push([child, depth + 1]);\n }\n }\n return false;\n}\n\n/** What {@link estimatedSize} charges for any value, besides its text. */\nconst VALUE_SIZE = 16;\n\n/**\n * Roughly how many characters `value` takes in the outputs: the length of\n * its strings and keys, and a fixed amount for each value. Every reference\n * counts, as every copy reaches the output.\n */\nexport function estimatedSize(value: unknown): number {\n // Iterative: the value may be too deep for recursion.\n const pending: unknown[] = [value];\n let size = 0;\n while (pending.length > 0) {\n const item = pending.pop();\n size += VALUE_SIZE;\n if (typeof item === 'string') {\n size += item.length;\n } else if (typeof item === 'object' && item !== null && isContainer(item)) {\n for (const [key, child] of Object.entries(item)) {\n size += key.length;\n pending.push(child);\n }\n for (const [key, child] of (item as Branded)[SHADOWED_RAW_ENTRIES] ??\n []) {\n size += key.length;\n pending.push(child);\n }\n }\n }\n return size;\n}\n","// Ports of CPython's `binascii` decoders (and `base64.b64decode`).\n//\n// Node's base64 decoder silently accepts what Python rejects (bad padding)\n// and the reverse, and has no quoted-printable or uuencode decoder. The\n// email code depends on Python's exact leniency, so the C loops are ported.\n\nimport { pyEncode, UnicodeEncodeError } from './py-codecs';\n\n/** Python's `binascii.Error` (a `ValueError`); `type(e).__name__` is `Error`. */\nexport class BinasciiError extends Error {\n override name = 'Error';\n}\n\nconst BYTE_VALUES = 256;\nconst BASE64_PAD = 0x3d;\nconst BASE64_ALPHABET =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nconst BASE64_TABLE: Uint8Array = (() => {\n const table = new Uint8Array(BYTE_VALUES).fill(0xff);\n for (let index = 0; index < BASE64_ALPHABET.length; index += 1) {\n table[BASE64_ALPHABET.charCodeAt(index)] = index;\n }\n return table;\n})();\n\nfunction toBytes(data: Uint8Array | string): Uint8Array {\n if (typeof data !== 'string') {\n return data;\n }\n try {\n return pyEncode(data, 'ascii');\n } catch (error) {\n if (error instanceof UnicodeEncodeError) {\n throw new BinasciiError(\n 'string argument should contain only ASCII characters',\n );\n }\n throw error;\n }\n}\n\nfunction lengthError(output: { readonly length: number }): BinasciiError {\n const count = Math.floor(output.length / 3) * 4 + 1;\n return new BinasciiError(\n `Invalid base64-encoded string: number of data characters (${count}) cannot be 1 more than a multiple of 4`,\n );\n}\n\n/**\n * `binascii.a2b_base64(data, strict_mode=strict)`, a port of CPython\n * 3.14's loop. Lenient mode skips every non-alphabet byte (padding\n * included); an incomplete final quad must be followed by enough `=`.\n * Output goes into a preallocated buffer: attachments are megabytes.\n */\nexport function a2bBase64(\n data: Uint8Array | string,\n strict = false,\n): Uint8Array {\n const input = toBytes(data);\n const output = new Uint8Array(Math.floor((input.length + 3) / 4) * 3);\n let length = 0;\n let quadPos = 0;\n let leftChar = 0;\n let pads = 0;\n for (let index = 0; index < input.length; index += 1) {\n const raw = input[index] as number;\n if (raw === BASE64_PAD) {\n pads += 1;\n if (quadPos >= 2 && quadPos + pads <= 4) {\n continue;\n }\n // RFC 4648 3.3: pad characters before the end MAY be ignored.\n if (!strict) {\n continue;\n }\n if (quadPos === 1) {\n break; // The length error below.\n }\n throw new BinasciiError(\n quadPos === 0 && index === 0\n ? 'Leading padding not allowed'\n : 'Excess padding not allowed',\n );\n }\n const value = BASE64_TABLE[raw] as number;\n if (value >= 64) {\n if (strict) {\n throw new BinasciiError('Only base64 data is allowed');\n }\n continue;\n }\n if (pads !== 0 && strict) {\n throw new BinasciiError(\n quadPos + pads === 4\n ? 'Excess data after padding'\n : 'Discontinuous padding not allowed',\n );\n }\n pads = 0;\n switch (quadPos) {\n case 0: {\n quadPos = 1;\n leftChar = value;\n break;\n }\n case 1: {\n quadPos = 2;\n output[length] = (leftChar << 2) | (value >> 4);\n length += 1;\n leftChar = value & 0x0f;\n break;\n }\n case 2: {\n quadPos = 3;\n output[length] = (leftChar << 4) | (value >> 2);\n length += 1;\n leftChar = value & 0x03;\n break;\n }\n default: {\n quadPos = 0;\n output[length] = (leftChar << 6) | value;\n length += 1;\n leftChar = 0;\n break;\n }\n }\n }\n if (quadPos === 1) {\n throw lengthError({ length });\n }\n if (quadPos !== 0 && quadPos + pads < 4) {\n throw new BinasciiError('Incorrect padding');\n }\n return output.slice(0, length);\n}\n\n/** `base64.b64decode(s, validate=validate)`. */\nexport function b64decode(\n data: Uint8Array | string,\n validate = false,\n): Uint8Array {\n if (typeof data === 'string') {\n try {\n return a2bBase64(pyEncode(data, 'ascii'), validate);\n } catch (error) {\n if (error instanceof UnicodeEncodeError) {\n throw new TypeError(\n 'string argument should contain only ASCII characters',\n );\n }\n throw error;\n }\n }\n return a2bBase64(data, validate);\n}\n\n/** `base64.b64encode(data).decode('ascii')`. */\nexport function b64encode(data: Uint8Array): string {\n return Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString(\n 'base64',\n );\n}\n\nfunction hexValue(byte: number | undefined): number {\n if (byte === undefined) {\n return -1;\n }\n if (byte >= 0x30 && byte <= 0x39) {\n return byte - 0x30;\n }\n if (byte >= 0x41 && byte <= 0x46) {\n return byte - 0x37;\n }\n if (byte >= 0x61 && byte <= 0x66) {\n return byte - 0x57;\n }\n return -1;\n}\n\n/** `binascii.a2b_qp(data, header=header)` (what `quopri.decodestring` uses). */\nexport function a2bQp(data: Uint8Array, header = false): Uint8Array {\n // Never longer than the input; indexed writes for large attachments.\n const output = new Uint8Array(data.length);\n let written = 0;\n let index = 0;\n while (index < data.length) {\n const byte = data[index] ?? 0;\n if (byte === 0x3d) {\n index += 1;\n if (index >= data.length) {\n break;\n }\n const next = data[index] ?? 0;\n if (next === 0x0a || next === 0x0d) {\n // Soft line break: skip to the end of the line.\n if (next !== 0x0a) {\n while (index < data.length && data[index] !== 0x0a) {\n index += 1;\n }\n }\n if (index < data.length) {\n index += 1;\n }\n } else if (next === 0x3d) {\n output[written] = 0x3d;\n written += 1;\n index += 1;\n } else {\n const high = hexValue(next);\n const low = hexValue(data[index + 1]);\n if (index + 1 < data.length && high >= 0 && low >= 0) {\n output[written] = (high << 4) | low;\n written += 1;\n index += 2;\n } else {\n output[written] = 0x3d;\n written += 1;\n }\n }\n } else if (header && byte === 0x5f) {\n output[written] = 0x20;\n written += 1;\n index += 1;\n } else {\n output[written] = byte;\n written += 1;\n index += 1;\n }\n }\n return output.slice(0, written);\n}\n\nconst UU_SPACE = 0x20;\nconst UU_BACKTICK = 0x60;\n\n/** `binascii.a2b_uu(line)`. */\nexport function a2bUu(line: Uint8Array): Uint8Array {\n if (line.length === 0) {\n throw new BinasciiError('Missing length byte');\n }\n let binLength = ((line[0] ?? 0) - UU_SPACE) & 0o77;\n const output: number[] = [];\n let leftChar = 0;\n let leftBits = 0;\n let position = 1;\n let remaining = line.length - 1;\n for (; binLength > 0; remaining -= 1, position += 1) {\n let value = remaining > 0 ? (line[position] ?? 0) : 0;\n if (value === 0x0a || value === 0x0d || remaining <= 0) {\n value = 0;\n } else {\n if (value < UU_SPACE || value > UU_SPACE + 64) {\n throw new BinasciiError('Illegal char');\n }\n value = (value - UU_SPACE) & 0o77;\n }\n leftChar = (leftChar << 6) | value;\n leftBits += 6;\n if (leftBits >= 8) {\n leftBits -= 8;\n output.push((leftChar >> leftBits) & 0xff);\n leftChar &= (1 << leftBits) - 1;\n binLength -= 1;\n }\n }\n while (remaining > 0) {\n const value = line[position] ?? 0;\n remaining -= 1;\n position += 1;\n if (\n value !== UU_SPACE &&\n value !== UU_BACKTICK &&\n value !== 0x0a &&\n value !== 0x0d\n ) {\n throw new BinasciiError('Trailing garbage');\n }\n }\n return Uint8Array.from(output);\n}\n","// Port of the message defects of Python's `email.errors`.\n//\n// The parser never throws on malformed input; it records defects on the\n// message instead. mail-parser reports each one as\n// `\"<ClassName>: <class docstring>\"`, so every class keeps both.\n\n/** Base class for a message defect (`email.errors.MessageDefect`). */\nexport class MessageDefect {\n /** Python's class docstring, as mail-parser prints it. */\n static readonly doc: string = 'Base class for a message defect.';\n readonly name: string = 'MessageDefect';\n readonly line: string | null;\n\n constructor(line: string | null = null) {\n this.line = line;\n }\n\n /** The docstring of this defect's class (`e.__doc__`). */\n get doc(): string {\n return (this.constructor as typeof MessageDefect).doc;\n }\n}\n\nexport class NoBoundaryInMultipartDefect extends MessageDefect {\n static override readonly doc: string =\n 'A message claimed to be a multipart but had no boundary parameter.';\n override readonly name: string = 'NoBoundaryInMultipartDefect';\n}\n\nexport class StartBoundaryNotFoundDefect extends MessageDefect {\n static override readonly doc: string =\n 'The claimed start boundary was never found.';\n override readonly name: string = 'StartBoundaryNotFoundDefect';\n}\n\nexport class CloseBoundaryNotFoundDefect extends MessageDefect {\n static override readonly doc: string =\n 'A start boundary was found, but not the corresponding close boundary.';\n override readonly name: string = 'CloseBoundaryNotFoundDefect';\n}\n\nexport class FirstHeaderLineIsContinuationDefect extends MessageDefect {\n static override readonly doc: string =\n 'A message had a continuation line as its first header line.';\n override readonly name: string = 'FirstHeaderLineIsContinuationDefect';\n}\n\nexport class MisplacedEnvelopeHeaderDefect extends MessageDefect {\n static override readonly doc: string =\n \"A 'Unix-from' header was found in the middle of a header block.\";\n override readonly name: string = 'MisplacedEnvelopeHeaderDefect';\n}\n\nexport class MissingHeaderBodySeparatorDefect extends MessageDefect {\n static override readonly doc: string =\n 'Found line with no leading whitespace and no colon before blank line.';\n override readonly name: string = 'MissingHeaderBodySeparatorDefect';\n}\n\nexport class MultipartInvariantViolationDefect extends MessageDefect {\n static override readonly doc: string =\n 'A message claimed to be a multipart but no subparts were found.';\n override readonly name: string = 'MultipartInvariantViolationDefect';\n}\n\nexport class InvalidMultipartContentTransferEncodingDefect extends MessageDefect {\n static override readonly doc: string =\n 'An invalid content transfer encoding was set on the multipart itself.';\n override readonly name: string =\n 'InvalidMultipartContentTransferEncodingDefect';\n}\n\nexport class InvalidBase64PaddingDefect extends MessageDefect {\n static override readonly doc: string =\n 'base64 encoded sequence had an incorrect length';\n override readonly name: string = 'InvalidBase64PaddingDefect';\n}\n\nexport class InvalidBase64CharactersDefect extends MessageDefect {\n static override readonly doc: string =\n 'base64 encoded sequence had characters not in base64 alphabet';\n override readonly name: string = 'InvalidBase64CharactersDefect';\n}\n\nexport class InvalidBase64LengthDefect extends MessageDefect {\n static override readonly doc: string =\n 'base64 encoded sequence had invalid length (1 mod 4)';\n override readonly name: string = 'InvalidBase64LengthDefect';\n}\n\nexport class InvalidHeaderDefect extends MessageDefect {\n static override readonly doc: string =\n 'Header is not valid, message gives details.';\n override readonly name: string = 'InvalidHeaderDefect';\n}\n\n/** Python's `email.errors.MessageError`, the base of the errors below. */\nexport class MessageError extends Error {\n override name = 'MessageError';\n}\n\n/** Python's `email.errors.HeaderWriteError`. */\nexport class HeaderWriteError extends MessageError {\n override name = 'HeaderWriteError';\n}\n\n/** Python's `email.errors.HeaderParseError`. */\nexport class HeaderParseError extends MessageError {\n override name = 'HeaderParseError';\n}\n\n/**\n * Python's `RecursionError`, raised by the feed parser when a message is\n * nested deeper than CPython's recursion limit lets `_parsegen` go.\n */\nexport class RecursionError extends Error {\n override name = 'RecursionError';\n\n constructor(message = 'maximum recursion depth exceeded') {\n super(message);\n }\n}\n","// Port of the parts of Python's `email.utils` and `email._parseaddr` that\n// mail-parser and parsedmarc use: quoting, RFC 2231 parameters and the\n// strict `getaddresses()`.\n\nimport { LookupError, pyDecode, pyEncode } from '../py-codecs';\nimport { pyStrip } from '../py-str';\nimport { RecursionError } from './errors';\n\n/** A parameter value as `Message.get_param()` returns it for RFC 2231. */\nexport type Rfc2231Value = readonly [\n charset: string | null,\n language: string | null,\n value: string,\n];\n\n/** A parameter value: plain text, or an RFC 2231 triple. */\nexport type ParamValue = string | Rfc2231Value;\n\n/** A `(realname, address)` pair. */\nexport type AddressPair = readonly [name: string, address: string];\n\n/** Python's `str.split(sep, maxsplit)`. */\nexport function pySplit(\n text: string,\n separator: string,\n maxsplit = -1,\n): string[] {\n const parts: string[] = [];\n const limit = maxsplit < 0 ? Number.POSITIVE_INFINITY : maxsplit;\n let start = 0;\n while (parts.length < limit) {\n const index = text.indexOf(separator, start);\n if (index === -1) {\n break;\n }\n parts.push(text.slice(start, index));\n start = index + separator.length;\n }\n parts.push(text.slice(start));\n return parts;\n}\n\n/** `email.utils.quote()`: escape backslashes and double quotes. */\nexport function quote(text: string): string {\n return text.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"');\n}\n\n/** `email.utils.unquote()`: remove surrounding quotes or angle brackets. */\nexport function unquote(text: string): string {\n if (text.length > 1) {\n if (text.startsWith('\"') && text.endsWith('\"')) {\n return text.slice(1, -1).replaceAll('\\\\\\\\', '\\\\').replaceAll('\\\\\"', '\"');\n }\n if (text.startsWith('<') && text.endsWith('>')) {\n return text.slice(1, -1);\n }\n }\n return text;\n}\n\n/** `email.utils.decode_rfc2231()`. */\nexport function decodeRfc2231(text: string): Rfc2231Value {\n const parts = pySplit(text, \"'\", 2);\n if (parts.length <= 2) {\n return [null, null, text];\n }\n return [parts[0] ?? '', parts[1] ?? '', parts[2] ?? ''];\n}\n\nconst RFC2231_CONTINUATION =\n /^(?<name>[A-Za-z0-9_]+)\\*(?:(?<num>[0-9]+)\\*?)?$/u;\nconst PERCENT_ESCAPE = /%([0-9a-fA-F]{2})/gu;\nconst LATIN1_MAX = 0xff;\n\n// `urllib.parse.unquote(s, encoding=\"latin-1\")`: %XX → the char U+00XX.\nfunction percentUnquoteLatin1(text: string): string {\n if (!text.includes('%')) {\n return text;\n }\n return text.replace(PERCENT_ESCAPE, (_match, hex: string) =>\n String.fromCharCode(Number.parseInt(hex, 16)),\n );\n}\n\ninterface Continuation {\n num: number | null;\n value: string;\n encoded: boolean;\n}\n\n/** `email.utils.decode_params()`. */\nexport function decodeParams(\n params: readonly (readonly [string, string])[],\n): [string, ParamValue][] {\n const first = params[0];\n const decoded: [string, ParamValue][] =\n first === undefined ? [] : [[first[0], first[1]]];\n const rfc2231 = new Map<string, Continuation[]>();\n for (const [rawName, rawValue] of params.slice(1)) {\n const encoded = rawName.endsWith('*');\n const value = unquote(rawValue);\n const match = RFC2231_CONTINUATION.exec(rawName);\n if (match?.groups === undefined) {\n decoded.push([rawName, `\"${quote(value)}\"`]);\n continue;\n }\n const name = match.groups.name ?? '';\n const num =\n match.groups.num === undefined ? null : Number(match.groups.num);\n const list = rfc2231.get(name) ?? [];\n list.push({ num, value, encoded });\n rfc2231.set(name, list);\n }\n for (const [name, list] of rfc2231) {\n const hasZero = list.some(item => item.num === 0);\n let continuations = hasZero\n ? list.filter(item => item.num !== null)\n : list.map(item => ({ ...item, num: item.num ?? 0 }));\n // Python's sort is stable, like Array.prototype.sort.\n continuations = continuations.toSorted(\n (a, b) => (a.num ?? 0) - (b.num ?? 0),\n );\n let extended = false;\n const pieces: string[] = [];\n for (const item of continuations) {\n if (item.encoded) {\n pieces.push(percentUnquoteLatin1(item.value));\n extended = true;\n } else {\n pieces.push(item.value);\n }\n }\n const value = quote(pieces.join(''));\n if (extended) {\n const [charset, language, text] = decodeRfc2231(value);\n decoded.push([name, [charset, language, `\"${text}\"`]]);\n } else {\n decoded.push([name, `\"${value}\"`]);\n }\n }\n return decoded;\n}\n\n/** `bytes(text, 'raw-unicode-escape')`. */\nexport function rawUnicodeEscape(text: string): Uint8Array {\n // Latin-1 text maps one character to one byte; `decode_header()` calls\n // this once per encoded word, so skip the codec lookup.\n const bytes = new Uint8Array(text.length);\n for (let index = 0; index < text.length; index += 1) {\n const code = text.charCodeAt(index);\n if (code > LATIN1_MAX) {\n return pyEncode(text, 'raw-unicode-escape');\n }\n bytes[index] = code;\n }\n return bytes;\n}\n\n/** `email.utils.collapse_rfc2231_value()`. */\nexport function collapseRfc2231Value(\n value: ParamValue,\n errors: 'replace' | 'strict' = 'replace',\n fallbackCharset = 'us-ascii',\n): string {\n if (typeof value === 'string') {\n return unquote(value);\n }\n const [charset, , text] = value;\n try {\n return pyDecode(rawUnicodeEscape(text), charset ?? fallbackCharset, errors);\n } catch (error) {\n if (error instanceof LookupError) {\n return unquote(text);\n }\n throw error;\n }\n}\n\nfunction* iterEscapedChars(addr: string): Generator<[number, string]> {\n let escape = false;\n let position = 0;\n for (let index = 0; index < addr.length; index += 1) {\n position = index;\n const char = addr.charAt(index);\n if (escape) {\n yield [index, `\\\\${char}`];\n escape = false;\n } else if (char === '\\\\') {\n escape = true;\n } else {\n yield [index, char];\n }\n }\n if (escape) {\n yield [position, '\\\\'];\n }\n}\n\nfunction stripQuotedRealnames(addr: string): string {\n if (!addr.includes('\"')) {\n return addr;\n }\n let start = 0;\n let openPos: number | null = null;\n const result: string[] = [];\n for (const [position, char] of iterEscapedChars(addr)) {\n if (char !== '\"') {\n continue;\n }\n if (openPos === null) {\n openPos = position;\n } else {\n if (start !== openPos) {\n result.push(addr.slice(start, openPos));\n }\n start = position + 1;\n openPos = null;\n }\n }\n if (start < addr.length) {\n result.push(addr.slice(start));\n }\n return result.join('');\n}\n\nfunction checkParenthesis(addr: string): boolean {\n let opens = 0;\n for (const [, char] of iterEscapedChars(stripQuotedRealnames(addr))) {\n if (char === '(') {\n opens += 1;\n } else if (char === ')') {\n opens -= 1;\n if (opens < 0) {\n return false;\n }\n }\n }\n return opens === 0;\n}\n\nconst SPECIALS = '()<>@,:;.\"[]';\nconst LWS = ' \\t';\nconst CR = '\\r\\n';\nconst FWS = LWS + CR;\nconst ATOM_ENDS = SPECIALS + LWS + CR;\nconst PHRASE_ENDS = ATOM_ENDS.replace('.', '');\n\n/**\n * Python frames of `AddrlistClass` that fit in CPython's default recursion\n * limit under `mailparser.parse_from_string()`: a group nests one\n * (`getaddress`), a comment two (`getcomment`, `getdelimited`). Measured\n * with Python 3.14: 491 nested comments fail, as here, and 979 nested groups\n * (982 here; Python's limit shifts with the frames below the deepest level).\n */\nconst ADDRLIST_MAX_FRAMES = 982;\n\n/** Port of `email._parseaddr.AddrlistClass`. */\nclass AddrlistParser {\n private pos = 0;\n private frames = 0;\n private commentlist: string[] = [];\n private readonly field: string;\n\n constructor(field: string) {\n this.field = field;\n }\n\n private char(): string {\n return this.field.charAt(this.pos);\n }\n\n private gotonext(): string {\n const wslist: string[] = [];\n while (this.pos < this.field.length) {\n const char = this.char();\n if (`${LWS}\\n\\r`.includes(char)) {\n if (!'\\n\\r'.includes(char)) {\n wslist.push(char);\n }\n this.pos += 1;\n } else if (char === '(') {\n this.commentlist.push(this.getcomment());\n } else {\n break;\n }\n }\n return wslist.join('');\n }\n\n private enter(frames: number): void {\n this.frames += frames;\n if (this.frames > ADDRLIST_MAX_FRAMES) {\n throw new RecursionError();\n }\n }\n\n getaddrlist(): AddressPair[] {\n const result: AddressPair[] = [];\n while (this.pos < this.field.length) {\n const before = result.length;\n this.getaddress(result);\n if (result.length === before) {\n result.push(['', '']);\n }\n }\n return result;\n }\n\n /**\n * Python returns a list that each enclosing group copies; appending to\n * `result` costs one push per address however deep the groups nest.\n */\n private getaddress(result: AddressPair[]): void {\n this.enter(1);\n this.commentlist = [];\n this.gotonext();\n const oldpos = this.pos;\n const oldcl = this.commentlist;\n const plist = this.getphraselist();\n this.gotonext();\n if (this.pos >= this.field.length) {\n if (plist.length > 0) {\n result.push([this.commentlist.join(' '), plist[0] ?? '']);\n }\n } else if ('.@'.includes(this.char())) {\n this.pos = oldpos;\n this.commentlist = oldcl;\n const addrspec = this.getaddrspec();\n result.push([this.commentlist.join(' '), addrspec]);\n } else if (this.char() === ':') {\n const fieldlen = this.field.length;\n this.pos += 1;\n while (this.pos < this.field.length) {\n this.gotonext();\n if (this.pos < fieldlen && this.char() === ';') {\n this.pos += 1;\n break;\n }\n this.getaddress(result);\n }\n } else if (this.char() === '<') {\n const routeaddr = this.getrouteaddr();\n if (this.commentlist.length > 0) {\n result.push([\n `${plist.join(' ')} (${this.commentlist.join(' ')})`,\n routeaddr,\n ]);\n } else {\n result.push([plist.join(' '), routeaddr]);\n }\n } else if (plist.length > 0) {\n result.push([this.commentlist.join(' '), plist[0] ?? '']);\n } else if (SPECIALS.includes(this.char())) {\n this.pos += 1;\n }\n this.gotonext();\n if (this.pos < this.field.length && this.char() === ',') {\n this.pos += 1;\n }\n this.frames -= 1;\n }\n\n private getrouteaddr(): string {\n if (this.char() !== '<') {\n return '';\n }\n let expectroute = false;\n this.pos += 1;\n this.gotonext();\n let adlist = '';\n while (this.pos < this.field.length) {\n if (expectroute) {\n this.getdomain();\n expectroute = false;\n } else if (this.char() === '>') {\n this.pos += 1;\n break;\n } else if (this.char() === '@') {\n this.pos += 1;\n expectroute = true;\n } else if (this.char() === ':') {\n this.pos += 1;\n } else {\n adlist = this.getaddrspec();\n this.pos += 1;\n break;\n }\n this.gotonext();\n }\n return adlist;\n }\n\n private getaddrspec(): string {\n const aslist: string[] = [];\n this.gotonext();\n while (this.pos < this.field.length) {\n let preserveWs = true;\n const char = this.char();\n if (char === '.') {\n if (aslist.length > 0 && pyStrip(aslist.at(-1) ?? '') === '') {\n aslist.pop();\n }\n aslist.push('.');\n this.pos += 1;\n preserveWs = false;\n } else if (char === '\"') {\n aslist.push(`\"${quote(this.getquote())}\"`);\n } else if (ATOM_ENDS.includes(char)) {\n if (aslist.length > 0 && pyStrip(aslist.at(-1) ?? '') === '') {\n aslist.pop();\n }\n break;\n } else {\n aslist.push(this.getatom());\n }\n const ws = this.gotonext();\n if (preserveWs && ws) {\n aslist.push(ws);\n }\n }\n if (this.pos >= this.field.length || this.char() !== '@') {\n return aslist.join('');\n }\n aslist.push('@');\n this.pos += 1;\n this.gotonext();\n const domain = this.getdomain();\n if (!domain) {\n return '';\n }\n return aslist.join('') + domain;\n }\n\n private getdomain(): string {\n const sdlist: string[] = [];\n while (this.pos < this.field.length) {\n const char = this.char();\n if (LWS.includes(char)) {\n this.pos += 1;\n } else if (char === '(') {\n this.commentlist.push(this.getcomment());\n } else if (char === '[') {\n sdlist.push(this.getdomainliteral());\n } else if (char === '.') {\n this.pos += 1;\n sdlist.push('.');\n } else if (char === '@') {\n return '';\n } else if (ATOM_ENDS.includes(char)) {\n break;\n } else {\n sdlist.push(this.getatom());\n }\n }\n return sdlist.join('');\n }\n\n private getdelimited(\n beginchar: string,\n endchars: string,\n allowcomments: boolean,\n ): string {\n if (this.char() !== beginchar) {\n return '';\n }\n // Appended, not joined: a rope, so that a comment does not copy the text\n // of the comments nested in it.\n let text = '';\n let quoted = false;\n this.pos += 1;\n while (this.pos < this.field.length) {\n const char = this.char();\n if (quoted) {\n text += char;\n quoted = false;\n } else if (endchars.includes(char)) {\n this.pos += 1;\n break;\n } else if (allowcomments && char === '(') {\n text += this.getcomment();\n continue;\n } else if (char === '\\\\') {\n quoted = true;\n } else {\n text += char;\n }\n this.pos += 1;\n }\n return text;\n }\n\n private getquote(): string {\n return this.getdelimited('\"', '\"\\r', false);\n }\n\n private getcomment(): string {\n this.enter(2);\n const comment = this.getdelimited('(', ')\\r', true);\n this.frames -= 2;\n return comment;\n }\n\n private getdomainliteral(): string {\n return `[${this.getdelimited('[', ']\\r', false)}]`;\n }\n\n private getatom(atomends: string = ATOM_ENDS): string {\n let atom = '';\n while (this.pos < this.field.length) {\n const char = this.char();\n if (atomends.includes(char)) {\n break;\n }\n atom += char;\n this.pos += 1;\n }\n return atom;\n }\n\n private getphraselist(): string[] {\n const plist: string[] = [];\n while (this.pos < this.field.length) {\n const char = this.char();\n if (FWS.includes(char)) {\n this.pos += 1;\n } else if (char === '\"') {\n plist.push(this.getquote());\n } else if (char === '(') {\n this.commentlist.push(this.getcomment());\n } else if (PHRASE_ENDS.includes(char)) {\n break;\n } else {\n plist.push(this.getatom(PHRASE_ENDS));\n }\n }\n return plist;\n }\n}\n\n/** `email._parseaddr.AddressList(field).addresslist`. */\nexport function addressList(field: string): AddressPair[] {\n if (!field) {\n return [];\n }\n return new AddrlistParser(field).getaddrlist();\n}\n\n/** `email.utils.getaddresses(fieldvalues, strict=True)`. */\nexport function getaddresses(fieldvalues: readonly string[]): AddressPair[] {\n const accepted = fieldvalues.map(value =>\n checkParenthesis(value) ? value : \"('', '')\",\n );\n const parsed = addressList(accepted.join(', ')).map((pair): AddressPair =>\n pair[1].includes('[') ? ['', ''] : pair,\n );\n let expected = 0;\n for (const value of accepted) {\n const stripped = stripQuotedRealnames(value);\n expected += 1 + (stripped.split(',').length - 1);\n }\n if (parsed.length !== expected) {\n return [['', '']];\n }\n return parsed;\n}\n","// What Python's `email` package does with surrogate-escaped bytes (a\n// message parsed with `message_from_bytes()`, as `mailbox.mbox.get_string()`\n// does): `email.charset.Charset`, `Message.set_payload(payload, charset)`,\n// `Message.set_param()`, the body encoders (`base64mime.body_encode`,\n// `quoprimime.body_encode`, `encoders.encode_7or8bit`) and compat32's\n// header sanitizing.\n\nimport { b64encode } from '../py-binascii';\nimport { lookupCodec, pyDecode, pyEncode } from '../py-codecs';\nimport { pySplitlines } from '../py-str';\nimport { type ParamValue, quote } from './utils';\n\n/** `email.charset.UNKNOWN8BIT`. */\nexport const UNKNOWN8BIT = 'unknown-8bit';\n\n/** Python's `email.errors.CharsetError`. */\nexport class CharsetError extends Error {\n override name = 'CharsetError';\n}\n\ntype Encoding = 'qp' | 'base64' | 'shortest' | null;\n\nconst CHARSETS: Readonly<Record<string, [Encoding, Encoding, string | null]>> =\n {\n 'iso-8859-1': ['qp', 'qp', null],\n 'iso-8859-2': ['qp', 'qp', null],\n 'iso-8859-3': ['qp', 'qp', null],\n 'iso-8859-4': ['qp', 'qp', null],\n 'iso-8859-9': ['qp', 'qp', null],\n 'iso-8859-10': ['qp', 'qp', null],\n 'iso-8859-13': ['qp', 'qp', null],\n 'iso-8859-14': ['qp', 'qp', null],\n 'iso-8859-15': ['qp', 'qp', null],\n 'iso-8859-16': ['qp', 'qp', null],\n 'windows-1252': ['qp', 'qp', null],\n viscii: ['qp', 'qp', null],\n 'us-ascii': [null, null, null],\n big5: ['base64', 'base64', null],\n gb2312: ['base64', 'base64', null],\n 'euc-jp': ['base64', null, 'iso-2022-jp'],\n shift_jis: ['base64', null, 'iso-2022-jp'],\n 'iso-2022-jp': ['base64', null, null],\n 'koi8-r': ['base64', 'base64', null],\n 'utf-8': ['shortest', 'base64', 'utf-8'],\n };\n\nconst ALIASES: Readonly<Record<string, string>> = {\n latin_1: 'iso-8859-1',\n 'latin-1': 'iso-8859-1',\n latin_2: 'iso-8859-2',\n 'latin-2': 'iso-8859-2',\n latin_3: 'iso-8859-3',\n 'latin-3': 'iso-8859-3',\n latin_4: 'iso-8859-4',\n 'latin-4': 'iso-8859-4',\n latin_5: 'iso-8859-9',\n 'latin-5': 'iso-8859-9',\n latin_6: 'iso-8859-10',\n 'latin-6': 'iso-8859-10',\n latin_7: 'iso-8859-13',\n 'latin-7': 'iso-8859-13',\n latin_8: 'iso-8859-14',\n 'latin-8': 'iso-8859-14',\n latin_9: 'iso-8859-15',\n 'latin-9': 'iso-8859-15',\n latin_10: 'iso-8859-16',\n 'latin-10': 'iso-8859-16',\n cp949: 'ks_c_5601-1987',\n euc_jp: 'euc-jp',\n euc_kr: 'euc-kr',\n ascii: 'us-ascii',\n};\n\nfunction lookup<T>(\n table: Readonly<Record<string, T>>,\n key: string,\n): T | undefined {\n return Object.hasOwn(table, key) ? table[key] : undefined;\n}\n\n// Codecs that don't write ASCII as ASCII.\nconst NOT_ASCII_COMPATIBLE =\n /^(?:utf_(?:16|32|7)|cp(?:037|273|424|500|875|1026|1140)|hz|iso2022_kr)/u;\n// ASCII plus surrogate-escaped bytes.\n// oxlint-disable-next-line no-control-regex -- every ASCII code point, controls included.\nconst ESCAPED_BYTES = /^[\\u0000-\\u007f\\udc80-\\udcff]*$/u;\n\n/**\n * `text.encode(encoding, errors)` for text decoded from bytes with\n * `surrogateescape`. The codec port only encodes a few codecs; for any\n * ASCII-compatible codec, such text encodes to its ASCII and escaped bytes.\n */\nexport function encodeEscapedText(\n text: string,\n encoding: string,\n errors: 'strict' | 'surrogateescape' = 'strict',\n): Uint8Array {\n const codec = lookupCodec(encoding);\n if (\n codec === 'utf_8' ||\n codec === 'ascii' ||\n codec === 'latin_1' ||\n NOT_ASCII_COMPATIBLE.test(codec) ||\n !ESCAPED_BYTES.test(text)\n ) {\n return pyEncode(text, encoding, errors);\n }\n if (errors === 'strict' && !isAscii(text)) {\n // Python: \"'<codec>' codec can't encode character ...: surrogates not allowed\".\n return pyEncode(text, 'ascii');\n }\n return pyEncode(text, 'ascii', 'surrogateescape');\n}\n\n/** Python's `email.utils._has_surrogates()`: lone surrogates in `text`. */\nexport function hasSurrogates(text: string): boolean {\n return !text.isWellFormed();\n}\n\n/** `email.charset.Charset` (the parts the generator uses). */\nexport class Charset {\n readonly inputCharset: string;\n readonly bodyEncoding: Encoding;\n readonly outputCharset: string;\n\n constructor(inputCharset: string) {\n for (let index = 0; index < inputCharset.length; index += 1) {\n if (inputCharset.charCodeAt(index) >= 0x80) {\n throw new CharsetError(inputCharset);\n }\n }\n const lower = inputCharset.toLowerCase();\n this.inputCharset = lookup(ALIASES, lower) ?? lower;\n const [, bodyEncoding, conversion] = lookup(\n CHARSETS,\n this.inputCharset,\n ) ?? ['shortest', 'base64', null];\n this.bodyEncoding = bodyEncoding;\n const output = conversion || this.inputCharset;\n this.outputCharset = lookup(ALIASES, output) ?? output;\n }\n\n /** `get_output_charset()`. */\n getOutputCharset(): string {\n return this.outputCharset || this.inputCharset;\n }\n\n /** `body_encode(string)`. */\n bodyEncode(input: string | Uint8Array): string {\n if (input.length === 0) {\n return '';\n }\n if (this.bodyEncoding === 'base64') {\n const bytes =\n typeof input === 'string'\n ? encodeEscapedText(input, this.outputCharset)\n : input;\n return base64BodyEncode(bytes);\n }\n if (this.bodyEncoding === 'qp') {\n const bytes =\n typeof input === 'string'\n ? encodeEscapedText(input, this.outputCharset)\n : input;\n return qpBodyEncode(pyDecode(bytes, 'latin-1'));\n }\n if (typeof input === 'string') {\n return pyDecode(encodeEscapedText(input, this.outputCharset), 'ascii');\n }\n // Python returns the bytes unchanged here; no caller passes bytes.\n return pyDecode(input, 'latin-1');\n }\n}\n\nconst BASE64_LINE_BYTES = 57;\n\n/** `email.base64mime.body_encode(s)`: 76-character lines, each ending in `\\n`. */\nexport function base64BodyEncode(bytes: Uint8Array): string {\n let encoded = '';\n for (let index = 0; index < bytes.length; index += BASE64_LINE_BYTES) {\n encoded += `${b64encode(bytes.subarray(index, index + BASE64_LINE_BYTES))}\\n`;\n }\n return encoded;\n}\n\nconst QP_BODY_SAFE = new Set(\n ' !\"#$%&\\'()*+,-./0123456789:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\t\\r\\n',\n);\n\nfunction qpQuote(char: string): string {\n return `=${char.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0')}`;\n}\n\nconst QP_MAX_LINE_LENGTH = 76;\n\n/** `email.quoprimime.body_encode(body)` with `maxlinelen=76`, `eol=\"\\n\"`. */\nexport function qpBodyEncode(body: string): string {\n if (body.length === 0) {\n return body;\n }\n let translated = '';\n for (const char of body) {\n translated +=\n char.charCodeAt(0) < 256 && !QP_BODY_SAFE.has(char)\n ? qpQuote(char)\n : char;\n }\n const softBreak = '=\\n';\n const maxLineLength1 = QP_MAX_LINE_LENGTH - 1;\n const encoded: string[] = [];\n for (const line of pySplitlines(translated)) {\n let start = 0;\n const lastStart = line.length - 1 - QP_MAX_LINE_LENGTH;\n while (start <= lastStart) {\n const stop = start + maxLineLength1;\n if (line[stop - 2] === '=') {\n encoded.push(line.slice(start, stop - 1));\n start = stop - 2;\n } else if (line[stop - 1] === '=') {\n encoded.push(line.slice(start, stop));\n start = stop - 1;\n } else {\n encoded.push(`${line.slice(start, stop)}=`);\n start = stop;\n }\n }\n const last = line.at(-1);\n if (last === ' ' || last === '\\t') {\n const room = start - lastStart;\n let quoted: string;\n if (room >= 3) {\n quoted = qpQuote(last);\n } else if (room === 2) {\n quoted = last + softBreak;\n } else {\n quoted = softBreak + qpQuote(last);\n }\n encoded.push(line.slice(start, -1) + quoted);\n } else {\n encoded.push(line.slice(start));\n }\n }\n const end = translated.at(-1);\n if (end === '\\r' || end === '\\n') {\n encoded.push('');\n }\n return encoded.join('\\n');\n}\n\nconst URL_ALWAYS_SAFE = new Set(\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-~',\n);\n\n/** `email.utils.encode_rfc2231(s, charset, language)`. */\nfunction encodeRfc2231(\n text: string,\n charset: string | null,\n language: string | null,\n): string {\n let quoted = '';\n for (const byte of pyEncode(text, charset || 'ascii')) {\n const char = String.fromCharCode(byte);\n quoted += URL_ALWAYS_SAFE.has(char)\n ? char\n : `%${byte.toString(16).toUpperCase().padStart(2, '0')}`;\n }\n if (charset === null && language === null) {\n return quoted;\n }\n return `${charset ?? 'None'}'${language ?? ''}'${quoted}`;\n}\n\nfunction isAscii(text: string): boolean {\n for (let index = 0; index < text.length; index += 1) {\n if (text.charCodeAt(index) >= 0x80) {\n return false;\n }\n }\n return true;\n}\n\n/** `email.message._formatparam(param, value, quote=True)`. */\nexport function formatParam(param: string, value: ParamValue | null): string {\n if (value === null || value.length === 0) {\n return param;\n }\n if (typeof value !== 'string') {\n const [charset, language, text] = value;\n return `${param}*=${encodeRfc2231(text, charset, language)}`;\n }\n if (!isAscii(value)) {\n return `${param}*=${encodeRfc2231(value, 'utf-8', '')}`;\n }\n return `${param}=\"${quote(value)}\"`;\n}\n\n/**\n * compat32's `header_fetch_parse()` as `str()` sees it: a value holding\n * surrogate-escaped bytes reads as those bytes decoded as ASCII with\n * replacement characters.\n */\nexport function sanitizeHeaderValue(value: string): string {\n if (!hasSurrogates(value)) {\n return value;\n }\n return pyDecode(\n pyEncode(value, 'ascii', 'surrogateescape'),\n 'ascii',\n 'replace',\n );\n}\n\n/** Python's `str(value, 'ascii')` on a non-bytes charset parameter. */\nexport function charsetName(value: ParamValue): string {\n if (typeof value !== 'string') {\n throw new TypeError(\n 'decoding to str: need a bytes-like object, tuple found',\n );\n }\n return value;\n}\n","// Port of Python's `email.header`: `decode_header()` (RFC 2047 encoded\n// words) and the `Header.encode()` folding that compat32 uses to write\n// headers back out.\n\nimport { a2bBase64, b64encode, BinasciiError } from '../py-binascii';\nimport { pyEncode, UnicodeEncodeError } from '../py-codecs';\nimport { pyIsSpace, pyLStrip, pyRepr, pySplitlines } from '../py-str';\nimport { hasSurrogates } from './charset';\nimport { HeaderParseError } from './errors';\nimport { rawUnicodeEscape } from './utils';\n\n/** One `(decoded, charset)` pair of `decode_header()`. */\nexport type DecodedHeaderChunk = readonly [\n data: Uint8Array | string,\n charset: string | null,\n];\n\nconst QP_HEADER_ESCAPE = /=[a-fA-F0-9]{2}/gu;\n\n// `email.header.ecre`:\n// =\\?(?P<charset>[^?]*?)\\?(?P<encoding>[qQbB])\\?(?P<encoded>.*?)\\?=\n// matched by hand rather than with a regular expression: a backtracking\n// engine retries the lazy `.*?` from every `=?`, which is quadratic on\n// values full of `=?` without a closing `?=`. Python's `[^?]` crosses\n// newlines and `.` does not (it does match `\\r`).\n\n/** `str.find()` for start positions that never decrease (amortised linear). */\nclass ForwardFinder {\n private readonly text: string;\n private readonly needle: string;\n private from = 0;\n private found = Number.NaN;\n\n constructor(text: string, needle: string) {\n this.text = text;\n this.needle = needle;\n }\n\n find(from: number): number {\n // Nothing starts in [this.from, this.found), so the cached answer\n // holds for any start between them.\n if (from >= this.from && (this.found === -1 || this.found >= from)) {\n return this.found;\n }\n this.from = from;\n this.found = this.text.indexOf(this.needle, from);\n return this.found;\n }\n}\n\n/** One `ecre` match. */\nexport interface EncodedWordMatch {\n start: number;\n end: number;\n charset: string;\n encoding: string;\n encoded: string;\n}\n\nconst ENCODINGS = 'qQbB';\n\n/**\n * Finds `ecre` matches like `ecre.search(text, pos)` with a `pos` that\n * never decreases, in linear time overall.\n */\nclass EncodedWordScanner {\n private readonly text: string;\n private readonly opener: ForwardFinder;\n private readonly question: ForwardFinder;\n private readonly closer: ForwardFinder;\n private readonly newline: ForwardFinder;\n\n constructor(text: string) {\n this.text = text;\n this.opener = new ForwardFinder(text, '=?');\n this.question = new ForwardFinder(text, '?');\n this.closer = new ForwardFinder(text, '?=');\n this.newline = new ForwardFinder(text, '\\n');\n }\n\n find(from: number): EncodedWordMatch | null {\n const { text } = this;\n let start = this.opener.find(from);\n while (start !== -1) {\n // The charset cannot hold `?`, so it ends at the first one.\n const question = this.question.find(start + 2);\n if (question === -1) {\n return null;\n }\n const encoding = text.charAt(question + 1);\n if (\n encoding !== '' &&\n ENCODINGS.includes(encoding) &&\n text.charAt(question + 2) === '?'\n ) {\n // The lazy `.*?` stops at the first `?=` unless a newline comes\n // first. Later starts only look further right, so without a `?=`\n // nothing can match.\n const close = this.closer.find(question + 3);\n if (close === -1) {\n return null;\n }\n const newline = this.newline.find(question + 3);\n if (newline === -1 || newline > close) {\n return {\n start,\n end: close + 2,\n charset: text.slice(start + 2, question),\n encoding,\n encoded: text.slice(question + 3, close),\n };\n }\n }\n start = this.opener.find(start + 1);\n }\n return null;\n }\n}\n\n/** `ecre.search(text) is not None`. */\nexport function hasEncodedWord(text: string): boolean {\n return new EncodedWordScanner(text).find(0) !== null;\n}\n\n/**\n * `ecre.split(text)`: the text before each match, then its charset,\n * encoding and encoded text, and the text after the last match.\n */\nexport function splitEncodedWords(text: string): string[] {\n const scanner = new EncodedWordScanner(text);\n const parts: string[] = [];\n let position = 0;\n let match = scanner.find(0);\n while (match !== null) {\n parts.push(\n text.slice(position, match.start),\n match.charset,\n match.encoding,\n match.encoded,\n );\n position = match.end;\n match = scanner.find(position);\n }\n parts.push(text.slice(position));\n return parts;\n}\n\nconst COLON = 0x3a;\nconst NEWLINE = 0x0a;\nconst SPACE = 0x20;\nconst TAB = 0x09;\n\n/**\n * `email.header._embedded_header.search(text)` (`\\n[^ \\t]+:`) as a linear\n * scan: a colon preceded by a newline and at least one character, none of\n * them a space or a tab (newlines and colons do count).\n */\nexport function hasEmbeddedHeader(text: string): boolean {\n let lastNewline = -1;\n let previousNewline = -1;\n let lastBlank = -1;\n for (let index = 0; index < text.length; index += 1) {\n const char = text.charCodeAt(index);\n if (char === COLON) {\n // The latest newline that leaves at least one character before the colon.\n const newline = lastNewline <= index - 2 ? lastNewline : previousNewline;\n if (newline !== -1 && newline > lastBlank) {\n return true;\n }\n } else if (char === NEWLINE) {\n previousNewline = lastNewline;\n lastNewline = index;\n } else if (char === SPACE || char === TAB) {\n lastBlank = index;\n }\n }\n return false;\n}\n\n/** `email.quoprimime.header_decode()`. */\nexport function quoprimimeHeaderDecode(text: string): string {\n return text\n .replaceAll('_', ' ')\n .replace(QP_HEADER_ESCAPE, match =>\n String.fromCharCode(Number.parseInt(match.slice(1), 16)),\n );\n}\n\n/** `email.base64mime.decode()`. */\nexport function base64mimeDecode(text: string): Uint8Array {\n if (!text) {\n return new Uint8Array();\n }\n return a2bBase64(rawUnicodeEscape(text));\n}\n\nfunction concatAll(chunks: readonly Uint8Array[]): Uint8Array {\n if (chunks.length === 1 && chunks[0] !== undefined) {\n return chunks[0];\n }\n let length = 0;\n for (const chunk of chunks) {\n length += chunk.length;\n }\n const output = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n output.set(chunk, offset);\n offset += chunk.length;\n }\n return output;\n}\n\nconst SPACE_BYTES = Uint8Array.of(0x20);\n\ninterface Word {\n text: string;\n encoding: 'q' | 'b' | null;\n charset: string | null;\n}\n\n/**\n * `email.header.decode_header()`: split a header value into decoded chunks.\n * Without encoded words it returns `[[header, null]]`; otherwise a list of\n * `[bytes, charset]`, where plain text is converted with\n * `raw-unicode-escape` exactly like Python.\n */\nexport function decodeHeader(header: string): DecodedHeaderChunk[] {\n if (!hasEncodedWord(header)) {\n return [[header, null]];\n }\n const words: Word[] = [];\n for (const line of pySplitlines(header)) {\n const parts = splitEncodedWords(line);\n // `parts` is text, then (charset, encoding, encoded, text) per match.\n for (let index = 0; index < parts.length; index += 4) {\n let unencoded = parts[index] ?? '';\n if (index === 0) {\n unencoded = pyLStrip(unencoded);\n }\n if (unencoded) {\n words.push({ text: unencoded, encoding: null, charset: null });\n }\n if (index + 1 < parts.length) {\n const charset = (parts[index + 1] ?? '').toLowerCase();\n const encoding = (parts[index + 2] ?? '').toLowerCase() as 'q' | 'b';\n const encoded = parts[index + 3] ?? '';\n words.push({ text: encoded, encoding, charset });\n }\n }\n }\n // Drop whitespace between two encoded words.\n // (Python collects the indexes and deletes them afterwards; deciding on\n // the original list and filtering is the same, without the quadratic\n // `del`.)\n const kept: Word[] = [];\n for (let index = 0; index < words.length; index += 1) {\n const word = words[index] as Word;\n const previous = words[index - 1];\n const next = words[index + 1];\n const dropped =\n previous !== undefined &&\n next !== undefined &&\n previous.encoding !== null &&\n next.encoding !== null &&\n pyIsSpace(word.text);\n if (!dropped) {\n kept.push(word);\n }\n }\n const decoded: [Uint8Array | string, string | null][] = [];\n for (const word of kept) {\n if (word.encoding === null) {\n decoded.push([word.text, word.charset]);\n } else if (word.encoding === 'q') {\n decoded.push([quoprimimeHeaderDecode(word.text), word.charset]);\n } else {\n let encoded = word.text;\n const padError = encoded.length % 4;\n if (padError) {\n encoded += '==='.slice(0, 4 - padError);\n }\n try {\n decoded.push([base64mimeDecode(encoded), word.charset]);\n } catch (error) {\n if (error instanceof BinasciiError) {\n throw new HeaderParseError('Base64 decoding error');\n }\n throw error;\n }\n }\n }\n // Runs of words with the same charset are joined (with a space between\n // unencoded ones); each run is concatenated once.\n const collapsed: [Uint8Array, string | null][] = [];\n let run: Uint8Array[] = [];\n let lastCharset: string | null = null;\n for (const [word, charset] of decoded) {\n const bytes = typeof word === 'string' ? rawUnicodeEscape(word) : word;\n if (run.length === 0) {\n run.push(bytes);\n lastCharset = charset;\n } else if (charset !== lastCharset) {\n collapsed.push([concatAll(run), lastCharset]);\n run = [bytes];\n lastCharset = charset;\n } else if (lastCharset === null) {\n run.push(SPACE_BYTES, bytes);\n } else {\n run.push(bytes);\n }\n }\n collapsed.push([concatAll(run), lastCharset]);\n return collapsed;\n}\n\n// ---------------------------------------------------------------------------\n// Header.encode(), as compat32's `_fold()` calls it from the generator:\n// `Header(value, header_name=name).encode(linesep='\\n', maxlinelen=0)`.\n//\n// With maxlinelen=0 the line limit is 1,000,000 characters, so the\n// splitting branch of `_ValueFormatter._append_chunk()` never runs for\n// real-world values and is not ported.\n\nconst QP_HEADER_SAFE = new Set(\n '-!*+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',\n);\n\nfunction qpHeaderLength(bytes: Uint8Array): number {\n let length = 0;\n for (const byte of bytes) {\n const char = String.fromCharCode(byte);\n length += QP_HEADER_SAFE.has(char) || byte === 0x20 ? 1 : 3;\n }\n return length;\n}\n\nfunction qpHeaderEncode(bytes: Uint8Array, charset: string): string {\n if (bytes.length === 0) {\n return '';\n }\n let encoded = '';\n for (const byte of bytes) {\n const char = String.fromCharCode(byte);\n if (byte === 0x20) {\n encoded += '_';\n } else if (QP_HEADER_SAFE.has(char)) {\n encoded += char;\n } else {\n encoded += `=${byte.toString(16).toUpperCase().padStart(2, '0')}`;\n }\n }\n return `=?${charset}?q?${encoded}?=`;\n}\n\nfunction base64HeaderLength(bytes: Uint8Array): number {\n const groups = Math.floor(bytes.length / 3);\n return groups * 4 + (bytes.length % 3 ? 4 : 0);\n}\n\nfunction base64HeaderEncode(bytes: Uint8Array, charset: string): string {\n if (bytes.length === 0) {\n return '';\n }\n return `=?${charset}?b?${b64encode(bytes)}?=`;\n}\n\nfunction shortestHeaderEncode(bytes: Uint8Array, charset: string): string {\n return base64HeaderLength(bytes) < qpHeaderLength(bytes)\n ? base64HeaderEncode(bytes, charset)\n : qpHeaderEncode(bytes, charset);\n}\n\n// `Charset('utf-8').header_encode_lines()` for a single line: SHORTEST of\n// base64 and Q, chosen on the whole string.\nfunction utf8HeaderEncode(text: string): string {\n return shortestHeaderEncode(pyEncode(text, 'utf-8'), 'utf-8');\n}\n\n// The same with `Charset('unknown-8bit')`, which compat32 uses for values\n// holding surrogate-escaped bytes: the bytes are written back as they were.\nfunction unknown8bitHeaderEncode(text: string): string {\n return shortestHeaderEncode(\n pyEncode(text, 'ascii', 'surrogateescape'),\n 'unknown-8bit',\n );\n}\n\ntype HeaderEncoder = (text: string) => string;\n\ntype Chunk = readonly [fws: string, text: string];\n\nclass Accumulator {\n parts: Chunk[] = [];\n initialSize: number;\n\n constructor(initialSize = 0) {\n this.initialSize = initialSize;\n }\n\n push(fws: string, text: string): void {\n this.parts.push([fws, text]);\n }\n\n pop(): Chunk {\n return this.parts.pop() ?? ['', ''];\n }\n\n get length(): number {\n let total = this.initialSize;\n for (const [fws, text] of this.parts) {\n total += fws.length + text.length;\n }\n return total;\n }\n\n toString(): string {\n return this.parts.map(([fws, text]) => fws + text).join('');\n }\n\n reset(): void {\n this.parts = [];\n this.initialSize = 0;\n }\n\n isOnlyWs(): boolean {\n return (\n this.initialSize === 0 &&\n (this.parts.length === 0 || pyIsSpace(this.toString()))\n );\n }\n}\n\nconst FWS_RUN_SPLIT = /([ \\t]+)/u;\n\nclass ValueFormatter {\n readonly lines: string[] = [];\n readonly current: Accumulator;\n\n constructor(headerLength: number) {\n this.current = new Accumulator(headerLength);\n }\n\n toString(linesep: string): string {\n this.newline();\n return this.lines.join(linesep);\n }\n\n newline(): void {\n const end = this.current.pop();\n if (end[0] !== ' ' || end[1] !== '') {\n this.current.push(end[0], end[1]);\n }\n if (this.current.length > 0) {\n if (this.current.isOnlyWs() && this.lines.length > 0) {\n this.lines[this.lines.length - 1] += this.current.toString();\n } else {\n this.lines.push(this.current.toString());\n }\n }\n this.current.reset();\n }\n\n addTransition(): void {\n this.current.push(' ', '');\n }\n\n /** `feed()`; `encoder` is `null` for us-ascii text (no encoded words). */\n feed(fws: string, text: string, encoder: HeaderEncoder | null): void {\n if (encoder === null) {\n const parts = (fws + text).split(FWS_RUN_SPLIT);\n if (parts[0]) {\n parts.unshift('');\n } else {\n parts.shift();\n }\n for (let index = 0; index + 1 < parts.length; index += 2) {\n this.current.push(parts[index] ?? '', parts[index + 1] ?? '');\n }\n return;\n }\n this.current.push(fws, encoder(text));\n }\n}\n\n/**\n * Fold one header for output like compat32's `policy.fold(name, value)`\n * with `max_line_length=0`, without the trailing line separator.\n */\nexport function encodeHeaderValue(\n name: string,\n value: string,\n linesep = '\\n',\n): string {\n // compat32 folds a value holding surrogate-escaped bytes as an\n // unknown-8bit Header; other non-ASCII text becomes UTF-8 encoded words.\n let encoder: HeaderEncoder | null = null;\n if (hasSurrogates(value)) {\n encoder = unknown8bitHeaderEncode;\n } else {\n try {\n pyEncode(value, 'ascii');\n } catch (error) {\n if (!(error instanceof UnicodeEncodeError)) {\n throw error;\n }\n encoder = utf8HeaderEncode;\n }\n }\n const formatter = new ValueFormatter(name.length + 2);\n // A single chunk: the transition logic between chunks never applies.\n const lines = pySplitlines(value);\n formatter.feed('', lines[0] ?? '', encoder);\n for (const line of lines.slice(1)) {\n formatter.newline();\n if (encoder === null) {\n const stripped = pyLStrip(line);\n formatter.feed(\n line.slice(0, line.length - stripped.length),\n stripped,\n encoder,\n );\n } else {\n formatter.feed(' ', ` ${pyLStrip(line)}`, encoder);\n }\n }\n if (lines.length > 1) {\n formatter.newline();\n }\n formatter.addTransition();\n const encoded = formatter.toString(linesep);\n if (hasEmbeddedHeader(encoded)) {\n throw new HeaderParseError(\n `header value appears to contain an embedded header: ${pyRepr(encoded)}`,\n );\n }\n return encoded;\n}\n","// Port of Python's `email.generator.Generator` as `Message.as_string()`\n// runs it: compat32, `mangle_from_=False`, `maxheaderlen=0`, `\\n` line\n// separators.\n\nimport { randomBytes } from 'node:crypto';\n\nimport { EmailTooLargeError } from '../../errors';\nimport { pyRepr } from '../py-str';\nimport { charsetName, hasSurrogates } from './charset';\nimport { HeaderWriteError } from './errors';\nimport { encodeHeaderValue } from './header';\nimport type { Message } from './message';\n\n/**\n * `Generator._munge_cte`: the Content-Transfer-Encoding and Content-Type a\n * text part's headers get after its 8-bit payload was re-encoded.\n */\ntype Munge = readonly [cte: string, contentType: string];\n\nconst NL = '\\n';\nconst CR_LINE_END = /\\r\\n?/gu;\nconst NEWLINE_WITHOUT_FWSP = /\\r\\n[^ \\t]|\\r[^ \\n\\t]|\\n[^ \\t]/u;\n// oxlint-disable-next-line no-control-regex -- the whole Latin-1 range\nconst BEYOND_LATIN_1 = /[^\\u0000-\\u00ff]/u;\n\n/**\n * Flattened text of messages already written, shared by the `asString()`\n * calls of one walk over a message tree. Without it, flattening the first\n * part of every multipart on the way down a deeply nested message rewrites\n * the same subtree again at every level.\n *\n * Python holds one flattened level at a time; this cache holds them all, and\n * reading a rope makes the engine keep a flat copy of it. So `maxTotal`\n * (`maxExpandedEmailSize`, 0 for no limit) bounds the text of all levels\n * together, size × depth, which the size of the email does not. Text with a\n * character outside Latin-1 takes two bytes per character in the engine,\n * so its characters count twice: the limit is on memory, not on a count\n * the sender can double by choosing the characters.\n */\nexport class FlattenCache {\n private readonly texts = new Map<Message, string>();\n private readonly maxTotal: number;\n private total = 0;\n\n constructor(maxTotal = 0) {\n this.maxTotal = maxTotal;\n }\n\n get(message: Message): string | undefined {\n return this.texts.get(message);\n }\n\n add(message: Message, text: string): void {\n this.total += BEYOND_LATIN_1.test(text) ? 2 * text.length : text.length;\n if (this.maxTotal > 0 && this.total > this.maxTotal) {\n throw new EmailTooLargeError(\n `Flattening the email's nested parts exceeds the ${this.maxTotal} character limit (max_expanded_email_size)`,\n );\n }\n this.texts.set(message, text);\n }\n\n /** Let go of a text no later `asString()` will ask for. */\n delete(message: Message): void {\n this.texts.delete(message);\n }\n}\n\n// Python joins `text.splitlines()` with NL, the last line only followed by\n// NL if not empty: the same as rewriting the other line endings.\nfunction writeLines(output: string[], text: string): void {\n if (!text) {\n return;\n }\n output.push(text.includes('\\r') ? text.replace(CR_LINE_END, NL) : text);\n}\n\nfunction writeHeaders(output: string[], message: Message): void {\n for (const [name, value] of message.rawItems()) {\n const folded = `${name}: ${encodeHeaderValue(name, value)}${NL}`;\n // compat32 sets verify_generated_headers.\n if (NEWLINE_WITHOUT_FWSP.test(folded.slice(0, -NL.length))) {\n throw new HeaderWriteError(\n `folded header contains newline: ${pyRepr(folded)}`,\n );\n }\n output.push(folded);\n }\n output.push(NL);\n}\n\nfunction handleText(output: string[], message: Message): Munge | null {\n let payload = message.getPayload();\n if (payload === null) {\n return null;\n }\n if (typeof payload !== 'string') {\n throw new TypeError('string payload expected: list');\n }\n let munge: Munge | null = null;\n // 8-bit text parsed from bytes is re-encoded with its declared charset.\n const raw = message.payload as string;\n const charset = hasSurrogates(raw) ? message.getParam('charset') : undefined;\n if (charset !== undefined) {\n const reencoded = message.copy();\n reencoded.delete('content-transfer-encoding');\n reencoded.setPayload(raw, charsetName(charset));\n payload = reencoded.getPayload() as string;\n munge = [\n reencoded.get('content-transfer-encoding') ?? '',\n reencoded.get('content-type') ?? '',\n ];\n }\n writeLines(output, payload);\n return munge;\n}\n\nfunction handleMultipart(\n output: string[],\n message: Message,\n cache: FlattenCache | null,\n): void {\n const subparts = message.getPayload();\n if (typeof subparts === 'string') {\n output.push(subparts);\n return;\n }\n const texts = (subparts ?? []).map(part => flatten(part, cache));\n let boundary = message.getBoundary();\n if (!boundary) {\n // Only `boundary=\"\"` gets here: Python makes up a random boundary and\n // writes it into the Content-Type header.\n boundary = makeBoundary(texts.join(NL));\n message.setBoundary(boundary);\n }\n if (message.preamble !== null) {\n writeLines(output, message.preamble);\n output.push(NL);\n }\n output.push(`--${boundary}${NL}`);\n const [first, ...rest] = texts;\n if (first !== undefined) {\n output.push(first);\n }\n for (const text of rest) {\n output.push(`${NL}--${boundary}${NL}`, text);\n }\n output.push(`${NL}--${boundary}--${NL}`);\n if (message.epilogue !== null) {\n writeLines(output, message.epilogue);\n }\n}\n\nconst REGEX_SPECIAL = /[.*+?^${}()|[\\]\\\\]/gu;\n// `sys.maxsize` on 64-bit CPython: `random.randrange(sys.maxsize)`.\nconst PY_MAXSIZE = 0x7f_ff_ff_ff_ff_ff_ff_ffn;\nconst BOUNDARY_TOKEN_DIGITS = 19;\n\n// `Generator._make_boundary()`. The token is a random integer below\n// `sys.maxsize` (more than `crypto.randomInt` can draw), zero-padded to 19\n// digits; Python's `^` and `$` (MULTILINE) only see `\\n` line ends.\nfunction makeBoundary(text: string): string {\n const token = randomBytes(8).readBigUInt64BE() % PY_MAXSIZE;\n const base = `${'='.repeat(15)}${String(token).padStart(BOUNDARY_TOKEN_DIGITS, '0')}==`;\n let candidate = base;\n for (let counter = 0; ; counter += 1) {\n const escaped = candidate.replace(REGEX_SPECIAL, '\\\\$&');\n const boundaryLine = new RegExp(\n String.raw`(?:^|\\n)--${escaped}(?:--)?\\r?(?=\\n|$)`,\n 'u',\n );\n if (!boundaryLine.test(text)) {\n return candidate;\n }\n candidate = `${base}.${counter}`;\n }\n}\n\nfunction handleDeliveryStatus(\n output: string[],\n message: Message,\n cache: FlattenCache | null,\n): void {\n const blocks: string[] = [];\n const payload = message.getPayload();\n for (const part of Array.isArray(payload) ? payload : []) {\n const text = flatten(part, cache);\n const lines = text.split(NL);\n blocks.push(lines.at(-1) === '' ? lines.slice(0, -1).join(NL) : text);\n }\n output.push(blocks.join(NL));\n}\n\nfunction handleMessage(\n output: string[],\n message: Message,\n cache: FlattenCache | null,\n): void {\n const { payload } = message;\n if (Array.isArray(payload)) {\n const first = payload[0];\n if (first === undefined) {\n throw new RangeError('list index out of range');\n }\n output.push(flatten(first, cache));\n } else if (payload !== null) {\n output.push(payload);\n }\n}\n\nfunction dispatch(\n output: string[],\n message: Message,\n cache: FlattenCache | null,\n): Munge | null {\n const main = message.getContentMaintype();\n const sub = message.getContentSubtype();\n if (main === 'multipart') {\n handleMultipart(output, message, cache);\n } else if (main === 'message' && sub === 'delivery-status') {\n handleDeliveryStatus(output, message, cache);\n } else if (main === 'message') {\n handleMessage(output, message, cache);\n } else {\n return handleText(output, message);\n }\n return null;\n}\n\n/** Flatten one message: headers, blank line, body. */\nfunction flatten(message: Message, cache: FlattenCache | null): string {\n const cached = cache?.get(message);\n if (cached !== undefined) {\n return cached;\n }\n const body: string[] = [];\n const munge = dispatch(body, message, cache);\n let headers = message;\n if (munge !== null) {\n headers = message.copy();\n if (headers.get('content-transfer-encoding') === undefined) {\n headers.set('Content-Transfer-Encoding', munge[0]);\n } else {\n headers.replaceHeader('content-transfer-encoding', munge[0]);\n }\n headers.replaceHeader('content-type', munge[1]);\n }\n const output: string[] = [];\n writeHeaders(output, headers);\n // The body is appended with `+`, not joined: engines keep the sub-parts'\n // text as shared pieces (ropes) instead of copying it at every level.\n let text = output.join('');\n for (const piece of body) {\n text += piece;\n }\n cache?.add(message, text);\n return text;\n}\n\n/**\n * `msg.as_string()` (compat32, no Unix From line). Calls that share a\n * `cache` reuse each other's flattened parts; only share it while the\n * messages are not modified.\n */\nexport function asString(\n message: Message,\n cache: FlattenCache | null = null,\n): string {\n return flatten(message, cache);\n}\n","// Port of Python's `email.message.Message` with the compat32 policy, as the\n// feed parser builds it from a `str` (no surrogate-escaped bytes).\n\nimport { KeyError } from '../../internal/py';\nimport { a2bBase64, a2bQp, a2bUu, BinasciiError } from '../py-binascii';\nimport { LookupError, pyDecode, pyEncode, UnicodeError } from '../py-codecs';\nimport { pyLStrip, pyRepr, pyRStrip, pyStrip } from '../py-str';\nimport {\n Charset,\n encodeEscapedText,\n formatParam,\n hasSurrogates,\n sanitizeHeaderValue,\n} from './charset';\nimport {\n InvalidBase64CharactersDefect,\n InvalidBase64LengthDefect,\n InvalidBase64PaddingDefect,\n HeaderParseError,\n type MessageDefect,\n} from './errors';\nimport { asString, type FlattenCache } from './generator';\nimport {\n collapseRfc2231Value,\n decodeParams,\n type ParamValue,\n type Rfc2231Value,\n rawUnicodeEscape,\n unquote,\n} from './utils';\n\n/** A message payload: text, sub-messages, or nothing yet. */\nexport type Payload = string | Message[] | null;\n\n/** `_splitparam()`: split `value; params` at the first semicolon. */\nfunction splitParam(param: string): [string, string | null] {\n const index = param.indexOf(';');\n if (index === -1) {\n return [pyStrip(param), null];\n }\n return [pyStrip(param.slice(0, index)), pyStrip(param.slice(index + 1))];\n}\n\n// Python's `str.count(sub, start, end)` with slice-index normalization.\nfunction pyCount(\n text: string,\n sub: string,\n start: number,\n end: number,\n): number {\n const length = text.length;\n const from =\n start < 0 ? Math.max(0, length + start) : Math.min(start, length);\n const to = end < 0 ? Math.max(0, length + end) : Math.min(end, length);\n if (to < from) {\n return 0;\n }\n const slice = text.slice(from, to);\n let count = 0;\n let index = slice.indexOf(sub);\n while (index !== -1) {\n count += 1;\n index = slice.indexOf(sub, index + sub.length);\n }\n return count;\n}\n\n// Python's `str.find(sub, start, end)` for a non-empty `sub`. The search\n// stops at `end`: `_parseparam()` is only linear if it does.\nfunction pyFind(\n text: string,\n sub: string,\n start: number,\n end = text.length,\n): number {\n const from = Math.max(0, start);\n if (end >= text.length) {\n return text.indexOf(sub, from);\n }\n if (end - from < sub.length) {\n return -1;\n }\n const index = text.slice(from, end).indexOf(sub);\n return index === -1 ? -1 : from + index;\n}\n\n/** `email.message._parseparam()`, quirks included. */\nexport function parseParam(value: string): string[] {\n const text = `;${value}`;\n const plist: string[] = [];\n let start = 0;\n while (pyFind(text, ';', start) === start) {\n start += 1;\n let end = pyFind(text, ';', start);\n let ind = start;\n let diff = 0;\n while (end > 0) {\n diff += pyCount(text, '\"', ind, end) - pyCount(text, '\\\\\"', ind, end);\n if (diff % 2 === 0) {\n break;\n }\n const next = pyFind(text, ';', end + 1);\n end = ind;\n ind = next;\n }\n if (end < 0) {\n end = text.length;\n }\n const equals = end >= start ? pyFind(text, '=', start, end) : -1;\n let field: string;\n if (equals === -1) {\n field = text.slice(start, end);\n } else {\n field = `${pyRStrip(text.slice(start, equals)).toLowerCase()}=${pyLStrip(text.slice(equals + 1, end))}`;\n }\n plist.push(pyStrip(field));\n start = end;\n }\n return plist;\n}\n\n// `str()` of an RFC 2231 `(charset, language, value)` tuple.\nfunction formatTuple(value: Rfc2231Value): string {\n const items = value.map(item => (item === null ? 'None' : pyRepr(item)));\n return `(${items.join(', ')})`;\n}\n\nfunction unquoteValue(value: ParamValue): ParamValue {\n if (typeof value === 'string') {\n return unquote(value);\n }\n return [value[0], value[1], unquote(value[2])];\n}\n\nfunction concatBytes(chunks: Uint8Array[]): Uint8Array {\n let length = 0;\n for (const chunk of chunks) {\n length += chunk.length;\n }\n const output = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n output.set(chunk, offset);\n offset += chunk.length;\n }\n return output;\n}\n\n// `b''.join(bytes.splitlines())`, in one copy: `bytes.splitlines()` splits\n// only on \\r, \\n and \\r\\n. A view per line would make a body of bare line\n// endings cost a hundred times its size.\nfunction removeLineEndings(bytes: Uint8Array): Uint8Array {\n const output = new Uint8Array(bytes.length);\n let length = 0;\n for (let index = 0; index < bytes.length; index += 1) {\n const byte = bytes[index] ?? 0;\n if (byte !== 0x0a && byte !== 0x0d) {\n output[length] = byte;\n length += 1;\n }\n }\n return output.subarray(0, length);\n}\n\n/**\n * `bytes.splitlines()`, one line at a time.\n * @yields {Uint8Array} Each line, without its line ending.\n */\nfunction* byteLines(bytes: Uint8Array): Generator<Uint8Array> {\n let start = 0;\n let index = 0;\n while (index < bytes.length) {\n const byte = bytes[index];\n if (byte === 0x0a || byte === 0x0d) {\n yield bytes.subarray(start, index);\n index += byte === 0x0d && bytes[index + 1] === 0x0a ? 2 : 1;\n start = index;\n } else {\n index += 1;\n }\n }\n if (start < bytes.length) {\n yield bytes.subarray(start);\n }\n}\n\nfunction tryB64(data: Uint8Array, strict: boolean): Uint8Array | null {\n try {\n return a2bBase64(data, strict);\n } catch (error) {\n if (error instanceof BinasciiError) {\n return null;\n }\n throw error;\n }\n}\n\n/** `email._encoded_words.decode_b()`. */\nexport function decodeB(encoded: Uint8Array): [Uint8Array, MessageDefect[]] {\n const padError = encoded.length % 4;\n const padding = new Uint8Array(padError ? 4 - padError : 0).fill(0x3d);\n const strict = tryB64(concatBytes([encoded, padding]), true);\n if (strict !== null) {\n return [strict, padError ? [new InvalidBase64PaddingDefect()] : []];\n }\n const lenient = tryB64(encoded, false);\n if (lenient !== null) {\n return [lenient, [new InvalidBase64CharactersDefect()]];\n }\n const padded = tryB64(\n concatBytes([encoded, Uint8Array.of(0x3d, 0x3d)]),\n false,\n );\n if (padded !== null) {\n return [\n padded,\n [new InvalidBase64CharactersDefect(), new InvalidBase64PaddingDefect()],\n ];\n }\n return [encoded, [new InvalidBase64LengthDefect()]];\n}\n\nfunction startsWithBytes(line: Uint8Array, prefix: string): boolean {\n if (line.length < prefix.length) {\n return false;\n }\n for (let index = 0; index < prefix.length; index += 1) {\n if (line[index] !== prefix.charCodeAt(index)) {\n return false;\n }\n }\n return true;\n}\n\nfunction bytesToLatin1(bytes: Uint8Array): string {\n let text = '';\n for (const byte of bytes) {\n text += String.fromCharCode(byte);\n }\n return text;\n}\n\n// What `int(mode, base=8)` accepts.\nconst OCTAL_INT =\n /^[ \\t\\n\\r\\f\\v]*[+-]?(?:0[oO]_?)?[0-7](?:_?[0-7])*[ \\t\\n\\r\\f\\v]*$/u;\nconst UU_STRIP = ' \\t\\r\\n\\f';\n\nfunction isUuBeginLine(line: Uint8Array): boolean {\n if (!startsWithBytes(line, 'begin ')) {\n return false;\n }\n const rest = bytesToLatin1(line.subarray(6));\n const space = rest.indexOf(' ');\n return OCTAL_INT.test(space === -1 ? rest : rest.slice(0, space));\n}\n\nfunction decodeUuLine(line: Uint8Array): Uint8Array {\n try {\n return a2bUu(line);\n } catch (error) {\n if (!(error instanceof BinasciiError)) {\n throw error;\n }\n const nbytes = Math.floor(((((line[0] ?? 0) - 32) & 63) * 4 + 5) / 3);\n return a2bUu(line.subarray(0, nbytes));\n }\n}\n\n/**\n * `email.message._decode_uu()`; throws `Error` on \"ValueError\". Real uuencode\n * shrinks by a quarter, but a line's length byte promises 45 bytes whatever\n * follows it, so a line of 2 bytes would decode to 45: output larger than the\n * input is refused like any other invalid input (not in Python).\n */\nfunction decodeUu(encoded: Uint8Array): Uint8Array {\n const lines = byteLines(encoded);\n let next = lines.next();\n while (!next.done && !isUuBeginLine(next.value)) {\n next = lines.next();\n }\n if (next.done) {\n throw new Error('`begin` line not found');\n }\n const output = new Uint8Array(encoded.length);\n let length = 0;\n for (next = lines.next(); !next.done; next = lines.next()) {\n const line = next.value;\n if (line.length === 0) {\n throw new Error('Truncated input');\n }\n if (pyStrip(bytesToLatin1(line), UU_STRIP) === 'end') {\n break;\n }\n const decoded = decodeUuLine(line);\n if (length + decoded.length > output.length) {\n throw new Error('Decoded uuencode is larger than its input');\n }\n output.set(decoded, length);\n length += decoded.length;\n }\n return output.subarray(0, length);\n}\n\n/** Python's `email.message.Message` (compat32). */\nexport class Message {\n /** `(name, value)` pairs in wire order (`_headers`). */\n headers: [string, string][] = [];\n unixfrom: string | null = null;\n /** `_payload`. */\n payload: Payload = null;\n preamble: string | null = null;\n epilogue: string | null = null;\n defects: MessageDefect[] = [];\n private defaultType = 'text/plain';\n\n /** `msg.as_string()`; see {@link FlattenCache} for `cache`. */\n asString(cache: FlattenCache | null = null): string {\n return asString(this, cache);\n }\n\n /** `str(msg)`. */\n toString(): string {\n return this.asString();\n }\n\n isMultipart(): boolean {\n return Array.isArray(this.payload);\n }\n\n attach(payload: Message): void {\n if (this.payload === null) {\n this.payload = [payload];\n } else if (Array.isArray(this.payload)) {\n this.payload.push(payload);\n } else {\n throw new TypeError(\n 'Attach is not valid on a message with a non-multipart payload',\n );\n }\n }\n\n /**\n * `get_payload()` (decode=False). Text holding surrogate-escaped bytes\n * reads as those bytes decoded with the content charset (default ASCII),\n * with replacement characters.\n */\n getPayload(): Payload {\n const { payload } = this;\n if (typeof payload !== 'string' || !hasSurrogates(payload)) {\n return payload;\n }\n let bpayload: Uint8Array;\n try {\n bpayload = pyEncode(payload, 'ascii', 'surrogateescape');\n } catch (error) {\n if (error instanceof UnicodeError) {\n return payload;\n }\n throw error;\n }\n try {\n return pyDecode(bpayload, this.getContentCharset() ?? 'ascii', 'replace');\n } catch (error) {\n if (error instanceof LookupError) {\n return pyDecode(bpayload, 'ascii', 'replace');\n }\n throw error;\n }\n }\n\n /**\n * `get_payload(decode=True)`: the payload with its\n * Content-Transfer-Encoding undone, or `null` for multipart messages.\n */\n getDecodedPayload(): Uint8Array | null {\n if (Array.isArray(this.payload)) {\n return null;\n }\n const payload = this.payload ?? '';\n const cte = pyStrip(\n this.get('content-transfer-encoding') ?? '',\n ).toLowerCase();\n let bpayload: Uint8Array;\n try {\n bpayload = pyEncode(payload, 'ascii', 'surrogateescape');\n } catch {\n bpayload = rawUnicodeEscape(payload);\n }\n if (cte === 'quoted-printable') {\n return a2bQp(bpayload);\n }\n if (cte === 'base64') {\n const [value, defects] = decodeB(removeLineEndings(bpayload));\n this.defects.push(...defects);\n return value;\n }\n if (\n cte === 'x-uuencode' ||\n cte === 'uuencode' ||\n cte === 'uue' ||\n cte === 'x-uue'\n ) {\n try {\n return decodeUu(bpayload);\n } catch {\n return bpayload;\n }\n }\n return bpayload;\n }\n\n /**\n * `set_payload(payload, charset=None)`. With a charset, the text is\n * encoded with it (surrogate-escaped bytes kept as-is) and\n * {@link setCharset} applies its body encoding.\n */\n setPayload(payload: string, charset: string | Charset | null = null): void {\n if (charset === null) {\n this.payload = payload;\n return;\n }\n const cs = charset instanceof Charset ? charset : new Charset(charset);\n this.payload = pyDecode(\n encodeEscapedText(payload, cs.outputCharset, 'surrogateescape'),\n 'ascii',\n 'surrogateescape',\n );\n this.setCharset(cs);\n }\n\n /** `set_charset(charset)` (the non-`None` case). */\n setCharset(charset: string | Charset): void {\n const cs = charset instanceof Charset ? charset : new Charset(charset);\n if (!this.has('MIME-Version')) {\n this.set('MIME-Version', '1.0');\n }\n if (this.has('Content-Type')) {\n this.setParam('charset', cs.getOutputCharset());\n } else {\n this.set(\n 'Content-Type',\n `text/plain; ${formatParam('charset', cs.getOutputCharset())}`,\n );\n }\n if (cs.inputCharset !== cs.getOutputCharset().toLowerCase()) {\n this.payload = cs.bodyEncode((this.payload as string | null) ?? '');\n }\n if (this.has('Content-Transfer-Encoding')) {\n return;\n }\n if (cs.bodyEncoding === 'qp' || cs.bodyEncoding === 'base64') {\n // Python calls the encoding name, fails with TypeError and encodes\n // the payload bytes itself.\n const text = (this.payload as string | null) ?? '';\n let payload: string | Uint8Array = text;\n if (text) {\n try {\n payload = pyEncode(text, 'ascii', 'surrogateescape');\n } catch (error) {\n if (!(error instanceof UnicodeError)) {\n throw error;\n }\n payload = encodeEscapedText(text, cs.outputCharset);\n }\n }\n this.payload = cs.bodyEncode(payload);\n this.set(\n 'Content-Transfer-Encoding',\n cs.bodyEncoding === 'qp' ? 'quoted-printable' : 'base64',\n );\n return;\n }\n // `encoders.encode_7or8bit`.\n const orig = this.getDecodedPayload();\n let cte = '7bit';\n if (orig !== null) {\n try {\n pyDecode(orig, 'ascii');\n } catch (error) {\n if (!(error instanceof UnicodeError)) {\n throw error;\n }\n cte = '8bit';\n }\n }\n this.set('Content-Transfer-Encoding', cte);\n }\n\n /** `set_param(param, value)` on Content-Type (requote, not replace). */\n setParam(param: string, value: string): void {\n const header = 'Content-Type';\n let ctype: string | undefined = this.has(header)\n ? this.get(header)\n : 'text/plain';\n if (this.getParam(param, header)) {\n ctype = '';\n for (const [oldParam, oldValue] of this.getParams(header) ?? []) {\n const appendParam =\n oldParam.toLowerCase() === param.toLowerCase()\n ? formatParam(param, value)\n : formatParam(oldParam, oldValue);\n ctype = ctype ? `${ctype}; ${appendParam}` : appendParam;\n }\n } else if (ctype) {\n ctype = `${ctype}; ${formatParam(param, value)}`;\n } else {\n ctype = formatParam(param, value);\n }\n if (ctype !== this.get(header)) {\n this.delete(header);\n this.set(header, ctype);\n }\n }\n\n /** `replace_header(name, value)`: the first match, keeping its position. */\n replaceHeader(name: string, value: string): void {\n const lower = name.toLowerCase();\n const index = this.headers.findIndex(\n ([key]) => key.toLowerCase() === lower,\n );\n if (index === -1) {\n throw new KeyError(lower);\n }\n this.headers[index] = [this.headers[index]?.[0] ?? name, value];\n }\n\n /** A copy whose headers can change without touching this message. */\n copy(): Message {\n const copy = Object.assign(\n Object.create(Object.getPrototypeOf(this) as object) as Message,\n this,\n );\n copy.headers = this.headers.map(([key, value]) => [key, value]);\n copy.defects = [...this.defects];\n return copy;\n }\n\n get length(): number {\n return this.headers.length;\n }\n\n has(name: string): boolean {\n const lower = name.toLowerCase();\n return this.headers.some(([key]) => key.toLowerCase() === lower);\n }\n\n keys(): string[] {\n return this.headers.map(([key]) => key);\n }\n\n // Header values holding surrogate-escaped bytes read as compat32's\n // unknown-8bit Header objects do under str() (see sanitizeHeaderValue).\n\n values(): string[] {\n return this.headers.map(([, value]) => sanitizeHeaderValue(value));\n }\n\n items(): [string, string][] {\n return this.headers.map(([key, value]) => [\n key,\n sanitizeHeaderValue(value),\n ]);\n }\n\n /** `raw_items()`: values as stored. */\n rawItems(): [string, string][] {\n return this.headers.map(([key, value]) => [key, value]);\n }\n\n get(name: string): string | undefined {\n const lower = name.toLowerCase();\n for (const [key, value] of this.headers) {\n if (key.toLowerCase() === lower) {\n return sanitizeHeaderValue(value);\n }\n }\n return undefined;\n }\n\n getAll(name: string): string[] | undefined {\n const lower = name.toLowerCase();\n const values = this.headers\n .filter(([key]) => key.toLowerCase() === lower)\n .map(([, value]) => sanitizeHeaderValue(value));\n return values.length > 0 ? values : undefined;\n }\n\n /** `msg[name] = value` (appends). */\n set(name: string, value: string): void {\n this.headers.push([name, value]);\n }\n\n /** `set_raw()`. */\n setRaw(name: string, value: string): void {\n this.headers.push([name, value]);\n }\n\n /** `del msg[name]`. */\n delete(name: string): void {\n const lower = name.toLowerCase();\n this.headers = this.headers.filter(([key]) => key.toLowerCase() !== lower);\n }\n\n getContentType(): string {\n const value = this.get('content-type');\n if (value === undefined) {\n return this.getDefaultType();\n }\n const ctype = splitParam(value)[0].toLowerCase();\n if (ctype.split('/').length !== 2) {\n return 'text/plain';\n }\n return ctype;\n }\n\n getContentMaintype(): string {\n return this.getContentType().split('/')[0] ?? '';\n }\n\n getContentSubtype(): string {\n return this.getContentType().split('/')[1] ?? '';\n }\n\n getDefaultType(): string {\n return this.defaultType;\n }\n\n setDefaultType(ctype: string): void {\n this.defaultType = ctype;\n }\n\n private getParamsPreserve(\n header: string,\n ): [string, ParamValue][] | undefined {\n const value = this.get(header);\n if (value === undefined) {\n return undefined;\n }\n const params: [string, string][] = [];\n for (const param of parseParam(value)) {\n const index = param.indexOf('=');\n if (index === -1) {\n params.push([pyStrip(param), '']);\n } else {\n params.push([\n pyStrip(param.slice(0, index)),\n pyStrip(param.slice(index + 1)),\n ]);\n }\n }\n return decodeParams(params);\n }\n\n /** `get_params(header=header)` (unquoted). */\n getParams(header = 'content-type'): [string, ParamValue][] | undefined {\n return this.getParamsPreserve(header)?.map(([key, value]) => [\n key,\n unquoteValue(value),\n ]);\n }\n\n /** `get_param(param, header=header)`; `undefined` when missing. */\n getParam(param: string, header = 'content-type'): ParamValue | undefined {\n if (!this.has(header)) {\n return undefined;\n }\n const lower = param.toLowerCase();\n for (const [key, value] of this.getParamsPreserve(header) ?? []) {\n if (key.toLowerCase() === lower) {\n return unquoteValue(value);\n }\n }\n return undefined;\n }\n\n /** `get_filename()`; `undefined` when there is none. */\n getFilename(): string | undefined {\n let filename = this.getParam('filename', 'content-disposition');\n if (filename === undefined) {\n filename = this.getParam('name', 'content-type');\n }\n if (filename === undefined) {\n return undefined;\n }\n return pyStrip(collapseRfc2231Value(filename));\n }\n\n /** `get_boundary()`; `undefined` when there is none. */\n getBoundary(): string | undefined {\n const boundary = this.getParam('boundary');\n if (boundary === undefined) {\n return undefined;\n }\n // RFC 2046: boundaries may begin but not end with whitespace.\n return pyRStrip(collapseRfc2231Value(boundary));\n }\n\n /** `set_boundary()`: rewrite the boundary of every Content-Type header. */\n setBoundary(boundary: string): void {\n const params = this.getParamsPreserve('content-type');\n if (params === undefined) {\n throw new HeaderParseError('No Content-Type header found');\n }\n let found = false;\n const newParams: [string, ParamValue][] = params.map(([key, value]) => {\n if (key.toLowerCase() === 'boundary') {\n found = true;\n return ['boundary', `\"${boundary}\"`];\n }\n return [key, value];\n });\n if (!found) {\n newParams.push(['boundary', `\"${boundary}\"`]);\n }\n const formatted = newParams\n .map(([key, value]) => {\n if (value === '') {\n return key;\n }\n return `${key}=${typeof value === 'string' ? value : formatTuple(value)}`;\n })\n .join('; ');\n this.headers = this.headers.map(([name, value]) =>\n name.toLowerCase() === 'content-type' ? [name, formatted] : [name, value],\n );\n }\n\n /** `get_content_charset()`; `undefined` when there is none. */\n getContentCharset(): string | undefined {\n const raw = this.getParam('charset');\n if (raw === undefined) {\n return undefined;\n }\n let charset: string;\n if (typeof raw === 'string') {\n charset = raw;\n } else {\n const pcharset = raw[0] || 'us-ascii';\n try {\n charset = pyDecode(rawUnicodeEscape(raw[2]), pcharset);\n } catch (error) {\n if (!(error instanceof LookupError || error instanceof UnicodeError)) {\n throw error;\n }\n charset = raw[2];\n }\n }\n for (let index = 0; index < charset.length; index += 1) {\n if (charset.charCodeAt(index) >= 0x80) {\n return undefined;\n }\n }\n return charset.toLowerCase();\n }\n\n /** `get_content_disposition()`; `undefined` when there is none. */\n getContentDisposition(): string | undefined {\n const value = this.get('content-disposition');\n if (value === undefined) {\n return undefined;\n }\n return splitParam(value)[0].toLowerCase();\n }\n\n /**\n * `walk()`: this message, then every subpart, depth first.\n * @yields {Message} Each message of the tree.\n */\n *walk(): Generator<Message> {\n yield this;\n // An explicit stack, not `yield* part.walk()`: each message would pass\n // through a generator per ancestor.\n const stack: { parts: Message[]; next: number }[] = [];\n if (Array.isArray(this.payload)) {\n stack.push({ parts: this.payload, next: 0 });\n }\n for (let top = stack.at(-1); top !== undefined; top = stack.at(-1)) {\n const part = top.parts[top.next];\n if (part === undefined) {\n stack.pop();\n continue;\n }\n top.next += 1;\n yield part;\n if (Array.isArray(part.payload)) {\n stack.push({ parts: part.payload, next: 0 });\n }\n }\n }\n}\n","// Masking of credentials in URLs before they reach a log line or an error\n// message (parsedmarc's `redact_url_credentials()` and its helpers).\n\nconst AUTHORITY_END = /[/?#]/u;\n/** Characters that can't come before the `://` of a scheme separator. */\nconst NOT_BEFORE_SCHEME_SEPARATOR = /[/?#@:]/u;\n\n/** Where the userinfo of one URL or host string is (see {@link findUrlUserinfo}). */\ninterface UrlUserinfo {\n /** Offset of the userinfo. */\n start: number;\n /** Offset of the `@` after it. */\n at: number;\n /**\n * Whether that `@` is inside the authority and no other `@` follows it,\n * so the userinfo can only be what precedes it.\n */\n inAuthority: boolean;\n}\n\n/**\n * Locates the userinfo of one URL or host string (parsedmarc's\n * `_find_url_userinfo()`), shared by {@link redactUrlCredentials} and\n * {@link urlSecrets} so the two can't disagree about where the credentials\n * are. String methods only: linear in the length of `value`, never throws.\n *\n * The authority starts after the first `://` when nothing before it could\n * end an authority (so a URL quoted in free text is found too), after a\n * leading `//`, or at offset 0 (a bare `user:secret@host:9200` host\n * entry). parsedmarc accepts a `:` before the `://`, so in\n * `user:p://w@host` it reads `w` as the userinfo and keeps `p`; here that\n * `://` is not a scheme separator.\n *\n * The `@` used is the last one of the whole value: a password may contain\n * `@`, and an unencoded `/`, `?` or `#` in it ends the authority early\n * (RFC 3986 section 3.2), as in `https://admin:p4ss/w0rd@host`. parsedmarc\n * uses the last `@` of the authority when there is one, so it keeps\n * `ss/word` of `https://user:p@ss/word@host` and the credentials in\n * `https://a:b@host/?redirect=https://u:p@evil`; here both are masked\n * through the last `@`.\n */\nfunction findUrlUserinfo(value: string): UrlUserinfo | null {\n let start = 0;\n const schemeEnd = value.indexOf('://');\n if (\n schemeEnd !== -1 &&\n !NOT_BEFORE_SCHEME_SEPARATOR.test(value.slice(0, schemeEnd))\n ) {\n start = schemeEnd + 3;\n } else if (value.startsWith('//')) {\n start = 2;\n }\n const at = value.lastIndexOf('@');\n if (at < start) {\n return null;\n }\n const delimiter = value.slice(start).search(AUTHORITY_END);\n const end = delimiter === -1 ? value.length : start + delimiter;\n return { start, at, inAuthority: at < end };\n}\n\nfunction redactOne(value: string): string {\n const found = findUrlUserinfo(value);\n if (found === null) {\n return value;\n }\n const { start, at, inAuthority } = found;\n if (!inAuthority) {\n // Which \"/\", \"?\" or \"#\" ended the authority is unknown, so mask\n // everything through the \"@\" rather than guess where the user name\n // stops.\n return `${value.slice(0, start)}***${value.slice(at)}`;\n }\n const userinfo = value.slice(start, at);\n const colon = userinfo.indexOf(':');\n const masked = colon === -1 ? '***' : `${userinfo.slice(0, colon)}:***`;\n return `${value.slice(0, start)}${masked}${value.slice(at)}`;\n}\n\n/**\n * Masks the credentials in a URL or host string so it is safe to log\n * (parsedmarc's `redact_url_credentials()`): the password, after the first\n * `:` of the userinfo, becomes `***` (`https://user:***@host:9200`), and a\n * userinfo without `:` (a bare token) is replaced whole\n * (`https://***@host`). When the last `@` is past the end of the authority\n * (a `/`, `?` or `#` in the password, or an `@` in the path or query),\n * everything from the start of the authority through that `@` is masked\n * (`https://admin:p4ss/w0rd@host:3100` becomes `https://***@host:3100`;\n * `https://host/path@file` becomes `https://***@file`).\n *\n * One URL per string: split a comma-separated list first, or pass an\n * array, which is masked element by element into a new array (non-string\n * items are kept). Never throws.\n */\nexport function redactUrlCredentials(value: string): string;\nexport function redactUrlCredentials<T>(value: readonly T[]): T[];\nexport function redactUrlCredentials(\n value: string | readonly unknown[],\n): string | unknown[] {\n if (typeof value === 'string') {\n return redactOne(value);\n }\n return value.map(item => (typeof item === 'string' ? redactOne(item) : item));\n}\n\n/**\n * The secret text in one URL or host string's userinfo (parsedmarc's\n * `_url_secrets()`): the userinfo after its first `:`, or all of it when\n * it has none, and, when that contains a `/`, `?` or `#`, also its text\n * before the first of them (URL parsers read it as the port and quote it\n * in their errors). Longest first; never empty strings.\n */\nexport function urlSecrets(value: string): string[] {\n const found = findUrlUserinfo(value);\n if (found === null) {\n return [];\n }\n const userinfo = value.slice(found.start, found.at);\n const colon = userinfo.indexOf(':');\n const secret = colon === -1 ? userinfo : userinfo.slice(colon + 1);\n const prefixEnd = secret.search(AUTHORITY_END);\n const prefix = prefixEnd === -1 ? secret : secret.slice(0, prefixEnd);\n return [...new Set([secret, prefix])].filter(text => text !== '');\n}\n\n/**\n * Masks the credentials of the configured nameserver URLs in free text\n * such as an error message (parsedmarc's `_mask_nameserver_secrets()`):\n * each entry is replaced by its masked form, and each of its\n * {@link urlSecrets} by `***` wherever it still appears. A short secret\n * masks every occurrence of that text. Never throws.\n */\nexport function maskNameserverSecrets(\n text: string,\n nameservers: readonly string[] | null | undefined,\n): string {\n let masked = text;\n for (const entry of nameservers ?? []) {\n masked = masked.replaceAll(entry, redactOne(entry));\n for (const secret of urlSecrets(entry)) {\n masked = masked.replaceAll(secret, '***');\n }\n }\n return masked;\n}\n","// Minimal HTTP GET over `fetch`, shaped like the parts of httpx parsedmarc\n// uses (`httpx.get`, `raise_for_status()`, `httpx.HTTPError`), so the\n// ported `except httpx.HTTPError` branches map to `instanceof HTTPError`.\n//\n// Differences from httpx, on purpose:\n// - Bodies are capped (`maxBytes`): every download is untrusted input.\n// - Error messages never include the query string, which may carry an API\n// token, or the password of a URL.\n// - `fetch` refuses credentials in a URL, and quotes the URL when it does:\n// they are sent as a Basic `Authorization` header, as httpx does.\n// - Proxies: Node's `fetch` honors HTTP_PROXY/HTTPS_PROXY/NO_PROXY only when\n// the process runs with NODE_USE_ENV_PROXY=1 (httpx honors them always).\n\nimport { STATUS_CODES } from 'node:http';\n\nimport { LookupError, lookupCodec, pyDecode } from './py-codecs';\nimport { Message } from './py-email/message';\nimport { redactUrlCredentials } from './redact';\n\n/** Base class of HTTP errors (httpx's `HTTPError`). */\nexport class HTTPError extends Error {\n override name = 'HTTPError';\n}\n\n/** The request could not be sent or the response could not be read (httpx's `TransportError`). */\nexport class TransportError extends HTTPError {\n override name = 'TransportError';\n}\n\n/** The request timed out (httpx's `TimeoutException`). */\nexport class TimeoutException extends TransportError {\n override name = 'TimeoutException';\n}\n\n/** The connection or the request failed before a response arrived (httpx's `ConnectError`). */\nexport class ConnectError extends TransportError {\n override name = 'ConnectError';\n}\n\n/** The response body could not be read (httpx's `ReadError`). */\nexport class ReadError extends TransportError {\n override name = 'ReadError';\n}\n\n/** The URL's scheme is missing or is not HTTP(S) (httpx's `UnsupportedProtocol`). */\nexport class UnsupportedProtocol extends TransportError {\n override name = 'UnsupportedProtocol';\n}\n\n/**\n * The URL could not be parsed (httpx's `InvalidURL`, which, like it, is\n * not an `HTTPError`). httpx quotes the rejected part, which can be part of\n * a password; the message here never quotes the URL.\n */\nexport class InvalidURL extends Error {\n override name = 'InvalidURL';\n}\n\n/** `raiseForStatus()` found a non-2xx status (httpx's `HTTPStatusError`). */\nexport class HTTPStatusError extends HTTPError {\n override name = 'HTTPStatusError';\n readonly status: number;\n /** The request URL, without its query string and with credentials masked. */\n readonly url: string;\n\n constructor(message: string, status: number, url: string = '') {\n super(message);\n this.status = status;\n this.url = url;\n }\n}\n\n/**\n * Describes an HTTP error for the log without leaking URL credentials\n * (parsedmarc's `_describe_http_error()`): a status error as\n * `HTTP <status> for url '<url>'`, an unparsable URL with a fixed message,\n * and any other error as `<type>: <message>`. parsedmarc's status line\n * keeps the query string, which this one drops.\n */\nexport function describeHttpError(error: HTTPError | InvalidURL): string {\n if (error instanceof InvalidURL) {\n return 'invalid URL (details withheld because they may include credentials)';\n }\n if (error instanceof HTTPStatusError) {\n return `HTTP ${error.status} for url '${error.url}'`;\n }\n return `${error.name}: ${error.message}`;\n}\n\n/** Default cap on downloaded bodies. */\nexport const DEFAULT_MAX_BODY_BYTES: number = 64 * 1024 * 1024;\n\nexport interface HttpGetOptions {\n headers?: Record<string, string>;\n /** Query parameters, appended to the URL. */\n params?: Record<string, string>;\n /** Timeout for the whole request, in seconds. */\n timeout: number;\n /** Largest body accepted, in bytes. */\n maxBytes?: number;\n}\n\n/** A fully read response. */\nexport interface HttpResponse {\n status: number;\n /** Whether the status is 2xx (httpx's `is_success`). */\n isSuccess: boolean;\n /** The URL, without its query string, with its password masked. */\n url: string;\n body: Uint8Array;\n /** The body decoded like httpx's `.text` (charset or UTF-8, errors replaced). */\n text: () => string;\n /** The body parsed as JSON; throws `SyntaxError` when it is not JSON. */\n json: () => unknown;\n /** Throw `HTTPStatusError` unless the status is 2xx. */\n raiseForStatus: () => void;\n}\n\nconst URL_QUERY_START = /[?#]/u;\nconst URL_SCHEME = /^[a-z][a-z0-9+.-]*:/iu;\nconst URL_IN_TEXT = /[a-z][a-z0-9+.-]*:\\/\\/[^\\s)]+/giu;\nconst PERCENT_ESCAPES = /(?:%[0-9a-f]{2})+/giu;\n\n/** A URL with its password masked and without query string or fragment, for messages. */\nexport function redactUrl(url: string): string {\n const masked = redactUrlCredentials(url);\n const end = masked.search(URL_QUERY_START);\n return end === -1 ? masked : masked.slice(0, end);\n}\n\n/** Python's `urllib.parse.unquote()`: bad escapes stay, bad UTF-8 is replaced. */\nfunction unquote(text: string): string {\n return text.replaceAll(PERCENT_ESCAPES, escapes =>\n Buffer.from(escapes.replaceAll('%', ''), 'hex').toString('utf8'),\n );\n}\n\n/**\n * `url` without its `user:password@`, and the `Authorization` header httpx\n * derives from them. A URL without credentials, or one that can't be\n * parsed, comes back unchanged.\n */\nexport function splitUrlCredentials(url: string): {\n url: string;\n authorization: string | null;\n} {\n if (!URL.canParse(url)) {\n return { url, authorization: null };\n }\n const parsed = new URL(url);\n if (parsed.username === '' && parsed.password === '') {\n return { url, authorization: null };\n }\n const credentials = `${unquote(parsed.username)}:${unquote(parsed.password)}`;\n parsed.username = '';\n parsed.password = '';\n return {\n url: parsed.href,\n authorization: `Basic ${Buffer.from(credentials).toString('base64')}`,\n };\n}\n\nfunction statusErrorType(status: number): string {\n if (status < 200) {\n return 'Informational response';\n }\n if (status < 400) {\n return 'Redirect response';\n }\n if (status < 500) {\n return 'Client error';\n }\n return 'Server error';\n}\n\nfunction transportError(\n error: unknown,\n ErrorType: typeof TransportError,\n): HTTPError {\n if (error instanceof HTTPError) {\n return error;\n }\n if (\n error instanceof Error &&\n (error.name === 'TimeoutError' || error.name === 'AbortError')\n ) {\n return new TimeoutException('timed out');\n }\n const cause = error instanceof Error ? error.cause : undefined;\n const message =\n cause instanceof Error\n ? cause.message\n : error instanceof Error\n ? error.message\n : String(error);\n // Some runtimes quote the request URL (Deno) or a redirect target.\n return new ErrorType(\n message.replaceAll(URL_IN_TEXT, quoted => redactUrl(quoted)),\n );\n}\n\nfunction bodyTooLarge(maxBytes: number): TransportError {\n return new TransportError(`Response body exceeds ${maxBytes} bytes`);\n}\n\n/** Read a response body, throwing `TransportError` past `maxBytes`. */\nexport async function readBody(\n response: Response,\n maxBytes: number,\n): Promise<Uint8Array> {\n const declared = Number(response.headers.get('content-length'));\n if (Number.isFinite(declared) && declared > maxBytes) {\n await response.body?.cancel();\n throw bodyTooLarge(maxBytes);\n }\n if (response.body === null) {\n return new Uint8Array();\n }\n // An explicit reader: cancelling the stream itself while an async\n // iterator holds its lock throws \"ReadableStream is locked\".\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n // oxlint-disable-next-line no-await-in-loop -- chunks arrive in order\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n total += value.length;\n if (total > maxBytes) {\n // oxlint-disable-next-line no-await-in-loop -- leaves the loop\n await reader.cancel();\n throw bodyTooLarge(maxBytes);\n }\n chunks.push(value);\n }\n // A view over the joined buffer: copying it again into a fresh\n // Uint8Array is very slow on Bun for large bodies.\n const joined = Buffer.concat(chunks, total);\n return new Uint8Array(joined.buffer, joined.byteOffset, joined.byteLength);\n}\n\n/** httpx's `_is_known_encoding`: only `LookupError` means unknown (a NUL raises). */\nfunction isKnownEncoding(encoding: string): boolean {\n try {\n lookupCodec(encoding);\n return true;\n } catch (error) {\n if (error instanceof LookupError) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * httpx's `Response.text`: the Content-Type charset when Python knows the\n * codec, else UTF-8, with errors replaced. Python's `utf-8` codec keeps a\n * byte order mark (as U+FEFF), unlike `TextDecoder`'s default.\n */\nexport function decodeResponseText(\n body: Uint8Array,\n contentType: string | null,\n): string {\n if (body.length === 0) {\n return '';\n }\n let encoding = 'utf-8';\n if (contentType !== null) {\n const message = new Message();\n message.set('content-type', contentType);\n const charset = message.getContentCharset();\n if (charset !== undefined && isKnownEncoding(charset)) {\n encoding = charset;\n }\n }\n return pyDecode(body, encoding, 'replace');\n}\n\n/** GET a URL, following redirects, and read the whole body. Throws `HTTPError` subclasses. */\nexport async function httpGet(\n url: string,\n options: HttpGetOptions,\n): Promise<HttpResponse> {\n if (!URL.canParse(url)) {\n if (URL_SCHEME.test(url)) {\n throw new InvalidURL('Invalid URL');\n }\n throw new UnsupportedProtocol(\n \"Request URL is missing an 'http://' or 'https://' protocol.\",\n );\n }\n const original = new URL(url);\n const { url: requestUrl, authorization } = splitUrlCredentials(url);\n const target = new URL(requestUrl);\n // Like httpx, only HTTP(S): fetch would also read data: URLs.\n if (target.protocol !== 'http:' && target.protocol !== 'https:') {\n throw new UnsupportedProtocol(\n `Request URL has an unsupported protocol '${target.protocol}//'.`,\n );\n }\n for (const [key, value] of Object.entries(options.params ?? {})) {\n target.searchParams.set(key, value);\n }\n let userinfo = '';\n if (authorization !== null) {\n userinfo = original.password\n ? `${original.username}:${original.password}@`\n : `${original.username}@`;\n }\n const shownUrl = redactUrlCredentials(\n `${target.protocol}//${userinfo}${target.host}${target.pathname}`,\n );\n const headers = { ...options.headers };\n if (authorization !== null) {\n headers.Authorization = authorization;\n }\n let response: Response;\n try {\n response = await fetch(target, {\n headers,\n redirect: 'follow',\n signal: AbortSignal.timeout(options.timeout * 1000),\n });\n } catch (error) {\n throw transportError(error, ConnectError);\n }\n const { status } = response;\n const contentType = response.headers.get('content-type');\n let body: Uint8Array;\n try {\n body = await readBody(response, options.maxBytes ?? DEFAULT_MAX_BODY_BYTES);\n } catch (error) {\n throw transportError(error, ReadError);\n }\n const isSuccess = status >= 200 && status < 300;\n return {\n status,\n isSuccess,\n url: shownUrl,\n body,\n text: () => decodeResponseText(body, contentType),\n json: (): unknown => JSON.parse(new TextDecoder('utf-8').decode(body)),\n raiseForStatus: () => {\n if (!isSuccess) {\n const reason = STATUS_CODES[status] ?? '';\n throw new HTTPStatusError(\n `${statusErrorType(status)} '${status} ${reason}' for url '${shownUrl}'\\n` +\n `For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${status}`,\n status,\n shownUrl,\n );\n }\n },\n };\n}\n","// Bundled data files (parsedmarc's `importlib.resources.files(...)`).\n//\n// The CSV/TXT maps ship in this package's `resources/` directory. This\n// module runs from `src/utils/` (tests) or from the bundled `dist/index.js`,\n// so the package root is found by walking up from this file until a\n// directory containing `resources/base_reverse_dns_map.csv` appears.\n//\n// The IPinfo Lite MMDB is large, so it lives in the optional\n// `@tsdmarc/ipinfo-lite` package and is found with a dynamic import.\n\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\n\nconst MARKER_FILE = path.join('resources', 'base_reverse_dns_map.csv');\n\nlet packageRoot: string | null = null;\n\n/** The tsdmarc package root (the directory holding `resources/`). */\nexport function getPackageRoot(): string {\n if (packageRoot !== null) {\n return packageRoot;\n }\n let directory = import.meta.dirname;\n for (;;) {\n if (existsSync(path.join(directory, MARKER_FILE))) {\n packageRoot = directory;\n return directory;\n }\n const parent = path.dirname(directory);\n if (parent === directory) {\n throw new Error(\n `Could not find the tsdmarc resources directory above ${import.meta.filename}`,\n );\n }\n directory = parent;\n }\n}\n\n/** Absolute path of a bundled resource file, e.g. `psl_overrides.txt`. */\nexport function getResourcePath(name: string): string {\n return path.join(getPackageRoot(), 'resources', name);\n}\n\nlet ipinfoLitePath: Promise<string | null> | null = null;\n\n/**\n * Path of the MMDB file shipped by `@tsdmarc/ipinfo-lite`, or `null` when\n * that optional package is not installed.\n */\nexport function getBundledIpDbPath(): Promise<string | null> {\n ipinfoLitePath ??= import('@tsdmarc/ipinfo-lite').then(\n (module: { ipinfoLiteDbPath: string }) => module.ipinfoLiteDbPath,\n () => null,\n );\n return ipinfoLitePath;\n}\n","// Base domains: the Public Suffix List plus parsedmarc's PSL overrides,\n// ported from parsedmarc/utils.py (`get_base_domain`, `load_psl_overrides`).\n//\n// parsedmarc uses `publicsuffixlist.PublicSuffixList()` with its defaults:\n// private domains included and unknown TLDs treated as public suffixes. tldts\n// supplies the list (with the same options); the label handling around it\n// follows publicsuffixlist's `privatesuffix()`, so inputs tldts would reject\n// as hostnames (IP addresses, empty labels, `host:port`) give the same\n// answer as in parsedmarc.\n\nimport { readFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\n\nimport { getPublicSuffix } from 'tldts';\n\nimport { USER_AGENT } from '../constants';\nimport { logger } from '../log';\nimport {\n describeHttpError,\n HTTPError,\n httpGet,\n InvalidURL,\n redactUrl,\n} from './http';\nimport { pySplitlines, pyStrip } from './py-str';\nimport { getResourcePath } from './resources';\n\nconst DEFAULT_PSL_OVERRIDES_URL =\n 'https://raw.githubusercontent.com/domainaware/parsedmarc/master/parsedmarc/resources/maps/psl_overrides.txt';\n\nconst DOWNLOAD_TIMEOUT_SECONDS = 60;\nconst MAX_OVERRIDES_BYTES = 16 * 1024 * 1024;\n\n/**\n * The module-level PSL overrides list (parsedmarc's `psl_overrides`).\n * `loadPslOverrides()` refills this same array in place, and\n * `getBaseDomain()` reads it on every call.\n */\nexport const pslOverrides: string[] = [];\n\nexport interface LoadPslOverridesOptions {\n /** Always use a local overrides file. */\n alwaysUseLocalFile?: boolean;\n /** Path to a local overrides file (default: the bundled `psl_overrides.txt`). */\n localFilePath?: string | null;\n /** URL to a PSL overrides file. */\n url?: string | null;\n /** Do not make online requests. */\n offline?: boolean;\n}\n\nfunction loadText(target: string[], text: string): void {\n for (const line of pySplitlines(text)) {\n const stripped = pyStrip(line);\n if (stripped) {\n target.push(stripped);\n }\n }\n}\n\n// One load at a time per set of options: concurrent callers share it.\nconst pslLoadsInFlight = new Map<string, Promise<string[]>>();\n\n/**\n * Loads the PSL overrides list from a URL or local file.\n *\n * Repopulates the module-level `pslOverrides` array in place, then returns\n * it. The URL is tried first; on failure (or when `offline` /\n * `alwaysUseLocalFile` is set) the local path is used, defaulting to the\n * bundled `psl_overrides.txt`.\n *\n * parsedmarc clears the list before downloading; here the new list is built\n * aside and swapped in at once, so lookups running during the download keep\n * seeing the previous overrides instead of an empty list.\n */\nexport function loadPslOverrides(\n options: LoadPslOverridesOptions = {},\n): Promise<string[]> {\n const key = JSON.stringify([\n options.url ?? null,\n options.localFilePath ?? null,\n options.offline ?? false,\n options.alwaysUseLocalFile ?? false,\n ]);\n const running = pslLoadsInFlight.get(key);\n if (running !== undefined) {\n return running;\n }\n const load = fetchPslOverrides(options).finally(() => {\n pslLoadsInFlight.delete(key);\n });\n pslLoadsInFlight.set(key, load);\n return load;\n}\n\nasync function fetchPslOverrides(\n options: LoadPslOverridesOptions,\n): Promise<string[]> {\n const url = options.url ?? DEFAULT_PSL_OVERRIDES_URL;\n const offline = options.offline ?? false;\n const alwaysUseLocalFile = options.alwaysUseLocalFile ?? false;\n\n const loaded: string[] = [];\n\n if (!(offline || alwaysUseLocalFile)) {\n try {\n logger.debug(`Trying to fetch PSL overrides from ${redactUrl(url)}...`);\n const response = await httpGet(url, {\n headers: { 'User-Agent': USER_AGENT },\n timeout: DOWNLOAD_TIMEOUT_SECONDS,\n maxBytes: MAX_OVERRIDES_BYTES,\n });\n response.raiseForStatus();\n loadText(loaded, response.text());\n } catch (error) {\n if (!(error instanceof HTTPError || error instanceof InvalidURL)) {\n throw error;\n }\n logger.warning(\n `Failed to fetch PSL overrides: ${describeHttpError(error)}`,\n );\n }\n }\n\n if (loaded.length === 0) {\n const path = options.localFilePath || getResourcePath('psl_overrides.txt');\n logger.info(`Loading PSL overrides from ${path}`);\n loadText(loaded, await readFile(path, 'utf8'));\n }\n\n // Swap synchronously: no await between emptying and refilling.\n pslOverrides.length = 0;\n for (const entry of loaded) {\n pslOverrides.push(entry);\n }\n return pslOverrides;\n}\n\n// Bootstrap with the bundled file at import time, with no network call.\n// parsedmarc does this synchronously on import, so getBaseDomain() works\n// before any loader runs.\nloadText(\n pslOverrides,\n readFileSync(getResourcePath('psl_overrides.txt'), 'utf8'),\n);\n\n// A label no PSL rule names, used to detect wildcard rules.\nconst WILDCARD_PROBE_LABEL = 'tsdmarc-wildcard-probe--';\n\nconst TLDTS_OPTIONS = {\n allowIcannDomains: true,\n allowPrivateDomains: true,\n detectIp: false,\n extractHostname: false,\n mixedInputs: false,\n validateHostname: false,\n} as const;\n\n/**\n * publicsuffixlist's `PublicSuffixList().privatesuffix(domain)`: the\n * shortest suffix assigned to an individual, or `null` when the domain is\n * malformed or is itself a public suffix.\n */\nexport function privateSuffix(domain: string): string | null {\n // Empty labels are not permitted, so a trailing dot is ignored.\n const trimmed = domain.endsWith('.') ? domain.slice(0, -1) : domain;\n const labels = trimmed.toLowerCase().split('.');\n if (labels.includes('')) {\n return null;\n }\n const joined = labels.join('.');\n const suffix = getPublicSuffix(joined, TLDTS_OPTIONS);\n // Unknown TLDs count as public suffixes (accept_unknown=True).\n let publicLength = suffix ? suffix.split('.').length : 1;\n // publicsuffixlist treats the parent of a wildcard rule as public too\n // (`*.example.com` makes `example.com` public, as the PSL test data\n // expects); tldts does not. A rule matching one label below the domain\n // reveals such a wildcard.\n const probe = getPublicSuffix(\n `${WILDCARD_PROBE_LABEL}.${joined}`,\n TLDTS_OPTIONS,\n );\n if (probe && probe.split('.').length === labels.length + 1) {\n publicLength = labels.length;\n }\n if (labels.length < publicLength + 1) {\n return null;\n }\n return labels.slice(-(publicLength + 1)).join('.');\n}\n\n/**\n * Gets the base domain name for the given domain.\n *\n * Results are based on the Public Suffix List and the overrides in\n * `psl_overrides.txt`. Returns `null` if a base domain cannot be determined.\n */\nexport function getBaseDomain(domain: string): string | null {\n const lowered = domain.toLowerCase();\n const publicSuffix = privateSuffix(lowered);\n for (const override of pslOverrides) {\n if (lowered.endsWith(override)) {\n return pyStrip(pyStrip(override, '.'), '-');\n }\n }\n return publicSuffix;\n}\n","// Python's `csv.reader` / `csv.DictReader` with the default `excel` dialect\n// (comma delimiter, `\"` quoting with doubled quotes, no escape character,\n// non-strict), used to read the reverse DNS map like parsedmarc does.\n//\n// A port of the state machine in CPython's Modules/_csv.c, fed the lines\n// `io.StringIO(text)` yields (split after each `\\n`, nothing translated),\n// so blank rows, bare `\\r`, unterminated quotes and errors match.\n\n/** Python's `_csv.Error`. */\nexport class CsvError extends Error {\n override name = 'Error';\n}\n\n/** `csv.field_size_limit()` default. */\nconst FIELD_SIZE_LIMIT = 131_072;\n\n// Parser states (a plain object: worker threads load this file with Node's\n// type stripping, which has no enums).\nconst ParserState = {\n StartRecord: 0,\n StartField: 1,\n InField: 2,\n InQuotedField: 3,\n QuoteInQuotedField: 4,\n EatCrnl: 5,\n} as const;\ntype ParserStateValue = (typeof ParserState)[keyof typeof ParserState];\n\nconst EOL = '';\nconst DELIMITER = ',';\nconst QUOTE = '\"';\n\nfunction isLineBreak(char: string): boolean {\n return char === '\\n' || char === '\\r';\n}\n\n/**\n * `io.StringIO(text)` lines: each ends after a `\\n`, the last may not.\n *\n * @yields {string} each line, with its `\\n`.\n */\nfunction* stringIoLines(text: string): Generator<string> {\n let start = 0;\n while (start < text.length) {\n const newline = text.indexOf('\\n', start);\n const end = newline === -1 ? text.length : newline + 1;\n yield text.slice(start, end);\n start = end;\n }\n}\n\nclass CsvParser {\n state: ParserStateValue = ParserState.StartRecord;\n fields: string[] = [];\n field = '';\n fieldLength = 0;\n\n reset(): void {\n this.state = ParserState.StartRecord;\n this.fields = [];\n this.field = '';\n this.fieldLength = 0;\n }\n\n saveField(): void {\n this.fields.push(this.field);\n this.field = '';\n this.fieldLength = 0;\n }\n\n addChar(char: string): void {\n if (this.fieldLength >= FIELD_SIZE_LIMIT) {\n throw new CsvError(`field larger than field limit (${FIELD_SIZE_LIMIT})`);\n }\n this.field += char;\n this.fieldLength += 1;\n }\n\n /** `parse_process_char()`; `EOL` marks the end of a line. */\n processChar(char: string): void {\n switch (this.state) {\n case ParserState.StartRecord: {\n if (char === EOL) {\n return; // Empty line: an empty row.\n }\n if (isLineBreak(char)) {\n this.state = ParserState.EatCrnl;\n return;\n }\n this.state = ParserState.StartField;\n this.startField(char);\n return;\n }\n case ParserState.StartField: {\n this.startField(char);\n return;\n }\n case ParserState.InField: {\n if (isLineBreak(char) || char === EOL) {\n this.saveField();\n this.state =\n char === EOL ? ParserState.StartRecord : ParserState.EatCrnl;\n } else if (char === DELIMITER) {\n this.saveField();\n this.state = ParserState.StartField;\n } else {\n this.addChar(char);\n }\n return;\n }\n case ParserState.InQuotedField: {\n if (char === EOL) {\n return;\n }\n if (char === QUOTE) {\n this.state = ParserState.QuoteInQuotedField;\n } else {\n this.addChar(char);\n }\n return;\n }\n case ParserState.QuoteInQuotedField: {\n if (char === QUOTE) {\n this.addChar(char);\n this.state = ParserState.InQuotedField;\n } else if (char === DELIMITER) {\n this.saveField();\n this.state = ParserState.StartField;\n } else if (isLineBreak(char) || char === EOL) {\n this.saveField();\n this.state =\n char === EOL ? ParserState.StartRecord : ParserState.EatCrnl;\n } else {\n // Not strict: text after the closing quote joins the field.\n this.addChar(char);\n this.state = ParserState.InField;\n }\n return;\n }\n case ParserState.EatCrnl: {\n if (char === EOL) {\n this.state = ParserState.StartRecord;\n } else if (!isLineBreak(char)) {\n throw new CsvError(\n \"new-line character seen in unquoted field - do you need to open the file with newline=''?\",\n );\n }\n return;\n }\n default: {\n throw new CsvError('unknown parser state');\n }\n }\n }\n\n private startField(char: string): void {\n if (isLineBreak(char) || char === EOL) {\n this.saveField();\n this.state = char === EOL ? ParserState.StartRecord : ParserState.EatCrnl;\n } else if (char === QUOTE) {\n this.state = ParserState.InQuotedField;\n } else if (char === DELIMITER) {\n this.saveField();\n } else {\n this.addChar(char);\n this.state = ParserState.InField;\n }\n }\n}\n\n/**\n * Rows of a CSV text, lazily, like `csv.reader(io.StringIO(text))`. Blank\n * lines give `[]`; malformed input throws {@link CsvError} when reached.\n *\n * @yields {string[]} the fields of each record.\n */\nexport function* iterCsvRows(text: string): Generator<string[]> {\n const parser = new CsvParser();\n const lines = stringIoLines(text);\n for (;;) {\n parser.reset();\n let ended = false;\n do {\n const next = lines.next();\n if (next.done === true) {\n ended = true;\n break;\n }\n for (const char of next.value) {\n parser.processChar(char);\n }\n parser.processChar(EOL);\n } while (parser.state !== ParserState.StartRecord);\n if (ended) {\n // End of data mid-record: non-strict csv keeps what it has.\n if (\n parser.fieldLength !== 0 ||\n parser.state === ParserState.InQuotedField\n ) {\n parser.saveField();\n yield parser.fields;\n }\n return;\n }\n yield parser.fields;\n }\n}\n\n/** Rows of a CSV text, like `list(csv.reader(io.StringIO(text)))`. */\nexport function readCsvRows(text: string): string[][] {\n return [...iterCsvRows(text)];\n}\n\n/** A `csv.DictReader` row: missing trailing fields are `null`; extra fields go under `null`. */\nexport type CsvDictRow = Map<string | null, string | string[] | null>;\n\n/**\n * Rows as dicts keyed by the header row, lazily, like\n * `csv.DictReader(io.StringIO(text))`. The header is the first row even\n * when blank; later blank rows are skipped.\n *\n * @yields {CsvDictRow} each non-blank record after the header.\n */\nexport function* readCsvDicts(text: string): Generator<CsvDictRow> {\n const rows = iterCsvRows(text);\n const header = rows.next();\n if (header.done === true) {\n return;\n }\n const fieldnames = header.value;\n for (const row of rows) {\n if (row.length === 0) {\n continue;\n }\n const dict: CsvDictRow = new Map();\n for (const [position, value] of row.entries()) {\n if (position >= fieldnames.length) {\n break;\n }\n dict.set(fieldnames[position] as string, value);\n }\n if (row.length > fieldnames.length) {\n dict.set(null, row.slice(fieldnames.length));\n } else {\n for (const name of fieldnames.slice(row.length)) {\n dict.set(name, null);\n }\n }\n yield dict;\n }\n}\n","// DNS errors, ported from dnspython's `dns.exception` and `dns.resolver`.\n//\n// parsedmarc lets dnspython's exceptions reach its callers (`query_dns()`\n// raises them, `get_reverse_dns()` swallows every `DNSException`), so the\n// port keeps the same hierarchy and message text:\n//\n// DNSException\n// ├─ DNSTimeout\n// │ └─ LifetimeTimeout\n// ├─ DNSFormError\n// │ ├─ BadResponse\n// │ └─ NameTooLong\n// ├─ DNSSyntaxError\n// │ ├─ EmptyLabel\n// │ └─ LabelTooLong\n// ├─ NXDOMAIN\n// ├─ YXDOMAIN\n// ├─ NoAnswer\n// ├─ NoNameservers\n// ├─ NoMetaqueries\n// └─ UnknownRdatatype\n\n/** Base class of every DNS error (dnspython's `dns.exception.DNSException`). */\nexport class DNSException extends Error {\n override name = 'DNSException';\n}\n\n/** The DNS operation timed out (`dns.exception.Timeout`). */\nexport class DNSTimeout extends DNSException {\n override name = 'DNSTimeout';\n\n /** Seconds waited, when known. */\n readonly timeout: number | null;\n\n constructor(timeout: number | null = null) {\n super(\n timeout === null\n ? 'The DNS operation timed out.'\n : `The DNS operation timed out after ${timeout.toFixed(3)} seconds`,\n );\n this.timeout = timeout;\n }\n}\n\n/** One failed attempt against one nameserver during a resolution. */\nexport interface ResolutionError {\n /** The nameserver, as dnspython prints it (`Do53:1.1.1.1@53`, a URL, ...). */\n nameserver: string;\n /** Whether the attempt used TCP (or a stream transport). */\n tcp: boolean;\n port: number;\n /** The error raised, or the response code text (`SERVFAIL`). */\n error: unknown;\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction errorsToText(errors: readonly ResolutionError[]): string {\n return errors\n .map(\n entry => `Server ${entry.nameserver} answered ${errorText(entry.error)}`,\n )\n .join('; ');\n}\n\n/** The resolution lifetime expired (`dns.resolver.LifetimeTimeout`). */\nexport class LifetimeTimeout extends DNSTimeout {\n override name = 'LifetimeTimeout';\n readonly errors: readonly ResolutionError[];\n\n constructor(timeout: number, errors: readonly ResolutionError[]) {\n super(timeout);\n this.message = `The resolution lifetime expired after ${timeout.toFixed(3)} seconds: ${errorsToText(errors)}`;\n this.errors = errors;\n }\n}\n\n/** DNS message is malformed (`dns.exception.FormError`). */\nexport class DNSFormError extends DNSException {\n override name = 'DNSFormError';\n\n constructor(message = 'DNS message is malformed.') {\n super(message);\n }\n}\n\n/** A DNS response does not respond to the question asked (`dns.query.BadResponse`). */\nexport class BadResponse extends DNSFormError {\n override name = 'BadResponse';\n\n constructor(\n message = 'A DNS query response does not respond to the question asked.',\n ) {\n super(message);\n }\n}\n\n/** Text input is malformed (`dns.exception.SyntaxError`). */\nexport class DNSSyntaxError extends DNSException {\n override name = 'DNSSyntaxError';\n\n constructor(message = 'Text input is malformed.') {\n super(message);\n }\n}\n\n/** An escaped code in a name is invalid (`dns.name.BadEscape`). */\nexport class BadEscape extends DNSSyntaxError {\n override name = 'BadEscape';\n\n constructor() {\n super('An escaped code in a text format of DNS name is invalid.');\n }\n}\n\n/** IDNA encoding failed (`dns.name.IDNAException`). */\nexport class IDNAException extends DNSException {\n override name = 'IDNAException';\n\n constructor(detail: string) {\n super(`IDNA processing exception: ${detail}`);\n }\n}\n\n/** A DNS label is empty (`dns.name.EmptyLabel`). */\nexport class EmptyLabel extends DNSSyntaxError {\n override name = 'EmptyLabel';\n\n constructor() {\n super('A DNS label is empty.');\n }\n}\n\n/** A DNS label is > 63 octets long (`dns.name.LabelTooLong`). */\nexport class LabelTooLong extends DNSSyntaxError {\n override name = 'LabelTooLong';\n\n constructor() {\n super('A DNS label is > 63 octets long.');\n }\n}\n\n/** A DNS name is > 255 octets long (`dns.name.NameTooLong`). */\nexport class NameTooLong extends DNSFormError {\n override name = 'NameTooLong';\n\n constructor() {\n super('A DNS name is > 255 octets long.');\n }\n}\n\n/** The DNS query name does not exist (`dns.resolver.NXDOMAIN`). */\nexport class NXDOMAIN extends DNSException {\n override name = 'NXDOMAIN';\n /** The names that were tried, in text form with the final dot. */\n readonly qnames: readonly string[];\n\n constructor(qnames: readonly string[]) {\n const prefix =\n qnames.length > 1\n ? 'None of DNS query names exist'\n : 'The DNS query name does not exist';\n super(`${prefix}: ${qnames.join(', ')}`);\n this.qnames = qnames;\n }\n}\n\n/** The DNS query name is too long after DNAME substitution (`dns.resolver.YXDOMAIN`). */\nexport class YXDOMAIN extends DNSException {\n override name = 'YXDOMAIN';\n\n constructor() {\n super('The DNS query name is too long after DNAME substitution.');\n }\n}\n\n/** The DNS response does not contain an answer to the question (`dns.resolver.NoAnswer`). */\nexport class NoAnswer extends DNSException {\n override name = 'NoAnswer';\n\n /** @param question The question as dnspython prints it (`example.com. IN TXT`). */\n constructor(question: string) {\n super(\n `The DNS response does not contain an answer to the question: ${question}`,\n );\n }\n}\n\n/** All nameservers failed to answer the query (`dns.resolver.NoNameservers`). */\nexport class NoNameservers extends DNSException {\n override name = 'NoNameservers';\n readonly errors: readonly ResolutionError[];\n\n /** @param question The question as dnspython prints it (`example.com. IN TXT`). */\n constructor(question: string, errors: readonly ResolutionError[]) {\n super(\n `All nameservers failed to answer the query ${question}: ${errorsToText(errors)}`,\n );\n this.errors = errors;\n }\n}\n\n/** DNS metaqueries are not allowed (`dns.resolver.NoMetaqueries`). */\nexport class NoMetaqueries extends DNSException {\n override name = 'NoMetaqueries';\n\n constructor() {\n super('DNS metaqueries are not allowed.');\n }\n}\n\n/** DNS resource record type is unknown (`dns.rdatatype.UnknownRdatatype`). */\nexport class UnknownRdatatype extends DNSException {\n override name = 'UnknownRdatatype';\n\n constructor(message = 'DNS resource record type is unknown.') {\n super(message);\n }\n}\n","// Generated by tools/fixtures/generate_idna.py from idna 3.20 (Unicode 18.0.0). Do not edit.\n//\n// RFC 5892 code point classes as flat [start, end) pairs.\n\n/** PVALID code points. */\nexport const IDNA_PVALID: readonly number[] = [\n 45, 46, 48, 58, 97, 123, 223, 247, 248, 256, 257, 258, 259, 260, 261, 262,\n 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277,\n 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292,\n 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309,\n 310, 311, 313, 314, 315, 316, 317, 318, 319, 322, 323, 324, 325, 326, 327,\n 328, 329, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343,\n 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358,\n 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373,\n 374, 375, 376, 378, 379, 380, 381, 382, 383, 384, 385, 387, 388, 389, 390,\n 392, 393, 396, 398, 402, 403, 405, 406, 409, 412, 414, 415, 417, 418, 419,\n 420, 421, 422, 424, 425, 426, 428, 429, 430, 432, 433, 436, 437, 438, 439,\n 441, 444, 445, 452, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472,\n 473, 474, 475, 476, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488,\n 489, 490, 491, 492, 493, 494, 495, 497, 501, 502, 505, 506, 507, 508, 509,\n 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524,\n 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539,\n 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554,\n 555, 556, 557, 558, 559, 560, 561, 562, 563, 570, 572, 573, 575, 577, 578,\n 579, 583, 584, 585, 586, 587, 588, 589, 590, 591, 688, 697, 706, 710, 722,\n 748, 749, 750, 751, 768, 832, 834, 835, 838, 847, 848, 880, 881, 882, 883,\n 884, 887, 888, 891, 894, 912, 913, 940, 975, 983, 984, 985, 986, 987, 988,\n 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003,\n 1004, 1005, 1006, 1007, 1008, 1011, 1012, 1016, 1017, 1019, 1021, 1072, 1120,\n 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133,\n 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146,\n 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1160, 1163, 1164, 1165,\n 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178,\n 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191,\n 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204,\n 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1218,\n 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1232,\n 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245,\n 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258,\n 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271,\n 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284,\n 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297,\n 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310,\n 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323,\n 1324, 1325, 1326, 1327, 1328, 1369, 1370, 1376, 1415, 1416, 1417, 1425, 1470,\n 1471, 1472, 1473, 1475, 1476, 1478, 1479, 1482, 1488, 1515, 1519, 1523, 1552,\n 1563, 1568, 1600, 1601, 1632, 1646, 1653, 1657, 1748, 1749, 1757, 1759, 1769,\n 1770, 1776, 1786, 1792, 1808, 1867, 1869, 1970, 1984, 2038, 2045, 2046, 2048,\n 2094, 2112, 2140, 2144, 2155, 2160, 2184, 2185, 2192, 2199, 2274, 2275, 2392,\n 2400, 2404, 2406, 2416, 2417, 2436, 2437, 2445, 2447, 2449, 2451, 2473, 2474,\n 2481, 2482, 2483, 2486, 2490, 2492, 2501, 2503, 2505, 2507, 2511, 2519, 2520,\n 2528, 2532, 2534, 2546, 2556, 2557, 2558, 2559, 2561, 2564, 2565, 2571, 2575,\n 2577, 2579, 2601, 2602, 2609, 2610, 2611, 2613, 2614, 2616, 2618, 2620, 2621,\n 2622, 2627, 2631, 2633, 2635, 2638, 2641, 2642, 2652, 2653, 2662, 2678, 2689,\n 2692, 2693, 2702, 2703, 2706, 2707, 2729, 2730, 2737, 2738, 2740, 2741, 2746,\n 2748, 2758, 2759, 2762, 2763, 2766, 2768, 2769, 2784, 2788, 2790, 2800, 2809,\n 2816, 2817, 2820, 2821, 2829, 2831, 2833, 2835, 2857, 2858, 2865, 2866, 2868,\n 2869, 2874, 2876, 2885, 2887, 2889, 2891, 2894, 2899, 2904, 2911, 2916, 2918,\n 2928, 2929, 2930, 2946, 2948, 2949, 2955, 2958, 2961, 2962, 2966, 2969, 2971,\n 2972, 2973, 2974, 2976, 2979, 2981, 2984, 2987, 2990, 3002, 3006, 3011, 3014,\n 3017, 3018, 3022, 3024, 3025, 3031, 3032, 3046, 3056, 3072, 3085, 3086, 3089,\n 3090, 3113, 3114, 3130, 3132, 3141, 3142, 3145, 3146, 3150, 3157, 3159, 3160,\n 3163, 3164, 3166, 3168, 3172, 3174, 3184, 3200, 3204, 3205, 3213, 3214, 3217,\n 3218, 3241, 3242, 3252, 3253, 3258, 3260, 3269, 3270, 3273, 3274, 3278, 3285,\n 3287, 3292, 3295, 3296, 3300, 3302, 3312, 3313, 3316, 3328, 3341, 3342, 3345,\n 3346, 3397, 3398, 3401, 3402, 3407, 3412, 3416, 3423, 3428, 3430, 3440, 3450,\n 3456, 3457, 3460, 3461, 3479, 3482, 3506, 3507, 3516, 3517, 3518, 3520, 3527,\n 3530, 3531, 3535, 3541, 3542, 3543, 3544, 3552, 3558, 3568, 3570, 3572, 3585,\n 3635, 3636, 3643, 3648, 3663, 3664, 3674, 3713, 3715, 3716, 3717, 3718, 3723,\n 3724, 3748, 3749, 3750, 3751, 3763, 3764, 3774, 3776, 3781, 3782, 3783, 3784,\n 3791, 3792, 3802, 3806, 3808, 3840, 3841, 3851, 3852, 3864, 3866, 3872, 3882,\n 3893, 3894, 3895, 3896, 3897, 3898, 3902, 3907, 3908, 3912, 3913, 3917, 3918,\n 3922, 3923, 3927, 3928, 3932, 3933, 3945, 3946, 3949, 3953, 3955, 3956, 3957,\n 3962, 3969, 3970, 3973, 3974, 3987, 3988, 3992, 3993, 3997, 3998, 4002, 4003,\n 4007, 4008, 4012, 4013, 4025, 4026, 4029, 4038, 4039, 4096, 4170, 4176, 4254,\n 4304, 4347, 4349, 4352, 4608, 4681, 4682, 4686, 4688, 4695, 4696, 4697, 4698,\n 4702, 4704, 4745, 4746, 4750, 4752, 4785, 4786, 4790, 4792, 4799, 4800, 4801,\n 4802, 4806, 4808, 4823, 4824, 4881, 4882, 4886, 4888, 4955, 4957, 4960, 4992,\n 5008, 5024, 5110, 5121, 5741, 5743, 5760, 5761, 5787, 5792, 5867, 5873, 5881,\n 5888, 5910, 5919, 5941, 5952, 5972, 5984, 5997, 5998, 6001, 6002, 6004, 6016,\n 6068, 6070, 6100, 6103, 6104, 6108, 6110, 6112, 6122, 6160, 6170, 6176, 6265,\n 6272, 6315, 6320, 6390, 6400, 6431, 6432, 6444, 6448, 6460, 6470, 6510, 6512,\n 6517, 6528, 6572, 6576, 6602, 6608, 6618, 6656, 6684, 6688, 6751, 6752, 6781,\n 6783, 6794, 6800, 6810, 6823, 6824, 6832, 6846, 6847, 6897, 6912, 6989, 6992,\n 7002, 7019, 7028, 7040, 7156, 7168, 7224, 7232, 7242, 7245, 7294, 7306, 7307,\n 7376, 7379, 7380, 7419, 7424, 7468, 7471, 7472, 7483, 7484, 7502, 7503, 7531,\n 7544, 7545, 7579, 7616, 7680, 7681, 7682, 7683, 7684, 7685, 7686, 7687, 7688,\n 7689, 7690, 7691, 7692, 7693, 7694, 7695, 7696, 7697, 7698, 7699, 7700, 7701,\n 7702, 7703, 7704, 7705, 7706, 7707, 7708, 7709, 7710, 7711, 7712, 7713, 7714,\n 7715, 7716, 7717, 7718, 7719, 7720, 7721, 7722, 7723, 7724, 7725, 7726, 7727,\n 7728, 7729, 7730, 7731, 7732, 7733, 7734, 7735, 7736, 7737, 7738, 7739, 7740,\n 7741, 7742, 7743, 7744, 7745, 7746, 7747, 7748, 7749, 7750, 7751, 7752, 7753,\n 7754, 7755, 7756, 7757, 7758, 7759, 7760, 7761, 7762, 7763, 7764, 7765, 7766,\n 7767, 7768, 7769, 7770, 7771, 7772, 7773, 7774, 7775, 7776, 7777, 7778, 7779,\n 7780, 7781, 7782, 7783, 7784, 7785, 7786, 7787, 7788, 7789, 7790, 7791, 7792,\n 7793, 7794, 7795, 7796, 7797, 7798, 7799, 7800, 7801, 7802, 7803, 7804, 7805,\n 7806, 7807, 7808, 7809, 7810, 7811, 7812, 7813, 7814, 7815, 7816, 7817, 7818,\n 7819, 7820, 7821, 7822, 7823, 7824, 7825, 7826, 7827, 7828, 7829, 7834, 7836,\n 7838, 7839, 7840, 7841, 7842, 7843, 7844, 7845, 7846, 7847, 7848, 7849, 7850,\n 7851, 7852, 7853, 7854, 7855, 7856, 7857, 7858, 7859, 7860, 7861, 7862, 7863,\n 7864, 7865, 7866, 7867, 7868, 7869, 7870, 7871, 7872, 7873, 7874, 7875, 7876,\n 7877, 7878, 7879, 7880, 7881, 7882, 7883, 7884, 7885, 7886, 7887, 7888, 7889,\n 7890, 7891, 7892, 7893, 7894, 7895, 7896, 7897, 7898, 7899, 7900, 7901, 7902,\n 7903, 7904, 7905, 7906, 7907, 7908, 7909, 7910, 7911, 7912, 7913, 7914, 7915,\n 7916, 7917, 7918, 7919, 7920, 7921, 7922, 7923, 7924, 7925, 7926, 7927, 7928,\n 7929, 7930, 7931, 7932, 7933, 7934, 7935, 7944, 7952, 7958, 7968, 7976, 7984,\n 7992, 8000, 8006, 8016, 8024, 8032, 8040, 8048, 8049, 8050, 8051, 8052, 8053,\n 8054, 8055, 8056, 8057, 8058, 8059, 8060, 8061, 8112, 8114, 8118, 8119, 8134,\n 8135, 8144, 8147, 8150, 8152, 8160, 8163, 8164, 8168, 8182, 8183, 8335, 8336,\n 8526, 8527, 8580, 8581, 11312, 11360, 11361, 11362, 11365, 11367, 11368,\n 11369, 11370, 11371, 11372, 11373, 11377, 11378, 11379, 11381, 11382, 11388,\n 11393, 11394, 11395, 11396, 11397, 11398, 11399, 11400, 11401, 11402, 11403,\n 11404, 11405, 11406, 11407, 11408, 11409, 11410, 11411, 11412, 11413, 11414,\n 11415, 11416, 11417, 11418, 11419, 11420, 11421, 11422, 11423, 11424, 11425,\n 11426, 11427, 11428, 11429, 11430, 11431, 11432, 11433, 11434, 11435, 11436,\n 11437, 11438, 11439, 11440, 11441, 11442, 11443, 11444, 11445, 11446, 11447,\n 11448, 11449, 11450, 11451, 11452, 11453, 11454, 11455, 11456, 11457, 11458,\n 11459, 11460, 11461, 11462, 11463, 11464, 11465, 11466, 11467, 11468, 11469,\n 11470, 11471, 11472, 11473, 11474, 11475, 11476, 11477, 11478, 11479, 11480,\n 11481, 11482, 11483, 11484, 11485, 11486, 11487, 11488, 11489, 11490, 11491,\n 11493, 11500, 11501, 11502, 11506, 11507, 11508, 11520, 11558, 11559, 11560,\n 11565, 11566, 11568, 11624, 11647, 11671, 11680, 11687, 11688, 11695, 11696,\n 11703, 11704, 11711, 11712, 11719, 11720, 11727, 11728, 11735, 11736, 11743,\n 11744, 11776, 11823, 11824, 12293, 12296, 12330, 12334, 12348, 12349, 12353,\n 12439, 12441, 12443, 12445, 12447, 12449, 12539, 12540, 12543, 12549, 12592,\n 12704, 12736, 12784, 12800, 13312, 19904, 19968, 42125, 42192, 42238, 42240,\n 42509, 42512, 42540, 42561, 42562, 42563, 42564, 42565, 42566, 42567, 42568,\n 42569, 42570, 42571, 42572, 42573, 42574, 42575, 42576, 42577, 42578, 42579,\n 42580, 42581, 42582, 42583, 42584, 42585, 42586, 42587, 42588, 42589, 42590,\n 42591, 42592, 42593, 42594, 42595, 42596, 42597, 42598, 42599, 42600, 42601,\n 42602, 42603, 42604, 42605, 42608, 42612, 42622, 42623, 42624, 42625, 42626,\n 42627, 42628, 42629, 42630, 42631, 42632, 42633, 42634, 42635, 42636, 42637,\n 42638, 42639, 42640, 42641, 42642, 42643, 42644, 42645, 42646, 42647, 42648,\n 42649, 42650, 42651, 42652, 42654, 42726, 42736, 42738, 42775, 42784, 42787,\n 42788, 42789, 42790, 42791, 42792, 42793, 42794, 42795, 42796, 42797, 42798,\n 42799, 42802, 42803, 42804, 42805, 42806, 42807, 42808, 42809, 42810, 42811,\n 42812, 42813, 42814, 42815, 42816, 42817, 42818, 42819, 42820, 42821, 42822,\n 42823, 42824, 42825, 42826, 42827, 42828, 42829, 42830, 42831, 42832, 42833,\n 42834, 42835, 42836, 42837, 42838, 42839, 42840, 42841, 42842, 42843, 42844,\n 42845, 42846, 42847, 42848, 42849, 42850, 42851, 42852, 42853, 42854, 42855,\n 42856, 42857, 42858, 42859, 42860, 42861, 42862, 42863, 42864, 42865, 42873,\n 42874, 42875, 42876, 42877, 42879, 42880, 42881, 42882, 42883, 42884, 42885,\n 42886, 42887, 42889, 42892, 42893, 42894, 42896, 42897, 42898, 42899, 42902,\n 42903, 42904, 42905, 42906, 42907, 42908, 42909, 42910, 42911, 42912, 42913,\n 42914, 42915, 42916, 42917, 42918, 42919, 42920, 42921, 42922, 42927, 42928,\n 42933, 42934, 42935, 42936, 42937, 42938, 42939, 42940, 42941, 42942, 42943,\n 42944, 42945, 42946, 42947, 42948, 42952, 42953, 42954, 42955, 42957, 42958,\n 42959, 42960, 42961, 42962, 42963, 42964, 42965, 42966, 42967, 42968, 42969,\n 42970, 42971, 42972, 42998, 43000, 43002, 43048, 43052, 43053, 43072, 43124,\n 43136, 43206, 43216, 43226, 43232, 43256, 43259, 43260, 43261, 43310, 43312,\n 43348, 43392, 43457, 43471, 43482, 43488, 43519, 43520, 43575, 43584, 43598,\n 43600, 43610, 43616, 43639, 43642, 43715, 43739, 43742, 43744, 43760, 43762,\n 43767, 43777, 43783, 43785, 43791, 43793, 43799, 43808, 43815, 43816, 43823,\n 43824, 43867, 43872, 43881, 43968, 44011, 44012, 44014, 44016, 44026, 44032,\n 55204, 64014, 64016, 64017, 64018, 64019, 64021, 64031, 64032, 64033, 64034,\n 64035, 64037, 64039, 64042, 64286, 64287, 65056, 65072, 65139, 65140, 65536,\n 65548, 65549, 65575, 65576, 65595, 65596, 65598, 65599, 65614, 65616, 65630,\n 65664, 65787, 66045, 66046, 66176, 66205, 66208, 66257, 66272, 66273, 66304,\n 66336, 66349, 66369, 66370, 66378, 66384, 66427, 66432, 66462, 66464, 66500,\n 66504, 66512, 66600, 66718, 66720, 66730, 66776, 66812, 66816, 66856, 66864,\n 66916, 66967, 66978, 66979, 66994, 66995, 67002, 67003, 67005, 67008, 67060,\n 67072, 67383, 67392, 67414, 67424, 67432, 67456, 67457, 67584, 67590, 67592,\n 67593, 67594, 67638, 67639, 67641, 67644, 67645, 67647, 67670, 67680, 67703,\n 67712, 67743, 67808, 67827, 67828, 67830, 67840, 67862, 67872, 67898, 67904,\n 67930, 67968, 68024, 68030, 68032, 68096, 68100, 68101, 68103, 68108, 68116,\n 68117, 68120, 68121, 68150, 68152, 68155, 68159, 68160, 68192, 68221, 68224,\n 68253, 68288, 68296, 68297, 68327, 68352, 68406, 68416, 68438, 68448, 68467,\n 68480, 68498, 68608, 68681, 68800, 68851, 68864, 68904, 68912, 68922, 68928,\n 68944, 68969, 68974, 68975, 68998, 69248, 69290, 69291, 69293, 69296, 69298,\n 69314, 69320, 69323, 69328, 69337, 69359, 69360, 69405, 69415, 69416, 69424,\n 69457, 69488, 69510, 69552, 69573, 69600, 69623, 69632, 69703, 69734, 69750,\n 69759, 69819, 69826, 69827, 69840, 69865, 69872, 69882, 69888, 69941, 69942,\n 69952, 69956, 69960, 69968, 70004, 70006, 70007, 70016, 70085, 70089, 70093,\n 70094, 70107, 70108, 70109, 70144, 70162, 70163, 70200, 70206, 70210, 70272,\n 70279, 70280, 70281, 70282, 70286, 70287, 70302, 70303, 70313, 70320, 70379,\n 70384, 70394, 70400, 70404, 70405, 70413, 70415, 70417, 70419, 70441, 70442,\n 70449, 70450, 70452, 70453, 70458, 70459, 70469, 70471, 70473, 70475, 70478,\n 70480, 70481, 70487, 70488, 70493, 70500, 70502, 70509, 70512, 70517, 70528,\n 70538, 70539, 70540, 70542, 70543, 70544, 70582, 70583, 70593, 70594, 70595,\n 70597, 70598, 70599, 70603, 70604, 70612, 70625, 70627, 70656, 70731, 70736,\n 70746, 70750, 70754, 70784, 70854, 70855, 70856, 70864, 70874, 71040, 71094,\n 71096, 71105, 71128, 71134, 71168, 71233, 71236, 71237, 71248, 71258, 71296,\n 71353, 71360, 71370, 71376, 71396, 71424, 71451, 71453, 71468, 71472, 71482,\n 71488, 71495, 71680, 71739, 71872, 71914, 71935, 71943, 71945, 71946, 71948,\n 71956, 71957, 71959, 71960, 71990, 71991, 71993, 71995, 72004, 72016, 72026,\n 72096, 72104, 72106, 72152, 72154, 72162, 72163, 72165, 72192, 72255, 72263,\n 72264, 72272, 72346, 72349, 72350, 72368, 72441, 72458, 72459, 72544, 72552,\n 72640, 72673, 72688, 72698, 72704, 72713, 72714, 72759, 72760, 72769, 72784,\n 72794, 72818, 72848, 72850, 72872, 72873, 72887, 72960, 72967, 72968, 72970,\n 72971, 73015, 73018, 73019, 73020, 73022, 73023, 73032, 73040, 73050, 73056,\n 73062, 73063, 73065, 73066, 73103, 73104, 73106, 73107, 73113, 73120, 73130,\n 73136, 73180, 73184, 73194, 73200, 73202, 73440, 73463, 73472, 73489, 73490,\n 73531, 73534, 73539, 73552, 73563, 73648, 73649, 73728, 74650, 74880, 75076,\n 77712, 77809, 77824, 78896, 78912, 78934, 78944, 82939, 82944, 83527, 90368,\n 90426, 92160, 92729, 92736, 92767, 92768, 92778, 92784, 92863, 92864, 92874,\n 92880, 92910, 92912, 92917, 92928, 92983, 92992, 92996, 93008, 93018, 93027,\n 93048, 93053, 93072, 93504, 93549, 93552, 93562, 93792, 93824, 93883, 93908,\n 93952, 94027, 94031, 94088, 94095, 94112, 94176, 94178, 94179, 94181, 94192,\n 94196, 94208, 101595, 101631, 101665, 101760, 101875, 101888, 102802, 102816,\n 102867, 110576, 110580, 110581, 110588, 110589, 110591, 110592, 110883,\n 110887, 110889, 110898, 110899, 110928, 110931, 110933, 110934, 110948,\n 110953, 110960, 111356, 113664, 113771, 113776, 113789, 113792, 113801,\n 113808, 113818, 113821, 113823, 118528, 118574, 118576, 118599, 119376,\n 119379, 119387, 119389, 119391, 119392, 119424, 119426, 121344, 121399,\n 121403, 121453, 121461, 121462, 121476, 121477, 121499, 121504, 121505,\n 121520, 122624, 122688, 122689, 122696, 122697, 122698, 122699, 122701,\n 122702, 122705, 122706, 122728, 122729, 122730, 122731, 122732, 122733,\n 122734, 122735, 122738, 122739, 122740, 122741, 122742, 122743, 122744,\n 122745, 122746, 122747, 122748, 122749, 122750, 122751, 122754, 122768,\n 122773, 122774, 122775, 122880, 122887, 122888, 122905, 122907, 122914,\n 122915, 122917, 122918, 122923, 123023, 123024, 123136, 123181, 123184,\n 123198, 123200, 123210, 123214, 123215, 123536, 123567, 123584, 123642,\n 124112, 124154, 124368, 124411, 124608, 124639, 124640, 124662, 124670,\n 124672, 124896, 124903, 124904, 124908, 124909, 124911, 124912, 124927,\n 124928, 125125, 125136, 125143, 125218, 125260, 125264, 125274, 131072,\n 173792, 173824, 178207, 178208, 183982, 183984, 191457, 191472, 192094,\n 196608, 201547, 201552, 210042, 249856, 261184,\n];\n\n/** CONTEXTJ code points (joiners). */\nexport const IDNA_CONTEXTJ: readonly number[] = [8204, 8206];\n\n/** CONTEXTO code points. */\nexport const IDNA_CONTEXTO: readonly number[] = [\n 183, 184, 885, 886, 1523, 1525, 1632, 1642, 1776, 1786, 12539, 12540,\n];\n","// Text forms used by DNS: IP addresses, domain names and quoted strings,\n// ported from dnspython (`dns.ipv4`, `dns.ipv6`, `dns.inet`, `dns.name`,\n// `dns.rdata._escapify`, `dns.reversename`) so parsed answers print exactly\n// like dnspython's `to_text()`.\n\nimport { domainToASCII } from 'node:url';\n\nimport {\n BadEscape,\n DNSSyntaxError,\n EmptyLabel,\n IDNAException,\n LabelTooLong,\n NameTooLong,\n} from './dns-errors';\nimport { IDNA_CONTEXTJ, IDNA_CONTEXTO, IDNA_PVALID } from './idna-data';\nimport { pyRepr } from './py-str';\n\nconst IPV4_LENGTH = 4;\nconst IPV6_LENGTH = 16;\nconst IPV6_CHUNKS = 8;\nconst MAX_LABEL_LENGTH = 63;\nconst MAX_NAME_LENGTH = 255;\nconst MAX_BYTE = 255;\nconst PRINTABLE_LOW = 0x20;\nconst PRINTABLE_HIGH = 0x7f;\n\nconst DIGITS_RE = /^[0-9]+$/u;\nconst HEX_RE = /^[0-9a-fA-F]*$/u;\nconst V4_ENDING_RE = /^(.*):(\\d+\\.\\d+\\.\\d+\\.\\d+)$/su;\nconst LEADING_ZEROS_RE = /^0+(?=.)/u;\n\n/** Convert an IPv4 address to its 4 bytes (`dns.ipv4.inet_aton`). */\nexport function ipv4Aton(text: string): Uint8Array {\n const parts = text.split('.');\n if (parts.length !== IPV4_LENGTH) {\n throw new DNSSyntaxError();\n }\n const bytes = new Uint8Array(IPV4_LENGTH);\n for (const [index, part] of parts.entries()) {\n if (!DIGITS_RE.test(part)) {\n throw new DNSSyntaxError();\n }\n // No leading zeros\n if (part.length > 1 && part.startsWith('0')) {\n throw new DNSSyntaxError();\n }\n const value = Number(part);\n if (value > MAX_BYTE) {\n throw new DNSSyntaxError();\n }\n bytes[index] = value;\n }\n return bytes;\n}\n\n/** Convert 4 bytes to an IPv4 address (`dns.ipv4.inet_ntoa`). */\nexport function ipv4Ntoa(bytes: Uint8Array): string {\n if (bytes.length !== IPV4_LENGTH) {\n throw new DNSSyntaxError();\n }\n return [...bytes].join('.');\n}\n\n/**\n * Convert an IPv6 address to its 16 bytes (`dns.ipv6.inet_aton`). With\n * `ignoreScope`, a `%scope` suffix is dropped instead of rejected.\n */\nexport function ipv6Aton(input: string, ignoreScope = false): Uint8Array {\n let text = input;\n if (ignoreScope) {\n const parts = text.split('%');\n if (parts.length === 2) {\n [text] = parts as [string, string];\n } else if (parts.length > 2) {\n throw new DNSSyntaxError();\n }\n }\n if (text === '') {\n throw new DNSSyntaxError();\n }\n if (text.endsWith(':') && !text.endsWith('::')) {\n throw new DNSSyntaxError();\n }\n if (text.startsWith(':') && !text.startsWith('::')) {\n throw new DNSSyntaxError();\n }\n if (text === '::') {\n text = '0::';\n }\n // Get rid of the dot-quad syntax if we have it.\n const v4 = V4_ENDING_RE.exec(text);\n if (v4 !== null) {\n const b = ipv4Aton(v4[2] as string);\n const hex = (value: number): string => value.toString(16).padStart(2, '0');\n text = `${v4[1]}:${hex(b[0] as number)}${hex(b[1] as number)}:${hex(b[2] as number)}${hex(b[3] as number)}`;\n }\n // Turn '::<whatever>' into ':<whatever>', or '<whatever>::' into '<whatever>:'\n if (text.startsWith('::')) {\n text = text.slice(1);\n } else if (text.endsWith('::')) {\n text = text.slice(0, -1);\n }\n const chunks = text.split(':');\n if (chunks.length > IPV6_CHUNKS) {\n throw new DNSSyntaxError();\n }\n let seenEmpty = false;\n const canonical: string[] = [];\n for (const chunk of chunks) {\n if (chunk === '') {\n if (seenEmpty) {\n throw new DNSSyntaxError();\n }\n seenEmpty = true;\n for (let i = 0; i < IPV6_CHUNKS - chunks.length + 1; i += 1) {\n canonical.push('0000');\n }\n } else {\n if (chunk.length > 4) {\n throw new DNSSyntaxError();\n }\n canonical.push(chunk.padStart(4, '0'));\n }\n }\n if (chunks.length < IPV6_CHUNKS && !seenEmpty) {\n throw new DNSSyntaxError();\n }\n const hex = canonical.join('');\n if (!HEX_RE.test(hex) || hex.length !== IPV6_LENGTH * 2) {\n throw new DNSSyntaxError();\n }\n return Uint8Array.from(Buffer.from(hex, 'hex'));\n}\n\n/** Convert 16 bytes to an IPv6 address (`dns.ipv6.inet_ntoa`). */\nexport function ipv6Ntoa(bytes: Uint8Array): string {\n if (bytes.length !== IPV6_LENGTH) {\n throw new RangeError('IPv6 addresses are 16 bytes long');\n }\n const hex = Buffer.from(bytes).toString('hex');\n const chunks: string[] = [];\n for (let i = 0; i < hex.length; i += 4) {\n chunks.push(hex.slice(i, i + 4).replace(LEADING_ZEROS_RE, ''));\n }\n // Compress the longest run of 0-value chunks to ::\n let bestStart = 0;\n let bestLength = 0;\n let start = -1;\n let lastWasZero = false;\n for (let i = 0; i < IPV6_CHUNKS; i += 1) {\n if (chunks[i] !== '0') {\n if (lastWasZero) {\n if (i - start > bestLength) {\n bestStart = start;\n bestLength = i - start;\n }\n lastWasZero = false;\n }\n } else if (!lastWasZero) {\n start = i;\n lastWasZero = true;\n }\n }\n if (lastWasZero && IPV6_CHUNKS - start > bestLength) {\n bestStart = start;\n bestLength = IPV6_CHUNKS - start;\n }\n if (bestLength <= 1) {\n return chunks.join(':');\n }\n const embeddedV4 =\n bestStart === 0 &&\n (bestLength === 6 || (bestLength === 5 && chunks[5] === 'ffff'));\n if (embeddedV4) {\n const prefix = bestLength === 6 ? '::' : '::ffff:';\n return prefix + ipv4Ntoa(bytes.subarray(12));\n }\n return `${chunks.slice(0, bestStart).join(':')}::${chunks.slice(bestStart + bestLength).join(':')}`;\n}\n\n/** Whether `text` is an IPv4 or IPv6 address (`dns.inet.is_address`). */\nexport function isAddress(text: string): boolean {\n try {\n ipv4Aton(text);\n return true;\n } catch {\n try {\n ipv6Aton(text, true);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nconst NAME_ESCAPED = new Set([...'\"().;\\\\@$'].map(c => c.charCodeAt(0)));\nconst STRING_ESCAPED = new Set([...'\"\\\\'].map(c => c.charCodeAt(0)));\n\nfunction decimalEscape(byte: number): string {\n return `\\\\${byte.toString().padStart(3, '0')}`;\n}\n\n/** Escape one wire-format label for text (`dns.name._escapify`). */\nexport function escapifyLabel(label: Uint8Array): string {\n let text = '';\n for (const byte of label) {\n if (NAME_ESCAPED.has(byte)) {\n text += `\\\\${String.fromCharCode(byte)}`;\n } else if (byte > PRINTABLE_LOW && byte < PRINTABLE_HIGH) {\n text += String.fromCharCode(byte);\n } else {\n text += decimalEscape(byte);\n }\n }\n return text;\n}\n\n/** Escape a character-string for quoting (`dns.rdata._escapify`). */\nexport function escapifyString(bytes: Uint8Array): string {\n let text = '';\n for (const byte of bytes) {\n if (STRING_ESCAPED.has(byte)) {\n text += `\\\\${String.fromCharCode(byte)}`;\n } else if (byte >= PRINTABLE_LOW && byte < PRINTABLE_HIGH) {\n text += String.fromCharCode(byte);\n } else {\n text += decimalEscape(byte);\n }\n }\n return text;\n}\n\n/**\n * Text form of a name given as wire labels (`dns.name.Name.to_text`). An\n * absolute name ends with an empty label and prints with a final dot.\n */\nexport function nameToText(labels: readonly Uint8Array[]): string {\n if (labels.length === 0) {\n return '@';\n }\n if (labels.length === 1 && labels[0]?.length === 0) {\n return '.';\n }\n return labels.map(label => escapifyLabel(label)).join('.');\n}\n\nconst LABEL_SEPARATORS = new Set(['.', '。', '.', '。']);\nconst MAX_ASCII = 0x7f;\n\nfunction isAscii(text: string): boolean {\n return [...text].every(c => c.charCodeAt(0) <= MAX_ASCII);\n}\n\nfunction inRanges(ranges: readonly number[], codePoint: number): boolean {\n // Binary search over sorted [start, end) pairs.\n let low = 0;\n let high = ranges.length / 2 - 1;\n while (low <= high) {\n const middle = (low + high) >> 1;\n const start = ranges[middle * 2] as number;\n const end = ranges[middle * 2 + 1] as number;\n if (codePoint < start) {\n high = middle - 1;\n } else if (codePoint >= end) {\n low = middle + 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nconst GREEK_RE = /^\\p{Script=Greek}$/u;\nconst HEBREW_RE = /^\\p{Script=Hebrew}$/u;\nconst KANA_HAN_RE = /^[\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Han}]$/u;\nconst KATAKANA_MIDDLE_DOT = '・';\nconst ARABIC_INDIC: readonly [number, number] = [0x6_60, 0x6_6a];\nconst EXTENDED_ARABIC_INDIC: readonly [number, number] = [0x6_f0, 0x6_fa];\n\nfunction hasCodePointIn(\n chars: readonly string[],\n [start, end]: readonly [number, number],\n): boolean {\n return chars.some(c => {\n const cp = c.codePointAt(0) as number;\n return cp >= start && cp < end;\n });\n}\n\n/** idna's `valid_contexto` (RFC 5892 appendix A). */\nfunction validContexto(chars: readonly string[], pos: number): boolean {\n const cp = chars[pos]?.codePointAt(0) as number;\n const previous = chars[pos - 1] ?? '';\n const next = chars[pos + 1] ?? '';\n switch (cp) {\n case 0xb7: {\n return previous === 'l' && next === 'l';\n }\n case 0x3_75: {\n return GREEK_RE.test(next);\n }\n case 0x5_f3:\n case 0x5_f4: {\n return HEBREW_RE.test(previous);\n }\n case 0x30_fb: {\n return chars.some(c => c !== KATAKANA_MIDDLE_DOT && KANA_HAN_RE.test(c));\n }\n default: {\n if (cp >= ARABIC_INDIC[0] && cp < ARABIC_INDIC[1]) {\n return !hasCodePointIn(chars, EXTENDED_ARABIC_INDIC);\n }\n if (cp >= EXTENDED_ARABIC_INDIC[0] && cp < EXTENDED_ARABIC_INDIC[1]) {\n return !hasCodePointIn(chars, ARABIC_INDIC);\n }\n return false;\n }\n }\n}\n\nfunction codePointName(cp: number): string {\n return `U+${cp.toString(16).toUpperCase().padStart(4, '0')}`;\n}\n\n/**\n * The per-code-point part of idna's `check_label` (IDNA 2008, RFC 5892),\n * with idna's messages. UTS 46 (`domainToASCII`) accepts code points IDNA\n * 2008 disallows, such as emoji and symbols. Joiners are left to\n * `domainToASCII`, which applies the same CONTEXTJ rules.\n */\nfunction checkIdna2008Label(label: string): void {\n const chars = [...label];\n for (const [pos, c] of chars.entries()) {\n const cp = c.codePointAt(0) as number;\n if (inRanges(IDNA_PVALID, cp) || inRanges(IDNA_CONTEXTJ, cp)) {\n continue;\n }\n if (inRanges(IDNA_CONTEXTO, cp)) {\n if (!validContexto(chars, pos)) {\n throw new IDNAException(\n `Codepoint ${codePointName(cp)} not allowed at position ${pos + 1} in ${pyRepr(label)}`,\n );\n }\n continue;\n }\n throw new IDNAException(\n `Codepoint ${codePointName(cp)} at position ${pos + 1} of ${pyRepr(label)} not allowed`,\n );\n }\n}\n\n/** The idna message for a joiner `domainToASCII` rejected, if there is one. */\nfunction joinerFailure(label: string): string | null {\n const chars = [...label];\n const pos = chars.findIndex(c =>\n inRanges(IDNA_CONTEXTJ, c.codePointAt(0) as number),\n );\n if (pos === -1) {\n return null;\n }\n const cp = chars[pos]?.codePointAt(0) as number;\n return `Joiner ${codePointName(cp)} not allowed at position ${pos + 1} in ${pyRepr(label)}`;\n}\n\nfunction encodeLabel(label: string): Uint8Array {\n if (label === '') {\n return new Uint8Array();\n }\n let ascii = label;\n if (!isAscii(label)) {\n // dnspython encodes non-ASCII labels with IDNA 2008 after the UTS 46\n // mapping (non-transitional). `domainToASCII` does that mapping and the\n // joiner/bidi checks; the code point classes are checked here, on an\n // approximation of the mapped label (NFKC + lowercase), to raise\n // idna's errors for what UTS 46 alone accepts (emoji, symbols).\n const mapped = label.normalize('NFKC').toLowerCase().normalize('NFC');\n if (!isAscii(mapped)) {\n checkIdna2008Label(mapped);\n }\n ascii = domainToASCII(label);\n if (ascii === '') {\n // Bidi-rule and other failures: idna's exact text is not reproduced.\n throw new IDNAException(\n joinerFailure(mapped) ?? `Invalid label ${pyRepr(mapped)}`,\n );\n }\n }\n const encoded = Buffer.from(ascii, 'latin1');\n if (encoded.length > MAX_LABEL_LENGTH) {\n throw new LabelTooLong();\n }\n return Uint8Array.from(encoded);\n}\n\nfunction validateLabels(labels: readonly Uint8Array[]): void {\n let total = 0;\n for (const [index, label] of labels.entries()) {\n if (label.length > MAX_LABEL_LENGTH) {\n throw new LabelTooLong();\n }\n if (label.length === 0 && index !== labels.length - 1) {\n throw new EmptyLabel();\n }\n total += label.length + 1;\n }\n if (total > MAX_NAME_LENGTH) {\n throw new NameTooLong();\n }\n}\n\n/**\n * Parse a name in text form into absolute wire labels\n * (`dns.name.from_text(text)` made absolute, as the resolver does).\n */\nexport function nameFromText(text: string): Uint8Array[] {\n const labels: Uint8Array[] = [];\n if (LABEL_SEPARATORS.has(text)) {\n return [new Uint8Array()];\n }\n const source = text === '@' ? '' : text;\n // Bytes from \\DDD escapes are kept as raw bytes; other text is encoded.\n let label: number[] = [];\n let pending = '';\n const flush = (): void => {\n if (pending !== '') {\n label.push(...encodeLabel(pending));\n pending = '';\n }\n };\n const chars = [...source];\n for (let i = 0; i < chars.length; i += 1) {\n const c = chars[i] as string;\n if (c === '\\\\') {\n const next = chars[i + 1];\n if (next === undefined) {\n throw new BadEscape();\n }\n if (DIGITS_RE.test(next)) {\n const digits = chars.slice(i + 1, i + 4).join('');\n if (!/^[0-9]{3}$/u.test(digits) || Number(digits) > MAX_BYTE) {\n throw new BadEscape();\n }\n flush();\n label.push(Number(digits));\n i += 3;\n } else {\n pending += next;\n i += 1;\n }\n } else if (LABEL_SEPARATORS.has(c)) {\n flush();\n if (label.length === 0) {\n throw new EmptyLabel();\n }\n labels.push(Uint8Array.from(label));\n label = [];\n } else {\n pending += c;\n }\n }\n flush();\n if (label.length > 0) {\n labels.push(Uint8Array.from(label));\n }\n // Relative names are made absolute (the resolver appends the root).\n labels.push(new Uint8Array());\n validateLabels(labels);\n return labels;\n}\n\nconst MAPPED_PREFIX_LENGTH = 10;\n\nfunction isMapped(address: Uint8Array): boolean {\n return (\n address.subarray(0, MAPPED_PREFIX_LENGTH).every(byte => byte === 0) &&\n address[10] === MAX_BYTE &&\n address[11] === MAX_BYTE\n );\n}\n\n/**\n * Reverse-map domain name of an IP address, with the final dot\n * (`str(dns.reversename.from_address(text))`). Raises `DNSSyntaxError` for\n * text that is not an IP address.\n */\nexport function reverseNameFromAddress(text: string): string {\n let parts: string[];\n let origin: string;\n try {\n const v6 = ipv6Aton(text);\n if (isMapped(v6)) {\n parts = [...v6.subarray(12)].map(String);\n origin = 'in-addr.arpa.';\n } else {\n parts = [...Buffer.from(v6).toString('hex')];\n origin = 'ip6.arpa.';\n }\n } catch {\n parts = [...ipv4Aton(text)].map(String);\n origin = 'in-addr.arpa.';\n }\n return `${parts.reverse().join('.')}.${origin}`;\n}\n","// DNS wire format (RFC 1035) for the DNS over HTTPS and DNS over TLS\n// transports: query encoding, response decoding, dnspython's response\n// validation and CNAME chaining, and rdata text matching dnspython's\n// `to_text()`.\n//\n// Encoding and decoding use dns-packet. dns-packet decodes labels as UTF-8\n// and joins them with dots, so a label holding non-UTF-8 bytes or a literal\n// dot (which dnspython would print as `\\DDD` / `\\.`) loses those details.\n// Such names don't occur in practice; everything else (validation, CNAME\n// chaining, dnspython's text forms) is unaffected.\n\nimport dnsPacket from 'dns-packet';\n\nimport {\n BadResponse,\n DNSException,\n DNSFormError,\n NoMetaqueries,\n UnknownRdatatype,\n} from './dns-errors';\nimport { escapifyString, ipv6Aton, ipv6Ntoa, nameToText } from './dns-text';\n\n/** Record types `queryDns()` supports, with their codes. */\nexport interface SupportedRdatatypes {\n readonly A: number;\n readonly NS: number;\n readonly CNAME: number;\n readonly SOA: number;\n readonly PTR: number;\n readonly MX: number;\n readonly TXT: number;\n readonly AAAA: number;\n readonly SRV: number;\n readonly CAA: number;\n}\n\nexport const RDATATYPES: SupportedRdatatypes = Object.freeze({\n A: 1,\n NS: 2,\n CNAME: 5,\n SOA: 6,\n PTR: 12,\n MX: 15,\n TXT: 16,\n AAAA: 28,\n SRV: 33,\n CAA: 257,\n});\n\n/** Meta types dnspython refuses to query (`dns.rdatatype.is_metatype`). */\nconst METATYPES = new Set([\n 'OPT',\n 'TKEY',\n 'TSIG',\n 'IXFR',\n 'AXFR',\n 'MAILB',\n 'MAILA',\n 'ANY',\n]);\n\nexport const RDATACLASS_IN = 1;\nconst RDATATYPE_OPT = 41;\n\nconst RCODE_NAMES: Readonly<Record<number, string>> = Object.freeze({\n 0: 'NOERROR',\n 1: 'FORMERR',\n 2: 'SERVFAIL',\n 3: 'NXDOMAIN',\n 4: 'NOTIMP',\n 5: 'REFUSED',\n 6: 'YXDOMAIN',\n 7: 'YXRRSET',\n 8: 'NXRRSET',\n 9: 'NOTAUTH',\n 10: 'NOTZONE',\n 16: 'BADVERS',\n 23: 'BADCOOKIE',\n});\n\nexport interface ResponseCodes {\n readonly NOERROR: number;\n readonly FORMERR: number;\n readonly SERVFAIL: number;\n readonly NXDOMAIN: number;\n readonly NOTIMP: number;\n readonly REFUSED: number;\n readonly YXDOMAIN: number;\n}\n\nexport const RCODE: ResponseCodes = Object.freeze({\n NOERROR: 0,\n FORMERR: 1,\n SERVFAIL: 2,\n NXDOMAIN: 3,\n NOTIMP: 4,\n REFUSED: 5,\n YXDOMAIN: 6,\n});\n\n/** Text of a response code (`dns.rcode.to_text`). */\nexport function rcodeToText(rcode: number): string {\n return RCODE_NAMES[rcode] ?? String(rcode);\n}\n\n/** Text of a record type code (`dns.rdatatype.to_text`). */\nexport function rdatatypeToText(rdtype: number): string {\n for (const [name, code] of Object.entries(RDATATYPES)) {\n if (code === rdtype) {\n return name;\n }\n }\n return `TYPE${rdtype}`;\n}\n\n/**\n * The code of a record type given as text. Meta types raise\n * `NoMetaqueries`-style errors in dnspython; types this port cannot format\n * raise `UnknownRdatatype`.\n */\nexport function rdatatypeFromText(text: string): number {\n if (Object.hasOwn(RDATATYPES, text)) {\n return RDATATYPES[text as keyof SupportedRdatatypes];\n }\n if (METATYPES.has(text)) {\n throw new NoMetaqueries();\n }\n throw new UnknownRdatatype(\n `DNS resource record type is unknown or not supported: ${text}`,\n );\n}\n\nconst FLAG_QR = 0x80_00;\nconst FLAG_RD = 0x01_00;\nconst OPCODE_SHIFT = 11;\nconst OPCODE_MASK = 0xf;\nconst RCODE_MASK = 0xf;\nconst HEADER_LENGTH = 12;\nconst EDNS_PAYLOAD = 1232;\nconst MAX_CHAIN = 16;\n\n/** A name as wire labels; absolute names end with an empty label. */\nexport type WireName = Uint8Array[];\n\nexport interface DnsQuestion {\n name: WireName;\n rdtype: number;\n rdclass: number;\n}\n\nexport interface DnsRecord {\n name: WireName;\n rdtype: number;\n rdclass: number;\n ttl: number;\n /** Rdata as dns-packet decodes it. */\n data: unknown;\n}\n\nexport interface DnsMessage {\n id: number;\n flags: number;\n /** Full response code, including the EDNS extended bits. */\n rcode: number;\n question: DnsQuestion[];\n answer: DnsRecord[];\n authority: DnsRecord[];\n additional: DnsRecord[];\n}\n\n/** A query message, as dnspython's resolver builds it (RD set, EDNS0 with a 1232-byte payload). */\nexport interface DnsQuery {\n id: number;\n flags: number;\n question: DnsQuestion;\n wire: Uint8Array;\n}\n\nconst utf8 = new TextDecoder();\nconst utf8Encoder = new TextEncoder();\n\n/** dns-packet's name text (no trailing dot) from wire labels. */\nfunction nameToPacketText(name: WireName): string {\n const labels = name.filter(label => label.length > 0);\n return labels.length === 0 ? '.' : labels.map(l => utf8.decode(l)).join('.');\n}\n\n/**\n * Wire labels from a name as dns-packet decodes it. With `mail`, dots\n * escaped as `\\.` (SOA rname) stay inside their label.\n */\nfunction nameFromPacketText(text: string, mail = false): WireName {\n const labels: string[] = [];\n let current = '';\n for (let index = 0; index < text.length; index += 1) {\n const char = text.charAt(index);\n if (mail && char === '\\\\' && text.charAt(index + 1) === '.') {\n current += '.';\n index += 1;\n } else if (char === '.') {\n labels.push(current);\n current = '';\n } else {\n current += char;\n }\n }\n labels.push(current);\n const wire = labels\n .filter(label => label !== '')\n .map(label => utf8Encoder.encode(label));\n wire.push(new Uint8Array(0));\n return wire;\n}\n\nconst CLASS_CODES: Readonly<Record<string, number>> = Object.freeze({\n ANY: 255,\n CH: 3,\n CS: 2,\n HS: 4,\n IN: 1,\n});\n\nfunction classCode(value: string | undefined): number {\n if (value === undefined) {\n return RDATACLASS_IN;\n }\n return CLASS_CODES[value] ?? Number(value.replace(/^UNKNOWN_/u, ''));\n}\n\nfunction typeCode(value: string): number {\n if (Object.hasOwn(RDATATYPES, value)) {\n return RDATATYPES[value as keyof SupportedRdatatypes];\n }\n if (value === 'OPT') {\n return RDATATYPE_OPT;\n }\n const match = /^UNKNOWN_(?<code>\\d+)$/u.exec(value);\n return match?.groups ? Number(match.groups.code) : -1;\n}\n\n/** Build a query (`dns.message.make_query` plus `use_edns(0, 0, 1232)`). */\nexport function makeQuery(\n name: WireName,\n rdtype: number,\n id: number,\n): DnsQuery {\n const flags = FLAG_RD;\n const wire = dnsPacket.encode({\n additionals: [\n {\n ednsVersion: 0,\n extendedRcode: 0,\n flag_do: false,\n flags: 0,\n name: '.',\n options: [],\n type: 'OPT',\n udpPayloadSize: EDNS_PAYLOAD,\n },\n ],\n flags,\n id,\n questions: [\n {\n class: 'IN',\n name: nameToPacketText(name),\n type: rdatatypeToText(rdtype) as dnsPacket.RecordType,\n },\n ],\n type: 'query',\n });\n return {\n flags,\n id,\n question: { name, rdclass: RDATACLASS_IN, rdtype },\n wire: new Uint8Array(wire),\n };\n}\n\nfunction toRecords(\n answers: readonly dnsPacket.Answer[] | undefined,\n): DnsRecord[] {\n return (answers ?? []).map(answer => {\n const record = answer as unknown as {\n name: string;\n type: string;\n class?: string;\n ttl?: number;\n data?: unknown;\n udpPayloadSize?: number;\n };\n const rdtype = typeCode(record.type);\n const mail = rdtype === RDATATYPES.SOA;\n return {\n data: mail ? { ...(record.data as object), mail } : record.data,\n name: nameFromPacketText(record.name),\n // An OPT record's class field carries the EDNS payload size.\n rdclass:\n rdtype === RDATATYPE_OPT\n ? (record.udpPayloadSize ?? 0)\n : classCode(record.class),\n rdtype,\n ttl: record.ttl ?? 0,\n };\n });\n}\n\n/** Decode a message (`dns.message.from_wire`). Raises `DNSFormError` when malformed. */\nexport function decodeMessage(bytes: Uint8Array): DnsMessage {\n if (bytes.length < HEADER_LENGTH) {\n throw new DNSFormError(\n 'The DNS packet passed to from_wire() is too short.',\n );\n }\n const buffer = Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n let packet: dnsPacket.DecodedPacket;\n try {\n packet = dnsPacket.decode(buffer);\n } catch (error) {\n throw new DNSFormError(\n error instanceof Error ? error.message : String(error),\n );\n }\n const consumed = (dnsPacket.decode as unknown as { bytes: number }).bytes;\n if (consumed !== bytes.length) {\n throw new DNSFormError(\n 'The DNS packet passed to from_wire() has extra junk at the end of it.',\n );\n }\n const id = buffer.readUInt16BE(0);\n const flags = buffer.readUInt16BE(2);\n const question: DnsQuestion[] = (packet.questions ?? []).map(q => ({\n name: nameFromPacketText(q.name),\n rdclass: classCode(q.class),\n rdtype: typeCode(q.type),\n }));\n const answer = toRecords(packet.answers);\n const authority = toRecords(packet.authorities);\n const additional = toRecords(packet.additionals);\n let rcode = flags & RCODE_MASK;\n const opt = (packet.additionals ?? []).find(\n record => record.type === 'OPT',\n ) as { extendedRcode?: number } | undefined;\n if (opt !== undefined) {\n rcode |= (opt.extendedRcode ?? 0) << 4;\n }\n return { additional, answer, authority, flags, id, question, rcode };\n}\n\nfunction labelsEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n const lower = (byte: number): number =>\n byte >= 0x41 && byte <= 0x5a ? byte + 0x20 : byte;\n return a.every((byte, index) => lower(byte) === lower(b[index] as number));\n}\n\n/** Case-insensitive name comparison, like dnspython's `Name.__eq__`. */\nexport function namesEqual(a: WireName, b: WireName): boolean {\n return (\n a.length === b.length &&\n a.every((label, index) => labelsEqual(label, b[index] as Uint8Array))\n );\n}\n\nfunction questionsEqual(a: DnsQuestion, b: DnsQuestion): boolean {\n return (\n a.rdtype === b.rdtype &&\n a.rdclass === b.rdclass &&\n namesEqual(a.name, b.name)\n );\n}\n\n/** Whether `response` answers `query` (`dns.message.Message.is_response`). */\nexport function isResponse(query: DnsQuery, response: DnsMessage): boolean {\n const opcode = (flags: number): number =>\n (flags >> OPCODE_SHIFT) & OPCODE_MASK;\n if (\n (response.flags & FLAG_QR) === 0 ||\n query.id !== response.id ||\n opcode(query.flags) !== opcode(response.flags)\n ) {\n return false;\n }\n const noQuestionAllowed = [\n RCODE.FORMERR,\n RCODE.SERVFAIL,\n RCODE.NOTIMP,\n RCODE.REFUSED,\n ];\n if (\n noQuestionAllowed.includes(response.rcode) &&\n response.question.length === 0\n ) {\n return true;\n }\n return (\n response.question.some(q => questionsEqual(q, query.question)) &&\n response.question.every(q => questionsEqual(q, query.question))\n );\n}\n\n/** Raise `BadResponse` unless `response` answers `query`. */\nexport function checkResponse(query: DnsQuery, response: DnsMessage): void {\n if (!isResponse(query, response)) {\n throw new BadResponse();\n }\n}\n\nfunction nameData(value: unknown): WireName {\n return nameFromPacketText(typeof value === 'string' ? value : '');\n}\n\n/** The target of a CNAME record. */\nfunction cnameTarget(record: DnsRecord): WireName {\n return nameData(record.data);\n}\n\nfunction bytesOf(value: unknown): Uint8Array {\n if (value instanceof Uint8Array) {\n return value;\n }\n return utf8Encoder.encode(String(value ?? ''));\n}\n\n/** Text form of a record's rdata, like dnspython's `Rdata.to_text()`. */\nexport function rdataToText(record: DnsRecord): string {\n const data = record.data as Record<string, unknown>;\n switch (record.rdtype) {\n case RDATATYPES.A: {\n return String(record.data);\n }\n case RDATATYPES.AAAA: {\n return ipv6Ntoa(ipv6Aton(String(record.data)));\n }\n case RDATATYPES.CNAME:\n case RDATATYPES.NS:\n case RDATATYPES.PTR: {\n return nameToText(nameData(record.data));\n }\n case RDATATYPES.MX: {\n return `${String(data.preference)} ${nameToText(nameData(data.exchange))}`;\n }\n case RDATATYPES.SOA: {\n const mname = nameToText(nameData(data.mname));\n const rname = nameToText(\n nameFromPacketText(String(data.rname ?? ''), true),\n );\n const numbers = [\n data.serial,\n data.refresh,\n data.retry,\n data.expire,\n data.minimum,\n ].map(String);\n return [mname, rname, ...numbers].join(' ');\n }\n case RDATATYPES.SRV: {\n return `${String(data.priority)} ${String(data.weight)} ${String(data.port)} ${nameToText(nameData(data.target))}`;\n }\n case RDATATYPES.TXT: {\n const strings = Array.isArray(record.data) ? record.data : [record.data];\n return strings\n .map(value => `\"${escapifyString(bytesOf(value))}\"`)\n .join(' ');\n }\n case RDATATYPES.CAA: {\n return `${String(data.flags)} ${escapifyString(bytesOf(data.tag))} \"${escapifyString(bytesOf(data.value))}\"`;\n }\n default: {\n // dnspython's generic rdata form\n const raw = bytesOf(record.data);\n return `\\\\# ${raw.length} ${Buffer.from(raw).toString('hex')}`;\n }\n }\n}\n\n/** Question text as dnspython prints a question RRset (`example.com. IN TXT`). */\nexport function questionToText(question: DnsQuestion): string {\n const rdclass =\n question.rdclass === RDATACLASS_IN ? 'IN' : `CLASS${question.rdclass}`;\n return `${nameToText(question.name)} ${rdclass} ${rdatatypeToText(question.rdtype)}`;\n}\n\nfunction findRecords(\n records: readonly DnsRecord[],\n name: WireName,\n rdclass: number,\n rdtype: number,\n): DnsRecord[] {\n return records.filter(\n record =>\n record.rdtype === rdtype &&\n record.rdclass === rdclass &&\n namesEqual(record.name, name),\n );\n}\n\n/**\n * The answer records of a response, following CNAMEs from the question\n * name (`dns.message.Message.resolve_chaining`). Returns `null` when the\n * response has no answer for the question. Duplicate rdata is dropped, as\n * dnspython's rdatasets do.\n */\nexport function resolveChaining(response: DnsMessage): DnsRecord[] | null {\n if ((response.flags & FLAG_QR) === 0) {\n throw new DNSException('The DNS message is not a response to a query.');\n }\n const [question] = response.question;\n if (question === undefined || response.question.length !== 1) {\n throw new DNSFormError();\n }\n let qname = question.name;\n let answer: DnsRecord[] | null = null;\n let count = 0;\n while (count < MAX_CHAIN) {\n const found = findRecords(\n response.answer,\n qname,\n question.rdclass,\n question.rdtype,\n );\n if (found.length > 0) {\n answer = found;\n break;\n }\n if (question.rdtype === RDATATYPES.CNAME) {\n break;\n }\n const [cname] = findRecords(\n response.answer,\n qname,\n question.rdclass,\n RDATATYPES.CNAME,\n );\n if (cname === undefined) {\n break;\n }\n qname = cnameTarget(cname);\n count += 1;\n }\n if (count >= MAX_CHAIN) {\n throw new DNSException('The CNAME chain is too long.');\n }\n if (response.rcode === RCODE.NXDOMAIN && answer !== null) {\n throw new DNSException('The rcode is NXDOMAIN but an answer was found.');\n }\n if (answer === null) {\n return null;\n }\n const seen = new Set<string>();\n const unique: DnsRecord[] = [];\n for (const record of answer) {\n const key = rdataKey(record);\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(record);\n }\n }\n return unique;\n}\n\nconst NAME_TYPES = new Set<number>([\n RDATATYPES.CNAME,\n RDATATYPES.NS,\n RDATATYPES.PTR,\n RDATATYPES.MX,\n RDATATYPES.SOA,\n RDATATYPES.SRV,\n]);\n\n/** Identity of a record's rdata: names compare case-insensitively. */\nfunction rdataKey(record: DnsRecord): string {\n const text = rdataToText(record);\n return NAME_TYPES.has(record.rdtype) ? text.toLowerCase() : text;\n}\n\n/** A random 16-bit message ID. */\nexport function randomMessageId(): number {\n return crypto.getRandomValues(new Uint16Array(1))[0] ?? 0;\n}\n","// Python's `urllib.parse.urlsplit()`, for parsing nameserver entries the\n// way parsedmarc does. The WHATWG `URL` parser accepts and rejects\n// different inputs (and normalizes hosts), which would change which entries\n// count as DNS over HTTPS / DNS over TLS and which error is raised.\n\nimport { isIPv6 } from 'node:net';\n\nconst SCHEME_CHARS_RE = /^[A-Za-z][A-Za-z0-9+.-]*$/u;\nconst UNSAFE_CHARS_RE = /[\\t\\r\\n]/gu;\nconst DIGITS_RE = /^[0-9]+$/u;\nconst IPV_FUTURE_RE = /^v[a-fA-F0-9]+\\.[a-zA-Z0-9._~!$&'()*+,;=:-]+$/u;\nconst MAX_PORT = 65_535;\nconst SPACE_CODE = 0x20;\n\nexport interface SplitUrl {\n scheme: string;\n netloc: string;\n path: string;\n query: string;\n fragment: string;\n /** The user name, or `null` without an `@` in the netloc. */\n username: string | null;\n /** The lowercased host, without brackets, or `null` when empty. */\n hostname: string | null;\n /** The port; throws `RangeError` like urlsplit's `.port` when it is invalid. */\n port: () => number | null;\n}\n\nfunction partition(\n value: string,\n separator: string,\n): [string, boolean, string] {\n const index = value.indexOf(separator);\n if (index === -1) {\n return [value, false, ''];\n }\n return [value.slice(0, index), true, value.slice(index + separator.length)];\n}\n\nfunction rpartition(\n value: string,\n separator: string,\n): [string, boolean, string] {\n const index = value.lastIndexOf(separator);\n if (index === -1) {\n return ['', false, value];\n }\n return [value.slice(0, index), true, value.slice(index + separator.length)];\n}\n\nfunction checkBracketedHost(hostname: string): void {\n if (hostname.startsWith('v')) {\n if (!IPV_FUTURE_RE.test(hostname)) {\n throw new RangeError('IPvFuture address is invalid');\n }\n return;\n }\n if (!isIPv6(hostname)) {\n throw new RangeError(\n `'${hostname}' does not appear to be an IPv4 or IPv6 address`,\n );\n }\n}\n\nfunction checkBracketedNetloc(netloc: string): void {\n const hostAndPort = rpartition(netloc, '@')[2];\n const [beforeBracket, hasOpenBracket, bracketed] = partition(\n hostAndPort,\n '[',\n );\n let hostname: string;\n if (hasOpenBracket) {\n if (beforeBracket) {\n throw new RangeError('Invalid IPv6 URL');\n }\n let port: string;\n [hostname, , port] = partition(bracketed, ']');\n if (port && !port.startsWith(':')) {\n throw new RangeError('Invalid IPv6 URL');\n }\n } else {\n [hostname] = partition(hostAndPort, ':');\n }\n checkBracketedHost(hostname);\n}\n\nfunction hostInfo(netloc: string): [string, string | null] {\n const info = rpartition(netloc, '@')[2];\n const [, hasOpenBracket, bracketed] = partition(info, '[');\n let hostname: string;\n let port: string;\n if (hasOpenBracket) {\n let rest: string;\n [hostname, , rest] = partition(bracketed, ']');\n port = partition(rest, ':')[2];\n } else {\n [hostname, , port] = partition(info, ':');\n }\n return [hostname, port === '' ? null : port];\n}\n\n/** Split a URL like Python's `urlsplit()`. Throws `RangeError` where it raises `ValueError`. */\nexport function urlSplit(input: string): SplitUrl {\n // Leading C0 control characters and spaces are stripped, as urlsplit does.\n let start = 0;\n while (start < input.length && input.charCodeAt(start) <= SPACE_CODE) {\n start += 1;\n }\n let url = input.slice(start).replaceAll(UNSAFE_CHARS_RE, '');\n let scheme = '';\n let netloc = '';\n let query = '';\n let fragment = '';\n const colon = url.indexOf(':');\n if (colon > 0 && SCHEME_CHARS_RE.test(url.slice(0, colon))) {\n scheme = url.slice(0, colon).toLowerCase();\n url = url.slice(colon + 1);\n }\n if (url.startsWith('//')) {\n let end = url.length;\n for (const delimiter of ['/', '?', '#']) {\n const index = url.indexOf(delimiter, 2);\n if (index !== -1) {\n end = Math.min(end, index);\n }\n }\n netloc = url.slice(2, end);\n url = url.slice(end);\n const hasOpen = netloc.includes('[');\n const hasClose = netloc.includes(']');\n if (hasOpen !== hasClose) {\n throw new RangeError('Invalid IPv6 URL');\n }\n if (hasOpen && hasClose) {\n checkBracketedNetloc(netloc);\n }\n }\n if (url.includes('#')) {\n [url, , fragment] = partition(url, '#');\n }\n if (url.includes('?')) {\n [url, , query] = partition(url, '?');\n }\n const [userinfo, hasUserinfo] = rpartition(netloc, '@');\n const username = hasUserinfo ? partition(userinfo, ':')[0] : null;\n const [rawHost, rawPort] = hostInfo(netloc);\n let hostname: string | null = null;\n if (rawHost) {\n const [address, hasPercent, zone] = partition(rawHost, '%');\n hostname = address.toLowerCase() + (hasPercent ? `%${zone}` : '');\n }\n return {\n scheme,\n netloc,\n path: url,\n query,\n fragment,\n username,\n hostname,\n port: () => {\n if (rawPort === null) {\n return null;\n }\n if (!DIGITS_RE.test(rawPort)) {\n throw new RangeError(\n `Port could not be cast to integer value as '${rawPort}'`,\n );\n }\n const port = Number(rawPort);\n if (port > MAX_PORT) {\n throw new RangeError('Port out of range 0-65535');\n }\n return port;\n },\n };\n}\n","// DNS queries, ported from parsedmarc/utils.py (`query_dns`,\n// `get_reverse_dns`, `_nameservers_to_resolver_input`,\n// `_parse_dot_nameserver`, `_SessionDoHNameserver`) together with the parts\n// of dnspython's stub resolver that parsedmarc relies on: nameserver\n// failover in the configured order, the per-query timeout within an overall\n// lifetime, the back-off between rounds, which failures take a nameserver\n// out of the mix, and the errors raised.\n//\n// Transports:\n// - an IP address: plain DNS through `node:dns` (c-ares), one server per\n// attempt so the failover logic stays here; scoped IPv6 addresses (and\n// TXT/CAA on Bun) go out as wire-format UDP/TCP with `node:dgram`;\n// - `https://...`: DNS over HTTPS (RFC 8484) with `fetch`, POST like\n// dnspython's default;\n// - `tls://ip[:port][#hostname]`: DNS over TLS (RFC 7858) with `node:tls`.\n//\n// Answers print like dnspython's `rdata.to_text()`; `queryDns()` then\n// applies parsedmarc's `.replace('\"', '').rstrip('.')`.\n\nimport { createSocket, type RemoteInfo } from 'node:dgram';\nimport { Resolver } from 'node:dns/promises';\nimport { connect as netConnect, isIPv6, type Socket } from 'node:net';\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport {\n connect,\n checkServerIdentity,\n type ConnectionOptions,\n type PeerCertificate,\n} from 'node:tls';\n\nimport type { ExpiringDict } from '../config';\nimport { DEFAULT_DNS_MAX_RETRIES, DEFAULT_DNS_TIMEOUT } from '../constants';\nimport { logger } from '../log';\nimport {\n DNSException,\n DNSFormError,\n DNSTimeout,\n LifetimeTimeout,\n NoAnswer,\n NoNameservers,\n NXDOMAIN,\n YXDOMAIN,\n type ResolutionError,\n} from './dns-errors';\nimport {\n checkResponse,\n decodeMessage,\n isResponse,\n makeQuery,\n RCODE,\n RDATACLASS_IN,\n randomMessageId,\n rcodeToText,\n rdataToText,\n rdatatypeFromText,\n questionToText,\n resolveChaining,\n type DnsMessage,\n type DnsQuery,\n type WireName,\n} from './dns-message';\nimport {\n escapifyString,\n ipv6Aton,\n ipv6Ntoa,\n isAddress,\n nameFromText,\n nameToText,\n reverseNameFromAddress,\n} from './dns-text';\nimport { readBody, splitUrlCredentials } from './http';\nimport { pyRStrip } from './py-str';\nimport { maskNameserverSecrets, redactUrlCredentials } from './redact';\nimport { sanitizeForLog } from './sanitize';\nimport { type SplitUrl, urlSplit } from './url-split';\n\n/** Cache of `queryDns()` answers, keyed `<domain>_<TYPE>`. */\nexport type DnsCache = ExpiringDict<string, string[]>;\n\n/** Cloudflare's public resolvers, used when no nameservers are configured. */\nexport const DEFAULT_NAMESERVERS: readonly string[] = Object.freeze([\n '1.1.1.1',\n '1.0.0.1',\n '2606:4700:4700::1111',\n '2606:4700:4700::1001',\n]);\n\nconst DO53_PORT = 53;\nconst DOT_PORT = 853;\nconst DOH_PORT = 443;\nconst MAX_MESSAGE_BYTES = 65_535;\nconst LENGTH_PREFIX_BYTES = 2;\nconst MAX_PER_QUERY_TIMEOUT = 1.0;\nconst INITIAL_BACKOFF = 0.1;\nconst MAX_BACKOFF = 2;\nconst MS_PER_SECOND = 1000;\n/** The TC (truncated) header flag. */\nconst FLAG_TC = 0x02_00;\nconst IS_BUN = typeof process.versions.bun === 'string';\n/** Types whose rdata holds byte strings printed with `\\DDD` escapes. */\nconst BYTE_STRING_RDTYPES: ReadonlySet<string> = new Set(['TXT', 'CAA']);\n\n/**\n * A malformed nameserver entry: Python's `ValueError`, raised by\n * parsedmarc's nameserver parsing and dnspython's `Resolver.nameservers`.\n * `name` is `ValueError` so messages that print the error type (the CLI's\n * DNS pre-flight check) match parsedmarc's; it is a `RangeError` for\n * callers that catch the built-in type.\n */\nexport class InvalidNameserverError extends RangeError {\n override name = 'ValueError';\n}\n\n/**\n * A socket-level failure (Python's `OSError`): connection refused, network\n * unreachable, TLS handshake failure. dnspython takes the nameserver out of\n * the mix, and parsedmarc retries the whole query on it.\n */\nexport class DNSSocketError extends Error {\n override name = 'DNSSocketError';\n /** The Node error code (`ECONNREFUSED`, ...), when known. */\n readonly code: string | null;\n\n constructor(message: string, code: string | null = null) {\n super(message);\n this.code = code;\n }\n}\n\n/** A question to send: the absolute name and the record type. */\nexport interface DnsRequest {\n name: WireName;\n rdtype: number;\n /** The type as text (`TXT`). */\n rdtypeText: string;\n}\n\n/** What one nameserver said about one question. */\nexport type NameserverOutcome =\n | { kind: 'answer'; records: string[] }\n | { kind: 'nxdomain' }\n | { kind: 'noanswer' }\n | { kind: 'rcode'; rcode: number }\n | { kind: 'invalid'; error: unknown };\n\n/** A configured nameserver (dnspython's `dns.nameserver.Nameserver`). */\nexport abstract class Nameserver {\n abstract kind(): string;\n abstract toString(): string;\n /** The port answers come from. */\n abstract answerPort(): number;\n /** Whether every query uses a stream transport (no UDP truncation). */\n isAlwaysMaxSize(): boolean {\n return false;\n }\n /** Ask one question. Transport failures throw; DNS-level results are returned. */\n abstract query(\n request: DnsRequest,\n timeout: number,\n ): Promise<NameserverOutcome>;\n}\n\n/** Records to text with duplicates removed, like a dnspython rdataset. */\nfunction uniqueRecords(\n texts: readonly string[],\n caseInsensitive: boolean,\n): string[] {\n const seen = new Set<string>();\n const unique: string[] = [];\n for (const text of texts) {\n const key = caseInsensitive ? text.toLowerCase() : text;\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(text);\n }\n }\n return unique;\n}\n\n/** A name as c-ares prints it, made absolute like dnspython prints it. */\nfunction absoluteName(name: string): string {\n if (name === '' || name.endsWith('.')) {\n return name === '' ? '.' : name;\n }\n return `${name}.`;\n}\n\n/** Text of a TXT/CAA string node:dns returned (c-ares gives one char per byte). */\nfunction quotedString(value: string): string {\n return `\"${escapifyString(Uint8Array.from(Buffer.from(value, 'latin1')))}\"`;\n}\n\ninterface MxRecord {\n priority: number;\n exchange: string;\n}\ninterface SrvRecord {\n priority: number;\n weight: number;\n port: number;\n name: string;\n}\ninterface SoaRecord {\n nsname: string;\n hostmaster: string;\n serial: number;\n refresh: number;\n retry: number;\n expire: number;\n minttl: number;\n}\ninterface CaaRecord {\n critical: number;\n [tag: string]: string | number;\n}\n\nfunction caaToText(record: CaaRecord): string {\n const tag = Object.keys(record).find(key => key !== 'critical') ?? '';\n return `${record.critical} ${tag} ${quotedString(String(record[tag] ?? ''))}`;\n}\n\n/** Format what `Resolver.resolve()` returned as dnspython's rdata text. */\nfunction nodeRecordsToText(rdtype: string, result: unknown): string[] {\n switch (rdtype) {\n case 'A': {\n return uniqueRecords(result as string[], false);\n }\n case 'AAAA': {\n return uniqueRecords(\n (result as string[]).map(address => ipv6Ntoa(ipv6Aton(address))),\n false,\n );\n }\n case 'CNAME':\n case 'NS':\n case 'PTR': {\n return uniqueRecords((result as string[]).map(absoluteName), true);\n }\n case 'MX': {\n return uniqueRecords(\n (result as MxRecord[]).map(\n mx => `${mx.priority} ${absoluteName(mx.exchange)}`,\n ),\n true,\n );\n }\n case 'SRV': {\n return uniqueRecords(\n (result as SrvRecord[]).map(\n srv =>\n `${srv.priority} ${srv.weight} ${srv.port} ${absoluteName(srv.name)}`,\n ),\n true,\n );\n }\n case 'SOA': {\n const soa = result as SoaRecord;\n return [\n [\n absoluteName(soa.nsname),\n absoluteName(soa.hostmaster),\n soa.serial,\n soa.refresh,\n soa.retry,\n soa.expire,\n soa.minttl,\n ].join(' '),\n ];\n }\n case 'TXT': {\n return uniqueRecords(\n (result as string[][]).map(chunks =>\n chunks.map(quotedString).join(' '),\n ),\n false,\n );\n }\n case 'CAA': {\n return uniqueRecords((result as CaaRecord[]).map(caaToText), false);\n }\n default: {\n throw new DNSException(`Unsupported record type ${rdtype}`);\n }\n }\n}\n\nfunction errorCode(error: unknown): string | null {\n if (typeof error === 'object' && error !== null && 'code' in error) {\n const { code } = error as { code: unknown };\n return typeof code === 'string' ? code : null;\n }\n return null;\n}\n\nconst SOCKET_ERROR_MESSAGES: Readonly<Record<string, string>> = Object.freeze({\n ECONNREFUSED: 'Connection refused',\n ECONNRESET: 'Connection reset by peer',\n EOF: 'Connection closed',\n});\n\n/** Plain DNS over UDP/TCP port 53 (dnspython's `Do53Nameserver`), through `node:dns`. */\nexport class Do53Nameserver extends Nameserver {\n readonly address: string;\n readonly port: number;\n\n constructor(address: string, port: number = DO53_PORT) {\n super();\n this.address = address;\n this.port = port;\n }\n\n kind(): string {\n return 'Do53';\n }\n\n toString(): string {\n return `${this.kind()}:${this.address}@${this.port}`;\n }\n\n answerPort(): number {\n return this.port;\n }\n\n /**\n * c-ares can't serve these like dnspython: it drops an IPv6 `%scope`\n * (dnspython sends to the scoped address), and Bun's c-ares binding\n * decodes TXT/CAA strings as UTF-8, losing the raw bytes the `\\DDD`\n * escapes need. Those queries go out as wire-format UDP (TCP when\n * truncated), the way dnspython sends every Do53 query.\n */\n private usesWirePath(request: DnsRequest): boolean {\n return (\n this.address.includes('%') ||\n (IS_BUN && BYTE_STRING_RDTYPES.has(request.rdtypeText))\n );\n }\n\n private async queryWire(\n request: DnsRequest,\n timeoutMs: number,\n ): Promise<NameserverOutcome> {\n const deadline = Date.now() + timeoutMs;\n const query = buildQuery(request);\n let response = await udpExchange(query, this.address, this.port, timeoutMs);\n if ((response.flags & FLAG_TC) !== 0) {\n // dnspython raises Truncated and the resolver retries over TCP.\n const wire = await streamExchange(\n () => netConnect({ host: this.address, port: this.port }),\n 'connect',\n query.wire,\n Math.max(1, deadline - Date.now()),\n );\n response = decodeMessage(wire);\n checkResponse(query, response);\n }\n return wireOutcome(response);\n }\n\n private server(): string {\n if (this.port === DO53_PORT) {\n return this.address;\n }\n return isIPv6(this.address)\n ? `[${this.address}]:${this.port}`\n : `${this.address}:${this.port}`;\n }\n\n async query(\n request: DnsRequest,\n timeout: number,\n ): Promise<NameserverOutcome> {\n const timeoutMs = Math.max(1, Math.ceil(timeout * MS_PER_SECOND));\n if (this.usesWirePath(request)) {\n return this.queryWire(request, timeoutMs);\n }\n // One try per attempt: the failover and lifetime logic is the\n // resolver's, as in dnspython. c-ares still retries over TCP when a UDP\n // answer is truncated.\n const resolver = new Resolver({ timeout: timeoutMs, tries: 1 });\n resolver.setServers([this.server()]);\n // Our own timer bounds the query at exactly `timeout`, like dnspython:\n // c-ares' timeout is per attempt and Bun rounds it up to whole seconds.\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timedOut = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n resolver.cancel();\n reject(new DNSTimeout());\n }, timeoutMs);\n });\n const name = nameToText(request.name).replace(/\\.$/u, '');\n try {\n const result: unknown = await Promise.race([\n resolver.resolve(name, request.rdtypeText),\n timedOut,\n ]);\n return {\n kind: 'answer',\n records: nodeRecordsToText(request.rdtypeText, result),\n };\n } catch (error) {\n return mapNodeError(error);\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\nfunction mapNodeError(error: unknown): NameserverOutcome {\n const code = errorCode(error);\n switch (code) {\n case 'ENOTFOUND': {\n return { kind: 'nxdomain' };\n }\n case 'ENODATA': {\n return { kind: 'noanswer' };\n }\n case 'ESERVFAIL': {\n return { kind: 'rcode', rcode: RCODE.SERVFAIL };\n }\n case 'EREFUSED': {\n return { kind: 'rcode', rcode: RCODE.REFUSED };\n }\n case 'ENOTIMP': {\n return { kind: 'rcode', rcode: RCODE.NOTIMP };\n }\n case 'EFORMERR': {\n return { kind: 'rcode', rcode: RCODE.FORMERR };\n }\n case 'EBADRESP': {\n throw new DNSFormError();\n }\n case 'ETIMEOUT':\n case 'ECANCELLED': {\n throw new DNSTimeout();\n }\n case 'ECONNREFUSED':\n case 'ECONNRESET':\n case 'EOF': {\n throw new DNSSocketError(SOCKET_ERROR_MESSAGES[code] ?? code, code);\n }\n default: {\n throw error;\n }\n }\n}\n\n/** Outcome of a wire-format response that passed `checkResponse()`. */\nfunction wireOutcome(\n response: ReturnType<typeof decodeMessage>,\n): NameserverOutcome {\n if (response.rcode === RCODE.NOERROR) {\n let records: ReturnType<typeof resolveChaining>;\n try {\n records = resolveChaining(response);\n } catch (error) {\n return { kind: 'invalid', error };\n }\n if (records === null) {\n return { kind: 'noanswer' };\n }\n return { kind: 'answer', records: records.map(rdataToText) };\n }\n if (response.rcode === RCODE.NXDOMAIN) {\n try {\n resolveChaining(response);\n } catch (error) {\n return { kind: 'invalid', error };\n }\n return { kind: 'nxdomain' };\n }\n return { kind: 'rcode', rcode: response.rcode };\n}\n\nfunction buildQuery(request: DnsRequest): DnsQuery {\n return makeQuery(request.name, request.rdtype, randomMessageId());\n}\n\n/**\n * DNS over HTTPS (parsedmarc's `_SessionDoHNameserver`). Queries go through\n * the global `fetch`, which pools connections across queries.\n *\n * No `verify` option: parsedmarc's queries go through its shared httpx\n * client, whose certificate verification is always on (dnspython ignores\n * the nameserver's `verify` when a session is given). `fetch` always\n * verifies too.\n */\nexport class DoHNameserver extends Nameserver {\n readonly url: string;\n /** POST (dnspython's default) unless true. */\n readonly wantGet: boolean;\n\n constructor(url: string, wantGet: boolean = false) {\n super();\n this.url = url;\n this.wantGet = wantGet;\n }\n\n kind(): string {\n return 'DoH';\n }\n\n toString(): string {\n return redactUrlCredentials(this.url);\n }\n\n answerPort(): number {\n return urlSplit(this.url).port() ?? DOH_PORT;\n }\n\n override isAlwaysMaxSize(): boolean {\n return true;\n }\n\n async query(\n request: DnsRequest,\n timeout: number,\n ): Promise<NameserverOutcome> {\n // fetch quotes a URL it can't parse, or one with credentials, in its\n // error, which ends up in the resolution error's text.\n if (!URL.canParse(this.url)) {\n throw new TypeError(`Invalid URL: ${this.toString()}`);\n }\n const query = buildQuery(request);\n const headers: Record<string, string> = {\n accept: 'application/dns-message',\n };\n const split = splitUrlCredentials(this.url);\n if (split.authorization !== null) {\n headers.authorization = split.authorization;\n }\n let target = split.url;\n let init: RequestInit;\n if (this.wantGet) {\n const encoded = Buffer.from(query.wire).toString('base64url');\n const separator = target.includes('?') ? '&' : '?';\n target = `${target}${separator}dns=${encoded}`;\n init = { method: 'GET', headers };\n } else {\n headers['content-type'] = 'application/dns-message';\n init = { method: 'POST', headers, body: query.wire };\n }\n let body: Uint8Array;\n try {\n const response = await fetch(target, {\n ...init,\n // httpx clients do not follow redirects; a 3xx fails below\n redirect: 'manual',\n signal: AbortSignal.timeout(\n Math.max(1, Math.ceil(timeout * MS_PER_SECOND)),\n ),\n });\n if (response.status < 200 || response.status > 299) {\n await response.body?.cancel();\n throw new Error(\n `${this.toString()} responded with status code ${response.status}`,\n );\n }\n body = await readBody(response, MAX_MESSAGE_BYTES);\n } catch (error) {\n if (\n error instanceof Error &&\n (error.name === 'TimeoutError' || error.name === 'AbortError')\n ) {\n throw new DNSTimeout();\n }\n throw error;\n }\n const response = decodeMessage(body);\n checkResponse(query, response);\n return wireOutcome(response);\n }\n}\n\n/** DNS over TLS (dnspython's `DoTNameserver`), through `node:tls`. */\nexport class DoTNameserver extends Nameserver {\n readonly address: string;\n readonly port: number;\n /** TLS certificate identity (SNI and verification); `null` checks the chain only. */\n readonly hostname: string | null;\n\n constructor(\n address: string,\n port: number = DOT_PORT,\n hostname: string | null = null,\n ) {\n super();\n this.address = address;\n this.port = port;\n this.hostname = hostname;\n }\n\n kind(): string {\n return 'DoT';\n }\n\n toString(): string {\n return `${this.kind()}:${this.address}@${this.port}`;\n }\n\n answerPort(): number {\n return this.port;\n }\n\n override isAlwaysMaxSize(): boolean {\n return true;\n }\n\n async query(\n request: DnsRequest,\n timeout: number,\n ): Promise<NameserverOutcome> {\n const query = buildQuery(request);\n const wire = await this.exchange(query.wire, timeout);\n const response = decodeMessage(wire);\n checkResponse(query, response);\n return wireOutcome(response);\n }\n\n private exchange(wire: Uint8Array, timeout: number): Promise<Uint8Array> {\n const { hostname } = this;\n const options: ConnectionOptions = {\n host: this.address,\n port: this.port,\n ALPNProtocols: ['dot'],\n minVersion: 'TLSv1.2',\n // parsedmarc builds DoTNameserver with dnspython's default\n // `verify=True` and offers no way to turn it off.\n rejectUnauthorized: true,\n // dnspython checks the hostname only when one is given; without it\n // the certificate chain is still verified.\n checkServerIdentity: (_host: string, certificate: PeerCertificate) =>\n hostname === null\n ? undefined\n : checkServerIdentity(hostname, certificate),\n };\n if (hostname !== null) {\n options.servername = hostname;\n }\n return streamExchange(\n () => connect(options),\n 'secureConnect',\n wire,\n Math.max(1, timeout * MS_PER_SECOND),\n );\n }\n}\n\n/** Whether two addresses are the same, ignoring an IPv6 scope and spelling. */\nfunction sameAddress(a: string, b: string): boolean {\n if (a === b) {\n return true;\n }\n try {\n return Buffer.from(ipv6Aton(a, true)).equals(\n Buffer.from(ipv6Aton(b, true)),\n );\n } catch {\n return false;\n }\n}\n\n/**\n * One query over UDP (`dns.query.udp` with `ignore_unexpected` and\n * `ignore_errors`, as dnspython's resolver calls it): datagrams from other\n * sources, malformed ones and answers to other questions are skipped until\n * the timeout.\n */\nfunction udpExchange(\n query: DnsQuery,\n address: string,\n port: number,\n timeoutMs: number,\n): Promise<DnsMessage> {\n return new Promise<DnsMessage>((resolve, reject) => {\n const bareAddress = address.split('%')[0] ?? address;\n const socket = createSocket(isIPv6(bareAddress) ? 'udp6' : 'udp4');\n let settled = false;\n const finish = (error: Error | null, response?: DnsMessage): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n socket.close();\n if (error === null) {\n resolve(response as DnsMessage);\n } else {\n reject(error);\n }\n };\n const timer = setTimeout(() => finish(new DNSTimeout()), timeoutMs);\n socket.on('message', (data: Buffer, source: RemoteInfo) => {\n if (source.port !== port || !sameAddress(source.address, address)) {\n return;\n }\n let response: DnsMessage;\n try {\n response = decodeMessage(data);\n } catch {\n return;\n }\n if (isResponse(query, response)) {\n finish(null, response);\n }\n });\n socket.once('error', (error: Error) =>\n finish(new DNSSocketError(error.message, errorCode(error))),\n );\n socket.send(query.wire, port, address, (error: Error | null) => {\n if (error !== null) {\n finish(new DNSSocketError(error.message, errorCode(error)));\n }\n });\n });\n}\n\n/**\n * One length-prefixed query/response over a stream (RFC 1035 4.2.2), the\n * framing DNS over TCP and DNS over TLS share.\n */\nfunction streamExchange(\n open: () => Socket,\n readyEvent: 'connect' | 'secureConnect',\n wire: Uint8Array,\n timeoutMs: number,\n): Promise<Uint8Array> {\n return new Promise<Uint8Array>((resolve, reject) => {\n const socket = open();\n const chunks: Buffer[] = [];\n let received = 0;\n let settled = false;\n const finish = (error: Error | null, result?: Uint8Array): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n socket.destroy();\n if (error === null) {\n resolve(result as Uint8Array);\n } else {\n reject(error);\n }\n };\n const timer = setTimeout(() => finish(new DNSTimeout()), timeoutMs);\n socket.once(readyEvent, () => {\n const frame = Buffer.alloc(LENGTH_PREFIX_BYTES + wire.length);\n frame.writeUInt16BE(wire.length, 0);\n frame.set(wire, LENGTH_PREFIX_BYTES);\n socket.write(frame);\n });\n socket.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n received += chunk.length;\n if (received > LENGTH_PREFIX_BYTES + MAX_MESSAGE_BYTES) {\n finish(new DNSFormError('The DNS message is too big.'));\n return;\n }\n const data = Buffer.concat(chunks);\n if (data.length >= LENGTH_PREFIX_BYTES) {\n const length = data.readUInt16BE(0);\n if (data.length >= LENGTH_PREFIX_BYTES + length) {\n finish(\n null,\n Uint8Array.from(\n data.subarray(LENGTH_PREFIX_BYTES, LENGTH_PREFIX_BYTES + length),\n ),\n );\n }\n }\n });\n socket.once('end', () =>\n finish(new DNSSocketError('Connection closed', 'EOF')),\n );\n socket.once('error', (error: Error) =>\n finish(new DNSSocketError(error.message, errorCode(error))),\n );\n });\n}\n\n/**\n * The port of a parsed DNS over HTTPS or TLS nameserver URL (parsedmarc's\n * `_nameserver_port()`). urlsplit only validates the port when it is read,\n * and its error quotes the text it rejected: a password with an unencoded\n * `/`, `?` or `#` ends the authority early (RFC 3986 section 3.2), which\n * makes the start of the password that text. So a bad port is reported\n * with the entry's credentials masked and without the original error.\n *\n * Throws `InvalidNameserverError` (Python's `ValueError`) when the port is not an\n * integer from 0 to 65535.\n */\nfunction nameserverPort(\n entry: string,\n parts: SplitUrl,\n kind: string,\n): number | null {\n try {\n return parts.port();\n } catch {\n // Rethrown below, without the original error as its cause\n }\n throw new InvalidNameserverError(\n `Invalid ${kind} nameserver ${redactUrlCredentials(entry)}: the port is ` +\n 'not an integer from 0 to 65535 (percent-encode any /, ? or # in a ' +\n 'password)',\n );\n}\n\n/**\n * Parses a `tls://ip[:port][#hostname]` nameserver entry. The optional\n * `#hostname` names the TLS certificate identity used for SNI and\n * verification, matching systemd-resolved's syntax.\n *\n * Throws `InvalidNameserverError` (Python's `ValueError`) when the entry has no host, an\n * unusable port, a host that is not a literal IP address, or extra URL\n * components.\n */\nexport function parseDotNameserver(entry: string): DoTNameserver {\n const parts = urlSplit(entry);\n const port = nameserverPort(entry, parts, 'DNS over TLS');\n // The entry may carry userinfo, which is rejected below, so the messages\n // quote it with its credentials masked\n const shown = redactUrlCredentials(entry);\n if (parts.username || parts.path || parts.query) {\n // Catch tls://9.9.9.9/dns.quad9.net, a plausible slash-for-# typo that\n // would otherwise \"work\" with no certificate identity and fail only at\n // query time with an opaque TLS error\n throw new InvalidNameserverError(\n `Invalid DNS over TLS nameserver ${shown}: only ` +\n 'tls://ip[:port][#hostname] is supported — the TLS certificate ' +\n 'identity is given after #, not /',\n );\n }\n const address = parts.hostname;\n if (!address) {\n throw new InvalidNameserverError(\n `Invalid DNS over TLS nameserver ${shown}: missing IP address`,\n );\n }\n if (!isAddress(address)) {\n throw new InvalidNameserverError(\n `Invalid DNS over TLS nameserver ${shown}: ${address} is not an IP ` +\n 'address. Use tls://ip[:port][#hostname], where the optional ' +\n '#hostname is the TLS certificate identity of the server',\n );\n }\n const hostname = parts.fragment || null;\n if (hostname === null && !warnedDotWithoutHostname.has(entry)) {\n warnedDotWithoutHostname.add(entry);\n logger.warning(\n `DNS over TLS nameserver ${entry} has no #hostname: only the ` +\n 'certificate chain is verified, so any server with a publicly ' +\n 'trusted certificate for any name can answer. Use ' +\n 'tls://ip[:port]#hostname with the TLS certificate identity of the ' +\n 'server',\n );\n }\n return new DoTNameserver(address, port ?? DOT_PORT, hostname);\n}\n\n/** DoT entries already warned about (warn once per entry, not per query). */\nconst warnedDotWithoutHostname = new Set<string>();\n\n/**\n * Converts configured nameserver strings into resolver input: `https://`\n * entries become DNS over HTTPS nameservers, `tls://ip[:port][#hostname]`\n * entries DNS over TLS nameservers, and everything else (plain IPv4/IPv6\n * addresses) is passed through untouched, in the configured order.\n *\n * Throws `InvalidNameserverError` when a `tls://` entry is malformed, or an `https://`\n * entry has an unusable port.\n */\nexport function nameserversToResolverInput(\n nameservers: readonly string[],\n): (string | Nameserver)[] {\n const resolverInput: (string | Nameserver)[] = [];\n for (const entry of nameservers) {\n let parts: SplitUrl;\n try {\n // urlsplit lowercases the scheme, so HTTPS:// and TLS:// work too\n parts = urlSplit(entry);\n } catch {\n // e.g. an unbalanced IPv6 bracket; let the resolver reject it with\n // its own message about what a nameserver may be\n resolverInput.push(entry);\n continue;\n }\n if (parts.scheme === 'https') {\n // Validated now: the resolver reads the port only after a query\n // fails, and the error then quotes the rejected text\n nameserverPort(entry, parts, 'DNS over HTTPS');\n resolverInput.push(new DoHNameserver(entry));\n } else if (parts.scheme === 'tls') {\n resolverInput.push(parseDotNameserver(entry));\n } else {\n resolverInput.push(entry);\n }\n }\n return resolverInput;\n}\n\n/**\n * Turns resolver input into nameservers (dnspython's\n * `Resolver._enrich_nameservers`). Throws `InvalidNameserverError` for a string that is\n * neither an IP address nor an `https://` URL.\n */\nexport function enrichNameservers(\n input: readonly (string | Nameserver)[],\n): Nameserver[] {\n return input.map(nameserver => {\n if (nameserver instanceof Nameserver) {\n return nameserver;\n }\n if (isAddress(nameserver)) {\n return new Do53Nameserver(nameserver, DO53_PORT);\n }\n let scheme = '';\n try {\n ({ scheme } = urlSplit(nameserver));\n } catch {\n scheme = '';\n }\n if (scheme !== 'https') {\n throw new InvalidNameserverError(\n `nameserver ${nameserver} is not a dns.nameserver.Nameserver instance ` +\n 'or text form, IP address, nor a valid https URL',\n );\n }\n return new DoHNameserver(nameserver);\n });\n}\n\n/** Failures that take a nameserver out of the mix (dnspython's `query_result`). */\nfunction isNameserverBroken(error: unknown): boolean {\n return error instanceof DNSFormError || error instanceof DNSSocketError;\n}\n\nexport interface ResolveOptions {\n /** Per-attempt timeout, in seconds (dnspython's `Resolver.timeout`). */\n timeout: number;\n /** Overall budget, in seconds (dnspython's `Resolver.lifetime`). */\n lifetime: number;\n}\n\nfunction nowSeconds(): number {\n return performance.now() / MS_PER_SECOND;\n}\n\n/**\n * Resolve one question against `nameservers` (dnspython's\n * `Resolver.resolve()` for an absolute name, without search lists or a\n * resolver cache). Returns the answer records as text.\n */\nexport async function resolve(\n qname: string,\n rdtypeText: string,\n nameservers: readonly Nameserver[],\n options: ResolveOptions,\n): Promise<string[]> {\n const name = nameFromText(qname);\n const rdtype = rdatatypeFromText(rdtypeText);\n const request: DnsRequest = { name, rdtype, rdtypeText };\n const question = questionToText({ name, rdtype, rdclass: RDATACLASS_IN });\n const start = nowSeconds();\n const usable = [...nameservers];\n let current = [...usable];\n const errors: ResolutionError[] = [];\n let backoff = INITIAL_BACKOFF;\n for (;;) {\n let wait = 0;\n if (current.length === 0) {\n if (usable.length === 0) {\n // Out of things to try!\n throw new NoNameservers(question, errors);\n }\n current = [...usable];\n wait = backoff;\n backoff = Math.min(backoff * 2, MAX_BACKOFF);\n }\n const nameserver = current.shift() as Nameserver;\n if (wait > 0) {\n await sleep(wait * MS_PER_SECOND);\n }\n const duration = nowSeconds() - start;\n if (duration >= options.lifetime) {\n throw new LifetimeTimeout(duration, errors);\n }\n const timeout = Math.min(options.lifetime - duration, options.timeout);\n const record = (error: unknown): void => {\n errors.push({\n nameserver: nameserver.toString(),\n tcp: nameserver.isAlwaysMaxSize(),\n port: nameserver.answerPort(),\n error,\n });\n };\n const remove = (): void => {\n usable.splice(usable.indexOf(nameserver), 1);\n };\n let outcome: NameserverOutcome;\n try {\n outcome = await nameserver.query(request, timeout);\n } catch (error) {\n record(error);\n if (isNameserverBroken(error)) {\n remove();\n }\n continue;\n }\n switch (outcome.kind) {\n case 'answer': {\n return outcome.records;\n }\n case 'noanswer': {\n throw new NoAnswer(question);\n }\n case 'nxdomain': {\n throw new NXDOMAIN([nameToText(name)]);\n }\n case 'invalid': {\n record(outcome.error);\n remove();\n break;\n }\n case 'rcode': {\n if (outcome.rcode === RCODE.YXDOMAIN) {\n const error = new YXDOMAIN();\n record(error);\n throw error;\n }\n // dnspython's retry_servfail is off, so SERVFAIL also removes it.\n remove();\n record(rcodeToText(outcome.rcode));\n break;\n }\n default: {\n throw new Error('unreachable');\n }\n }\n }\n}\n\n/** Errors `queryDns()` retries (parsedmarc's `_RETRYABLE_DNS_ERRORS`). */\nfunction isRetryable(error: unknown): boolean {\n return (\n error instanceof LifetimeTimeout ||\n error instanceof NoNameservers ||\n error instanceof DNSSocketError\n );\n}\n\nexport interface DnsQueryOptions {\n /** Cache storage. */\n cache?: DnsCache | null;\n /**\n * Nameservers to use (Cloudflare's public resolvers by default). Each\n * entry is an IP address (DNS over UDP/TCP port 53), an `https://` URL\n * (DNS over HTTPS) or `tls://ip[:port][#hostname]` (DNS over TLS, port\n * 853 by default, `#hostname` naming the server's TLS certificate\n * identity). Pass `RECOMMENDED_DNS_NAMESERVERS` for a cross-provider mix.\n */\n nameservers?: readonly string[] | null;\n /**\n * Overall DNS lifetime budget in seconds per configured nameserver.\n * Per-query attempts are capped at `min(1, timeout)` so a lost UDP packet\n * is retried within the lifetime, and a slow nameserver falls through to\n * the next quickly.\n */\n timeout?: number;\n /**\n * Times to retry the whole query after a timeout or other transient error\n * (`LifetimeTimeout`, `NoNameservers`, `DNSSocketError`).\n */\n retries?: number;\n}\n\n/**\n * Whether a cache would be used. parsedmarc tests `if cache:`, and an empty\n * ExpiringDict is falsy, so a fresh (empty) cache is neither read nor\n * written: it only fills once something else put an entry in it. Kept as\n * is for 1:1 behavior.\n */\nfunction cacheIsUsable(cache: DnsCache | null | undefined): cache is DnsCache {\n return cache !== null && cache !== undefined && cache.size > 0;\n}\n\n/**\n * Queries DNS and returns the answers as text. Throws\n * `InvalidNameserverError` (a `RangeError`) when a\n * nameserver is malformed, with the nameservers' URL credentials masked.\n */\nexport async function queryDns(\n domain: string,\n recordType: string,\n options: DnsQueryOptions = {},\n): Promise<string[]> {\n const name = String(domain).toLowerCase();\n const rdtype = recordType.toUpperCase();\n const cacheKey = `${name}_${rdtype}`;\n const { cache } = options;\n if (cacheIsUsable(cache)) {\n const cachedRecords = cache.get(cacheKey);\n if (Array.isArray(cachedRecords)) {\n return cachedRecords;\n }\n }\n\n const nameservers = options.nameservers ?? DEFAULT_NAMESERVERS;\n const timeout = Number(options.timeout ?? DEFAULT_DNS_TIMEOUT);\n const retries = options.retries ?? DEFAULT_DNS_MAX_RETRIES;\n let resolverNameservers: Nameserver[];\n try {\n resolverNameservers = enrichNameservers(\n nameserversToResolverInput(nameservers),\n );\n } catch (error) {\n if (!(error instanceof InvalidNameserverError)) {\n throw error;\n }\n // The resolver's own rejection quotes the entry as configured\n // (\"nameserver https://user:pw@[x is not ...\"), credentials and all;\n // the masked error has no cause that would keep the original.\n throw new InvalidNameserverError(\n maskNameserverSecrets(error.message, nameservers),\n );\n }\n // Cap the per-query timeout at 1s so a dropped UDP datagram is retried\n // within the lifetime instead of consuming the whole budget (dig's\n // default +tries=3 masks this case). With multiple nameservers the same\n // cap lets a slow or broken one fall through.\n const resolveOptions: ResolveOptions = {\n timeout: Math.min(MAX_PER_QUERY_TIMEOUT, timeout),\n lifetime:\n resolverNameservers.length > 1\n ? timeout * resolverNameservers.length\n : timeout,\n };\n let answers: string[];\n for (let attempt = 0; ;) {\n try {\n answers = await resolve(\n name,\n rdtype,\n resolverNameservers,\n resolveOptions,\n );\n break;\n } catch (error) {\n if (!isRetryable(error)) {\n throw error;\n }\n attempt += 1;\n if (attempt > retries) {\n throw error;\n }\n }\n }\n const records = answers.map(answer =>\n pyRStrip(answer.replaceAll('\"', ''), '.'),\n );\n if (cacheIsUsable(cache)) {\n cache.set(cacheKey, records);\n }\n return records;\n}\n\nexport interface GetReverseDnsOptions extends DnsQueryOptions {\n /** Called with the DNS error when there is one, before returning `null`. */\n onError?: (error: DNSException) => void;\n}\n\n/**\n * Resolves an IP address to a hostname using a reverse DNS query. Returns\n * `null` on any DNS error.\n */\nexport async function getReverseDns(\n ipAddress: string,\n options: GetReverseDnsOptions = {},\n): Promise<string | null> {\n let hostname: string | null = null;\n try {\n const address = reverseNameFromAddress(ipAddress);\n const records = await queryDns(address, 'PTR', options);\n hostname = records[0] ?? null;\n } catch (error) {\n if (!(error instanceof DNSException)) {\n throw error;\n }\n options.onError?.(error);\n // LifetimeTimeout and NoNameservers quote each nameserver URL\n const message = maskNameserverSecrets(error.message, options.nameservers);\n logger.debug(\n `get_reverse_dns(${sanitizeForLog(ipAddress)}) exception: ${sanitizeForLog(message)}`,\n );\n }\n return hostname;\n}\n","// How Python's maxminddb reads an IP address string: through the C\n// library's numeric getaddrinfo(), which accepts the classic inet_aton forms\n// for IPv4 (\"1.2.3\" is 1.2.0.3, \"010.1.1.1\" is octal, \"0x7f.1\" is hex) and\n// standard IPv6. The `maxmind` npm package parses addresses differently, so\n// lookups go through `numericHost()` first to get the same address.\n\nimport { isIPv6 } from 'node:net';\n\nimport { PyTypeError, PyValueError } from '../internal/py';\n\nconst DECIMAL = /^[1-9]\\d*$|^0$/u;\nconst OCTAL = /^0[0-7]+$/u;\nconst HEX = /^0[xX][0-9a-fA-F]*$/u;\n\nfunction parsePart(part: string): number | null {\n if (DECIMAL.test(part)) {\n return Number(part);\n }\n if (OCTAL.test(part)) {\n return Number.parseInt(part.slice(1), 8);\n }\n if (HEX.test(part)) {\n return part.length === 2 ? 0 : Number.parseInt(part.slice(2), 16);\n }\n return null;\n}\n\n/** glibc's exact `inet_aton()`: dotted quad, or `null` when invalid. */\nexport function inetAton(text: string): string | null {\n const parts = text.split('.');\n if (parts.length > 4) {\n return null;\n }\n const values: number[] = [];\n for (const part of parts) {\n const value = parsePart(part);\n if (value === null) {\n return null;\n }\n values.push(value);\n }\n const last = values.pop() ?? 0;\n if (values.some(value => value > 255)) {\n return null;\n }\n const lastBytes = 4 - values.length;\n if (last >= 2 ** (8 * lastBytes)) {\n return null;\n }\n const bytes = [...values];\n for (let index = lastBytes - 1; index >= 0; index -= 1) {\n bytes.push(Math.floor(last / 2 ** (8 * index)) % 256);\n }\n return bytes.join('.');\n}\n\n/**\n * The address maxminddb would look up for `ip`, or Python's `ValueError`\n * (`'<ip>' does not appear to be an IPv4 or IPv6 address.`) when it isn't one.\n * maxminddb's C extension quotes the text verbatim (no `repr()` escaping)\n * and rejects a NUL with a `TypeError` before parsing.\n */\nexport function numericHost(ip: string): string {\n if (ip.includes('\\0')) {\n throw new PyTypeError('argument 1 contains an embedded null character');\n }\n const ipv4 = inetAton(ip);\n if (ipv4 !== null) {\n return ipv4;\n }\n if (isIPv6(ip)) {\n return ip;\n }\n throw new PyValueError(\n `'${ip}' does not appear to be an IPv4 or IPv6 address.`,\n );\n}\n","// IP address enrichment, ported from parsedmarc/utils.py: the IP database\n// (`load_ip_db`, `_get_ip_database_path`, `get_ip_address_db_record`,\n// `get_ip_address_country`), the IPinfo Lite API (`configure_ipinfo_api`,\n// `_ipinfo_api_lookup`, `_normalize_ip_record`), the reverse DNS map\n// (`load_reverse_dns_map`, `get_service_from_reverse_dns_base_domain`) and\n// `get_ip_address_info`.\n\nimport { randomUUID } from 'node:crypto';\nimport { existsSync, statSync } from 'node:fs';\nimport {\n chmod,\n lstat,\n mkdir,\n readFile,\n rename,\n rm,\n stat,\n writeFile,\n} from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { Reader, type Response as MmdbResponse } from 'maxmind';\n\nimport type { IPAddressCache, ParserConfig } from '../config';\nimport {\n DEFAULT_DNS_MAX_RETRIES,\n DEFAULT_DNS_TIMEOUT,\n USER_AGENT,\n} from '../constants';\nimport { InvalidIPinfoAPIKey, IPDatabaseError } from '../errors';\nimport { getLogger, logger } from '../log';\nimport type { IPAddressInfo, ReverseDNSMap, ReverseDNSService } from '../types';\nimport { readCsvDicts, type CsvDictRow } from './csv-reader';\nimport { getReverseDns } from './dns';\nimport { NoAnswer, NXDOMAIN, type DNSException } from './dns-errors';\nimport { getBaseDomain, loadPslOverrides } from './domains';\nimport {\n describeHttpError,\n HTTPError,\n httpGet,\n InvalidURL,\n redactUrl,\n} from './http';\nimport { numericHost } from './numeric-host';\nimport { pyStrip } from './py-str';\nimport { getBundledIpDbPath, getResourcePath } from './resources';\n\nconst DEFAULT_IP_DB_URL =\n 'https://github.com/domainaware/parsedmarc/raw/refs/heads/master/parsedmarc/resources/ipinfo/ipinfo_lite.mmdb';\nconst DEFAULT_REVERSE_DNS_MAP_URL =\n 'https://raw.githubusercontent.com/domainaware/parsedmarc/master/parsedmarc/resources/maps/base_reverse_dns_map.csv';\n\nconst DOWNLOAD_TIMEOUT_SECONDS = 60;\nconst MAX_IP_DB_BYTES = 512 * 1024 * 1024;\nconst MAX_REVERSE_DNS_MAP_BYTES = 64 * 1024 * 1024;\nconst MAX_IPINFO_RESPONSE_BYTES = 1024 * 1024;\nconst CACHE_DIRECTORY_NAME = 'tsdmarc';\nconst IP_DB_FILE_NAME = 'ipinfo_lite.mmdb';\nconst UNIVERSAL_NEWLINE = /\\r\\n?/gu;\nconst IP_DB_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\n\n/**\n * Module-level state the loaders write (parsedmarc's `_IP_DB_PATH`,\n * `_LAST_LOGGED_IP_DB_PATH` and `_IPINFO_API_TOKEN` globals). Exposed so a\n * CLI can snapshot and restore it around a configuration reload.\n */\nexport interface IpInfoState {\n /** The database selected by `loadIpDb()` (downloaded, cached or bundled). */\n ipDbPath: string | null;\n /** The last database path logged, so the selection is logged when it changes. */\n lastLoggedIpDbPath: string | null;\n /** IPinfo Lite API token; `null` disables the API. */\n ipinfoApiToken: string | null;\n}\n\nexport const ipInfoState: IpInfoState = {\n ipDbPath: null,\n lastLoggedIpDbPath: null,\n ipinfoApiToken: null,\n};\n\n/** The IPinfo Lite REST API. Authentication uses the documented `?token=` query parameter. */\nexport const IPINFO_API_URL = 'https://api.ipinfo.io/lite';\n/** IPinfo API request timeout, in seconds. */\nexport const IPINFO_API_TIMEOUT = 5.0;\n\n/** Country and ASN fields of an IP address. */\nexport interface IPDatabaseRecord {\n country: string | null;\n asn: number | null;\n asName: string | null;\n asDomain: string | null;\n}\n\nexport interface LoadIpDbOptions {\n /** Always use a local/bundled database file. */\n alwaysUseLocalFile?: boolean;\n /** Path to a local MMDB file. */\n localFilePath?: string | null;\n /** URL to the MMDB database file. */\n url?: string | null;\n /** Do not make online requests. */\n offline?: boolean;\n}\n\nfunction isFile(filePath: string): boolean {\n try {\n return statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * The per-user directory downloads are cached in: `$XDG_CACHE_HOME/tsdmarc`\n * or `~/.cache/tsdmarc` (`%LOCALAPPDATA%\\tsdmarc` on Windows), falling back\n * to `<tmpdir>/tsdmarc-<uid>`. parsedmarc uses a shared\n * `<tmpdir>/parsedmarc`, where another local user could plant the file or a\n * symlink.\n */\nfunction cacheDirectory(): string {\n const xdgCacheHome = process.env.XDG_CACHE_HOME;\n if (xdgCacheHome && path.isAbsolute(xdgCacheHome)) {\n return path.join(xdgCacheHome, CACHE_DIRECTORY_NAME);\n }\n if (process.platform === 'win32' && process.env.LOCALAPPDATA) {\n return path.join(process.env.LOCALAPPDATA, CACHE_DIRECTORY_NAME);\n }\n let home = '';\n try {\n home = os.homedir();\n } catch {\n // No home directory (some service accounts): use the temp fallback.\n }\n if (home) {\n return path.join(home, '.cache', CACHE_DIRECTORY_NAME);\n }\n const uid = process.getuid?.() ?? 'user';\n return path.join(os.tmpdir(), `${CACHE_DIRECTORY_NAME}-${uid}`);\n}\n\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst GROUP_OTHER_BITS = 0o077;\n\n/**\n * Throws unless `directory` is a real directory (not a symlink) owned by\n * this user and closed to group/others. Fixes the mode of our own\n * directory when it is too open.\n */\nasync function checkCacheDirectory(directory: string): Promise<void> {\n const info = await lstat(directory);\n if (!info.isDirectory()) {\n throw new Error(`Cache path is not a directory: ${directory}`);\n }\n const uid = process.getuid?.();\n if (uid === undefined) {\n return; // Windows: no POSIX owner/mode to check.\n }\n if (info.uid !== uid) {\n throw new Error(`Cache directory is owned by another user: ${directory}`);\n }\n if ((info.mode & GROUP_OTHER_BITS) !== 0) {\n await chmod(directory, PRIVATE_DIRECTORY_MODE);\n }\n}\n\n/** The cache directory, created private and checked. */\nasync function ensureCacheDirectory(): Promise<string> {\n const directory = cacheDirectory();\n await mkdir(directory, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n await checkCacheDirectory(directory);\n return directory;\n}\n\n/** A cached file, only from a directory that passes the checks. */\nasync function existingCachedFile(fileName: string): Promise<string | null> {\n const directory = cacheDirectory();\n try {\n await checkCacheDirectory(directory);\n } catch {\n return null;\n }\n const filePath = path.join(directory, fileName);\n return isFile(filePath) ? filePath : null;\n}\n\n/** Write `data` to `filePath` through a fresh, uniquely named temp file. */\nasync function writeFileAtomically(\n filePath: string,\n data: Uint8Array,\n): Promise<void> {\n const tmpPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await writeFile(tmpPath, data, { flag: 'wx', mode: 0o600 });\n await rename(tmpPath, filePath);\n } catch (error) {\n await rm(tmpPath, { force: true });\n throw error;\n }\n}\n\n/** Throws unless `body` opens as a MMDB database. */\nfunction assertValidIpDb(body: Uint8Array): void {\n try {\n const buffer = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n new Reader<MmdbResponse>(buffer);\n } catch (error) {\n throw new Error(\n `Downloaded file is not a valid MMDB database: ${(error as Error).message}`,\n );\n }\n}\n\n/**\n * Downloads the IP-to-country MMDB database from a URL and caches it\n * locally. An existing `localFilePath` is used as-is, with no download. On\n * download failure (or when offline), a previously cached download is used\n * if available, falling back to the bundled copy from `@tsdmarc/ipinfo-lite`.\n * A download that isn't a MMDB database counts as a failure: parsedmarc\n * saves it over the cached copy, and every lookup fails from then on.\n */\nexport async function loadIpDb(options: LoadIpDbOptions = {}): Promise<void> {\n const url = options.url ?? DEFAULT_IP_DB_URL;\n const localFilePath = options.localFilePath ?? null;\n\n if (localFilePath !== null && isFile(localFilePath)) {\n ipInfoState.ipDbPath = localFilePath;\n logger.info(`Using local IP database at ${localFilePath}`);\n return;\n }\n\n if (!(options.offline || options.alwaysUseLocalFile)) {\n try {\n logger.debug(`Trying to fetch IP database from ${redactUrl(url)}...`);\n const response = await httpGet(url, {\n headers: { 'User-Agent': USER_AGENT },\n timeout: DOWNLOAD_TIMEOUT_SECONDS,\n maxBytes: MAX_IP_DB_BYTES,\n });\n response.raiseForStatus();\n assertValidIpDb(response.body);\n const cachedPath = path.join(\n await ensureCacheDirectory(),\n IP_DB_FILE_NAME,\n );\n await writeFileAtomically(cachedPath, response.body);\n ipInfoState.ipDbPath = cachedPath;\n logger.info('IP database updated successfully');\n return;\n } catch (error) {\n if (error instanceof HTTPError || error instanceof InvalidURL) {\n logger.warning(\n `Failed to fetch IP database: ${describeHttpError(error)}`,\n );\n } else {\n logger.warning(\n `Failed to save IP database: ${(error as Error).message}`,\n );\n }\n }\n }\n\n // Fall back to a previously cached copy if available\n const cachedPath = await existingCachedFile(IP_DB_FILE_NAME);\n if (cachedPath !== null) {\n ipInfoState.ipDbPath = cachedPath;\n logger.info('Using cached IP database');\n return;\n }\n\n // Final fallback: bundled copy\n const bundledPath = await getBundledIpDbPath();\n if (bundledPath === null) {\n logger.warning(\n 'No bundled IP database found; install @tsdmarc/ipinfo-lite or set ip_db_path',\n );\n return;\n }\n ipInfoState.ipDbPath = bundledPath;\n logger.info('Using bundled IP database');\n}\n\n/**\n * Configure the IPinfo Lite REST API as the primary source for IP lookups.\n *\n * With a token, `getIpAddressDbRecord()` queries the API first and falls\n * back to the MMDB on network errors or non-2xx responses. An invalid token\n * raises `InvalidIPinfoAPIKey`.\n *\n * With `probe` (the default), the token is verified by looking up\n * `1.1.1.1`: a 401/403 raises `InvalidIPinfoAPIKey`; other errors are\n * logged and the token is still accepted so per-request fallback can take\n * over.\n */\nexport async function configureIpinfoApi(\n token: string | null,\n options: { probe?: boolean } = {},\n): Promise<void> {\n ipInfoState.ipinfoApiToken = token || null;\n\n if (!ipInfoState.ipinfoApiToken || options.probe === false) {\n return;\n }\n\n // ipinfoApiLookup() raises InvalidIPinfoAPIKey on 401/403 (which must\n // propagate) and returns null on any other failure.\n if ((await ipinfoApiLookup('1.1.1.1')) === null) {\n logger.warning('IPinfo API probe failed (will fall back per-request)');\n } else {\n logger.info('IPinfo API configured');\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Look up an IP via the IPinfo Lite REST API. Returns `null` when no token\n * is configured, on network error, on a malformed response body, or on any\n * non-2xx response other than 401/403, which raise `InvalidIPinfoAPIKey`.\n */\nexport async function ipinfoApiLookup(\n ipAddress: string,\n): Promise<IPDatabaseRecord | null> {\n const token = ipInfoState.ipinfoApiToken;\n if (!token) {\n return null;\n }\n\n const url = `${IPINFO_API_URL}/${encodeURIComponent(ipAddress)}`;\n let response: Awaited<ReturnType<typeof httpGet>>;\n try {\n response = await httpGet(url, {\n headers: { 'User-Agent': USER_AGENT, Accept: 'application/json' },\n params: { token },\n timeout: IPINFO_API_TIMEOUT,\n maxBytes: MAX_IPINFO_RESPONSE_BYTES,\n });\n } catch (error) {\n if (!(error instanceof HTTPError)) {\n throw error;\n }\n logger.debug(\n `IPinfo API request for ${ipAddress} failed: ${error.message}`,\n );\n return null;\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new InvalidIPinfoAPIKey(\n `IPinfo API rejected the configured token (HTTP ${response.status})`,\n );\n }\n if (!response.isSuccess) {\n logger.debug(\n `IPinfo API returned HTTP ${response.status} for ${ipAddress}`,\n );\n return null;\n }\n\n let payload: unknown;\n try {\n payload = response.json();\n } catch {\n logger.debug(`IPinfo API returned non-JSON for ${ipAddress}`);\n return null;\n }\n if (!isPlainObject(payload)) {\n return null;\n }\n\n return normalizeIpRecord(payload);\n}\n\n// Python's str.isdigit() also accepts non-ASCII digits; real ASNs are ASCII.\nconst ASN_DIGITS_RE = /^[0-9]+$/u;\n\nfunction isPyInt(value: unknown): value is number {\n // Python's isinstance(x, int): JSON/MMDB integers (bool is not expected here).\n return typeof value === 'number' && Number.isInteger(value);\n}\n\n/**\n * Normalize an IPinfo / MaxMind / DBIP record to the internal shape: country\n * as ISO code, ASN as a plain number, AS name, AS domain lowercased.\n */\nexport function normalizeIpRecord(\n record: Record<string, unknown>,\n): IPDatabaseRecord {\n let country: string | null = null;\n let asn: number | null = null;\n let asName: string | null = null;\n let asDomain: string | null = null;\n\n let code = record.country_code;\n if (code === undefined || code === null) {\n const nested = record.country;\n if (isPlainObject(nested)) {\n code = nested.iso_code;\n }\n }\n if (typeof code === 'string') {\n country = code;\n }\n\n const rawAsn = record.asn;\n if (isPyInt(rawAsn)) {\n asn = rawAsn;\n } else if (typeof rawAsn === 'string' && rawAsn) {\n let digits = rawAsn;\n if (digits.startsWith('AS')) {\n digits = digits.slice(2);\n }\n if (digits.startsWith('as')) {\n digits = digits.slice(2);\n }\n if (ASN_DIGITS_RE.test(digits)) {\n asn = Number(digits);\n }\n }\n if (asn === null) {\n const mmAsn = record.autonomous_system_number;\n if (isPyInt(mmAsn)) {\n asn = mmAsn;\n }\n }\n\n const name = record.as_name || record.autonomous_system_organization;\n if (typeof name === 'string' && name) {\n asName = name;\n }\n const domain = record.as_domain;\n if (typeof domain === 'string' && domain) {\n asDomain = domain.toLowerCase();\n }\n\n return { country, asn, asName, asDomain };\n}\n\n// Last-resort fallbacks for unusual installs where the bundled database is\n// missing. Country-only databases (GeoLite2 / DBIP) lack the ASN fields\n// source attribution depends on, so an incidental system GeoIP file must\n// never shadow the managed database\n// (https://github.com/domainaware/parsedmarc/issues/810). To use MaxMind or\n// DBIP data deliberately, set the ip_db_path option.\nconst SYSTEM_DB_PATHS: readonly string[] = [\n 'ipinfo_lite.mmdb',\n 'GeoLite2-Country.mmdb',\n '/usr/local/share/GeoIP/GeoLite2-Country.mmdb',\n '/usr/share/GeoIP/GeoLite2-Country.mmdb',\n '/var/lib/GeoIP/GeoLite2-Country.mmdb',\n '/var/local/lib/GeoIP/GeoLite2-Country.mmdb',\n '/usr/local/var/GeoIP/GeoLite2-Country.mmdb',\n '%SystemDrive%\\\\ProgramData\\\\MaxMind\\\\GeoIPUpdate\\\\GeoIP\\\\GeoLite2-Country.mmdb',\n 'C:\\\\GeoIP\\\\GeoLite2-Country.mmdb',\n 'dbip-country-lite.mmdb',\n 'dbip-country.mmdb',\n];\n\nconst MISSING_BUNDLED_DB = path.join(\n 'node_modules',\n '@tsdmarc',\n 'ipinfo-lite',\n 'data',\n IP_DB_FILE_NAME,\n);\n\n/** Select the database file for a lookup (parsedmarc's `_get_ip_database_path`). */\nexport async function getIpDatabasePath(\n dbPath: string | null,\n): Promise<string> {\n let selected = dbPath;\n if (selected !== null && !isFile(selected)) {\n logger.warning(\n `No file exists at ${selected}. Falling back to an ` +\n 'included copy of the IPinfo IP to Country ' +\n 'Lite database.',\n );\n selected = null;\n }\n\n // The managed database takes precedence: the one selected by loadIpDb()\n // (downloaded, cached, or bundled), or the bundled copy directly for\n // library callers that never call loadIpDb().\n if (selected === null && ipInfoState.ipDbPath !== null) {\n selected = ipInfoState.ipDbPath;\n }\n\n if (selected === null) {\n const bundledPath =\n (await getBundledIpDbPath()) ?? path.resolve(MISSING_BUNDLED_DB);\n if (isFile(bundledPath)) {\n selected = bundledPath;\n } else {\n // Nothing found anywhere: keep the bundled path so the stat() below\n // throws an ENOENT error naming the expected install location.\n selected =\n SYSTEM_DB_PATHS.find(systemPath => existsSync(systemPath)) ??\n bundledPath;\n }\n }\n\n if (selected !== ipInfoState.lastLoggedIpDbPath) {\n // Log per selected path, not per lookup: this runs on every uncached\n // IP lookup and would flood debug output.\n logger.debug(`Using IP database at ${selected}`);\n ipInfoState.lastLoggedIpDbPath = selected;\n }\n\n const { mtimeMs } = await stat(selected);\n if (Date.now() - mtimeMs > IP_DB_MAX_AGE_MS) {\n logger.warning('IP database is more than a month old');\n }\n\n return selected;\n}\n\ninterface OpenReader {\n path: string;\n mtimeMs: number;\n size: number;\n reader: Reader<MmdbResponse>;\n}\n\n// parsedmarc opens the database on every lookup; reading a 25 MB file per\n// IP is too slow here, so the open reader is reused while the file is\n// unchanged.\nlet openReader: OpenReader | null = null;\n\n// The last file that failed to open: without this, every lookup would read\n// it again and warn again.\nlet unreadableDb: Omit<OpenReader, 'reader'> | null = null;\n\n/** The reader of a database file, or `null` when it can't be opened. */\nasync function getReader(dbPath: string): Promise<Reader<MmdbResponse> | null> {\n const { mtimeMs, size } = await stat(dbPath);\n if (\n openReader !== null &&\n openReader.path === dbPath &&\n openReader.mtimeMs === mtimeMs &&\n openReader.size === size\n ) {\n return openReader.reader;\n }\n if (\n unreadableDb !== null &&\n unreadableDb.path === dbPath &&\n unreadableDb.mtimeMs === mtimeMs &&\n unreadableDb.size === size\n ) {\n return null;\n }\n try {\n const reader = new Reader<MmdbResponse>(await readFile(dbPath));\n openReader = { path: dbPath, mtimeMs, size, reader };\n return reader;\n } catch (error) {\n unreadableDb = { path: dbPath, mtimeMs, size };\n logger.warning(\n `Could not open IP database ${dbPath}: ${(error as Error).message}`,\n );\n return null;\n }\n}\n\n/**\n * The reader for a lookup: the selected database, else the cached download,\n * else the bundled copy. parsedmarc raises from the lookup, which its\n * per-record handler turns into a report without those records.\n */\nasync function openIpDatabase(\n dbPath: string | null,\n): Promise<Reader<MmdbResponse>> {\n let selected: string;\n try {\n selected = await getIpDatabasePath(dbPath);\n } catch (error) {\n throw new IPDatabaseError((error as Error).message, {\n cause: error,\n code: (error as NodeJS.ErrnoException).code,\n });\n }\n const reader = await getReader(selected);\n if (reader !== null) {\n return reader;\n }\n const fallbacks = [\n await existingCachedFile(IP_DB_FILE_NAME),\n await getBundledIpDbPath(),\n ];\n for (const fallback of fallbacks) {\n if (fallback !== null && fallback !== selected && isFile(fallback)) {\n // oxlint-disable-next-line no-await-in-loop -- tried in order\n const fallbackReader = await getReader(fallback);\n if (fallbackReader !== null) {\n return fallbackReader;\n }\n }\n }\n throw new IPDatabaseError(\n `No usable IP database: could not open ${selected}`,\n );\n}\n\n/**\n * Look up an IP and return country and ASN fields.\n *\n * If the IPinfo Lite API is configured (`configureIpinfoApi()`), it is\n * queried first; any non-fatal failure falls through to the MMDB. An\n * invalid API token raises `InvalidIPinfoAPIKey`. MaxMind/DBIP\n * country-only databases carry only the country, so the ASN fields come\n * back `null` for them.\n */\nexport async function getIpAddressDbRecord(\n ipAddress: string,\n options: { dbPath?: string | null; skipApi?: boolean } = {},\n): Promise<IPDatabaseRecord> {\n // parsedmarc only finds out in the MMDB lookup, after asking the API: a\n // sender's source_ip of `me` returns the data of this host's own network.\n const address = numericHost(ipAddress);\n const apiRecord = options.skipApi ? null : await ipinfoApiLookup(ipAddress);\n if (apiRecord !== null) {\n return apiRecord;\n }\n\n const reader = await openIpDatabase(options.dbPath ?? null);\n const record: unknown = reader.get(address);\n if (!isPlainObject(record)) {\n return { country: null, asn: null, asName: null, asDomain: null };\n }\n return normalizeIpRecord(record);\n}\n\n/**\n * The ISO code of the country of an IPv4 or IPv6 address, or `null` when\n * unknown. `dbPath` is a MMDB file from IPinfo, MaxMind or DBIP.\n */\nexport async function getIpAddressCountry(\n ipAddress: string,\n options: { dbPath?: string | null } = {},\n): Promise<string | null> {\n return (await getIpAddressDbRecord(ipAddress, options)).country;\n}\n\nexport interface LoadReverseDnsMapOptions {\n /** Always use a local map file. */\n alwaysUseLocalFile?: boolean;\n /** Path to a local map file. */\n localFilePath?: string | null;\n /** URL to a reverse DNS map. */\n url?: string | null;\n /** Do not make online requests. */\n offline?: boolean;\n /** Path to a local PSL overrides file. */\n pslOverridesPath?: string | null;\n /** URL to a PSL overrides file. */\n pslOverridesUrl?: string | null;\n}\n\nfunction requiredField(row: CsvDictRow, key: string): string {\n if (!row.has(key)) {\n throw new Error(`KeyError: '${key}'`);\n }\n const value = row.get(key);\n if (typeof value !== 'string') {\n throw new TypeError(`'NoneType' object has no attribute 'strip'`);\n }\n return value;\n}\n\nfunction loadCsv(reverseDnsMap: ReverseDNSMap, text: string): void {\n for (const row of readCsvDicts(text)) {\n const key = pyStrip(requiredField(row, 'base_reverse_dns').toLowerCase());\n reverseDnsMap.set(key, {\n name: pyStrip(requiredField(row, 'name')),\n type: pyStrip(requiredField(row, 'type')),\n });\n }\n}\n\n/**\n * Loads the reverse DNS map from a URL or local file.\n *\n * Repopulates the given map in place. The URL is tried first; on\n * failure (or when `offline` / `alwaysUseLocalFile` is set) the local path\n * is used, defaulting to the bundled CSV. The PSL overrides are reloaded\n * first with the same flags, so map entries that depend on a folded base\n * domain resolve against the current overrides.\n *\n * parsedmarc clears the map before downloading; here the new entries are\n * built aside and swapped in at once, so concurrent lookups never see a\n * half-loaded map (and never cache results computed from it). Concurrent\n * loads of the same map share one download.\n */\nexport function loadReverseDnsMap(\n reverseDnsMap: ReverseDNSMap,\n options: LoadReverseDnsMapOptions = {},\n): Promise<void> {\n const running = reverseDnsMapLoads.get(reverseDnsMap);\n if (running !== undefined) {\n return running;\n }\n const load = fetchReverseDnsMap(reverseDnsMap, options).finally(() => {\n reverseDnsMapLoads.delete(reverseDnsMap);\n });\n reverseDnsMapLoads.set(reverseDnsMap, load);\n return load;\n}\n\nconst reverseDnsMapLoads = new WeakMap<ReverseDNSMap, Promise<void>>();\n\nasync function fetchReverseDnsMap(\n reverseDnsMap: ReverseDNSMap,\n options: LoadReverseDnsMapOptions,\n): Promise<void> {\n const alwaysUseLocalFile = options.alwaysUseLocalFile ?? false;\n const offline = options.offline ?? false;\n await loadPslOverrides({\n alwaysUseLocalFile,\n localFilePath: options.pslOverridesPath ?? null,\n url: options.pslOverridesUrl ?? null,\n offline,\n });\n\n const url = options.url ?? DEFAULT_REVERSE_DNS_MAP_URL;\n\n const loaded: ReverseDNSMap = new Map();\n try {\n if (!(offline || alwaysUseLocalFile)) {\n let body = '';\n try {\n logger.debug(\n `Trying to fetch reverse DNS map from ${redactUrl(url)}...`,\n );\n const response = await httpGet(url, {\n headers: { 'User-Agent': USER_AGENT },\n timeout: DOWNLOAD_TIMEOUT_SECONDS,\n maxBytes: MAX_REVERSE_DNS_MAP_BYTES,\n });\n response.raiseForStatus();\n body = response.text();\n loadCsv(loaded, body);\n } catch (error) {\n if (error instanceof HTTPError || error instanceof InvalidURL) {\n logger.warning(\n `Failed to fetch reverse DNS map: ${describeHttpError(error)}`,\n );\n } else {\n logger.warning('Not a valid CSV file');\n // parsedmarc logs this line through the root logger.\n getLogger('root').debug('Response body:');\n logger.debug(body);\n }\n }\n }\n\n if (loaded.size === 0) {\n logger.info('Loading included reverse DNS map...');\n const filePath =\n options.localFilePath ?? getResourcePath('base_reverse_dns_map.csv');\n // Python's text-mode open() translates \\r\\n and \\r to \\n (universal\n // newlines); the downloaded text goes to csv untranslated.\n const text = await readFile(filePath, 'utf8');\n loadCsv(loaded, text.replaceAll(UNIVERSAL_NEWLINE, '\\n'));\n }\n } finally {\n // Swap synchronously, keeping what was loaded even when a bad local\n // file throws part-way (Python fills the map in place).\n reverseDnsMap.clear();\n for (const [key, value] of loaded) {\n reverseDnsMap.set(key, value);\n }\n }\n}\n\nexport interface GetServiceOptions extends LoadReverseDnsMapOptions {\n /** A reverse DNS map; loaded into when empty. */\n reverseDnsMap?: ReverseDNSMap | null;\n}\n\n/**\n * The service of a base domain from reverse DNS. Unknown services have the\n * base domain as name and a `null` type.\n */\nexport async function getServiceFromReverseDnsBaseDomain(\n baseDomain: string,\n options: GetServiceOptions = {},\n): Promise<ReverseDNSService> {\n const key = pyStrip(baseDomain.toLowerCase());\n const reverseDnsMap =\n options.reverseDnsMap ?? new Map<string, ReverseDNSService>();\n\n if (reverseDnsMap.size === 0) {\n await loadReverseDnsMap(reverseDnsMap, {\n alwaysUseLocalFile: options.alwaysUseLocalFile ?? false,\n localFilePath: options.localFilePath ?? null,\n url: options.url ?? null,\n offline: options.offline ?? false,\n pslOverridesPath: options.pslOverridesPath ?? null,\n pslOverridesUrl: options.pslOverridesUrl ?? null,\n });\n }\n\n return reverseDnsMap.get(key) ?? { name: key, type: null };\n}\n\n/**\n * The network lookups one aggregate report may still make. parsedmarc has no\n * such limit: records are resolved one at a time, a failed lookup takes\n * seconds, and a sender choosing addresses that fail can hold a small\n * report for days. Past a limit the report keeps all its records, without\n * reverse DNS.\n */\nexport class ReportLookupBudget {\n private readonly maxLookups: number;\n private readonly maxFailures: number;\n private readonly maxTimeMs: number;\n private lookups = 0;\n private failures = 0;\n private spentMs = 0;\n private warned = false;\n /**\n * What this report's lookups found for IPs the shared cache doesn't keep\n * (no PTR record, ASN not in the map): a repeated address costs one\n * lookup per report, not one per record.\n */\n private readonly uncached = new Map<string, IPAddressInfo>();\n\n constructor(config: ParserConfig) {\n this.maxLookups = config.maxLookupsPerReport;\n this.maxFailures = config.maxFailedLookupsPerReport;\n this.maxTimeMs = config.maxLookupTimePerReport * 1000;\n }\n\n /** Whether one more IP may use the network; counts it if so. */\n take(): boolean {\n const exhausted =\n (this.maxLookups > 0 && this.lookups >= this.maxLookups) ||\n (this.maxFailures > 0 && this.failures >= this.maxFailures) ||\n (this.maxTimeMs > 0 && this.spentMs >= this.maxTimeMs);\n if (!exhausted) {\n this.lookups += 1;\n return true;\n }\n if (!this.warned) {\n this.warned = true;\n logger.warning(\n `Report reached its limit of network lookups (${this.lookups} made, ${this.failures} failed, ${Math.round(this.spentMs / 1000)} s): ` +\n 'the remaining source IPs get no reverse DNS',\n );\n }\n return false;\n }\n\n /** Count the time of a lookup against the report. */\n charge(elapsedMs: number): void {\n this.spentMs += elapsedMs;\n }\n\n /** What an earlier record of this report found for `ipAddress`. */\n recall(ipAddress: string): IPAddressInfo | undefined {\n return this.uncached.get(ipAddress);\n }\n\n /** Keep what was found for an IP the shared cache doesn't keep. */\n remember(info: IPAddressInfo): void {\n this.uncached.set(info.ipAddress, info);\n }\n\n /** Count a DNS error, unless it is a real answer that there is no PTR. */\n recordError(error: DNSException): void {\n if (!(error instanceof NXDOMAIN || error instanceof NoAnswer)) {\n this.failures += 1;\n }\n }\n}\n\nexport interface GetIpAddressInfoOptions {\n /**\n * Take every option below from this config (its IP address cache,\n * reverse DNS map, DNS settings, ...), the way parsedmarc's parsers call\n * `get_ip_address_info()`. Options given alongside it are ignored.\n */\n config?: ParserConfig | null;\n /** Limits on the network lookups of the report this IP comes from. */\n lookupBudget?: ReportLookupBudget | null;\n /** Path to a MMDB file from IPinfo, MaxMind, or DBIP. */\n ipDbPath?: string | null;\n /** Path to a reverse DNS map file. */\n reverseDnsMapPath?: string | null;\n /** Do not download files. */\n alwaysUseLocalFiles?: boolean;\n /** URL to the reverse DNS map file. */\n reverseDnsMapUrl?: string | null;\n /** Cache storage. */\n cache?: IPAddressCache | null;\n /** A reverse DNS map. */\n reverseDnsMap?: ReverseDNSMap | null;\n /** Do not make online queries for geolocation or DNS. */\n offline?: boolean;\n /** Nameservers to use (Cloudflare's public DNS resolvers by default). */\n nameservers?: readonly string[] | null;\n /** DNS timeout, in seconds. */\n timeout?: number;\n /** Times to retry on timeout or other transient DNS errors. */\n retries?: number;\n /** Path to a local PSL overrides file. */\n pslOverridesPath?: string | null;\n /** URL to a PSL overrides file. */\n pslOverridesUrl?: string | null;\n}\n\n/** The `getIpAddressInfo()` options parsedmarc's parsers pass from a config. */\nfunction optionsFromConfig(config: ParserConfig): GetIpAddressInfoOptions {\n return {\n cache: config.ipAddressCache,\n ipDbPath: config.ipDbPath,\n alwaysUseLocalFiles: config.alwaysUseLocalFiles,\n reverseDnsMapPath: config.reverseDnsMapPath,\n reverseDnsMapUrl: config.reverseDnsMapUrl,\n reverseDnsMap: config.reverseDnsMap,\n offline: config.offline,\n nameservers: config.nameservers,\n timeout: config.dnsTimeout,\n retries: config.dnsRetries,\n pslOverridesPath: config.pslOverridesPath,\n pslOverridesUrl: config.pslOverridesUrl,\n };\n}\n\n/**\n * Reverse DNS, country, ASN, and service information for an IP address.\n */\nexport async function getIpAddressInfo(\n ip: string,\n input: GetIpAddressInfoOptions = {},\n): Promise<IPAddressInfo> {\n const options = input.config ? optionsFromConfig(input.config) : input;\n const ipAddress = ip.toLowerCase();\n // Before the logs and lookups below: `ip` comes from the report's sender.\n numericHost(ipAddress);\n const cache = options.cache ?? null;\n const offline = options.offline ?? false;\n const alwaysUseLocalFiles = options.alwaysUseLocalFiles ?? false;\n if (cache !== null) {\n const cachedInfo = cache.get(ipAddress);\n if (cachedInfo && isPlainObject(cachedInfo) && 'ipAddress' in cachedInfo) {\n logger.debug(`IP address ${ipAddress} was found in cache`);\n return cachedInfo;\n }\n }\n const info: IPAddressInfo = {\n ipAddress,\n reverseDns: null,\n country: null,\n baseDomain: null,\n name: null,\n type: null,\n asn: null,\n asName: null,\n asDomain: null,\n };\n const lookupBudget = input.lookupBudget ?? null;\n const recalled = lookupBudget?.recall(ipAddress);\n if (recalled !== undefined) {\n return { ...recalled };\n }\n const useNetwork = lookupBudget?.take() ?? true;\n const lookupStart = performance.now();\n let reverseDns: string | null = null;\n if (!offline && useNetwork) {\n reverseDns = await getReverseDns(ipAddress, {\n nameservers: options.nameservers ?? null,\n timeout: options.timeout ?? DEFAULT_DNS_TIMEOUT,\n retries: options.retries ?? DEFAULT_DNS_MAX_RETRIES,\n onError: error => lookupBudget?.recordError(error),\n });\n }\n const dbRecord = await getIpAddressDbRecord(ipAddress, {\n dbPath: options.ipDbPath ?? null,\n skipApi: !useNetwork,\n });\n if (useNetwork) {\n lookupBudget?.charge(performance.now() - lookupStart);\n }\n info.country = dbRecord.country;\n info.asn = dbRecord.asn;\n info.asName = dbRecord.asName;\n info.asDomain = dbRecord.asDomain;\n info.reverseDns = reverseDns;\n\n const mapOptions: LoadReverseDnsMapOptions = {\n alwaysUseLocalFile: alwaysUseLocalFiles,\n localFilePath: options.reverseDnsMapPath ?? null,\n url: options.reverseDnsMapUrl ?? null,\n offline,\n pslOverridesPath: options.pslOverridesPath ?? null,\n pslOverridesUrl: options.pslOverridesUrl ?? null,\n };\n\n if (reverseDns === null) {\n logger.debug(`IP address ${ipAddress} reverse_dns not found`);\n // Fall back to ASN data for source attribution. reverseDns and\n // baseDomain stay null so consumers can tell an ASN-derived row apart\n // from one resolved via a real PTR.\n const mapValue =\n options.reverseDnsMap ?? new Map<string, ReverseDNSService>();\n if (mapValue.size === 0) {\n await loadReverseDnsMap(mapValue, mapOptions);\n }\n const service = info.asDomain ? mapValue.get(info.asDomain) : undefined;\n if (service !== undefined) {\n info.name = service.name;\n info.type = service.type;\n } else if (info.asName) {\n // ASN domain not in the map: surface the raw AS name with no\n // classification. Better than leaving the row unattributed.\n info.name = info.asName;\n }\n } else {\n const baseDomain = getBaseDomain(reverseDns);\n if (baseDomain !== null) {\n const service = await getServiceFromReverseDnsBaseDomain(baseDomain, {\n ...mapOptions,\n reverseDnsMap: options.reverseDnsMap ?? null,\n });\n info.baseDomain = baseDomain;\n info.type = service.type;\n info.name = service.name;\n }\n }\n\n // Don't cache weak-fallback attributions: rows with no PTR whose ASN\n // domain wasn't in the map, so the name is just the raw AS name.\n // getReverseDns() turns every DNS error into null, so a transient PTR\n // failure looks like a real no-PTR case here; caching it would lock in a\n // misattribution for the cache's 4 hours.\n const weakFallback =\n info.reverseDns === null &&\n info.type === null &&\n info.name !== null &&\n info.name === info.asName;\n if (cache !== null && !weakFallback && useNetwork) {\n cache.set(ipAddress, info);\n logger.debug(`IP address ${ipAddress} added to cache`);\n } else if (useNetwork) {\n lookupBudget?.remember({ ...info });\n }\n\n return info;\n}\n","// Name-character tables of Expat 2.9.0 (lib/nametab.h), so names follow\n// pyexpat's rules exactly (XML 1.0 4th edition, Appendix B). Generated from\n// nametab.h; the tables are Expat's, under its MIT license:\n//\n// Copyright (c) 1997-2000 Thai Open Source Software Center Ltd\n// Copyright (c) 2000-2026 Expat development team\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nconst NAMING_BITMAP: Uint32Array = Uint32Array.of(\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0x00000000,\n 0x04000000,\n 0x87fffffe,\n 0x07fffffe,\n 0x00000000,\n 0x00000000,\n 0xff7fffff,\n 0xff7fffff,\n 0xffffffff,\n 0x7ff3ffff,\n 0xfffffdfe,\n 0x7fffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffe00f,\n 0xfc31ffff,\n 0x00ffffff,\n 0x00000000,\n 0xffff0000,\n 0xffffffff,\n 0xffffffff,\n 0xf80001ff,\n 0x00000003,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0xffffd740,\n 0xfffffffb,\n 0x547f7fff,\n 0x000ffffd,\n 0xffffdffe,\n 0xffffffff,\n 0xdffeffff,\n 0xffffffff,\n 0xffff0003,\n 0xffffffff,\n 0xffff199f,\n 0x033fcfff,\n 0x00000000,\n 0xfffe0000,\n 0x027fffff,\n 0xfffffffe,\n 0x0000007f,\n 0x00000000,\n 0xffff0000,\n 0x000707ff,\n 0x00000000,\n 0x07fffffe,\n 0x000007fe,\n 0xfffe0000,\n 0xffffffff,\n 0x7cffffff,\n 0x002f7fff,\n 0x00000060,\n 0xffffffe0,\n 0x23ffffff,\n 0xff000000,\n 0x00000003,\n 0xfff99fe0,\n 0x03c5fdff,\n 0xb0000000,\n 0x00030003,\n 0xfff987e0,\n 0x036dfdff,\n 0x5e000000,\n 0x001c0000,\n 0xfffbafe0,\n 0x23edfdff,\n 0x00000000,\n 0x00000001,\n 0xfff99fe0,\n 0x23cdfdff,\n 0xb0000000,\n 0x00000003,\n 0xd63dc7e0,\n 0x03bfc718,\n 0x00000000,\n 0x00000000,\n 0xfffddfe0,\n 0x03effdff,\n 0x00000000,\n 0x00000003,\n 0xfffddfe0,\n 0x03effdff,\n 0x40000000,\n 0x00000003,\n 0xfffddfe0,\n 0x03fffdff,\n 0x00000000,\n 0x00000003,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0xfffffffe,\n 0x000d7fff,\n 0x0000003f,\n 0x00000000,\n 0xfef02596,\n 0x200d6cae,\n 0x0000001f,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0xfffffeff,\n 0x000003ff,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0xffffffff,\n 0xffff003f,\n 0x007fffff,\n 0x0007daed,\n 0x50000000,\n 0x82315001,\n 0x002c62ab,\n 0x40000000,\n 0xf580c900,\n 0x00000007,\n 0x02010800,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0x0fffffff,\n 0xffffffff,\n 0xffffffff,\n 0x03ffffff,\n 0x3f3fffff,\n 0xffffffff,\n 0xaaff3f3f,\n 0x3fffffff,\n 0xffffffff,\n 0x5fdfffff,\n 0x0fcf1fdc,\n 0x1fdc1fff,\n 0x00000000,\n 0x00004c40,\n 0x00000000,\n 0x00000000,\n 0x00000007,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000080,\n 0x000003fe,\n 0xfffffffe,\n 0xffffffff,\n 0x001fffff,\n 0xfffffffe,\n 0xffffffff,\n 0x07ffffff,\n 0xffffffe0,\n 0x00001fff,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0x0000003f,\n 0x00000000,\n 0x00000000,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0xffffffff,\n 0x0000000f,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x07ff6000,\n 0x87fffffe,\n 0x07fffffe,\n 0x00000000,\n 0x00800000,\n 0xff7fffff,\n 0xff7fffff,\n 0x00ffffff,\n 0x00000000,\n 0xffff0000,\n 0xffffffff,\n 0xffffffff,\n 0xf80001ff,\n 0x00030003,\n 0x00000000,\n 0xffffffff,\n 0xffffffff,\n 0x0000003f,\n 0x00000003,\n 0xffffd7c0,\n 0xfffffffb,\n 0x547f7fff,\n 0x000ffffd,\n 0xffffdffe,\n 0xffffffff,\n 0xdffeffff,\n 0xffffffff,\n 0xffff007b,\n 0xffffffff,\n 0xffff199f,\n 0x033fcfff,\n 0x00000000,\n 0xfffe0000,\n 0x027fffff,\n 0xfffffffe,\n 0xfffe007f,\n 0xbbfffffb,\n 0xffff0016,\n 0x000707ff,\n 0x00000000,\n 0x07fffffe,\n 0x0007ffff,\n 0xffff03ff,\n 0xffffffff,\n 0x7cffffff,\n 0xffef7fff,\n 0x03ff3dff,\n 0xffffffee,\n 0xf3ffffff,\n 0xff1e3fff,\n 0x0000ffcf,\n 0xfff99fee,\n 0xd3c5fdff,\n 0xb080399f,\n 0x0003ffcf,\n 0xfff987e4,\n 0xd36dfdff,\n 0x5e003987,\n 0x001fffc0,\n 0xfffbafee,\n 0xf3edfdff,\n 0x00003bbf,\n 0x0000ffc1,\n 0xfff99fee,\n 0xf3cdfdff,\n 0xb0c0398f,\n 0x0000ffc3,\n 0xd63dc7ec,\n 0xc3bfc718,\n 0x00803dc7,\n 0x0000ff80,\n 0xfffddfee,\n 0xc3effdff,\n 0x00603ddf,\n 0x0000ffc3,\n 0xfffddfec,\n 0xc3effdff,\n 0x40603ddf,\n 0x0000ffc3,\n 0xfffddfec,\n 0xc3fffdff,\n 0x00803dcf,\n 0x0000ffc3,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0xfffffffe,\n 0x07ff7fff,\n 0x03ff7fff,\n 0x00000000,\n 0xfef02596,\n 0x3bff6cae,\n 0x03ff3f5f,\n 0x00000000,\n 0x03000000,\n 0xc2a003ff,\n 0xfffffeff,\n 0xfffe03ff,\n 0xfebf0fdf,\n 0x02fe3fff,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x00000000,\n 0x1fff0000,\n 0x00000002,\n 0x000000a0,\n 0x003efffe,\n 0xfffffffe,\n 0xffffffff,\n 0x661fffff,\n 0xfffffffe,\n 0xffffffff,\n 0x77ffffff,\n);\n\nconst NMSTRT_PAGES: Uint8Array = Uint8Array.of(\n 0x02,\n 0x03,\n 0x04,\n 0x05,\n 0x06,\n 0x07,\n 0x08,\n 0x00,\n 0x00,\n 0x09,\n 0x0a,\n 0x0b,\n 0x0c,\n 0x0d,\n 0x0e,\n 0x0f,\n 0x10,\n 0x11,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x12,\n 0x13,\n 0x00,\n 0x14,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x15,\n 0x16,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x17,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x18,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n);\n\nconst NAME_PAGES: Uint8Array = Uint8Array.of(\n 0x19,\n 0x03,\n 0x1a,\n 0x1b,\n 0x1c,\n 0x1d,\n 0x1e,\n 0x00,\n 0x00,\n 0x1f,\n 0x20,\n 0x21,\n 0x22,\n 0x23,\n 0x24,\n 0x25,\n 0x10,\n 0x11,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x12,\n 0x13,\n 0x26,\n 0x14,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x27,\n 0x16,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x17,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x01,\n 0x18,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n);\n\nconst PAGE_SHIFT = 8;\nconst LOW_BYTE = 0xff;\nconst WORD_SHIFT = 5;\nconst BIT_MASK = 0x1f;\nconst PAGE_WORDS_SHIFT = 3;\n\n// Expat's UCS2_GET_NAMING: the page table picks a 256-bit block of the bitmap.\nfunction lookup(pages: Uint8Array, code: number): boolean {\n const page = pages[code >> PAGE_SHIFT] ?? 0;\n const low = code & LOW_BYTE;\n const word =\n NAMING_BITMAP[(page << PAGE_WORDS_SHIFT) + (low >> WORD_SHIFT)] ?? 0;\n return (word & (1 << (low & BIT_MASK))) !== 0;\n}\n\n/** Expat's name-start test for a BMP code point >= 0x80. */\nexport function isNmstrtCode(code: number): boolean {\n return lookup(NMSTRT_PAGES, code);\n}\n\n/** Expat's name-character test for a BMP code point >= 0x80. */\nexport function isNameCode(code: number): boolean {\n return lookup(NAME_PAGES, code);\n}\n","// A port of the parts of Expat 2.9.0 (lib/xmltok_impl.c, xmltok.c, xmlrole.c,\n// xmlparse.c) that pyexpat runs when xmltodict parses a complete document:\n// tokenizer, prolog/DTD role machine, content and epilog processors. Only the\n// observable behavior matters here: the same events, the same attribute\n// values and the same error code, line and column for every input, so\n// `Invalid XML: ...` messages match parsedmarc's.\n//\n// What is left out because pyexpat never reaches it with xmltodict's setup\n// (no namespace processing, parameter entity parsing off, no external entity\n// handler): namespaces, external entities, conditional sections, encodings\n// other than UTF-8 and UTF-16, and internal entity expansion. The last one is\n// a consequence of xmltodict's `disable_entities=True`: every entity\n// declaration Expat would store raises \"entities are disabled\" first, so the\n// only entities that can ever be referenced are the five predefined ones.\n//\n// Expat is Copyright (c) 1997-2000 Thai Open Source Software Center Ltd and\n// Copyright (c) 2000-2026 Expat development team, under the MIT license:\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport { isNameCode, isNmstrtCode } from './expat-names';\n\n// ---------------------------------------------------------------------------\n// Errors\n\n/** Expat's `XML_ErrorString()` table, indexed by `enum XML_Error`. */\nconst ERROR_STRINGS: readonly string[] = [\n '',\n 'out of memory',\n 'syntax error',\n 'no element found',\n 'not well-formed (invalid token)',\n 'unclosed token',\n 'partial character',\n 'mismatched tag',\n 'duplicate attribute',\n 'junk after document element',\n 'illegal parameter entity reference',\n 'undefined entity',\n 'recursive entity reference',\n 'asynchronous entity',\n 'reference to invalid character number',\n 'reference to binary entity',\n 'reference to external entity in attribute',\n 'XML or text declaration not at start of entity',\n 'unknown encoding',\n 'encoding specified in XML declaration is incorrect',\n 'unclosed CDATA section',\n 'error in processing external entity reference',\n 'document is not standalone',\n 'unexpected parser state - please send a bug report',\n 'entity declared in parameter entity',\n 'requested feature requires XML_DTD support in Expat',\n 'cannot change setting once parsing has begun',\n 'unbound prefix',\n 'must not undeclare prefix',\n 'incomplete markup in parameter entity',\n 'XML declaration not well-formed',\n 'text declaration not well-formed',\n 'illegal character(s) in public id',\n 'parser suspended',\n 'parser not suspended',\n 'parsing aborted',\n 'parsing finished',\n 'cannot suspend in external parameter entity',\n 'reserved prefix (xml) must not be undeclared or bound to another namespace name',\n 'reserved prefix (xmlns) must not be declared or undeclared',\n 'prefix must not be bound to one of the reserved namespace names',\n 'invalid argument',\n 'a successful prior call to function XML_GetBuffer is required',\n 'limit on input amplification factor (from DTD and entities) breached',\n];\n\nconst XML_ERROR_SYNTAX = 2;\nconst XML_ERROR_NO_ELEMENTS = 3;\nconst XML_ERROR_INVALID_TOKEN = 4;\nconst XML_ERROR_UNCLOSED_TOKEN = 5;\nconst XML_ERROR_PARTIAL_CHAR = 6;\nconst XML_ERROR_TAG_MISMATCH = 7;\nconst XML_ERROR_DUPLICATE_ATTRIBUTE = 8;\nconst XML_ERROR_JUNK_AFTER_DOC_ELEMENT = 9;\nconst XML_ERROR_PARAM_ENTITY_REF = 10;\nconst XML_ERROR_UNDEFINED_ENTITY = 11;\nconst XML_ERROR_BAD_CHAR_REF = 14;\nconst XML_ERROR_MISPLACED_XML_PI = 17;\nconst XML_ERROR_UNCLOSED_CDATA_SECTION = 20;\nconst XML_ERROR_XML_DECL = 30;\nconst XML_ERROR_PUBLICID = 32;\n\n/**\n * Python's `xml.parsers.expat.ExpatError`: the message is Expat's error\n * string followed by `: line N, column M` (line 1-based, column 0-based and\n * counted in characters), exactly as pyexpat formats it.\n */\nexport class ExpatError extends Error {\n override name = 'ExpatError';\n /** Expat's numeric error code (`enum XML_Error`). */\n readonly code: number;\n /** 1-based line of the error. */\n readonly lineno: number;\n /** 0-based column of the error, in characters. */\n readonly offset: number;\n\n constructor(code: number, lineno: number, offset: number) {\n super(\n `${ERROR_STRINGS[code] ?? 'unknown error'}: line ${lineno}, column ${offset}`,\n );\n this.code = code;\n this.lineno = lineno;\n this.offset = offset;\n }\n}\n\n// Thrown inside the parser; converted to ExpatError with a position at the top.\nclass ParseFailure {\n readonly code: number;\n\n constructor(code: number) {\n this.code = code;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Character classes (xmltok_impl.h byte types)\n\nconst BT_NONXML = 0;\nconst BT_MALFORM = 1;\nconst BT_LT = 2;\nconst BT_AMP = 3;\nconst BT_RSQB = 4;\nconst BT_LEAD4 = 7;\nconst BT_TRAIL = 8;\nconst BT_CR = 9;\nconst BT_LF = 10;\nconst BT_GT = 11;\nconst BT_QUOT = 12;\nconst BT_APOS = 13;\nconst BT_EQUALS = 14;\nconst BT_QUEST = 15;\nconst BT_EXCL = 16;\nconst BT_SOL = 17;\nconst BT_SEMI = 18;\nconst BT_NUM = 19;\nconst BT_LSQB = 20;\nconst BT_S = 21;\nconst BT_NMSTRT = 22;\nconst BT_HEX = 24;\nconst BT_DIGIT = 25;\nconst BT_NAME = 26;\nconst BT_MINUS = 27;\nconst BT_OTHER = 28;\nconst BT_NONASCII = 29;\nconst BT_PERCNT = 30;\nconst BT_LPAR = 31;\nconst BT_RPAR = 32;\nconst BT_AST = 33;\nconst BT_PLUS = 34;\nconst BT_COMMA = 35;\nconst BT_VERBAR = 36;\n\n// asciitab.h for the non-namespace encoding (\":\" is an ordinary name start).\nconst ASCII_TYPES: Uint8Array = (() => {\n const table = new Uint8Array(128).fill(BT_OTHER);\n for (let c = 0; c < 0x20; c += 1) {\n table[c] = BT_NONXML;\n }\n table[0x09] = BT_S;\n table[0x0a] = BT_LF;\n table[0x0d] = BT_CR;\n table[0x20] = BT_S;\n const singles: [string, number][] = [\n ['!', BT_EXCL],\n ['\"', BT_QUOT],\n ['#', BT_NUM],\n ['%', BT_PERCNT],\n ['&', BT_AMP],\n [\"'\", BT_APOS],\n ['(', BT_LPAR],\n [')', BT_RPAR],\n ['*', BT_AST],\n ['+', BT_PLUS],\n [',', BT_COMMA],\n ['-', BT_MINUS],\n ['.', BT_NAME],\n ['/', BT_SOL],\n [':', BT_NMSTRT],\n [';', BT_SEMI],\n ['<', BT_LT],\n ['=', BT_EQUALS],\n ['>', BT_GT],\n ['?', BT_QUEST],\n ['[', BT_LSQB],\n [']', BT_RSQB],\n ['_', BT_NMSTRT],\n ['|', BT_VERBAR],\n ];\n for (const [char, type] of singles) {\n table[char.charCodeAt(0)] = type;\n }\n for (let c = 0x30; c <= 0x39; c += 1) {\n table[c] = BT_DIGIT;\n }\n for (let c = 0x41; c <= 0x5a; c += 1) {\n table[c] = BT_NMSTRT;\n table[c + 0x20] = BT_NMSTRT;\n }\n for (let c = 0x41; c <= 0x46; c += 1) {\n table[c] = BT_HEX;\n table[c + 0x20] = BT_HEX;\n }\n return table;\n})();\n\n// ---------------------------------------------------------------------------\n// Tokens (xmltok.h)\n\nconst TOK_TRAILING_RSQB = -5;\nconst TOK_NONE = -4;\nconst TOK_TRAILING_CR = -3;\nconst TOK_PARTIAL_CHAR = -2;\nconst TOK_PARTIAL = -1;\nconst TOK_INVALID = 0;\nconst TOK_START_TAG_WITH_ATTS = 1;\nconst TOK_START_TAG_NO_ATTS = 2;\nconst TOK_EMPTY_ELEMENT_WITH_ATTS = 3;\nconst TOK_EMPTY_ELEMENT_NO_ATTS = 4;\nconst TOK_END_TAG = 5;\nconst TOK_DATA_CHARS = 6;\nconst TOK_DATA_NEWLINE = 7;\nconst TOK_CDATA_SECT_OPEN = 8;\nconst TOK_ENTITY_REF = 9;\nconst TOK_CHAR_REF = 10;\nconst TOK_PI = 11;\nconst TOK_XML_DECL = 12;\nconst TOK_COMMENT = 13;\nconst TOK_BOM = 14;\nconst TOK_PROLOG_S = 15;\nconst TOK_DECL_OPEN = 16;\nconst TOK_DECL_CLOSE = 17;\nconst TOK_NAME = 18;\nconst TOK_NMTOKEN = 19;\nconst TOK_POUND_NAME = 20;\nconst TOK_OR = 21;\nconst TOK_PERCENT = 22;\nconst TOK_OPEN_PAREN = 23;\nconst TOK_CLOSE_PAREN = 24;\nconst TOK_OPEN_BRACKET = 25;\nconst TOK_CLOSE_BRACKET = 26;\nconst TOK_LITERAL = 27;\nconst TOK_PARAM_ENTITY_REF = 28;\nconst TOK_INSTANCE_START = 29;\nconst TOK_NAME_QUESTION = 30;\nconst TOK_NAME_ASTERISK = 31;\nconst TOK_NAME_PLUS = 32;\nconst TOK_COND_SECT_OPEN = 33;\nconst TOK_COND_SECT_CLOSE = 34;\nconst TOK_CLOSE_PAREN_QUESTION = 35;\nconst TOK_CLOSE_PAREN_ASTERISK = 36;\nconst TOK_CLOSE_PAREN_PLUS = 37;\nconst TOK_COMMA = 38;\nconst TOK_ATTRIBUTE_VALUE_S = 39;\nconst TOK_CDATA_SECT_CLOSE = 40;\n\n// Results of the CHECK_NAME_CASES / CHECK_NMSTRT_CASES / INVALID_CASES helpers\n// when the character is not simply consumed.\nconst STEP_NOT_HANDLED = 0;\nconst STEP_INVALID = -1;\nconst STEP_PARTIAL_CHAR = -2;\n\nconst MAX_CODE_POINT = 0x11_00_00;\nconst HIGH_SURROGATE_MIN = 0xd8_00;\nconst HIGH_SURROGATE_MAX = 0xdb_ff;\nconst LOW_SURROGATE_MIN = 0xdc_00;\nconst LOW_SURROGATE_MAX = 0xdf_ff;\nconst NONCHAR_FFFE = 0xff_fe;\nconst NONCHAR_FFFF = 0xff_ff;\nconst ASCII_LIMIT = 0x80;\nconst BOM = 0xfe_ff;\n\nfunction isLowSurrogate(code: number): boolean {\n return code >= LOW_SURROGATE_MIN && code <= LOW_SURROGATE_MAX;\n}\n\n/**\n * Expat's tokenizer over a string of UTF-16 code units. A non-ASCII BMP\n * character plays the role of a 2- or 3-byte UTF-8 sequence (one unit wide),\n * a surrogate pair the role of a 4-byte sequence (two units wide).\n */\nclass Tokenizer {\n readonly text: string;\n readonly end: number;\n // UTF-16 input with an odd number of bytes: a dangling byte after `end`.\n readonly oddTail: boolean;\n // Input auto-detected as UTF-16 rather than the declared UTF-8.\n readonly utf16: boolean;\n /** The `nextTokPtr` out-parameter of Expat's scanners. */\n next = 0;\n\n constructor(text: string, utf16: boolean, oddTail: boolean) {\n this.text = text;\n this.end = text.length;\n this.utf16 = utf16;\n this.oddTail = oddTail;\n }\n\n type(ptr: number): number {\n const code = this.text.charCodeAt(ptr);\n if (code < ASCII_LIMIT) {\n return ASCII_TYPES[code] ?? BT_OTHER;\n }\n if (code >= HIGH_SURROGATE_MIN && code <= LOW_SURROGATE_MAX) {\n return code <= HIGH_SURROGATE_MAX ? BT_LEAD4 : BT_TRAIL;\n }\n return code === NONCHAR_FFFE || code === NONCHAR_FFFF\n ? BT_NONXML\n : BT_NONASCII;\n }\n\n code(ptr: number): number {\n return this.text.charCodeAt(ptr);\n }\n\n is(ptr: number, char: string): boolean {\n return this.text.charCodeAt(ptr) === char.charCodeAt(0);\n }\n\n private leadInvalid(ptr: number): boolean {\n return !isLowSurrogate(this.text.charCodeAt(ptr + 1));\n }\n\n // INVALID_CASES: width consumed, or a STEP_* result.\n invalidStep(ptr: number, end: number, type: number): number {\n switch (type) {\n case BT_NONASCII:\n return 1;\n case BT_LEAD4:\n if (end - ptr < 2) {\n return STEP_PARTIAL_CHAR;\n }\n return this.leadInvalid(ptr) ? STEP_INVALID : 2;\n case BT_NONXML:\n case BT_MALFORM:\n case BT_TRAIL:\n return STEP_INVALID;\n default:\n return STEP_NOT_HANDLED;\n }\n }\n\n // CHECK_NAME_CASES.\n nameStep(ptr: number, end: number, type: number): number {\n switch (type) {\n case BT_NONASCII:\n return isNameCode(this.code(ptr)) ? 1 : STEP_INVALID;\n case BT_NMSTRT:\n case BT_HEX:\n case BT_DIGIT:\n case BT_NAME:\n case BT_MINUS:\n return 1;\n case BT_LEAD4:\n // Expat's isName4/isNmstrt4 are \"never\": no name has an astral char.\n return end - ptr < 2 ? STEP_PARTIAL_CHAR : STEP_INVALID;\n default:\n return STEP_NOT_HANDLED;\n }\n }\n\n // CHECK_NMSTRT_CASES.\n nmstrtStep(ptr: number, end: number, type: number): number {\n switch (type) {\n case BT_NONASCII:\n return isNmstrtCode(this.code(ptr)) ? 1 : STEP_INVALID;\n case BT_NMSTRT:\n case BT_HEX:\n return 1;\n case BT_LEAD4:\n return end - ptr < 2 ? STEP_PARTIAL_CHAR : STEP_INVALID;\n default:\n return STEP_NOT_HANDLED;\n }\n }\n\n // Shared ending of a scanner that hit a STEP_INVALID/STEP_PARTIAL_CHAR.\n private fail(step: number, ptr: number): number {\n if (step === STEP_PARTIAL_CHAR) {\n return TOK_PARTIAL_CHAR;\n }\n this.next = ptr;\n return TOK_INVALID;\n }\n\n private emptyResult(): number {\n return this.oddTail ? TOK_PARTIAL : TOK_NONE;\n }\n\n // ptr points to the character following \"<!-\".\n scanComment(start: number, end: number): number {\n let ptr = start;\n if (ptr < end) {\n if (!this.is(ptr, '-')) {\n this.next = ptr;\n return TOK_INVALID;\n }\n ptr += 1;\n while (ptr < end) {\n const type = this.type(ptr);\n const step = this.invalidStep(ptr, end, type);\n if (step > 0) {\n ptr += step;\n continue;\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n if (type === BT_MINUS) {\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n if (this.is(ptr, '-')) {\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n if (!this.is(ptr, '>')) {\n this.next = ptr;\n return TOK_INVALID;\n }\n this.next = ptr + 1;\n return TOK_COMMENT;\n }\n continue;\n }\n ptr += 1;\n }\n }\n return TOK_PARTIAL;\n }\n\n // ptr points to the character following \"<!\".\n scanDecl(start: number, end: number): number {\n let ptr = start;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n switch (this.type(ptr)) {\n case BT_MINUS:\n return this.scanComment(ptr + 1, end);\n case BT_LSQB:\n this.next = ptr + 1;\n return TOK_COND_SECT_OPEN;\n case BT_NMSTRT:\n case BT_HEX:\n ptr += 1;\n break;\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n while (ptr < end) {\n switch (this.type(ptr)) {\n case BT_PERCNT: {\n if (end - ptr < 2) {\n return TOK_PARTIAL;\n }\n // Don't allow <!ENTITY% foo \"whatever\">.\n const following = this.type(ptr + 1);\n if (\n following === BT_S ||\n following === BT_CR ||\n following === BT_LF ||\n following === BT_PERCNT\n ) {\n this.next = ptr;\n return TOK_INVALID;\n }\n this.next = ptr;\n return TOK_DECL_OPEN;\n }\n case BT_S:\n case BT_CR:\n case BT_LF:\n this.next = ptr;\n return TOK_DECL_OPEN;\n case BT_NMSTRT:\n case BT_HEX:\n ptr += 1;\n break;\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n return TOK_PARTIAL;\n }\n\n // Returns the PI token kind, or TOK_INVALID for a mixed-case \"xml\" target.\n private piTargetKind(start: number, end: number): number {\n if (end - start !== 3) {\n return TOK_PI;\n }\n const target = this.text.slice(start, end);\n if (target === 'xml') {\n return TOK_XML_DECL;\n }\n return target.toLowerCase() === 'xml' ? TOK_INVALID : TOK_PI;\n }\n\n // ptr points to the character following \"<?\".\n scanPi(start: number, end: number): number {\n let ptr = start;\n const target = ptr;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n const first = this.nmstrtStep(ptr, end, this.type(ptr));\n if (first <= 0) {\n return this.fail(first === STEP_PARTIAL_CHAR ? first : STEP_INVALID, ptr);\n }\n ptr += first;\n while (ptr < end) {\n const type = this.type(ptr);\n const step = this.nameStep(ptr, end, type);\n if (step > 0) {\n ptr += step;\n continue;\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n if (type === BT_S || type === BT_CR || type === BT_LF) {\n const tok = this.piTargetKind(target, ptr);\n if (tok === TOK_INVALID) {\n this.next = ptr;\n return TOK_INVALID;\n }\n ptr += 1;\n while (ptr < end) {\n const inner = this.type(ptr);\n const innerStep = this.invalidStep(ptr, end, inner);\n if (innerStep > 0) {\n ptr += innerStep;\n continue;\n }\n if (innerStep < 0) {\n return this.fail(innerStep, ptr);\n }\n if (inner === BT_QUEST) {\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n if (this.is(ptr, '>')) {\n this.next = ptr + 1;\n return tok;\n }\n continue;\n }\n ptr += 1;\n }\n return TOK_PARTIAL;\n }\n if (type === BT_QUEST) {\n const tok = this.piTargetKind(target, ptr);\n if (tok === TOK_INVALID) {\n this.next = ptr;\n return TOK_INVALID;\n }\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n if (this.is(ptr, '>')) {\n this.next = ptr + 1;\n return tok;\n }\n }\n this.next = ptr;\n return TOK_INVALID;\n }\n return TOK_PARTIAL;\n }\n\n // ptr points to the character following \"<![\".\n scanCdataSection(start: number, end: number): number {\n let ptr = start;\n const expected = 'CDATA[';\n if (end - ptr < expected.length) {\n return TOK_PARTIAL;\n }\n for (const char of expected) {\n if (!this.is(ptr, char)) {\n this.next = ptr;\n return TOK_INVALID;\n }\n ptr += 1;\n }\n this.next = ptr;\n return TOK_CDATA_SECT_OPEN;\n }\n\n cdataSectionTok(start: number): number {\n const { end } = this;\n let ptr = start;\n if (ptr >= end) {\n return this.emptyResult();\n }\n const type = this.type(ptr);\n switch (type) {\n case BT_RSQB:\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n if (!this.is(ptr, ']')) {\n break;\n }\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n if (!this.is(ptr, '>')) {\n ptr -= 1;\n break;\n }\n this.next = ptr + 1;\n return TOK_CDATA_SECT_CLOSE;\n case BT_CR:\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n if (this.type(ptr) === BT_LF) {\n ptr += 1;\n }\n this.next = ptr;\n return TOK_DATA_NEWLINE;\n case BT_LF:\n this.next = ptr + 1;\n return TOK_DATA_NEWLINE;\n default: {\n const step = this.invalidStep(ptr, end, type);\n if (step < 0) {\n return this.fail(step, ptr);\n }\n ptr += step > 0 ? step : 1;\n }\n }\n return this.dataRun(ptr, end, false);\n }\n\n // The data-character loop shared by contentTok and cdataSectionTok.\n private dataRun(start: number, end: number, inContent: boolean): number {\n let ptr = start;\n while (ptr < end) {\n const type = this.type(ptr);\n switch (type) {\n case BT_LEAD4:\n if (end - ptr < 2 || this.leadInvalid(ptr)) {\n this.next = ptr;\n return TOK_DATA_CHARS;\n }\n ptr += 2;\n continue;\n case BT_RSQB:\n if (inContent && end - ptr >= 2) {\n if (!this.is(ptr + 1, ']')) {\n ptr += 1;\n continue;\n }\n if (end - ptr >= 3) {\n if (!this.is(ptr + 2, '>')) {\n ptr += 1;\n continue;\n }\n this.next = ptr + 2;\n return TOK_INVALID;\n }\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n case BT_AMP:\n case BT_LT:\n if (!inContent) {\n ptr += 1;\n continue;\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n case BT_NONXML:\n case BT_MALFORM:\n case BT_TRAIL:\n case BT_CR:\n case BT_LF:\n this.next = ptr;\n return TOK_DATA_CHARS;\n default:\n ptr += 1;\n }\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n }\n\n // ptr points to the character following \"</\".\n scanEndTag(start: number, end: number): number {\n let ptr = start;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n const first = this.nmstrtStep(ptr, end, this.type(ptr));\n if (first <= 0) {\n return this.fail(first === STEP_PARTIAL_CHAR ? first : STEP_INVALID, ptr);\n }\n ptr += first;\n while (ptr < end) {\n const type = this.type(ptr);\n const step = this.nameStep(ptr, end, type);\n if (step > 0) {\n ptr += step;\n continue;\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n switch (type) {\n case BT_S:\n case BT_CR:\n case BT_LF:\n for (ptr += 1; ptr < end; ptr += 1) {\n const inner = this.type(ptr);\n if (inner === BT_S || inner === BT_CR || inner === BT_LF) {\n continue;\n }\n if (inner === BT_GT) {\n this.next = ptr + 1;\n return TOK_END_TAG;\n }\n this.next = ptr;\n return TOK_INVALID;\n }\n return TOK_PARTIAL;\n case BT_GT:\n this.next = ptr + 1;\n return TOK_END_TAG;\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n return TOK_PARTIAL;\n }\n\n // ptr points to the character following \"&#X\".\n private scanHexCharRef(start: number, end: number): number {\n let ptr = start;\n if (ptr < end) {\n const first = this.type(ptr);\n if (first !== BT_DIGIT && first !== BT_HEX) {\n this.next = ptr;\n return TOK_INVALID;\n }\n for (ptr += 1; ptr < end; ptr += 1) {\n const type = this.type(ptr);\n if (type === BT_DIGIT || type === BT_HEX) {\n continue;\n }\n if (type === BT_SEMI) {\n this.next = ptr + 1;\n return TOK_CHAR_REF;\n }\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n return TOK_PARTIAL;\n }\n\n // ptr points to the character following \"&#\".\n private scanCharRef(start: number, end: number): number {\n let ptr = start;\n if (ptr < end) {\n if (this.is(ptr, 'x')) {\n return this.scanHexCharRef(ptr + 1, end);\n }\n if (this.type(ptr) !== BT_DIGIT) {\n this.next = ptr;\n return TOK_INVALID;\n }\n for (ptr += 1; ptr < end; ptr += 1) {\n const type = this.type(ptr);\n if (type === BT_DIGIT) {\n continue;\n }\n if (type === BT_SEMI) {\n this.next = ptr + 1;\n return TOK_CHAR_REF;\n }\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n return TOK_PARTIAL;\n }\n\n // ptr points to the character following \"&\".\n scanRef(start: number, end: number): number {\n let ptr = start;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n const firstType = this.type(ptr);\n const first = this.nmstrtStep(ptr, end, firstType);\n if (first < 0) {\n return this.fail(first, ptr);\n }\n if (first === STEP_NOT_HANDLED) {\n if (firstType === BT_NUM) {\n return this.scanCharRef(ptr + 1, end);\n }\n this.next = ptr;\n return TOK_INVALID;\n }\n ptr += first;\n while (ptr < end) {\n const type = this.type(ptr);\n const step = this.nameStep(ptr, end, type);\n if (step > 0) {\n ptr += step;\n continue;\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n if (type === BT_SEMI) {\n this.next = ptr + 1;\n return TOK_ENTITY_REF;\n }\n this.next = ptr;\n return TOK_INVALID;\n }\n return TOK_PARTIAL;\n }\n\n // After the closing quote of an attribute value: whitespace, \">\" or \"/>\".\n // Returns a token, or -100 - ptr when another attribute name starts at ptr.\n private afterAttributeValue(start: number, end: number): number {\n let ptr = start;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n const type = this.type(ptr);\n if (type === BT_SOL) {\n return this.emptyTagEnd(ptr, end, TOK_EMPTY_ELEMENT_WITH_ATTS);\n }\n if (type === BT_GT) {\n this.next = ptr + 1;\n return TOK_START_TAG_WITH_ATTS;\n }\n if (type !== BT_S && type !== BT_CR && type !== BT_LF) {\n this.next = ptr;\n return TOK_INVALID;\n }\n for (;;) {\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n const inner = this.type(ptr);\n const step = this.nmstrtStep(ptr, end, inner);\n if (step > 0) {\n return NEXT_ATTRIBUTE_BASE - (ptr + step);\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n switch (inner) {\n case BT_S:\n case BT_CR:\n case BT_LF:\n continue;\n case BT_GT:\n this.next = ptr + 1;\n return TOK_START_TAG_WITH_ATTS;\n case BT_SOL:\n return this.emptyTagEnd(ptr, end, TOK_EMPTY_ELEMENT_WITH_ATTS);\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n }\n\n // ptr points to \"/\" of \"/>\".\n private emptyTagEnd(slash: number, end: number, tok: number): number {\n const ptr = slash + 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n if (!this.is(ptr, '>')) {\n this.next = ptr;\n return TOK_INVALID;\n }\n this.next = ptr + 1;\n return tok;\n }\n\n // ptr points to the character following the first character of an\n // attribute name.\n scanAtts(start: number, end: number): number {\n let ptr = start;\n while (ptr < end) {\n const type = this.type(ptr);\n const step = this.nameStep(ptr, end, type);\n if (step > 0) {\n ptr += step;\n continue;\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n if (type === BT_S || type === BT_CR || type === BT_LF) {\n for (;;) {\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n const inner = this.type(ptr);\n if (inner === BT_EQUALS) {\n break;\n }\n if (inner !== BT_S && inner !== BT_CR && inner !== BT_LF) {\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n } else if (type !== BT_EQUALS) {\n this.next = ptr;\n return TOK_INVALID;\n }\n // ptr points to \"=\".\n let open: number;\n for (;;) {\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n open = this.type(ptr);\n if (open === BT_QUOT || open === BT_APOS) {\n break;\n }\n if (open !== BT_S && open !== BT_CR && open !== BT_LF) {\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n ptr += 1;\n // In the attribute value.\n for (;;) {\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n const valueType = this.type(ptr);\n if (valueType === open) {\n break;\n }\n const valueStep = this.invalidStep(ptr, end, valueType);\n if (valueStep > 0) {\n ptr += valueStep;\n continue;\n }\n if (valueStep < 0) {\n return this.fail(valueStep, ptr);\n }\n if (valueType === BT_AMP) {\n const tok = this.scanRef(ptr + 1, end);\n if (tok <= 0) {\n return tok;\n }\n ptr = this.next;\n continue;\n }\n if (valueType === BT_LT) {\n this.next = ptr;\n return TOK_INVALID;\n }\n ptr += 1;\n }\n const after = this.afterAttributeValue(ptr + 1, end);\n if (after > NEXT_ATTRIBUTE_BASE) {\n return after;\n }\n ptr = NEXT_ATTRIBUTE_BASE - after;\n }\n return TOK_PARTIAL;\n }\n\n // ptr points to the character following \"<\".\n scanLt(start: number, end: number): number {\n let ptr = start;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n const firstType = this.type(ptr);\n const first = this.nmstrtStep(ptr, end, firstType);\n if (first < 0) {\n return this.fail(first, ptr);\n }\n if (first === STEP_NOT_HANDLED) {\n switch (firstType) {\n case BT_EXCL:\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n switch (this.type(ptr)) {\n case BT_MINUS:\n return this.scanComment(ptr + 1, end);\n case BT_LSQB:\n return this.scanCdataSection(ptr + 1, end);\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n case BT_QUEST:\n return this.scanPi(ptr + 1, end);\n case BT_SOL:\n return this.scanEndTag(ptr + 1, end);\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n ptr += first;\n // We have a start tag.\n while (ptr < end) {\n const type = this.type(ptr);\n const step = this.nameStep(ptr, end, type);\n if (step > 0) {\n ptr += step;\n continue;\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n switch (type) {\n case BT_S:\n case BT_CR:\n case BT_LF:\n ptr += 1;\n while (ptr < end) {\n const inner = this.type(ptr);\n const innerStep = this.nmstrtStep(ptr, end, inner);\n if (innerStep > 0) {\n return this.scanAtts(ptr + innerStep, end);\n }\n if (innerStep < 0) {\n return this.fail(innerStep, ptr);\n }\n switch (inner) {\n case BT_GT:\n this.next = ptr + 1;\n return TOK_START_TAG_NO_ATTS;\n case BT_SOL:\n return this.emptyTagEnd(ptr, end, TOK_EMPTY_ELEMENT_NO_ATTS);\n case BT_S:\n case BT_CR:\n case BT_LF:\n ptr += 1;\n continue;\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n return TOK_PARTIAL;\n case BT_GT:\n this.next = ptr + 1;\n return TOK_START_TAG_NO_ATTS;\n case BT_SOL:\n return this.emptyTagEnd(ptr, end, TOK_EMPTY_ELEMENT_NO_ATTS);\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n return TOK_PARTIAL;\n }\n\n contentTok(start: number): number {\n const { end } = this;\n let ptr = start;\n if (ptr >= end) {\n return this.emptyResult();\n }\n const type = this.type(ptr);\n switch (type) {\n case BT_LT:\n return this.scanLt(ptr + 1, end);\n case BT_AMP:\n return this.scanRef(ptr + 1, end);\n case BT_CR:\n ptr += 1;\n if (ptr >= end) {\n return TOK_TRAILING_CR;\n }\n if (this.type(ptr) === BT_LF) {\n ptr += 1;\n }\n this.next = ptr;\n return TOK_DATA_NEWLINE;\n case BT_LF:\n this.next = ptr + 1;\n return TOK_DATA_NEWLINE;\n case BT_RSQB:\n ptr += 1;\n if (ptr >= end) {\n return TOK_TRAILING_RSQB;\n }\n if (!this.is(ptr, ']')) {\n break;\n }\n ptr += 1;\n if (ptr >= end) {\n return TOK_TRAILING_RSQB;\n }\n if (!this.is(ptr, '>')) {\n ptr -= 1;\n break;\n }\n this.next = ptr;\n return TOK_INVALID;\n default: {\n const step = this.invalidStep(ptr, end, type);\n if (step < 0) {\n return this.fail(step, ptr);\n }\n ptr += step > 0 ? step : 1;\n }\n }\n return this.dataRun(ptr, end, true);\n }\n\n // ptr points to the character following \"%\".\n private scanPercent(start: number, end: number): number {\n let ptr = start;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n const firstType = this.type(ptr);\n const first = this.nmstrtStep(ptr, end, firstType);\n if (first < 0) {\n return this.fail(first, ptr);\n }\n if (first === STEP_NOT_HANDLED) {\n this.next = ptr;\n return firstType === BT_S ||\n firstType === BT_LF ||\n firstType === BT_CR ||\n firstType === BT_PERCNT\n ? TOK_PERCENT\n : TOK_INVALID;\n }\n ptr += first;\n while (ptr < end) {\n const type = this.type(ptr);\n const step = this.nameStep(ptr, end, type);\n if (step > 0) {\n ptr += step;\n continue;\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n if (type === BT_SEMI) {\n this.next = ptr + 1;\n return TOK_PARAM_ENTITY_REF;\n }\n this.next = ptr;\n return TOK_INVALID;\n }\n return TOK_PARTIAL;\n }\n\n // ptr points to the character following \"#\".\n private scanPoundName(start: number, end: number): number {\n let ptr = start;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n const first = this.nmstrtStep(ptr, end, this.type(ptr));\n if (first <= 0) {\n return this.fail(first === STEP_PARTIAL_CHAR ? first : STEP_INVALID, ptr);\n }\n ptr += first;\n while (ptr < end) {\n const type = this.type(ptr);\n const step = this.nameStep(ptr, end, type);\n if (step > 0) {\n ptr += step;\n continue;\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n switch (type) {\n case BT_CR:\n case BT_LF:\n case BT_S:\n case BT_RPAR:\n case BT_GT:\n case BT_PERCNT:\n case BT_VERBAR:\n this.next = ptr;\n return TOK_POUND_NAME;\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n return -TOK_POUND_NAME;\n }\n\n private scanLit(open: number, start: number, end: number): number {\n let ptr = start;\n while (ptr < end) {\n const type = this.type(ptr);\n const step = this.invalidStep(ptr, end, type);\n if (step > 0) {\n ptr += step;\n continue;\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n ptr += 1;\n if ((type === BT_QUOT || type === BT_APOS) && type === open) {\n if (ptr >= end) {\n return -TOK_LITERAL;\n }\n this.next = ptr;\n switch (this.type(ptr)) {\n case BT_S:\n case BT_CR:\n case BT_LF:\n case BT_GT:\n case BT_PERCNT:\n case BT_LSQB:\n return TOK_LITERAL;\n default:\n return TOK_INVALID;\n }\n }\n }\n return TOK_PARTIAL;\n }\n\n prologTok(start: number): number {\n const { end } = this;\n let ptr = start;\n if (ptr >= end) {\n return this.emptyResult();\n }\n let tok: number;\n const type = this.type(ptr);\n switch (type) {\n case BT_QUOT:\n return this.scanLit(BT_QUOT, ptr + 1, end);\n case BT_APOS:\n return this.scanLit(BT_APOS, ptr + 1, end);\n case BT_LT:\n ptr += 1;\n if (ptr >= end) {\n return TOK_PARTIAL;\n }\n switch (this.type(ptr)) {\n case BT_EXCL:\n return this.scanDecl(ptr + 1, end);\n case BT_QUEST:\n return this.scanPi(ptr + 1, end);\n case BT_NMSTRT:\n case BT_HEX:\n case BT_NONASCII:\n case BT_LEAD4:\n this.next = ptr - 1;\n return TOK_INSTANCE_START;\n default:\n // In UTF-8, U+FFFE/U+FFFF are lead bytes here, checked later.\n if (!this.utf16 && this.code(ptr) >= ASCII_LIMIT) {\n this.next = ptr - 1;\n return TOK_INSTANCE_START;\n }\n this.next = ptr;\n return TOK_INVALID;\n }\n case BT_CR:\n if (ptr + 1 === end) {\n this.next = end;\n // Might be part of a CR/LF pair.\n return -TOK_PROLOG_S;\n }\n return this.prologSpace(ptr, end);\n case BT_S:\n case BT_LF:\n return this.prologSpace(ptr, end);\n case BT_PERCNT:\n return this.scanPercent(ptr + 1, end);\n case BT_COMMA:\n this.next = ptr + 1;\n return TOK_COMMA;\n case BT_LSQB:\n this.next = ptr + 1;\n return TOK_OPEN_BRACKET;\n case BT_RSQB:\n ptr += 1;\n if (ptr >= end) {\n return -TOK_CLOSE_BRACKET;\n }\n if (this.is(ptr, ']')) {\n if (end - ptr < 2) {\n return TOK_PARTIAL;\n }\n if (this.is(ptr + 1, '>')) {\n this.next = ptr + 2;\n return TOK_COND_SECT_CLOSE;\n }\n }\n this.next = ptr;\n return TOK_CLOSE_BRACKET;\n case BT_LPAR:\n this.next = ptr + 1;\n return TOK_OPEN_PAREN;\n case BT_RPAR:\n return this.closeParen(ptr + 1, end);\n case BT_VERBAR:\n this.next = ptr + 1;\n return TOK_OR;\n case BT_GT:\n this.next = ptr + 1;\n return TOK_DECL_CLOSE;\n case BT_NUM:\n return this.scanPoundName(ptr + 1, end);\n case BT_LEAD4:\n if (end - ptr < 2) {\n return TOK_PARTIAL_CHAR;\n }\n this.next = ptr;\n return TOK_INVALID;\n case BT_NMSTRT:\n case BT_HEX:\n tok = TOK_NAME;\n ptr += 1;\n break;\n case BT_DIGIT:\n case BT_NAME:\n case BT_MINUS:\n tok = TOK_NMTOKEN;\n ptr += 1;\n break;\n case BT_NONASCII:\n if (isNmstrtCode(this.code(ptr))) {\n tok = TOK_NAME;\n } else if (isNameCode(this.code(ptr))) {\n tok = TOK_NMTOKEN;\n } else {\n this.next = ptr;\n return TOK_INVALID;\n }\n ptr += 1;\n break;\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n while (ptr < end) {\n const inner = this.type(ptr);\n const step = this.nameStep(ptr, end, inner);\n if (step > 0) {\n ptr += step;\n continue;\n }\n if (step < 0) {\n return this.fail(step, ptr);\n }\n switch (inner) {\n case BT_GT:\n case BT_RPAR:\n case BT_COMMA:\n case BT_VERBAR:\n case BT_LSQB:\n case BT_PERCNT:\n case BT_S:\n case BT_CR:\n case BT_LF:\n this.next = ptr;\n return tok;\n case BT_PLUS:\n return this.nameSuffix(ptr, tok, TOK_NAME_PLUS);\n case BT_AST:\n return this.nameSuffix(ptr, tok, TOK_NAME_ASTERISK);\n case BT_QUEST:\n return this.nameSuffix(ptr, tok, TOK_NAME_QUESTION);\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n return -tok;\n }\n\n private nameSuffix(ptr: number, tok: number, suffixed: number): number {\n if (tok === TOK_NMTOKEN) {\n this.next = ptr;\n return TOK_INVALID;\n }\n this.next = ptr + 1;\n return suffixed;\n }\n\n private closeParen(start: number, end: number): number {\n const ptr = start;\n if (ptr >= end) {\n return -TOK_CLOSE_PAREN;\n }\n switch (this.type(ptr)) {\n case BT_AST:\n this.next = ptr + 1;\n return TOK_CLOSE_PAREN_ASTERISK;\n case BT_QUEST:\n this.next = ptr + 1;\n return TOK_CLOSE_PAREN_QUESTION;\n case BT_PLUS:\n this.next = ptr + 1;\n return TOK_CLOSE_PAREN_PLUS;\n case BT_CR:\n case BT_LF:\n case BT_S:\n case BT_GT:\n case BT_COMMA:\n case BT_VERBAR:\n case BT_RPAR:\n this.next = ptr;\n return TOK_CLOSE_PAREN;\n default:\n this.next = ptr;\n return TOK_INVALID;\n }\n }\n\n private prologSpace(start: number, end: number): number {\n let ptr = start;\n for (;;) {\n ptr += 1;\n if (ptr >= end) {\n break;\n }\n const type = this.type(ptr);\n if (type === BT_S || type === BT_LF) {\n continue;\n }\n // Don't split a CR/LF pair.\n if (type === BT_CR && ptr + 1 !== end) {\n continue;\n }\n this.next = ptr;\n return TOK_PROLOG_S;\n }\n this.next = ptr;\n return TOK_PROLOG_S;\n }\n\n attributeValueTok(start: number, end: number): number {\n let ptr = start;\n if (ptr >= end) {\n return TOK_NONE;\n }\n while (ptr < end) {\n switch (this.type(ptr)) {\n case BT_LEAD4:\n ptr += 2;\n break;\n case BT_AMP:\n if (ptr === start) {\n return this.scanRef(ptr + 1, end);\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n case BT_LT:\n // For literals in the DTD.\n this.next = ptr;\n return TOK_INVALID;\n case BT_LF:\n if (ptr === start) {\n this.next = ptr + 1;\n return TOK_DATA_NEWLINE;\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n case BT_CR:\n if (ptr === start) {\n return this.newlineAt(ptr, end);\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n case BT_S:\n if (ptr === start) {\n this.next = ptr + 1;\n return TOK_ATTRIBUTE_VALUE_S;\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n default:\n ptr += 1;\n }\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n }\n\n entityValueTok(start: number, end: number): number {\n let ptr = start;\n if (ptr >= end) {\n return TOK_NONE;\n }\n while (ptr < end) {\n switch (this.type(ptr)) {\n case BT_LEAD4:\n ptr += 2;\n break;\n case BT_AMP:\n if (ptr === start) {\n return this.scanRef(ptr + 1, end);\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n case BT_PERCNT:\n if (ptr === start) {\n const tok = this.scanPercent(ptr + 1, end);\n return tok === TOK_PERCENT ? TOK_INVALID : tok;\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n case BT_LF:\n if (ptr === start) {\n this.next = ptr + 1;\n return TOK_DATA_NEWLINE;\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n case BT_CR:\n if (ptr === start) {\n return this.newlineAt(ptr, end);\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n default:\n ptr += 1;\n }\n }\n this.next = ptr;\n return TOK_DATA_CHARS;\n }\n\n private newlineAt(cr: number, end: number): number {\n let ptr = cr + 1;\n if (ptr >= end) {\n return TOK_TRAILING_CR;\n }\n if (this.type(ptr) === BT_LF) {\n ptr += 1;\n }\n this.next = ptr;\n return TOK_DATA_NEWLINE;\n }\n\n /** Expat's XmlNameLength. */\n nameLength(start: number): number {\n let ptr = start;\n for (;;) {\n switch (this.type(ptr)) {\n case BT_LEAD4:\n ptr += 2;\n break;\n case BT_NONASCII:\n case BT_NMSTRT:\n case BT_HEX:\n case BT_DIGIT:\n case BT_NAME:\n case BT_MINUS:\n ptr += 1;\n break;\n default:\n return ptr - start;\n }\n }\n }\n\n /** Expat's XmlCharRefNumber; ptr points to \"&#\". -1 for a bad reference. */\n charRefNumber(start: number): number {\n let ptr = start + 2;\n let result = 0;\n if (this.is(ptr, 'x')) {\n for (ptr += 1; !this.is(ptr, ';'); ptr += 1) {\n result = result * 16 + Number.parseInt(this.text.charAt(ptr), 16);\n if (result >= MAX_CODE_POINT) {\n return -1;\n }\n }\n } else {\n for (; !this.is(ptr, ';'); ptr += 1) {\n result = result * 10 + (this.code(ptr) - 0x30);\n if (result >= MAX_CODE_POINT) {\n return -1;\n }\n }\n }\n return checkCharRefNumber(result);\n }\n\n /** Expat's XmlPredefinedEntityName: the character, or \"\" if not predefined. */\n predefinedEntity(start: number, end: number): string {\n return PREDEFINED_ENTITIES.get(this.text.slice(start, end)) ?? '';\n }\n\n /** Expat's XmlIsPublicId; returns the bad position or -1 when valid. */\n publicIdBadPosition(start: number, end: number): number {\n for (let ptr = start + 1; ptr < end - 1; ptr += 1) {\n const type = this.type(ptr);\n switch (type) {\n case BT_DIGIT:\n case BT_HEX:\n case BT_MINUS:\n case BT_APOS:\n case BT_LPAR:\n case BT_RPAR:\n case BT_PLUS:\n case BT_COMMA:\n case BT_SOL:\n case BT_EQUALS:\n case BT_QUEST:\n case BT_CR:\n case BT_LF:\n case BT_SEMI:\n case BT_EXCL:\n case BT_AST:\n case BT_PERCNT:\n case BT_NUM:\n break;\n case BT_S:\n if (this.is(ptr, '\\t')) {\n return ptr;\n }\n break;\n default: {\n const code = this.code(ptr);\n const asciiLetter =\n (type === BT_NAME || type === BT_NMSTRT) && code < ASCII_LIMIT;\n if (!asciiLetter && code !== 0x24 && code !== 0x40) {\n return ptr;\n }\n }\n }\n }\n return -1;\n }\n}\n\n// Sentinel range for Tokenizer.afterAttributeValue (positions are encoded as\n// NEXT_ATTRIBUTE_BASE - ptr, always below every real token value).\nconst NEXT_ATTRIBUTE_BASE = -100;\n\nconst PREDEFINED_ENTITIES: ReadonlyMap<string, string> = new Map([\n ['lt', '<'],\n ['gt', '>'],\n ['amp', '&'],\n ['quot', '\"'],\n ['apos', \"'\"],\n]);\n\nconst CONTROL_LIMIT = 0x20;\n\nfunction checkCharRefNumber(result: number): number {\n if (result >= HIGH_SURROGATE_MIN && result <= LOW_SURROGATE_MAX) {\n return -1;\n }\n if (\n result < CONTROL_LIMIT &&\n result !== 0x09 &&\n result !== 0x0a &&\n result !== 0x0d\n ) {\n return -1;\n }\n if (result === NONCHAR_FFFE || result === NONCHAR_FFFF) {\n return -1;\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Prolog roles (xmlrole.c)\n\nconst ROLE_ERROR = -1;\nconst ROLE_NONE = 0;\nconst ROLE_XML_DECL = 1;\nconst ROLE_INSTANCE_START = 2;\nconst ROLE_DOCTYPE_NONE = 3;\nconst ROLE_DOCTYPE_NAME = 4;\nconst ROLE_DOCTYPE_SYSTEM_ID = 5;\nconst ROLE_DOCTYPE_PUBLIC_ID = 6;\nconst ROLE_DOCTYPE_INTERNAL_SUBSET = 7;\nconst ROLE_DOCTYPE_CLOSE = 8;\nconst ROLE_GENERAL_ENTITY_NAME = 9;\nconst ROLE_PARAM_ENTITY_NAME = 10;\nconst ROLE_ENTITY_NONE = 11;\nconst ROLE_ENTITY_VALUE = 12;\nconst ROLE_ENTITY_SYSTEM_ID = 13;\nconst ROLE_ENTITY_PUBLIC_ID = 14;\nconst ROLE_ENTITY_COMPLETE = 15;\nconst ROLE_ENTITY_NOTATION_NAME = 16;\nconst ROLE_NOTATION_NONE = 17;\nconst ROLE_NOTATION_NAME = 18;\nconst ROLE_NOTATION_SYSTEM_ID = 19;\nconst ROLE_NOTATION_NO_SYSTEM_ID = 20;\nconst ROLE_NOTATION_PUBLIC_ID = 21;\nconst ROLE_ATTRIBUTE_NAME = 22;\nconst ROLE_ATTRIBUTE_TYPE_CDATA = 23;\nconst ROLE_ATTRIBUTE_TYPE_ID = 24;\nconst ROLE_ATTRIBUTE_ENUM_VALUE = 31;\nconst ROLE_ATTRIBUTE_NOTATION_VALUE = 32;\nconst ROLE_ATTLIST_NONE = 33;\nconst ROLE_ATTLIST_ELEMENT_NAME = 34;\nconst ROLE_IMPLIED_ATTRIBUTE_VALUE = 35;\nconst ROLE_REQUIRED_ATTRIBUTE_VALUE = 36;\nconst ROLE_DEFAULT_ATTRIBUTE_VALUE = 37;\nconst ROLE_FIXED_ATTRIBUTE_VALUE = 38;\nconst ROLE_ELEMENT_NONE = 39;\nconst ROLE_ELEMENT_NAME = 40;\nconst ROLE_CONTENT_ANY = 41;\nconst ROLE_CONTENT_EMPTY = 42;\nconst ROLE_CONTENT_PCDATA = 43;\nconst ROLE_GROUP_OPEN = 44;\nconst ROLE_GROUP_CLOSE = 45;\nconst ROLE_GROUP_CLOSE_REP = 46;\nconst ROLE_GROUP_CLOSE_OPT = 47;\nconst ROLE_GROUP_CLOSE_PLUS = 48;\nconst ROLE_GROUP_CHOICE = 49;\nconst ROLE_GROUP_SEQUENCE = 50;\nconst ROLE_CONTENT_ELEMENT = 51;\nconst ROLE_CONTENT_ELEMENT_REP = 52;\nconst ROLE_CONTENT_ELEMENT_OPT = 53;\nconst ROLE_CONTENT_ELEMENT_PLUS = 54;\nconst ROLE_PI = 55;\nconst ROLE_COMMENT = 56;\nconst ROLE_PARAM_ENTITY_REF = 60;\n\nconst ATTRIBUTE_TYPE_KEYWORDS: readonly string[] = [\n 'CDATA',\n 'ID',\n 'IDREF',\n 'IDREFS',\n 'ENTITY',\n 'ENTITIES',\n 'NMTOKEN',\n 'NMTOKENS',\n];\n\n// Role handler states.\nconst S_PROLOG0 = 0;\nconst S_PROLOG1 = 1;\nconst S_PROLOG2 = 2;\nconst S_DOCTYPE0 = 3;\nconst S_DOCTYPE1 = 4;\nconst S_DOCTYPE2 = 5;\nconst S_DOCTYPE3 = 6;\nconst S_DOCTYPE4 = 7;\nconst S_DOCTYPE5 = 8;\nconst S_INTERNAL_SUBSET = 9;\nconst S_ENTITY0 = 10;\nconst S_ENTITY1 = 11;\nconst S_ENTITY2 = 12;\nconst S_ENTITY3 = 13;\nconst S_ENTITY4 = 14;\nconst S_ENTITY5 = 15;\nconst S_ENTITY6 = 16;\nconst S_ENTITY7 = 17;\nconst S_ENTITY8 = 18;\nconst S_ENTITY9 = 19;\nconst S_ENTITY10 = 20;\nconst S_NOTATION0 = 21;\nconst S_NOTATION1 = 22;\nconst S_NOTATION2 = 23;\nconst S_NOTATION3 = 24;\nconst S_NOTATION4 = 25;\nconst S_ATTLIST0 = 26;\nconst S_ATTLIST1 = 27;\nconst S_ATTLIST2 = 28;\nconst S_ATTLIST3 = 29;\nconst S_ATTLIST4 = 30;\nconst S_ATTLIST5 = 31;\nconst S_ATTLIST6 = 32;\nconst S_ATTLIST7 = 33;\nconst S_ATTLIST8 = 34;\nconst S_ATTLIST9 = 35;\nconst S_ELEMENT0 = 36;\nconst S_ELEMENT1 = 37;\nconst S_ELEMENT2 = 38;\nconst S_ELEMENT3 = 39;\nconst S_ELEMENT4 = 40;\nconst S_ELEMENT5 = 41;\nconst S_ELEMENT6 = 42;\nconst S_ELEMENT7 = 43;\nconst S_DECL_CLOSE = 44;\nconst S_ERROR = 45;\n\n/** xmlrole.c's PROLOG_STATE for the document entity. */\nclass PrologState {\n state = S_PROLOG0;\n level = 0;\n roleNone = ROLE_NONE;\n private readonly tokenizer: Tokenizer;\n\n constructor(tokenizer: Tokenizer) {\n this.tokenizer = tokenizer;\n }\n\n private matches(ptr: number, end: number, keyword: string): boolean {\n return (\n end - ptr === keyword.length &&\n this.tokenizer.text.startsWith(keyword, ptr)\n );\n }\n\n private common(): number {\n this.state = S_ERROR;\n return ROLE_ERROR;\n }\n\n private goto(state: number, role: number): number {\n this.state = state;\n return role;\n }\n\n private declClose(state: number, roleNone: number, role: number): number {\n this.roleNone = roleNone;\n return this.goto(state, role);\n }\n\n role(tok: number, ptr: number, end: number): number {\n switch (this.state) {\n case S_PROLOG0:\n case S_PROLOG1:\n switch (tok) {\n case TOK_PROLOG_S:\n return this.goto(S_PROLOG1, ROLE_NONE);\n case TOK_XML_DECL:\n if (this.state === S_PROLOG0) {\n return this.goto(S_PROLOG1, ROLE_XML_DECL);\n }\n break;\n case TOK_PI:\n return this.goto(S_PROLOG1, ROLE_PI);\n case TOK_COMMENT:\n return this.goto(S_PROLOG1, ROLE_COMMENT);\n case TOK_BOM:\n return ROLE_NONE;\n case TOK_DECL_OPEN:\n if (!this.matches(ptr + 2, end, 'DOCTYPE')) {\n break;\n }\n return this.goto(S_DOCTYPE0, ROLE_DOCTYPE_NONE);\n case TOK_INSTANCE_START:\n return this.goto(S_ERROR, ROLE_INSTANCE_START);\n default:\n break;\n }\n return this.common();\n case S_PROLOG2:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_NONE;\n case TOK_PI:\n return ROLE_PI;\n case TOK_COMMENT:\n return ROLE_COMMENT;\n case TOK_INSTANCE_START:\n return this.goto(S_ERROR, ROLE_INSTANCE_START);\n default:\n return this.common();\n }\n case S_DOCTYPE0:\n if (tok === TOK_PROLOG_S) {\n return ROLE_DOCTYPE_NONE;\n }\n if (tok === TOK_NAME) {\n return this.goto(S_DOCTYPE1, ROLE_DOCTYPE_NAME);\n }\n return this.common();\n case S_DOCTYPE1:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_DOCTYPE_NONE;\n case TOK_OPEN_BRACKET:\n return this.goto(S_INTERNAL_SUBSET, ROLE_DOCTYPE_INTERNAL_SUBSET);\n case TOK_DECL_CLOSE:\n return this.goto(S_PROLOG2, ROLE_DOCTYPE_CLOSE);\n case TOK_NAME:\n if (this.matches(ptr, end, 'SYSTEM')) {\n return this.goto(S_DOCTYPE3, ROLE_DOCTYPE_NONE);\n }\n if (this.matches(ptr, end, 'PUBLIC')) {\n return this.goto(S_DOCTYPE2, ROLE_DOCTYPE_NONE);\n }\n break;\n default:\n break;\n }\n return this.common();\n case S_DOCTYPE2:\n if (tok === TOK_PROLOG_S) {\n return ROLE_DOCTYPE_NONE;\n }\n if (tok === TOK_LITERAL) {\n return this.goto(S_DOCTYPE3, ROLE_DOCTYPE_PUBLIC_ID);\n }\n return this.common();\n case S_DOCTYPE3:\n if (tok === TOK_PROLOG_S) {\n return ROLE_DOCTYPE_NONE;\n }\n if (tok === TOK_LITERAL) {\n return this.goto(S_DOCTYPE4, ROLE_DOCTYPE_SYSTEM_ID);\n }\n return this.common();\n case S_DOCTYPE4:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_DOCTYPE_NONE;\n case TOK_OPEN_BRACKET:\n return this.goto(S_INTERNAL_SUBSET, ROLE_DOCTYPE_INTERNAL_SUBSET);\n case TOK_DECL_CLOSE:\n return this.goto(S_PROLOG2, ROLE_DOCTYPE_CLOSE);\n default:\n return this.common();\n }\n case S_DOCTYPE5:\n if (tok === TOK_PROLOG_S) {\n return ROLE_DOCTYPE_NONE;\n }\n if (tok === TOK_DECL_CLOSE) {\n return this.goto(S_PROLOG2, ROLE_DOCTYPE_CLOSE);\n }\n return this.common();\n case S_INTERNAL_SUBSET:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_NONE;\n case TOK_DECL_OPEN:\n if (this.matches(ptr + 2, end, 'ENTITY')) {\n return this.goto(S_ENTITY0, ROLE_ENTITY_NONE);\n }\n if (this.matches(ptr + 2, end, 'ATTLIST')) {\n return this.goto(S_ATTLIST0, ROLE_ATTLIST_NONE);\n }\n if (this.matches(ptr + 2, end, 'ELEMENT')) {\n return this.goto(S_ELEMENT0, ROLE_ELEMENT_NONE);\n }\n if (this.matches(ptr + 2, end, 'NOTATION')) {\n return this.goto(S_NOTATION0, ROLE_NOTATION_NONE);\n }\n break;\n case TOK_PI:\n return ROLE_PI;\n case TOK_COMMENT:\n return ROLE_COMMENT;\n case TOK_PARAM_ENTITY_REF:\n return ROLE_PARAM_ENTITY_REF;\n case TOK_CLOSE_BRACKET:\n return this.goto(S_DOCTYPE5, ROLE_DOCTYPE_NONE);\n case TOK_NONE:\n return ROLE_NONE;\n default:\n break;\n }\n return this.common();\n case S_ENTITY0:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ENTITY_NONE;\n case TOK_PERCENT:\n return this.goto(S_ENTITY1, ROLE_ENTITY_NONE);\n case TOK_NAME:\n return this.goto(S_ENTITY2, ROLE_GENERAL_ENTITY_NAME);\n default:\n return this.common();\n }\n case S_ENTITY1:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ENTITY_NONE;\n }\n if (tok === TOK_NAME) {\n return this.goto(S_ENTITY7, ROLE_PARAM_ENTITY_NAME);\n }\n return this.common();\n case S_ENTITY2:\n case S_ENTITY7: {\n const general = this.state === S_ENTITY2;\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ENTITY_NONE;\n case TOK_NAME:\n if (this.matches(ptr, end, 'SYSTEM')) {\n return this.goto(\n general ? S_ENTITY4 : S_ENTITY9,\n ROLE_ENTITY_NONE,\n );\n }\n if (this.matches(ptr, end, 'PUBLIC')) {\n return this.goto(\n general ? S_ENTITY3 : S_ENTITY8,\n ROLE_ENTITY_NONE,\n );\n }\n break;\n case TOK_LITERAL:\n return this.declClose(\n S_DECL_CLOSE,\n ROLE_ENTITY_NONE,\n ROLE_ENTITY_VALUE,\n );\n default:\n break;\n }\n return this.common();\n }\n case S_ENTITY3:\n case S_ENTITY8:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ENTITY_NONE;\n }\n if (tok === TOK_LITERAL) {\n return this.goto(\n this.state === S_ENTITY3 ? S_ENTITY4 : S_ENTITY9,\n ROLE_ENTITY_PUBLIC_ID,\n );\n }\n return this.common();\n case S_ENTITY4:\n case S_ENTITY9:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ENTITY_NONE;\n }\n if (tok === TOK_LITERAL) {\n return this.goto(\n this.state === S_ENTITY4 ? S_ENTITY5 : S_ENTITY10,\n ROLE_ENTITY_SYSTEM_ID,\n );\n }\n return this.common();\n case S_ENTITY5:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ENTITY_NONE;\n case TOK_DECL_CLOSE:\n return this.goto(S_INTERNAL_SUBSET, ROLE_ENTITY_COMPLETE);\n case TOK_NAME:\n if (this.matches(ptr, end, 'NDATA')) {\n return this.goto(S_ENTITY6, ROLE_ENTITY_NONE);\n }\n break;\n default:\n break;\n }\n return this.common();\n case S_ENTITY6:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ENTITY_NONE;\n }\n if (tok === TOK_NAME) {\n return this.declClose(\n S_DECL_CLOSE,\n ROLE_ENTITY_NONE,\n ROLE_ENTITY_NOTATION_NAME,\n );\n }\n return this.common();\n case S_ENTITY10:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ENTITY_NONE;\n }\n if (tok === TOK_DECL_CLOSE) {\n return this.goto(S_INTERNAL_SUBSET, ROLE_ENTITY_COMPLETE);\n }\n return this.common();\n case S_NOTATION0:\n if (tok === TOK_PROLOG_S) {\n return ROLE_NOTATION_NONE;\n }\n if (tok === TOK_NAME) {\n return this.goto(S_NOTATION1, ROLE_NOTATION_NAME);\n }\n return this.common();\n case S_NOTATION1:\n if (tok === TOK_PROLOG_S) {\n return ROLE_NOTATION_NONE;\n }\n if (tok === TOK_NAME) {\n if (this.matches(ptr, end, 'SYSTEM')) {\n return this.goto(S_NOTATION3, ROLE_NOTATION_NONE);\n }\n if (this.matches(ptr, end, 'PUBLIC')) {\n return this.goto(S_NOTATION2, ROLE_NOTATION_NONE);\n }\n }\n return this.common();\n case S_NOTATION2:\n if (tok === TOK_PROLOG_S) {\n return ROLE_NOTATION_NONE;\n }\n if (tok === TOK_LITERAL) {\n return this.goto(S_NOTATION4, ROLE_NOTATION_PUBLIC_ID);\n }\n return this.common();\n case S_NOTATION3:\n if (tok === TOK_PROLOG_S) {\n return ROLE_NOTATION_NONE;\n }\n if (tok === TOK_LITERAL) {\n return this.declClose(\n S_DECL_CLOSE,\n ROLE_NOTATION_NONE,\n ROLE_NOTATION_SYSTEM_ID,\n );\n }\n return this.common();\n case S_NOTATION4:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_NOTATION_NONE;\n case TOK_LITERAL:\n return this.declClose(\n S_DECL_CLOSE,\n ROLE_NOTATION_NONE,\n ROLE_NOTATION_SYSTEM_ID,\n );\n case TOK_DECL_CLOSE:\n return this.goto(S_INTERNAL_SUBSET, ROLE_NOTATION_NO_SYSTEM_ID);\n default:\n return this.common();\n }\n case S_ATTLIST0:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ATTLIST_NONE;\n }\n if (tok === TOK_NAME) {\n return this.goto(S_ATTLIST1, ROLE_ATTLIST_ELEMENT_NAME);\n }\n return this.common();\n case S_ATTLIST1:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ATTLIST_NONE;\n case TOK_DECL_CLOSE:\n return this.goto(S_INTERNAL_SUBSET, ROLE_ATTLIST_NONE);\n case TOK_NAME:\n return this.goto(S_ATTLIST2, ROLE_ATTRIBUTE_NAME);\n default:\n return this.common();\n }\n case S_ATTLIST2:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ATTLIST_NONE;\n case TOK_NAME: {\n for (const [index, keyword] of ATTRIBUTE_TYPE_KEYWORDS.entries()) {\n if (this.matches(ptr, end, keyword)) {\n return this.goto(S_ATTLIST8, ROLE_ATTRIBUTE_TYPE_CDATA + index);\n }\n }\n if (this.matches(ptr, end, 'NOTATION')) {\n return this.goto(S_ATTLIST5, ROLE_ATTLIST_NONE);\n }\n break;\n }\n case TOK_OPEN_PAREN:\n return this.goto(S_ATTLIST3, ROLE_ATTLIST_NONE);\n default:\n break;\n }\n return this.common();\n case S_ATTLIST3:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ATTLIST_NONE;\n }\n if (tok === TOK_NMTOKEN || tok === TOK_NAME) {\n return this.goto(S_ATTLIST4, ROLE_ATTRIBUTE_ENUM_VALUE);\n }\n return this.common();\n case S_ATTLIST4:\n case S_ATTLIST7: {\n const enumeration = this.state === S_ATTLIST4;\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ATTLIST_NONE;\n case TOK_CLOSE_PAREN:\n return this.goto(S_ATTLIST8, ROLE_ATTLIST_NONE);\n case TOK_OR:\n return this.goto(\n enumeration ? S_ATTLIST3 : S_ATTLIST6,\n ROLE_ATTLIST_NONE,\n );\n default:\n return this.common();\n }\n }\n case S_ATTLIST5:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ATTLIST_NONE;\n }\n if (tok === TOK_OPEN_PAREN) {\n return this.goto(S_ATTLIST6, ROLE_ATTLIST_NONE);\n }\n return this.common();\n case S_ATTLIST6:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ATTLIST_NONE;\n }\n if (tok === TOK_NAME) {\n return this.goto(S_ATTLIST7, ROLE_ATTRIBUTE_NOTATION_VALUE);\n }\n return this.common();\n case S_ATTLIST8:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ATTLIST_NONE;\n case TOK_POUND_NAME:\n if (this.matches(ptr + 1, end, 'IMPLIED')) {\n return this.goto(S_ATTLIST1, ROLE_IMPLIED_ATTRIBUTE_VALUE);\n }\n if (this.matches(ptr + 1, end, 'REQUIRED')) {\n return this.goto(S_ATTLIST1, ROLE_REQUIRED_ATTRIBUTE_VALUE);\n }\n if (this.matches(ptr + 1, end, 'FIXED')) {\n return this.goto(S_ATTLIST9, ROLE_ATTLIST_NONE);\n }\n break;\n case TOK_LITERAL:\n return this.goto(S_ATTLIST1, ROLE_DEFAULT_ATTRIBUTE_VALUE);\n default:\n break;\n }\n return this.common();\n case S_ATTLIST9:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ATTLIST_NONE;\n }\n if (tok === TOK_LITERAL) {\n return this.goto(S_ATTLIST1, ROLE_FIXED_ATTRIBUTE_VALUE);\n }\n return this.common();\n case S_ELEMENT0:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ELEMENT_NONE;\n }\n if (tok === TOK_NAME) {\n return this.goto(S_ELEMENT1, ROLE_ELEMENT_NAME);\n }\n return this.common();\n case S_ELEMENT1:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ELEMENT_NONE;\n case TOK_NAME:\n if (this.matches(ptr, end, 'EMPTY')) {\n return this.declClose(\n S_DECL_CLOSE,\n ROLE_ELEMENT_NONE,\n ROLE_CONTENT_EMPTY,\n );\n }\n if (this.matches(ptr, end, 'ANY')) {\n return this.declClose(\n S_DECL_CLOSE,\n ROLE_ELEMENT_NONE,\n ROLE_CONTENT_ANY,\n );\n }\n break;\n case TOK_OPEN_PAREN:\n this.level = 1;\n return this.goto(S_ELEMENT2, ROLE_GROUP_OPEN);\n default:\n break;\n }\n return this.common();\n case S_ELEMENT2:\n case S_ELEMENT6:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ELEMENT_NONE;\n case TOK_POUND_NAME:\n if (\n this.state === S_ELEMENT2 &&\n this.matches(ptr + 1, end, 'PCDATA')\n ) {\n return this.goto(S_ELEMENT3, ROLE_CONTENT_PCDATA);\n }\n break;\n case TOK_OPEN_PAREN:\n if (this.state === S_ELEMENT2) {\n this.level = 2;\n return this.goto(S_ELEMENT6, ROLE_GROUP_OPEN);\n }\n this.level += 1;\n return ROLE_GROUP_OPEN;\n case TOK_NAME:\n return this.goto(S_ELEMENT7, ROLE_CONTENT_ELEMENT);\n case TOK_NAME_QUESTION:\n return this.goto(S_ELEMENT7, ROLE_CONTENT_ELEMENT_OPT);\n case TOK_NAME_ASTERISK:\n return this.goto(S_ELEMENT7, ROLE_CONTENT_ELEMENT_REP);\n case TOK_NAME_PLUS:\n return this.goto(S_ELEMENT7, ROLE_CONTENT_ELEMENT_PLUS);\n default:\n break;\n }\n return this.common();\n case S_ELEMENT3:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ELEMENT_NONE;\n case TOK_CLOSE_PAREN:\n return this.declClose(\n S_DECL_CLOSE,\n ROLE_ELEMENT_NONE,\n ROLE_GROUP_CLOSE,\n );\n case TOK_CLOSE_PAREN_ASTERISK:\n return this.declClose(\n S_DECL_CLOSE,\n ROLE_ELEMENT_NONE,\n ROLE_GROUP_CLOSE_REP,\n );\n case TOK_OR:\n return this.goto(S_ELEMENT4, ROLE_ELEMENT_NONE);\n default:\n return this.common();\n }\n case S_ELEMENT4:\n if (tok === TOK_PROLOG_S) {\n return ROLE_ELEMENT_NONE;\n }\n if (tok === TOK_NAME) {\n return this.goto(S_ELEMENT5, ROLE_CONTENT_ELEMENT);\n }\n return this.common();\n case S_ELEMENT5:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ELEMENT_NONE;\n case TOK_CLOSE_PAREN_ASTERISK:\n return this.declClose(\n S_DECL_CLOSE,\n ROLE_ELEMENT_NONE,\n ROLE_GROUP_CLOSE_REP,\n );\n case TOK_OR:\n return this.goto(S_ELEMENT4, ROLE_ELEMENT_NONE);\n default:\n return this.common();\n }\n case S_ELEMENT7:\n switch (tok) {\n case TOK_PROLOG_S:\n return ROLE_ELEMENT_NONE;\n case TOK_CLOSE_PAREN:\n return this.closeGroup(ROLE_GROUP_CLOSE);\n case TOK_CLOSE_PAREN_ASTERISK:\n return this.closeGroup(ROLE_GROUP_CLOSE_REP);\n case TOK_CLOSE_PAREN_QUESTION:\n return this.closeGroup(ROLE_GROUP_CLOSE_OPT);\n case TOK_CLOSE_PAREN_PLUS:\n return this.closeGroup(ROLE_GROUP_CLOSE_PLUS);\n case TOK_COMMA:\n return this.goto(S_ELEMENT6, ROLE_GROUP_SEQUENCE);\n case TOK_OR:\n return this.goto(S_ELEMENT6, ROLE_GROUP_CHOICE);\n default:\n return this.common();\n }\n case S_DECL_CLOSE:\n if (tok === TOK_PROLOG_S) {\n return this.roleNone;\n }\n if (tok === TOK_DECL_CLOSE) {\n return this.goto(S_INTERNAL_SUBSET, this.roleNone);\n }\n return this.common();\n default:\n return ROLE_NONE;\n }\n }\n\n private closeGroup(role: number): number {\n this.level -= 1;\n if (this.level === 0) {\n this.roleNone = ROLE_ELEMENT_NONE;\n this.state = S_DECL_CLOSE;\n }\n return role;\n }\n}\n\n// ---------------------------------------------------------------------------\n// The parser (xmlparse.c)\n\n/** Callbacks pyexpat would invoke; any exception aborts parsing. */\nexport interface ExpatHandlers {\n /**\n * Called for every attribute as a start tag is read, before the attributes\n * are stored (not in pyexpat): a handler that throws limits their cost.\n */\n attribute?: () => void;\n /** Start of an element; `attributes` is `[name, value, name, value, ...]`. */\n startElement: (name: string, attributes: string[]) => void;\n endElement: (name: string) => void;\n characterData: (data: string) => void;\n /** An entity declaration Expat would store (xmltodict raises here). */\n entityDecl: () => void;\n /**\n * `StartDoctypeDeclHandler`: called where Expat calls it, at the `[` of\n * the internal subset or at the closing `>` of a DOCTYPE without one.\n */\n startDoctypeDecl?: () => void;\n}\n\ninterface DefaultAttribute {\n readonly name: string;\n readonly value: string | null;\n readonly isCdata: boolean;\n}\n\ninterface ElementType {\n readonly defaults: DefaultAttribute[];\n // First declaration of each attribute name (index into `defaults`).\n readonly firstIndex: Map<string, number>;\n}\n\ninterface RawAttribute {\n name: number;\n valueStart: number;\n valueEnd: number;\n normalized: boolean;\n}\n\nconst GROUP_PIPE = 1;\nconst GROUP_COMMA = 2;\n\nclass DocumentParser {\n private readonly tok: Tokenizer;\n private readonly prolog: PrologState;\n private readonly handlers: ExpatHandlers;\n eventPtr = 0;\n // DTD state.\n private standalone = false;\n private hasParamEntityRefs = false;\n private keepProcessing = true;\n private declEntity = false;\n private doctypeSysid = false;\n private readonly groupConnector: number[] = [];\n private readonly elementTypes = new Map<string, ElementType>();\n private readonly maybeTokenized = new Set<string>();\n private declElementType = '';\n private declAttributeId = '';\n private declAttributeIsCdata = false;\n private declAttributeIsId = false;\n // A DOCTYPE name was read and startDoctypeDecl has not been called yet.\n private doctypePending = false;\n\n constructor(tokenizer: Tokenizer, handlers: ExpatHandlers) {\n this.tok = tokenizer;\n this.prolog = new PrologState(tokenizer);\n this.handlers = handlers;\n }\n\n private fail(code: number, at?: number): never {\n if (at !== undefined) {\n this.eventPtr = at;\n }\n throw new ParseFailure(code);\n }\n\n /** initScan (xmltok.c) for UTF-8 input, then the prolog processor. */\n run(firstTok: number, firstNext: number): void {\n this.doProlog(0, firstTok, firstNext);\n }\n\n private doProlog(start: number, firstTok: number, firstNext: number): void {\n const { tok: tokenizer } = this;\n let s = start;\n let tok = firstTok;\n let next = firstNext;\n for (;;) {\n this.eventPtr = s;\n if (tok <= 0) {\n switch (tok) {\n case TOK_INVALID:\n this.fail(XML_ERROR_INVALID_TOKEN, next);\n break;\n case TOK_PARTIAL:\n this.fail(XML_ERROR_UNCLOSED_TOKEN);\n break;\n case TOK_PARTIAL_CHAR:\n this.fail(XML_ERROR_PARTIAL_CHAR);\n break;\n case -TOK_PROLOG_S:\n tok = TOK_PROLOG_S;\n break;\n case TOK_NONE:\n this.fail(XML_ERROR_NO_ELEMENTS);\n break;\n default:\n tok = -tok;\n next = tokenizer.end;\n }\n }\n const role = this.prolog.role(tok, s, next);\n switch (role) {\n case ROLE_XML_DECL:\n this.processXmlDecl(s, next);\n break;\n case ROLE_DOCTYPE_NAME:\n this.doctypeSysid = false;\n this.doctypePending = this.handlers.startDoctypeDecl !== undefined;\n break;\n case ROLE_DOCTYPE_INTERNAL_SUBSET:\n if (this.doctypePending) {\n this.doctypePending = false;\n this.handlers.startDoctypeDecl?.();\n }\n break;\n case ROLE_DOCTYPE_PUBLIC_ID:\n case ROLE_ENTITY_PUBLIC_ID:\n case ROLE_NOTATION_PUBLIC_ID: {\n if (role === ROLE_DOCTYPE_PUBLIC_ID) {\n this.declEntity = true;\n this.hasParamEntityRefs = true;\n }\n const bad = tokenizer.publicIdBadPosition(s, next);\n if (bad >= 0) {\n this.fail(XML_ERROR_PUBLICID, bad);\n }\n break;\n }\n case ROLE_DOCTYPE_CLOSE:\n if (this.doctypePending) {\n this.doctypePending = false;\n this.handlers.startDoctypeDecl?.();\n }\n if (this.doctypeSysid) {\n this.hasParamEntityRefs = true;\n }\n break;\n case ROLE_INSTANCE_START:\n this.doContent(s);\n return;\n case ROLE_ATTLIST_ELEMENT_NAME:\n this.declElementType = tokenizer.text.slice(s, next);\n break;\n case ROLE_ATTRIBUTE_NAME:\n this.declAttributeId = tokenizer.text.slice(s, next);\n this.declAttributeIsCdata = false;\n this.declAttributeIsId = false;\n break;\n case ROLE_ATTRIBUTE_TYPE_CDATA:\n this.declAttributeIsCdata = true;\n break;\n case ROLE_ATTRIBUTE_TYPE_ID:\n this.declAttributeIsId = true;\n break;\n case ROLE_IMPLIED_ATTRIBUTE_VALUE:\n case ROLE_REQUIRED_ATTRIBUTE_VALUE:\n if (this.keepProcessing) {\n this.defineAttribute(null, this.declAttributeIsId);\n }\n break;\n case ROLE_DEFAULT_ATTRIBUTE_VALUE:\n case ROLE_FIXED_ATTRIBUTE_VALUE:\n if (this.keepProcessing) {\n const value = this.storeAttributeValue(\n this.declAttributeIsCdata,\n s + 1,\n next - 1,\n );\n this.defineAttribute(value, false);\n }\n break;\n case ROLE_ENTITY_VALUE:\n if (this.keepProcessing) {\n const error = this.storeEntityValue(s + 1, next - 1);\n if (this.declEntity) {\n this.handlers.entityDecl();\n }\n if (error !== 0) {\n throw new ParseFailure(error);\n }\n }\n break;\n case ROLE_DOCTYPE_SYSTEM_ID:\n this.hasParamEntityRefs = true;\n this.doctypeSysid = true;\n this.declEntity = true;\n break;\n case ROLE_ENTITY_COMPLETE:\n case ROLE_ENTITY_NOTATION_NAME:\n if (this.keepProcessing && this.declEntity) {\n this.handlers.entityDecl();\n }\n break;\n case ROLE_GENERAL_ENTITY_NAME:\n this.declEntity =\n tokenizer.predefinedEntity(s, next) === '' && this.keepProcessing;\n break;\n case ROLE_PARAM_ENTITY_NAME:\n this.declEntity = this.keepProcessing;\n break;\n case ROLE_ERROR:\n if (tok === TOK_PARAM_ENTITY_REF) {\n this.fail(XML_ERROR_PARAM_ENTITY_REF);\n }\n if (tok === TOK_XML_DECL) {\n this.fail(XML_ERROR_MISPLACED_XML_PI);\n }\n this.fail(XML_ERROR_SYNTAX);\n break;\n case ROLE_GROUP_OPEN:\n this.groupConnector[this.prolog.level] = 0;\n break;\n case ROLE_GROUP_SEQUENCE:\n if (this.groupConnector[this.prolog.level] === GROUP_PIPE) {\n this.fail(XML_ERROR_SYNTAX);\n }\n this.groupConnector[this.prolog.level] = GROUP_COMMA;\n break;\n case ROLE_GROUP_CHOICE:\n if (this.groupConnector[this.prolog.level] === GROUP_COMMA) {\n this.fail(XML_ERROR_SYNTAX);\n }\n this.groupConnector[this.prolog.level] = GROUP_PIPE;\n break;\n case ROLE_PARAM_ENTITY_REF:\n // Parameter entity parsing is off in pyexpat: the reference is\n // skipped and, unless standalone, later declarations are ignored.\n this.hasParamEntityRefs = true;\n this.keepProcessing = this.standalone;\n break;\n default:\n break;\n }\n s = next;\n tok = tokenizer.prologTok(s);\n ({ next } = tokenizer);\n }\n }\n\n private elementType(name: string): ElementType {\n let type = this.elementTypes.get(name);\n if (!type) {\n type = { defaults: [], firstIndex: new Map() };\n this.elementTypes.set(name, type);\n }\n return type;\n }\n\n private defineAttribute(value: string | null, isId: boolean): void {\n const type = this.elementType(this.declElementType);\n const name = this.declAttributeId;\n // The first declaration of an attribute is binding.\n if ((value !== null || isId) && type.firstIndex.has(name)) {\n return;\n }\n type.defaults.push({ isCdata: this.declAttributeIsCdata, name, value });\n if (!this.declAttributeIsCdata) {\n this.maybeTokenized.add(name);\n }\n if (!type.firstIndex.has(name)) {\n type.firstIndex.set(name, type.defaults.length - 1);\n }\n }\n\n // storeEntityValue for an entity Expat won't keep (a predefined name): only\n // its errors matter. Returns an XML_Error code (0 for none).\n private storeEntityValue(start: number, end: number): number {\n const { tok: tokenizer } = this;\n let ptr = start;\n for (;;) {\n const tok = tokenizer.entityValueTok(ptr, end);\n switch (tok) {\n case TOK_PARAM_ENTITY_REF:\n this.eventPtr = ptr;\n return XML_ERROR_PARAM_ENTITY_REF;\n case TOK_NONE:\n return 0;\n case TOK_CHAR_REF:\n if (tokenizer.charRefNumber(ptr) < 0) {\n this.eventPtr = ptr;\n return XML_ERROR_BAD_CHAR_REF;\n }\n break;\n case TOK_PARTIAL:\n this.eventPtr = ptr;\n return XML_ERROR_INVALID_TOKEN;\n case TOK_INVALID:\n this.eventPtr = tokenizer.next;\n return XML_ERROR_INVALID_TOKEN;\n case TOK_TRAILING_CR:\n tokenizer.next = ptr + 1;\n break;\n default:\n break;\n }\n ptr = tokenizer.next;\n }\n }\n\n // storeAttributeValue + appendAttributeValue.\n private storeAttributeValue(\n isCdata: boolean,\n start: number,\n end: number,\n ): string {\n const { tok: tokenizer } = this;\n let value = '';\n let ptr = start;\n const lastIsSpace = (): boolean =>\n value.length === 0 || value.endsWith(' ');\n for (;;) {\n const tok = tokenizer.attributeValueTok(ptr, end);\n let { next } = tokenizer;\n switch (tok) {\n case TOK_NONE:\n if (!isCdata && value.endsWith(' ')) {\n value = value.slice(0, -1);\n }\n return value;\n case TOK_INVALID:\n this.fail(XML_ERROR_INVALID_TOKEN, next);\n break;\n case TOK_PARTIAL:\n this.fail(XML_ERROR_INVALID_TOKEN, ptr);\n break;\n case TOK_CHAR_REF: {\n const code = tokenizer.charRefNumber(ptr);\n if (code < 0) {\n this.fail(XML_ERROR_BAD_CHAR_REF, ptr);\n }\n if (!isCdata && code === 0x20 && lastIsSpace()) {\n break;\n }\n value += String.fromCodePoint(code);\n break;\n }\n case TOK_DATA_CHARS:\n value += tokenizer.text.slice(ptr, next);\n break;\n case TOK_TRAILING_CR:\n case TOK_ATTRIBUTE_VALUE_S:\n case TOK_DATA_NEWLINE:\n if (tok === TOK_TRAILING_CR) {\n next = ptr + 1;\n }\n if (!isCdata && lastIsSpace()) {\n break;\n }\n value += ' ';\n break;\n case TOK_ENTITY_REF: {\n const char = tokenizer.predefinedEntity(ptr + 1, next - 1);\n if (char !== '') {\n value += char;\n break;\n }\n if (!this.hasParamEntityRefs || this.standalone) {\n this.fail(XML_ERROR_UNDEFINED_ENTITY);\n }\n break;\n }\n default:\n // TOK_PARTIAL_CHAR: unreachable after the tokenizer validated it.\n this.fail(XML_ERROR_INVALID_TOKEN, ptr);\n }\n ptr = next;\n }\n }\n\n private processXmlDecl(s: number, next: number): void {\n const result = parseXmlDecl(this.tok, s, next);\n if (result.bad >= 0) {\n this.fail(XML_ERROR_XML_DECL, result.bad);\n }\n if (result.standalone) {\n this.standalone = true;\n }\n }\n\n // XmlGetAttributes (xmltok_impl.c getAtts); ptr points to \"<\".\n private getAttributes(start: number): RawAttribute[] {\n const { tok: tokenizer } = this;\n const IN_NAME = 0;\n const IN_VALUE = 1;\n const OTHER = 2;\n let state = IN_NAME;\n let open = 0;\n const atts: RawAttribute[] = [];\n let current: RawAttribute = {\n name: 0,\n normalized: true,\n valueEnd: 0,\n valueStart: 0,\n };\n for (let ptr = start + 1; ; ptr += 1) {\n const type = tokenizer.type(ptr);\n switch (type) {\n case BT_LEAD4:\n case BT_NONASCII:\n case BT_NMSTRT:\n case BT_HEX:\n if (state === OTHER) {\n current = {\n name: ptr,\n normalized: true,\n valueEnd: 0,\n valueStart: 0,\n };\n state = IN_NAME;\n }\n if (type === BT_LEAD4) {\n ptr += 1;\n }\n break;\n case BT_QUOT:\n case BT_APOS:\n if (state !== IN_VALUE) {\n current.valueStart = ptr + 1;\n state = IN_VALUE;\n open = type;\n } else if (open === type) {\n state = OTHER;\n current.valueEnd = ptr;\n atts.push(current);\n this.handlers.attribute?.();\n }\n break;\n case BT_AMP:\n current.normalized = false;\n break;\n case BT_S:\n if (state === IN_NAME) {\n state = OTHER;\n } else if (\n state === IN_VALUE &&\n current.normalized &&\n (ptr === current.valueStart ||\n !tokenizer.is(ptr, ' ') ||\n tokenizer.is(ptr + 1, ' ') ||\n tokenizer.type(ptr + 1) === open)\n ) {\n current.normalized = false;\n }\n break;\n case BT_CR:\n case BT_LF:\n if (state === IN_NAME) {\n state = OTHER;\n } else if (state === IN_VALUE) {\n current.normalized = false;\n }\n break;\n case BT_GT:\n case BT_SOL:\n if (state !== IN_VALUE) {\n return atts;\n }\n break;\n default:\n break;\n }\n }\n }\n\n // storeAtts: the [name, value, ...] list pyexpat passes with\n // ordered_attributes, including defaults from the internal DTD subset.\n private storeAtts(tagStart: number, elementName: string): string[] {\n const { tok: tokenizer } = this;\n const elementType = this.elementTypes.get(elementName);\n const seen = new Set<string>();\n const result: string[] = [];\n for (const att of this.getAttributes(tagStart)) {\n const name = tokenizer.text.slice(\n att.name,\n att.name + tokenizer.nameLength(att.name),\n );\n if (seen.has(name)) {\n this.fail(XML_ERROR_DUPLICATE_ATTRIBUTE, att.name);\n }\n seen.add(name);\n let value: string;\n if (att.normalized) {\n value = tokenizer.text.slice(att.valueStart, att.valueEnd);\n } else {\n let isCdata = true;\n if (elementType && this.maybeTokenized.has(name)) {\n const index = elementType.firstIndex.get(name);\n if (index !== undefined) {\n isCdata = elementType.defaults[index]?.isCdata ?? true;\n }\n }\n value = this.storeAttributeValue(isCdata, att.valueStart, att.valueEnd);\n }\n result.push(name, value);\n }\n for (const defaultAttribute of elementType?.defaults ?? []) {\n if (!seen.has(defaultAttribute.name) && defaultAttribute.value !== null) {\n seen.add(defaultAttribute.name);\n result.push(defaultAttribute.name, defaultAttribute.value);\n }\n }\n return result;\n }\n\n private doContent(start: number): void {\n const { tok: tokenizer, handlers } = this;\n // Open elements, as [raw name start, raw name length] pairs: an explicit\n // stack, so deep nesting can't overflow the call stack.\n const tagStack: number[] = [];\n const nameStack: string[] = [];\n let s = start;\n for (;;) {\n this.eventPtr = s;\n const tok = tokenizer.contentTok(s);\n const { next } = tokenizer;\n switch (tok) {\n case TOK_TRAILING_CR:\n handlers.characterData('\\n');\n this.fail(XML_ERROR_NO_ELEMENTS);\n break;\n case TOK_NONE:\n this.fail(XML_ERROR_NO_ELEMENTS);\n break;\n case TOK_INVALID:\n this.fail(XML_ERROR_INVALID_TOKEN, next);\n break;\n case TOK_PARTIAL:\n this.fail(XML_ERROR_UNCLOSED_TOKEN);\n break;\n case TOK_PARTIAL_CHAR:\n this.fail(XML_ERROR_PARTIAL_CHAR);\n break;\n case TOK_ENTITY_REF: {\n const char = tokenizer.predefinedEntity(s + 1, next - 1);\n if (char !== '') {\n handlers.characterData(char);\n } else if (!this.hasParamEntityRefs || this.standalone) {\n this.fail(XML_ERROR_UNDEFINED_ENTITY);\n }\n break;\n }\n case TOK_START_TAG_NO_ATTS:\n case TOK_START_TAG_WITH_ATTS: {\n const nameLength = tokenizer.nameLength(s + 1);\n const name = tokenizer.text.slice(s + 1, s + 1 + nameLength);\n tagStack.push(s + 1, nameLength);\n nameStack.push(name);\n const attributes = this.storeAtts(s, name);\n handlers.startElement(name, attributes);\n break;\n }\n case TOK_EMPTY_ELEMENT_NO_ATTS:\n case TOK_EMPTY_ELEMENT_WITH_ATTS: {\n const name = tokenizer.text.slice(\n s + 1,\n s + 1 + tokenizer.nameLength(s + 1),\n );\n const attributes = this.storeAtts(s, name);\n handlers.startElement(name, attributes);\n this.eventPtr = next;\n handlers.endElement(name);\n if (nameStack.length === 0) {\n this.epilog(next);\n return;\n }\n break;\n }\n case TOK_END_TAG: {\n const rawName = s + 2;\n const length = tokenizer.nameLength(rawName);\n const openLength = tagStack.pop() ?? 0;\n const openStart = tagStack.pop() ?? 0;\n if (\n length !== openLength ||\n tokenizer.text.slice(rawName, rawName + length) !==\n tokenizer.text.slice(openStart, openStart + openLength)\n ) {\n this.fail(XML_ERROR_TAG_MISMATCH, rawName);\n }\n handlers.endElement(nameStack.pop() ?? '');\n if (nameStack.length === 0) {\n this.epilog(next);\n return;\n }\n break;\n }\n case TOK_CHAR_REF: {\n const code = tokenizer.charRefNumber(s);\n if (code < 0) {\n this.fail(XML_ERROR_BAD_CHAR_REF);\n }\n handlers.characterData(String.fromCodePoint(code));\n break;\n }\n case TOK_XML_DECL:\n this.fail(XML_ERROR_MISPLACED_XML_PI);\n break;\n case TOK_DATA_NEWLINE:\n handlers.characterData('\\n');\n break;\n case TOK_CDATA_SECT_OPEN: {\n const after = this.doCdataSection(next);\n this.eventPtr = after;\n s = after;\n continue;\n }\n case TOK_TRAILING_RSQB:\n handlers.characterData(tokenizer.text.slice(s, tokenizer.end));\n this.fail(XML_ERROR_NO_ELEMENTS, tokenizer.end);\n break;\n case TOK_DATA_CHARS:\n handlers.characterData(tokenizer.text.slice(s, next));\n break;\n default:\n // PI, comment: no handler.\n break;\n }\n s = next;\n }\n }\n\n private doCdataSection(start: number): number {\n const { tok: tokenizer, handlers } = this;\n let s = start;\n this.eventPtr = s;\n for (;;) {\n const tok = tokenizer.cdataSectionTok(s);\n const { next } = tokenizer;\n switch (tok) {\n case TOK_CDATA_SECT_CLOSE:\n return next;\n case TOK_DATA_NEWLINE:\n handlers.characterData('\\n');\n break;\n case TOK_DATA_CHARS:\n handlers.characterData(tokenizer.text.slice(s, next));\n break;\n case TOK_INVALID:\n this.fail(XML_ERROR_INVALID_TOKEN, next);\n break;\n case TOK_PARTIAL_CHAR:\n this.fail(XML_ERROR_PARTIAL_CHAR);\n break;\n default:\n // TOK_PARTIAL, TOK_NONE.\n this.fail(XML_ERROR_UNCLOSED_CDATA_SECTION);\n }\n s = next;\n this.eventPtr = s;\n }\n }\n\n private epilog(start: number): void {\n const { tok: tokenizer } = this;\n let s = start;\n this.eventPtr = s;\n for (;;) {\n const tok = tokenizer.prologTok(s);\n const { next } = tokenizer;\n switch (tok) {\n case -TOK_PROLOG_S:\n case TOK_NONE:\n return;\n case TOK_PROLOG_S:\n case TOK_PI:\n case TOK_COMMENT:\n break;\n case TOK_INVALID:\n this.fail(XML_ERROR_INVALID_TOKEN, next);\n break;\n case TOK_PARTIAL:\n this.fail(XML_ERROR_UNCLOSED_TOKEN);\n break;\n case TOK_PARTIAL_CHAR:\n this.fail(XML_ERROR_PARTIAL_CHAR);\n break;\n default:\n this.fail(XML_ERROR_JUNK_AFTER_DOC_ELEMENT);\n }\n s = next;\n this.eventPtr = s;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// XML declaration (xmltok.c doParseXmlDecl)\n\ninterface XmlDeclResult {\n bad: number;\n standalone: boolean;\n}\n\nconst ASCII_LOWER_A = 0x61;\nconst ASCII_LOWER_Z = 0x7a;\nconst ASCII_UPPER_A = 0x41;\nconst ASCII_UPPER_Z = 0x5a;\nconst ASCII_DIGIT_0 = 0x30;\nconst ASCII_DIGIT_9 = 0x39;\n\nfunction isAsciiLetter(code: number): boolean {\n return (\n (code >= ASCII_LOWER_A && code <= ASCII_LOWER_Z) ||\n (code >= ASCII_UPPER_A && code <= ASCII_UPPER_Z)\n );\n}\n\nfunction isDeclSpace(code: number): boolean {\n return code === 0x20 || code === 0x0d || code === 0x0a || code === 0x09;\n}\n\ninterface PseudoAttribute {\n ok: boolean;\n // null when only white space remained.\n name: [number, number] | null;\n value: number;\n next: number;\n}\n\nfunction parsePseudoAttribute(\n tokenizer: Tokenizer,\n start: number,\n end: number,\n): PseudoAttribute {\n const toAscii = (ptr: number): number => {\n if (ptr >= end) {\n return -1;\n }\n const code = tokenizer.code(ptr);\n return code < ASCII_LIMIT ? code : -1;\n };\n let ptr = start;\n if (ptr === end) {\n return { name: null, next: start, ok: true, value: 0 };\n }\n if (!isDeclSpace(toAscii(ptr))) {\n return { name: null, next: ptr, ok: false, value: 0 };\n }\n do {\n ptr += 1;\n } while (isDeclSpace(toAscii(ptr)));\n if (ptr === end) {\n return { name: null, next: start, ok: true, value: 0 };\n }\n const nameStart = ptr;\n let nameEnd: number;\n for (;;) {\n let c = toAscii(ptr);\n if (c === -1) {\n return { name: null, next: ptr, ok: false, value: 0 };\n }\n if (c === 0x3d) {\n nameEnd = ptr;\n break;\n }\n if (isDeclSpace(c)) {\n nameEnd = ptr;\n do {\n ptr += 1;\n c = toAscii(ptr);\n } while (isDeclSpace(c));\n if (c !== 0x3d) {\n return { name: null, next: ptr, ok: false, value: 0 };\n }\n break;\n }\n ptr += 1;\n }\n if (ptr === nameStart) {\n return { name: null, next: ptr, ok: false, value: 0 };\n }\n ptr += 1;\n let c = toAscii(ptr);\n while (isDeclSpace(c)) {\n ptr += 1;\n c = toAscii(ptr);\n }\n if (c !== 0x22 && c !== 0x27) {\n return { name: null, next: ptr, ok: false, value: 0 };\n }\n const open = c;\n ptr += 1;\n const value = ptr;\n for (; ; ptr += 1) {\n c = toAscii(ptr);\n if (c === open) {\n break;\n }\n const allowed =\n isAsciiLetter(c) ||\n (c >= ASCII_DIGIT_0 && c <= ASCII_DIGIT_9) ||\n c === 0x2e ||\n c === 0x2d ||\n c === 0x5f;\n if (!allowed) {\n return { name: null, next: ptr, ok: false, value: 0 };\n }\n }\n return { name: [nameStart, nameEnd], next: ptr + 1, ok: true, value };\n}\n\nfunction parseXmlDecl(\n tokenizer: Tokenizer,\n s: number,\n next: number,\n): XmlDeclResult {\n const { text } = tokenizer;\n const end = next - 2;\n const isName = (range: [number, number], keyword: string): boolean =>\n text.slice(range[0], range[1]) === keyword;\n let attribute = parsePseudoAttribute(tokenizer, s + 5, end);\n if (!(attribute.ok && attribute.name)) {\n return { bad: attribute.next, standalone: false };\n }\n if (isName(attribute.name, 'version')) {\n const valueEnd = attribute.next - 1;\n const version = text.slice(attribute.value, valueEnd);\n // Expat 2.9 accepts the XML 1.0 fifth edition's \"1.\" followed by digits.\n if (!/^1\\.[0-9]+$/u.test(version)) {\n return { bad: attribute.value, standalone: false };\n }\n attribute = parsePseudoAttribute(tokenizer, attribute.next, end);\n if (!attribute.ok) {\n return { bad: attribute.next, standalone: false };\n }\n if (!attribute.name) {\n return { bad: -1, standalone: false };\n }\n } else {\n return { bad: attribute.name[0], standalone: false };\n }\n if (isName(attribute.name, 'encoding')) {\n const first = attribute.value < end ? tokenizer.code(attribute.value) : -1;\n if (!isAsciiLetter(first)) {\n return { bad: attribute.value, standalone: false };\n }\n attribute = parsePseudoAttribute(tokenizer, attribute.next, end);\n if (!attribute.ok) {\n return { bad: attribute.next, standalone: false };\n }\n if (!attribute.name) {\n return { bad: -1, standalone: false };\n }\n }\n if (!isName(attribute.name, 'standalone')) {\n return { bad: attribute.name[0], standalone: false };\n }\n const value = text.slice(attribute.value, attribute.next - 1);\n if (value !== 'yes' && value !== 'no') {\n return { bad: attribute.value, standalone: false };\n }\n let ptr = attribute.next;\n while (ptr < end && isDeclSpace(tokenizer.code(ptr))) {\n ptr += 1;\n }\n if (ptr !== end) {\n return { bad: ptr, standalone: false };\n }\n return { bad: -1, standalone: value === 'yes' };\n}\n\n// ---------------------------------------------------------------------------\n// Entry point\n\n/** Expat's updatePosition from the start of the input up to `upto`. */\nfunction positionOf(text: string, upto: number): [number, number] {\n let line = 1;\n let column = 0;\n let ptr = 0;\n while (ptr < upto) {\n const code = text.charCodeAt(ptr);\n if (code === 0x0a) {\n line += 1;\n column = 0;\n ptr += 1;\n } else if (code === 0x0d) {\n line += 1;\n column = 0;\n ptr += 1;\n if (ptr < upto && text.charCodeAt(ptr) === 0x0a) {\n ptr += 1;\n }\n } else {\n column += 1;\n ptr +=\n code >= HIGH_SURROGATE_MIN &&\n code <= HIGH_SURROGATE_MAX &&\n ptr + 1 < upto\n ? 2\n : 1;\n }\n }\n return [line, column];\n}\n\nconst UTF16_LITTLE_ENDIAN = 1;\nconst UTF16_BIG_ENDIAN = 2;\n\n// initScan's auto-detection: pyexpat passes \"utf-8\", but a document whose\n// first or second byte is NUL is still read as UTF-16 (big or little endian).\nfunction detectUtf16(text: string): number {\n if (text.length < 1) {\n return 0;\n }\n if (text.charCodeAt(0) === 0) {\n return text.length === 1 ? 0 : UTF16_BIG_ENDIAN;\n }\n if (\n text.charCodeAt(0) < ASCII_LIMIT &&\n text.length > 1 &&\n text.charCodeAt(1) === 0\n ) {\n return UTF16_LITTLE_ENDIAN;\n }\n return 0;\n}\n\n// Code units per String.fromCharCode() call: well below engines' argument\n// limits, large enough that building the view stays linear and fast.\nconst UTF16_BLOCK = 8192;\n\nconst PLATFORM_LITTLE_ENDIAN =\n new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n\nfunction utf16View(text: string, order: number): [string, boolean] {\n const bytes = new TextEncoder().encode(text);\n const count = Math.floor(bytes.length / 2);\n // A copy of the whole units, read in the platform's byte order, swapped\n // where that differs from the document's.\n const units = new Uint16Array(bytes.slice(0, count * 2).buffer, 0, count);\n if ((order === UTF16_BIG_ENDIAN) === PLATFORM_LITTLE_ENDIAN) {\n for (let index = 0; index < count; index += 1) {\n const unit = units[index] as number;\n units[index] = ((unit & 0xff) << 8) | (unit >> 8);\n }\n }\n // Lone surrogates stay as they are (TextDecoder would replace them). The\n // typed array is passed as the argument list: spreading it goes through\n // its iterator, several times slower.\n const blocks: string[] = [];\n for (let start = 0; start < units.length; start += UTF16_BLOCK) {\n blocks.push(\n Reflect.apply(\n String.fromCharCode,\n null,\n units.subarray(start, start + UTF16_BLOCK),\n ) as string,\n );\n }\n return [blocks.join(''), bytes.length % 2 === 1];\n}\n\n/**\n * Parse a complete document the way `pyexpat.ParserCreate(\"utf-8\")` +\n * `Parse(text.encode(\"utf-8\"), True)` does, calling `handlers` for each event.\n * Throws {@link ExpatError} on malformed input; exceptions from handlers\n * propagate unchanged (pyexpat re-raises them).\n *\n * `text` must not contain lone surrogates (Python cannot encode them).\n */\nexport function expatParse(text: string, handlers: ExpatHandlers): void {\n const order = detectUtf16(text);\n const [view, oddTail] = order === 0 ? [text, false] : utf16View(text, order);\n const tokenizer = new Tokenizer(view, order !== 0, oddTail);\n const parser = new DocumentParser(tokenizer, handlers);\n try {\n let firstTok: number;\n if (order === 0 && view.length === 1 && (view === '<' || view === '\\0')) {\n // A single byte that could start a longer encoding signature.\n firstTok = TOK_PARTIAL;\n } else if (order === 0 && view.charCodeAt(0) === BOM) {\n firstTok = TOK_BOM;\n tokenizer.next = 1;\n } else {\n firstTok = tokenizer.prologTok(0);\n }\n parser.run(firstTok, tokenizer.next);\n } catch (error) {\n if (error instanceof ParseFailure) {\n const [line, column] = positionOf(view, parser.eventPtr);\n throw new ExpatError(error.code, line, column);\n }\n throw error;\n }\n}\n","// Chunks joined per block: Expat reports every newline and entity as its own\n// chunk, and the recovering parser every run of an attribute value, so a text\n// of a million newlines would otherwise be held as a million strings until\n// its end.\nconst TEXT_BLOCK_CHUNKS = 1024;\n\n/** A text made of many small pieces, in the order they are pushed. */\nexport class TextBuffer {\n private readonly blocks: string[] = [];\n private chunks: string[] = [];\n\n push(chunk: string): void {\n this.chunks.push(chunk);\n if (this.chunks.length >= TEXT_BLOCK_CHUNKS) {\n this.blocks.push(this.chunks.join(''));\n this.chunks = [];\n }\n }\n\n /** The joined text, or null when nothing was pushed. */\n text(): string | null {\n if (this.blocks.length === 0) {\n return this.chunks.length === 0 ? null : this.chunks.join('');\n }\n return this.blocks.join('') + this.chunks.join('');\n }\n}\n","// Python's `str.encode(\"utf-8\")` check, which runs before both pyexpat and\n// lxml see the text: lone surrogates (possible in JavaScript strings, and in\n// Python strings built with surrogateescape) cannot be encoded.\n\nconst HIGH_SURROGATE_MIN = 0xd8_00;\nconst HIGH_SURROGATE_MAX = 0xdb_ff;\nconst LOW_SURROGATE_MIN = 0xdc_00;\nconst LOW_SURROGATE_MAX = 0xdf_ff;\n\n/** Python's `UnicodeEncodeError` from `str.encode(\"utf-8\")`. */\nexport class XmlUnicodeEncodeError extends Error {\n override name = 'UnicodeEncodeError';\n}\n\n/**\n * Throws Python's UnicodeEncodeError if `text` has lone surrogates. Positions\n * are in code points, and a run of consecutive surrogates is reported as one\n * range, like CPython's encoder.\n */\nexport function assertEncodableUtf8(text: string): void {\n // The common case, natively: no lone surrogate anywhere.\n if (text.isWellFormed()) {\n return;\n }\n let codePoint = 0;\n let runStart = -1;\n let runEnd = -1;\n let runFirst = 0;\n for (let index = 0; index < text.length; index += 1) {\n const code = text.charCodeAt(index);\n const next = text.charCodeAt(index + 1);\n const isPair =\n code >= HIGH_SURROGATE_MIN &&\n code <= HIGH_SURROGATE_MAX &&\n next >= LOW_SURROGATE_MIN &&\n next <= LOW_SURROGATE_MAX;\n const lone =\n !isPair && code >= HIGH_SURROGATE_MIN && code <= LOW_SURROGATE_MAX;\n if (lone) {\n if (runStart < 0) {\n runStart = codePoint;\n runFirst = code;\n }\n runEnd = codePoint;\n } else if (runStart >= 0) {\n break;\n }\n if (isPair) {\n index += 1;\n }\n codePoint += 1;\n }\n if (runStart < 0) {\n return;\n }\n const where =\n runStart === runEnd\n ? `character '\\\\u${runFirst.toString(16)}' in position ${runStart}`\n : `characters in position ${runStart}-${runEnd}`;\n throw new XmlUnicodeEncodeError(\n `'utf-8' codec can't encode ${where}: surrogates not allowed`,\n );\n}\n","// Emulation of what parsedmarc (11.1.0) does when xmltodict rejects a report:\n//\n// tree = etree.parse(BytesIO(xml.encode(\"utf-8\")),\n// etree.XMLParser(recover=True, resolve_entities=False))\n// root = tree.getroot() # None -> xml = \"\"\n// has_doctype = bool(tree.docinfo.doctype) or (\n// tree.docinfo.internalDTD is not None)\n// if not has_doctype:\n// xml = str(etree.tostring(root, encoding=\"unicode\"))\n// ... except Exception: xml = \"<a/>\"\n// if has_doctype: raise InvalidAggregateReport(...)\n//\n// i.e. libxml2 2.14's recovering parser followed by lxml's serializer. The\n// behavior below was established by experiment against lxml 6.1 / libxml2\n// 2.14 (see tools/fixtures/generate_xml.py and the differential fixtures),\n// not from libxml2's sources: the goal is that the recovered text parses to\n// the same xmltodict result as Python's.\n//\n// Like libxml2 without XML_PARSE_HUGE, nesting is capped at 256 elements, a\n// content model in the DTD at 256 groups and a text node at 10,000,000\n// characters; there is no recursion and no entity expansion, so adversarial\n// input stays linear. The internal subset is only scanned: a document with a\n// DOCTYPE is rejected, so nothing it declares can reach the output.\n//\n// No tree is built: lxml serializes the root element in document order, so\n// each node is written to the output as soon as it is parsed. Only the stack\n// of open element names is kept (to write the closing tags, also for the\n// elements still open when parsing stops), plus two facts about the innermost\n// element: whether its start tag still lacks its \">\" (no children yet, so it\n// may still become \"<a/>\"), and the length of its trailing text node (text\n// pieces merge into one node, which is capped at MAX_TEXT_LENGTH). Reports can\n// be large, so memory stays close to the size of the input and the output.\n// The DOCTYPE, and the comments and PIs outside the root element, are parsed\n// but not written: `tostring(root)` leaves them out.\n\nimport { TextBuffer } from './text-buffer';\nimport { assertEncodableUtf8 } from './unicode';\n\ninterface RComment {\n kind: 'comment';\n value: string;\n}\n\ninterface RProcessingInstruction {\n kind: 'pi';\n target: string;\n value: string;\n}\n\n/** A malformed markup declaration in the internal subset. */\nclass DeclarationError extends Error {\n override name = 'DeclarationError';\n}\n\n/** Stops the parser (libxml2's xmlHaltParser). */\nclass Halt extends Error {\n override name = 'Halt';\n}\n\nconst MAX_DEPTH = 256;\nconst MAX_CONTENT_MODEL_DEPTH = 256;\nconst MAX_TEXT_LENGTH = 10_000_000;\nconst PREDEFINED: ReadonlyMap<string, string> = new Map([\n ['lt', '<'],\n ['gt', '>'],\n ['amp', '&'],\n ['quot', '\"'],\n ['apos', \"'\"],\n]);\nconst MAX_UNICODE = 0x10_ff_ff;\nconst REPLACEMENT_CHARACTER = 0xff_fd;\nconst CHAR_TAB = 0x09;\nconst CHAR_LF = 0x0a;\nconst CHAR_CR = 0x0d;\nconst CHAR_SPACE = 0x20;\nconst ASCII_DEL = 0x7f;\n\nfunction isBlank(code: number): boolean {\n return (\n code === CHAR_SPACE ||\n code === CHAR_TAB ||\n code === CHAR_LF ||\n code === CHAR_CR\n );\n}\n\n/** XML 1.0 Char production (what libxml2's IS_CHAR accepts). */\nfunction isXmlChar(code: number): boolean {\n if (code < CHAR_SPACE) {\n return code === CHAR_TAB || code === CHAR_LF || code === CHAR_CR;\n }\n if (code <= 0xd7_ff) {\n return true;\n }\n if (code >= 0xe0_00 && code <= 0xff_fd) {\n return true;\n }\n return code >= 0x1_00_00 && code <= MAX_UNICODE;\n}\n\n// XML 1.0 fifth edition NameStartChar / NameChar.\nfunction isNameStartChar(code: number): boolean {\n if (code < 0x80) {\n return (\n (code >= 0x61 && code <= 0x7a) ||\n (code >= 0x41 && code <= 0x5a) ||\n code === 0x5f ||\n code === 0x3a\n );\n }\n return (\n (code >= 0xc0 && code <= 0xd6) ||\n (code >= 0xd8 && code <= 0xf6) ||\n (code >= 0xf8 && code <= 0x2_ff) ||\n (code >= 0x3_70 && code <= 0x3_7d) ||\n (code >= 0x3_7f && code <= 0x1f_ff) ||\n (code >= 0x20_0c && code <= 0x20_0d) ||\n (code >= 0x20_70 && code <= 0x21_8f) ||\n (code >= 0x2c_00 && code <= 0x2f_ef) ||\n (code >= 0x30_01 && code <= 0xd7_ff) ||\n (code >= 0xf9_00 && code <= 0xfd_cf) ||\n (code >= 0xfd_f0 && code <= 0xff_fd) ||\n (code >= 0x1_00_00 && code <= 0xe_ff_ff)\n );\n}\n\nfunction isNameChar(code: number): boolean {\n if (isNameStartChar(code)) {\n return true;\n }\n return (\n code === 0x2d ||\n code === 0x2e ||\n (code >= 0x30 && code <= 0x39) ||\n code === 0xb7 ||\n (code >= 0x3_00 && code <= 0x3_6f) ||\n (code >= 0x20_3f && code <= 0x20_40)\n );\n}\n\n// PubidChar*: anything else (a tab, non-ASCII) ends the literal early.\nconst PUBID_LITERAL = /^[ \\r\\na-zA-Z0-9\\-'()+,./:=?;!*#@$_%]*$/u;\n\nconst ELEMENT_TYPE_KEYWORDS: readonly string[] = [\n 'CDATA',\n 'IDREFS',\n 'IDREF',\n 'ID',\n 'ENTITIES',\n 'ENTITY',\n 'NMTOKENS',\n 'NMTOKEN',\n];\n\nconst LATIN1_LABELS = new Set([\n 'iso-8859-1',\n 'iso_8859-1',\n 'iso8859-1',\n 'latin1',\n 'latin-1',\n 'iso-latin-1',\n 'l1',\n 'cp819',\n 'ibm819',\n 'csisolatin1',\n]);\nconst ASCII_LABELS = new Set([\n 'us-ascii',\n 'ascii',\n 'ansi_x3.4-1968',\n 'iso646-us',\n 'us',\n]);\nconst UTF8_LABELS = new Set(['utf-8', 'utf8']);\nconst UTF16_LABELS = new Set([\n 'utf-16',\n 'utf16',\n 'utf-16le',\n 'utf-16be',\n 'ucs-2',\n 'ucs2',\n]);\n// Bytes iconv's CP1252 leaves undefined (WHATWG maps them to C1 controls).\nconst CP1252_UNDEFINED = new Set([0x81, 0x8d, 0x8f, 0x90, 0x9d]);\n// Bytes per String.fromCharCode call when decoding Latin-1 (kept well under\n// the engines' argument count limits).\nconst TRANSCODE_BLOCK_SIZE = 8192;\n\n/**\n * Decode the UTF-8 bytes of `text` as `encoding` the way libxml2 (iconv)\n * would after an `encoding=\"...\"` declaration. Returns the decoded text and\n * whether decoding stopped at an invalid byte (libxml2 then halts), or null\n * when the encoding is unknown (libxml2 reports it and keeps UTF-8).\n */\nfunction transcode(text: string, encoding: string): [string, boolean] | null {\n const label = encoding.toLowerCase();\n if (UTF8_LABELS.has(label)) {\n return [text, false];\n }\n const bytes = new TextEncoder().encode(text);\n if (LATIN1_LABELS.has(label) || ASCII_LABELS.has(label)) {\n const limit = ASCII_LABELS.has(label) ? 0x80 : 0x1_00;\n let end = 0;\n while (end < bytes.length && (bytes[end] as number) < limit) {\n end += 1;\n }\n // Bytes map to the code points of the same value; converted in blocks\n // (one string per byte would cost far more memory on large reports).\n const blocks: string[] = [];\n for (let index = 0; index < end; index += TRANSCODE_BLOCK_SIZE) {\n blocks.push(\n String.fromCharCode(\n ...bytes.subarray(index, Math.min(end, index + TRANSCODE_BLOCK_SIZE)),\n ),\n );\n }\n return [blocks.join(''), end < bytes.length];\n }\n let decoderLabel = label;\n let usable = bytes;\n let stopped = false;\n if (label === 'windows-1252' || label === 'cp1252') {\n const bad = bytes.findIndex(byte => CP1252_UNDEFINED.has(byte));\n if (bad >= 0) {\n usable = bytes.subarray(0, bad);\n stopped = true;\n }\n } else if (UTF16_LABELS.has(label)) {\n decoderLabel = label.endsWith('be') ? 'utf-16be' : 'utf-16le';\n }\n let decoder: TextDecoder;\n try {\n decoder = new TextDecoder(decoderLabel, { fatal: true });\n } catch {\n return null;\n }\n try {\n return [decoder.decode(usable), stopped];\n } catch {\n // Find the longest decodable prefix (libxml2 halts at the bad byte).\n let low = 0;\n let high = usable.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n try {\n new TextDecoder(decoderLabel, { fatal: true }).decode(\n usable.subarray(0, middle),\n );\n low = middle;\n } catch {\n high = middle - 1;\n }\n }\n return [\n new TextDecoder(decoderLabel).decode(usable.subarray(0, low)),\n true,\n ];\n }\n}\n\nfunction normalizeNewlines(text: string): string {\n return text.includes('\\r')\n ? text.replaceAll('\\r\\n', '\\n').replaceAll('\\r', '\\n')\n : text;\n}\n\n// How lxml writes a character of text or of an attribute value: the\n// replacement, or null when the character is written as is.\nfunction escapedTextChar(code: number, inAttribute: boolean): string | null {\n switch (code) {\n case 0x26:\n return '&amp;';\n case 0x3c:\n return '&lt;';\n case 0x3e:\n return '&gt;';\n case 0x22:\n return inAttribute ? '&quot;' : null;\n case CHAR_CR:\n return '&#13;';\n case CHAR_LF:\n return inAttribute ? '&#10;' : null;\n case CHAR_TAB:\n return inAttribute ? '&#9;' : null;\n default:\n // Other control characters (only reachable through character\n // references) are written as U+FFFD; everything else, non-ASCII\n // included, as is (`encoding=\"unicode\"`).\n return code < CHAR_SPACE ? '&#xFFFD;' : null;\n }\n}\n\n// The code point at `index`, combining a surrogate pair only when both\n// halves are before `end` (a lone surrogate is returned as is).\nfunction codePointBefore(value: string, index: number, end: number): number {\n const code = value.charCodeAt(index);\n if (code >= 0xd8_00 && code <= 0xdb_ff && index + 1 < end) {\n const low = value.charCodeAt(index + 1);\n if (low >= 0xdc_00 && low <= 0xdf_ff) {\n return (code - 0xd8_00) * 0x4_00 + (low - 0xdc_00) + 0x1_00_00;\n }\n }\n return code;\n}\n\n// Size of the byte blocks the output is assembled in.\nconst OUTPUT_BLOCK_SIZE = 1 << 20;\nconst UTF8_TWO_BYTES = 0x8_00;\nconst UTF8_THREE_BYTES = 0x1_00_00;\n\n/**\n * The serialized root element, assembled as UTF-8 bytes in blocks that are\n * decoded when full. That avoids keeping millions of small strings alive\n * until the final join.\n */\nclass Output {\n private readonly pieces: string[] = [];\n private readonly block = new Uint8Array(OUTPUT_BLOCK_SIZE);\n private readonly decoder = new TextDecoder();\n private length = 0;\n\n private flush(): void {\n if (this.length > 0) {\n // A block may end inside a character: `stream` keeps its first bytes.\n this.pieces.push(\n this.decoder.decode(this.block.subarray(0, this.length), {\n stream: true,\n }),\n );\n this.length = 0;\n }\n }\n\n /** One ASCII character. */\n byte(code: number): void {\n if (this.length === OUTPUT_BLOCK_SIZE) {\n this.flush();\n }\n this.block[this.length] = code;\n this.length += 1;\n }\n\n /** One code point, as UTF-8 (a lone surrogate becomes U+FFFD). */\n codePoint(code: number): void {\n if (code < 0x80) {\n this.byte(code);\n return;\n }\n const value = code >= 0xd8_00 && code <= 0xdf_ff ? 0xff_fd : code;\n if (value < UTF8_TWO_BYTES) {\n this.byte(0xc0 | (value >> 6));\n } else if (value < UTF8_THREE_BYTES) {\n this.byte(0xe0 | (value >> 12));\n this.byte(0x80 | ((value >> 6) & 0x3f));\n } else {\n this.byte(0xf0 | (value >> 18));\n this.byte(0x80 | ((value >> 12) & 0x3f));\n this.byte(0x80 | ((value >> 6) & 0x3f));\n }\n this.byte(0x80 | (value & 0x3f));\n }\n\n /** A string written as is (names, comments, PIs, markup). */\n write(value: string): void {\n for (let index = 0; index < value.length; index += 1) {\n const code = codePointBefore(value, index, value.length);\n if (code > 0xff_ff) {\n index += 1;\n }\n this.codePoint(code);\n }\n }\n\n /** `value.slice(start, end)` with lxml's escaping of text/attributes. */\n text(value: string, start: number, end: number, inAttribute: boolean): void {\n for (let index = start; index < end; index += 1) {\n const code = codePointBefore(value, index, end);\n if (code > 0xff_ff) {\n index += 1;\n }\n const escaped = escapedTextChar(code, inAttribute);\n if (escaped === null) {\n this.codePoint(code);\n } else {\n this.write(escaped);\n }\n }\n }\n\n toString(): string {\n this.flush();\n this.pieces.push(this.decoder.decode());\n return this.pieces.join('');\n }\n}\n\nfunction serializePI(pi: RProcessingInstruction): string {\n return pi.value === '' ? `<?${pi.target}?>` : `<?${pi.target} ${pi.value}?>`;\n}\n\ninterface EntityDeclaration {\n internal: boolean;\n}\n\ninterface StartTag {\n name: string;\n namespaces: [string, string][];\n attributes: [string, string][];\n // Attribute names seen so far (created with the first attribute).\n seen: Set<string> | null;\n}\n\ninterface ExternalId {\n publicId: string | null;\n systemId: string | null;\n}\n\nclass RecoveringParser {\n private text: string;\n private pos = 0;\n private wellFormed = true;\n private standalone = false;\n private hasExternalSubset = false;\n private hasParameterEntityReferences = false;\n private readonly entities = new Map<string, EntityDeclaration>();\n private readonly out = new Output();\n // Whether libxml2 created an internal subset (any DOCTYPE it could read\n // up to its external ID), i.e. `tree.docinfo.doctype` is set.\n private hasDoctype = false;\n // A character reference to a surrogate was stored: lxml's serializer then\n // produces invalid UTF-8 and decoding it raises (parsedmarc uses \"<a/>\").\n private unserializable = false;\n private rootName: string | null = null;\n // Names of the open elements, innermost last.\n private readonly openElements: string[] = [];\n // The innermost open element has no children yet: its start tag was\n // written without the \">\" (it becomes \"<a/>\" if it stays empty).\n private startTagPending = false;\n // Length of the innermost open element's last child when it is a text\n // node (later text merges into it), -1 when its last child is not text.\n private textRun = -1;\n\n constructor(text: string) {\n this.text = text;\n }\n\n private error(): void {\n this.wellFormed = false;\n }\n\n private code(offset = 0): number {\n return this.text.codePointAt(this.pos + offset) ?? -1;\n }\n\n private at(literal: string): boolean {\n return this.text.startsWith(literal, this.pos);\n }\n\n private get eof(): boolean {\n return this.pos >= this.text.length;\n }\n\n private skipBlanks(): number {\n const start = this.pos;\n while (!this.eof && isBlank(this.text.charCodeAt(this.pos))) {\n this.pos += 1;\n }\n return this.pos - start;\n }\n\n private parseName(): string | null {\n const start = this.pos;\n const first = this.code();\n if (first < 0 || !isNameStartChar(first)) {\n return null;\n }\n this.pos += first > 0xff_ff ? 2 : 1;\n for (;;) {\n const code = this.code();\n if (code < 0 || !isNameChar(code)) {\n break;\n }\n this.pos += code > 0xff_ff ? 2 : 1;\n }\n return this.text.slice(start, this.pos);\n }\n\n private parseNmtoken(): string | null {\n const start = this.pos;\n for (;;) {\n const code = this.code();\n if (code < 0 || !isNameChar(code)) {\n break;\n }\n this.pos += code > 0xff_ff ? 2 : 1;\n }\n return this.pos > start ? this.text.slice(start, this.pos) : null;\n }\n\n // ---- document ---------------------------------------------------------\n\n /** Parses the document and returns parsedmarc's recovery result. */\n run(): RecoveredXml {\n try {\n this.parseDocument();\n } catch (error) {\n if (!(error instanceof Halt)) {\n throw error;\n }\n }\n if (this.rootName === null) {\n return { hasDoctype: false, xml: '' };\n }\n if (this.hasDoctype) {\n return { hasDoctype: true, xml: '' };\n }\n if (this.unserializable) {\n return { hasDoctype: false, xml: '<a/>' };\n }\n // Elements still open when parsing stopped are closed like the others.\n while (this.openElements.length > 0) {\n this.closeElement();\n }\n return { hasDoctype: false, xml: this.out.toString() };\n }\n\n private parseDocument(): void {\n if (this.text.charCodeAt(0) === 0xfe_ff) {\n this.pos = 1;\n }\n if (this.at('<?xml') && isBlank(this.text.charCodeAt(this.pos + 5))) {\n this.parseXmlDeclaration();\n }\n this.parseMisc();\n if (this.at('<!DOCTYPE')) {\n this.parseDoctype();\n this.parseMisc();\n }\n if (this.code() !== 0x3c) {\n this.error();\n return;\n }\n this.parseRootElement();\n if (this.rootName !== null) {\n this.parseMisc();\n }\n }\n\n // Comments and PIs outside the root element (not serialized).\n private parseMisc(): void {\n for (;;) {\n this.skipBlanks();\n if (this.at('<?')) {\n this.parsePI();\n } else if (this.at('<!--')) {\n this.parseComment();\n } else {\n return;\n }\n }\n }\n\n // ---- XML declaration --------------------------------------------------\n\n // A quoted pseudo-attribute value: [value, closed], or null without a quote.\n private parseQuotedDeclValue(\n valid: (code: number, index: number) => boolean,\n ): [string, boolean] | null {\n const quote = this.code();\n if (quote !== 0x22 && quote !== 0x27) {\n this.error();\n return null;\n }\n this.pos += 1;\n const start = this.pos;\n while (\n !this.eof &&\n valid(this.text.charCodeAt(this.pos), this.pos - start)\n ) {\n this.pos += 1;\n }\n const value = this.text.slice(start, this.pos);\n if (this.code() === quote) {\n this.pos += 1;\n return [value, true];\n }\n // \"String not closed\"\n this.error();\n return [value, false];\n }\n\n private parsePseudoAttribute(name: string): string | null {\n if (!this.at(name)) {\n return null;\n }\n this.pos += name.length;\n this.skipBlanks();\n if (this.code() !== 0x3d) {\n this.error();\n return null;\n }\n this.pos += 1;\n this.skipBlanks();\n return '';\n }\n\n private parseXmlDeclaration(): void {\n this.pos += 5;\n this.skipBlanks();\n let version: string | null = null;\n if (this.parsePseudoAttribute('version') !== null) {\n const parsed = this.parseQuotedDeclValue((code, index) =>\n index === 1 ? code === 0x2e : code >= 0x30 && code <= 0x39,\n );\n // xmlParseVersionNum needs a digit and a dot; it keeps what it read\n // even when the closing quote is missing.\n if (parsed && /^[0-9]\\.[0-9]*$/u.test(parsed[0])) {\n [version] = parsed;\n }\n }\n if (version === null) {\n this.error();\n } else if (version !== '1.0' && !/^1\\.[0-9]/u.test(version)) {\n // \"Unsupported version\": an error unless it is 1.x (then a warning).\n this.error();\n }\n if (!isBlank(this.text.charCodeAt(this.pos))) {\n if (this.at('?>')) {\n this.pos += 2;\n return;\n }\n this.error();\n }\n this.skipBlanks();\n let hasEncoding = false;\n if (this.parsePseudoAttribute('encoding') !== null) {\n const name = this.parseQuotedDeclValue((code, index) => {\n const letter =\n (code >= 0x41 && code <= 0x5a) || (code >= 0x61 && code <= 0x7a);\n if (index === 0) {\n return letter;\n }\n return (\n letter ||\n (code >= 0x30 && code <= 0x39) ||\n code === 0x2e ||\n code === 0x5f ||\n code === 0x2d\n );\n });\n if (name === null || !name[1] || name[0] === '') {\n this.error();\n } else {\n hasEncoding = true;\n this.switchEncoding(name[0]);\n }\n }\n if (hasEncoding && !isBlank(this.text.charCodeAt(this.pos))) {\n if (this.at('?>')) {\n this.pos += 2;\n return;\n }\n this.error();\n }\n this.skipBlanks();\n if (this.parsePseudoAttribute('standalone') !== null) {\n const value = this.parseQuotedDeclValue(\n code =>\n code !== 0x22 && code !== 0x27 && code !== 0x3f && code !== 0x3e,\n );\n if (value?.[0] === 'yes') {\n this.standalone = true;\n } else if (value?.[0] !== 'no') {\n this.error();\n }\n }\n this.skipBlanks();\n if (this.at('?>')) {\n this.pos += 2;\n } else if (this.code() === 0x3e) {\n this.error();\n this.pos += 1;\n } else {\n this.error();\n // MOVETO_ENDTAG stops at \">\" or at a NUL; NEXT then skips one char.\n let index = this.pos;\n while (\n index < this.text.length &&\n this.text.charCodeAt(index) !== 0x3e &&\n this.text.charCodeAt(index) !== 0\n ) {\n index += 1;\n }\n this.pos = Math.min(index + 1, this.text.length);\n }\n }\n\n private switchEncoding(name: string): void {\n const rest = this.text.slice(this.pos);\n const decoded = transcode(rest, name);\n if (decoded === null) {\n // Unsupported encoding: reported, parsing goes on as UTF-8.\n this.error();\n return;\n }\n const [text, stopped] = decoded;\n this.text = this.text.slice(0, this.pos) + text;\n if (stopped) {\n this.error();\n this.haltAt = this.text.length;\n }\n }\n\n // Set when decoding stopped at an invalid byte: parsing halts there\n // instead of seeing a clean end of input.\n private haltAt = -1;\n\n // ---- comments and processing instructions ----------------------------\n\n private parseComment(): RComment | null {\n const { text } = this;\n const start = this.pos + 4;\n let index = start;\n // Fast path over ASCII: \"--\" not followed by \">\" is an error and both\n // hyphens are skipped, so \"--->\" does not close the comment.\n for (;;) {\n if (index >= text.length) {\n this.error();\n this.pos = text.length;\n return null;\n }\n const code = text.charCodeAt(index);\n if (code === 0x2d && text.charCodeAt(index + 1) === 0x2d) {\n if (text.charCodeAt(index + 2) === 0x3e) {\n this.pos = index + 3;\n return { kind: 'comment', value: text.slice(start, index) };\n }\n this.error();\n index += 2;\n continue;\n }\n if (\n (code >= CHAR_SPACE && code <= ASCII_DEL) ||\n code === CHAR_TAB ||\n code === CHAR_LF\n ) {\n index += 1;\n continue;\n }\n break;\n }\n // Complex path: a sliding window of the last two characters (q, r) and\n // the current one. The comment is the text before q once \"-->\" is seen,\n // with CRLF and CR read as LF.\n let width = 0;\n // The next character, with CRLF and CR read as LF like xmlCurrentChar.\n const take = (): number => {\n const code = text.codePointAt(index) ?? -1;\n if (code === CHAR_CR) {\n width = text.charCodeAt(index + 1) === CHAR_LF ? 2 : 1;\n return CHAR_LF;\n }\n width = code > 0xff_ff ? 2 : 1;\n return code;\n };\n let qPosition = index;\n let q = take();\n if (q < 0) {\n this.error();\n this.pos = text.length;\n return null;\n }\n if (!isXmlChar(q)) {\n this.error();\n this.pos = index;\n return null;\n }\n index += width;\n let rPosition = index;\n let r = take();\n if (r < 0) {\n this.error();\n this.pos = text.length;\n return null;\n }\n if (!isXmlChar(r)) {\n this.error();\n this.pos = index;\n return null;\n }\n index += width;\n let cur = take();\n while (\n cur >= 0 &&\n isXmlChar(cur) &&\n (cur !== 0x3e || r !== 0x2d || q !== 0x2d)\n ) {\n if (r === 0x2d && q === 0x2d) {\n this.error();\n }\n q = r;\n qPosition = rPosition;\n r = cur;\n rPosition = index;\n index += width;\n cur = take();\n }\n if (cur < 0) {\n this.error();\n this.pos = text.length;\n return null;\n }\n if (!isXmlChar(cur)) {\n this.error();\n this.pos = index;\n return null;\n }\n this.pos = index + 1;\n return {\n kind: 'comment',\n value: normalizeNewlines(text.slice(start, qPosition)),\n };\n }\n\n private parsePI(): RProcessingInstruction | null {\n const { text } = this;\n this.pos += 2;\n const target = this.parseName();\n if (target === null) {\n this.error();\n return null;\n }\n if (target.toLowerCase() === 'xml') {\n this.error();\n }\n if (this.at('?>')) {\n this.pos += 2;\n return { kind: 'pi', target, value: '' };\n }\n if (this.skipBlanks() === 0) {\n this.error();\n }\n const start = this.pos;\n let index = start;\n while (index < text.length) {\n const code = text.codePointAt(index) ?? 0;\n if (code === 0x3f && text.charCodeAt(index + 1) === 0x3e) {\n this.pos = index + 2;\n return {\n kind: 'pi',\n target,\n value: normalizeNewlines(text.slice(start, index)),\n };\n }\n if (!isXmlChar(code)) {\n break;\n }\n index += code > 0xff_ff ? 2 : 1;\n }\n this.error();\n this.pos = index;\n return null;\n }\n\n // ---- DOCTYPE ----------------------------------------------------------\n\n private parseQuoted(): string | null {\n const quote = this.code();\n if (quote !== 0x22 && quote !== 0x27) {\n return null;\n }\n const close = this.text.indexOf(String.fromCharCode(quote), this.pos + 1);\n if (close < 0) {\n return null;\n }\n const value = this.text.slice(this.pos + 1, close);\n this.pos = close + 1;\n return value;\n }\n\n // ExternalID; `strict` requires the system literal after PUBLIC.\n private parseExternalId(strict: boolean): ExternalId | null {\n if (this.at('SYSTEM')) {\n this.pos += 6;\n if (this.skipBlanks() === 0) {\n this.error();\n }\n const systemId = this.parseQuoted();\n if (systemId === null) {\n this.error();\n return { publicId: null, systemId: null };\n }\n return { publicId: null, systemId };\n }\n if (this.at('PUBLIC')) {\n this.pos += 6;\n if (this.skipBlanks() === 0) {\n this.error();\n }\n const publicId = this.parseQuoted();\n if (publicId === null || !PUBID_LITERAL.test(publicId)) {\n // \"Unfinished PubidLiteral\"\n this.error();\n throw new Halt();\n }\n const blanks = this.skipBlanks();\n const quote = this.code();\n if (quote !== 0x22 && quote !== 0x27) {\n if (strict) {\n this.error();\n }\n return { publicId, systemId: null };\n }\n if (blanks === 0) {\n this.error();\n }\n const systemId = this.parseQuoted();\n if (systemId === null) {\n this.error();\n }\n return { publicId, systemId };\n }\n return null;\n }\n\n private parseDoctype(): void {\n this.pos += 9;\n if (this.skipBlanks() === 0) {\n this.error();\n }\n const name = this.parseName();\n if (name === null) {\n this.error();\n }\n this.skipBlanks();\n const external = this.parseExternalId(true);\n if (\n external &&\n (external.publicId !== null || external.systemId !== null)\n ) {\n this.hasExternalSubset = true;\n }\n // libxml2 creates the internal subset here, even without a name.\n this.hasDoctype = true;\n this.skipBlanks();\n if (this.code() === 0x5b) {\n this.pos += 1;\n if (!this.parseInternalSubset()) {\n return;\n }\n if (this.code() === 0x5d) {\n this.pos += 1;\n this.skipBlanks();\n }\n }\n if (this.code() === 0x3e) {\n this.pos += 1;\n } else {\n // \"DOCTYPE improperly terminated\"\n this.error();\n }\n }\n\n // xmlParseInternalSubset: stops at \"]\", at the end of input, at a\n // character that cannot start a declaration, or at a declaration that\n // could not be parsed at all.\n // Returns false when it stopped on an error: the offending character has\n // been skipped and the DOCTYPE is over (no \"]\" or \">\" is expected).\n private parseInternalSubset(): boolean {\n this.skipBlanks();\n while (!this.eof && this.code() !== 0x5d) {\n const before = this.pos;\n try {\n if (this.at('<!--')) {\n this.parseComment();\n } else if (this.at('<?')) {\n this.parsePI();\n } else if (this.at('<!ENTITY')) {\n this.parseEntityDeclaration();\n } else if (this.at('<!ATTLIST')) {\n this.parseAttlistDeclaration();\n } else if (this.at('<!ELEMENT')) {\n this.parseElementDeclaration();\n } else if (this.at('<!NOTATION')) {\n this.parseNotationDeclaration();\n } else if (this.code() === 0x25) {\n this.parseParameterEntityReference();\n } else {\n // \"Content error in the internal subset\": the character is\n // skipped and the DOCTYPE ends there.\n this.error();\n this.pos += this.code() > 0xff_ff ? 2 : 1;\n return false;\n }\n } catch (error) {\n if (!(error instanceof DeclarationError)) {\n throw error;\n }\n this.error();\n }\n if (this.pos === before) {\n this.error();\n this.pos += this.code() > 0xff_ff ? 2 : 1;\n return false;\n }\n this.skipBlanks();\n }\n return true;\n }\n\n private requireBlanks(): void {\n if (this.skipBlanks() === 0) {\n this.error();\n throw new DeclarationError();\n }\n }\n\n private requireName(): string {\n const name = this.parseName();\n if (name === null) {\n this.error();\n throw new DeclarationError();\n }\n return name;\n }\n\n private requireDeclarationEnd(): void {\n this.skipBlanks();\n if (this.code() !== 0x3e) {\n this.error();\n throw new DeclarationError();\n }\n this.pos += 1;\n }\n\n private parseParameterEntityReference(): void {\n this.pos += 1;\n const name = this.requireName();\n if (this.code() !== 0x3b) {\n this.error();\n throw new DeclarationError();\n }\n this.pos += 1;\n // An undefined parameter entity is only a warning (the reference itself\n // marks the DTD as having PE references); the reference is dropped.\n this.hasParameterEntityReferences = true;\n if (this.standalone && !this.entities.has(`%${name}`)) {\n this.error();\n }\n }\n\n private parseEntityDeclaration(): void {\n this.pos += 8;\n this.requireBlanks();\n let parameter = false;\n if (this.code() === 0x25) {\n this.pos += 1;\n this.requireBlanks();\n parameter = true;\n }\n const name = this.requireName();\n this.requireBlanks();\n const key = parameter ? `%${name}` : name;\n let internal = false;\n const value = this.parseQuoted();\n if (value === null) {\n const external = this.parseExternalId(false);\n if (\n !external ||\n (external.publicId === null && external.systemId === null)\n ) {\n this.error();\n throw new DeclarationError();\n }\n const blanks = this.skipBlanks();\n if (!parameter && blanks > 0 && this.at('NDATA')) {\n this.pos += 5;\n this.requireBlanks();\n this.requireName();\n }\n } else {\n internal = true;\n }\n this.requireDeclarationEnd();\n if (!parameter && PREDEFINED.has(name)) {\n return;\n }\n if (this.entities.has(key)) {\n return;\n }\n this.entities.set(key, { internal });\n }\n\n private parseNotationDeclaration(): void {\n this.pos += 10;\n this.requireBlanks();\n this.requireName();\n this.requireBlanks();\n const external = this.parseExternalId(false);\n if (\n !external ||\n (external.publicId === null && external.systemId === null)\n ) {\n this.error();\n throw new DeclarationError();\n }\n this.requireDeclarationEnd();\n }\n\n private parseEnumeration(names: boolean): void {\n // ptr at \"(\"\n this.pos += 1;\n for (;;) {\n this.skipBlanks();\n const value = names ? this.parseName() : this.parseNmtoken();\n if (value === null) {\n this.error();\n throw new DeclarationError();\n }\n this.skipBlanks();\n if (this.code() === 0x7c) {\n this.pos += 1;\n continue;\n }\n if (this.code() === 0x29) {\n this.pos += 1;\n return;\n }\n this.error();\n throw new DeclarationError();\n }\n }\n\n private parseAttlistDeclaration(): void {\n this.pos += 9;\n this.requireBlanks();\n this.requireName();\n for (;;) {\n const blanks = this.skipBlanks();\n if (this.code() === 0x3e) {\n this.pos += 1;\n return;\n }\n if (blanks === 0) {\n this.error();\n throw new DeclarationError();\n }\n this.requireName();\n this.requireBlanks();\n if (this.at('NOTATION')) {\n this.pos += 8;\n this.requireBlanks();\n if (this.code() !== 0x28) {\n this.error();\n throw new DeclarationError();\n }\n this.parseEnumeration(true);\n } else if (this.code() === 0x28) {\n this.parseEnumeration(false);\n } else {\n const keyword = ELEMENT_TYPE_KEYWORDS.find(candidate =>\n this.at(candidate),\n );\n if (!keyword) {\n this.error();\n throw new DeclarationError();\n }\n this.pos += keyword.length;\n }\n this.requireBlanks();\n if (this.at('#REQUIRED')) {\n this.pos += 9;\n } else if (this.at('#IMPLIED')) {\n this.pos += 8;\n } else {\n if (this.at('#FIXED')) {\n this.pos += 6;\n this.requireBlanks();\n }\n this.skipDtdAttributeValue();\n }\n }\n }\n\n // An attribute default, which only matters for where it ends.\n private skipDtdAttributeValue(): void {\n const quote = this.code();\n if (quote !== 0x22 && quote !== 0x27) {\n this.error();\n throw new DeclarationError();\n }\n this.pos += 1;\n for (;;) {\n if (this.eof) {\n this.error();\n throw new DeclarationError();\n }\n const code = this.code();\n if (code === quote) {\n this.pos += 1;\n return;\n }\n if (code === 0x26) {\n if (this.parseAttributeReference(true) === null) {\n this.error();\n throw new DeclarationError();\n }\n continue;\n }\n if (code === 0x3c) {\n this.error();\n }\n this.pos += code > 0xff_ff ? 2 : 1;\n }\n }\n\n private parseElementDeclaration(): void {\n this.pos += 9;\n this.requireBlanks();\n this.requireName();\n this.requireBlanks();\n if (this.at('EMPTY')) {\n this.pos += 5;\n } else if (this.at('ANY')) {\n this.pos += 3;\n } else if (this.code() === 0x28) {\n this.parseContentModel();\n } else {\n this.error();\n throw new DeclarationError();\n }\n this.requireDeclarationEnd();\n }\n\n // A content model (\"(a | b)*\", \"(a , b?)\"): only the separator of each open\n // group is kept, and groups nest like xmlParseElementChildrenContentDeclPriv.\n private parseContentModel(): void {\n const separators = [0];\n this.pos += 1;\n for (;;) {\n this.skipBlanks();\n if (this.code() === 0x28) {\n this.pos += 1;\n if (separators.length >= MAX_CONTENT_MODEL_DEPTH) {\n // \"depth 257 too deep\": the declaration ends here.\n this.error();\n throw new DeclarationError();\n }\n separators.push(0);\n continue;\n }\n if (this.at('#PCDATA')) {\n this.pos += 7;\n } else if (this.parseName() === null) {\n this.error();\n throw new DeclarationError();\n } else {\n this.skipOccurrence();\n }\n // Separators and closing parentheses after an item.\n for (;;) {\n this.skipBlanks();\n const code = this.code();\n if (code === 0x7c || code === 0x2c) {\n const current = separators.at(-1) as number;\n if (current !== 0 && current !== code) {\n this.error();\n throw new DeclarationError();\n }\n separators[separators.length - 1] = code;\n this.pos += 1;\n break;\n }\n if (code !== 0x29) {\n this.error();\n throw new DeclarationError();\n }\n this.pos += 1;\n separators.pop();\n this.skipOccurrence();\n if (separators.length === 0) {\n return;\n }\n }\n }\n }\n\n private skipOccurrence(): void {\n const code = this.code();\n if (code === 0x3f || code === 0x2a || code === 0x2b) {\n this.pos += 1;\n }\n }\n\n // ---- references ----------------------------------------------------------\n\n // xmlParseCharRef after \"&#\": the code point (0 for an invalid reference).\n private parseCharRef(): number {\n let value = 0;\n let digits = 0;\n if (this.code() === 0x78) {\n this.pos += 1;\n for (;;) {\n const code = this.code();\n if (code === 0x3b) {\n this.pos += 1;\n break;\n }\n const digit = Number.parseInt(String.fromCharCode(code), 16);\n if (code < 0 || Number.isNaN(digit)) {\n value = 0;\n digits = 0;\n break;\n }\n value = Math.min(value * 16 + digit, 0x11_00_00);\n digits += 1;\n this.pos += 1;\n }\n } else {\n for (;;) {\n const code = this.code();\n if (code === 0x3b) {\n this.pos += 1;\n break;\n }\n if (code < 0x30 || code > 0x39) {\n value = 0;\n digits = 0;\n break;\n }\n value = Math.min(value * 10 + (code - 0x30), 0x11_00_00);\n digits += 1;\n this.pos += 1;\n }\n }\n if (digits === 0 || value === 0) {\n this.error();\n return 0;\n }\n if (value > MAX_UNICODE) {\n this.error();\n return REPLACEMENT_CHARACTER;\n }\n if (!isXmlChar(value)) {\n this.error();\n if (value >= 0xd8_00 && value <= 0xdf_ff) {\n // Stored as is; lxml then fails to serialize the document.\n this.unserializable = true;\n }\n }\n return value;\n }\n\n // xmlParseEntityRef after \"&\": the name, or null (an error was reported).\n private parseEntityName(): string | null {\n const name = this.parseName();\n if (name === null) {\n this.error();\n return null;\n }\n if (this.code() !== 0x3b) {\n this.error();\n return null;\n }\n this.pos += 1;\n return name;\n }\n\n private entityIsUndeclaredError(): boolean {\n return (\n this.standalone ||\n !(this.hasExternalSubset || this.hasParameterEntityReferences)\n );\n }\n\n // A reference inside an attribute value; null when the value must be\n // discarded (a character reference to 0).\n private parseAttributeReference(inDtd: boolean): string | null {\n this.pos += 1;\n if (this.code() === 0x23) {\n this.pos += 1;\n const code = this.parseCharRef();\n if (code === 0) {\n return null;\n }\n if (inDtd && code === 0x26) {\n return '&#38;';\n }\n return String.fromCodePoint(code);\n }\n const name = this.parseEntityName();\n if (name === null) {\n return '';\n }\n const predefined = PREDEFINED.get(name);\n if (predefined !== undefined) {\n return inDtd && predefined === '&' ? '&#38;' : predefined;\n }\n if (this.entities.has(name)) {\n return `&${name};`;\n }\n if (this.entityIsUndeclaredError()) {\n this.error();\n }\n return '';\n }\n\n // xmlParseReference in content.\n private parseContentReference(): void {\n this.pos += 1;\n if (this.code() === 0x23) {\n this.pos += 1;\n const code = this.parseCharRef();\n if (code !== 0) {\n this.appendText(String.fromCodePoint(code));\n }\n return;\n }\n const name = this.parseEntityName();\n if (name === null) {\n return;\n }\n const predefined = PREDEFINED.get(name);\n if (predefined === undefined && !this.entities.has(name)) {\n if (this.entityIsUndeclaredError()) {\n this.error();\n }\n this.writeEntityReference(name);\n return;\n }\n if (!this.wellFormed) {\n return;\n }\n if (predefined === undefined) {\n this.writeEntityReference(name);\n } else {\n this.appendText(predefined);\n }\n }\n\n // ---- output -------------------------------------------------------------\n\n // Before a child of the innermost open element: ends its start tag.\n private beginChild(): void {\n if (this.startTagPending) {\n this.out.byte(0x3e);\n this.startTagPending = false;\n }\n }\n\n private writeEntityReference(name: string): void {\n this.beginChild();\n this.textRun = -1;\n this.out.byte(0x26);\n this.out.write(name);\n this.out.byte(0x3b);\n }\n\n private writeChildComment(comment: RComment): void {\n this.beginChild();\n this.textRun = -1;\n this.out.write('<!--');\n this.out.write(comment.value);\n this.out.write('-->');\n }\n\n private writeChildPI(pi: RProcessingInstruction): void {\n this.beginChild();\n this.textRun = -1;\n this.out.write(serializePI(pi));\n }\n\n // Closes the innermost open element (\"<a/>\" when it has no children).\n private closeElement(): void {\n const name = this.openElements.pop() as string;\n if (this.startTagPending) {\n this.out.write('/>');\n this.startTagPending = false;\n } else {\n this.out.write('</');\n this.out.write(name);\n this.out.byte(0x3e);\n }\n // The parent's last child is now this element.\n this.textRun = -1;\n }\n\n // ---- elements -----------------------------------------------------------\n\n // Text for the innermost open element: `value.slice(start, end)`, merged\n // into its last child when that is a text node.\n private appendText(value: string, start = 0, end = value.length): void {\n if (end === start) {\n return;\n }\n this.beginChild();\n const run = Math.max(this.textRun, 0);\n if (run + (end - start) > MAX_TEXT_LENGTH) {\n // \"Resource limit exceeded: Text node too long\": the node keeps what\n // fits and parsing stops.\n this.out.text(value, start, start + (MAX_TEXT_LENGTH - run), false);\n this.textRun = MAX_TEXT_LENGTH;\n this.error();\n throw new Halt();\n }\n this.out.text(value, start, end, false);\n this.textRun = run + (end - start);\n }\n\n // xmlParseAttValueInternal for a start tag; null when the value is invalid.\n // The value is copied in runs: one concatenation per character would hold\n // a rope node (32 bytes) per input byte until the value ends.\n private parseAttributeValue(): string | null {\n const quote = this.code();\n if (quote !== 0x22 && quote !== 0x27) {\n this.error();\n return null;\n }\n this.pos += 1;\n const value = new TextBuffer();\n let runStart = this.pos;\n const endRun = (): void => {\n if (this.pos > runStart) {\n value.push(this.text.slice(runStart, this.pos));\n }\n };\n for (;;) {\n if (this.eof) {\n this.error();\n return null;\n }\n const code = this.code();\n if (code === quote) {\n endRun();\n this.pos += 1;\n return value.text() ?? '';\n }\n if (code === 0x26) {\n endRun();\n const piece = this.parseAttributeReference(false);\n if (piece === null) {\n return null;\n }\n value.push(piece);\n runStart = this.pos;\n continue;\n }\n if (code === 0x3c) {\n this.error();\n }\n const width = code > 0xff_ff ? 2 : 1;\n if (code === CHAR_CR && this.code(1) === CHAR_LF) {\n // CRLF reads as one LF, so it becomes one space.\n endRun();\n this.pos += 1;\n runStart = this.pos;\n } else if (code !== CHAR_SPACE && isBlank(code)) {\n endRun();\n value.push(' ');\n this.pos += 1;\n runStart = this.pos;\n } else if (isXmlChar(code)) {\n this.pos += width;\n } else {\n // \"invalid character in attribute value\": control characters become\n // U+FFFD, the noncharacters U+FFFE/U+FFFF are kept.\n this.error();\n endRun();\n value.push(code < CHAR_SPACE ? '\\uFFFD' : String.fromCodePoint(code));\n this.pos += width;\n runStart = this.pos;\n }\n }\n }\n\n // xmlParseStartTag2 + xmlParseElementStart. Writes the start tag (without\n // its ending) and returns the element name and whether it stays open, or\n // null when no element was created.\n private parseStartTag(): [string, boolean] | null {\n this.pos += 1;\n const name = this.parseName();\n if (name === null) {\n // \"StartTag: invalid element name\": \"<\" is dropped, the rest is text.\n this.error();\n return null;\n }\n const tag: StartTag = { attributes: [], name, namespaces: [], seen: null };\n this.skipBlanks();\n for (;;) {\n const code = this.code();\n const atEnd =\n code === 0x3e ||\n (code === 0x2f && this.text.charCodeAt(this.pos + 1) === 0x3e);\n const byteChar =\n code >= CHAR_SPACE ||\n code === CHAR_TAB ||\n code === CHAR_LF ||\n code === CHAR_CR;\n if (atEnd || !byteChar || this.eof) {\n break;\n }\n const attributeName = this.parseName();\n if (attributeName === null) {\n // \"error parsing attribute name\"\n this.error();\n break;\n }\n this.skipBlanks();\n let value: string | null = null;\n if (this.code() === 0x3d) {\n this.pos += 1;\n this.skipBlanks();\n value = this.parseAttributeValue();\n } else {\n // \"Specification mandates value for attribute\"\n this.error();\n }\n if (value !== null) {\n this.addAttribute(tag, attributeName, value);\n }\n const next = this.code();\n if (\n next === 0x3e ||\n (next === 0x2f && this.text.charCodeAt(this.pos + 1) === 0x3e)\n ) {\n break;\n }\n if (this.skipBlanks() === 0) {\n // \"attributes construct error\"\n this.error();\n break;\n }\n }\n let open: boolean;\n if (this.at('/>')) {\n this.pos += 2;\n open = false;\n } else if (this.code() === 0x3e) {\n this.pos += 1;\n open = true;\n } else {\n // \"Couldn't find end of Start Tag\": the element ends here, empty.\n this.error();\n open = false;\n }\n this.writeStartTag(tag);\n return [name, open];\n }\n\n // \"<name\" with its namespace declarations, then its attributes.\n private writeStartTag(tag: StartTag): void {\n const { out } = this;\n this.beginChild();\n out.byte(0x3c);\n out.write(tag.name);\n for (const [prefix, uri] of tag.namespaces) {\n out.write(prefix === '' ? ' xmlns=\"' : ' xmlns:');\n if (prefix !== '') {\n out.write(prefix);\n out.write('=\"');\n }\n out.text(uri, 0, uri.length, true);\n out.byte(0x22);\n }\n for (const [name, value] of tag.attributes) {\n out.byte(CHAR_SPACE);\n out.write(name);\n out.write('=\"');\n out.text(value, 0, value.length, true);\n out.byte(0x22);\n }\n }\n\n private addAttribute(tag: StartTag, name: string, value: string): void {\n tag.seen ??= new Set<string>();\n const { seen } = tag;\n if (name === 'xmlns' || name.startsWith('xmlns:')) {\n const prefix = name === 'xmlns' ? '' : name.slice(6);\n if (seen.has(name)) {\n this.error();\n return;\n }\n seen.add(name);\n if (\n prefix === 'xml' ||\n prefix === 'xmlns' ||\n (prefix !== '' && value === '')\n ) {\n return;\n }\n tag.namespaces.push([prefix, value]);\n return;\n }\n if (seen.has(name)) {\n // \"Attribute x redefined\": an error, but both are kept.\n this.error();\n }\n seen.add(name);\n tag.attributes.push([name, value]);\n }\n\n // A child element of the innermost open element, or the root: its name,\n // or null when there was no element.\n private startElement(): string | null {\n const started = this.parseStartTag();\n if (started === null) {\n return null;\n }\n const [name, open] = started;\n if (open) {\n this.openElements.push(name);\n this.startTagPending = true;\n } else {\n this.out.write('/>');\n }\n this.textRun = -1;\n return name;\n }\n\n private parseRootElement(): void {\n this.rootName = this.startElement();\n if (this.openElements.length > 0) {\n this.parseContent();\n }\n }\n\n // xmlParseEndTag2 after \"</\": the element is closed whatever the name.\n private parseEndTag(expected: string): void {\n this.pos += 2;\n const name = this.parseName();\n this.skipBlanks();\n if (this.code() === 0x3e) {\n this.pos += 1;\n } else {\n this.error();\n }\n if (name !== expected) {\n // \"Opening and ending tag mismatch\"\n this.error();\n }\n }\n\n // xmlParseContentInternal with an explicit stack of open elements.\n private parseContent(): void {\n const stack = this.openElements;\n const end = (): number =>\n this.haltAt >= 0 ? this.haltAt : this.text.length;\n while (this.pos < end()) {\n const code = this.text.charCodeAt(this.pos);\n if (code === 0x3c) {\n const next = this.text.charCodeAt(this.pos + 1);\n if (next === 0x2f) {\n // An end tag always closes the innermost element, whatever its\n // name; a mismatch is only an error.\n this.parseEndTag(stack.at(-1) as string);\n this.closeElement();\n if (stack.length === 0) {\n return;\n }\n } else if (next === 0x3f) {\n const pi = this.parsePI();\n if (pi) {\n this.writeChildPI(pi);\n }\n } else if (this.at('<!--')) {\n const comment = this.parseComment();\n if (comment) {\n this.writeChildComment(comment);\n }\n } else if (this.at('<![CDATA[')) {\n this.parseCdata();\n } else {\n if (stack.length >= MAX_DEPTH) {\n // \"Excessive depth in document: 256\"\n this.error();\n throw new Halt();\n }\n this.startElement();\n }\n } else if (code === 0x26) {\n this.parseContentReference();\n } else {\n this.parseCharData();\n }\n }\n if (this.haltAt >= 0) {\n throw new Halt();\n }\n }\n\n private parseCdata(): void {\n const start = this.pos + 9;\n let index = start;\n const { text } = this;\n while (index < text.length) {\n const code = text.codePointAt(index) ?? 0;\n if (code === 0x5d && text.startsWith(']]>', index)) {\n const value = normalizeNewlines(text.slice(start, index));\n if (value === '' && this.textRun < 0) {\n // libxml2 still adds an empty text node: \"<a></a>\", not \"<a/>\".\n this.beginChild();\n this.textRun = 0;\n }\n this.appendText(value);\n this.pos = index + 3;\n return;\n }\n if (!isXmlChar(code)) {\n this.error();\n this.pos = index;\n return;\n }\n index += code > 0xff_ff ? 2 : 1;\n }\n // \"CData section not finished\": everything up to the end is lost.\n this.error();\n this.pos = text.length;\n }\n\n // xmlParseCharData: an ASCII fast path, then a \"complex\" path.\n private parseCharData(): void {\n const { text } = this;\n const limit = this.haltAt >= 0 ? this.haltAt : text.length;\n let start = this.pos;\n let index = start;\n for (;;) {\n if (index >= limit) {\n this.appendText(text, start, index);\n this.pos = index;\n return;\n }\n const code = text.charCodeAt(index);\n if (code === 0x3c || code === 0x26) {\n this.appendText(text, start, index);\n this.pos = index;\n return;\n }\n if (code === 0x5d) {\n if (text.startsWith(']]>', index)) {\n // \"Sequence ']]>' not allowed in content\": the fast path drops the\n // text it has read and skips one \"]\".\n this.error();\n this.pos = index + 1;\n return;\n }\n index += 1;\n continue;\n }\n if (\n (code >= CHAR_SPACE && code <= ASCII_DEL) ||\n code === CHAR_TAB ||\n code === CHAR_LF\n ) {\n index += 1;\n continue;\n }\n if (code === CHAR_CR && text.charCodeAt(index + 1) === CHAR_LF) {\n // CRLF: the text before it is flushed and the run restarts at LF.\n this.appendText(text, start, index);\n start = index + 1;\n index += 2;\n continue;\n }\n break;\n }\n this.appendText(text, start, index);\n const complexStart = index;\n while (index < limit) {\n const code = text.codePointAt(index) ?? 0;\n if (code === 0x3c || code === 0x26 || !isXmlChar(code)) {\n break;\n }\n if (code === 0x5d && text.startsWith(']]>', index)) {\n this.error();\n }\n index += code > 0xff_ff ? 2 : 1;\n }\n this.appendText(\n normalizeNewlines(text.slice(complexStart, Math.min(index, limit))),\n );\n if (index < limit) {\n const code = text.codePointAt(index) ?? 0;\n if (code !== 0x3c && code !== 0x26) {\n // \"PCDATA invalid Char value\": the character is skipped.\n this.error();\n index += code > 0xff_ff ? 2 : 1;\n }\n }\n this.pos = index;\n }\n}\n\n/** The outcome of {@link recoverXml}. */\nexport interface RecoveredXml {\n /**\n * The recovered document has a DOCTYPE (parsedmarc rejects the report);\n * `xml` is then empty.\n */\n hasDoctype: boolean;\n /** The text parsedmarc parses again. */\n xml: string;\n}\n\n/**\n * Emulate parsedmarc's lxml recovery of malformed XML: libxml2's recovering\n * parser (`recover=True, resolve_entities=False`) followed by\n * `etree.tostring(root, encoding=\"unicode\")`. `xml` is the recovered root\n * element, `\"\"` when libxml2 found no root element, and `\"<a/>\"` where lxml\n * raises (empty input, a leading NUL, lone surrogates); `hasDoctype` is set\n * instead when the recovered tree has a DOCTYPE.\n */\nexport function recoverXml(text: string): RecoveredXml {\n try {\n assertEncodableUtf8(text);\n } catch {\n return { hasDoctype: false, xml: '<a/>' };\n }\n const first = text.charCodeAt(0) === 0xfe_ff ? 1 : 0;\n if (text === '' || (text.length > first && text.charCodeAt(first) === 0)) {\n // \"Document is empty\"\n return { hasDoctype: false, xml: '<a/>' };\n }\n // libxml2 sniffs \"<\\0?\\0\" as UTF-16LE without a byte order mark (what a\n // UTF-16 report becomes after decode(errors=\"ignore\") drops its BOM).\n const source = text.startsWith('<\\u0000?\\u0000')\n ? new TextDecoder('utf-16le').decode(new TextEncoder().encode(text))\n : text;\n return new RecoveringParser(source).run();\n}\n","// xmltodict.parse() with its default options (xmltodict 1.0.4), on top of the\n// Expat port: the same dicts, lists, `@attr` / `#text` keys, whitespace\n// stripping and errors as parsedmarc gets from Python. This module is the\n// entry point of the XML layer; recoverXml() emulates parsedmarc's lxml\n// fallback for malformed reports.\n\nimport { pyStrip } from '../utils/py-str';\nimport { expatParse } from './expat';\nimport { TextBuffer } from './text-buffer';\nimport { assertEncodableUtf8 } from './unicode';\n\nexport { ExpatError } from './expat';\nexport { recoverXml, type RecoveredXml } from './recover';\nexport { XmlUnicodeEncodeError } from './unicode';\n\n/** A value in xmltodict's output. */\nexport type XmlValue = string | null | XmlObject | XmlValue[];\n\n/** An element with attributes and/or children (a Python dict). */\nexport interface XmlObject {\n [key: string]: XmlValue;\n}\n\n/**\n * Python's `ValueError` that xmltodict raises (`\"entities are disabled\"`)\n * when the document declares an entity, before any could be expanded.\n */\nexport class XmlValueError extends Error {\n override name = 'ValueError';\n}\n\n/** parsedmarc's `_DOCTYPE_ERROR`. */\nexport const DOCTYPE_ERROR =\n 'Aggregate reports must not contain a DOCTYPE declaration';\n\n/**\n * parsedmarc's `_XMLDoctypeFound`: raised as soon as Expat reports the start\n * of a `<!DOCTYPE` declaration, before it reads the internal subset (whose\n * `<!ATTLIST>` defaults would otherwise be copied into every matching\n * element: GHSA-m47j-wp78-fqjg).\n */\nexport class XmlDoctypeFound extends Error {\n override name = '_XMLDoctypeFound';\n\n constructor() {\n super(DOCTYPE_ERROR);\n }\n}\n\n/**\n * The document is over `maxDepth` or `maxNodes`. Not in Python: there, memory\n * only runs out at the machine's limit and raises; a full V8 heap ends the\n * process. Unlike a syntax error, this is final: recovery must not try again.\n */\nexport class XmlLimitError extends Error {\n override name = 'XmlLimitError';\n}\n\nexport interface ParseXmlOptions {\n /**\n * Abort on any DOCTYPE with {@link XmlDoctypeFound}, as parsedmarc's\n * `xmltodict.parse(xml, expat=_NoDoctypeExpat)` does. Default true; false\n * gives plain `xmltodict.parse(xml)` (used to check the Expat port).\n */\n rejectDoctype?: boolean;\n /** Most elements open at once; `0` or absent: no limit. */\n maxDepth?: number;\n /** Most elements and attributes in the document; `0` or absent: no limit. */\n maxNodes?: number;\n}\n\nfunction createObject(): XmlObject {\n // No prototype, so element names like \"__proto__\" or \"constructor\" are\n // plain keys.\n return Object.create(null) as XmlObject;\n}\n\n// _DictSAXHandler.push_data with no postprocessor / force_list.\nfunction pushData(\n item: XmlObject | null,\n key: string,\n data: XmlValue,\n): XmlObject {\n const target = item ?? createObject();\n if (Object.hasOwn(target, key)) {\n const existing = target[key] as XmlValue;\n if (Array.isArray(existing)) {\n existing.push(data);\n } else {\n target[key] = [existing, data];\n }\n } else {\n target[key] = data;\n }\n return target;\n}\n\ninterface Frame {\n item: XmlObject | null;\n data: TextBuffer;\n}\n\nfunction raiseDoctypeFound(): never {\n throw new XmlDoctypeFound();\n}\n\n/**\n * Parse XML exactly like Python's `xmltodict.parse(text,\n * expat=_NoDoctypeExpat)` with otherwise default options, as parsedmarc calls\n * it. Throws {@link XmlDoctypeFound} on a DOCTYPE (unless `rejectDoctype` is\n * false), {@link ExpatError} for malformed XML (with Expat's message, line\n * and column), {@link XmlValueError} when the document declares entities, and\n * {@link XmlUnicodeEncodeError} for lone surrogates, and\n * {@link XmlLimitError} past `maxDepth` or `maxNodes`. Linear in the input\n * size. Nesting never overflows the call stack, but every open element costs\n * about 170 bytes of heap, so untrusted text needs the limits.\n */\nexport function parseXmlToDict(\n text: string,\n options: ParseXmlOptions = {},\n): XmlObject | null {\n assertEncodableUtf8(text);\n const startDoctypeDecl =\n options.rejectDoctype === false ? undefined : raiseDoctypeFound;\n const maxDepth = options.maxDepth || Number.POSITIVE_INFINITY;\n const maxNodes = options.maxNodes || Number.POSITIVE_INFINITY;\n const stack: Frame[] = [];\n let nodes = 0;\n let item: XmlObject | null = null;\n let data = new TextBuffer();\n const countNode = (): void => {\n nodes += 1;\n if (nodes > maxNodes) {\n throw new XmlLimitError(\n `XML has more than ${maxNodes} elements and attributes`,\n );\n }\n };\n expatParse(text, {\n attribute: countNode,\n characterData(chunk: string): void {\n data.push(chunk);\n },\n endElement(name: string): void {\n const frame = stack.pop();\n if (!frame) {\n return;\n }\n let value = data.text();\n const element = item;\n ({ item, data } = frame);\n if (value) {\n value = pyStrip(value) || null;\n }\n if (element === null) {\n item = pushData(item, name, value);\n } else {\n if (value) {\n pushData(element, '#text', value);\n }\n item = pushData(item, name, element);\n }\n },\n entityDecl(): void {\n throw new XmlValueError('entities are disabled');\n },\n startDoctypeDecl,\n startElement(_name: string, attributes: string[]): void {\n countNode();\n if (stack.length >= maxDepth) {\n throw new XmlLimitError(`XML nests more than ${maxDepth} elements`);\n }\n stack.push({ data, item });\n let attrs: XmlObject | null = null;\n for (let index = 0; index < attributes.length; index += 2) {\n attrs ??= createObject();\n attrs[`@${attributes[index]}`] = attributes[index + 1] ?? '';\n }\n item = attrs;\n data = new TextBuffer();\n },\n });\n return item;\n}\n","// DMARC aggregate report parsing and CSV output, ported from\n// parsedmarc/__init__.py (RFC 7489 and RFC 9990 in one code path).\n//\n// The parser walks xmltodict-shaped data from the reporter's XML, so every\n// access goes through the Python-semantics helpers in ./internal/py: a\n// missing element raises KeyError, a wrong type raises TypeError or\n// AttributeError, and the final error mapping turns those into the same\n// InvalidAggregateReport messages parsedmarc produces.\n\nimport {\n type ParserConfig,\n type ParserConfigInput,\n resolveParserConfig,\n} from './config';\nimport { csvSafe, rowsToCsv, type CsvOptions, type CsvRow } from './csv';\nimport { EnrichmentError, InvalidAggregateReport } from './errors';\nimport {\n extractReport,\n extractReportFromFilePath,\n type ExtractOptions,\n} from './extract';\nimport {\n dictCopy,\n errorText,\n excOrigin,\n getItem,\n getOptional,\n intValue,\n isDict,\n KeyError,\n noAttribute,\n PyAttributeError,\n pyContains,\n type PyDict,\n pyFrozensetContains,\n PyIndexError,\n pyIntExact,\n pyIter,\n pyLower,\n PyOverflowError,\n pySplit,\n pyStrJoin,\n pyTruthy,\n PyTypeError,\n PyValueError,\n} from './internal/py';\nimport { setOwn } from './internal/set-own';\nimport { DEBUG, logger } from './log';\nimport {\n estimatedSize,\n MAX_REPORT_DEPTH,\n markRaw,\n mixedObject,\n nestsDeeperThan,\n} from './serialize';\nimport type {\n AggregateAuthResultDKIM,\n AggregateAuthResultSPF,\n AggregatePolicyOverrideReason,\n AggregatePolicyPublished,\n AggregateRecord,\n AggregateReport,\n AggregateReportMetadata,\n} from './types';\nimport type { PyDateTime } from './utils/datetime';\nimport { getBaseDomain } from './utils/domains';\nimport { getIpAddressInfo, ReportLookupBudget } from './utils/ip-info';\nimport { PY_WS_CLASS } from './utils/py-str';\nimport { pyRepr, pyStr } from './utils/python';\nimport { sanitizeForLog } from './utils/sanitize';\nimport { decodeUtf8 } from './utils/text';\nimport { humanTimestampToDatetime, timestampToHuman } from './utils/timestamps';\nimport { ExpatError } from './xml/expat';\nimport { recoverXml } from './xml/recover';\nimport {\n DOCTYPE_ERROR,\n parseXmlToDict,\n type ParseXmlOptions,\n XmlDoctypeFound,\n XmlLimitError,\n} from './xml/xmltodict';\n\n/** The XML namespace RFC 9990 assigns to DMARC aggregate reports. */\nexport const RFC_9990_NAMESPACE = 'urn:ietf:params:xml:ns:dmarc-2.0';\n\n/**\n * RFC 9990's PolicyOverrideType enumeration: `policy_test_mode` was added\n * and `forwarded` / `sampled_out` were removed.\n */\nexport const RFC_9990_POLICY_OVERRIDE_TYPES: ReadonlySet<string> = new Set([\n 'local_policy',\n 'mailing_list',\n 'other',\n 'policy_test_mode',\n 'trusted_forwarder',\n]);\nexport const RFC_7489_REMOVED_POLICY_OVERRIDE_TYPES: ReadonlySet<string> =\n new Set(['forwarded', 'sampled_out']);\n\nconst RFC_9990_ONLY_POLICY_FIELDS = ['np', 'testing', 'discovery_method'];\nconst SORTED_RFC_9990_OVERRIDE_TYPES = pyRepr(\n [...RFC_9990_POLICY_OVERRIDE_TYPES].sort(),\n);\n\n// Each pattern runs on untrusted input and matches in linear time. They are\n// Python `re` patterns translated literally: Python's `^` under MULTILINE\n// matches only after `\\n` (JS `m` also matches after `\\r`, U+2028, U+2029),\n// its `.` excludes only `\\n`, `\\w` is `[\\p{L}\\p{N}_]` and `\\s` is\n// `PY_WS_CLASS`.\nconst XML_HEADER = /(?<![^\\n])<\\?xml [^\\n]*?>/gu;\nconst XML_SCHEMA = /<\\/?xs:schema[^<>]*>/gu;\n/** The value of any xmlns (default or prefixed) declaration. */\nconst XML_NAMESPACE = new RegExp(\n `xmlns(?::[a-zA-Z_][\\\\p{L}\\\\p{N}_.-]*)?[${PY_WS_CLASS}]*=[${PY_WS_CLASS}]*[\"']([^\"']+)[\"']`,\n 'u',\n);\n\nconst SECONDS_PER_DAY = 86_400;\n\n/**\n * Python's `str()` for xmltodict values. Elements with attributes are\n * prototype-less dicts, which `pyStr()` can't print, and `str(dict)` is\n * `repr(dict)` in Python.\n */\nfunction str(value: unknown): string {\n return isDict(value) ? pyRepr(value) : pyStr(value);\n}\n\n/**\n * Unwrap a possibly-langAttrString value (`{\"#text\": ..., \"@lang\": ...}`)\n * to its text. `null` stays `null`; other shapes pass through unchanged.\n */\nexport function unwrapText(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n if (isDict(value)) {\n const text = value['#text'];\n return text === null || text === undefined ? null : str(text);\n }\n return value;\n}\n\n/** Lowercase a reporter-supplied enum word; non-strings pass through. */\nfunction normalizeResultWord(value: unknown): unknown {\n return typeof value === 'string' ? value.toLowerCase() : value;\n}\n\nexport interface DayBucket {\n begin: PyDateTime;\n end: PyDateTime;\n count: number | bigint;\n}\n\n/** Consecutive days of an interval that overlap it by the same seconds. */\ninterface DayGroup {\n /** Index of the group's first day within the interval. */\n firstDay: number;\n days: number;\n seconds: number;\n}\n\n/** The calendar days an interval touches, grouped by overlap length. */\ninterface DayLayout {\n intervalSeconds: number;\n /** Midnight of the first day. */\n firstMidnight: PyDateTime;\n dayCount: number;\n groups: DayGroup[];\n}\n\n/** Python's `datetime.max.date()`: adding a day to it overflows. */\nconst LAST_DATE = { year: 9999, month: 12, day: 31 } as const;\n\nfunction layoutDays(begin: PyDateTime, end: PyDateTime): DayLayout {\n const intervalSeconds = end.secondsSince(begin);\n let firstMidnight = begin.startOfDay();\n if (firstMidnight.compare(begin) > 0) {\n firstMidnight = firstMidnight.addSeconds(-SECONDS_PER_DAY);\n }\n const dayCount = Math.ceil(end.secondsSince(firstMidnight) / SECONDS_PER_DAY);\n const lastMidnight = firstMidnight.addSeconds(\n (dayCount - 1) * SECONDS_PER_DAY,\n );\n // Python's loop computes `day_cursor + timedelta(days=1)` for every day,\n // which overflows on 9999-12-31.\n if (\n lastMidnight.year === LAST_DATE.year &&\n lastMidnight.month === LAST_DATE.month &&\n lastMidnight.day === LAST_DATE.day\n ) {\n throw new PyOverflowError('date value out of range');\n }\n if (dayCount === 1) {\n return {\n intervalSeconds,\n firstMidnight,\n dayCount,\n groups: [{ firstDay: 0, days: 1, seconds: intervalSeconds }],\n };\n }\n const groups: DayGroup[] = [\n {\n firstDay: 0,\n days: 1,\n seconds: firstMidnight.addSeconds(SECONDS_PER_DAY).secondsSince(begin),\n },\n ];\n if (dayCount > 2) {\n groups.push({ firstDay: 1, days: dayCount - 2, seconds: SECONDS_PER_DAY });\n }\n groups.push({\n firstDay: dayCount - 1,\n days: 1,\n seconds: end.secondsSince(lastMidnight),\n });\n return { intervalSeconds, firstMidnight, dayCount, groups };\n}\n\n/**\n * Splits a report interval into calendar-day buckets\n * (`_bucket_interval_by_day`), computing the day layout once for all of a\n * report's records.\n *\n * Python walks every day of the interval; a reporter-supplied `date_range`\n * can span thousands of years, so this works per group of days with the\n * same overlap (first day, full days, last day). Every day in a group gets\n * the same exact share, so floors, fractions and the largest-remainder\n * order (Python's stable `sorted(..., reverse=True)`: among equal\n * fractions, earlier days first) are computed per group, and only buckets\n * with a non-zero count are built. The result equals Python's.\n */\nexport class IntervalDays {\n readonly begin: PyDateTime;\n readonly end: PyDateTime;\n #layout: DayLayout | null = null;\n\n constructor(begin: PyDateTime, end: PyDateTime) {\n this.begin = begin;\n this.end = end;\n }\n\n /**\n * Distribute `totalCount` over the days, like Python, raising like it.\n * More than `maxBuckets` buckets raise `InvalidAggregateReport` before any\n * is built (not in parsedmarc).\n */\n buckets(\n totalCount: number | bigint,\n maxBuckets: number = Number.POSITIVE_INFINITY,\n ): DayBucket[] {\n const { begin, end } = this;\n if (begin.isNaive !== end.isNaive) {\n throw new PyTypeError(\n \"can't compare offset-naive and offset-aware datetimes\",\n );\n }\n if (begin.compare(end) > 0) {\n throw new PyValueError('begin must be earlier than end');\n }\n if (begin.isNaive) {\n throw new PyValueError('begin and end must be timezone-aware');\n }\n if (begin.utcOffsetMinutes !== end.utcOffsetMinutes) {\n throw new PyValueError('begin and end must have the same tzinfo');\n }\n if (totalCount < 0) {\n throw new PyValueError('total_count must be non-negative');\n }\n if (end.secondsSince(begin) <= 0 || totalCount === 0 || totalCount === 0n) {\n return [];\n }\n this.#layout ??= layoutDays(begin, end);\n return this.#distribute(this.#layout, totalCount, maxBuckets);\n }\n\n #distribute(\n layout: DayLayout,\n totalCount: number | bigint,\n maxBuckets: number,\n ): DayBucket[] {\n // `(seconds / interval) * total_count` converts the int to a float.\n const totalFloat = Number(totalCount);\n if (!Number.isFinite(totalFloat)) {\n throw new PyOverflowError('int too large to convert to float');\n }\n const shares = layout.groups.map(group => {\n const exact = (group.seconds / layout.intervalSeconds) * totalFloat;\n const floor = Math.trunc(exact);\n return { group, floor: BigInt(floor), fraction: exact - floor, plus: 0 };\n });\n let remainder = BigInt(totalCount);\n for (const share of shares) {\n remainder -= share.floor * BigInt(share.group.days);\n }\n // `indices_by_fraction[:remainder]`, including a negative slice end.\n const dayCount = BigInt(layout.dayCount);\n let extra =\n remainder >= 0n\n ? remainder < dayCount\n ? remainder\n : dayCount\n : dayCount + remainder > 0n\n ? dayCount + remainder\n : 0n;\n const byFraction = [...shares].sort(\n (a, b) => b.fraction - a.fraction || a.group.firstDay - b.group.firstDay,\n );\n for (const share of byFraction) {\n const days = BigInt(share.group.days);\n const given = extra < days ? extra : days;\n share.plus = Number(given);\n extra -= given;\n }\n\n // Each bucket holds a record: millions of days per <record> would fill\n // the heap, which ends the process instead of raising.\n let bucketCount = 0;\n for (const { group, floor, plus } of shares) {\n bucketCount += floor > 0n ? group.days : plus;\n }\n if (bucketCount > maxBuckets) {\n throw new InvalidAggregateReport(\n 'Report needs too many records to normalize its timespan (max_normalized_records)',\n );\n }\n\n const buckets: DayBucket[] = [];\n for (const { group, floor, plus } of shares) {\n // Days that only get their floor share come after the `plus` ones.\n const lastDay =\n floor > 0n ? group.firstDay + group.days : group.firstDay + plus;\n for (let day = group.firstDay; day < lastDay; day += 1) {\n const count = floor + (day - group.firstDay < plus ? 1n : 0n);\n buckets.push({\n begin:\n day === 0\n ? this.begin\n : layout.firstMidnight.addSeconds(day * SECONDS_PER_DAY),\n end:\n day === layout.dayCount - 1\n ? this.end\n : layout.firstMidnight.addSeconds((day + 1) * SECONDS_PER_DAY),\n count: intValue(count),\n });\n }\n }\n return buckets;\n }\n}\n\n/**\n * Split [begin, end) into calendar-day buckets and distribute `totalCount`\n * across them in proportion to each day's overlap, using largest-remainder\n * rounding so the counts sum to `totalCount` (`_bucket_interval_by_day`).\n */\nexport function bucketIntervalByDay(\n begin: PyDateTime,\n end: PyDateTime,\n totalCount: number | bigint,\n): DayBucket[] {\n return new IntervalDays(begin, end).buckets(totalCount);\n}\n\nconst INTERVAL_FORMAT = '%Y-%m-%d %H:%M:%S';\n\n/** A parsed record before its interval fields are added. */\ntype RecordWithoutInterval = Omit<\n AggregateRecord,\n 'intervalBegin' | 'intervalEnd' | 'normalizedTimespan'\n>;\n\n/**\n * Characters of output that weigh as one record of `maxNormalizedRecords`.\n * An ordinary row stays within it: a record of the samples and the report\n * data its row repeats come to 1,550-1,910.\n */\nconst RECORD_WEIGHT_UNIT = 2048;\n\n/**\n * What a report's normalized timespan may still expand to, in records of\n * ordinary size (`maxNormalizedRecords`; not in parsedmarc). Every day\n * bucket is a row of the CSV and a document of the search outputs, and\n * repeats its record's results and the report's data (reporter, errors,\n * published policy), so a record with thousands of `<dkim>` entries, or a\n * long `extra_contact_info`, weighs as many records as its rows take in the\n * output: the number of records alone doesn't bound the report.\n */\nexport class NormalizedRecordBudget {\n #left: number;\n readonly #reportSize: number;\n\n /**\n * @param reportSize Estimated characters of the report data each row\n * repeats ({@link estimatedSize}).\n */\n constructor(maxRecords: number, reportSize = 0) {\n this.#left = maxRecords;\n this.#reportSize = reportSize;\n }\n\n /** The records of ordinary size a row of `record` weighs, at least one. */\n weigh(record: RecordWithoutInterval): number {\n return Math.max(\n 1,\n (estimatedSize(record) + this.#reportSize) / RECORD_WEIGHT_UNIT,\n );\n }\n\n /** The buckets of a record of `weight` that still fit. */\n room(weight: number): number {\n return Math.max(Math.floor(this.#left / weight), 0);\n }\n\n spend(weight: number): void {\n this.#left -= weight;\n }\n}\n\n/**\n * Append a parsed record unchanged, or split into daily buckets when the\n * report's timespan needs normalizing (`_append_parsed_record`).\n */\nexport function appendParsedRecord(\n parsedRecord: RecordWithoutInterval,\n records: AggregateRecord[],\n beginDt: PyDateTime,\n endDt: PyDateTime,\n normalize: boolean,\n /** The report's day layout, shared by its records (built if omitted). */\n interval: IntervalDays = new IntervalDays(beginDt, endDt),\n /**\n * `maxNormalizedRecords`, for all the report's `records` (`0`: no limit),\n * or the report's {@link NormalizedRecordBudget}, which weighs records by\n * size.\n */\n maxRecords: number | NormalizedRecordBudget = 0,\n): void {\n if (!normalize) {\n records.push({\n ...parsedRecord,\n normalizedTimespan: false,\n intervalBegin: beginDt.strftime(INTERVAL_FORMAT),\n intervalEnd: endDt.strftime(INTERVAL_FORMAT),\n });\n return;\n }\n const totalCount = pyIntExact(parsedRecord.count ?? 0);\n if (maxRecords instanceof NormalizedRecordBudget) {\n // Measured once per record: its buckets share the same objects.\n const weight = maxRecords.weigh(parsedRecord);\n const buckets = interval.buckets(totalCount, maxRecords.room(weight));\n maxRecords.spend(weight * buckets.length);\n pushBuckets(parsedRecord, records, buckets);\n return;\n }\n const room =\n maxRecords > 0\n ? Math.max(maxRecords - records.length, 0)\n : Number.POSITIVE_INFINITY;\n pushBuckets(parsedRecord, records, interval.buckets(totalCount, room));\n}\n\nfunction pushBuckets(\n parsedRecord: RecordWithoutInterval,\n records: AggregateRecord[],\n buckets: DayBucket[],\n): void {\n for (const bucket of buckets) {\n records.push({\n ...parsedRecord,\n count: bucket.count,\n normalizedTimespan: true,\n intervalBegin: bucket.begin.strftime(INTERVAL_FORMAT),\n intervalEnd: bucket.end.strftime(INTERVAL_FORMAT),\n });\n }\n}\n\n/**\n * The RFC 9990 override-type warnings. Membership in Python's frozensets\n * hashes the value, so a dict or list `type` (`<type lang=\"en\">`) raises\n * TypeError and the record is dropped, as in parsedmarc.\n */\nfunction warnOverrideType(reasonType: unknown, isRfc9990: boolean): void {\n if (!isRfc9990) {\n return;\n }\n if (pyFrozensetContains(RFC_7489_REMOVED_POLICY_OVERRIDE_TYPES, reasonType)) {\n logger.warning(\n `Policy override reason type ${pyRepr(reasonType)} was removed in RFC 9990; expected one of ${SORTED_RFC_9990_OVERRIDE_TYPES}`,\n );\n } else if (\n reasonType !== null &&\n reasonType !== undefined &&\n !pyFrozensetContains(RFC_9990_POLICY_OVERRIDE_TYPES, reasonType)\n ) {\n logger.warning(\n `Unknown policy override reason type ${pyRepr(reasonType)} per RFC 9990; expected one of ${SORTED_RFC_9990_OVERRIDE_TYPES}`,\n );\n }\n}\n\nfunction parseDkimResults(\n results: unknown,\n isRfc9990: boolean,\n): AggregateAuthResultDKIM[] {\n const parsed: AggregateAuthResultDKIM[] = [];\n for (const result of pyIter(results)) {\n if (!(pyContains(result, 'domain') && getItem(result, 'domain') !== null)) {\n continue;\n }\n const domain = getItem(result, 'domain');\n let selector: unknown = 'none';\n if (\n pyContains(result, 'selector') &&\n getItem(result, 'selector') !== null\n ) {\n selector = getItem(result, 'selector');\n } else if (isRfc9990) {\n logger.warning(\n `DKIM auth result for ${pyRepr(domain)} is missing the 'selector' element, which is REQUIRED by RFC 9990`,\n );\n }\n let outcome: unknown = 'none';\n if (pyContains(result, 'result') && getItem(result, 'result') !== null) {\n outcome = normalizeResultWord(getItem(result, 'result'));\n }\n parsed.push({\n domain: markRaw(domain),\n selector: markRaw(selector),\n result: markRaw(outcome),\n humanResult: markRaw(unwrapText(getOptional(result, 'human_result'))),\n } as AggregateAuthResultDKIM);\n }\n return parsed;\n}\n\nfunction parseSpfResults(results: unknown): AggregateAuthResultSPF[] {\n const parsed: AggregateAuthResultSPF[] = [];\n for (const result of pyIter(results)) {\n if (!(pyContains(result, 'domain') && getItem(result, 'domain') !== null)) {\n continue;\n }\n let scope: unknown = 'mfrom';\n if (pyContains(result, 'scope') && getItem(result, 'scope') !== null) {\n scope = getItem(result, 'scope');\n }\n let outcome: unknown = 'none';\n if (pyContains(result, 'result') && getItem(result, 'result') !== null) {\n outcome = normalizeResultWord(getItem(result, 'result'));\n }\n parsed.push({\n domain: markRaw(getItem(result, 'domain')),\n scope: markRaw(scope),\n result: markRaw(outcome),\n humanResult: markRaw(unwrapText(getOptional(result, 'human_result'))),\n } as AggregateAuthResultSPF);\n }\n return parsed;\n}\n\n/** parsedmarc's identifier keys and their camelCase names. */\nconst IDENTIFIER_FIELDS: ReadonlyMap<string, string> = new Map([\n ['header_from', 'headerFrom'],\n ['envelope_from', 'envelopeFrom'],\n ['envelope_to', 'envelopeTo'],\n]);\n\n/**\n * The record's identifiers: parsedmarc keeps every child of the reporter's\n * `<identifiers>`, so keys it doesn't know stay as the reporter wrote them.\n */\nfunction identifiersObject(\n identifiers: PyDict,\n): AggregateRecord['identifiers'] {\n return mixedObject(\n Object.entries(identifiers).map(([key, value]) => {\n const camelKey = IDENTIFIER_FIELDS.get(key);\n return camelKey === undefined\n ? { key, value, raw: true }\n : { key: camelKey, value: markRaw(value), raw: false };\n }),\n ) as unknown as AggregateRecord['identifiers'];\n}\n\n/**\n * Convert one `<record>` into parsedmarc's consistent shape, enriching the\n * source IP (`_parse_report_record`).\n */\nexport async function parseReportRecord(\n record: unknown,\n config: ParserConfig,\n isRfc9990 = false,\n lookupBudget: ReportLookupBudget | null = null,\n): Promise<RecordWithoutInterval> {\n // Python starts with `record = record.copy()`, so a record that is not a\n // dict (`<record>text</record>`, `<record/>`) fails with AttributeError.\n const row = getItem(dictCopy(record), 'row');\n const sourceIp = getItem(row, 'source_ip');\n if (sourceIp === null) {\n throw new PyValueError('Source IP address is empty');\n }\n if (typeof sourceIp !== 'string') {\n throw noAttribute(sourceIp, 'lower');\n }\n const source = await getIpAddressInfo(sourceIp, { config, lookupBudget });\n const count = pyIntExact(getItem(row, 'count'));\n\n const policyEvaluated = dictCopy(getItem(row, 'policy_evaluated'));\n let disposition: unknown = 'none';\n let dkim: unknown = 'fail';\n let spf: unknown = 'fail';\n if (pyContains(policyEvaluated, 'disposition')) {\n disposition = normalizeResultWord(getItem(policyEvaluated, 'disposition'));\n }\n if (pyContains(policyEvaluated, 'dkim')) {\n dkim = normalizeResultWord(getItem(policyEvaluated, 'dkim'));\n }\n if (pyContains(policyEvaluated, 'spf')) {\n spf = normalizeResultWord(getItem(policyEvaluated, 'spf'));\n }\n const rawSpf = getItem(policyEvaluated, 'spf');\n const spfAligned = rawSpf !== null && pyLower(rawSpf) === 'pass';\n const rawDkim = getItem(policyEvaluated, 'dkim');\n const dkimAligned = rawDkim !== null && pyLower(rawDkim) === 'pass';\n\n let reasons: unknown[] = [];\n if (pyContains(policyEvaluated, 'reason')) {\n const reason = getItem(policyEvaluated, 'reason');\n reasons = Array.isArray(reason) ? reason : [reason];\n }\n for (const reason of reasons) {\n // Python updates the reporter's dict in place and keeps it, so the\n // reason stays raw data (other children included).\n const comment = unwrapText(getOptional(reason, 'comment'));\n setOwn(reason as PyDict, 'comment', comment);\n warnOverrideType(getOptional(reason, 'type'), isRfc9990);\n }\n\n const identifiers = dictCopy(\n pyContains(record, 'identities')\n ? getItem(record, 'identities')\n : getItem(record, 'identifiers'),\n );\n const headerFrom = getItem(identifiers, 'header_from');\n identifiers.header_from =\n typeof headerFrom === 'string' ? headerFrom.toLowerCase() : '';\n\n const rawAuthResults = getItem(record, 'auth_results');\n let authResults: PyDict;\n if (isDict(rawAuthResults)) {\n authResults = { ...rawAuthResults };\n if (!pyContains(authResults, 'spf')) {\n authResults.spf = [];\n }\n if (!pyContains(authResults, 'dkim')) {\n authResults.dkim = [];\n }\n } else {\n authResults = { dkim: [], spf: [] };\n }\n if (!Array.isArray(authResults.dkim)) {\n authResults.dkim = [authResults.dkim];\n }\n const dkimResults = parseDkimResults(authResults.dkim, isRfc9990);\n if (!Array.isArray(authResults.spf)) {\n authResults.spf = [authResults.spf];\n }\n const spfResults = parseSpfResults(authResults.spf);\n\n // Backfill envelope_from from the last SPF result's domain when the\n // reporter omitted it or sent it empty.\n if (\n getOptional(identifiers, 'envelope_from') === null ||\n getOptional(identifiers, 'envelope_from') === undefined\n ) {\n let envelopeFrom: unknown = null;\n const spfList = authResults.spf as unknown[];\n if (spfList.length > 0) {\n const spfResult = spfList.at(-1);\n if (pyContains(spfResult, 'domain')) {\n envelopeFrom = getItem(spfResult, 'domain');\n }\n }\n if (envelopeFrom !== null) {\n envelopeFrom = str(envelopeFrom).toLowerCase();\n }\n identifiers.envelope_from = envelopeFrom;\n }\n let envelopeTo: unknown = null;\n if (pyContains(identifiers, 'envelope_to')) {\n envelopeTo = identifiers.envelope_to;\n delete identifiers.envelope_to;\n }\n identifiers.envelope_to = envelopeTo;\n\n return {\n source,\n count,\n alignment: {\n spf: spfAligned,\n dkim: dkimAligned,\n dmarc: spfAligned || dkimAligned,\n },\n policyEvaluated: {\n disposition: markRaw(disposition),\n dkim: markRaw(dkim),\n spf: markRaw(spf),\n policyOverrideReasons: reasons.map(reason =>\n markRaw(reason),\n ) as AggregatePolicyOverrideReason[],\n } as AggregateRecord['policyEvaluated'],\n identifiers: identifiersObject(identifiers),\n authResults: { dkim: dkimResults, spf: spfResults },\n } as RecordWithoutInterval;\n}\n\nexport interface ParseAggregateReportOptions extends ParserConfigInput {\n /** DNS timeout in seconds (parsedmarc's `timeout`); same as `dnsTimeout`. */\n timeout?: number;\n /** DNS retries (parsedmarc's `retries`); same as `dnsRetries`. */\n retries?: number;\n /** Called every 20 records of large reports (not part of `config`). */\n keepAlive?: (() => unknown) | null;\n}\n\nfunction configFrom(options: ParseAggregateReportOptions): ParserConfig {\n const { timeout, retries, keepAlive: _keepAlive, ...rest } = options;\n return resolveParserConfig({\n ...rest,\n ...(timeout === undefined ? {} : { dnsTimeout: timeout }),\n ...(retries === undefined ? {} : { dnsRetries: retries }),\n });\n}\n\nfunction optionalPolicyField(policy: unknown, key: string): unknown {\n return pyContains(policy, key) && getItem(policy, key) !== null\n ? getItem(policy, key)\n : null;\n}\n\n/** The range of C `time_t` (int64) and of glibc's `int tm_year`. */\nconst TIME_T_MIN = -(2n ** 63n);\nconst TIME_T_MAX = 2n ** 63n - 1n;\nconst TM_YEAR_MAX = 2n ** 31n - 1n + 1900n;\nconst TM_YEAR_MIN = -(2n ** 31n) + 1900n;\nconst MAX_JS_DATE_SECONDS = 8_640_000_000_000;\nconst SECONDS_PER_400_YEARS = 12_622_780_800n;\nconst MIN_YEAR = 1;\nconst MAX_YEAR = 9999;\n\n/** The proleptic Gregorian year of a UTC timestamp, for any integer. */\nfunction utcYear(timestamp: bigint): bigint {\n // Shift into JS Date's range by whole 400-year cycles (146097 days each).\n const cycles = timestamp / SECONDS_PER_400_YEARS;\n const rest = Number(timestamp - cycles * SECONDS_PER_400_YEARS);\n return BigInt(new Date(rest * 1000).getUTCFullYear()) + cycles * 400n;\n}\n\n/**\n * `timestamp_to_human()` with the errors Python's\n * `datetime.fromtimestamp()` raises for timestamps out of range: beyond\n * `time_t` or a year glibc's `localtime()` can't hold → OverflowError,\n * otherwise outside years 1-9999 → ValueError.\n */\nfunction checkedTimestampToHuman(timestamp: number | bigint): string {\n const exact = BigInt(timestamp);\n if (exact < TIME_T_MIN || exact > TIME_T_MAX) {\n throw new PyOverflowError('timestamp out of range for platform time_t');\n }\n if (Math.abs(Number(exact)) < MAX_JS_DATE_SECONDS) {\n const year = new Date(Number(exact) * 1000).getFullYear();\n if (year < MIN_YEAR || year > MAX_YEAR) {\n throw new PyValueError(`year must be in 1..9999, not ${year}`);\n }\n return timestampToHuman(Number(exact));\n }\n // Far outside JS Date's range the year is taken in UTC; Python's local\n // year differs only within the UTC offset of New Year.\n const year = utcYear(exact);\n if (year > TM_YEAR_MAX || year < TM_YEAR_MIN) {\n throw new PyOverflowError('timestamp out of range for platform time_t');\n }\n throw new PyValueError(`year must be in 1..9999, not ${year}`);\n}\n\nfunction xmlLimits(config: ParserConfig): ParseXmlOptions {\n return { maxDepth: config.maxXmlDepth, maxNodes: config.maxXmlNodes };\n}\n\nasync function buildReport(\n xmlText: string,\n xmlNamespace: string | null,\n initialErrors: string[],\n config: ParserConfig,\n keepAlive: (() => unknown) | null,\n): Promise<AggregateReport> {\n let errors = initialErrors;\n let xml = xmlText.replace(XML_HEADER, '<?xml version=\"1.0\"?>');\n xml = xml.replace(XML_SCHEMA, '');\n\n // The statements below follow parse_aggregate_report_xml's order, so the\n // first missing or malformed field raises the same error as in Python.\n const report = getItem(parseXmlToDict(xml, xmlLimits(config)), 'feedback');\n const reportMetadata = getItem(report, 'report_metadata') as PyDict;\n // <email> may carry attributes (xml:lang), which make it a dict.\n if (isDict(getOptional(reportMetadata, 'email'))) {\n const unwrapped = unwrapText(reportMetadata.email);\n // Python's logger.debug(\"%r\", ...) formats only when DEBUG is enabled.\n if (unwrapped === null && logger.isEnabledFor(DEBUG)) {\n logger.debug(\n `Discarding malformed <email> in report_metadata: ${pyRepr(reportMetadata.email)}`,\n );\n }\n setOwn(reportMetadata, 'email', unwrapped);\n }\n const schema = pyContains(report, 'version')\n ? getItem(report, 'version')\n : 'draft';\n\n if (getItem(reportMetadata, 'org_name') === null) {\n const email = getItem(reportMetadata, 'email');\n if (email !== null) {\n setOwn(reportMetadata, 'org_name', pySplit(email, '@').at(-1));\n }\n }\n let orgName = getItem(reportMetadata, 'org_name');\n if (orgName !== null && !pyContains(orgName, ' ')) {\n if (typeof orgName !== 'string') {\n throw noAttribute(orgName, 'lower');\n }\n const baseDomain = getBaseDomain(orgName);\n if (baseDomain !== null) {\n orgName = baseDomain;\n }\n }\n if (!pyTruthy(orgName)) {\n logger.debug(`Could not parse org_name from XML.\\r\\n${pyRepr(report)}`);\n throw new KeyError(\n 'Organization name is missing. This field is a requirement for saving the report',\n );\n }\n const orgEmail = getItem(reportMetadata, 'email');\n const orgExtraContactInfo = unwrapText(\n getOptional(reportMetadata, 'extra_contact_info'),\n );\n const rawReportId = getItem(reportMetadata, 'report_id');\n if (typeof rawReportId !== 'string') {\n throw noAttribute(rawReportId, 'replace');\n }\n const reportId = rawReportId\n .replaceAll('<', '')\n .replaceAll('>', '')\n .split('@')[0] as string;\n\n const dateRange = getItem(reportMetadata, 'date_range');\n const beginTs = pyIntExact(pySplit(getItem(dateRange, 'begin'), '.')[0]);\n const endTs = pyIntExact(pySplit(getItem(dateRange, 'end'), '.')[0]);\n const spanSeconds = intValue(BigInt(endTs) - BigInt(beginTs));\n const normalizeTimespan =\n Number(spanSeconds) > config.normalizeTimespanThresholdHours * 3600;\n const beginDate = checkedTimestampToHuman(beginTs);\n const endDate = checkedTimestampToHuman(endTs);\n const beginDt = humanTimestampToDatetime(beginDate, { toUtc: true });\n const endDt = humanTimestampToDatetime(endDate, { toUtc: true });\n\n // <error> is a single langAttrString in RFC 9990 but may repeat in\n // RFC 7489 reports. When present it replaces the parse errors so far.\n if (pyContains(reportMetadata, 'error')) {\n const rawErrors = reportMetadata.error;\n const list = Array.isArray(rawErrors) ? rawErrors : [rawErrors];\n errors = list\n .map(error => markRaw(unwrapText(error)))\n .filter(text => pyTruthy(text)) as string[];\n }\n const generator = unwrapText(getOptional(reportMetadata, 'generator'));\n\n const newReportMetadata = {\n orgName: markRaw(orgName),\n orgEmail: markRaw(orgEmail),\n orgExtraContactInfo: markRaw(orgExtraContactInfo),\n reportId,\n beginDate,\n endDate,\n timespanRequiresNormalization: normalizeTimespan,\n originalTimespanSeconds: spanSeconds,\n errors,\n generator: markRaw(generator),\n } as AggregateReportMetadata;\n\n let policyPublished = getItem(report, 'policy_published');\n if (Array.isArray(policyPublished)) {\n if (policyPublished.length === 0) {\n throw new PyIndexError('list index out of range');\n }\n policyPublished = policyPublished[0];\n }\n const isRfc9990 =\n xmlNamespace === RFC_9990_NAMESPACE ||\n pyContains(reportMetadata, 'generator') ||\n RFC_9990_ONLY_POLICY_FIELDS.some(field =>\n pyContains(policyPublished, field),\n );\n\n const domain = getItem(policyPublished, 'domain');\n const adkim = optionalPolicyField(policyPublished, 'adkim') ?? 'r';\n const aspf = optionalPolicyField(policyPublished, 'aspf') ?? 'r';\n const p = getItem(policyPublished, 'p');\n const sp = optionalPolicyField(policyPublished, 'sp') ?? p;\n const pct = optionalPolicyField(policyPublished, 'pct');\n const fo = optionalPolicyField(policyPublished, 'fo');\n const np = optionalPolicyField(policyPublished, 'np');\n if (np !== null && !['none', 'quarantine', 'reject'].includes(np as string)) {\n logger.warning(`Invalid np value: ${sanitizeForLog(str(np))}`);\n }\n const testing = optionalPolicyField(policyPublished, 'testing');\n if (testing !== null && !['n', 'y'].includes(testing as string)) {\n logger.warning(`Invalid testing value: ${sanitizeForLog(str(testing))}`);\n }\n const discoveryMethod = optionalPolicyField(\n policyPublished,\n 'discovery_method',\n );\n if (\n discoveryMethod !== null &&\n !['psl', 'treewalk'].includes(discoveryMethod as string)\n ) {\n logger.warning(\n `Invalid discovery_method value: ${sanitizeForLog(str(discoveryMethod))}`,\n );\n }\n const newPolicyPublished = {\n domain: markRaw(domain),\n adkim: markRaw(adkim),\n aspf: markRaw(aspf),\n p: markRaw(p),\n sp: markRaw(sp),\n pct: markRaw(pct),\n fo: markRaw(fo),\n np: markRaw(np),\n testing: markRaw(testing),\n discoveryMethod: markRaw(discoveryMethod),\n } as AggregatePolicyPublished;\n const interval = new IntervalDays(beginDt, endDt);\n // Measured once: every row of the report repeats the same objects.\n const recordBudget =\n normalizeTimespan && config.maxNormalizedRecords > 0\n ? new NormalizedRecordBudget(\n config.maxNormalizedRecords,\n estimatedSize([\n schema,\n xmlNamespace,\n newReportMetadata,\n newPolicyPublished,\n ]),\n )\n : 0;\n\n const records: AggregateRecord[] = [];\n const reportRecords = getItem(report, 'record');\n if (Array.isArray(reportRecords)) {\n const lookupBudget = new ReportLookupBudget(config);\n for (let index = 0; index < reportRecords.length; index += 1) {\n if (keepAlive !== null && index > 0 && index % 20 === 0) {\n logger.debug('Sending keepalive cmd');\n await keepAlive();\n logger.debug(`Processed ${index}/${reportRecords.length}`);\n }\n try {\n const parsed = await parseReportRecord(\n reportRecords[index],\n config,\n isRfc9990,\n lookupBudget,\n );\n appendParsedRecord(\n parsed,\n records,\n beginDt,\n endDt,\n normalizeTimespan,\n interval,\n recordBudget,\n );\n } catch (error) {\n // Not this record's fault: every other one would fail too, leaving\n // an empty report that looks parsed. Nor is a report over the limit\n // of normalized records valid without the record that crossed it.\n if (\n error instanceof EnrichmentError ||\n error instanceof InvalidAggregateReport\n ) {\n throw error;\n }\n logger.warning(\n `Could not parse record: ${sanitizeForLog(errorText(error))}`,\n );\n }\n }\n } else {\n const parsed = await parseReportRecord(reportRecords, config, isRfc9990);\n appendParsedRecord(\n parsed,\n records,\n beginDt,\n endDt,\n normalizeTimespan,\n interval,\n recordBudget,\n );\n }\n\n return {\n xmlSchema: markRaw(schema),\n xmlNamespace,\n reportMetadata: newReportMetadata,\n policyPublished: newPolicyPublished,\n records,\n } as AggregateReport;\n}\n\n/**\n * Run `parse` with a keepalive hook whose failures reach the caller as\n * thrown. They say nothing about the report, but the error handling around\n * a parse makes a report error of whatever it catches (as in parsedmarc,\n * where a dropped connection invalidates the report), so `parse`'s outcome\n * is overridden by the failure. Nests: an outer call sees it too.\n */\nexport async function withKeepAlive<T>(\n keepAlive: (() => unknown) | null,\n parse: (keepAlive: (() => unknown) | null) => Promise<T>,\n): Promise<T> {\n if (keepAlive === null) {\n return parse(null);\n }\n const interrupted: { by: { error: unknown } | null } = { by: null };\n const tracked = async (): Promise<void> => {\n try {\n await keepAlive();\n } catch (error) {\n interrupted.by = { error };\n throw error;\n }\n };\n let result: T;\n try {\n result = await parse(tracked);\n } catch (error) {\n throw interrupted.by === null ? error : interrupted.by.error;\n }\n if (interrupted.by !== null) {\n throw interrupted.by.error;\n }\n return result;\n}\n\n/**\n * Parse a DMARC aggregate report's XML. Malformed XML is recovered the way\n * parsedmarc does (with the parse error kept in `reportMetadata.errors`).\n * An error thrown by `keepAlive` is rethrown as is.\n */\nexport async function parseAggregateReportXml(\n xml: string | Uint8Array,\n options: ParseAggregateReportOptions = {},\n): Promise<AggregateReport> {\n const config = configFrom(options);\n return withKeepAlive(options.keepAlive ?? null, async keepAlive =>\n parseAggregateXml(xml, config, keepAlive),\n );\n}\n\nasync function parseAggregateXml(\n xml: string | Uint8Array,\n config: ParserConfig,\n keepAlive: (() => unknown) | null,\n): Promise<AggregateReport> {\n let text = typeof xml === 'string' ? xml : decodeUtf8(xml, 'ignore');\n\n // Detect the namespace before any rewriting strips it.\n const xmlNamespace = XML_NAMESPACE.exec(text)?.[1] ?? null;\n\n const errors: string[] = [];\n try {\n getItem(parseXmlToDict(text, xmlLimits(config)), 'feedback');\n } catch (error) {\n if (error instanceof XmlDoctypeFound) {\n throw new InvalidAggregateReport(DOCTYPE_ERROR, { cause: error });\n }\n if (error instanceof XmlLimitError) {\n throw new InvalidAggregateReport(`Invalid XML: ${error.message}`, {\n cause: error,\n });\n }\n errors.push(`Invalid XML: ${errorText(error)}`);\n let hasDoctype = false;\n try {\n // The first parse can fail before Expat reaches a DOCTYPE (e.g. on a\n // malformed XML declaration), so the recovered tree gets the same\n // check; only its root element is parsed again.\n ({ hasDoctype, xml: text } = recoverXml(text));\n } catch {\n // parsedmarc: `except Exception: xml = \"<a/>\"`.\n text = '<a/>';\n }\n if (hasDoctype) {\n throw new InvalidAggregateReport(DOCTYPE_ERROR, { cause: error });\n }\n }\n\n let report: AggregateReport;\n try {\n report = await buildReport(text, xmlNamespace, errors, config, keepAlive);\n } catch (error) {\n if (error instanceof InvalidAggregateReport) {\n throw error;\n }\n if (error instanceof ExpatError || error instanceof XmlLimitError) {\n throw new InvalidAggregateReport(`Invalid XML: ${errorText(error)}`, {\n cause: error,\n });\n }\n if (error instanceof KeyError) {\n throw new InvalidAggregateReport(`Missing field: ${error.message}`, {\n cause: error,\n });\n }\n if (error instanceof PyAttributeError) {\n throw new InvalidAggregateReport('Report missing required section', {\n cause: error,\n });\n }\n throw new InvalidAggregateReport(\n `Unexpected error: ${errorText(error)}${excOrigin(error)}`,\n { cause: error },\n );\n }\n if (nestsDeeperThan(report, MAX_REPORT_DEPTH)) {\n throw new InvalidAggregateReport(\n `Invalid XML: report data nested more than ${MAX_REPORT_DEPTH} levels deep`,\n );\n }\n return report;\n}\n\nexport interface ParseAggregateReportFileOptions\n extends ParserConfigInput, ExtractOptions {\n keepAlive?: (() => unknown) | null;\n}\n\n/**\n * Parse an aggregate report from bytes (zip, gzip or XML) or base64 text\n * (`parse_aggregate_report_file`). Like Python, a string goes to\n * `extractReport()` as base64, or as the XML itself when it is not valid\n * base64; it is never opened as a path (see\n * {@link parseAggregateReportFromFilePath}).\n */\nexport async function parseAggregateReportFile(\n input: string | Uint8Array,\n options: ParseAggregateReportFileOptions = {},\n): Promise<AggregateReport> {\n return parseExtracted(\n async extractOptions => extractReport(input, extractOptions),\n options,\n );\n}\n\n/**\n * Parse an aggregate report file from disk (`extract_report_from_file_path`\n * followed by `parse_aggregate_report_xml`). parsedmarc's\n * `parse_aggregate_report_file()` documents a path argument but treats a\n * string as report content; this is the path form.\n */\nexport async function parseAggregateReportFromFilePath(\n filePath: string,\n options: ParseAggregateReportFileOptions = {},\n): Promise<AggregateReport> {\n return parseExtracted(\n extractOptions => extractReportFromFilePath(filePath, extractOptions),\n options,\n );\n}\n\nasync function parseExtracted(\n extract: (options: ExtractOptions) => Promise<string>,\n options: ParseAggregateReportFileOptions,\n): Promise<AggregateReport> {\n const { keepAlive, maxDecompressedSize, ...configOptions } = options;\n const config = resolveParserConfig(configOptions);\n let xml: string;\n try {\n xml = await extract({ maxDecompressedSize });\n } catch (error) {\n throw new InvalidAggregateReport(errorText(error) + excOrigin(error), {\n cause: error,\n });\n }\n return parseAggregateReportXml(xml, { config, keepAlive: keepAlive ?? null });\n}\n\n/** Fields of `parsedAggregateReportsToCsv()`, in column order. */\nexport const AGGREGATE_CSV_FIELDS: readonly string[] = [\n 'xml_schema',\n 'org_name',\n 'org_email',\n 'org_extra_contact_info',\n 'report_id',\n 'begin_date',\n 'end_date',\n 'normalized_timespan',\n 'errors',\n 'domain',\n 'adkim',\n 'aspf',\n 'p',\n 'sp',\n 'np',\n 'pct',\n 'fo',\n 'testing',\n 'discovery_method',\n 'source_ip_address',\n 'source_country',\n 'source_reverse_dns',\n 'source_base_domain',\n 'source_name',\n 'source_type',\n 'source_asn',\n 'source_as_name',\n 'source_as_domain',\n 'count',\n 'spf_aligned',\n 'dkim_aligned',\n 'dmarc_aligned',\n 'disposition',\n 'policy_override_reasons',\n 'policy_override_comments',\n 'envelope_from',\n 'header_from',\n 'envelope_to',\n 'dkim_domains',\n 'dkim_selectors',\n 'dkim_results',\n 'spf_domains',\n 'spf_scopes',\n 'spf_results',\n];\n\nconst lowerStr = (value: unknown): string => str(value).toLowerCase();\n/**\n * A `<reason>` field for a CSV row: `value or \"none\"`, as text. `<reason>`\n * stays the reporter's raw data, so `<type>` can be missing or carry\n * attributes and `<comment>` can repeat. parsedmarc raises KeyError or\n * TypeError there, after the report was accepted, and loses the batch.\n */\nfunction reasonText(reason: unknown, field: string): string {\n const value = unwrapText(getOptional(reason, field));\n if (!pyTruthy(value)) {\n return 'none';\n }\n return Array.isArray(value) ? pyRepr(value) : str(value);\n}\n\n/** Keep only values Python's CSV rows keep (str, int, bool); others become \"\". */\nfunction csvValue(value: unknown): unknown {\n if (\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n (typeof value === 'number' && Number.isInteger(value))\n ) {\n return value;\n }\n return '';\n}\n\n/**\n * Flatten aggregate reports into CSV rows (snake_case keys), one per\n * record (`parsed_aggregate_reports_to_csv_rows`).\n */\nexport function parsedAggregateReportsToCsvRows(\n reports: AggregateReport | AggregateReport[],\n): CsvRow[] {\n const reportList = Array.isArray(reports) ? reports : [reports];\n const rows: CsvRow[] = [];\n for (const report of reportList) {\n const metadata = report.reportMetadata;\n const policy = report.policyPublished;\n const reportFields: CsvRow = {\n xml_schema: report.xmlSchema,\n org_name: metadata.orgName,\n org_email: metadata.orgEmail,\n org_extra_contact_info: metadata.orgExtraContactInfo,\n report_id: metadata.reportId,\n begin_date: metadata.beginDate,\n end_date: metadata.endDate,\n normalized_timespan: metadata.timespanRequiresNormalization,\n errors: pyStrJoin('|', metadata.errors),\n domain: policy.domain,\n adkim: policy.adkim,\n aspf: policy.aspf,\n p: policy.p,\n sp: policy.sp,\n np: policy.np ?? null,\n pct: policy.pct,\n fo: policy.fo,\n testing: policy.testing ?? null,\n discovery_method: policy.discoveryMethod ?? null,\n };\n for (const record of report.records) {\n const reasons = record.policyEvaluated.policyOverrideReasons;\n rows.push({\n ...reportFields,\n begin_date: record.intervalBegin,\n end_date: record.intervalEnd,\n source_ip_address: record.source.ipAddress,\n source_country: record.source.country,\n source_reverse_dns: record.source.reverseDns,\n source_base_domain: record.source.baseDomain,\n source_name: record.source.name,\n source_type: record.source.type,\n source_asn: record.source.asn,\n source_as_name: record.source.asName,\n source_as_domain: record.source.asDomain,\n count: record.count,\n spf_aligned: record.alignment.spf,\n dkim_aligned: record.alignment.dkim,\n dmarc_aligned: record.alignment.dmarc,\n disposition: record.policyEvaluated.disposition,\n policy_override_reasons: reasons\n .map(r => reasonText(r, 'type'))\n .join(','),\n policy_override_comments: reasons\n .map(r => reasonText(r, 'comment'))\n .join('|'),\n envelope_from: record.identifiers.envelopeFrom,\n header_from: record.identifiers.headerFrom,\n envelope_to: record.identifiers.envelopeTo,\n dkim_domains: record.authResults.dkim\n .map(r => lowerStr(r.domain))\n .join(','),\n dkim_selectors: record.authResults.dkim\n .filter(r => 'selector' in r)\n .map(r => lowerStr(r.selector))\n .join(','),\n dkim_results: record.authResults.dkim\n .map(r => lowerStr(r.result))\n .join(','),\n spf_domains: record.authResults.spf\n .map(r => lowerStr(r.domain))\n .join(','),\n spf_scopes: record.authResults.spf\n .map(r => lowerStr(r.scope))\n .join(','),\n spf_results: record.authResults.spf\n .map(r => lowerStr(r.result))\n .join(','),\n });\n }\n }\n return rows.map(row =>\n Object.fromEntries(\n Object.entries(row).map(([key, value]) => [key, csvValue(value)]),\n ),\n );\n}\n\n/** Aggregate reports as flat CSV, with headers. */\nexport function parsedAggregateReportsToCsv(\n reports: AggregateReport | AggregateReport[],\n options: CsvOptions = {},\n): string {\n const rows = parsedAggregateReportsToCsvRows(reports).map(row =>\n Object.fromEntries(\n Object.entries(row).map(([key, value]) => [key, csvSafe(value)]),\n ),\n );\n return rowsToCsv(AGGREGATE_CSV_FIELDS, rows, options);\n}\n","// Port of Python's `email.feedparser.FeedParser` (compat32), as used by\n// `email.message_from_string()`.\n//\n// Python feeds the text in chunks and suspends on incomplete lines; with\n// the whole text available up front the result is the same, so this port\n// reads lines from the text on demand and parses synchronously.\n\nimport { DEFAULT_EMAIL_LIMITS, type EmailLimits } from '../../config';\nimport { EmailTooLargeError } from '../../errors';\nimport { pyLStrip } from '../py-str';\nimport {\n CloseBoundaryNotFoundDefect,\n FirstHeaderLineIsContinuationDefect,\n InvalidHeaderDefect,\n InvalidMultipartContentTransferEncodingDefect,\n MisplacedEnvelopeHeaderDefect,\n MissingHeaderBodySeparatorDefect,\n MultipartInvariantViolationDefect,\n NoBoundaryInMultipartDefect,\n RecursionError,\n StartBoundaryNotFoundDefect,\n} from './errors';\nimport { Message } from './message';\n\nconst HEADER_LINE = /^(?:From |[!-9;-~]*:|[\\t ])/u;\nconst NL_START = /^(?:\\r\\n|\\r|\\n)/u;\nconst NL_END = /(?:\\r\\n|\\r|\\n)$/u;\nconst BOUNDARY_END = /(--)?[ \\t]*(\\r\\n|\\r|\\n)?$/uy;\n\n/**\n * Nesting levels `email.message_from_string()` parses when called from a\n * module's top level: CPython's default recursion limit (1000) leaves room\n * for 987 nested `_parsegen` generators before it raises `RecursionError`.\n */\nexport const MESSAGE_FROM_STRING_MAX_NESTING = 987;\n\n/**\n * An EOF matcher of `BufferedSubFile`: a multipart boundary (Python's\n * `boundaryre.match`) or a blank line (`NLCRE.match`, delivery-status).\n */\ntype EofMatcher =\n | { readonly kind: 'boundary'; readonly separator: string }\n | { readonly kind: 'blank' };\n\nconst CR = 0x0d;\nconst LF = 0x0a;\nconst DASH = 0x2d;\nconst SPACE = 0x20;\nconst TAB = 0x09;\n\n/** `line` without its line ending and the spaces/tabs before it. */\nfunction boundaryCandidate(line: string): string {\n let end = line.length;\n if (end > 0 && line.charCodeAt(end - 1) === LF) {\n end -= 1;\n }\n if (end > 0 && line.charCodeAt(end - 1) === CR) {\n end -= 1;\n }\n while (end > 0) {\n const code = line.charCodeAt(end - 1);\n if (code !== SPACE && code !== TAB) {\n break;\n }\n end -= 1;\n }\n return line.slice(0, end);\n}\n\n/** `email.feedparser.BufferedSubFile`, already closed. */\nclass LineBuffer {\n private readonly text: string;\n private position = 0;\n // Lines given back by `unreadline()`, or stopped at by an EOF matcher. No\n // array of all the lines: the parser's limits have to stop a hostile\n // message before it costs one string per line.\n private readonly unread: string[] = [];\n private readonly eofStack: EofMatcher[] = [];\n // Python tries every matcher on the stack for each line, which is\n // quadratic in the nesting depth; any match means EOF, so counting the\n // active separators answers the same question with one lookup.\n private readonly separators = new Map<string, number>();\n private blankMatchers = 0;\n\n constructor(text: string) {\n this.text = text;\n }\n\n /** Where the line starting at `start` ends, past its line ending. */\n private lineEnd(start: number): number {\n const { text } = this;\n for (let index = start; index < text.length; index += 1) {\n const code = text.charCodeAt(index);\n if (code === LF) {\n return index + 1;\n }\n if (code === CR) {\n return text.charCodeAt(index + 1) === LF ? index + 2 : index + 1;\n }\n }\n return text.length;\n }\n\n pushEofMatcher(matcher: EofMatcher): void {\n this.eofStack.push(matcher);\n if (matcher.kind === 'blank') {\n this.blankMatchers += 1;\n } else {\n const { separator } = matcher;\n this.separators.set(separator, (this.separators.get(separator) ?? 0) + 1);\n }\n }\n\n popEofMatcher(): void {\n const matcher = this.eofStack.pop();\n if (matcher === undefined) {\n return;\n }\n if (matcher.kind === 'blank') {\n this.blankMatchers -= 1;\n return;\n }\n const count = (this.separators.get(matcher.separator) ?? 0) - 1;\n if (count > 0) {\n this.separators.set(matcher.separator, count);\n } else {\n this.separators.delete(matcher.separator);\n }\n }\n\n /**\n * Whether any EOF matcher on the stack matches `line`. A boundary line is\n * the separator, an optional `--`, then optional spaces/tabs and a line\n * ending, so stripping those leaves either the separator or the separator\n * plus `--`.\n */\n private atEof(line: string): boolean {\n const first = line.charCodeAt(0);\n if (first === CR || first === LF) {\n return this.blankMatchers > 0;\n }\n if (this.separators.size === 0 || !line.startsWith('--')) {\n return false;\n }\n const candidate = boundaryCandidate(line);\n return (\n this.separators.has(candidate) ||\n (candidate.endsWith('--') && this.separators.has(candidate.slice(0, -2)))\n );\n }\n\n /** The next line, or `''` at (real or matcher-induced) EOF. */\n readline(): string {\n const pending = this.unread.at(-1);\n if (pending !== undefined) {\n if (this.atEof(pending)) {\n return '';\n }\n this.unread.pop();\n return pending;\n }\n if (this.position >= this.text.length) {\n return '';\n }\n const end = this.lineEnd(this.position);\n const line = this.text.slice(this.position, end);\n this.position = end;\n if (this.atEof(line)) {\n this.unread.push(line);\n return '';\n }\n return line;\n }\n\n unreadline(line: string): void {\n this.unread.push(line);\n }\n\n /**\n * `''.join(self._input)`: the text up to EOF. Lines that can't be at an\n * EOF matcher are stepped over without making a string of each.\n */\n readToEof(): string {\n let head = '';\n while (this.unread.length > 0) {\n const line = this.readline();\n if (line === '') {\n return head;\n }\n head += line;\n }\n const { text } = this;\n const start = this.position;\n const blankEnds = this.blankMatchers > 0;\n const boundaryEnds = this.separators.size > 0;\n if (!blankEnds && !boundaryEnds) {\n this.position = text.length;\n return head + text.slice(start);\n }\n while (this.position < text.length) {\n const first = text.charCodeAt(this.position);\n if (blankEnds && (first === CR || first === LF)) {\n break;\n }\n const end = this.lineEnd(this.position);\n if (\n boundaryEnds &&\n first === DASH &&\n this.atEof(text.slice(this.position, end))\n ) {\n break;\n }\n this.position = end;\n }\n return head + text.slice(start, this.position);\n }\n\n /**\n * `for line in self._input`: lines until EOF.\n * @yields {string} Each line, with its line ending.\n */\n *[Symbol.iterator](): Generator<string> {\n for (;;) {\n const line = this.readline();\n if (line === '') {\n return;\n }\n yield line;\n }\n }\n}\n\n// compat32 `header_source_parse()`.\nfunction headerSourceParse(lines: readonly string[]): [string, string] {\n const first = lines[0] ?? '';\n const colon = first.indexOf(':');\n const name = first.slice(0, colon);\n const value = pyLStrip(\n [first.slice(colon + 1), ...lines.slice(1)].join(''),\n ' \\t\\r\\n',\n );\n // `value.rstrip('\\r\\n')`, without the quadratic `/[\\r\\n]+$/` search.\n let end = value.length;\n while (end > 0 && '\\r\\n'.includes(value.charAt(end - 1))) {\n end -= 1;\n }\n return [name, value.slice(0, end)];\n}\n\nclass FeedParser {\n private readonly input: LineBuffer;\n private readonly msgstack: Message[] = [];\n private cur: Message | null = null;\n private last: Message | null = null;\n // Python asks each parent for its content type once per child, which scans\n // the parent's headers every time: K headers and N children cost K*N.\n // Headers are complete before the first child exists, so the answer is\n // kept instead.\n private readonly digests = new Set<Message>();\n private readonly maxNesting: number;\n private readonly limits: EmailLimits;\n private parts = 0;\n private headerLines = 0;\n\n constructor(text: string, maxNesting: number, limits: EmailLimits) {\n this.input = new LineBuffer(text);\n this.maxNesting = maxNesting;\n this.limits = limits;\n }\n\n parse(): Message {\n this.parsegen();\n const root = this.popMessage();\n if (root.getContentMaintype() === 'multipart' && !root.isMultipart()) {\n root.defects.push(new MultipartInvariantViolationDefect());\n }\n return root;\n }\n\n private current(): Message {\n if (this.cur === null) {\n throw new Error('no current message');\n }\n return this.cur;\n }\n\n private lastMessage(): Message {\n if (this.last === null) {\n throw new Error('no last message');\n }\n return this.last;\n }\n\n private newMessage(): void {\n const { maxMimeParts } = this.limits;\n this.parts += 1;\n if (maxMimeParts > 0 && this.parts > maxMimeParts) {\n throw new EmailTooLargeError(\n `Email has more than ${maxMimeParts} MIME parts (max_mime_parts)`,\n );\n }\n const message = new Message();\n if (this.cur !== null && this.digests.has(this.cur)) {\n message.setDefaultType('message/rfc822');\n }\n this.msgstack.at(-1)?.attach(message);\n this.msgstack.push(message);\n this.cur = message;\n this.last = message;\n }\n\n private popMessage(): Message {\n const message = this.msgstack.pop();\n if (message === undefined) {\n throw new Error('message stack is empty');\n }\n this.cur = this.msgstack.at(-1) ?? null;\n return message;\n }\n\n private parsegen(): void {\n // Each nesting level is one more `_parsegen` generator in Python, which\n // raises RecursionError past the interpreter's recursion limit. The\n // ancestors on the stack are this message's nesting level.\n if (this.msgstack.length > this.maxNesting) {\n throw new RecursionError();\n }\n this.newMessage();\n const headers: string[] = [];\n for (const line of this.input) {\n if (!HEADER_LINE.test(line)) {\n if (!NL_START.test(line)) {\n this.current().defects.push(new MissingHeaderBodySeparatorDefect());\n this.input.unreadline(line);\n }\n break;\n }\n this.countHeaderLine();\n headers.push(line);\n }\n this.parseHeaders(headers);\n const cur = this.current();\n const contentType = cur.getContentType();\n if (contentType === 'multipart/digest') {\n this.digests.add(cur);\n }\n if (contentType === 'message/delivery-status') {\n this.parseDeliveryStatus();\n return;\n }\n if (cur.getContentMaintype() === 'message') {\n this.parsegen();\n this.popMessage();\n return;\n }\n if (cur.getContentMaintype() === 'multipart') {\n this.parseMultipart(cur);\n return;\n }\n cur.setPayload(this.input.readToEof());\n }\n\n private countHeaderLine(): void {\n const { maxHeaderLines } = this.limits;\n this.headerLines += 1;\n if (maxHeaderLines > 0 && this.headerLines > maxHeaderLines) {\n throw new EmailTooLargeError(\n `Email has more than ${maxHeaderLines} header lines (max_header_lines)`,\n );\n }\n }\n\n private parseDeliveryStatus(): void {\n for (;;) {\n this.input.pushEofMatcher({ kind: 'blank' });\n this.parsegen();\n this.popMessage();\n this.input.popEofMatcher();\n // The blank line that ended the block, then the next one.\n this.input.readline();\n const line = this.input.readline();\n if (line === '') {\n break;\n }\n this.input.unreadline(line);\n }\n }\n\n private parseMultipart(cur: Message): void {\n const boundary = cur.getBoundary();\n if (boundary === undefined) {\n cur.defects.push(new NoBoundaryInMultipartDefect());\n cur.setPayload(this.input.readToEof());\n return;\n }\n const cte = (cur.get('content-transfer-encoding') ?? '8bit').toLowerCase();\n if (!['7bit', '8bit', 'binary'].includes(cte)) {\n cur.defects.push(new InvalidMultipartContentTransferEncodingDefect());\n }\n const separator = `--${boundary}`;\n const boundaryMatch = (line: string): RegExpExecArray | null => {\n if (!line.startsWith(separator)) {\n return null;\n }\n BOUNDARY_END.lastIndex = separator.length;\n return BOUNDARY_END.exec(line);\n };\n let capturingPreamble = true;\n const preamble: string[] = [];\n let linesep: string | undefined;\n let closeBoundarySeen = false;\n for (;;) {\n let line = this.input.readline();\n if (line === '') {\n break;\n }\n const match = boundaryMatch(line);\n if (match === null) {\n preamble.push(line);\n continue;\n }\n if (match[1] !== undefined) {\n closeBoundarySeen = true;\n linesep = match[2];\n break;\n }\n if (capturingPreamble) {\n if (preamble.length > 0) {\n const lastLine = preamble.at(-1) ?? '';\n preamble[preamble.length - 1] = lastLine.replace(NL_END, '');\n cur.preamble = preamble.join('');\n }\n capturingPreamble = false;\n this.input.unreadline(line);\n continue;\n }\n // Consume consecutive boundary lines (empty parts).\n for (;;) {\n line = this.input.readline();\n if (boundaryMatch(line) === null) {\n this.input.unreadline(line);\n break;\n }\n }\n this.input.pushEofMatcher({ kind: 'boundary', separator });\n this.parsegen();\n const last = this.lastMessage();\n if (last.getContentMaintype() === 'multipart') {\n const { epilogue } = last;\n if (epilogue === '') {\n last.epilogue = null;\n } else if (epilogue !== null) {\n last.epilogue = epilogue.replace(NL_END, '');\n }\n } else if (typeof last.payload === 'string') {\n last.payload = last.payload.replace(NL_END, '');\n }\n this.input.popEofMatcher();\n this.popMessage();\n this.last = this.cur;\n }\n if (capturingPreamble) {\n cur.defects.push(new StartBoundaryNotFoundDefect());\n cur.setPayload(preamble.join(''));\n // Python drains the rest of the input without keeping it.\n this.input.readToEof();\n cur.epilogue = '';\n return;\n }\n if (!closeBoundarySeen) {\n cur.defects.push(new CloseBoundaryNotFoundDefect());\n return;\n }\n const epilogue = this.input.readToEof();\n // Without a line ending after the close boundary, the rest starts on its\n // own first line, and a leading line ending of that one is dropped.\n cur.epilogue = linesep ? epilogue : epilogue.replace(NL_START, '');\n }\n\n private parseHeaders(lines: readonly string[]): void {\n let lastHeader = '';\n let lastValue: string[] = [];\n const cur = this.current();\n for (const [lineno, line] of lines.entries()) {\n if (line.startsWith(' ') || line.startsWith('\\t')) {\n if (!lastHeader) {\n cur.defects.push(new FirstHeaderLineIsContinuationDefect(line));\n continue;\n }\n lastValue.push(line);\n continue;\n }\n if (lastHeader) {\n cur.setRaw(...headerSourceParse(lastValue));\n lastHeader = '';\n lastValue = [];\n }\n if (line.startsWith('From ')) {\n if (lineno === 0) {\n cur.unixfrom = line.replace(NL_END, '');\n continue;\n }\n if (lineno === lines.length - 1) {\n this.input.unreadline(line);\n return;\n }\n cur.defects.push(new MisplacedEnvelopeHeaderDefect(line));\n continue;\n }\n const colon = line.indexOf(':');\n if (colon === 0) {\n cur.defects.push(new InvalidHeaderDefect('Missing header name.'));\n continue;\n }\n lastHeader = line.slice(0, colon);\n lastValue = [line];\n }\n if (lastHeader) {\n cur.setRaw(...headerSourceParse(lastValue));\n }\n }\n}\n\n/**\n * `email.message_from_string(text)` with the compat32 policy.\n *\n * Throws {@link RecursionError} for a message nested deeper than\n * `maxNesting` levels (multipart or message/* parts), where CPython runs\n * out of recursion depth; the default is what a top-level call allows.\n * Throws {@link EmailTooLargeError} past `limits` (not in Python).\n */\nexport function messageFromString(\n text: string,\n maxNesting: number = MESSAGE_FROM_STRING_MAX_NESTING,\n limits: EmailLimits = DEFAULT_EMAIL_LIMITS,\n): Message {\n return new FeedParser(text, maxNesting, limits).parse();\n}\n","// Port of mail-parser 4.8.0 `mailparser/addresses.py`: structural address\n// recovery for RFC 5322 / RFC 6532 header values, plus `get_addresses()`.\n//\n// Inputs here are always well-formed strings (the message was decoded from\n// UTF-8 with replacement), so the surrogate checks of the original never\n// fire; they are kept where they are cheap.\n\nimport { LookupError, pyDecode, UnicodeError } from '../py-codecs';\nimport { decodeHeader } from '../py-email/header';\nimport { type AddressPair, getaddresses } from '../py-email/utils';\nimport { PY_WS_CLASS, pyLen, pyStrip } from '../py-str';\n\nconst FOLD = /\\r?\\n[ \\t]+/gu;\nconst ENCODED_WORD = new RegExp(\n `=\\\\?([^?${PY_WS_CLASS}]+)\\\\?([bBqQ])\\\\?([^?${PY_WS_CLASS}]*)\\\\?=`,\n 'uy',\n);\nconst UTF8_NON_ASCII = '\\\\u0080-\\\\ud7ff\\\\ue000-\\\\u{10ffff}';\nconst SURROGATE = /[\\ud800-\\udfff]/u;\nconst ATOM = `[a-zA-Z0-9!#$%&'*+/=?^_\\`{|}~${UTF8_NON_ASCII}-]+`;\nconst QUOTED = '\"(?:[^\"\\\\\\\\\\\\r\\\\n]|\\\\\\\\[^\\\\r\\\\n])*\"';\nconst WORD = `(?:${ATOM}|${QUOTED})`;\nconst LOCAL = `${WORD}(?:[ \\\\t]*\\\\.[ \\\\t]*${WORD})*`;\nconst DOMAIN = `${ATOM}(?:[ \\\\t]*\\\\.[ \\\\t]*${ATOM})*`;\nconst LITERAL = '\\\\[(?:[^\\\\[\\\\]\\\\\\\\\\\\r\\\\n]|\\\\\\\\[^\\\\r\\\\n])*\\\\]';\nconst ADDR_SPEC = new RegExp(\n `^(?:${LOCAL}[ \\\\t]*@[ \\\\t]*(?:${DOMAIN}|${LITERAL}))$`,\n 'u',\n);\nconst FWS_CHARS = ' \\t\\r\\n';\n\n/** A diagnostic of the address scanner. */\nexport interface AddressDiagnostic {\n reason: string;\n raw: string;\n recovered: boolean;\n candidates: { display_name: string; address: string }[];\n header?: string;\n occurrence?: number;\n}\n\ninterface Item {\n raw: string;\n text: string;\n angles: [number, number][];\n problems: string[];\n commentDepth: number;\n}\n\nfunction stripFws(text: string): string {\n return pyStrip(text, FWS_CHARS);\n}\n\n/** `_scan()`: split only at structural delimiters. */\nfunction scan(raw: string): Item[] {\n const items: Item[] = [];\n let buf: string[] = [];\n let angles: [number, number][] = [];\n let problems: string[] = [];\n let start = 0;\n let angle: number | null = null;\n let comment = 0;\n let maxComment = 0;\n let quote = false;\n let literal = false;\n let escaped = false;\n let group = false;\n\n const emit = (end: number): void => {\n const text = buf.join('');\n const rawItem = raw.slice(start, end);\n if (stripFws(text) || problems.length > 0 || SURROGATE.test(rawItem)) {\n items.push({\n raw: rawItem,\n text,\n angles,\n problems,\n commentDepth: maxComment,\n });\n }\n buf = [];\n angles = [];\n problems = [];\n start = end + 1;\n maxComment = 0;\n };\n\n for (let index = 0; index < raw.length; index += 1) {\n const char = raw.charAt(index);\n if (escaped) {\n if (!comment) {\n buf.push(char);\n }\n escaped = false;\n continue;\n }\n if (char === '\\\\' && (quote || comment || literal)) {\n escaped = true;\n if (!comment) {\n buf.push(char);\n }\n continue;\n }\n if (comment) {\n if (char === '(') {\n comment += 1;\n maxComment = Math.max(maxComment, comment);\n } else if (char === ')') {\n comment -= 1;\n }\n continue;\n }\n if (quote) {\n buf.push(char);\n if (char === '\"') {\n quote = false;\n }\n continue;\n }\n if (literal) {\n buf.push(char);\n if (char === ']') {\n literal = false;\n }\n continue;\n }\n if (char === '(') {\n comment = 1;\n maxComment = Math.max(maxComment, 1);\n buf.push(' ');\n } else if (char === '\"') {\n quote = true;\n buf.push(char);\n } else if (char === '[') {\n literal = true;\n buf.push(char);\n } else if (char === '<') {\n if (angle === null) {\n angle = buf.length;\n } else {\n problems.push('nested-angle');\n }\n buf.push(char);\n } else if (char === '>') {\n if (angle === null) {\n problems.push('unmatched-angle');\n } else {\n angles.push([angle, buf.length]);\n angle = null;\n }\n buf.push(char);\n } else if (angle === null && char === ',') {\n emit(index);\n } else if (angle === null && char === ':') {\n if (group || angles.length > 0) {\n problems.push('invalid-group-boundary');\n buf.push(char);\n } else {\n group = true;\n if (\n !validPhrase(buf.join('')) ||\n SURROGATE.test(raw.slice(start, index))\n ) {\n problems.push('invalid-group-name');\n emit(index);\n }\n buf = [];\n start = index + 1;\n }\n } else if (angle === null && char === ';') {\n if (!group) {\n problems.push('unmatched-group');\n }\n emit(index);\n group = false;\n } else {\n if (char === ')' || char === ']') {\n problems.push('unmatched-delimiter');\n }\n buf.push(char);\n }\n }\n if (quote || comment || literal || angle !== null || escaped) {\n problems.push('unclosed-delimiter');\n }\n if (group) {\n problems.push('unclosed-group');\n }\n emit(raw.length);\n return items;\n}\n\n// Character positions in `buf` (one entry per UTF-16 unit pushed) map\n// 1:1 to `text` indices, because every push is a single code unit.\n\n/** `_mailbox()`: validate an addr-spec and strip token-separating FWS. */\nfunction mailbox(input: string): string | null {\n let value = stripFws(input.replace(FOLD, ' '));\n if (SURROGATE.test(value)) {\n return null;\n }\n // RFC 5322 section 4.4: obsolete source routes precede the addr-spec.\n if (value.startsWith('@') || value.startsWith(',')) {\n let literal = false;\n let escaped = false;\n const domains: string[] = [];\n let start = 0;\n let terminated = false;\n for (let index = 0; index < value.length; index += 1) {\n const char = value.charAt(index);\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\' && literal) {\n escaped = true;\n } else if (char === '[') {\n literal = true;\n } else if (char === ']') {\n literal = false;\n } else if (!literal && (char === ',' || char === ':')) {\n const domain = stripFws(value.slice(start, index));\n if (domain) {\n domains.push(domain);\n }\n start = index + 1;\n if (char === ':') {\n terminated = true;\n break;\n }\n }\n }\n if (!terminated) {\n return null;\n }\n if (\n domains.length === 0 ||\n domains.some(\n domain => !domain.startsWith('@') || !ADDR_SPEC.test(`route${domain}`),\n )\n ) {\n return null;\n }\n value = stripFws(value.slice(start));\n }\n if (!ADDR_SPEC.test(value)) {\n return null;\n }\n let normalized = '';\n let quoted = false;\n let literal = false;\n let escaped = false;\n for (const char of value) {\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\' && (quoted || literal)) {\n escaped = true;\n } else if (char === '\"' && !literal) {\n quoted = !quoted;\n } else if (char === '[' && !quoted) {\n literal = true;\n } else if (char === ']' && literal) {\n literal = false;\n }\n if (!(char === ' ' || char === '\\t') || quoted || literal) {\n normalized += char;\n }\n }\n return normalized;\n}\n\n/** `_valid_phrase()`: label specials outside quoted strings. */\nfunction validPhrase(value: string): boolean {\n let quoted = false;\n let escaped = false;\n for (const char of stripFws(value.replace(FOLD, ' '))) {\n if (char.charCodeAt(0) < 32 && char !== '\\t') {\n return false;\n }\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\' && quoted) {\n escaped = true;\n } else if (char === '\"') {\n quoted = !quoted;\n } else if (!quoted && '@<>[]:;,\\\\'.includes(char)) {\n return false;\n }\n }\n return Boolean(stripFws(value)) && !(quoted || escaped);\n}\n\n/** `_name()`: recover a display phrase, unquoting quoted pairs. */\nfunction displayName(value: string): string {\n let result = '';\n let quoted = false;\n let escaped = false;\n for (const char of stripFws(value.replace(FOLD, ' '))) {\n if (escaped) {\n result += char;\n escaped = false;\n } else if (char === '\\\\' && quoted) {\n escaped = true;\n } else if (char === '\"') {\n quoted = !quoted;\n } else {\n result += char;\n }\n }\n return stripFws(result);\n}\n\n/** `_decoded_word()`: decode one RFC 2047 word at `start`. */\nfunction decodedWord(\n value: string,\n start: number,\n comment: boolean,\n problems: Set<string>,\n): [string, number] | null {\n ENCODED_WORD.lastIndex = start;\n const match = ENCODED_WORD.exec(value);\n if (!match) {\n return null;\n }\n const end = start + match[0].length;\n if (\n end < value.length &&\n !(comment ? ' \\t)' : ' \\t').includes(value.charAt(end))\n ) {\n return null;\n }\n if (pyLen(value.slice(start, end)) > 75) {\n problems.add('overlong-encoded-word');\n }\n try {\n const pieces: string[] = [];\n for (const [data, charset] of decodeHeader(match[0])) {\n let text: string;\n if (typeof data === 'string') {\n text = data;\n } else {\n let encoding = (charset ?? 'ascii').split('*')[0] ?? '';\n if (encoding === 'unknown-8bit') {\n encoding = 'utf-8';\n }\n text = pyDecode(data, encoding);\n }\n if (SURROGATE.test(text)) {\n problems.add('invalid-encoded-word');\n return null;\n }\n for (const char of text) {\n if (char.charCodeAt(0) < 32 && char !== '\\t') {\n return null;\n }\n }\n pieces.push(text);\n }\n return [pieces.join(''), end];\n } catch (error) {\n // Python catches LookupError, UnicodeError and ValueError here; the\n // HeaderParseError of a bad base64 word is none of them and propagates.\n if (error instanceof LookupError || error instanceof UnicodeError) {\n return null;\n }\n throw error;\n }\n}\n\n/** `_display_source()`: decode display words into quoted parser input. */\nfunction displaySource(\n input: string,\n phraseStart: boolean,\n problems: Set<string>,\n): string {\n const value = input.replace(FOLD, ' ');\n let phrase = phraseStart;\n let output = '';\n let comment = 0;\n let quoted = false;\n let escaped = false;\n let index = 0;\n while (index < value.length) {\n const char = value.charAt(index);\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\' && (quoted || comment)) {\n escaped = true;\n } else if (comment && char === ')') {\n comment -= 1;\n } else if (!quoted && char === '(') {\n comment += 1;\n } else if (!comment && char === '\"') {\n quoted = !quoted;\n } else if (!quoted && !comment && char === '<') {\n phrase = false;\n } else if (\n !quoted &&\n (comment || phrase) &&\n char === '=' &&\n (index === 0 ||\n (comment ? ' \\t(' : ' \\t').includes(value.charAt(index - 1)))\n ) {\n let word = decodedWord(value, index, comment > 0, problems);\n if (word) {\n const pieces = [word[0]];\n let end = word[1];\n while (end < value.length) {\n let nextStart = end;\n while (\n nextStart < value.length &&\n ' \\t'.includes(value.charAt(nextStart))\n ) {\n nextStart += 1;\n }\n if (nextStart === end) {\n break;\n }\n word = decodedWord(value, nextStart, comment > 0, problems);\n if (!word) {\n break;\n }\n pieces.push(word[0]);\n end = word[1];\n }\n let text = pieces.join('').replaceAll('\\\\', '\\\\\\\\');\n if (comment) {\n text = text.replaceAll('(', '\\\\(').replaceAll(')', '\\\\)');\n } else {\n text = `\"${text.replaceAll('\"', '\\\\\"')}\"`;\n }\n output += text;\n index = end;\n continue;\n }\n }\n output += char;\n index += 1;\n }\n return output;\n}\n\n/** `parse_address_header()`: mailbox pairs and recovery evidence. */\nexport function parseAddressHeader(\n raw: string,\n decodeNames: boolean,\n): [AddressPair[], AddressDiagnostic[]] {\n const results: AddressPair[] = [];\n const diagnostics: AddressDiagnostic[] = [];\n for (const item of scan(raw)) {\n let candidates: AddressPair[] = [];\n const displayProblems = new Set<string>();\n const prefix = item.angles[0] ? item.text.slice(0, item.angles[0][0]) : '';\n const name = displayName(\n decodeNames ? displaySource(prefix, true, displayProblems) : prefix,\n );\n for (const [index, [left, right]] of item.angles.entries()) {\n const address = mailbox(item.text.slice(left + 1, right));\n if (address) {\n candidates.push([index === 0 ? name : '', address]);\n }\n }\n let reason: string | null = null;\n let selected: AddressPair[] = [];\n if (item.problems.length > 0) {\n reason = [...new Set(item.problems)].toSorted().join(',');\n } else if (item.angles.length > 0) {\n const [left, right] = item.angles[0] ?? [0, 0];\n if (item.angles.length !== 1 || stripFws(item.text.slice(right + 1))) {\n reason = 'ambiguous-angle-address';\n } else if (candidates.length === 0) {\n reason = 'invalid-angle-address';\n } else {\n selected = candidates;\n if (\n stripFws(item.text.slice(0, left)) &&\n !validPhrase(item.text.slice(0, left))\n ) {\n reason = 'invalid-display-name';\n }\n }\n } else {\n const address = mailbox(item.text);\n if (address) {\n selected = [['', address]];\n candidates = selected;\n } else {\n reason = 'invalid-or-ambiguous-address';\n }\n }\n const invalidUtf8 = SURROGATE.test(item.raw);\n if (invalidUtf8) {\n reason = 'invalid-utf8';\n }\n if (selected.length > 0 && !invalidUtf8) {\n // Deep comments are stripped before the stdlib's recursive parser.\n let source = item.commentDepth < 16 ? item.raw : item.text;\n if (decodeNames) {\n source = displaySource(source, item.angles.length > 0, displayProblems);\n }\n const parsed = getaddresses([source]);\n const parsedAddresses = parsed\n .filter(([, address]) => address)\n .map(([, address]) => address);\n const selectedAddresses = selected.map(([, address]) => address);\n if (\n parsedAddresses.length === selectedAddresses.length &&\n parsedAddresses.every(\n (address, index) => address === selectedAddresses[index],\n )\n ) {\n selected = parsed.filter(([, address]) => address);\n } else {\n reason ??= 'structural-recovery';\n }\n }\n if (displayProblems.size > 0) {\n reason = [reason, ...[...displayProblems].toSorted()]\n .filter(Boolean)\n .join(',');\n }\n results.push(...selected);\n if (reason) {\n diagnostics.push({\n reason,\n raw: item.raw,\n recovered: selected.length > 0,\n candidates: candidates.map(([displayName_, address]) => ({\n display_name: displayName_,\n address,\n })),\n });\n }\n }\n return [results, diagnostics];\n}\n\n/** mail-parser `get_addresses()` for a header string. */\nexport function getAddresses(\n rawHeader: string | null | undefined,\n defects?: AddressDiagnostic[],\n decodeNames = false,\n): AddressPair[] {\n if (rawHeader === null || rawHeader === undefined) {\n return [];\n }\n if (!stripFws(rawHeader)) {\n return getaddresses([rawHeader]);\n }\n const [parsed, diagnostics] = parseAddressHeader(rawHeader, decodeNames);\n // Not `push(...diagnostics)`: one per address overflows the call stack.\n for (const diagnostic of diagnostics) {\n defects?.push(diagnostic);\n }\n return parsed.length > 0 ? parsed : [['', '']];\n}\n","// Port of mail-parser 4.8.0 `mailparser/dates.py`: RFC 5322 date\n// interpretation with diagnostics.\n\nconst MONTHS = [\n 'jan',\n 'feb',\n 'mar',\n 'apr',\n 'may',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'oct',\n 'nov',\n 'dec',\n] as const;\nconst WEEKDAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] as const;\nconst ZONES: Readonly<Record<string, number>> = {\n UT: 0,\n GMT: 0,\n EST: -300,\n EDT: -240,\n CST: -360,\n CDT: -300,\n MST: -420,\n MDT: -360,\n PST: -480,\n PDT: -420,\n};\n\n// `re.I | re.ASCII`: JavaScript's `i` without `u` folds ASCII only.\n// oxlint-disable-next-line require-unicode-regexp -- `u` would fold ſ/K into s/k.\nconst DATE = new RegExp(\n `^(?:(mon|tue|wed|thu|fri|sat|sun) *, *)?([0-9]{1,2}) *(${MONTHS.join('|')}) *([0-9]{2,}) *([0-9]{2}) *: *([0-9]{2})(?: *: *([0-9]{2}))?( *)([+-][0-9]+|[a-z]+)$`,\n 'i',\n);\n\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] as const;\nconst MAX_YEAR = 9999;\nconst MIN_YEAR = 1900;\nconst MS_PER_MINUTE = 60_000;\nconst MS_PER_SECOND = 1000;\n\n/** A UTC instant, as mail-parser's `datetime` with `tzinfo=utc`. */\nexport interface UtcDateTime {\n /** Milliseconds since the epoch. */\n readonly epochMs: number;\n}\n\n/** mail-parser's `DateResult`. */\nexport interface DateResult {\n readonly value: UtcDateTime | null;\n /** Legacy offset string (`\"+1.0\"`), or `0` when there is no value. */\n readonly timezone: string | 0;\n readonly reasons: readonly string[];\n}\n\n/** A diagnostic entry of `date_diagnostics()`. */\nexport interface DateDiagnostic {\n reason: string;\n raw: string;\n recovered: boolean;\n value: string | null;\n header: string;\n occurrence: number;\n}\n\nconst EMPTY_RESULT: DateResult = { value: null, timezone: 0, reasons: [] };\n\nfunction failure(reason: string): DateResult {\n return { value: null, timezone: 0, reasons: [reason] };\n}\n\n/** `datetime.isoformat()` of a UTC datetime (`2019-04-30T02:09:09+00:00`). */\nexport function utcIsoformat(value: UtcDateTime): string {\n const date = new Date(value.epochMs);\n const pad = (number: number, width = 2): string =>\n String(number).padStart(width, '0');\n return (\n `${pad(date.getUTCFullYear(), 4)}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}` +\n `T${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}:${pad(date.getUTCSeconds())}+00:00`\n );\n}\n\n// Replace nested comments and FWS with single spaces (`_date_tokens`).\nfunction dateTokens(raw: string): string | null {\n const output: string[] = [];\n let depth = 0;\n let escaped = false;\n let gap = false;\n for (const char of raw) {\n if (depth) {\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '(') {\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n }\n continue;\n }\n if (char === '(') {\n depth = 1;\n gap = true;\n } else if (char === ')') {\n return null;\n } else if (' \\t\\r\\n'.includes(char)) {\n gap = true;\n } else {\n if (gap && output.length > 0) {\n output.push(' ');\n }\n gap = false;\n output.push(char);\n }\n }\n return depth ? null : output.join('');\n}\n\n// `f\"{offset / 60:+.1f}\"`, with Python's round-half-even on exact halves.\nfunction formatOffset(offset: number): string {\n const sign = offset < 0 ? '-' : '+';\n const minutes = Math.abs(offset);\n // tenths of an hour = minutes / 6; exact halves happen at minutes % 6 == 3.\n let tenths = Math.floor(minutes / 6);\n const remainder = minutes % 6;\n if (remainder > 3 || (remainder === 3 && tenths % 2 === 1)) {\n tenths += 1;\n }\n return `${sign}${Math.floor(tenths / 10)}.${tenths % 10}`;\n}\n\nfunction isValidDate(year: number, month: number, day: number): boolean {\n if (year < 1 || year > MAX_YEAR || day < 1) {\n return false;\n }\n const leap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n const limit = month === 2 && leap ? 29 : (DAYS_IN_MONTH[month - 1] ?? 0);\n return day <= limit;\n}\n\n/** `parse_mail_date()`. */\nexport function parseMailDate(raw: string | null | undefined): DateResult {\n if (raw === null || raw === undefined) {\n return EMPTY_RESULT;\n }\n const tokens = dateTokens(raw);\n const match = tokens === null ? null : DATE.exec(tokens);\n if (match === null) {\n return failure('invalid-date-syntax');\n }\n const [\n ,\n weekday,\n dayText,\n monthText,\n yearText = '',\n hourText,\n minuteText,\n secondText,\n zoneSpace,\n zoneText = '',\n ] = match;\n const yearDigits = yearText.replace(/^0+/u, '');\n if (yearDigits.length > 4) {\n return failure('date-out-of-range');\n }\n let year = Number(yearDigits || '0');\n if (yearText.length === 2) {\n year += year < 50 ? 2000 : 1900;\n } else if (yearText.length === 3) {\n year += 1900;\n }\n const month =\n MONTHS.indexOf((monthText ?? '').toLowerCase() as (typeof MONTHS)[number]) +\n 1;\n const day = Number(dayText ?? '');\n if (!isValidDate(year, month, day)) {\n return failure('invalid-calendar-date');\n }\n if (year < MIN_YEAR) {\n return failure('invalid-calendar-date');\n }\n const hour = Number(hourText ?? '');\n const minute = Number(minuteText ?? '');\n const second = Number(secondText ?? '0');\n if (hour > 23 || minute > 59 || second > 60) {\n return failure('invalid-time');\n }\n const zone = zoneText.toUpperCase();\n let offset: number;\n if (zone.startsWith('+') || zone.startsWith('-')) {\n if (zone.length !== 5 || Number(zone.slice(-2)) > 59) {\n return failure('invalid-zone');\n }\n if (!zoneSpace) {\n return failure('invalid-date-syntax');\n }\n offset = Number(zone.slice(1, 3)) * 60 + Number(zone.slice(3));\n if (zone.startsWith('-')) {\n offset = -offset;\n }\n } else {\n if (zone === 'J') {\n return failure('invalid-zone');\n }\n offset = ZONES[zone] ?? 0;\n }\n const base = Date.UTC(\n 2000,\n month - 1,\n day,\n hour,\n minute,\n Math.min(second, 59),\n );\n // Date.UTC maps years 0-99 to 1900-1999; set the year explicitly.\n const date = new Date(base);\n date.setUTCFullYear(year, month - 1, day);\n let epochMs = date.getTime() - offset * MS_PER_MINUTE;\n if (second === 60) {\n epochMs += MS_PER_SECOND;\n }\n const resultYear = new Date(epochMs).getUTCFullYear();\n if (resultYear > MAX_YEAR || resultYear < 1) {\n return failure('date-out-of-range');\n }\n const reasons: string[] = [];\n if (weekday) {\n // Python's weekday(): Monday is 0.\n const calendarWeekday = (date.getUTCDay() + 6) % 7;\n if (\n WEEKDAYS.indexOf(weekday.toLowerCase() as (typeof WEEKDAYS)[number]) !==\n calendarWeekday\n ) {\n reasons.push('weekday-mismatch');\n }\n }\n return { value: { epochMs }, timezone: formatOffset(offset), reasons };\n}\n\n/** `date_diagnostics()`. */\nexport function dateDiagnostics(\n result: DateResult,\n raw: string,\n header: string,\n occurrence: number,\n): DateDiagnostic[] {\n return result.reasons.map(reason => ({\n reason,\n raw,\n recovered: result.value !== null,\n value: result.value === null ? null : utcIsoformat(result.value),\n header,\n occurrence,\n }));\n}\n","// Port of the mail-parser 4.8.0 exceptions (`mailparser/exceptions.py`)\n// that the string parser can raise.\n\n/** mail-parser's `MailParserError`: base of its exceptions. */\nexport class MailParserError extends Error {\n override name = 'MailParserError';\n}\n\n/**\n * mail-parser's `MailParserRecursionError`: the message is nested too\n * deeply for Python's `email` parser (a \"multipart bomb\").\n */\nexport class MailParserRecursionError extends MailParserError {\n override name = 'MailParserRecursionError';\n}\n","// Port of mail-parser 4.8.0 Received-header parsing (`received.py` and the\n// `parse_received` / `receiveds_parsing` / `receiveds_format` helpers of\n// `utils.py`).\n\nimport { PY_WS_CLASS, pySplitWhitespace, pyStrip } from '../py-str';\nimport {\n type DateDiagnostic,\n dateDiagnostics,\n parseMailDate,\n type UtcDateTime,\n utcIsoformat,\n} from './dates';\nimport { MailParserError } from './exceptions';\n\n/** mail-parser's `MailParserReceivedParsingError`. */\nexport class MailParserReceivedParsingError extends MailParserError {\n override name = 'MailParserReceivedParsingError';\n}\n\nconst FWS = ' \\t\\r\\n';\nconst KEYWORD =\n /(from|by|via|with|id|for|envelope-from|envelope-sender)(?=[ \\t\\r\\n])/iuy;\nconst SENDGRID_DATE = new RegExp(\n `(\\\\p{Nd}{4}-\\\\p{Nd}{2}-\\\\p{Nd}{2}[${PY_WS_CLASS}]+\\\\p{Nd}{2}:\\\\p{Nd}{2}:\\\\p{Nd}{2}\\\\.\\\\p{Nd}{9}[${PY_WS_CLASS}]+\\\\+0000[${PY_WS_CLASS}]+UTC)[${PY_WS_CLASS}]+m=\\\\+\\\\p{Nd}+\\\\.\\\\p{Nd}+`,\n 'iuy',\n);\nconst DIGIT = /^\\p{Nd}$/u;\nconst ENVELOPE_FROM = /<([^>]+)>/u;\n\n/** A recovery diagnostic of the Received parser. */\nexport interface ReceivedDiagnostic {\n reason: string;\n recovered: boolean;\n raw?: string;\n header?: string;\n occurrence?: number;\n}\n\n/** One parsed Received hop, as mail-parser builds it. */\nexport type ReceivedHop = Record<string, string | number | null>;\n\n// Collapse formatting whitespace outside quoted strings (`_clause_value`).\nfunction clauseValue(value: string): string {\n let output = '';\n let quoted = false;\n let escaped = false;\n let whitespace = false;\n for (const char of pyStrip(value, FWS)) {\n if (FWS.includes(char) && !quoted) {\n whitespace = true;\n continue;\n }\n if (whitespace) {\n output += ' ';\n whitespace = false;\n }\n output += char;\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n quoted = !quoted;\n }\n }\n return output;\n}\n\ntype Boundary = [index: number, start: number, keyword: string];\n\n/** `split_received()`: top-level clauses and the date. */\nexport function splitReceived(\n value: string,\n defects?: ReceivedDiagnostic[],\n): [clauses: [string, string][], date: string | null] {\n let boundaries: Boundary[] = [];\n let comment = 0;\n let quote = false;\n let literal = false;\n let angle = false;\n let escaped = false;\n const separators: number[] = [];\n let sendgrid: RegExpExecArray | null = null;\n for (let index = 0; index < value.length; index += 1) {\n const char = value.charAt(index);\n if (escaped) {\n escaped = false;\n continue;\n }\n if (comment) {\n if (char === '\\\\') {\n escaped = true;\n } else if (char === '(') {\n comment += 1;\n } else if (char === ')') {\n comment -= 1;\n }\n continue;\n }\n if (quote || literal) {\n if (char === '\\\\') {\n escaped = true;\n } else if (quote && char === '\"') {\n quote = false;\n } else if (literal && char === ']') {\n literal = false;\n }\n continue;\n }\n if (char === '(') {\n comment = 1;\n } else if (char === ')') {\n throw new MailParserReceivedParsingError('unexpected-comment-close');\n } else if (char === '\"') {\n quote = true;\n } else if (char === '[') {\n literal = true;\n } else if (char === '<') {\n if (angle) {\n throw new MailParserReceivedParsingError('nested-angle-address');\n }\n angle = true;\n } else if (char === '>') {\n angle = false;\n } else if (!angle) {\n if (char === ';') {\n separators.push(index);\n } else if (\n separators.length === 0 &&\n (index === 0 || `${FWS})`.includes(value.charAt(index - 1)))\n ) {\n KEYWORD.lastIndex = index;\n const match = KEYWORD.exec(value);\n if (match) {\n const keyword = (match[1] ?? '').toLowerCase();\n const matchEnd = index + match[0].length;\n let end = matchEnd;\n while (end < value.length && FWS.includes(value.charAt(end))) {\n end += 1;\n }\n // Keep the MTA TLS annotation \"with cipher\" inside the clause.\n if (\n keyword !== 'with' ||\n !value\n .slice(end, end + 6)\n .toLowerCase()\n .startsWith('cipher')\n ) {\n boundaries.push([index, matchEnd, keyword]);\n }\n } else if (DIGIT.test(char) && sendgrid === null) {\n SENDGRID_DATE.lastIndex = index;\n sendgrid = SENDGRID_DATE.exec(value);\n }\n }\n }\n }\n const unclosed: [boolean, string][] = [\n [comment > 0, 'unclosed-comment'],\n [quote, 'unclosed-quoted-string'],\n [literal, 'unclosed-domain-literal'],\n [angle, 'unclosed-angle-address'],\n ];\n for (const [isUnclosed, reason] of unclosed) {\n if (isUnclosed) {\n throw new MailParserReceivedParsingError(reason);\n }\n }\n let end = value.length;\n let date: string | null = null;\n let extraClause: [string, string] | null = null;\n const [firstSeparator, secondSeparator] = separators;\n if (firstSeparator !== undefined) {\n end = firstSeparator;\n date = pyStrip(value.slice(end + 1), FWS);\n if (secondSeparator !== undefined) {\n // Recover only \"id token; for <recipient>; date\".\n const middle = pyStrip(value.slice(end + 1, secondSeparator), FWS);\n const parts = pySplitWhitespace(middle, 1);\n if (separators.length !== 2 || parts.length !== 2) {\n throw new MailParserReceivedParsingError('ambiguous-date-separators');\n }\n const [first = '', second = ''] = parts;\n if (\n boundaries.length === 0 ||\n boundaries.at(-1)?.[2] !== 'id' ||\n first.toLowerCase() !== 'for' ||\n !second.startsWith('<') ||\n !second.endsWith('>')\n ) {\n throw new MailParserReceivedParsingError('ambiguous-date-separators');\n }\n extraClause = ['for', clauseValue(second)];\n date = pyStrip(value.slice(secondSeparator + 1), FWS);\n defects?.push({ reason: 'misplaced-date-separator', recovered: true });\n }\n } else if (sendgrid !== null) {\n end = sendgrid.index;\n date = sendgrid[1] ?? '';\n const sendgridStart = sendgrid.index;\n boundaries = boundaries.filter(([index]) => index < sendgridStart);\n }\n const clauses: [string, string][] = [];\n for (const [position, [, start, keyword]] of boundaries.entries()) {\n const stop = boundaries[position + 1]?.[0] ?? end;\n clauses.push([keyword, clauseValue(value.slice(start, stop))]);\n }\n if (extraClause !== null) {\n clauses.push(extraClause);\n }\n return [clauses, date];\n}\n\nconst REGEX_SPECIAL = /[.*+?^${}()|[\\]\\\\]/gu;\n\n/**\n * The text up to its last `>`. A `<([^>]+)>` match ends at or before it,\n * so searching this prefix finds the same match; it keeps a backtracking\n * engine linear, since a `<` can no longer scan to the end and fail.\n */\nfunction upToLastAngle(text: string): string {\n return text.slice(0, text.lastIndexOf('>') + 1);\n}\n\n/** `parse_received()`. */\nexport function parseReceived(\n received: string,\n defects?: ReceivedDiagnostic[],\n): Map<string, string> {\n const values = new Map<string, string>();\n const [clauses, date] = splitReceived(received, defects);\n if (date !== null) {\n values.set('date', date);\n }\n for (const [keyword, value] of clauses) {\n if (keyword === 'envelope-from' || keyword === 'envelope-sender') {\n const match = ENVELOPE_FROM.exec(upToLastAngle(value));\n if (match) {\n values.set(keyword.replace('-', '_'), match[1] ?? '');\n }\n } else if (keyword === 'from') {\n if (!values.has('from')) {\n values.set(keyword, value);\n }\n } else {\n values.set(keyword, value);\n }\n }\n // Some MTAs put envelope-from inside a comment of another clause.\n for (const clauseKey of ['by', 'from', 'with']) {\n const clauseVal = values.get(clauseKey) ?? '';\n for (const [envKey, envName] of [\n ['envelope_from', 'envelope-from'],\n ['envelope_sender', 'envelope-sender'],\n ] as const) {\n if (!values.has(envKey) && clauseVal.toLowerCase().includes(envName)) {\n const pattern = new RegExp(\n `${envName.replace(REGEX_SPECIAL, '\\\\$&')}[${PY_WS_CLASS}]+<([^>]+)>`,\n 'iu',\n );\n const match = pattern.exec(upToLastAngle(clauseVal));\n if (match) {\n values.set(envKey, match[1] ?? '');\n }\n }\n }\n }\n if (values.size === 0) {\n throw new MailParserReceivedParsingError(\n `Unable to match any clauses in ${received}`,\n );\n }\n return values;\n}\n\ninterface ParsedHop {\n values: Map<string, string>;\n}\n\n/** `receiveds_parsing()` followed by `receiveds_format()`. */\nexport function receivedsParsing(\n receiveds: readonly string[],\n defects?: ReceivedDiagnostic[],\n dateDefects?: DateDiagnostic[],\n): ReceivedHop[] {\n const parsed: ParsedHop[] = [];\n for (const [index, received] of receiveds.entries()) {\n const diagnostics: ReceivedDiagnostic[] = [];\n try {\n parsed.push({ values: parseReceived(received, diagnostics) });\n } catch (error) {\n if (!(error instanceof MailParserReceivedParsingError)) {\n throw error;\n }\n parsed.push({ values: new Map([['raw', received]]) });\n if (!error.message.startsWith('Unable to match any clauses')) {\n diagnostics.push({ reason: error.message, recovered: false });\n }\n }\n if (defects !== undefined) {\n for (const defect of diagnostics) {\n defect.raw = received;\n defect.header = 'received';\n defect.occurrence = index;\n defects.push(defect);\n }\n }\n }\n return receivedsFormat(parsed, receiveds, dateDefects);\n}\n\nfunction receivedsFormat(\n receiveds: readonly ParsedHop[],\n rawHeaders: readonly string[],\n dateDefects?: DateDiagnostic[],\n): ReceivedHop[] {\n const output: Record<string, string | number | null>[] = [];\n const utcValues: (UtcDateTime | null | undefined)[] = [];\n let hop = 0;\n for (\n let occurrence = receiveds.length - 1;\n occurrence >= 0;\n occurrence -= 1\n ) {\n const { values } = receiveds[occurrence] ?? { values: new Map() };\n const entry: Record<string, string | number | null> = {};\n for (const [key, value] of values) {\n if (value) {\n entry[key] = key === 'raw' ? value : pyStrip(value);\n }\n }\n entry.hop = hop + 1;\n let now: UtcDateTime | null | undefined;\n const date = values.get('date');\n if (date !== undefined) {\n const result = parseMailDate(date);\n now = result.value;\n entry.date_utc = null;\n dateDefects?.push(\n ...dateDiagnostics(\n result,\n rawHeaders[occurrence] ?? date,\n 'received',\n occurrence,\n ),\n );\n }\n if (output.length > 0 && now) {\n const before = utcValues[hop - 1];\n entry.delay = before ? (now.epochMs - before.epochMs) / 1000 : 0;\n } else {\n entry.delay = 0;\n }\n if (now) {\n entry.date_utc = utcIsoformat(now);\n }\n output.push(entry);\n utcValues.push(now);\n hop += 1;\n }\n return output;\n}\n","// Port of mail-parser 4.8.0 (`mailparser/core.py` and the helpers of\n// `mailparser/utils.py` it uses) for `parse_from_string()`.\n//\n// The output mirrors `json.loads(parser.mail_json)` and\n// `json.loads(parser.headers_json)`: plain objects with mail-parser's own\n// (snake_case / header-name) keys, address tuples as two-item arrays and\n// datetimes as ISO strings. Python builds `mail` by iterating a `set`, so\n// its key order (and the order of `to_domains` and `defects_categories`)\n// varies between runs; here it is deterministic.\n\nimport { randomInt } from 'node:crypto';\n\nimport { DEFAULT_EMAIL_LIMITS, type EmailLimits } from '../../config';\nimport { getLogger } from '../../log';\nimport { b64encode } from '../py-binascii';\nimport { LookupError, pyDecode, UnicodeError } from '../py-codecs';\nimport { HeaderParseError, RecursionError } from '../py-email/errors';\nimport { FlattenCache } from '../py-email/generator';\nimport { decodeHeader } from '../py-email/header';\nimport { Message } from '../py-email/message';\nimport { messageFromString } from '../py-email/parser';\nimport type { AddressPair } from '../py-email/utils';\nimport { pyRepr, pyStrip } from '../py-str';\nimport { type AddressDiagnostic, getAddresses } from './addresses';\nimport {\n type DateDiagnostic,\n dateDiagnostics,\n parseMailDate,\n type UtcDateTime,\n utcIsoformat,\n} from './dates';\nimport { MailParserRecursionError } from './exceptions';\nimport {\n type ReceivedDiagnostic,\n type ReceivedHop,\n receivedsParsing,\n} from './received';\n\nconst log = getLogger('mailparser');\n\n/** Address headers mail-parser parses into `(name, address)` pairs. */\nexport const ADDRESSES_HEADERS: readonly string[] = [\n 'bcc',\n 'cc',\n 'delivered-to',\n 'from',\n 'reply-to',\n 'to',\n];\nconst ADDRESS_HEADER_SET: ReadonlySet<string> = new Set(ADDRESSES_HEADERS);\n\nconst OTHERS_PARTS: readonly string[] = [\n 'attachments',\n 'body',\n 'date',\n 'message-id',\n 'received',\n 'subject',\n 'timezone',\n 'to_domains',\n 'user-agent',\n 'x-mailer',\n 'x-original-to',\n];\n\nconst COMPUTED_PARTS: ReadonlySet<string> = new Set([\n 'attachments',\n 'body',\n 'date',\n 'received',\n 'timezone',\n 'to_domains',\n]);\n\nconst RESERVED_MAIL_KEYS: ReadonlySet<string> = new Set([\n 'defects',\n 'defects_categories',\n 'has_defects',\n 'address_header_defects',\n 'received_header_defects',\n 'date_header_defects',\n]);\n\nconst EPILOGUE_DEFECT = 'StartBoundaryNotFoundDefect';\nconst BODY_SEPARATOR = '\\n--- mail_boundary ---\\n';\nconst MIME_VIEW_HEADERS: ReadonlySet<string> = new Set([\n 'content-type',\n 'content-disposition',\n 'content-id',\n 'content-transfer-encoding',\n]);\n\n/** One attachment as mail-parser reports it. */\nexport interface MailParserAttachment {\n filename: string;\n safe_filename: string | null;\n payload: string;\n binary: boolean;\n mail_content_type: string;\n 'content-id': string;\n 'content-disposition': string;\n charset: string | null;\n content_transfer_encoding: string;\n}\n\n/** A header value: decoded text, several of them, or address pairs. */\nexport type HeaderValue = string | string[] | [string, string][];\n\n/**\n * A longer run of consecutive combining marks is left alone by {@link nfc}.\n * ICU reorders marks with an insertion sort: 80,000 marks take 26 s, and at\n * this length a whole email stays linear. No language needs a run this long.\n * The lookbehind only starts matching where a run starts.\n */\nconst LONG_MARK_RUN = /(?<!\\p{M})\\p{M}{129}/u;\n\n/** `normalize(\"NFC\", text)`, except for {@link LONG_MARK_RUN} (Python's sort is linear). */\nfunction nfc(text: string): string {\n return LONG_MARK_RUN.test(text) ? text : text.normalize('NFC');\n}\n\n/** `ported_string()` for text: NFC-normalized, `''` for missing values. */\nfunction portedString(value: string | null | undefined): string {\n return value ? nfc(value) : '';\n}\n\n/** `ported_string(raw_bytes, encoding, \"ignore\")`. */\nfunction portedBytes(raw: Uint8Array, encoding: string): string {\n if (raw.length === 0) {\n return '';\n }\n let text: string;\n try {\n text = pyDecode(raw, encoding);\n } catch (error) {\n if (!(error instanceof LookupError || error instanceof UnicodeError)) {\n throw error;\n }\n text = pyDecode(raw, 'utf-8', 'ignore');\n }\n return nfc(text);\n}\n\n/** mail-parser `decode_header_part()`. */\nexport function decodeHeaderPart(header: string | null | undefined): string {\n if (!header) {\n return '';\n }\n let output = '';\n try {\n for (const [data, charset] of decodeHeader(header)) {\n output +=\n typeof data === 'string'\n ? portedString(data)\n : portedBytes(data, charset || 'utf-8');\n }\n } catch (error) {\n if (!(error instanceof HeaderParseError || error instanceof UnicodeError)) {\n throw error;\n }\n log.error(`Failed decoding header part: ${header}`);\n output += header;\n }\n return pyStrip(output);\n}\n\n/** mail-parser `decode_headers()`. */\nfunction decodeHeaders(\n values: readonly string[] | undefined,\n): string | string[] {\n if (values === undefined || values.length === 0) {\n return '';\n }\n const decoded = values.map(value => decodeHeaderPart(value));\n if (decoded.length === 1) {\n return pyStrip(decoded[0] ?? '');\n }\n return decoded;\n}\n\n/** `find_between()`, including its `AttributeError` on `None`. */\nfunction findBetween(\n text: string | null,\n first: string,\n last: string,\n): string | null {\n if (text === null) {\n throw new TypeError(\"'NoneType' object has no attribute 'index'\");\n }\n const firstIndex = text.indexOf(first);\n if (firstIndex === -1) {\n return null;\n }\n const start = firstIndex + first.length;\n const end = text.indexOf(last, start);\n if (end === -1) {\n return null;\n }\n return pyStrip(text.slice(start, end));\n}\n\nconst LOWERCASE = 'abcdefghijklmnopqrstuvwxyz';\n\n/** `random_string()`: ten random lowercase letters. */\nfunction randomString(length = 10): string {\n let output = '';\n for (let index = 0; index < length; index += 1) {\n output += LOWERCASE.charAt(randomInt(LOWERCASE.length));\n }\n return output;\n}\n\nconst COMPOUND_EXTENSIONS = [\n '.tar.bz2',\n '.tar.gz',\n '.tar.lz',\n '.tar.lzma',\n '.tar.xz',\n '.tar.z',\n '.tar.zst',\n] as const;\nconst MAX_FILENAME_BYTES = 240;\n\nfunction utf8Length(text: string): number {\n return Buffer.byteLength(text, 'utf8');\n}\n\n// `os.path.splitext()` (POSIX): leading dots do not start an extension.\nfunction splitext(filename: string): [string, string] {\n const dot = filename.lastIndexOf('.');\n if (dot <= 0) {\n return [filename, ''];\n }\n let leading = 0;\n while (filename.charAt(leading) === '.') {\n leading += 1;\n }\n if (dot < leading) {\n return [filename, ''];\n }\n return [filename.slice(0, dot), filename.slice(dot)];\n}\n\nfunction splitAttachmentExtension(filename: string): [string, string] {\n const lower = filename.toLowerCase();\n for (const extension of COMPOUND_EXTENSIONS) {\n if (lower.endsWith(extension) && filename.length > extension.length) {\n return [\n filename.slice(0, -extension.length),\n filename.slice(-extension.length),\n ];\n }\n }\n return splitext(filename);\n}\n\nfunction clampToBudget(text: string, budget: number): string {\n let output = '';\n let used = 0;\n for (const char of text) {\n const size = utf8Length(char);\n if (used + size > Math.max(0, budget)) {\n break;\n }\n output += char;\n used += size;\n }\n return output;\n}\n\n/** `_safe_attachment_filename()`; `null` where Python raises ValueError. */\nexport function safeAttachmentFilename(filename: string): string | null {\n if (filename.includes('\\u0000')) {\n return null;\n }\n const normalized = filename.replaceAll('\\\\', '/');\n const basename = normalized.slice(normalized.lastIndexOf('/') + 1);\n if (basename === '' || basename === '.' || basename === '..') {\n return null;\n }\n if (utf8Length(basename) <= MAX_FILENAME_BYTES) {\n return basename;\n }\n let [root, extension] = splitAttachmentExtension(basename);\n if (utf8Length(extension) > MAX_FILENAME_BYTES / 2) {\n root = basename;\n extension = '';\n }\n return (\n clampToBudget(root, MAX_FILENAME_BYTES - utf8Length(extension)) + extension\n );\n}\n\n/** `mime_header_view()`: a header-only view of the MIME metadata. */\nfunction mimeHeaderView(part: Message): Message {\n const view = new Message();\n view.setDefaultType(part.getDefaultType());\n for (const [name, value] of part.rawItems()) {\n if (MIME_VIEW_HEADERS.has(name.toLowerCase())) {\n view.set(name, value);\n }\n }\n return view;\n}\n\ntype DefectEntry = Record<string, string[]>;\n\n/**\n * Nesting levels `mailparser.parse_from_string()` parses when called from a\n * module's top level: its four extra frames leave 983 of CPython's default\n * recursion limit for the parser (measured with Python 3.14).\n */\nexport const MAIL_PARSER_MAX_NESTING = 983;\n\n/** Port of mail-parser's `MailParser`, built with `parse_from_string()`. */\nexport class MailParser {\n readonly message: Message;\n readonly attachments: MailParserAttachment[] = [];\n readonly textPlain: string[] = [];\n readonly textHtml: string[] = [];\n readonly textNotManaged: string[] = [];\n readonly defects: DefectEntry[] = [];\n readonly defectsCategories: Set<string> = new Set();\n hasDefects = false;\n readonly addressHeaderDefects: AddressDiagnostic[] = [];\n readonly receivedHeaderDefects: ReceivedDiagnostic[] = [];\n readonly dateHeaderDefects: DateDiagnostic[] = [];\n readonly received: ReceivedHop[];\n readonly date: UtcDateTime | null = null;\n readonly timezone: string | 0 = 0;\n private readonly headerIndex = new Map<string, string[]>();\n private readonly addressHeaders = new Map<string, AddressPair[]>();\n private readonly mailObject: Record<string, unknown>;\n private readonly limits: EmailLimits;\n private flattened: FlattenCache | null = null;\n\n /**\n * `mailparser.parse_from_string(text)`. A message nested deeper than\n * {@link MAIL_PARSER_MAX_NESTING} levels throws\n * {@link MailParserRecursionError}, as `_parse_guarded()` turns Python's\n * `RecursionError` into it. Throws `EmailTooLargeError` past `limits`.\n */\n static fromString(\n text: string,\n limits: EmailLimits = DEFAULT_EMAIL_LIMITS,\n ): MailParser {\n try {\n return new MailParser(\n messageFromString(text, MAIL_PARSER_MAX_NESTING, limits),\n limits,\n );\n } catch (error) {\n if (!(error instanceof RecursionError)) {\n throw error;\n }\n throw new MailParserRecursionError(\n 'Message nesting too deep to parse (possible malicious multipart structure)',\n { cause: error },\n );\n }\n }\n\n constructor(message: Message, limits: EmailLimits = DEFAULT_EMAIL_LIMITS) {\n this.message = message;\n this.limits = limits;\n for (const [name, value] of message.items()) {\n const key = name.toLowerCase();\n const list = this.headerIndex.get(key) ?? [];\n list.push(value);\n this.headerIndex.set(key, list);\n }\n this.collectAddressHeaders();\n const occurrences = new Map<string, number>();\n for (const [name, raw] of message.rawItems()) {\n const header = name.toLowerCase();\n if (header !== 'date' && header !== 'resent-date') {\n continue;\n }\n const occurrence = occurrences.get(header) ?? 0;\n occurrences.set(header, occurrence + 1);\n const result = parseMailDate(raw);\n if (header === 'date' && occurrence === 0) {\n this.date = result.value;\n this.timezone = result.timezone;\n }\n this.dateHeaderDefects.push(\n ...dateDiagnostics(result, raw, header, occurrence),\n );\n }\n this.received = receivedsParsing(\n message\n .rawItems()\n .filter(([name]) => name.toLowerCase() === 'received')\n .map(([, value]) => value),\n this.receivedHeaderDefects,\n this.dateHeaderDefects,\n );\n if (this.receivedHeaderDefects.length > 0) {\n this.flagDefect('ReceivedHeaderDefect', {\n 'received-headers': this.receivedHeaderDefects.map(\n defect =>\n `ReceivedHeaderDefect: received[${defect.occurrence}]: ${defect.reason}`,\n ),\n });\n }\n if (this.dateHeaderDefects.length > 0) {\n this.flagDefect('DateHeaderDefect', {\n 'date-headers': this.dateHeaderDefects.map(\n defect =>\n `DateHeaderDefect: ${defect.header}[${defect.occurrence}]: ${defect.reason}`,\n ),\n });\n }\n this.parseParts();\n this.mailObject = this.makeMail();\n }\n\n private flagDefect(category: string, entry: DefectEntry): void {\n this.hasDefects = true;\n this.defectsCategories.add(category);\n this.defects.push(entry);\n }\n\n private collectAddressHeaders(): void {\n for (const header of ADDRESSES_HEADERS) {\n for (const [occurrence, value] of (\n this.headerIndex.get(header) ?? []\n ).entries()) {\n const diagnostics: AddressDiagnostic[] = [];\n const addresses = getAddresses(value, diagnostics, true);\n if (occurrence === 0) {\n this.addressHeaders.set(header, addresses);\n }\n for (const defect of diagnostics) {\n defect.header = header;\n defect.occurrence = occurrence;\n this.addressHeaderDefects.push(defect);\n }\n }\n }\n if (this.addressHeaderDefects.length > 0) {\n this.flagDefect('AddressHeaderDefect', {\n 'address-headers': this.addressHeaderDefects.map(\n defect =>\n `AddressHeaderDefect: ${defect.header}[${defect.occurrence}]: ${defect.reason}`,\n ),\n });\n }\n }\n\n /** `_header_value()`: a header by its exact name off the wire. */\n headerValue(name: string): HeaderValue {\n const lower = name.toLowerCase();\n if (ADDRESS_HEADER_SET.has(lower)) {\n return (this.addressHeaders.get(lower) ?? [])\n .filter(([, address]) => address)\n .map(([displayName, address]): [string, string] => [\n displayName === address ? '' : displayName,\n address,\n ]);\n }\n return decodeHeaders(this.headerIndex.get(lower));\n }\n\n private appendDefects(part: Message, contentType: string): void {\n const messages: string[] = [];\n for (const defect of part.defects) {\n messages.push(`${defect.name}: ${defect.doc}`);\n this.defectsCategories.add(defect.name);\n }\n if (messages.length > 0) {\n this.hasDefects = true;\n this.defects.push({ [contentType]: messages });\n }\n }\n\n private parseParts(): void {\n const parts: [Message, boolean][] = [];\n const attachmentDescendants = new Set<Message>();\n for (const part of this.message.walk()) {\n this.appendDefects(part, part.getContentType());\n const inside = attachmentDescendants.has(part);\n parts.push([part, inside]);\n if (part.isMultipart()) {\n const disposition = part.getContentDisposition();\n const blocksInline =\n (disposition !== undefined && disposition !== 'inline') ||\n (disposition !== 'inline' && Boolean(part.getFilename()));\n if (inside || blocksInline) {\n const payload = part.getPayload();\n for (const child of Array.isArray(payload) ? payload : []) {\n attachmentDescendants.add(child);\n }\n }\n }\n }\n if (this.defectsCategories.has(EPILOGUE_DEFECT)) {\n const boundary = this.message.getBoundary();\n if (boundary === undefined) {\n throw new TypeError('can only concatenate str (not \"NoneType\") to str');\n }\n const epilogue = findBetween(\n this.message.epilogue,\n `--${boundary}`,\n `--${boundary}--`,\n );\n if (epilogue !== null) {\n parts.push([\n messageFromString(epilogue, MAIL_PARSER_MAX_NESTING, this.limits),\n true,\n ]);\n }\n }\n // Nested message attachments reuse each other's flattened text.\n this.flattened = new FlattenCache(this.limits.maxExpandedEmailSize);\n try {\n for (const [index, [part, inside]] of parts.entries()) {\n this.parsePart(part, inside, index);\n }\n } finally {\n this.flattened = null;\n }\n }\n\n private parsePart(part: Message, inside: boolean, index: number): void {\n const metadata = mimeHeaderView(part);\n let filename = decodeHeaderPart(metadata.getFilename());\n const disposition = portedString(\n metadata.getContentDisposition(),\n ).toLowerCase();\n if (part.isMultipart() && disposition !== 'attachment') {\n return;\n }\n const charset = metadata.getContentCharset() ?? 'utf-8';\n const charsetRaw = metadata.getContentCharset() ?? null;\n const contentId = portedString(metadata.get('content-id'));\n const contentSubtype = portedString(metadata.getContentSubtype());\n const isInlineBody =\n !inside &&\n !part.isMultipart() &&\n disposition === 'inline' &&\n ['text/plain', 'text/html'].includes(part.getContentType());\n let isAttachment = false;\n if (filename) {\n isAttachment = true;\n } else if (\n contentId &&\n contentSubtype !== 'html' &&\n contentSubtype !== 'plain'\n ) {\n isAttachment = true;\n filename = contentId;\n } else if ('rtf'.includes(contentSubtype)) {\n // Python's `content_subtype in (\"rtf\")` is a substring test.\n isAttachment = true;\n filename = `${randomString()}.rtf`;\n } else if (disposition === 'attachment') {\n isAttachment = true;\n filename = `${randomString()}.txt`;\n }\n if (isAttachment) {\n this.addAttachment(part, metadata, filename, charsetRaw, contentId);\n }\n if (!isAttachment || isInlineBody) {\n const payload = this.decodeBodyPayload(part, charset, index);\n if (payload) {\n const subtype = part.getContentSubtype();\n if (subtype === 'html') {\n this.textHtml.push(payload);\n } else if (subtype === 'plain') {\n this.textPlain.push(payload);\n } else {\n log.warning(`Email content ${pyRepr(subtype)} not handled`);\n this.textNotManaged.push(payload);\n }\n }\n }\n }\n\n private addAttachment(\n part: Message,\n metadata: Message,\n filename: string,\n charsetRaw: string | null,\n contentId: string,\n ): void {\n const mailContentType = portedString(metadata.getContentType());\n let transferEncoding = pyStrip(\n portedString(metadata.get('content-transfer-encoding') ?? ''),\n ).toLowerCase();\n const contentDisposition = portedString(\n metadata.get('content-disposition'),\n );\n let payload: string;\n let binary: boolean;\n const raw = part.getPayload();\n if (Array.isArray(raw)) {\n // Appended, not joined: nested attachments keep sharing their parts'\n // text (see FlattenCache) instead of holding a flat copy per level.\n payload = '';\n for (const child of raw) {\n payload += child.asString(this.flattened);\n }\n binary = false;\n } else if (transferEncoding === 'base64') {\n payload = raw ?? '';\n binary = true;\n } else {\n // Every other encoding is re-encoded to base64 from the decoded bytes.\n payload = b64encode(part.getDecodedPayload() ?? new Uint8Array());\n binary = true;\n transferEncoding = 'base64';\n }\n this.attachments.push({\n filename,\n safe_filename: safeAttachmentFilename(filename),\n payload,\n binary,\n mail_content_type: mailContentType,\n 'content-id': contentId,\n 'content-disposition': contentDisposition,\n charset: charsetRaw,\n content_transfer_encoding: transferEncoding,\n });\n }\n\n private decodeBodyPayload(\n part: Message,\n charset: string,\n index: number,\n ): string {\n const payload = part.getDecodedPayload();\n const cte = pyStrip(\n portedString(part.get('Content-Transfer-Encoding') ?? ''),\n ).toLowerCase();\n if (\n (!cte || cte === '7bit' || cte === '8bit') &&\n typeof part.payload === 'string'\n ) {\n return part.payload;\n }\n if (payload === null || payload.length === 0) {\n return '';\n }\n let text: string;\n try {\n text = pyDecode(payload, charset);\n } catch (error) {\n if (!(error instanceof LookupError || error instanceof UnicodeError)) {\n throw error;\n }\n let recovery: string;\n try {\n text = pyDecode(payload, 'utf-8');\n recovery = 'decoded with utf-8';\n } catch {\n text = pyDecode(payload, 'utf-8', 'replace');\n recovery = 'decoded with utf-8 replacement characters';\n }\n this.flagDefect('CharsetDecodeDefect', {\n [part.getContentType()]: [\n `CharsetDecodeDefect: part ${index}, charset ${pyRepr(charset)} failed; ${recovery}. Original bytes remain in the MIME part.`,\n ],\n });\n }\n return nfc(text);\n }\n\n /** `body`: text parts joined with the mail boundary marker. */\n get body(): string {\n return [...this.textPlain, ...this.textHtml, ...this.textNotManaged].join(\n BODY_SEPARATOR,\n );\n }\n\n /** `to_domains`: domains of the To and Reply-To addresses. */\n get toDomains(): string[] {\n const domains = new Set<string>();\n const pairs = [this.headerValue('to'), this.headerValue('reply-to')];\n for (const list of pairs) {\n for (const pair of Array.isArray(list) ? list : []) {\n if (Array.isArray(pair)) {\n domains.add(pyStrip((pair[1].split('@').at(-1) ?? '').toLowerCase()));\n }\n }\n }\n return [...domains];\n }\n\n private computedPart(name: string): unknown {\n switch (name) {\n case 'attachments':\n return this.attachments;\n case 'body':\n return this.body;\n case 'date':\n return this.date;\n case 'received':\n return this.received;\n case 'timezone':\n return this.timezone;\n default:\n return this.toDomains;\n }\n }\n\n private makeMail(): Record<string, unknown> {\n const mail: Record<string, unknown> = {};\n const keys = new Set<string>([\n ...this.message.keys().map(key => key.toLowerCase()),\n ...ADDRESSES_HEADERS,\n ...OTHERS_PARTS,\n ]);\n for (const key of keys) {\n if (RESERVED_MAIL_KEYS.has(key)) {\n continue;\n }\n const value = COMPUTED_PARTS.has(key)\n ? this.computedPart(key)\n : this.headerValue(key);\n if (isTruthy(value)) {\n defineKey(mail, key, value);\n }\n }\n if (this.addressHeaderDefects.length > 0) {\n mail.address_header_defects = this.addressHeaderDefects;\n }\n if (this.receivedHeaderDefects.length > 0) {\n mail.received_header_defects = this.receivedHeaderDefects;\n }\n if (this.dateHeaderDefects.length > 0) {\n mail.date_header_defects = this.dateHeaderDefects;\n }\n mail.has_defects = this.hasDefects;\n if (this.hasDefects) {\n mail.defects = this.defects;\n mail.defects_categories = [...this.defectsCategories];\n }\n return mail;\n }\n\n /** `json.loads(mail_json)`: a deep copy with the date as ISO text. */\n get mail(): Record<string, unknown> {\n const copy = structuredClone(this.mailObject);\n if (this.date !== null && copy.date) {\n copy.date = utcIsoformat(this.date);\n }\n return copy;\n }\n\n /** `json.loads(headers_json)`: every header, first spelling wins. */\n get headers(): Record<string, HeaderValue> {\n const names = new Map<string, string>();\n for (const key of this.message.keys()) {\n if (!names.has(key.toLowerCase())) {\n names.set(key.toLowerCase(), key);\n }\n }\n const headers: Record<string, HeaderValue> = {};\n for (const name of names.values()) {\n defineKey(headers, name, this.headerValue(name));\n }\n return headers;\n }\n}\n\n/** Set an own enumerable property, even for names like `__proto__`. */\nexport function defineKey(\n target: Record<string, unknown>,\n key: string,\n value: unknown,\n): void {\n Object.defineProperty(target, key, {\n value,\n enumerable: true,\n writable: true,\n configurable: true,\n });\n}\n\nfunction isTruthy(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return Boolean(value);\n}\n","// Email utilities, ported from parsedmarc/utils.py: `decode_base64`,\n// `parse_email_address`, `get_filename_safe_string`, `is_mbox`,\n// `is_outlook_msg`, `convert_outlook_msg` and `parse_email`.\n//\n// `parse_email()` builds its result from mail-parser's JSON. mail-parser and\n// the Python `email` package it sits on are ported in `./mailparser` and\n// `./py-email`, so the parsed sample of a failure report has the same\n// content as parsedmarc's.\n\nimport { spawn } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { createReadStream } from 'node:fs';\nimport { mkdtemp, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { constants as osConstants, tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport type { EmailLimits } from '../config';\nimport { EmailParserError, emailTooLargeError } from '../errors';\nimport { PyValueError } from '../internal/py';\nimport { logger } from '../log';\nimport type { EmailAddress, ParsedEmail } from '../types';\nimport { defineKey, MailParser } from './mailparser/core';\nimport { b64decode } from './py-binascii';\nimport { pyDecode, pyEncode } from './py-codecs';\nimport { pyLen, pyRepr, pyRStrip, pySliceStart } from './py-str';\n\n/**\n * Python's `ValueError` (raised by {@link convertOutlookMsg} and others):\n * the public name of the core's one `PyValueError` class.\n */\nexport { PyValueError as ValueError } from '../internal/py';\n\n/**\n * Decodes a base64 string, with padding being optional.\n *\n * Throws `UnicodeEncodeError` for non-ASCII input and `binascii.Error`\n * (`BinasciiError`) for undecodable data, like Python.\n */\nexport function decodeBase64(data: string): Uint8Array {\n const bytes = pyEncode(data, 'ascii');\n const missingPadding = bytes.length % 4;\n if (missingPadding === 0) {\n return b64decode(bytes);\n }\n const padded = new Uint8Array(bytes.length + 4 - missingPadding).fill(0x3d);\n padded.set(bytes, 0);\n return b64decode(padded);\n}\n\n/**\n * Builds an address dict from a `(display_name, address)` pair, as\n * mail-parser returns them.\n */\nexport function parseEmailAddress(\n originalAddress: readonly [string, string] | readonly string[],\n): EmailAddress {\n const name = originalAddress[0];\n const displayName = name === '' ? null : (name ?? null);\n const address = originalAddress[1] ?? '';\n const addressParts = address.split('@');\n let local: string | null = null;\n let domain: string | null = null;\n if (addressParts.length > 1) {\n local = (addressParts[0] ?? '').toLowerCase();\n domain = (addressParts.at(-1) ?? '').toLowerCase();\n }\n return { displayName, address, local, domain };\n}\n\nconst INVALID_FILENAME_CHARS = [\n '\\\\',\n '/',\n ':',\n '\"',\n '*',\n '?',\n '|',\n '\\n',\n '\\r',\n '\\u0000',\n];\nconst MAX_FILENAME_LENGTH = 100;\n/**\n * Byte cap on top of the 100-character cap (GHSA-j53g-34vj-g25q):\n * filesystems limit a name to 255 bytes (eCryptfs: 143), and 100 bytes\n * leaves room for a ` (N)` suffix and an extension under every one of them.\n */\nconst MAX_FILENAME_BYTES = 100;\n// Python's `encode(\"utf-8\", errors=\"ignore\")` drops lone surrogates.\nconst LONE_SURROGATE = /[\\uD800-\\uDFFF]/gu;\n// Control characters (C0, DEL, C1) and bidi embedding, override and\n// isolate marks, which can disguise a file name (`txt.exe` shown as\n// `exe.txt`).\n// oxlint-disable-next-line no-control-regex -- matching control characters is the point.\nconst UNSAFE_FILENAME_CHARS = /[\\0-\\x1f\\x7f-\\x9f؜‎‏‪-‮⁦-⁩]/gu;\n\nconst ONE_BYTE_MAX = 0x7f;\nconst TWO_BYTES_MAX = 0x7_ff;\nconst THREE_BYTES_MAX = 0xff_ff;\n\n/** The UTF-8 length of a code point. */\nfunction utf8Length(codePoint: number): number {\n if (codePoint <= ONE_BYTE_MAX) {\n return 1;\n }\n if (codePoint <= TWO_BYTES_MAX) {\n return 2;\n }\n return codePoint <= THREE_BYTES_MAX ? 3 : 4;\n}\n\n/** The longest prefix of `text` that fits in `maxBytes` UTF-8 bytes. */\nfunction truncateUtf8(text: string, maxBytes: number): string {\n let bytes = 0;\n let end = 0;\n for (const char of text) {\n bytes += utf8Length(char.codePointAt(0) ?? 0);\n if (bytes > maxBytes) {\n return text.slice(0, end);\n }\n end += char.length;\n }\n return text;\n}\n\n/**\n * Converts a string to a string that is safe to use as a filename.\n *\n * The result is a single path component: no `/`, `\\`, `:`, NUL, other\n * control characters or bidi marks, never ending in `.` or a space, never\n * `.` or `..`, and at most 100 characters and 100 UTF-8 bytes (cut on a\n * character boundary; lone surrogates are dropped), like parsedmarc. It can\n * be empty, so callers that need a name must supply a fallback. `null` is\n * treated as the literal string `\"None\"`.\n *\n * parsedmarc removes only `\\ / : \" * ? |`, CR, LF and NUL; the other control\n * characters and the bidi marks are a tsdmarc addition.\n */\nexport function getFilenameSafeString(value: string | null): string {\n let text = value ?? 'None';\n for (const char of INVALID_FILENAME_CHARS) {\n text = text.replaceAll(char, '');\n }\n text = text.replaceAll(UNSAFE_FILENAME_CHARS, '');\n // Truncate before stripping, so a cut name cannot end in a dot or space.\n if (pyLen(text) > MAX_FILENAME_LENGTH) {\n text = pySliceStart(text, MAX_FILENAME_LENGTH);\n }\n text = truncateUtf8(text.replaceAll(LONE_SURROGATE, ''), MAX_FILENAME_BYTES);\n return pyRStrip(text, '. ');\n}\n\n// Python's OSError text for the errors `open()` raises most often.\nconst ERRNO_TEXT: Readonly<Record<string, [number, string]>> = {\n EACCES: [13, 'Permission denied'],\n EISDIR: [21, 'Is a directory'],\n ENOENT: [2, 'No such file or directory'],\n ENOTDIR: [20, 'Not a directory'],\n};\n\nfunction osErrorText(error: unknown, path: string): string {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ) {\n const known = ERRNO_TEXT[error.code];\n if (known !== undefined) {\n return `[Errno ${known[0]}] ${known[1]}: ${pyRepr(path)}`;\n }\n }\n return error instanceof Error ? error.message : String(error);\n}\n\n// mailbox.mbox counts one message per line that starts with \"From \".\nasync function hasFromLine(path: string): Promise<boolean> {\n const stream = createReadStream(path);\n let atLineStart = true;\n let carry = '';\n try {\n for await (const chunk of stream) {\n const text = carry + Buffer.from(chunk as Uint8Array).toString('latin1');\n for (let index = 0; index < text.length; index += 1) {\n if (atLineStart && text.startsWith('From ', index)) {\n return true;\n }\n if (\n atLineStart &&\n index + 5 > text.length &&\n 'From '.startsWith(text.slice(index))\n ) {\n carry = text.slice(index);\n break;\n }\n atLineStart = text.charAt(index) === '\\n';\n carry = '';\n }\n }\n } finally {\n stream.destroy();\n }\n return false;\n}\n\n/**\n * Checks if the file at the given path is an mbox mailbox file (it holds at\n * least one message). Errors are logged at debug level and give `false`.\n */\nexport async function isMbox(path: string): Promise<boolean> {\n try {\n return await hasFromLine(path);\n } catch (error) {\n logger.debug(`Error checking for MBOX file: ${osErrorText(error, path)}`);\n return false;\n }\n}\n\nconst OUTLOOK_MAGIC = Uint8Array.of(\n 0xd0,\n 0xcf,\n 0x11,\n 0xe0,\n 0xa1,\n 0xb1,\n 0x1a,\n 0xe1,\n);\n\n/** Checks if the given content is an Outlook msg OLE/MSG file. */\nexport function isOutlookMsg(content: unknown): boolean {\n if (\n !(content instanceof Uint8Array) ||\n content.length < OUTLOOK_MAGIC.length\n ) {\n return false;\n }\n return OUTLOOK_MAGIC.every((byte, index) => content[index] === byte);\n}\n\n/** How long `msgconvert` may run before it is killed (milliseconds). */\nexport const MSGCONVERT_TIMEOUT_MS = 60_000;\n\n/** Python's `subprocess.CalledProcessError`. */\nexport class CalledProcessError extends Error {\n override name = 'CalledProcessError';\n}\n\nconst MSGCONVERT_COMMAND = \"['msgconvert', 'sample.msg']\";\n\n/**\n * `subprocess.check_call([\"msgconvert\", \"sample.msg\"], stdout=DEVNULL,\n * stderr=DEVNULL)`: output is discarded (never buffered), plus a timeout.\n */\nfunction runMsgconvert(cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n let settled = false;\n let timedOut = false;\n const settle = (error: Error | null): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n if (error === null) {\n resolve();\n } else {\n reject(error);\n }\n };\n const child = spawn('msgconvert', ['sample.msg'], {\n cwd,\n stdio: 'ignore',\n windowsHide: true,\n });\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, MSGCONVERT_TIMEOUT_MS);\n child.once('error', (error: NodeJS.ErrnoException) => {\n if (error.code === 'ENOENT') {\n settle(\n new EmailParserError(\n 'Failed to convert Outlook MSG: msgconvert utility not found',\n ),\n );\n return;\n }\n settle(error);\n });\n child.once(\n 'close',\n (code: number | null, signal: NodeJS.Signals | null) => {\n if (timedOut) {\n settle(\n new EmailParserError(\n `Failed to convert Outlook MSG: msgconvert did not finish within ${MSGCONVERT_TIMEOUT_MS / 1000}s`,\n ),\n );\n } else if (signal !== null) {\n const number = osConstants.signals[signal];\n settle(\n new CalledProcessError(\n `Command '${MSGCONVERT_COMMAND}' died with <Signals.${signal}: ${number}>.`,\n ),\n );\n } else if (code === 0) {\n settle(null);\n } else {\n settle(\n new CalledProcessError(\n `Command '${MSGCONVERT_COMMAND}' returned non-zero exit status ${String(code)}.`,\n ),\n );\n }\n },\n );\n });\n}\n\n/**\n * Uses the `msgconvert` Perl utility to convert an Outlook MSG file to\n * standard RFC 822 format.\n *\n * Throws {@link ValueError} when the bytes are not an Outlook MSG file and\n * {@link EmailParserError} when `msgconvert` is not installed (or, unlike\n * parsedmarc, runs longer than {@link MSGCONVERT_TIMEOUT_MS}). Throws\n * `EmailTooLargeError` when `maxSize` is not 0 and the converted message is\n * larger, before reading it: a small MSG can expand a lot.\n */\nexport async function convertOutlookMsg(\n msgBytes: Uint8Array,\n maxSize = 0,\n): Promise<Uint8Array> {\n if (!isOutlookMsg(msgBytes)) {\n throw new PyValueError('The supplied bytes are not an Outlook MSG file');\n }\n const tmpDir = await mkdtemp(path.join(tmpdir(), 'tsdmarc-'));\n try {\n await writeFile(path.join(tmpDir, 'sample.msg'), msgBytes);\n await runMsgconvert(tmpDir);\n const converted = path.join(tmpDir, 'sample.eml');\n try {\n if (maxSize > 0) {\n const { size } = await stat(converted);\n if (size > maxSize) {\n throw emailTooLargeError(size, maxSize);\n }\n }\n return new Uint8Array(await readFile(converted));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new EmailParserError(\n 'Failed to convert Outlook MSG: msgconvert utility not found',\n );\n }\n throw error;\n }\n } finally {\n await rm(tmpDir, { recursive: true, force: true });\n }\n}\n\n/** Options of {@link parseEmail}. */\nexport interface ParseEmailOptions {\n /** Remove attachment payloads. */\n stripAttachmentPayloads?: boolean;\n /** Limits on the message's structure (not in parsedmarc). */\n limits?: EmailLimits;\n}\n\ntype PyDict = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is PyDict {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * `parse_email()` on mail-parser's JSON, exactly as parsedmarc does it.\n * Returns the snake_case dict that parsedmarc returns.\n */\nfunction postProcess(\n parser: MailParser,\n stripAttachmentPayloads: boolean,\n): PyDict {\n const headers = parser.headers;\n const parsed = parser.mail;\n parsed.headers = headers;\n\n if (Array.isArray(parsed.received)) {\n for (const received of parsed.received as PyDict[]) {\n if ('date_utc' in received) {\n if (received.date_utc === null) {\n delete received.date_utc;\n } else {\n received.date_utc = String(received.date_utc).replaceAll('T', ' ');\n }\n }\n }\n }\n\n if (!('from' in parsed)) {\n // mail-parser omits \"from\" when the From header is present but\n // unparseable; the headers may still carry an empty \"From\" list.\n const fromHeader = (headers as PyDict).From;\n parsed.from = isTruthyValue(fromHeader) ? fromHeader : null;\n }\n if (parsed.from !== null && parsed.from !== undefined) {\n const first = (parsed.from as unknown[])[0];\n parsed.from = parseEmailAddress(first as [string, string]);\n }\n\n parsed.date =\n typeof parsed.date === 'string' ? parsed.date.replaceAll('T', ' ') : null;\n\n // mail-parser names these headers with hyphens; parsedmarc renames them.\n if ('reply-to' in parsed) {\n parsed.reply_to = (parsed['reply-to'] as [string, string][]).map(\n parseEmailAddress,\n );\n delete parsed['reply-to'];\n } else {\n parsed.reply_to = [];\n }\n for (const key of ['to', 'cc', 'bcc']) {\n parsed[key] =\n key in parsed\n ? (parsed[key] as [string, string][]).map(parseEmailAddress)\n : [];\n }\n if ('delivered-to' in parsed) {\n parsed.delivered_to = (parsed['delivered-to'] as [string, string][]).map(\n parseEmailAddress,\n );\n delete parsed['delivered-to'];\n }\n\n if ('attachments' in parsed) {\n const attachments = parsed.attachments as PyDict[];\n for (const attachment of attachments) {\n if (!('payload' in attachment)) {\n continue;\n }\n const payload = String(attachment.payload);\n try {\n const bytes =\n attachment.content_transfer_encoding === 'base64'\n ? decodeBase64(payload)\n : pyEncode(payload, 'utf-8');\n attachment.sha256 = createHash('sha256').update(bytes).digest('hex');\n } catch (error) {\n logger.debug(`Unable to decode attachment: ${errorMessage(error)}`);\n }\n }\n if (stripAttachmentPayloads) {\n for (const attachment of attachments) {\n delete attachment.payload;\n }\n }\n } else {\n parsed.attachments = [];\n }\n\n if (!('subject' in parsed)) {\n parsed.subject = null;\n }\n if (Array.isArray(parsed.subject)) {\n // Several Subject headers: mail-parser returns a list, and parsedmarc's\n // get_filename_safe_string() fails on it (AttributeError).\n throw new TypeError(\"'list' object has no attribute 'replace'\");\n }\n parsed.filename_safe_subject = getFilenameSafeString(\n parsed.subject === null ? null : String(parsed.subject),\n );\n if (!('body' in parsed)) {\n parsed.body = null;\n }\n return parsed;\n}\n\nfunction isTruthyValue(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return Boolean(value);\n}\n\n// snake_case keys of parse_email()'s output → the camelCase API. Every other\n// key is a header name (or a computed name without underscores) and stays.\nconst TOP_LEVEL_KEYS: Readonly<Record<string, string>> = {\n address_header_defects: 'addressHeaderDefects',\n date_header_defects: 'dateHeaderDefects',\n defects_categories: 'defectsCategories',\n delivered_to: 'deliveredTo',\n filename_safe_subject: 'filenameSafeSubject',\n has_defects: 'hasDefects',\n received_header_defects: 'receivedHeaderDefects',\n reply_to: 'replyTo',\n to_domains: 'toDomains',\n};\nconst RECEIVED_KEYS: Readonly<Record<string, string>> = {\n date_utc: 'dateUtc',\n envelope_from: 'envelopeFrom',\n envelope_sender: 'envelopeSender',\n};\nconst ATTACHMENT_KEYS: Readonly<Record<string, string>> = {\n content_transfer_encoding: 'contentTransferEncoding',\n mail_content_type: 'mailContentType',\n safe_filename: 'safeFilename',\n};\nconst CANDIDATE_KEYS: Readonly<Record<string, string>> = {\n display_name: 'displayName',\n};\n\nfunction renameKeys(\n value: unknown,\n mapping: Readonly<Record<string, string>>,\n): unknown {\n if (!isRecord(value)) {\n return value;\n }\n const result: PyDict = {};\n for (const [key, child] of Object.entries(value)) {\n defineKey(\n result,\n Object.hasOwn(mapping, key) ? (mapping[key] ?? key) : key,\n child,\n );\n }\n return result;\n}\n\nfunction toApiShape(parsed: PyDict): ParsedEmail {\n const result: PyDict = {};\n for (const [key, value] of Object.entries(parsed)) {\n let converted = value;\n if (key === 'received' && Array.isArray(value)) {\n converted = value.map(hop => renameKeys(hop, RECEIVED_KEYS));\n } else if (key === 'attachments' && Array.isArray(value)) {\n converted = value.map(attachment =>\n renameKeys(attachment, ATTACHMENT_KEYS),\n );\n } else if (key === 'address_header_defects' && Array.isArray(value)) {\n converted = value.map(defect => {\n const renamed = renameKeys(defect, {}) as PyDict;\n if (Array.isArray(renamed.candidates)) {\n renamed.candidates = renamed.candidates.map(candidate =>\n renameKeys(candidate, CANDIDATE_KEYS),\n );\n }\n return renamed;\n });\n }\n const apiKey = Object.hasOwn(TOP_LEVEL_KEYS, key)\n ? (TOP_LEVEL_KEYS[key] ?? key)\n : key;\n defineKey(result, apiKey, converted);\n }\n return result as unknown as ParsedEmail;\n}\n\n/**\n * A simplified email parser.\n *\n * `data` is the RFC 822 message text, or its bytes (Outlook MSG bytes are\n * converted with `msgconvert` first; other bytes are decoded as UTF-8 with\n * replacement). `toSnakeCaseKeys()` of the result is parsedmarc's\n * `parse_email()` output.\n */\nexport async function parseEmail(\n data: Uint8Array | string,\n options: ParseEmailOptions = {},\n): Promise<ParsedEmail> {\n let text: string;\n if (typeof data !== 'string' && !(data instanceof Uint8Array)) {\n // What `email.message_from_string()` raises for other types.\n throw new TypeError(\n `initial_value must be str or None, not ${typeof data}`,\n );\n }\n if (typeof data === 'string') {\n // JavaScript strings may hold lone surrogates, Python's decoded text\n // cannot: replace them like a UTF-8 round trip would.\n text = data.toWellFormed();\n } else {\n const bytes = isOutlookMsg(data) ? await convertOutlookMsg(data) : data;\n text = pyDecode(bytes, 'utf-8', 'replace');\n }\n return parseEmailText(text, options);\n}\n\n/**\n * The synchronous part of {@link parseEmail}, for already-decoded text (no\n * Outlook MSG conversion).\n */\nexport function parseEmailText(\n text: string,\n options: ParseEmailOptions = {},\n): ParsedEmail {\n const parser = MailParser.fromString(text, options.limits);\n return toApiShape(\n postProcess(parser, options.stripAttachmentPayloads ?? false),\n );\n}\n","// DMARC failure (forensic, RUF) report parsing and CSV output, ported from\n// parsedmarc/__init__.py (`parse_failure_report` and the CSV helpers).\n\nimport { resolveParserConfig, type ParserConfigInput } from './config';\nimport { csvSafe, rowsToCsv, type CsvOptions, type CsvRow } from './csv';\nimport { InvalidFailureReport } from './errors';\nimport { errorText, excOrigin, KeyError } from './internal/py';\nimport { setOwn } from './internal/set-own';\nimport { logger } from './log';\nimport { camelToSnake, snakeToCamel } from './serialize';\nimport type { FailureReport, ParsedEmail } from './types';\nimport type { PyDateTime } from './utils/datetime';\nimport { parseEmail } from './utils/email';\nimport { getIpAddressInfo } from './utils/ip-info';\nimport { PY_WS_CLASS, pyStrip } from './utils/py-str';\nimport { humanTimestampToDatetime } from './utils/timestamps';\n\n/**\n * Content types of the MIME part that carries a failure report's sample\n * message (or only its headers).\n */\nexport const EMAIL_SAMPLE_CONTENT_TYPES: readonly string[] = [\n 'text/rfc822',\n 'text-rfc-822',\n 'text/rfc822-headers',\n 'text/rfc-822-headers',\n 'message/rfc822',\n 'message/rfc-822',\n 'message/rfc822-headers',\n 'message/rfc-822-headers',\n];\n\n// parsedmarc's `feedback_report_regex`:\n// re.compile(r\"^([\\w\\-]+): ([^\\r\\n]+)\\r?$\", re.MULTILINE)\n// JavaScript's `m` flag also treats a lone CR (and U+2028/U+2029) as a line\n// boundary, Python's only LF, so the line anchors are spelled out: start of\n// input or after LF, and end of input or before LF. Python's `\\w` on str is\n// Unicode-aware. Linear: every candidate starts at a line start, the name\n// class stops at \":\" and the value class stops at CR/LF.\nconst FEEDBACK_REPORT_REGEX =\n /(?<![^\\n])([\\p{L}\\p{N}_-]+): ([^\\r\\n]+)\\r?(?=\\n|$)/gu;\n\n// Python's `re.split(r\"\\s\", ...)`: one Unicode whitespace character.\nconst PY_WHITESPACE = new RegExp(`[${PY_WS_CLASS}]`, 'u');\n\nconst DELIVERY_RESULTS: readonly string[] = [\n 'delivered',\n 'spam',\n 'policy',\n 'reject',\n 'other',\n];\n\nconst OPTIONAL_FIELDS: readonly string[] = [\n 'original_envelope_id',\n 'dkim_domain',\n 'original_mail_from',\n 'original_rcpt_to',\n];\n\n/** Fields of `parsedFailureReportsToCsv()`, in column order. */\nexport const FAILURE_CSV_FIELDS: readonly string[] = [\n 'feedback_type',\n 'user_agent',\n 'version',\n 'original_envelope_id',\n 'original_mail_from',\n 'original_rcpt_to',\n 'arrival_date',\n 'arrival_date_utc',\n 'subject',\n 'message_id',\n 'authentication_results',\n 'dkim_domain',\n 'source_ip_address',\n 'source_country',\n 'source_reverse_dns',\n 'source_base_domain',\n 'source_name',\n 'source_type',\n 'source_asn',\n 'source_as_name',\n 'source_as_domain',\n 'delivery_result',\n 'auth_failure',\n 'reported_domain',\n 'authentication_mechanisms',\n 'sample_headers_only',\n];\n\n/** Options of {@link parseFailureReport}. */\nexport type ParseFailureReportOptions = Omit<\n ParserConfigInput,\n 'normalizeTimespanThresholdHours'\n>;\n\n/** Python's `[t.strip() for t in value.split(\",\") if t.strip()]`. */\nfunction splitCommaList(value: string): string[] {\n return value\n .split(',')\n .map(token => pyStrip(token))\n .filter(token => token !== '');\n}\n\n/** Python's `dict[key]` on the working dict, raising KeyError. */\nfunction required(parsed: Map<string, unknown>, key: string): unknown {\n if (!parsed.has(key)) {\n throw new KeyError(key);\n }\n return parsed.get(key);\n}\n\n/** Fill in parsedmarc's defaults for the RFC 9991 / RFC 5965 / RFC 6591 fields. */\nfunction applyRequiredFieldDefaults(parsed: Map<string, unknown>): void {\n // Identity-Alignment is REQUIRED per RFC 9991 §4. Default silently for\n // backward compatibility with pre-9991 reporters, but log so the\n // offending reporter is visible.\n if (parsed.has('identity_alignment')) {\n const rawAlignment = pyStrip(String(parsed.get('identity_alignment')));\n parsed.set(\n 'authentication_mechanisms',\n rawAlignment.toLowerCase() === 'none' ? [] : splitCommaList(rawAlignment),\n );\n parsed.delete('identity_alignment');\n } else {\n logger.warning(\n \"Failure report missing required 'Identity-Alignment' \" +\n 'field (RFC 9991 §4); defaulting to no aligned mechanisms',\n );\n parsed.set('authentication_mechanisms', []);\n }\n\n // Auth-Failure is REQUIRED per RFC 9991 §4 (comma-separated).\n if (!parsed.has('auth_failure')) {\n logger.warning(\n \"Failure report missing required 'Auth-Failure' field \" +\n \"(RFC 9991 §4); defaulting to 'dmarc'\",\n );\n parsed.set('auth_failure', 'dmarc');\n }\n parsed.set(\n 'auth_failure',\n splitCommaList(String(parsed.get('auth_failure'))),\n );\n\n // Feedback-Type is REQUIRED per RFC 5965 §3.1, but some gateways omit it;\n // the Elasticsearch/OpenSearch outputs require the key (issue #332).\n if (!parsed.has('feedback_type')) {\n logger.warning(\n \"Failure report missing required 'Feedback-Type' field \" +\n \"(RFC 5965 §3.1); defaulting to 'auth-failure'\",\n );\n parsed.set('feedback_type', 'auth-failure');\n }\n\n // Authentication-Results is REQUIRED per RFC 6591 §3.1.\n if (!parsed.has('authentication_results')) {\n logger.warning(\n \"Failure report missing required 'Authentication-Results' \" +\n 'field (RFC 6591 §3.1); defaulting to None',\n );\n parsed.set('authentication_results', null);\n }\n\n for (const optionalField of OPTIONAL_FIELDS) {\n if (!parsed.has(optionalField)) {\n parsed.set(optionalField, null);\n }\n }\n}\n\nfunction normalizeDeliveryResult(parsed: Map<string, unknown>): void {\n if (parsed.has('delivery_result')) {\n const value = String(parsed.get('delivery_result')).toLowerCase();\n const known = DELIVERY_RESULTS.find(result => value.includes(result));\n if (known !== undefined) {\n parsed.set('delivery_result', known);\n }\n } else {\n parsed.set('delivery_result', null);\n }\n if (!DELIVERY_RESULTS.includes(parsed.get('delivery_result') as string)) {\n parsed.set('delivery_result', 'other');\n }\n}\n\n/** The domain of the sample's From address, if it has one. */\nfunction sampleFromDomain(parsedSample: ParsedEmail): string | null {\n const sampleFrom: unknown = parsedSample.from;\n if (typeof sampleFrom !== 'object' || sampleFrom === null) {\n return null;\n }\n const domain = (sampleFrom as { domain?: unknown }).domain;\n return typeof domain === 'string' && domain !== '' ? domain : null;\n}\n\nasync function buildFailureReport(\n feedbackReport: string,\n sample: string,\n msgDate: PyDateTime | null,\n options: ParseFailureReportOptions,\n): Promise<FailureReport> {\n const config = resolveParserConfig(options);\n // A Map keeps Python's dict insertion order for every key, including keys\n // from the report that look like array indices (\"123\").\n const parsed = new Map<string, unknown>();\n for (const match of feedbackReport.matchAll(FEEDBACK_REPORT_REGEX)) {\n const [, name = '', value = ''] = match;\n parsed.set(name.toLowerCase().replaceAll('-', '_'), value);\n }\n\n if (!parsed.has('arrival_date')) {\n if (msgDate === null) {\n throw new InvalidFailureReport('Failure sample is not a valid email');\n }\n parsed.set('arrival_date', msgDate.isoformat());\n }\n if (!parsed.has('version')) {\n parsed.set('version', null);\n }\n if (!parsed.has('user_agent')) {\n parsed.set('user_agent', null);\n }\n normalizeDeliveryResult(parsed);\n\n const arrivalUtc = humanTimestampToDatetime(\n String(parsed.get('arrival_date')),\n { toUtc: true },\n );\n parsed.set('arrival_date_utc', arrivalUtc.strftime('%Y-%m-%d %H:%M:%S'));\n\n const sourceIp = String(required(parsed, 'source_ip'));\n const ipAddress = sourceIp.split(PY_WHITESPACE)[0] ?? '';\n parsed.set('source', await getIpAddressInfo(ipAddress, { config }));\n parsed.delete('source_ip');\n\n applyRequiredFieldDefaults(parsed);\n\n const parsedSample = await parseEmail(sample, {\n stripAttachmentPayloads: config.stripAttachmentPayloads,\n limits: config,\n });\n\n if (!parsed.has('reported_domain')) {\n // reported_domain is a required string of FailureReport, read directly\n // by the Elasticsearch and OpenSearch outputs, so it cannot be null.\n const domain = sampleFromDomain(parsedSample);\n if (domain === null) {\n throw new InvalidFailureReport(\n 'The failure report has no Reported-Domain field, and no ' +\n 'domain could be parsed from the From header of the ' +\n 'included sample message',\n );\n }\n parsed.set('reported_domain', domain);\n }\n\n const sampleHeadersOnly =\n parsedSample.attachments.length < 1 && parsedSample.body === null;\n if (sampleHeadersOnly && parsedSample.hasDefects) {\n delete parsedSample.defects;\n delete parsedSample.defectsCategories;\n delete parsedSample.hasDefects;\n }\n parsed.set('sample_headers_only', sampleHeadersOnly);\n parsed.set('sample', sample);\n parsed.set('parsed_sample', parsedSample);\n\n const report: Record<string, unknown> = {};\n for (const [key, value] of parsed) {\n setOwn(report, snakeToCamel(key), value);\n }\n return report as unknown as FailureReport;\n}\n\n/**\n * Parse a DMARC failure report (the `message/feedback-report` part) and its\n * sample (the RFC 822 message or headers).\n *\n * `msgDate` (the report email's date) is the arrival date when the report\n * has no `Arrival-Date` field. Feedback-report fields parsedmarc doesn't\n * know are kept, with camelCase keys (`Reported-URI` → `reportedUri`).\n */\nexport async function parseFailureReport(\n feedbackReport: string,\n sample: string,\n msgDate: PyDateTime | null,\n options: ParseFailureReportOptions = {},\n): Promise<FailureReport> {\n try {\n return await buildFailureReport(feedbackReport, sample, msgDate, options);\n } catch (error) {\n if (error instanceof InvalidFailureReport) {\n // Already a clear, specific message.\n throw error;\n }\n if (error instanceof KeyError) {\n throw new InvalidFailureReport(`Missing value: ${error.message}`, {\n cause: error,\n });\n }\n throw new InvalidFailureReport(\n `Unexpected error: ${errorText(error)}${excOrigin(error)}`,\n { cause: error },\n );\n }\n}\n\n/** Backward-compatible alias of {@link parseFailureReport}. */\nexport const parseForensicReport: typeof parseFailureReport =\n parseFailureReport;\n\n/**\n * Flatten failure reports into CSV rows (snake_case keys): every report\n * field except the sample, with the source flattened into `source_*`, the\n * sample's subject, and the list fields joined with commas.\n */\nexport function parsedFailureReportsToCsvRows(\n reports: FailureReport | FailureReport[],\n): CsvRow[] {\n const reportList = Array.isArray(reports) ? reports : [reports];\n const rows: CsvRow[] = [];\n for (const report of reportList) {\n const row: CsvRow = {};\n for (const [key, value] of Object.entries(report)) {\n setOwn(row, camelToSnake(key), value);\n }\n const { source } = report;\n row.source_ip_address = source.ipAddress;\n row.source_reverse_dns = source.reverseDns;\n row.source_base_domain = source.baseDomain;\n row.source_name = source.name;\n row.source_type = source.type;\n row.source_asn = source.asn;\n row.source_as_name = source.asName;\n row.source_as_domain = source.asDomain;\n row.source_country = source.country;\n delete row.source;\n row.subject = report.parsedSample.subject ?? null;\n row.auth_failure = report.authFailure.join(',');\n row.authentication_mechanisms = report.authenticationMechanisms.join(',');\n delete row.sample;\n delete row.parsed_sample;\n rows.push(row);\n }\n return rows;\n}\n\n/** Backward-compatible alias of {@link parsedFailureReportsToCsvRows}. */\nexport const parsedForensicReportsToCsvRows: typeof parsedFailureReportsToCsvRows =\n parsedFailureReportsToCsvRows;\n\n/** Failure reports as flat CSV, with headers. */\nexport function parsedFailureReportsToCsv(\n reports: FailureReport | FailureReport[],\n options: CsvOptions = {},\n): string {\n const rows = parsedFailureReportsToCsvRows(reports).map(row => {\n const newRow: CsvRow = {};\n for (const key of FAILURE_CSV_FIELDS) {\n newRow[key] = csvSafe(Object.hasOwn(row, key) ? row[key] : null);\n }\n return newRow;\n });\n return rowsToCsv(FAILURE_CSV_FIELDS, rows, options);\n}\n\n/** Backward-compatible alias of {@link parsedFailureReportsToCsv}. */\nexport const parsedForensicReportsToCsv: typeof parsedFailureReportsToCsv =\n parsedFailureReportsToCsv;\n","// Python's `json.dumps()`, for output whose exact bytes matter: syslog\n// messages, GELF packets, Splunk and Kafka events (default\n// `ensure_ascii=True`), and the JSON output files (`ensure_ascii=False,\n// indent=2`). Python ints are unbounded and dumped exactly, so `bigint`s\n// (counts beyond 2^53) are written as exact integers too.\n\nimport { pyFloatRepr } from '../utils/python';\nimport { PyTypeError } from './py';\nimport { setOwn } from './set-own';\n\nexport interface PyJsonDumpsOptions {\n /** `(item_separator, key_separator)`; Python's default is `(', ', ': ')`. */\n separators?: readonly [string, string];\n /**\n * Called for values JSON can't represent, like Python's `default=`; its\n * result is serialized instead. Without it they throw `TypeError`.\n */\n default?: (value: unknown) => unknown;\n /** Pretty-print with this many spaces per level, like `indent=`. */\n indent?: number | null;\n /** Escape non-ASCII as `\\uXXXX`, like `ensure_ascii=`. Default: true. */\n ensureAscii?: boolean;\n /**\n * Write `NaN`, `Infinity` and `-Infinity` as `null`, for a consumer that\n * expects standard JSON. Python writes them bare (`allow_nan=True`).\n */\n nonFiniteAsNull?: boolean;\n}\n\nconst NON_FINITE_TEXTS: ReadonlySet<string> = new Set([\n 'NaN',\n 'Infinity',\n '-Infinity',\n]);\n\n/**\n * A number as Python's `json.dumps()` writes it back after `json.loads()`\n * (an exact int, or a float's `repr`), so values a JS number can't keep\n * (`12345678901234567890`, `1.0`) survive a load/dump round trip.\n */\nexport class PyJsonNumber {\n readonly text: string;\n\n constructor(text: string) {\n this.text = text;\n }\n}\n\nconst SHORT_ESCAPES: Readonly<Record<string, string>> = {\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n};\n\nconst PRINTABLE_ASCII_FIRST = 0x20;\nconst PRINTABLE_ASCII_LAST = 0x7e;\n\nconst HIGH_SURROGATE_FIRST = 0xd8_00;\nconst LOW_SURROGATE_FIRST = 0xdc_00;\nconst LOW_SURROGATE_LAST = 0xdf_ff;\n\nfunction isLowSurrogate(code: number): boolean {\n return code >= LOW_SURROGATE_FIRST && code <= LOW_SURROGATE_LAST;\n}\n\nfunction isLoneSurrogate(text: string, index: number): boolean {\n const code = text.charCodeAt(index);\n if (code < HIGH_SURROGATE_FIRST || code > LOW_SURROGATE_LAST) {\n return false;\n }\n if (code < LOW_SURROGATE_FIRST) {\n return !isLowSurrogate(text.charCodeAt(index + 1));\n }\n const previous = text.charCodeAt(index - 1);\n return !(previous >= HIGH_SURROGATE_FIRST && previous < LOW_SURROGATE_FIRST);\n}\n\n/**\n * `ensure_ascii=False`: only `\"`, `\\\\` and control characters are escaped.\n * Lone surrogates are escaped as well; Python can't write them as UTF-8.\n */\nfunction encodeStringUnicode(text: string): string {\n let result = '\"';\n for (let index = 0; index < text.length; index += 1) {\n const char = text.charAt(index);\n const code = text.charCodeAt(index);\n const short = SHORT_ESCAPES[char];\n if (short !== undefined) {\n result += short;\n } else if (code < PRINTABLE_ASCII_FIRST || isLoneSurrogate(text, index)) {\n result += `\\\\u${code.toString(16).padStart(4, '0')}`;\n } else {\n result += char;\n }\n }\n return `${result}\"`;\n}\n\n/** A JSON string with every non-printable-ASCII UTF-16 unit as `\\uXXXX`. */\nfunction encodeString(text: string): string {\n let result = '\"';\n for (let index = 0; index < text.length; index += 1) {\n const char = text.charAt(index);\n const code = text.charCodeAt(index);\n const short = SHORT_ESCAPES[char];\n if (short !== undefined) {\n result += short;\n } else if (code < PRINTABLE_ASCII_FIRST || code > PRINTABLE_ASCII_LAST) {\n result += `\\\\u${code.toString(16).padStart(4, '0')}`;\n } else {\n result += char;\n }\n }\n return `${result}\"`;\n}\n\nfunction encodeNumber(value: number): string {\n if (Number.isNaN(value)) {\n return 'NaN';\n }\n if (!Number.isFinite(value)) {\n return value > 0 ? 'Infinity' : '-Infinity';\n }\n // JS numbers lose Python's int/float distinction: integral values print\n // as ints (BigInt avoids exponent notation for large ones).\n return Number.isInteger(value)\n ? BigInt(value).toString()\n : pyFloatRepr(value);\n}\n\nfunction isPlainObject(value: object): value is Record<string, unknown> {\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction typeName(value: unknown): string {\n if (typeof value === 'object' && value !== null) {\n return value.constructor?.name ?? 'object';\n }\n return typeof value;\n}\n\n/** Python's `json.dumps(value, separators=, default=, indent=, ensure_ascii=)`. */\nexport function pyJsonDumps(\n value: unknown,\n options: PyJsonDumpsOptions = {},\n): string {\n const indent = options.indent ?? null;\n // With an indent, Python's default item separator has no trailing space.\n const [itemSeparator, keySeparator] =\n options.separators ?? (indent === null ? [', ', ': '] : [',', ': ']);\n const encodeText =\n (options.ensureAscii ?? true) ? encodeString : encodeStringUnicode;\n // A scalar's JSON text, or the entries of the container to open, each with\n // its key prefix (`\"key\": `, empty in an array).\n const encodeScalar = (item: unknown): string | OpenContainer => {\n let current = item;\n for (;;) {\n if (current === null || current === undefined) {\n return 'null';\n }\n if (current === true) {\n return 'true';\n }\n if (current === false) {\n return 'false';\n }\n if (typeof current === 'string') {\n return encodeText(current);\n }\n if (typeof current === 'number') {\n return options.nonFiniteAsNull && !Number.isFinite(current)\n ? 'null'\n : encodeNumber(current);\n }\n if (typeof current === 'bigint') {\n return current.toString();\n }\n if (current instanceof PyJsonNumber) {\n return options.nonFiniteAsNull && NON_FINITE_TEXTS.has(current.text)\n ? 'null'\n : current.text;\n }\n if (Array.isArray(current)) {\n return {\n close: ']',\n entries: current.map((entry): [string, unknown] => ['', entry]),\n index: 0,\n open: '[',\n };\n }\n if (typeof current === 'object' && isPlainObject(current)) {\n return {\n close: '}',\n entries: Object.entries(current).map(\n ([key, entry]): [string, unknown] => [\n `${encodeText(key)}${keySeparator}`,\n entry,\n ],\n ),\n index: 0,\n open: '{',\n };\n }\n if (options.default === undefined) {\n throw new PyTypeError(\n `Object of type ${typeName(current)} is not JSON serializable`,\n );\n }\n current = options.default(current);\n }\n };\n // Written in one pass to a list of pieces, with an explicit stack of open\n // containers: linear in the output, and data nested deeper than the call\n // stack allows is still encoded.\n const out: string[] = [];\n const stack: OpenContainer[] = [];\n const newline = (depth: number): void => {\n if (indent !== null) {\n out.push(`\\n${' '.repeat(indent * depth)}`);\n }\n };\n const write = (encoded: string | OpenContainer): void => {\n if (typeof encoded === 'string') {\n out.push(encoded);\n } else if (encoded.entries.length === 0) {\n out.push(`${encoded.open}${encoded.close}`);\n } else {\n out.push(encoded.open);\n stack.push(encoded);\n }\n };\n write(encodeScalar(value));\n for (let frame = stack.at(-1); frame; frame = stack.at(-1)) {\n const entry = frame.entries[frame.index];\n if (entry === undefined) {\n stack.pop();\n newline(stack.length);\n out.push(frame.close);\n continue;\n }\n if (frame.index > 0) {\n out.push(itemSeparator);\n }\n frame.index += 1;\n newline(stack.length);\n out.push(entry[0]);\n write(encodeScalar(entry[1]));\n }\n return out.join('');\n}\n\n/** A container {@link pyJsonDumps} is writing: its children with key prefixes. */\ninterface OpenContainer {\n open: string;\n close: string;\n entries: [prefix: string, child: unknown][];\n /** The next child to write. */\n index: number;\n}\n\n/** `JSON.rawJSON()` (Node ≥ 21, Bun, Deno); the ES2026 lib isn't enabled. */\nconst JSON_WITH_RAW = JSON as JSON & {\n rawJSON: (text: string) => unknown;\n};\n\n/**\n * A copy of `value` that `JSON.stringify()` serializes like Python's\n * `json.dumps()` writes ints: every `bigint` (and `PyJsonNumber`) becomes a\n * `JSON.rawJSON()` exact integer, where `JSON.stringify()` would throw on a\n * bigint. For payloads that SDKs serialize themselves (Elasticsearch,\n * OpenSearch, Azure Log Analytics). Arrays and plain objects are copied;\n * other values are kept as they are.\n */\nexport function rawJsonIntegers(value: unknown): unknown {\n if (typeof value === 'bigint') {\n return JSON_WITH_RAW.rawJSON(value.toString());\n }\n if (value instanceof PyJsonNumber) {\n return JSON_WITH_RAW.rawJSON(value.text);\n }\n if (Array.isArray(value)) {\n return value.map(item => rawJsonIntegers(item));\n }\n if (typeof value === 'object' && value !== null && isPlainObject(value)) {\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n setOwn(result, key, rawJsonIntegers(item));\n }\n return result;\n }\n return value;\n}\n","// Bounded-window parallel report parsing with worker threads, ported from\n// parsedmarc/parallel.py (which uses a ProcessPoolExecutor).\n//\n// A function can't be sent to a worker, so a task names it: one of the\n// built-in jobs below, or an export of a module the worker imports (the\n// counterpart of pickling a module-level function by name). A config is\n// sent as `parserConfigToState()` and rebuilt with `parserConfigFromState()`\n// in the worker, so its caches never cross threads (Python's\n// `__getstate__`/`__setstate__`); each worker uses its own module-default\n// caches. A loaded reverse DNS map, the selected IP database, the IPinfo\n// token and the PSL overrides are copied to each worker (see\n// `WorkerSharedState`).\n//\n// Values crossing threads are structured-cloned. Errors and `PyDateTime`\n// values lose their class in a structured clone, and objects lose the\n// raw-data brands of `serialize.ts` (non-enumerable symbols), so all three\n// are encoded and rebuilt on the other side.\n\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { type ResourceLimits, Worker } from 'node:worker_threads';\n\nimport {\n type ParserConfig,\n type ParserOptions,\n parserConfigFromState,\n parserConfigToState,\n} from './config';\nimport {\n DownloadError,\n EmailParserError,\n EmailTooLargeError,\n EnrichmentError,\n InvalidAggregateReport,\n InvalidDMARCReport,\n InvalidFailureReport,\n InvalidIPinfoAPIKey,\n InvalidSMTPTLSReport,\n IPDatabaseError,\n ParserError,\n} from './errors';\nimport { configureLogging, FileHandler, logger } from './log';\nimport { getRawMarks, type RawMarks, restoreRawMarks } from './serialize';\nimport type { ReverseDNSService } from './types';\nimport { PyDateTime } from './utils/datetime';\nimport { pslOverrides } from './utils/domains';\nimport { ValueError } from './utils/email';\nimport { ipInfoState } from './utils/ip-info';\n\n/**\n * Pool initializer (parsedmarc's `_init_worker`): restore the parent's\n * lookup context in a worker, which starts with fresh modules. The IP\n * database path, IPinfo API token and PSL overrides (and, unlike\n * parsedmarc, a loaded reverse DNS map) come from `shared`, so enrichment\n * matches what the main thread configured; then the parent's logging is\n * rebuilt, so records logged while parsing in a worker are not dropped.\n */\nexport function initWorker(\n logLevel: number,\n logFiles: readonly string[],\n shared: WorkerSharedState,\n reverseDnsMap: Map<string, ReverseDNSService>,\n): void {\n applyWorkerSharedState(shared, reverseDnsMap);\n if (logFiles.length === 0) {\n configureLogging(logLevel, null);\n return;\n }\n for (const logFile of logFiles) {\n configureLogging(logLevel, logFile);\n }\n}\n\n/** Options passed to a job function when its task carries a config. */\nexport interface ParallelJobOptions {\n config: ParserConfig;\n}\n\n/** What a worker runs for each job: `fn(job)` or `fn(job, { config })`. */\nexport interface ParallelTask {\n /**\n * URL or absolute path of an ES module exporting the function. Omit to\n * use a built-in job: `parseReportEmailJob` or `parseReportFileJob`.\n */\n module?: string | URL | null;\n /** Name of the exported function. */\n name: string;\n /** Parser config; rebuilt in the worker and passed as `{ config }`. */\n config?: ParserConfig | null;\n}\n\n/** Task running `parseReportEmailJob` (report-email.ts) with `config`. */\nexport function parseReportEmailTask(config: ParserConfig): ParallelTask {\n return { name: 'parseReportEmailJob', config };\n}\n\n/** Task running `parseReportFileJob` (report-file.ts) with `config`. */\nexport function parseReportFileTask(config: ParserConfig): ParallelTask {\n return { name: 'parseReportFileJob', config };\n}\n\n/** A task as sent to a worker. */\nexport interface WireTask {\n module: string | null;\n name: string;\n configState: ParserOptions | null;\n}\n\nfunction toWireTask(task: ParallelTask): WireTask {\n return {\n module: task.module ? String(task.module) : null,\n name: task.name,\n configState: task.config ? parserConfigToState(task.config) : null,\n };\n}\n\n/** Job functions by name. */\nexport type JobRegistry = Readonly<Record<string, unknown>>;\n\n/**\n * Run one job in this thread, as a worker does. `builtins` holds the jobs a\n * task can name without a module.\n */\nexport async function runWireTask(\n task: WireTask,\n job: unknown,\n builtins: JobRegistry,\n): Promise<unknown> {\n let fn: unknown;\n if (task.module === null) {\n fn = Object.hasOwn(builtins, task.name) ? builtins[task.name] : undefined;\n } else {\n const specifier = path.isAbsolute(task.module)\n ? pathToFileURL(task.module).href\n : task.module;\n const imported = (await import(specifier)) as Record<string, unknown>;\n fn = imported[task.name];\n }\n if (typeof fn !== 'function') {\n throw new TypeError(\n `${task.module ?? 'tsdmarc'} has no job function named ${task.name}`,\n );\n }\n const run = fn as (job: unknown, options?: ParallelJobOptions) => unknown;\n if (task.configState === null) {\n return run(job);\n }\n return run(job, { config: parserConfigFromState(task.configState) });\n}\n\n// --- Module state across threads --------------------------------------------\n\n/**\n * Module-level enrichment state the main thread may have set up before\n * parsing in parallel (the IP database `loadIpDb()` chose, the IPinfo API\n * token, PSL overrides loaded from a URL or file, a loaded reverse DNS\n * map). A worker starts with fresh modules, so it gets a copy: otherwise it\n * would use the bundled IP database, no IPinfo API, the bundled overrides\n * and download the map again. parsedmarc's forkserver workers start fresh\n * too and have the same gap.\n */\nexport interface WorkerSharedState {\n ipDbPath: string | null;\n ipinfoApiToken: string | null;\n pslOverrides: string[];\n /** Entries of the task config's reverse DNS map, when it is loaded. */\n reverseDnsMap: [string, ReverseDNSService][] | null;\n}\n\n/** Snapshot the state to hand to workers running a task with `config`. */\nexport function captureWorkerSharedState(\n config: ParserConfig | null | undefined,\n): WorkerSharedState {\n const map = config?.reverseDnsMap;\n return {\n ipDbPath: ipInfoState.ipDbPath,\n ipinfoApiToken: ipInfoState.ipinfoApiToken,\n pslOverrides: [...pslOverrides],\n reverseDnsMap: map && map.size > 0 ? [...map] : null,\n };\n}\n\n/**\n * Install a snapshot from {@link captureWorkerSharedState} in this thread;\n * the reverse DNS map entries go into `reverseDnsMap` (the module default\n * that `parserConfigFromState()` binds).\n */\nexport function applyWorkerSharedState(\n state: WorkerSharedState,\n reverseDnsMap: Map<string, ReverseDNSService>,\n): void {\n if (state.ipDbPath !== null) {\n ipInfoState.ipDbPath = state.ipDbPath;\n }\n ipInfoState.ipinfoApiToken = state.ipinfoApiToken;\n pslOverrides.splice(0, pslOverrides.length, ...state.pslOverrides);\n if (state.reverseDnsMap !== null) {\n reverseDnsMap.clear();\n for (const [key, value] of state.reverseDnsMap) {\n reverseDnsMap.set(key, value);\n }\n }\n}\n\n// --- Values across threads -------------------------------------------------\n\nconst ERROR_CLASSES: Readonly<Record<string, new (message: string) => Error>> =\n {\n DownloadError,\n EmailParserError,\n EmailTooLargeError,\n EnrichmentError,\n InvalidAggregateReport,\n InvalidDMARCReport,\n InvalidFailureReport,\n InvalidIPinfoAPIKey,\n InvalidSMTPTLSReport,\n IPDatabaseError,\n ParserError,\n RangeError,\n TypeError,\n ValueError,\n };\n\nconst MAX_CAUSE_DEPTH = 5;\n\n/** An error flattened for a structured clone. */\nexport interface EncodedError {\n name: string;\n message: string;\n stack: string | null;\n cause: EncodedError | null;\n code: string | null;\n}\n\n/**\n * An `Error` or `PyDateTime` found inside a value, or the raw-data brands\n * of an object in it, by path.\n */\ninterface SpecialValue {\n path: (string | number)[];\n error?: EncodedError;\n datetime?: ReturnType<PyDateTime['fields']>;\n rawMarks?: RawMarks;\n}\n\n/** A value ready for `postMessage`, with errors and datetimes encoded. */\nexport interface EncodedValue {\n value: unknown;\n specials: SpecialValue[];\n}\n\nexport function encodeError(error: unknown, depth = 0): EncodedError {\n if (!(error instanceof Error)) {\n return {\n name: 'Error',\n message: String(error),\n stack: null,\n cause: null,\n code: null,\n };\n }\n const code = (error as { code?: unknown }).code;\n return {\n name: error.name,\n message: error.message,\n stack: error.stack ?? null,\n cause:\n error.cause !== undefined && depth < MAX_CAUSE_DEPTH\n ? encodeError(error.cause, depth + 1)\n : null,\n code: typeof code === 'string' ? code : null,\n };\n}\n\nexport function decodeError(encoded: EncodedError): Error {\n const ErrorClass = Object.hasOwn(ERROR_CLASSES, encoded.name)\n ? ERROR_CLASSES[encoded.name]\n : undefined;\n const error = ErrorClass\n ? new ErrorClass(encoded.message)\n : new Error(encoded.message);\n if (error.name !== encoded.name) {\n error.name = encoded.name;\n }\n if (encoded.stack !== null) {\n error.stack = encoded.stack;\n }\n if (encoded.cause !== null) {\n error.cause = decodeError(encoded.cause);\n }\n if (encoded.code !== null) {\n (error as { code?: string }).code = encoded.code;\n }\n return error;\n}\n\nfunction findSpecials(\n value: unknown,\n path: (string | number)[],\n specials: SpecialValue[],\n): void {\n if (value instanceof Error) {\n specials.push({ path: [...path], error: encodeError(value) });\n return;\n }\n if (value instanceof PyDateTime) {\n specials.push({ path: [...path], datetime: value.fields() });\n return;\n }\n if (typeof value === 'object' && value !== null) {\n const rawMarks = getRawMarks(value);\n if (rawMarks !== null) {\n specials.push({ path: [...path], rawMarks });\n }\n }\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) {\n path.push(index);\n findSpecials(item, path, specials);\n path.pop();\n }\n return;\n }\n if (\n typeof value === 'object' &&\n value !== null &&\n !ArrayBuffer.isView(value)\n ) {\n if (value instanceof Map) {\n return;\n }\n for (const [key, item] of Object.entries(value)) {\n path.push(key);\n findSpecials(item, path, specials);\n path.pop();\n }\n }\n}\n\n/** Encode a value for `postMessage`. */\nexport function encodeValue(value: unknown): EncodedValue {\n const specials: SpecialValue[] = [];\n findSpecials(value, [], specials);\n return { value, specials };\n}\n\nfunction valueAt(root: unknown, valuePath: (string | number)[]): unknown {\n let current = root;\n for (const key of valuePath) {\n current = (current as Record<string | number, unknown>)[key];\n }\n return current;\n}\n\n/** Rebuild a value received from `postMessage`. */\nexport function decodeValue(encoded: EncodedValue): unknown {\n let { value } = encoded;\n for (const special of encoded.specials) {\n if (special.rawMarks) {\n const target = valueAt(value, special.path);\n if (typeof target === 'object' && target !== null) {\n restoreRawMarks(target, special.rawMarks);\n }\n continue;\n }\n let rebuilt: unknown;\n if (special.error) {\n rebuilt = decodeError(special.error);\n } else if (special.datetime) {\n rebuilt = new PyDateTime(special.datetime);\n } else {\n continue;\n }\n if (special.path.length === 0) {\n value = rebuilt;\n continue;\n }\n let parent = value as Record<string | number, unknown>;\n for (const key of special.path.slice(0, -1)) {\n parent = parent[key] as Record<string | number, unknown>;\n }\n const last = special.path.at(-1) as string | number;\n parent[last] = rebuilt;\n }\n return value;\n}\n\n// --- Worker pool -------------------------------------------------------------\n\n/** Data each worker starts with. */\nexport interface WorkerInit {\n logLevel: number;\n logFiles: string[];\n task: WireTask;\n shared: WorkerSharedState;\n}\n\n/** Messages from the parent to a worker. */\nexport type ToWorkerMessage =\n | { type: 'run'; id: number; job: unknown }\n | { type: 'close' };\n\n/** Messages from a worker to the parent. */\nexport type FromWorkerMessage =\n | { type: 'ready' }\n | { type: 'result'; id: number; ok: true; value: EncodedValue }\n | { type: 'result'; id: number; ok: false; error: EncodedError };\n\n/**\n * Python's `concurrent.futures.process.BrokenProcessPool`: the pool can't\n * run jobs at all (a worker failed while starting).\n */\nexport class BrokenProcessPool extends Error {\n override name = 'BrokenProcessPool';\n}\n\n/**\n * A worker thread died while running a job (over its heap limit,\n * `process.exit()` or an uncaught error outside the job's promise). Only\n * that job fails; the worker is replaced. parsedmarc's process pool breaks\n * for good instead (`BrokenProcessPool`). It says nothing about the job's\n * content: the heap also holds what the worker kept from earlier jobs.\n */\nexport class WorkerCrashedError extends Error {\n override name = 'WorkerCrashedError';\n}\n\n/** A job ran longer than `jobTimeout`; its worker was stopped and replaced. */\nexport class JobTimeoutError extends Error {\n override name = 'JobTimeoutError';\n}\n\nconst BROKEN_POOL_MESSAGE =\n 'A process in the process pool was terminated abruptly while the future was running or pending.';\n\nconst isSourceModule = import.meta.url.endsWith('.ts');\n\n/** Node can't resolve the extensionless imports of `src/` on its own. */\nconst SOURCE_BOOTSTRAP = `\nconst { registerHooks } = require('node:module');\nconst { workerData } = require('node:worker_threads');\nregisterHooks({\n resolve(specifier, context, nextResolve) {\n try {\n return nextResolve(specifier, context);\n } catch (error) {\n const relative = specifier.startsWith('./') || specifier.startsWith('../');\n if (relative && context.parentURL && context.parentURL.endsWith('.ts')) {\n return nextResolve(specifier + '.ts', context);\n }\n throw error;\n }\n },\n});\nimport(workerData.entry);\n`;\n\n/**\n * The worker entry next to the `src/` module. Held in a variable so\n * bundlers don't pick it up as an asset: only `dist/` ships, without it.\n */\nconst SOURCE_WORKER_ENTRY = './parallel-worker.ts';\n\nfunction createWorker(init: WorkerInit, limits: ResourceLimits | null): Worker {\n const resourceLimits = limits === null ? {} : { resourceLimits: limits };\n if (isSourceModule) {\n const entry = new URL(SOURCE_WORKER_ENTRY, import.meta.url);\n const runsTypeScriptNatively = 'Bun' in globalThis || 'Deno' in globalThis;\n if (runsTypeScriptNatively) {\n return new Worker(entry, { workerData: init, ...resourceLimits });\n }\n return new Worker(SOURCE_BOOTSTRAP, {\n eval: true,\n workerData: { ...init, entry: entry.href },\n ...resourceLimits,\n });\n }\n // Inline `new Worker(new URL('./x.js', import.meta.url))`: the only form\n // bundlers (Vite, webpack, Rollup plugins, esbuild) rewrite to the\n // emitted worker file.\n return new Worker(new URL('./parallel-worker.js', import.meta.url), {\n workerData: init,\n ...resourceLimits,\n });\n}\n\ninterface PoolTask {\n id: number;\n job: unknown;\n state: 'queued' | 'running' | 'done' | 'cancelled';\n promise: Promise<unknown>;\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n}\n\ninterface PoolWorker {\n worker: Worker;\n current: PoolTask | null;\n /** The worker finished starting (posted `ready`). */\n ready: boolean;\n /** The worker exited, failed or was stopped; its later events are ignored. */\n gone: boolean;\n timer: ReturnType<typeof setTimeout> | null;\n}\n\nconst MS_PER_SECOND = 1000;\n\n/** Upper bound of a worker's young generation, in MiB. */\nconst MAX_YOUNG_GENERATION_MB = 32;\n/** The young generation is at most this fraction of the old generation. */\nconst YOUNG_GENERATION_DIVISOR = 4;\n\n/**\n * The young generation size for a worker whose old generation is limited to\n * `maxWorkerHeapMb`. Without it, Node picks its own default (192 MiB on Node\n * 24, 96 MiB on Node 26), larger than a small old generation: when V8 then\n * promotes a full young generation it runs out of room before Node can stop\n * the worker, and the whole process dies with \"Reached heap limit\" instead of\n * the worker failing with ERR_WORKER_OUT_OF_MEMORY. Seen on Node 24 under\n * load; a bounded young generation keeps the failure inside the worker.\n */\nexport function youngGenerationMb(maxWorkerHeapMb: number): number {\n return Math.max(\n 1,\n Math.min(\n MAX_YOUNG_GENERATION_MB,\n Math.floor(maxWorkerHeapMb / YOUNG_GENERATION_DIVISOR),\n ),\n );\n}\n\nclass WorkerPool {\n private readonly size: number;\n private readonly init: WorkerInit;\n private readonly jobTimeoutMs: number | null;\n private readonly resourceLimits: ResourceLimits | null;\n private readonly workers: PoolWorker[] = [];\n private readonly queue: PoolTask[] = [];\n private nextId = 0;\n private broken: Error | null = null;\n private closing = false;\n\n constructor(\n size: number,\n init: WorkerInit,\n jobTimeout: number | null,\n maxWorkerHeapMb: number | null,\n ) {\n this.size = size;\n this.init = init;\n this.jobTimeoutMs =\n jobTimeout !== null && jobTimeout > 0 ? jobTimeout * MS_PER_SECOND : null;\n this.resourceLimits =\n maxWorkerHeapMb !== null && maxWorkerHeapMb > 0\n ? {\n maxOldGenerationSizeMb: maxWorkerHeapMb,\n maxYoungGenerationSizeMb: youngGenerationMb(maxWorkerHeapMb),\n }\n : null;\n }\n\n submit(job: unknown): PoolTask {\n let resolve!: (value: unknown) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<unknown>((resolvePromise, rejectPromise) => {\n resolve = resolvePromise;\n reject = rejectPromise;\n });\n // Rejections are observed when the task is harvested.\n promise.catch(() => undefined);\n const task: PoolTask = {\n id: this.nextId,\n job,\n state: 'queued',\n promise,\n resolve,\n reject,\n };\n this.nextId += 1;\n if (this.broken) {\n task.state = 'done';\n reject(this.broken);\n return task;\n }\n this.queue.push(task);\n this.dispatch();\n return task;\n }\n\n private dispatch(): void {\n while (this.queue.length > 0 && !this.broken && !this.closing) {\n let idle = this.workers.find(entry => entry.current === null);\n if (!idle && this.workers.length < this.size) {\n idle = this.spawn();\n }\n if (!idle) {\n return;\n }\n const task = this.queue.shift() as PoolTask;\n task.state = 'running';\n idle.current = task;\n if (idle.ready) {\n this.startTimer(idle);\n }\n const message: ToWorkerMessage = {\n type: 'run',\n id: task.id,\n job: task.job,\n };\n // oxlint-disable-next-line unicorn/require-post-message-target-origin -- a worker thread, not a window.\n idle.worker.postMessage(message);\n }\n }\n\n private spawn(): PoolWorker {\n const entry: PoolWorker = {\n worker: createWorker(this.init, this.resourceLimits),\n current: null,\n ready: false,\n gone: false,\n timer: null,\n };\n entry.worker.on('message', (message: FromWorkerMessage) => {\n if (message.type === 'ready') {\n entry.ready = true;\n // A job sent while the worker was starting is timed from now.\n this.startTimer(entry);\n return;\n }\n const task = entry.current;\n if (entry.gone || task === null || task.id !== message.id) {\n return;\n }\n this.release(entry);\n task.state = 'done';\n if (message.ok) {\n task.resolve(decodeValue(message.value));\n } else {\n task.reject(decodeError(message.error));\n }\n this.dispatch();\n });\n entry.worker.on('error', error => {\n this.workerFailed(entry, error);\n });\n entry.worker.on('exit', code => {\n if (this.closing && entry.current === null) {\n this.remove(entry);\n return;\n }\n this.workerFailed(\n entry,\n new Error(`Worker thread exited with code ${String(code)}`),\n );\n });\n this.workers.push(entry);\n return entry;\n }\n\n /** Start the `jobTimeout` timer of a worker's current task. */\n private startTimer(entry: PoolWorker): void {\n const task = entry.current;\n if (this.jobTimeoutMs === null || task === null || entry.timer !== null) {\n return;\n }\n entry.timer = setTimeout(() => {\n this.timeOut(entry, task);\n }, this.jobTimeoutMs);\n }\n\n /** Clear a worker's current task and its timer. */\n private release(entry: PoolWorker): void {\n if (entry.timer !== null) {\n clearTimeout(entry.timer);\n entry.timer = null;\n }\n entry.current = null;\n }\n\n private remove(entry: PoolWorker): void {\n entry.gone = true;\n const index = this.workers.indexOf(entry);\n if (index !== -1) {\n this.workers.splice(index, 1);\n }\n }\n\n /**\n * A worker died. Before it finished starting, the pool is unusable\n * (Python's `BrokenProcessPool`); after, only its running job fails and a\n * new worker takes over the queue.\n */\n private workerFailed(entry: PoolWorker, cause: unknown): void {\n if (entry.gone) {\n return;\n }\n const task = entry.current;\n this.release(entry);\n this.remove(entry);\n if (!entry.ready) {\n this.breakPool(cause, task);\n return;\n }\n if (task !== null) {\n task.state = 'done';\n task.reject(\n new WorkerCrashedError(\n 'A worker thread terminated abruptly while running this job',\n { cause },\n ),\n );\n }\n this.dispatch();\n }\n\n private timeOut(entry: PoolWorker, task: PoolTask): void {\n if (entry.gone || entry.current !== task) {\n return;\n }\n this.release(entry);\n this.remove(entry);\n void entry.worker.terminate();\n task.state = 'done';\n task.reject(\n new JobTimeoutError(\n `Job did not finish within ${String((this.jobTimeoutMs ?? 0) / MS_PER_SECOND)} seconds`,\n ),\n );\n this.dispatch();\n }\n\n private breakPool(cause: unknown, failedTask: PoolTask | null): void {\n if (this.broken) {\n return;\n }\n this.broken = new BrokenProcessPool(BROKEN_POOL_MESSAGE, { cause });\n if (failedTask !== null) {\n failedTask.state = 'done';\n failedTask.reject(this.broken);\n }\n for (const entry of this.workers) {\n if (entry.current) {\n entry.current.state = 'done';\n entry.current.reject(this.broken);\n this.release(entry);\n }\n }\n for (const task of this.queue.splice(0)) {\n task.state = 'done';\n task.reject(this.broken);\n }\n void this.terminate();\n }\n\n /** Cancel tasks that have not started (`cancel_futures=True`). */\n cancelQueued(): void {\n for (const task of this.queue.splice(0)) {\n task.state = 'cancelled';\n task.resolve(undefined);\n }\n }\n\n /** Let idle workers exit; wait for them. */\n async close(): Promise<void> {\n this.closing = true;\n this.cancelQueued();\n await Promise.all(\n this.workers.map(\n entry =>\n new Promise<void>(resolve => {\n entry.worker.once('exit', () => resolve());\n const message: ToWorkerMessage = { type: 'close' };\n // oxlint-disable-next-line unicorn/require-post-message-target-origin -- a worker thread, not a window.\n entry.worker.postMessage(message);\n }),\n ),\n );\n }\n\n /** Stop every worker now, abandoning running tasks. */\n async terminate(): Promise<void> {\n this.closing = true;\n this.cancelQueued();\n const workers = [...this.workers];\n for (const entry of workers) {\n this.release(entry);\n }\n await Promise.all(workers.map(entry => entry.worker.terminate()));\n }\n}\n\n/** Options of {@link parallelMap}. */\nexport interface ParallelMapOptions<J = unknown, R = unknown> {\n /** Jobs submitted ahead of the oldest unfinished one, per worker. */\n windowFactor?: number;\n /**\n * Called every `heartbeatInterval` seconds spent waiting for a result. If\n * it throws, the iteration ends with that error: the jobs did not fail,\n * so `onJobError` doesn't see it.\n */\n heartbeat?: (() => unknown) | null;\n /** Seconds between heartbeats (default 30). */\n heartbeatInterval?: number;\n /**\n * Checked after each result; when it returns true, queued jobs are\n * cancelled, running ones are awaited and yielded, and iteration ends.\n */\n shouldStop?: (() => boolean | Promise<boolean>) | null;\n /**\n * Turns a failed job into a result instead of ending the iteration: an\n * error the job threw, a {@link WorkerCrashedError} or a\n * {@link JobTimeoutError}. Not called for {@link BrokenProcessPool}\n * (workers that can't start), which still ends the iteration.\n */\n onJobError?: ((error: unknown, job: J) => R) | null;\n /**\n * Seconds a job may run before its worker is stopped and the job fails\n * with {@link JobTimeoutError}, counted once the worker has started.\n * `null` or `0`: no limit. Default: `jobTimeout` of the task's config,\n * else no limit.\n */\n jobTimeout?: number | null;\n /**\n * Heap limit of each worker, in MiB. A worker over it dies, which fails\n * its job with a {@link WorkerCrashedError}. `null` or `0`: the runtime's\n * limit. Default: `maxWorkerHeapMb` of the task's config, else no limit.\n */\n maxWorkerHeapMb?: number | null;\n}\n\nfunction iterate<J>(\n jobs: Iterable<J> | AsyncIterable<J>,\n): AsyncIterator<J> | Iterator<J> {\n if (Symbol.asyncIterator in jobs) {\n return (jobs as AsyncIterable<J>)[Symbol.asyncIterator]();\n }\n return (jobs as Iterable<J>)[Symbol.iterator]();\n}\n\nfunction sleep(seconds: number): {\n promise: Promise<'timeout'>;\n cancel: () => void;\n} {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const promise = new Promise<'timeout'>(resolve => {\n timer = setTimeout(() => resolve('timeout'), seconds * 1000);\n });\n return { promise, cancel: () => clearTimeout(timer) };\n}\n\n/** Wait until `task` settles, sending heartbeats. Only a heartbeat can throw. */\nasync function waitFor(\n task: PoolTask,\n heartbeat: () => unknown,\n heartbeatInterval: number,\n): Promise<void> {\n for (;;) {\n const timer = sleep(heartbeatInterval);\n const outcome = await Promise.race([\n task.promise.then(\n () => 'done' as const,\n () => 'done' as const,\n ),\n timer.promise,\n ]);\n timer.cancel();\n if (outcome === 'done') {\n return;\n }\n await heartbeat();\n }\n}\n\n/**\n * Map a task over `jobs` with a bounded pool of `nProcs` worker threads\n * (parsedmarc's `parallel_map`).\n *\n * `jobs` is consumed lazily: at most `windowFactor * nProcs` jobs are\n * submitted ahead of the oldest unfinished one. Results come back in\n * submission order. No worker is started when `jobs` is empty. A job that\n * throws, or whose worker dies ({@link WorkerCrashedError}) or runs past\n * `jobTimeout` ({@link JobTimeoutError}), makes the iteration throw at its\n * position, unless `onJobError` turns it into a result. A dead worker is\n * replaced; only a worker that fails while starting breaks the pool\n * ({@link BrokenProcessPool}). parsedmarc's process pool breaks on any\n * dead worker.\n *\n * Throws {@link ValueError} right away when `nProcs` is less than 1.\n */\nexport function parallelMap<J, R>(\n task: ParallelTask,\n jobs: Iterable<J> | AsyncIterable<J>,\n nProcs: number,\n options: ParallelMapOptions<J, R> = {},\n): AsyncGenerator<R> {\n if (nProcs < 1) {\n throw new ValueError(`n_procs must be at least 1, got ${nProcs}`);\n }\n return generate<J, R>(task, jobs, nProcs, options);\n}\n\nasync function* generate<J, R>(\n task: ParallelTask,\n jobs: Iterable<J> | AsyncIterable<J>,\n nProcs: number,\n options: ParallelMapOptions<J, R>,\n): AsyncGenerator<R> {\n const {\n windowFactor = 2,\n heartbeat = null,\n heartbeatInterval = 30,\n shouldStop = null,\n onJobError = null,\n jobTimeout = task.config?.jobTimeout ?? null,\n maxWorkerHeapMb = task.config?.maxWorkerHeapMb ?? null,\n } = options;\n const iterator = iterate(jobs);\n const pull = async (): Promise<IteratorResult<J>> => iterator.next();\n\n const first = await pull();\n if (first.done) {\n return;\n }\n\n const logFiles = logger.handlers\n .filter(handler => handler instanceof FileHandler)\n .map(handler => (handler as FileHandler).baseFilename);\n const pool = new WorkerPool(\n nProcs,\n {\n logLevel: logger.getEffectiveLevel(),\n logFiles,\n task: toWireTask(task),\n shared: captureWorkerSharedState(task.config),\n },\n jobTimeout,\n maxWorkerHeapMb,\n );\n const settle = async (poolTask: PoolTask, wait: boolean): Promise<R> => {\n if (wait && heartbeat !== null) {\n await waitFor(poolTask, heartbeat, heartbeatInterval);\n }\n try {\n return (await poolTask.promise) as R;\n } catch (error) {\n if (onJobError === null || error instanceof BrokenProcessPool) {\n throw error;\n }\n return onJobError(error, poolTask.job as J);\n }\n };\n const windowSize = Math.max(windowFactor * nProcs, 1);\n let finished = false;\n try {\n const window: PoolTask[] = [pool.submit(first.value)];\n while (window.length < windowSize) {\n const next = await pull();\n if (next.done) {\n break;\n }\n window.push(pool.submit(next.value));\n }\n\n while (window.length > 0) {\n const oldest = window.shift() as PoolTask;\n yield await settle(oldest, true);\n\n if (shouldStop !== null && (await shouldStop())) {\n pool.cancelQueued();\n for (const remaining of window) {\n if (remaining.state !== 'cancelled') {\n yield await settle(remaining, false);\n }\n }\n break;\n }\n\n const next = await pull();\n if (!next.done) {\n window.push(pool.submit(next.value));\n }\n }\n finished = true;\n } finally {\n if (finished) {\n await pool.close();\n } else {\n await pool.terminate();\n }\n }\n}\n","// Python's `json.loads()` for text, ported from CPython 3.14's scanner\n// (Modules/_json.c and Lib/json/decoder.py). Unlike `JSON.parse`, it accepts\n// `NaN`/`Infinity`, and its `JSONDecodeError` messages and positions match\n// Python's, which end up in parsedmarc's error messages\n// (e.g. `Expecting value: line 1 column 1 (char 0)`).\n//\n// The scan is iterative (an explicit stack), so deeply nested input cannot\n// overflow the call stack. Integers beyond 2^53 lose precision, as any JS\n// number does, unless `exactNumbers` keeps them as `PyJsonNumber`s or\n// `bigIntegers` as `bigint`s. Integer literals over Python's 4300 digits raise\n// its ValueError in every mode. Unlike Python, any nesting depth is accepted\n// unless `maxDepth` is set (Python raises RecursionError at a depth that\n// depends on the stack). Every open container costs about 80 bytes of heap, so\n// `maxDepth` is needed on untrusted text: it stops the scan, not just the\n// result.\n\nimport { pyFloatRepr } from '../utils/python';\nimport { PY_INT_MAX_STR_DIGITS } from '../utils/timestamps';\nimport { intDigitsError } from './py';\nimport { PyJsonNumber } from './py-json';\nimport { setOwn } from './set-own';\n\n/** Python's `json.JSONDecodeError` (a `ValueError`). */\nexport class JSONDecodeError extends Error {\n override name = 'JSONDecodeError';\n readonly msg: string;\n readonly doc: string;\n readonly pos: number;\n readonly lineno: number;\n readonly colno: number;\n\n constructor(msg: string, doc: string, pos: number) {\n let lineno = 1;\n let lastNewline = -1;\n for (let index = 0; index < pos; index += 1) {\n if (doc.charCodeAt(index) === 0x0a) {\n lineno += 1;\n lastNewline = index;\n }\n }\n const colno = pos - lastNewline;\n super(`${msg}: line ${lineno} column ${colno} (char ${pos})`);\n this.msg = msg;\n this.doc = doc;\n this.pos = pos;\n this.lineno = lineno;\n this.colno = colno;\n }\n}\n\n/** The text nests containers deeper than `maxDepth`. Not in Python. */\nexport class JSONDepthError extends Error {\n override name = 'JSONDepthError';\n\n constructor(maxDepth: number) {\n super(`report data nested more than ${maxDepth} levels deep`);\n }\n}\n\n/** Raised by `scanValue` where Python raises StopIteration. */\nclass NoValue {\n readonly pos: number;\n constructor(pos: number) {\n this.pos = pos;\n }\n}\n\nconst NUMBER = /-?(?:0|[1-9]\\d*)(\\.\\d+)?([eE][-+]?\\d+)?/uy;\nconst ESCAPES: Readonly<Record<string, string>> = {\n '\"': '\"',\n '/': '/',\n '\\\\': '\\\\',\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t',\n};\nconst HEX4 = /^[0-9a-fA-F]{4}$/u;\n\nfunction skipWhitespace(text: string, index: number): number {\n let position = index;\n while (position < text.length) {\n const code = text.charCodeAt(position);\n if (code !== 0x20 && code !== 0x09 && code !== 0x0a && code !== 0x0d) {\n break;\n }\n position += 1;\n }\n return position;\n}\n\n/** `scanstring`: `end` is just after the opening quote. */\nfunction scanString(text: string, end: number): [string, number] {\n const begin = end - 1;\n let result = '';\n let position = end;\n for (;;) {\n let chunkEnd = position;\n while (chunkEnd < text.length) {\n const code = text.charCodeAt(chunkEnd);\n if (code === 0x22 || code === 0x5c || code < 0x20) {\n break;\n }\n chunkEnd += 1;\n }\n if (chunkEnd >= text.length) {\n throw new JSONDecodeError('Unterminated string starting at', text, begin);\n }\n result += text.slice(position, chunkEnd);\n const code = text.charCodeAt(chunkEnd);\n if (code === 0x22) {\n return [result, chunkEnd + 1];\n }\n if (code < 0x20) {\n throw new JSONDecodeError('Invalid control character at', text, chunkEnd);\n }\n // Backslash escape.\n const escape = text.charAt(chunkEnd + 1);\n if (escape === '') {\n throw new JSONDecodeError('Unterminated string starting at', text, begin);\n }\n if (escape !== 'u') {\n const decoded = ESCAPES[escape];\n if (decoded === undefined) {\n throw new JSONDecodeError('Invalid \\\\escape', text, chunkEnd);\n }\n result += decoded;\n position = chunkEnd + 2;\n continue;\n }\n const hex = text.slice(chunkEnd + 2, chunkEnd + 6);\n if (!HEX4.test(hex)) {\n throw new JSONDecodeError('Invalid \\\\uXXXX escape', text, chunkEnd + 1);\n }\n let codePoint = Number.parseInt(hex, 16);\n position = chunkEnd + 6;\n if (\n codePoint >= 0xd8_00 &&\n codePoint <= 0xdb_ff &&\n text.slice(position, position + 2) === '\\\\u'\n ) {\n const lowHex = text.slice(position + 2, position + 6);\n if (!HEX4.test(lowHex)) {\n throw new JSONDecodeError('Invalid \\\\uXXXX escape', text, position + 1);\n }\n const low = Number.parseInt(lowHex, 16);\n if (low >= 0xdc_00 && low <= 0xdf_ff) {\n codePoint = 0x1_00_00 + ((codePoint - 0xd8_00) << 10) + (low - 0xdc_00);\n position += 6;\n }\n }\n result += String.fromCodePoint(codePoint);\n }\n}\n\n/** How numbers are returned: JS numbers, `PyJsonNumber`s, or exact ints. */\ntype NumberMode = 'number' | 'exact' | 'bigint';\n\ntype Container =\n | { kind: 'array'; value: unknown[] }\n | { kind: 'object'; value: Record<string, unknown>; key: string };\n\n/** Scan a scalar at `index`, or open a container. */\nfunction scanScalar(\n text: string,\n index: number,\n numbers: NumberMode,\n): { value: unknown; end: number } | { open: '[' | '{'; end: number } {\n const char = text.charAt(index);\n if (char === '') {\n throw new NoValue(index);\n }\n if (char === '\"') {\n const [value, end] = scanString(text, index + 1);\n return { end, value };\n }\n if (char === '{' || char === '[') {\n return { end: index + 1, open: char };\n }\n const literals: [string, unknown][] = [\n ['null', null],\n ['true', true],\n ['false', false],\n ['NaN', Number.NaN],\n ['Infinity', Number.POSITIVE_INFINITY],\n ['-Infinity', Number.NEGATIVE_INFINITY],\n ];\n for (const [literal, value] of literals) {\n if (text.startsWith(literal, index)) {\n return { end: index + literal.length, value };\n }\n }\n NUMBER.lastIndex = index;\n const match = NUMBER.exec(text);\n if (match === null) {\n throw new NoValue(index);\n }\n const isFloat = match[1] !== undefined || match[2] !== undefined;\n if (!isFloat) {\n // Before any conversion: BigInt() is superlinear in the digits.\n const digits = match[0].length - (match[0].startsWith('-') ? 1 : 0);\n if (digits > PY_INT_MAX_STR_DIGITS) {\n throw intDigitsError(digits);\n }\n }\n const value = Number(match[0]);\n if (numbers === 'exact') {\n return {\n end: index + match[0].length,\n value: new PyJsonNumber(\n isFloat ? pyJsonFloatText(value) : BigInt(match[0]).toString(),\n ),\n };\n }\n if (numbers === 'bigint' && !isFloat && !Number.isSafeInteger(value)) {\n return { end: index + match[0].length, value: BigInt(match[0]) };\n }\n return {\n end: index + match[0].length,\n value: Object.is(value, -0) && !isFloat ? 0 : value,\n };\n}\n\n/** Parse one value starting at `index` (`scan_once`), iteratively. */\nfunction scanValue(\n text: string,\n start: number,\n numbers: NumberMode,\n maxDepth: number,\n): [unknown, number] {\n const stack: Container[] = [];\n let index = start;\n let pending: unknown;\n let havePending = false;\n\n for (;;) {\n if (!havePending) {\n const scanned = scanScalar(text, index, numbers);\n index = scanned.end;\n if ('open' in scanned) {\n if (stack.length >= maxDepth) {\n throw new JSONDepthError(maxDepth);\n }\n if (scanned.open === '[') {\n index = skipWhitespace(text, index);\n if (text.charAt(index) === ']') {\n pending = [];\n havePending = true;\n index += 1;\n } else {\n stack.push({ kind: 'array', value: [] });\n }\n continue;\n }\n index = skipWhitespace(text, index);\n if (text.charAt(index) === '}') {\n pending = {};\n havePending = true;\n index += 1;\n continue;\n }\n if (text.charAt(index) !== '\"') {\n throw new JSONDecodeError(\n 'Expecting property name enclosed in double quotes',\n text,\n index,\n );\n }\n const [key, keyEnd] = scanString(text, index + 1);\n index = skipWhitespace(text, keyEnd);\n if (text.charAt(index) !== ':') {\n throw new JSONDecodeError(\"Expecting ':' delimiter\", text, index);\n }\n index = skipWhitespace(text, index + 1);\n stack.push({ key, kind: 'object', value: {} });\n continue;\n }\n pending = scanned.value;\n havePending = true;\n }\n\n const top = stack.at(-1);\n if (top === undefined) {\n return [pending, index];\n }\n havePending = false;\n if (top.kind === 'array') {\n top.value.push(pending);\n index = skipWhitespace(text, index);\n const char = text.charAt(index);\n if (char === ']') {\n stack.pop();\n pending = top.value;\n havePending = true;\n index += 1;\n continue;\n }\n if (char !== ',') {\n throw new JSONDecodeError(\"Expecting ',' delimiter\", text, index);\n }\n const comma = index;\n index = skipWhitespace(text, index + 1);\n if (text.charAt(index) === ']') {\n throw new JSONDecodeError(\n 'Illegal trailing comma before end of array',\n text,\n comma,\n );\n }\n continue;\n }\n\n setOwn(top.value, top.key, pending);\n index = skipWhitespace(text, index);\n const char = text.charAt(index);\n if (char === '}') {\n stack.pop();\n pending = top.value;\n havePending = true;\n index += 1;\n continue;\n }\n if (char !== ',') {\n throw new JSONDecodeError(\"Expecting ',' delimiter\", text, index);\n }\n const comma = index;\n index = skipWhitespace(text, index + 1);\n if (text.charAt(index) === '}') {\n throw new JSONDecodeError(\n 'Illegal trailing comma before end of object',\n text,\n comma,\n );\n }\n if (text.charAt(index) !== '\"') {\n throw new JSONDecodeError(\n 'Expecting property name enclosed in double quotes',\n text,\n index,\n );\n }\n const [key, keyEnd] = scanString(text, index + 1);\n index = skipWhitespace(text, keyEnd);\n if (text.charAt(index) !== ':') {\n throw new JSONDecodeError(\"Expecting ':' delimiter\", text, index);\n }\n index = skipWhitespace(text, index + 1);\n top.key = key;\n }\n}\n\nexport interface PyJsonLoadsOptions {\n /**\n * Return numbers as `PyJsonNumber`s holding the text Python's\n * `json.dumps()` would write back (exact ints, float reprs), for\n * load/dump round trips. Default: false (JS numbers).\n */\n exactNumbers?: boolean;\n /**\n * Return integers beyond ±2^53 as exact `bigint`s; other numbers stay JS\n * numbers. Ignored with `exactNumbers`.\n */\n bigIntegers?: boolean;\n /**\n * Most containers open at once; deeper text raises {@link JSONDepthError}\n * as soon as the scan gets there. Default: no limit.\n */\n maxDepth?: number;\n}\n\n/** A float's text in `json.dumps()`: its `repr`, or `Infinity` on overflow. */\nfunction pyJsonFloatText(value: number): string {\n if (!Number.isFinite(value)) {\n return value > 0 ? 'Infinity' : '-Infinity';\n }\n return pyFloatRepr(value);\n}\n\n/** Python's `json.loads(text)`. */\nexport function pyJsonLoads(\n text: string,\n options: PyJsonLoadsOptions = {},\n): unknown {\n if (text.startsWith('')) {\n throw new JSONDecodeError(\n 'Unexpected UTF-8 BOM (decode using utf-8-sig)',\n text,\n 0,\n );\n }\n const start = skipWhitespace(text, 0);\n let value: unknown;\n let end: number;\n try {\n let numbers: NumberMode = 'number';\n if (options.exactNumbers) {\n numbers = 'exact';\n } else if (options.bigIntegers) {\n numbers = 'bigint';\n }\n [value, end] = scanValue(\n text,\n start,\n numbers,\n options.maxDepth ?? Number.POSITIVE_INFINITY,\n );\n } catch (error) {\n if (error instanceof NoValue) {\n throw new JSONDecodeError('Expecting value', text, error.pos);\n }\n throw error;\n }\n end = skipWhitespace(text, end);\n if (end !== text.length) {\n throw new JSONDecodeError('Extra data', text, end);\n }\n return value;\n}\n","// SMTP TLS (RFC 8460) report parsing and CSV output, ported from\n// parsedmarc/__init__.py.\n\nimport { DEFAULT_MAX_SMTP_TLS_REPORT_SIZE, type ParserOptions } from './config';\nimport { csvSafe, rowsToCsv, type CsvOptions, type CsvRow } from './csv';\nimport { InvalidSMTPTLSReport } from './errors';\nimport {\n errorText,\n excOrigin,\n getItem,\n getOptional,\n KeyError,\n pyContains,\n pyIter,\n pyStrJoin,\n pyTypeRepr,\n} from './internal/py';\nimport { pyJsonLoads } from './internal/py-json-loads';\nimport { setOwn } from './internal/set-own';\nimport {\n camelToSnake,\n MAX_REPORT_DEPTH,\n markRaw,\n nestsDeeperThan,\n} from './serialize';\nimport type {\n SMTPTLSFailureDetails,\n SMTPTLSPolicy,\n SMTPTLSReport,\n} from './types';\nimport { pyStr } from './utils/python';\nimport { sanitizeForLog } from './utils/sanitize';\nimport { decodeUtf8 } from './utils/text';\nimport { humanTimestampToDatetime } from './utils/timestamps';\n\nconst POLICY_TYPES: readonly string[] = ['tlsa', 'sts', 'no-policy-found'];\n\nconst REQUIRED_FIELDS: readonly string[] = [\n 'organization-name',\n 'date-range',\n 'contact-info',\n 'report-id',\n 'policies',\n];\n\nconst OPTIONAL_FAILURE_FIELDS: readonly [\n string,\n keyof SMTPTLSFailureDetails,\n][] = [\n ['sending-mta-ip', 'sendingMtaIp'],\n ['receiving-ip', 'receivingIp'],\n ['receiving-mx-hostname', 'receivingMxHostname'],\n ['receiving-mx-helo', 'receivingMxHelo'],\n ['failure-reason-code', 'failureReasonCode'],\n];\n\n/** Fields of `parsedSmtpTlsReportsToCsv()`, in column order. */\nexport const SMTP_TLS_CSV_FIELDS: readonly string[] = [\n 'organization_name',\n 'begin_date',\n 'end_date',\n 'report_id',\n 'result_type',\n 'successful_session_count',\n 'failed_session_count',\n 'policy_domain',\n 'policy_type',\n 'policy_strings',\n 'mx_host_patterns',\n 'sending_mta_ip',\n 'receiving_ip',\n 'receiving_mx_hostname',\n 'receiving_mx_helo',\n 'additional_info_uri',\n 'failure_reason_code',\n];\n\n/**\n * Treat `null`/`undefined` or a blank string as absent: some reporters send\n * `\"\"` for optional failure-details fields, which is not a valid IP and\n * broke INET/Ip() columns downstream (parsedmarc issue #915).\n */\nfunction nonBlank(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return null;\n }\n return value;\n}\n\nfunction wrap(error: unknown, keyErrorPrefix: string): InvalidSMTPTLSReport {\n if (error instanceof KeyError) {\n return new InvalidSMTPTLSReport(`${keyErrorPrefix}: ${error.message}`, {\n cause: error,\n });\n }\n return new InvalidSMTPTLSReport(errorText(error) + excOrigin(error), {\n cause: error,\n });\n}\n\n// Deviation: parsedmarc keeps the reporter's JSON values whatever their type,\n// and a wrong type then fails in the outputs (`str.join`, date parsing, SQL\n// parameters), where one report takes its whole batch down. They are checked\n// here, so such a report is an invalid report.\n\n/** RFC 3339 date-times are short; `parseDate()` is linear but not free. */\nconst MAX_DATETIME_LENGTH = 64;\n\nfunction requireString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new InvalidSMTPTLSReport(\n `${field} must be a string, not ${pyTypeRepr(value)}`,\n );\n }\n return value;\n}\n\nfunction requireStringList(value: readonly unknown[], field: string): void {\n for (const item of value) {\n requireString(item, `${field} item`);\n }\n}\n\n/** A session count: an integer, or `null` (harmless in every output). */\nfunction requireCount(value: unknown, field: string): unknown {\n if (\n value !== null &&\n typeof value !== 'bigint' &&\n !Number.isSafeInteger(value)\n ) {\n throw new InvalidSMTPTLSReport(\n `${field} must be an integer, not ${pyTypeRepr(value)}`,\n );\n }\n return value;\n}\n\n/** Numbers pass: outputs store these optional fields as text. */\nfunction requireScalar(value: unknown, field: string): unknown {\n if (typeof value === 'object' && value !== null) {\n throw new InvalidSMTPTLSReport(\n `${field} must be a string, not ${pyTypeRepr(value)}`,\n );\n }\n return value;\n}\n\n/** A date-time the outputs can parse; kept as the reporter wrote it. */\nfunction requireDatetime(value: unknown, field: string): string {\n const text = requireString(value, field);\n let valid = text.length <= MAX_DATETIME_LENGTH;\n if (valid) {\n try {\n humanTimestampToDatetime(text, { toUtc: true });\n } catch {\n valid = false;\n }\n }\n if (!valid) {\n throw new InvalidSMTPTLSReport(`${field} is not a valid date-time`);\n }\n return text;\n}\n\n/** Parse one `failure-details` entry (parsedmarc's `_parse_smtp_tls_failure_details`). */\nexport function parseSmtpTlsFailureDetails(\n failureDetails: unknown,\n): SMTPTLSFailureDetails {\n try {\n const details: SMTPTLSFailureDetails = {\n resultType: markRaw(\n requireString(getItem(failureDetails, 'result-type'), 'result-type'),\n ) as string,\n failedSessionCount: markRaw(\n requireCount(\n getItem(failureDetails, 'failed-session-count'),\n 'failed-session-count',\n ),\n ) as number,\n };\n for (const [sourceKey, destinationKey] of OPTIONAL_FAILURE_FIELDS) {\n const value = nonBlank(getOptional(failureDetails, sourceKey));\n if (value !== null) {\n setOwn(\n details as unknown as Record<string, unknown>,\n destinationKey,\n markRaw(requireScalar(value, sourceKey)),\n );\n }\n }\n // RFC 8460 §4.4 names the key \"additional-information\"; some reporters\n // send the non-RFC \"additional-info-uri\" instead.\n let additionalInfoUri = nonBlank(\n getOptional(failureDetails, 'additional-information'),\n );\n if (additionalInfoUri === null) {\n additionalInfoUri = nonBlank(\n getOptional(failureDetails, 'additional-info-uri'),\n );\n }\n if (additionalInfoUri !== null) {\n details.additionalInfoUri = markRaw(\n requireScalar(additionalInfoUri, 'additional-information'),\n ) as string;\n }\n return details;\n } catch (error) {\n throw wrap(error, 'Missing required failure details field');\n }\n}\n\n/** Parse one policy entry (parsedmarc's `_parse_smtp_tls_report_policy`). */\nexport function parseSmtpTlsReportPolicy(policy: unknown): SMTPTLSPolicy {\n try {\n const policyInfo = getItem(policy, 'policy');\n const policyDomain = getItem(policyInfo, 'policy-domain') as string;\n const policyType = getItem(policyInfo, 'policy-type') as string;\n // `in` on a list compares with ==, so any JSON value is accepted here.\n if (!POLICY_TYPES.includes(policyType)) {\n throw new InvalidSMTPTLSReport(\n `Invalid policy type ${sanitizeForLog(pyStr(policyType))}`,\n );\n }\n const newPolicy: SMTPTLSPolicy = {\n policyDomain: markRaw(requireString(policyDomain, 'policy-domain')),\n policyType,\n } as SMTPTLSPolicy;\n if (pyContains(policyInfo, 'policy-string')) {\n const policyStrings = getItem(policyInfo, 'policy-string');\n if (Array.isArray(policyStrings) && policyStrings.length > 0) {\n requireStringList(policyStrings, 'policy-string');\n newPolicy.policyStrings = markRaw(policyStrings) as string[];\n }\n }\n if (pyContains(policyInfo, 'mx-host-pattern')) {\n const patterns = getItem(policyInfo, 'mx-host-pattern');\n if (Array.isArray(patterns) && patterns.length > 0) {\n requireStringList(patterns, 'mx-host-pattern');\n newPolicy.mxHostPatterns = markRaw(patterns) as string[];\n }\n }\n const summary = getItem(policy, 'summary');\n newPolicy.successfulSessionCount = markRaw(\n requireCount(\n getItem(summary, 'total-successful-session-count'),\n 'total-successful-session-count',\n ),\n ) as number;\n newPolicy.failedSessionCount = markRaw(\n requireCount(\n getItem(summary, 'total-failure-session-count'),\n 'total-failure-session-count',\n ),\n ) as number;\n if (pyContains(policy, 'failure-details')) {\n const failureDetails: SMTPTLSFailureDetails[] = [];\n for (const details of pyIter(getItem(policy, 'failure-details'))) {\n failureDetails.push(parseSmtpTlsFailureDetails(details));\n }\n newPolicy.failureDetails = failureDetails;\n }\n return newPolicy;\n } catch (error) {\n throw wrap(error, 'Missing required policy field');\n }\n}\n\n/** Parse and validate an SMTP TLS report (RFC 8460 JSON). */\nexport function parseSmtpTlsReportJson(\n report: string | Uint8Array,\n options: Partial<Pick<ParserOptions, 'maxSmtpTlsReportSize'>> = {},\n): SMTPTLSReport {\n const maxSize =\n options.maxSmtpTlsReportSize ?? DEFAULT_MAX_SMTP_TLS_REPORT_SIZE;\n try {\n // Before parsing: 100 MiB of \"{},\" is 35 million objects, which take over\n // 2 GB of heap. Real reports are a few KB.\n if (maxSize > 0 && report.length > maxSize) {\n throw new InvalidSMTPTLSReport(\n `SMTP TLS report of ${report.length} bytes exceeds the ${maxSize} byte limit (max_smtp_tls_report_size)`,\n );\n }\n // Like Python's `decode(\"utf-8\", errors=\"replace\")`, a BOM is kept (and\n // then rejected by json.loads).\n const text =\n typeof report === 'string' ? report : decodeUtf8(report, 'replace');\n // The depth is checked while scanning: the tree of a compressed report\n // full of \"[\" would not fit in the heap.\n const reportDict: unknown = pyJsonLoads(text, {\n bigIntegers: true,\n maxDepth: MAX_REPORT_DEPTH,\n });\n for (const requiredField of REQUIRED_FIELDS) {\n if (!pyContains(reportDict, requiredField)) {\n throw new Error(`Missing required field: ${requiredField}]`);\n }\n }\n const policiesValue = getItem(reportDict, 'policies');\n if (!Array.isArray(policiesValue)) {\n throw new InvalidSMTPTLSReport(\n `policies must be a list, not ${pyTypeRepr(policiesValue)}`,\n );\n }\n const policies = policiesValue.map(policy =>\n parseSmtpTlsReportPolicy(policy),\n );\n const dateRange = getItem(reportDict, 'date-range');\n // Deviation: raw-kept values deeper than this would break JSON output and\n // worker messages (native recursion), so the report is rejected here. The\n // scan counts open containers, so this also sees a last, empty level.\n if (nestsDeeperThan(reportDict, MAX_REPORT_DEPTH)) {\n throw new Error(\n `report data nested more than ${MAX_REPORT_DEPTH} levels deep`,\n );\n }\n const contactInfo = getItem(reportDict, 'contact-info');\n if (Array.isArray(contactInfo)) {\n requireStringList(contactInfo, 'contact-info');\n } else {\n requireString(contactInfo, 'contact-info');\n }\n return {\n organizationName: markRaw(\n requireString(\n getItem(reportDict, 'organization-name'),\n 'organization-name',\n ),\n ) as string,\n beginDate: markRaw(\n requireDatetime(getItem(dateRange, 'start-datetime'), 'start-datetime'),\n ) as string,\n endDate: markRaw(\n requireDatetime(getItem(dateRange, 'end-datetime'), 'end-datetime'),\n ) as string,\n contactInfo: markRaw(contactInfo) as string | string[],\n reportId: markRaw(\n requireString(getItem(reportDict, 'report-id'), 'report-id'),\n ) as string,\n policies,\n };\n } catch (error) {\n throw wrap(error, 'Missing required field');\n }\n}\n\n/**\n * Flatten SMTP TLS reports into CSV rows (snake_case keys): one row per\n * policy, plus one per failure-details entry.\n */\nexport function parsedSmtpTlsReportsToCsvRows(\n reports: SMTPTLSReport | SMTPTLSReport[],\n): CsvRow[] {\n const reportList = Array.isArray(reports) ? reports : [reports];\n const rows: CsvRow[] = [];\n for (const report of reportList) {\n const record: CsvRow = {\n organization_name: report.organizationName,\n begin_date: report.beginDate,\n end_date: report.endDate,\n report_id: report.reportId,\n };\n for (const policy of report.policies) {\n // Deviation: parsedmarc reuses one dict, so a policy without these\n // fields shows the previous policy's values.\n const policyRecord: CsvRow = { ...record };\n if (policy.policyStrings !== undefined) {\n policyRecord.policy_strings = pyStrJoin('|', policy.policyStrings);\n }\n if (policy.mxHostPatterns !== undefined) {\n policyRecord.mx_host_patterns = pyStrJoin('|', policy.mxHostPatterns);\n }\n rows.push({\n ...policyRecord,\n policy_domain: policy.policyDomain,\n policy_type: policy.policyType,\n successful_session_count: policy.successfulSessionCount,\n failed_session_count: policy.failedSessionCount,\n });\n for (const failureDetails of policy.failureDetails ?? []) {\n const failureRecord: CsvRow = { ...policyRecord };\n for (const [key, value] of Object.entries(failureDetails)) {\n setOwn(failureRecord, camelToSnake(key), value);\n }\n rows.push(failureRecord);\n }\n }\n }\n return rows;\n}\n\n/** SMTP TLS reports as flat CSV, with headers. */\nexport function parsedSmtpTlsReportsToCsv(\n reports: SMTPTLSReport | SMTPTLSReport[],\n options: CsvOptions = {},\n): string {\n const rows = parsedSmtpTlsReportsToCsvRows(reports).map(row =>\n Object.fromEntries(\n Object.entries(row).map(([key, value]) => [key, csvSafe(value)]),\n ),\n );\n return rowsToCsv(SMTP_TLS_CSV_FIELDS, rows, options);\n}\n","// Report email parsing, ported from parsedmarc/__init__.py:\n// `parse_report_email()`, `_decode_mime_payload()` and\n// `_classify_parsed_email()`.\n//\n// The message is walked with the port of Python's `email` package (compat32)\n// and mail-parser, so MIME structure, payload text and decoding match\n// parsedmarc byte for byte.\n\nimport { createHash } from 'node:crypto';\n\nimport { parseAggregateReportXml, withKeepAlive } from './aggregate';\nimport {\n resolveParserConfig,\n type ParserConfig,\n type ParserConfigInput,\n type SeenAggregateReportIds,\n} from './config';\nimport {\n EmailTooLargeError,\n emailTooLargeError,\n InvalidDMARCReport,\n InvalidFailureReport,\n ParserError,\n} from './errors';\nimport { extractReport, MAX_DECOMPRESSED_REPORT_SIZE } from './extract';\nimport { EMAIL_SAMPLE_CONTENT_TYPES, parseFailureReport } from './failure';\nimport { MAGIC_GZIP, MAGIC_ZIP, startsWith } from './internal/magic';\nimport {\n errorText,\n excOrigin,\n KeyError,\n noAttribute,\n PyIndexError,\n} from './internal/py';\nimport { logger } from './log';\nimport { parseSmtpTlsReportJson } from './smtp-tls';\nimport type {\n AggregateReport,\n FailureReport,\n ParsedReport,\n ReportType,\n SMTPTLSReport,\n} from './types';\nimport { PyDateTime } from './utils/datetime';\nimport { convertOutlookMsg, isOutlookMsg } from './utils/email';\nimport { MailParser } from './utils/mailparser/core';\nimport { a2bQp, b64decode, BinasciiError } from './utils/py-binascii';\nimport { LookupError, pyDecode, pyEncode } from './utils/py-codecs';\nimport {\n MissingHeaderBodySeparatorDefect,\n RecursionError,\n} from './utils/py-email/errors';\nimport { FlattenCache } from './utils/py-email/generator';\nimport { Message } from './utils/py-email/message';\nimport {\n MESSAGE_FROM_STRING_MAX_NESTING,\n messageFromString,\n} from './utils/py-email/parser';\nimport { pyLStrip, pyRStrip, pyStrip } from './utils/py-str';\nimport { pyStr } from './utils/python';\nimport { sanitizeForLog } from './utils/sanitize';\nimport { decodeUtf8 } from './utils/text';\nimport { humanTimestampToDatetime } from './utils/timestamps';\n\n/**\n * parsedmarc's `text_report_regex`: `Name: value` fields of a legacy\n * plain-text failure notice. Anchored at line starts (`(?<![^\\n])` is\n * Python's `^` under `re.MULTILINE`, which, unlike JS's `m` flag, does not\n * treat `\\r` as a line break); the classes are disjoint so it runs in linear\n * time (GHSA-7grx-mj6g-qxmc).\n */\nexport const TEXT_REPORT_REGEX: RegExp =\n /(?<![^\\n])[ \\t]*([A-Za-z]+(?: [A-Za-z]+)*):[ \\t]+([^\\r\\n]+)/gu;\n\nconst FAILURE_NOTICE = 'A message claiming to be from you has failed';\n\n/** Python's `repr(bytes)`, e.g. `b'abc\\n'`. */\nfunction bytesRepr(data: Uint8Array): string {\n const hasSingle = data.includes(0x27);\n const quote = hasSingle && !data.includes(0x22) ? '\"' : \"'\";\n const quoteByte = quote.charCodeAt(0);\n let body = '';\n for (const byte of data) {\n if (byte === quoteByte || byte === 0x5c) {\n body += `\\\\${String.fromCharCode(byte)}`;\n } else if (byte === 0x09) {\n body += '\\\\t';\n } else if (byte === 0x0a) {\n body += '\\\\n';\n } else if (byte === 0x0d) {\n body += '\\\\r';\n } else if (byte >= 0x20 && byte < 0x7f) {\n body += String.fromCharCode(byte);\n } else {\n body += `\\\\x${byte.toString(16).padStart(2, '0')}`;\n }\n }\n return `b${quote}${body}${quote}`;\n}\n\n/**\n * Python's `base64.b64decode(text)` (non-strict), or `null` where Python\n * raises `binascii.Error` / `ValueError` (bad padding, non-ASCII text).\n */\nfunction lenientB64decode(text: string): Uint8Array | null {\n try {\n return b64decode(text);\n } catch (error) {\n if (error instanceof BinasciiError || error instanceof TypeError) {\n return null;\n }\n throw error;\n }\n}\n\nconst DAY_NAMES = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] as const;\nconst MONTH_NAMES = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n] as const;\n\n/** Python's `email.utils.format_datetime(dt)`. */\nexport function formatDatetime(datetime: PyDateTime): string {\n const two = (value: number): string => String(value).padStart(2, '0');\n let zone = '-0000';\n if (datetime.utcOffsetMinutes !== null) {\n const offset = datetime.utcOffsetMinutes;\n const absolute = Math.abs(offset);\n zone = `${offset < 0 ? '-' : '+'}${two(Math.floor(absolute / 60))}${two(absolute % 60)}`;\n }\n const day = DAY_NAMES[datetime.weekday()] ?? '';\n const month = MONTH_NAMES[datetime.month - 1] ?? '';\n return `${day}, ${two(datetime.day)} ${month} ${String(datetime.year).padStart(4, '0')} ${two(datetime.hour)}:${two(datetime.minute)}:${two(datetime.second)} ${zone}`;\n}\n\n/**\n * Container levels (multipart or message parts) that `str(part)` can\n * flatten when parse_report_email is called from a module's top level.\n * `email.generator.Generator` recurses four Python frames per level\n * (`flatten`, `_write`, `_dispatch`, `_handle_multipart`), so a deeper part\n * exhausts CPython's default recursion limit (1000) and parse_report_email\n * and parse_report_file fail with a bare `RecursionError` (measured with\n * Python 3.14: a chain of 248 nested multiparts fails, 247 parses). Python's\n * exact limit shifts by one level per four frames of caller stack.\n */\nexport const STR_PART_MAX_NESTING = 246;\n\n/** Each message's container height (0 for a leaf), computed without recursion. */\nfunction containerHeights(root: Message): Map<Message, number> {\n const heights = new Map<Message, number>();\n const stack: [Message, boolean][] = [[root, false]];\n while (stack.length > 0) {\n const [message, childrenDone] = stack.pop() as [Message, boolean];\n const payload = message.getPayload();\n const children = Array.isArray(payload)\n ? payload.filter(child => child instanceof Message)\n : [];\n if (childrenDone) {\n let height = 0;\n for (const child of children) {\n height = Math.max(height, (heights.get(child) ?? 0) + 1);\n }\n heights.set(message, height);\n continue;\n }\n stack.push([message, true]);\n for (const child of children) {\n if (!heights.has(child)) {\n stack.push([child, false]);\n }\n }\n }\n return heights;\n}\n\n/**\n * Python's `str(value)` of a `get_payload()` item. `flattened` is shared\n * by the whole walk (nothing modifies the parts meanwhile): the first part\n * of every multipart is flattened once instead of once per ancestor. Each\n * item is asked for once, and reading it leaves a flat copy behind it, so\n * its text is dropped from the cache here.\n */\nfunction payloadText(\n value: string | Message | null | undefined,\n heights: Map<Message, number>,\n flattened: FlattenCache,\n): string {\n if (value instanceof Message) {\n if ((heights.get(value) ?? 0) > STR_PART_MAX_NESTING) {\n throw new RecursionError();\n }\n const text = value.asString(flattened);\n flattened.delete(value);\n return text;\n }\n return pyStr(value);\n}\n\n/**\n * Returns a MIME part's payload decoded per its Content-Transfer-Encoding\n * (parsedmarc's `_decode_mime_payload`).\n *\n * - Only quoted-printable and base64 parts are touched: the message was\n * parsed from text, so 7bit/8bit parts have nothing to undo and return\n * `fallback` (the payload text as-is).\n * - Nested `message/*` parts have no `decode=True` payload; the caller's\n * re-serialization of the child message is `fallback`, and the transfer\n * encoding is undone here. If parsing the still-encoded text recorded a\n * MissingHeaderBodySeparatorDefect (a quoted-printable soft line break\n * split a field), the blank line the parser inserted is dropped first.\n *\n * Any unexpected failure returns `fallback` unchanged.\n */\nexport function decodeMimePayload(part: Message, fallback: string): string {\n try {\n const cte = pyStrip(\n part.get('Content-Transfer-Encoding') ?? '',\n ).toLowerCase();\n if (cte !== 'quoted-printable' && cte !== 'base64') {\n return fallback;\n }\n\n const payloadBytes = part.getDecodedPayload();\n if (payloadBytes !== null) {\n const charset = part.getContentCharset() || 'utf-8';\n try {\n return pyDecode(payloadBytes, charset, 'replace');\n } catch (error) {\n if (error instanceof LookupError) {\n return pyDecode(payloadBytes, 'utf-8', 'replace');\n }\n throw error;\n }\n }\n\n let text = fallback;\n let child: unknown = part.getPayload();\n if (Array.isArray(child) && child.length > 0) {\n child = child[0];\n }\n if (\n child instanceof Message &&\n child.defects.some(\n defect => defect instanceof MissingHeaderBodySeparatorDefect,\n )\n ) {\n text = fallback.replace('\\n\\n', '\\n');\n }\n\n if (cte === 'quoted-printable') {\n return pyDecode(\n a2bQp(pyEncode(text, 'utf-8', 'replace')),\n 'utf-8',\n 'replace',\n );\n }\n return decodeUtf8(b64decode(text), 'replace');\n } catch {\n return fallback;\n }\n}\n\n/** The size of an email in bytes (UTF-8 for text). */\nexport function emailByteLength(input: string | Uint8Array): number {\n return typeof input === 'string'\n ? Buffer.byteLength(input, 'utf8')\n : input.byteLength;\n}\n\nconst DASH = 0x2d;\nconst LINE_FEED = 0x0a;\nconst CARRIAGE_RETURN = 0x0d;\nconst LINE_STARTS_WITH_DASHES = /(?:\\r\\n?|\\n)--/gu;\n\n/**\n * Lines starting with `--` (every MIME boundary line does), counting up to\n * `stopAfter + 1`. The parser also ends a line at a lone CR.\n */\nfunction countBoundaryLines(\n input: string | Uint8Array,\n stopAfter: number,\n): number {\n let count = 0;\n if (typeof input === 'string') {\n count = input.startsWith('--') ? 1 : 0;\n LINE_STARTS_WITH_DASHES.lastIndex = 0;\n while (count <= stopAfter && LINE_STARTS_WITH_DASHES.test(input)) {\n count += 1;\n }\n return count;\n }\n let atLineStart = true;\n for (let index = 0; index < input.length - 1; index += 1) {\n const byte = input[index];\n if (atLineStart && byte === DASH && input[index + 1] === DASH) {\n count += 1;\n if (count > stopAfter) {\n return count;\n }\n }\n atLineStart = byte === LINE_FEED || byte === CARRIAGE_RETURN;\n }\n return count;\n}\n\n/**\n * Throw {@link EmailTooLargeError} when an email is over the config's\n * `maxEmailSize` bytes or has more than `maxMimeParts` MIME boundary\n * lines. Both checks are linear and run before any parsing; the parser then\n * counts the parts that need no boundary line, see `messageFromString()`.\n */\nexport function checkEmailLimits(\n input: string | Uint8Array,\n config: Pick<ParserConfig, 'maxEmailSize' | 'maxMimeParts'>,\n): void {\n const { maxEmailSize, maxMimeParts } = config;\n if (maxEmailSize > 0) {\n const size = emailByteLength(input);\n if (size > maxEmailSize) {\n throw emailTooLargeError(size, maxEmailSize);\n }\n }\n if (\n maxMimeParts > 0 &&\n countBoundaryLines(input, maxMimeParts) > maxMimeParts\n ) {\n throw new EmailTooLargeError(\n `Email has more than ${maxMimeParts} MIME boundary lines (max_mime_parts)`,\n );\n }\n}\n\n/** Options of {@link parseReportEmail}. */\nexport interface ParseReportEmailOptions extends ParserConfigInput {\n /** Keep-alive callback for large aggregate reports (not part of `config`). */\n keepAlive?: (() => unknown) | null;\n}\n\ninterface DecodedInput {\n text: string;\n headers: Record<string, unknown>;\n msgDate: PyDateTime;\n date: string;\n message: Message;\n}\n\nasync function readInput(\n input: string | Uint8Array,\n config: ParserConfig,\n): Promise<DecodedInput> {\n let text: string;\n if (typeof input === 'string') {\n text = input;\n } else if (isOutlookMsg(input)) {\n // The limits checked so far were on the MSG, not on what it expands to.\n const converted = await convertOutlookMsg(input, config.maxEmailSize);\n checkEmailLimits(converted, config);\n text = decodeUtf8(converted, 'replace');\n } else {\n text = decodeUtf8(input, 'replace');\n }\n const headers = MailParser.fromString(text, config).headers as Record<\n string,\n unknown\n >;\n let msgDate = PyDateTime.now(true);\n if (Object.hasOwn(headers, 'Date')) {\n const value = headers.Date;\n if (typeof value !== 'string') {\n throw noAttribute(value, 'replace');\n }\n msgDate = humanTimestampToDatetime(value);\n }\n const date = formatDatetime(msgDate);\n return {\n text,\n headers,\n msgDate,\n date,\n message: messageFromString(text, MESSAGE_FROM_STRING_MAX_NESTING, config),\n };\n}\n\n/**\n * The legacy plain-text failure notice: build a feedback report from its\n * `Received Date` and `Sender IP Address` fields; the text after\n * `detected.` is the sample.\n */\nfunction parseTextFailureNotice(\n payload: string,\n subjectText: string,\n): { feedbackReport: string; sample: string } {\n const separator = payload.indexOf('detected.');\n const parts =\n separator === -1\n ? [payload]\n : [\n payload.slice(0, separator),\n payload.slice(separator + 'detected.'.length),\n ];\n let feedbackReport: string;\n try {\n const fields = new Map<string, string>();\n for (const match of (parts[0] ?? '').matchAll(TEXT_REPORT_REGEX)) {\n const fieldName = (match[1] ?? '').toLowerCase().replaceAll(' ', '-');\n fields.set(fieldName, pyStrip(match[2] ?? ''));\n }\n const field = (name: string): string => {\n const value = fields.get(name);\n if (value === undefined) {\n throw new KeyError(name);\n }\n return value;\n };\n feedbackReport = `Arrival-Date: ${field('received-date')}\\nSource-IP: ${field('sender-ip-address')}`;\n } catch (error) {\n throw new InvalidDMARCReport(\n `Unable to parse message with subject \"${subjectText}\": ${errorText(error)}${excOrigin(error)}`,\n { cause: error },\n );\n }\n const rest = parts[1];\n if (rest === undefined) {\n // Python's `parts[1]` on a one-element list.\n throw new PyIndexError('list index out of range');\n }\n const sample = pyLStrip(rest);\n logger.debug(sanitizeForLog(sample));\n return { feedbackReport, sample };\n}\n\n/** The `message/feedback-report` part's text, base64-decoded if needed. */\nfunction feedbackReportText(decodedPayload: string): string {\n let report: string;\n if (decodedPayload.includes('Feedback-Type')) {\n report = decodedPayload;\n } else {\n const decoded = lenientB64decode(decodedPayload);\n if (decoded === null) {\n return decodedPayload;\n }\n // parsedmarc formats the bytes with repr() and strips the b'...'.\n report = bytesRepr(decoded);\n }\n report = pyRStrip(pyLStrip(report, \"b'\"), \"'\");\n return report.replaceAll('\\\\r', '').replaceAll('\\\\n', '\\n');\n}\n\n/**\n * Parses a DMARC or SMTP TLS report from an email (RFC 822 bytes or text).\n *\n * Throws {@link ParserError} when the email can't be read,\n * {@link InvalidDMARCReport} when it holds no valid report, and\n * {@link InvalidFailureReport} when its failure report is invalid. Throws\n * {@link EmailTooLargeError} when the email is over the config's\n * `maxEmailSize`, `maxMimeParts`, `maxHeaderLines` or `maxExpandedEmailSize`\n * (not in parsedmarc). Whatever the input, only `ParserError` subclasses are\n * thrown, apart from what `keepAlive` throws: that is rethrown as is, since\n * it says nothing about the email (parsedmarc reports a `ParserError`).\n */\nexport async function parseReportEmail(\n input: string | Uint8Array,\n options: ParseReportEmailOptions = {},\n): Promise<ParsedReport> {\n const { keepAlive = null, ...configOptions } = options;\n const config = resolveParserConfig(configOptions);\n return withKeepAlive(keepAlive, async tracked =>\n parseEmail(input, config, tracked),\n );\n}\n\nasync function parseEmail(\n input: string | Uint8Array,\n config: ParserConfig,\n keepAlive: (() => unknown) | null,\n): Promise<ParsedReport> {\n checkEmailLimits(input, config);\n\n let decoded: DecodedInput;\n try {\n decoded = await readInput(input, config);\n } catch (error) {\n if (error instanceof EmailTooLargeError) {\n throw error;\n }\n throw new ParserError(errorText(error) + excOrigin(error), {\n cause: error,\n });\n }\n const { headers, msgDate, date, message } = decoded;\n\n let subjectText = 'None';\n let feedbackReport: string | null = null;\n let sample: string | null = null;\n if (Object.hasOwn(headers, 'From')) {\n logger.info(\n `Parsing mail from ${sanitizeForLog(pyStr(headers.From))} on ${date}`,\n );\n }\n if (Object.hasOwn(headers, 'Subject')) {\n // RFC 2047 decoding can yield raw CR/LF, so escape control characters\n // before the subject reaches an error message or log.\n subjectText = sanitizeForLog(pyStr(headers.Subject));\n }\n\n // Serializing a part (`str(payload_obj[0])`) re-renders any message/rfc822\n // sub-message, which can throw e.g. HeaderWriteError on a control\n // character in a header or RecursionError on deeply nested multiparts.\n // Callers rely on this function throwing only ParserError subclasses, so\n // that one bad message is skipped (and moved to Invalid) rather than\n // aborting a whole mailbox batch (GHSA-qxwv-2vwj-v828).\n try {\n const result = await walkMessage(message, subjectText, config, keepAlive);\n if ('reportType' in result) {\n return result;\n }\n ({ feedbackReport, sample } = result);\n } catch (error) {\n if (error instanceof ParserError) {\n throw error;\n }\n throw new ParserError(\n `Unable to parse message with subject \"${subjectText}\": ${errorText(error)}${excOrigin(error)}`,\n { cause: error },\n );\n }\n\n if (feedbackReport && sample) {\n let failureReport: FailureReport;\n try {\n failureReport = await parseFailureReport(\n feedbackReport,\n sample,\n msgDate,\n { config },\n );\n } catch (error) {\n if (error instanceof InvalidFailureReport) {\n throw new InvalidFailureReport(\n `Message with subject \"${subjectText}\" is not a valid failure DMARC report: ${error.message}`,\n { cause: error },\n );\n }\n throw error;\n }\n return { reportType: 'failure', report: failureReport };\n }\n\n // Every branch that finds a report returns, so reaching this point always\n // means no report was found.\n throw new InvalidDMARCReport(\n `Message with subject \"${subjectText}\" is not a valid report`,\n );\n}\n\ninterface FailureParts {\n feedbackReport: string | null;\n sample: string | null;\n}\n\n/**\n * parse_report_email's walk over the message parts: the first SMTP TLS or\n * aggregate report found, else the failure report and sample collected.\n */\nasync function walkMessage(\n message: Message,\n subjectText: string,\n config: ParserConfig,\n keepAlive: (() => unknown) | null,\n): Promise<ParsedReport | FailureParts> {\n let feedbackReport: string | null = null;\n let sample: string | null = null;\n let isFeedbackReport = false;\n const heights = containerHeights(message);\n const flattened = new FlattenCache(config.maxExpandedEmailSize);\n const decompressed: DecompressedBudget = { size: 0 };\n for (const part of message.walk()) {\n const contentType = part.getContentType().toLowerCase();\n const payloadObject = part.getPayload();\n const payloadList = Array.isArray(payloadObject)\n ? payloadObject\n : [payloadObject];\n if (payloadList.length === 0) {\n throw new PyIndexError('list index out of range');\n }\n let payload = payloadText(payloadList[0], heights, flattened);\n if (contentType.startsWith('multipart/') || contentType === 'text/html') {\n continue;\n }\n if (contentType === 'message/feedback-report') {\n isFeedbackReport = true;\n feedbackReport = feedbackReportText(decodeMimePayload(part, payload));\n } else if (\n isFeedbackReport &&\n EMAIL_SAMPLE_CONTENT_TYPES.includes(contentType)\n ) {\n sample = decodeMimePayload(part, payload);\n } else if (contentType === 'application/tlsrpt+json') {\n if (!pyStrip(payload).startsWith('{')) {\n payload = decodeUtf8(b64decode(payload), 'replace');\n }\n return {\n reportType: 'smtp_tls',\n report: parseSmtpTlsReportJson(payload, config),\n };\n } else if (contentType === 'application/tlsrpt+gzip') {\n return {\n reportType: 'smtp_tls',\n report: parseSmtpTlsReportJson(extractReport(payload), config),\n };\n } else if (contentType === 'text/plain') {\n if (payload.includes(FAILURE_NOTICE)) {\n ({ feedbackReport, sample } = parseTextFailureNotice(\n payload,\n subjectText,\n ));\n }\n } else {\n const result = await parseAttachment(\n payload,\n subjectText,\n config,\n keepAlive,\n decompressed,\n );\n if (result !== null) {\n return result;\n }\n }\n }\n return { feedbackReport, sample };\n}\n\n/**\n * The bytes decompressed from one email's attachments so far. Each one is\n * capped at {@link MAX_DECOMPRESSED_REPORT_SIZE}, and so are all of them\n * together (not in parsedmarc): a part that decompresses to something that\n * is not a report lets the walk go on to the next one, so with only a cap\n * per part, a 50 MiB email of 700 small gzip parts took minutes of CPU.\n */\ninterface DecompressedBudget {\n size: number;\n}\n\n/**\n * Any other part: a base64 attachment holding an aggregate (XML) or SMTP\n * TLS (JSON) report, possibly zipped or gzipped. `null` when the part is\n * not base64 or holds neither, so the walk continues.\n */\nasync function parseAttachment(\n payload: string,\n subjectText: string,\n config: ParserConfig,\n keepAlive: (() => unknown) | null,\n decompressed: DecompressedBudget = { size: 0 },\n): Promise<ParsedReport | null> {\n const payloadBytes = lenientB64decode(payload);\n if (payloadBytes === null) {\n // Not base64, so not a report attachment.\n return null;\n }\n try {\n const payloadText =\n startsWith(payloadBytes, MAGIC_ZIP) ||\n startsWith(payloadBytes, MAGIC_GZIP)\n ? extractReport(payloadBytes, {\n onDecompressed: size => {\n decompressed.size += size;\n },\n })\n : decodeUtf8(payloadBytes, 'replace');\n const stripped = pyStrip(payloadText);\n if (stripped.startsWith('{')) {\n return {\n reportType: 'smtp_tls',\n report: parseSmtpTlsReportJson(payloadText, config),\n };\n }\n if (stripped.startsWith('<')) {\n return {\n reportType: 'aggregate',\n report: await parseAggregateReportXml(payloadText, {\n config,\n keepAlive,\n }),\n };\n }\n // Not a report: the walk goes on, if the email has decompressed\n // little enough so far.\n if (decompressed.size > MAX_DECOMPRESSED_REPORT_SIZE) {\n throw new EmailTooLargeError(\n `Email attachments decompress to more than ${MAX_DECOMPRESSED_REPORT_SIZE} bytes`,\n );\n }\n return null;\n } catch (error) {\n if (error instanceof EmailTooLargeError) {\n throw error;\n }\n if (error instanceof InvalidDMARCReport) {\n throw new ParserError(\n `Message with subject \"${subjectText}\" is not a valid DMARC report: ${error.message}`,\n { cause: error },\n );\n }\n throw new ParserError(\n `Unable to parse message with subject \"${subjectText}\": ${errorText(error)}${excOrigin(error)}`,\n { cause: error },\n );\n }\n}\n\n/**\n * Worker job that parses one report email (parsedmarc's\n * `parallel._parse_report_email_job`). A {@link ParserError} is returned as\n * a value, never thrown, so one invalid message needs no special handling.\n * `parseReportEmail` throws only `ParserError` subclasses, whatever the\n * input, so no other error is expected from here.\n */\nexport async function parseReportEmailJob(\n messageContent: string | Uint8Array,\n options: { config: ParserConfig },\n): Promise<ParsedReport | ParserError> {\n try {\n return await parseReportEmail(messageContent, { config: options.config });\n } catch (error) {\n if (error instanceof ParserError) {\n return error;\n }\n throw error;\n }\n}\n\n/** Longest dedup key kept as is; any longer is stored as its hash. */\nconst MAX_REPORT_KEY_LENGTH = 1024;\nconst ASCII_UPPERCASE = /[A-Z]+/gu;\n\n/** A key field as JSON can hold it: strings and null as is, anything else as `str()`. */\nfunction keyField(value: unknown): string | null {\n if (typeof value === 'string' || value === null || value === undefined) {\n return value ?? null;\n }\n return pyStr(value);\n}\n\n/**\n * The dedup key of an aggregate report (parsedmarc's\n * `_aggregate_report_dedup_key()`): RFC 9990 section 3.5.1 defines a\n * Report-ID as unique only \"among reports to the same domain\", so the key\n * is the reporter, the Report-ID and the policy domain, as a JSON array\n * (no delimiter a field could contain). ASCII letters of the domain are\n * compared without case (RFC 4343 section 3); the report is unchanged.\n * Every writer of the seen report ID cache (mbox, mailbox, the CLI's\n * direct files) must use it. The key outlives parsing in that cache and\n * every part comes from the sender, so a long one is replaced by its hash\n * (parsedmarc keeps it whole).\n */\nexport function aggregateReportKey(report: AggregateReport): string {\n const { reportMetadata, policyPublished } = report;\n let domain = keyField(policyPublished.domain);\n // The XML parser returns null for an empty <domain/>.\n if (typeof domain === 'string') {\n domain = domain.replaceAll(ASCII_UPPERCASE, letters =>\n letters.toLowerCase(),\n );\n }\n const key = JSON.stringify([\n keyField(reportMetadata.orgName),\n keyField(reportMetadata.reportId),\n domain,\n ]);\n return key.length > MAX_REPORT_KEY_LENGTH\n ? createHash('sha256').update(key).digest('hex')\n : key;\n}\n\n/** Options of {@link classifyParsedEmail}. */\nexport interface ClassifyParsedEmailOptions {\n /** Seen aggregate report keys ({@link aggregateReportKey}) used for dedup. */\n seenAggregateReportIds: SeenAggregateReportIds;\n /**\n * When given, newly seen aggregate keys are staged here instead of being\n * written to `seenAggregateReportIds` (the caller commits them once the\n * batch is saved); dedup checks both.\n */\n pendingAggregateKeys?: Set<string> | null;\n}\n\n/**\n * Append a parsed report email to the list for its type, dropping\n * aggregate reports already seen (parsedmarc's `_classify_parsed_email`).\n * Returns the report type.\n */\nexport function classifyParsedEmail(\n parsedEmail: ParsedReport,\n aggregateReports: AggregateReport[],\n failureReports: FailureReport[],\n smtpTlsReports: SMTPTLSReport[],\n options: ClassifyParsedEmailOptions,\n): ReportType {\n const { seenAggregateReportIds, pendingAggregateKeys = null } = options;\n if (parsedEmail.reportType === 'aggregate') {\n const reportOrg = parsedEmail.report.reportMetadata.orgName;\n const reportId = parsedEmail.report.reportMetadata.reportId;\n const reportKey = aggregateReportKey(parsedEmail.report);\n const alreadySeen =\n seenAggregateReportIds.has(reportKey) ||\n (pendingAggregateKeys !== null && pendingAggregateKeys.has(reportKey));\n if (alreadySeen) {\n logger.debug(\n `Skipping duplicate aggregate report from ${sanitizeForLog(pyStr(reportOrg))} with ID: ${sanitizeForLog(pyStr(reportId))}`,\n );\n } else {\n if (pendingAggregateKeys === null) {\n seenAggregateReportIds.set(reportKey, true);\n } else {\n pendingAggregateKeys.add(reportKey);\n }\n aggregateReports.push(parsedEmail.report);\n }\n } else if (parsedEmail.reportType === 'failure') {\n failureReports.push(parsedEmail.report);\n } else if (parsedEmail.reportType === 'smtp_tls') {\n smtpTlsReports.push(parsedEmail.report);\n }\n return parsedEmail.reportType;\n}\n","// Reading mbox files like Python's `mailbox.mbox`: the same message\n// boundaries (`_generate_toc`), `get_bytes()` and `get_string()`.\n//\n// Python's mbox does not undo `>From ` quoting when reading, so neither does\n// this. `get_string()` re-parses the message from bytes and serializes it\n// again (`email.message_from_bytes(...).as_string()`), which is what\n// parsedmarc parses.\n\nimport { constants } from 'node:fs';\nimport { type FileHandle, open } from 'node:fs/promises';\n\nimport { pyDecode } from './py-codecs';\nimport { messageFromString } from './py-email/parser';\n\nconst LF = 0x0a;\nconst FROM_LINE = Uint8Array.from([0x46, 0x72, 0x6f, 0x6d, 0x20]); // \"From \"\nconst READ_CHUNK_SIZE = 64 * 1024;\nconst EMPTY = new Uint8Array(0);\n\ninterface TocEntry {\n start: number;\n stop: number;\n}\n\nfunction startsWithFrom(head: Uint8Array): boolean {\n return FROM_LINE.every((byte, index) => head[index] === byte);\n}\n\n/** `line` with `bytes` added. A copy of them: the read buffer is reused. */\nfunction extendLine(line: LineStart, bytes: Uint8Array): LineStart {\n const missing = FROM_LINE.length - line.head.length;\n return {\n offset: line.offset,\n length: line.length + bytes.length,\n head:\n missing > 0\n ? Uint8Array.from([...line.head, ...bytes.subarray(0, missing)])\n : line.head,\n };\n}\n\n/** Open like `_singlefileMailbox.__init__` with `create=True`. */\nasync function openMailboxFile(path: string): Promise<FileHandle> {\n try {\n return await open(path, constants.O_RDWR);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n // Python creates a missing mbox file (and fails if its directory is\n // missing).\n return open(path, 'w+');\n }\n if (code === 'EACCES' || code === 'EROFS') {\n return open(path, 'r');\n }\n throw error;\n }\n}\n\n/** What the table of contents needs of a line; the rest is never kept. */\ninterface LineStart {\n offset: number;\n /** The line's length, with its `\\n`. */\n length: number;\n /** The line's first bytes (as many as `From `). */\n head: Uint8Array;\n}\n\n/**\n * Read the file line by line. `generateToc()` only looks at the start of each\n * line, so a long one costs no memory, however large the file.\n *\n * @yields {LineStart} Every line.\n */\nasync function* readLines(file: FileHandle): AsyncGenerator<LineStart> {\n let offset = 0;\n // The start of an unfinished line.\n let pending: LineStart | null = null;\n const buffer = new Uint8Array(READ_CHUNK_SIZE);\n for (;;) {\n const { bytesRead } = await file.read(buffer, 0, buffer.length, offset);\n if (bytesRead === 0) {\n break;\n }\n const chunk = buffer.subarray(0, bytesRead);\n const chunkOffset = offset;\n offset += bytesRead;\n let lineStart = 0;\n for (\n let index = chunk.indexOf(LF);\n index !== -1;\n index = chunk.indexOf(LF, lineStart)\n ) {\n const tail = chunk.subarray(lineStart, index + 1);\n if (pending === null) {\n yield {\n offset: chunkOffset + lineStart,\n length: tail.length,\n head: tail.subarray(0, FROM_LINE.length),\n };\n } else {\n yield extendLine(pending, tail);\n pending = null;\n }\n lineStart = index + 1;\n }\n if (lineStart < chunk.length) {\n pending = extendLine(\n pending ?? { offset: chunkOffset + lineStart, length: 0, head: EMPTY },\n chunk.subarray(lineStart),\n );\n }\n }\n if (pending !== null) {\n yield pending;\n }\n}\n\n/** A read-only view of an mbox file (Python's `mailbox.mbox`). */\nexport class MboxReader {\n private readonly file: FileHandle;\n private readonly toc: TocEntry[];\n\n private constructor(file: FileHandle, toc: TocEntry[]) {\n this.file = file;\n this.toc = toc;\n }\n\n /**\n * Open an mbox file and index its messages. Like Python, a missing file\n * is created empty.\n */\n static async open(path: string): Promise<MboxReader> {\n const file = await openMailboxFile(path);\n try {\n return new MboxReader(file, await MboxReader.generateToc(file));\n } catch (error) {\n await file.close();\n throw error;\n }\n }\n\n /** Python's `_mboxMMDF._generate_toc()`, with `\\n` line separators. */\n private static async generateToc(file: FileHandle): Promise<TocEntry[]> {\n const starts: number[] = [];\n const stops: number[] = [];\n let lastWasEmpty = false;\n let end = 0;\n for await (const { offset: linePos, length, head } of readLines(file)) {\n end = linePos + length;\n if (startsWithFrom(head)) {\n if (stops.length < starts.length) {\n stops.push(lastWasEmpty ? linePos - 1 : linePos);\n }\n starts.push(linePos);\n lastWasEmpty = false;\n } else if (length === 1 && head[0] === LF) {\n lastWasEmpty = true;\n } else {\n lastWasEmpty = false;\n }\n }\n // End of file.\n stops.push(lastWasEmpty ? end - 1 : end);\n const count = Math.min(starts.length, stops.length);\n const toc: TocEntry[] = [];\n for (let index = 0; index < count; index += 1) {\n toc.push({ start: starts[index] ?? 0, stop: stops[index] ?? 0 });\n }\n return toc;\n }\n\n /** Message keys, in file order. */\n keys(): number[] {\n return this.toc.map((_entry, index) => index);\n }\n\n get length(): number {\n return this.toc.length;\n }\n\n /** The size of a message in the file, in bytes (its `From ` line included). */\n size(key: number): number {\n const { start, stop } = this.entry(key);\n return Math.max(stop - start, 0);\n }\n\n private entry(key: number): TocEntry {\n const entry = this.toc[key];\n if (entry === undefined) {\n throw new RangeError(`No message with key: ${key}`);\n }\n return entry;\n }\n\n /** `get_bytes(key)`: the message without its `From ` line. */\n async getBytes(key: number): Promise<Uint8Array> {\n const { start, stop } = this.entry(key);\n const raw = new Uint8Array(Math.max(stop - start, 0));\n let filled = 0;\n while (filled < raw.length) {\n const { bytesRead } = await this.file.read(\n raw,\n filled,\n raw.length - filled,\n start + filled,\n );\n if (bytesRead === 0) {\n break;\n }\n filled += bytesRead;\n }\n const data = raw.subarray(0, filled);\n const firstLineEnd = data.indexOf(LF);\n return firstLineEnd === -1\n ? new Uint8Array(0)\n : data.slice(firstLineEnd + 1);\n }\n\n /**\n * `get_string(key)`: the message parsed from bytes and serialized again,\n * like `email.message_from_bytes(...).as_string()`.\n */\n async getString(key: number): Promise<string> {\n const text = pyDecode(await this.getBytes(key), 'ascii', 'surrogateescape');\n return messageFromString(text).asString();\n }\n\n async close(): Promise<void> {\n await this.file.close();\n }\n}\n","// Report file parsing, ported from parsedmarc/__init__.py:\n// `parse_report_file()`, `_looks_like_email()`, `_describe_parse_failure()`\n// and `get_dmarc_reports_from_mbox()`.\n\nimport { readFile, stat } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\n\nimport { parseAggregateReportXml } from './aggregate';\nimport {\n resolveParserConfig,\n type ParserConfig,\n type ParserConfigInput,\n} from './config';\nimport {\n EmailTooLargeError,\n emailTooLargeError,\n findEnrichmentError,\n InvalidAggregateReport,\n InvalidDMARCReport,\n InvalidSMTPTLSReport,\n ParserError,\n} from './errors';\nimport {\n extractReport,\n MAX_DECOMPRESSED_REPORT_SIZE,\n type ReportStream,\n} from './extract';\nimport { MAGIC_GZIP, MAGIC_ZIP, startsWith } from './internal/magic';\nimport { errorText, excOrigin } from './internal/py';\nimport { logger } from './log';\nimport { parallelMap, parseReportEmailTask } from './parallel';\nimport { classifyParsedEmail, parseReportEmail } from './report-email';\nimport { parseSmtpTlsReportJson } from './smtp-tls';\nimport type {\n AggregateReport,\n FailureReport,\n ParsedReport,\n ParsingResults,\n SMTPTLSReport,\n} from './types';\nimport { MboxReader } from './utils/mbox';\nimport { pyLStrip } from './utils/py-str';\nimport { sanitizeForLog } from './utils/sanitize';\nimport { decodeUtf8 } from './utils/text';\n\n/**\n * An RFC 5322 header field name (printable ASCII except the colon) followed\n * by a colon at the start of the text, or an mbox `From ` separator.\n */\nconst EMAIL_HEADER_REGEX = /^(?:From |[\\x21-\\x39\\x3b-\\x7e]+:)/u;\n\nconst SNIFF_LENGTH = 512;\n\n/**\n * True if the first line looks like an email header (parsedmarc's\n * `_looks_like_email`). Callers pass already left-stripped text.\n */\nexport function looksLikeEmail(text: string): boolean {\n const newline = text.indexOf('\\n');\n const firstLine = newline === -1 ? text : text.slice(0, newline);\n return EMAIL_HEADER_REGEX.test(firstLine);\n}\n\n/** The first `count` code points of `text` (Python's `text[:count]`). */\nfunction codePointPrefix(text: string, count: number): string {\n let result = '';\n let taken = 0;\n for (const char of text) {\n if (taken === count) {\n break;\n }\n result += char;\n taken += 1;\n }\n return result;\n}\n\n/**\n * The reason a `parseReportFile()` call failed: only the parser for the\n * format the content resembles produced a meaningful error, so sniff the\n * leading non-whitespace text (parsedmarc's `_describe_parse_failure`).\n */\nexport function describeParseFailure(\n content: string | Uint8Array,\n aggregateError: Error,\n smtpTlsError: Error,\n emailError: Error,\n): string {\n const sniff = pyLStrip(\n typeof content === 'string'\n ? codePointPrefix(content, SNIFF_LENGTH)\n : decodeUtf8(content.subarray(0, SNIFF_LENGTH), 'replace'),\n );\n if (sniff.startsWith('<')) {\n return `Invalid aggregate report: ${aggregateError.message}`;\n }\n if (sniff.startsWith('{')) {\n return `Invalid SMTP TLS report: ${smtpTlsError.message}`;\n }\n if (looksLikeEmail(sniff)) {\n return `Invalid report email: ${emailError.message}`;\n }\n return 'Not a recognized report format (not a DMARC aggregate XML report, an SMTP TLS JSON report, or a DMARC report email)';\n}\n\n/** Input of {@link parseReportFile}: a path, bytes, or a binary stream. */\nexport type ReportFileInput =\n | string\n | URL\n | Uint8Array\n | ArrayBuffer\n | ReportStream;\n\n/** Options of {@link parseReportFile}. */\nexport interface ParseReportFileOptions extends ParserConfigInput {\n /** Keep-alive callback for large aggregate reports (not part of `config`). */\n keepAlive?: (() => unknown) | null;\n}\n\n/**\n * The largest report file read: the email size limit, but never below the\n * 100 MiB decompression cap (a bare XML report can be that large). `null`\n * when `maxEmailSize` is 0 (no limit).\n */\nfunction maxReportFileSize(config: ParserConfig): number | null {\n return config.maxEmailSize > 0\n ? Math.max(config.maxEmailSize, MAX_DECOMPRESSED_REPORT_SIZE)\n : null;\n}\n\n/** Read the whole content; a text stream fails like Python's `bytes` check. */\nasync function readContent(\n input: ReportFileInput,\n maxSize: number | null,\n): Promise<Uint8Array> {\n if (typeof input === 'string' || input instanceof URL) {\n const filePath = typeof input === 'string' ? input : fileURLToPath(input);\n logger.debug(`Parsing ${filePath}`);\n if (maxSize !== null) {\n const { size } = await stat(filePath);\n if (size > maxSize) {\n throw new EmailTooLargeError(\n `File of ${size} bytes exceeds the ${maxSize} byte size limit (max_email_size)`,\n );\n }\n }\n return new Uint8Array(await readFile(filePath));\n }\n if (input instanceof Uint8Array) {\n return input;\n }\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n // A caller-supplied stream is read but never closed or cancelled, not even\n // when over the limit: `for await` would call the iterator's `return()`.\n const stream = input as AsyncIterable<Uint8Array | string>;\n const iterator = stream[Symbol.asyncIterator]();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value: chunk } = await iterator.next();\n if (done) {\n return new Uint8Array(Buffer.concat(chunks));\n }\n if (typeof chunk === 'string') {\n // Python: `str.startswith(bytes)` on a text-mode file's content.\n throw new TypeError(\n 'startswith first arg must be str or a tuple of str, not bytes',\n );\n }\n size += chunk.byteLength;\n if (maxSize !== null && size > maxSize) {\n throw new EmailTooLargeError(\n `Stream of more than ${maxSize} bytes exceeds the byte size limit (max_email_size)`,\n );\n }\n chunks.push(chunk);\n }\n}\n\n/** parsedmarc's `parse_aggregate_report_file()` on already-read content. */\nasync function parseAggregateContent(\n content: string | Uint8Array,\n config: ParserConfig,\n keepAlive: (() => unknown) | null,\n): Promise<AggregateReport> {\n let xml: string;\n try {\n xml = extractReport(content);\n } catch (error) {\n throw new InvalidAggregateReport(errorText(error) + excOrigin(error), {\n cause: error,\n });\n }\n return parseAggregateReportXml(xml, { config, keepAlive });\n}\n\n/**\n * Parses a DMARC aggregate report, DMARC failure report or SMTP TLS report\n * from a file path, bytes or a binary stream (compressed or not, report\n * email or bare report).\n *\n * A path is opened and closed here; a caller-supplied stream is read but\n * left for the caller to close. When no format matches, the\n * {@link ParserError} explains why, based on what the content looks like.\n */\nexport async function parseReportFile(\n input: ReportFileInput,\n options: ParseReportFileOptions = {},\n): Promise<ParsedReport> {\n const { keepAlive = null, ...configOptions } = options;\n const config = resolveParserConfig(configOptions);\n const raw = await readContent(input, maxReportFileSize(config));\n const content: string | Uint8Array =\n startsWith(raw, MAGIC_ZIP) || startsWith(raw, MAGIC_GZIP)\n ? extractReport(raw)\n : raw;\n\n try {\n return {\n reportType: 'aggregate',\n report: await parseAggregateContent(content, config, keepAlive),\n };\n } catch (aggregateError) {\n if (!(aggregateError instanceof InvalidAggregateReport)) {\n throw aggregateError;\n }\n try {\n return {\n reportType: 'smtp_tls',\n report: parseSmtpTlsReportJson(content, config),\n };\n } catch (smtpTlsError) {\n if (!(smtpTlsError instanceof InvalidSMTPTLSReport)) {\n throw smtpTlsError;\n }\n try {\n return await parseReportEmail(content, { config, keepAlive });\n } catch (emailError) {\n if (!(emailError instanceof InvalidDMARCReport)) {\n throw emailError;\n }\n throw new ParserError(\n describeParseFailure(\n content,\n aggregateError,\n smtpTlsError,\n emailError,\n ),\n { cause: emailError },\n );\n }\n }\n }\n}\n\n/**\n * Worker job that parses one report file (parsedmarc's\n * `parallel._parse_report_file_job`). Any error is returned with the path\n * instead of being thrown, so the caller can log it and move on.\n */\nexport async function parseReportFileJob(\n filePath: string,\n options: { config: ParserConfig },\n): Promise<[string, ParsedReport | Error]> {\n try {\n return [\n filePath,\n await parseReportFile(filePath, { config: options.config }),\n ];\n } catch (error) {\n return [\n filePath,\n error instanceof Error ? error : new Error(String(error)),\n ];\n }\n}\n\n/** The error for an mbox message over `maxEmailSize`, or `null`. */\nfunction mboxMessageTooLarge(\n mbox: MboxReader,\n key: number,\n config: ParserConfig,\n): EmailTooLargeError | null {\n const size = mbox.size(key);\n if (config.maxEmailSize > 0 && size > config.maxEmailSize) {\n return emailTooLargeError(size, config.maxEmailSize);\n }\n return null;\n}\n\n/**\n * An mbox message that failed to parse is logged and skipped. Unlike\n * parsedmarc, where any `ParserError` but `InvalidDMARCReport` ends the run\n * and loses the reports already parsed, whatever the rest of the file holds:\n * one bad attachment is such an error. A worker that crashed or timed out on\n * a message is skipped the same way. An {@link EnrichmentError} (an unusable\n * IP database, a revoked IPinfo token) ends the run instead: it would skip\n * every message.\n */\nfunction handleMboxError(error: unknown, index: number): void {\n // Not the message's fault: every other one would fail too.\n const enrichmentError = findEnrichmentError(error);\n if (enrichmentError !== null) {\n throw enrichmentError;\n }\n if (error instanceof InvalidDMARCReport) {\n logger.warning(sanitizeForLog(error.message));\n return;\n }\n const name = error instanceof Error ? error.name : 'Error';\n logger.warning(\n sanitizeForLog(\n `Skipping message ${index + 1}: ${name}: ${errorText(error)}`,\n ),\n );\n}\n\n/** Options of {@link getDmarcReportsFromMbox}. */\nexport interface GetDmarcReportsFromMboxOptions extends ParserConfigInput {\n /**\n * Worker threads used to parse messages in parallel (not part of\n * `config`). Reading, dedup and result assembly stay in the caller.\n */\n nProcs?: number;\n}\n\n/**\n * Parses an mbox file containing emails with attached DMARC and SMTP TLS\n * reports. Each message's stored bytes are parsed. A message that can't be\n * parsed or is over `maxEmailSize` is logged as a warning and skipped.\n * Duplicate aggregate reports are dropped using the config's seen-report\n * cache.\n */\nexport async function getDmarcReportsFromMbox(\n input: string,\n options: GetDmarcReportsFromMboxOptions = {},\n): Promise<ParsingResults> {\n const { nProcs = 1, ...configOptions } = options;\n const config = resolveParserConfig(configOptions);\n const aggregateReports: AggregateReport[] = [];\n const failureReports: FailureReport[] = [];\n const smtpTlsReports: SMTPTLSReport[] = [];\n const classify = (parsedEmail: ParsedReport): void => {\n classifyParsedEmail(\n parsedEmail,\n aggregateReports,\n failureReports,\n smtpTlsReports,\n { seenAggregateReportIds: config.seenAggregateReportIds },\n );\n };\n\n const mbox = await MboxReader.open(input);\n try {\n const messageKeys = mbox.keys();\n const totalMessages = messageKeys.length;\n logger.debug(`Found ${totalMessages} messages in ${input}`);\n\n if (nProcs > 1 && totalMessages > 1) {\n // Positions of the messages sent to workers, oldest first.\n const positions: number[] = [];\n async function* jobs(): AsyncGenerator<Uint8Array> {\n for (const [index, key] of messageKeys.entries()) {\n logger.info(`Processing message ${index + 1} of ${totalMessages}`);\n const tooLarge = mboxMessageTooLarge(mbox, key, config);\n if (tooLarge !== null) {\n handleMboxError(tooLarge, index);\n continue;\n }\n const content = await mbox.getBytes(key);\n positions.push(index);\n yield content;\n }\n }\n for await (const result of parallelMap<\n Uint8Array,\n ParsedReport | ParserError | Error\n >(parseReportEmailTask(config), jobs(), nProcs, {\n onJobError: error =>\n error instanceof Error ? error : new Error(String(error)),\n })) {\n const index = positions.shift() ?? 0;\n if (result instanceof Error) {\n handleMboxError(result, index);\n } else {\n classify(result);\n }\n }\n } else {\n for (const [index, key] of messageKeys.entries()) {\n logger.info(`Processing message ${index + 1} of ${totalMessages}`);\n const tooLarge = mboxMessageTooLarge(mbox, key, config);\n if (tooLarge !== null) {\n handleMboxError(tooLarge, index);\n continue;\n }\n const messageContent = await mbox.getBytes(key);\n let parsedEmail: ParsedReport;\n try {\n parsedEmail = await parseReportEmail(messageContent, { config });\n } catch (error) {\n handleMboxError(error, index);\n continue;\n }\n classify(parsedEmail);\n }\n }\n } finally {\n await mbox.close();\n }\n // parsedmarc maps mailbox.NoSuchMailboxError to InvalidDMARCReport, but\n // mailbox.mbox() creates missing files, so that branch never runs.\n return { aggregateReports, failureReports, smtpTlsReports };\n}\n"],"mappings":"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AAM;EACtB,KAAK,SAAS;CAChB;CAEA,QAAsB;EACpB,IAAI,KAAK,SAAS,GAAG;GACnB,KAAK,MAAM,KAAK,cAAc,KAAK,OAAO,SAAS,GAAG,KAAK,MAAM,CAAC,CAAC;GACnE,KAAK,SAAS;EAChB;CACF;CAEA,WAAmB;EACjB,KAAK,MAAM;EACX,OAAO,KAAK,MAAM,KAAK,EAAE;CAC3B;AACF;;;AC5PA,MAAa,iBAAoC;CAC/C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,mBAAqD;CAChE,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,OAAO;CACP,OAAO;CACP,O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CACV,SAAS;CACT,0BAA0B;CAC1B,OAAO;CACP,IAAI;CACJ,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,YAAY;CACZ,YAAY;CACZ,UAAU;CACV,cAAc;CACd,eAAe;CACf,MAAM;CACN,WAAW;CACX,WAAW;CACX,eAAe;CACf,MAAM;CACN,QAAQ;CACR,WAAW;CACX,gBAAgB;CAChB,gBAAgB;CAChB,KAAK;CACL,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,KAAK;CACL,MAAM;CACN,mBAAmB;CACnB,oBAAoB;CACpB,uBAAuB;CACvB,IAAI;CACJ,UAAU;CACV,KAAK;CACL,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,WAAW;CACX,WAAW;CACX,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,cAAc;CACd,cAAc;CACd,cAAc;CACd,cAAc;CACd,cAAc;CACd,cAAc;CACd,cAAc;CACd,cAAc;CACd,cAAc;CACd,aAAa;CACb,aAAa;CACb,gBAAgB;CAChB,cAAc;CACd,oBAAoB;CACpB,oBAAoB;AACtB;;;;;;AAOA,MAAa,oBAAsD;CACjE,OACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,QACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,OACE;CACF,WACE;CACF,WACE;CACF,YACE;CACF,YACE;CACF,YACE;CACF,YACE;CACF,YACE;CACF,YACE;CACF,WACE;CACF,WACE;CACF,WACE;CACF,WACE;CACF,WACE;CACF,WACE;CACF,WACE;CACF,WACE;CACF,QACE;CACF,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GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;EACN;CACF;CACA,QAAQ;EACN,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;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AAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,IAAI;CACX,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;CACb,CAAC,OAAO,KAAK;AACf;;;;;AAMA,MAAa,iBAET;CACF,UAAU;EACR;EAAG;EAAG;EAAI;EAAG;EAAI;EAAI;EAAG;EAAG;EAAG;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAG;EAAG;EAAG;EAAI;EACvE;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAClC;CACA,WAAW;EACT;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAI;EAAG;EAAG;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EACvE;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAClC;AACF;;ACrlDA,MAAM,UAAU;AAChB,MAAM,aAAa;AAEnB,MAAM,cAAc;AACpB,MAAMC,YAAU;AAChB,MAAM,QAAQ;AACd,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,aAAa;AAcnB,MAAM,yBAAS,IAAI,IAA4B;AAE/C,SAAS,SACP,QACA,MACA,OACA,OACA,SACM;CACN,KAAK,MAAM,CAAC,SAAS,QAAQ,OAAO,QAAQ,IAAI,GAAG;EACjD,MAAM,OAAO,OAAO,SAAS,SAAS,EAAE;EACxC,IAAI,QAAQ;EACZ,KAAK,MAAM,QAAQ,KAAK;GACtB,MAAM,QAAU,OAAO,OAAS,IAAK;GACrC,IAAI,SAAS,cACX,OAAO,SAASA;QACX,IAAI,SAAS,YAAY;IAC9B,OAAO,SAAS;IAChB,MAAM,MAAO,QAAQ,IAAK;IAC1B,MAAM,IAAI,KAAK,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,MAAM,EAAE;GACjE,OAAO,IAAI,SAAS,gBAAgB,CAAC,SACnC,OAAO,SAAS,KAAK,YAAY,CAAC,KAAKA;GAEzC,SAAS;EACX;CACF;AACF;AAEA,SAASC,aAAW,OAA+B;CACjD,MAAM,MAAoC,oBAAoB;CAC9D,IAAI,QAAQ,KAAA,GACV,MAAM,IAAI,MAAM,0BAA0B,OAAO;CAEnD,MAAM,OAAO,IAAI,SAAS,KAAA,IAAY,KAAA,IAAY,eAAe,IAAI,IAAI;CACzE,MAAM,0BAAS,IAAI,WAAA,GAAsB,EAAC,CAAC,KAAKD,SAAO;CACvD,MAAM,yBAAQ,IAAI,WAAA,KAA2B,EAAC,CAAC,KAAKA,SAAO;CAC3D,MAAM,QAAQ,IAAI,IAAoB,MAAM,KAAK;CACjD,IAAI,SAAS,KAAA,GAAW;EACtB,OAAO,IAAI,KAAK,MAAM;EACtB,MAAM,IAAI,KAAK,KAAK;CACtB;CACA,IAAI,QAAQ;CACZ,KAAK,MAAM,QAAQ,IAAI,QAAQ;EAC7B,IAAI,SAAS,cACX,OAAO,SAASA;OACX,IAAI,SAAS,cAClB,OAAO,SAAS,KAAK,YAAY,CAAC,KAAKA;EAEzC,SAAS;CACX;CACA,SAAS,OAAO,IAAI,MAAM,OAAO,IAAI,OAAO,SAAS,KAAA,CAAS;CAC9D,IAAI,UAA6B;CACjC,IAAI,IAAI,YAAY,KAAA,GAAW;EAC7B,2BAAU,IAAI,WAAA,KAA2B,EAAC,CAAC,KAAKA,SAAO;EACvD,SAAS,SAAS,IAAI,SAAS,OAAO,IAAI,OAAO,KAAK;CACxD;CACA,IAAI,UAAU,SACZ,kBAAkB,OAAO,eAAe,QAAQ,CAAC;CAEnD,OAAO;EAAE;EAAQ;EAAO;EAAS;CAAM;AACzC;AAEA,SAAS,eAAe,OAA+B;CACrD,IAAI,QAAQ,OAAO,IAAI,KAAK;CAC5B,IAAI,UAAU,KAAA,GAAW;EACvB,QAAQC,aAAW,KAAK;EACxB,OAAO,IAAI,OAAO,KAAK;CACzB;CACA,OAAO;AACT;AAEA,MAAM,eAAe;AACrB,MAAM,cAAc;AAIpB,SAAS,kBAAkB,OAAmB,OAA6B;CACzE,MAAM,QAAQ,IAAI,IAAY,MAAM,KAAK;CACzC,MAAM,YAAsB,CAAC;CAC7B,KAAK,IAAI,OAAO,cAAc,QAAQ,aAAa,QAAQ,GACzD,IAAI,CAAC,MAAM,IAAI,IAAI,GACjB,UAAU,KAAK,IAAI;CAGvB,IAAI,OAAO;CACX,KAAK,IAAI,OAAO,KAAM,QAAQ,KAAM,QAAQ,GAAG;EAC7C,MAAM,YAAY,QAAQ,MAAO,MAAO;EACxC,KAAK,IAAI,QAAQ,IAAM,SAAS,WAAW,SAAS,GAGlD,IADE,SAAS,MAAS,SAAS,MAAQ,SAAS,OAAS,SAAS,KACpD;GACV,MAAQ,OAAO,OAAS,IAAK,SAAS,UAAU,SAASD;GACzD,QAAQ;EACV;CAEJ;AACF;;AAGA,SAAS,WACP,OACA,MACA,OACQ;CACR,OAAO,OAAA,MACHA,YACC,MAAM,MAAQ,OAAO,OAAS,IAAK,UAAUA;AACpD;AAEA,SAAS,KACP,QACA,OACA,MACA,KACM;CACN,IAAI,SAAS,OACX,OAAO,KAAK,MAAM,MAAM,IAAI,GAAG,KAAK,EAAE;MAEtC,OAAO,UAAU,IAAI;AAEzB;;AAGA,SAAS,UACP,OACA,OACA,QACQ;CACR,IAAI,MAAM;CACV,OAAO,MAAM,MAAM,WAAW,MAAM,QAAQ,KAAA,KAC1C,OAAO;CAET,OAAO,OAAO,MAAM,SAAS,OAAO,GAAG,CAAC;CACxC,OAAO;AACT;AAEA,MAAM,aAAa;AACnB,MAAM,mBAAmB;AACzB,MAAM,qBAAqB;AAC3B,MAAM,kBAAkB;AACxB,MAAM,yBAAyB;AAC/B,MAAM,0BAA0B;AAIhC,SAAS,UAAU,OAAmB,OAA8B;CAClE,IACE,MAAM,QAAQ,OAAO,oBACrB,MAAM,QAAQ,OAAO,oBACrB,MAAM,QAAQ,OAAO,kBAErB,OAAO;CAET,MAAM,UAAU,MAAM,QAAQ,MAAM;CACpC,MAAM,WAAW,MAAM,QAAQ,MAAM;CACrC,MAAM,WAAW,MAAM,QAAQ,MAAM;CACrC,MAAM,MACJ,WAAW,OAAQ,WAAW,MACzB,eAAe,SAAS,UAAU,QAAS,KAC5C;CACN,MAAM,OAAO,YAAY,OAAQ,YAAY,MAAO,WAAW,MAAO;CACtE,IAAI,OAAO;CACX,IAAI,aAAa,oBACf,OAAO;MACF,IAAI,YAAY,OAAQ,YAAY,KACzC,OAAO,eAAe,UAAU,WAAW,QAAS;CAEtD,IAAI,MAAM,KAAK,OAAO,KAAK,OAAO,GAChC,OAAO;CAET,OACE,eACA,MAAM,yBACN,OAAO,0BACP;AAEJ;AAEA,MAAM,wBAAwB;AAC9B,MAAM,mCAAmC;AAIzC,SAAS,iBAAiB,OAAmB,OAA8B;CACzE,MAAM,KAAK,MAAM,UAAU;CAC3B,MAAM,KAAK,MAAM,QAAQ,MAAM;CAC/B,MAAM,KAAK,MAAM,QAAQ,MAAM;CAC/B,IACE,KAAK,OACL,KAAK,OACL,KAAK,OACL,KAAK,OACL,KAAK,MACL,KAAK,IAEL,OAAO;CAET,MAAM,KAAK,KAAK;CAChB,MAAM,MAAM,MAAM,QAAQ,MAAM,KAAK;CACrC,MAAM,KAAK,KAAK;CAChB,MAAM,KAAK,KAAK;CAChB,IAAI,KAAK,GAAG;EACV,MAAM,UAAU,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK;EACjD,IAAI,UAAU,uBACZ,OAAO;EAGT,IAAI,MAAM;EACV,IAAI,OAAO,kBAAkB,SAAS;EACtC,OAAO,MAAM,MAAM;GACjB,MAAM,SAAU,MAAM,OAAO,KAAM;GACnC,KAAK,kBAAkB,OAAO,GAAG,MAAM,MAAM,QAC3C,MAAM;QAEN,OAAO,SAAS;EAEpB;EACA,MAAM,CAAC,QAAQ,GAAG,QAAQ,KAAK,kBAAkB,QAAQ,CAAC;EAC1D,OAAO,QAAQ,SAAS;CAC1B;CACA,IAAI,MAAM,kCAAkC;EAC1C,MAAM,OACJ,UACE,KAAK,oCAAoC,KAAK,MAAM,OACtD,KAAK,KACL;EACF,OAAO,QAAQ,UAAW,OAAO;CACnC;CACA,OAAO;AACT;;;;;AAMA,SAAS,cACP,OACA,OACA,OACQ;CACR,MAAM,OAAO,MAAM,UAAU;CAC7B,IAAI,UAAU,YAAY,SAAS,YACjC,OAAO;CAET,IAAI,UAAU,WAAW;EACvB,MAAM,SAAS,MAAM,QAAQ;EAC7B,IAAI,WAAW,KAAA,KAAa,UAAU,MAAQ,UAAU,IACtD,OAAO;CAEX;CACA,IACE,UAAU,YACV,SAAS,oBACT,MAAM,QAAQ,OAAO,oBAErB,OAAO;CAET,OAAO;AACT;AAGA,SAAS,eAAe,MAAuB;CAC7C,OAAQ,QAAQ,OAAQ,QAAQ,OAAU,QAAQ,OAAQ,QAAQ;AACpE;;AAGA,SAAS,gBAAgB,SAA+B;CACtD,MAAM,EAAE,OAAO,UAAU;CACzB,MAAM,QAAQ,eAAe,KAAK;CAClC,MAAM,SAAS,IAAI,YAAY;CAC/B,IAAI,QAAQ;CACZ,OAAO,QAAQ,MAAM,QAAQ;EAC3B,MAAM,OAAO,MAAM,UAAU;EAC7B,IAAI,OAAA,KAAoB;GACtB,QAAQ,UAAU,OAAO,OAAO,MAAM;GACtC;EACF;EACA,MAAM,SAAS,MAAM,OAAO,OAAA,QAAuBA;EACnD,IAAI,WAAWA,WAAS;GACtB,OAAO,UAAU,MAAM;GACvB,SAAS;GACT;EACF;EACA,IAAI,UAAU,eAAe,CAAC,eAAe,IAAI,GAAG;GAClD,QAAQE,cAAY,QAAQ,SAAS,OAAO,QAAQ,GAAG,OAAO;GAC9D;EACF;EACA,MAAM,QAAQ,cAAc,OAAO,OAAO,KAAK;EAC/C,IAAI,QAAQ,QAAQ,MAAM,QAAQ;GAChC,QAAQA,cAAY,QAAQ,SAAS,OAAO,MAAM,QAAQ,UAAU;GACpE;EACF;EACA,MAAM,QAAQ,MAAM,QAAQ,MAAM;EAClC,IAAI,OAAsB;EAC1B,IAAI,UAAU,GACZ,OAAO,WAAW,OAAO,MAAM,KAAK;OAC/B,IAAI,UAAU,GAAG;GACtB,MAAM,QAAQ,MAAM,QAAQ,MAAM;GAClC,OACE,QAAA,MACIF,YACC,MAAM,UAAY,QAAQ,OAAS,IAAK,UAAUA;EAC3D,OAAO,IAAI,UAAU,GACnB,OAAO,iBAAiB,OAAO,KAAK;OAEpC,OAAO,UAAU,OAAO,KAAK;EAE/B,IAAI,SAAS,QAAQ,SAASA,WAAS;GACrC,QAAQE,cAAY,QAAQ,SAAS,OAAO,QAAQ,GAAG,OAAO;GAC9D;EACF;EACA,KAAK,QAAQ,OAAO,MAAO,QAAQ,IAAK,KAAK;EAC7C,SAAS;CACX;CACA,OAAO,OAAO,SAAS;AACzB;AAKA,MAAMC,QAAM;AACZ,MAAMC,OAAK;AACX,MAAMC,UAAQ;AACd,MAAM,oBAAoB;AAC1B,MAAM,OAAO;AACb,MAAM,gBAAgB;AACtB,MAAM,WAAW;AACjB,MAAM,eAAe;AACrB,MAAM,WAAW;AACjB,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAE1B,MAAM,mBAAgE;CACpE,YAAY;EAAC;EAAU;EAAgB;CAAY;CACnD,cAAc;EAAC;EAAU;EAAU;EAAgB;CAAY;CAC/D,gBAAgB;EACd;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,SAAS,YAAY,MAAuB;CAC1C,OAAQ,QAAQ,MAAQ,QAAQ,MAAS,SAAS;AACpD;AAEA,SAASC,kBAAgB,MAAmC;CAE1D,OACE,SAAS,MACT,SAAS,MACT,SAAS,MACT,SAAS,MACT,SAAS;AAEb;;AAQA,SAAS,cACP,OACA,OACA,UACA,OACoC;CACpC,MAAM,OAAO,MAAM,SAAS;CAC5B,IAAI,SAAS;CACb,IAAI,WAAW;CACf,OAAO,WAAW,mBAAmB,YAAY,GAAG;EAClD,IAAI,YAAY,MACd,OAAO;GAAE,QAAQ;GAAI,QAAQ;EAAE;EAEjC,MAAM,OAAO,MAAM,QAAQ,aAAa;EACxC,IAAI,YAAY,IAAI,GAAG;GACrB,SAAS,WAAW;GACpB;EACF;EAEA,IACE,WAAW,IAAI,QACf,SAAS,MACT,MAAM,QAAQ,WAAW,OAAO,IAEhC,YAAY;CAEhB;CACA,IAAI,YAAY,mBACd,OAAO;EAAE,QAAQ;EAAG,QAAQ;CAAE;CAEhC,MAAM,SAAS,MAAM,QAAQ,MAAM;CACnC,MAAM,QAAQ,MAAM,QAAQ,MAAM;CAClC,IAAI;CACJ,IAAI;CACJ,QAAQ,QAAR;EACE,KAAK;GACH,IAAI,WAAW,IAAM;IACnB,UAAU,QAAQ;IAClB,cAAc;GAChB,OAAO,IAAI,WAAW,MAAQ,WAAW,IAAM;IAC7C,UAAU;IACV,cAAc,WAAW,KAAO,IAAI;GACtC,OACE,OAAO;IAAE,QAAQ;IAAG,QAAQ;GAAE;GAEhC;EACF,KAAK;GACH,IAAI,WAAW,IACb,OAAO;IAAE,QAAQ;IAAG,QAAQ;GAAE;GAEhC,WAAW,MAAM,QAAQ,MAAM,KAAK;GACpC,IAAI,UAAU,MAAQ,UAAU,IAC9B,cAAc,UAAU,KAAO,IAAI;QAEnC,OAAO;IAAE,QAAQ;IAAG,QAAQ;GAAE;GAEhC;EAEF,KAAK;GACH,IACE,MAAM,QAAQ,OAAOH,SACrB,MAAM,QAAQ,OAAO,MACrB,MAAM,QAAQ,OAAO,IACrB;IACA,UAAU;IACV,cAAc;GAChB,OACE,OAAO;IAAE,QAAQ;IAAG,QAAQ;GAAE;GAEhC;EACF,SACE,OAAO;GAAE,QAAQ;GAAQ,QAAQ;EAAE;CACvC;CACA,IAAI,YAAY,iBAAiB,CAAC,SAAS,SAAS,OAAO,GACzD,OAAO;EAAE,QAAQ;EAAQ,QAAQ;CAAE;CAErC,MAAM,EAAE,eAAe;CACvB,OAAO;EAAE,QAAQ;EAAG;CAAO;AAC7B;AAEA,SAAS,WAAW,MAAuB;CACzC,OAAO,QAAQ,MAAQ,QAAQ;AACjC;AAGA,SAAS,YACP,SACA,OACA,QACA,OACQ;CACR,QAAQ,SAAR;EACE,KAAK;GACH,IAAI,UAAU,IACZ,OAAO;GAET,IAAI,UAAU,KACZ,OAAO;GAET,OAAO;EACT,KAAK,mBACH,OAAO,SAAS,MAAQ,SAAS,KAAO,QAAS,QAAQH;EAC3D,KAAK,UACH,OAAO,WAAW,KAAK,KAAK,WAAW,MAAM,IACxC,MAAM,UAAW,SAAS,KAAM,SAAS,UAAUA,YACpDA;EACN,SAEE,OAAO,WAAW,KAAK,KAAK,WAAW,MAAM,IACzC,WAAW,OAAO,QAAQ,MAAM,SAAS,IAAI,IAC7CA;CACR;AACF;AAEA,SAAS,cAAc,SAA+B;CACpD,MAAM,EAAE,UAAU;CAClB,MAAM,WAAW,iBAAiB,QAAQ,UAAU,CAAC;CACrD,MAAM,QAAQ,eAAe,QAAQ;CACrC,MAAM,QAAsB,EAAE,GAAG,CAAC,eAAe,aAAa,EAAE;CAChE,MAAM,SAAS,IAAI,YAAY;CAC/B,IAAI,mBAAmB;CACvB,IAAI,QAAQ;CACZ,MAAM,QAAQ,QAAgB,SAAS,YAAkB;EACvD,MAAM,MAAM,WAAW,aAAa,MAAM,SAAS,QAAQ;EAC3D,QAAQE,cAAY,QAAQ,SAAS,OAAO,KAAK,MAAM;CACzD;CACA,OAAO,QAAQ,MAAM,QAAQ;EAC3B,MAAM,OAAO,MAAM,UAAU;EAC7B,IAAI,kBAAkB;GAEpB,OAAO,KAAK,IAAI;GAChB,SAAS;GACT,IAAI,YAAY,IAAI,GAClB,mBAAmB;GAErB;EACF;EACA,IAAI,SAASC,OAAK;GAChB,IAAI,QAAQ,KAAK,MAAM,QAAQ;IAC7B,KAAK,GAAG,UAAU;IAClB;GACF;GACA,IAAIG,kBAAgB,MAAM,QAAQ,EAAE,GAAG;IACrC,MAAM,EAAE,QAAQ,WAAW,cAAc,OAAO,OAAO,UAAU,KAAK;IACtE,IAAI,WAAW,IACb,KAAK,GAAG,UAAU;SACb,IAAI,SAAS,GAClB,KAAK,MAAM;SAEX,SAAS;IAEX;GACF;GACA,OAAO,KAAKH,KAAG;GACf,mBAAmB;GACnB,SAAS;GACT;EACF;EACA,IAAI,OAAOE,WAAS,SAASD,MAAI;GAE/B,OAAO,KAAK,IAAI;GAChB,SAAS;GACT;EACF;EACA,IAAI,QAAA,KAAqB;GACvB,KAAK,CAAC;GACN;EACF;EACA,MAAM,UAAU,MAAM,EAAE;EACxB,IAAI,YAAY,eAAe;GAC7B,QAAQ,iBAAiB,OAAO,OAAO,MAAM;GAC7C;EACF;EACA,MAAM,QAAQ,UAAU,OAAO,IAAI;EACnC,IAAI,QAAQ,QAAQ,MAAM,QAAQ;GAChC,KAAK,GAAG,UAAU;GAClB;EACF;EACA,MAAM,OAAO,YAAY,SAAS,MAAM,MAAM,QAAQ,MAAM,GAAG,KAAK;EACpE,IAAI,SAASJ,WAAS;GACpB,KAAK,KAAK;GACV;EACF;EACA,OAAO,UAAU,IAAI;EACrB,SAAS;CACX;CACA,OAAO,OAAO,SAAS;AACzB;AAGA,SAAS,iBACP,OACA,OACA,QACQ;CACR,IAAI,MAAM;CACV,OAAO,MAAM,MAAM,QAAQ;EACzB,MAAM,OAAO,MAAM,QAAQ;EAC3B,IAAI,OAAOK,WAAS,QAAA,KAClB;EAEF,OAAO;CACT;CACA,OAAO,OAAO,MAAM,SAAS,OAAO,GAAG,CAAC;CACxC,OAAO;AACT;AAEA,MAAM,QAAQ;;AAGd,SAAS,SAAS,SAA+B;CAC/C,MAAM,EAAE,UAAU;CAClB,MAAM,SAAS,eAAe,QAAQ;CACtC,MAAM,SAAS,IAAI,YAAY;CAC/B,IAAI,SAAS;CACb,IAAI,QAAQ;CACZ,OAAO,QAAQ,MAAM,QAAQ;EAC3B,MAAM,OAAO,MAAM,UAAU;EAC7B,IAAI,SAAS,OAAO;GAClB,MAAM,OAAO,MAAM,QAAQ;GAC3B,IAAI,SAAS,KAAA,GAAW;IACtB,QAAQH,cAAY,QAAQ,SAAS,OAAO,MAAM,QAAQ,UAAU;IACpE;GACF;GACA,IAAI,SAAS,SAAS,CAAC,QACrB,OAAO,KAAK,KAAK;QACZ,IAAI,SAAS,OAAQ,CAAC,QAC3B,SAAS;QACJ,IAAI,SAASE,QAAM,CAAC,QAAQ,CAEnC,OAAO,IAAI,SAAS,OAAQ,QAC1B,SAAS;QACJ;IACL,QAAQF,cAAY,QAAQ,SAAS,OAAO,QAAQ,GAAG,OAAO;IAC9D;GACF;GACA,SAAS;GACT;EACF;EACA,IAAI,QAAA,KAAqB;GACvB,QAAQA,cAAY,QAAQ,SAAS,OAAO,QAAQ,GAAG,OAAO;GAC9D;EACF;EACA,IAAI,CAAC,QAAQ;GACX,OAAO,KAAK,IAAI;GAChB,SAAS;GACT;EACF;EACA,MAAM,SAAS,MAAM,QAAQ;EAC7B,IAAI,WAAW,KAAA,GAAW;GACxB,QAAQA,cAAY,QAAQ,SAAS,OAAO,MAAM,QAAQ,UAAU;GACpE;EACF;EACA,MAAM,OACJ,WAAW,IAAI,KAAK,WAAW,MAAM,IACjC,WAAW,QAAQ,OAAO,MAAM,SAAS,IAAI,IAC7CF;EACN,IAAI,SAASA,WAAS;GACpB,QAAQE,cAAY,QAAQ,SAAS,OAAO,QAAQ,GAAG,OAAO;GAC9D;EACF;EACA,OAAO,UAAU,IAAI;EACrB,SAAS;CACX;CACA,OAAO,OAAO,SAAS;AACzB;;;;;AAMA,SAAgB,UAAU,SAA2C;CACnE,IAAI,OAAO,OAAO,qBAAqB,QAAQ,KAAK,GAClD,OAAO,gBAAgB,OAAO;CAEhC,IAAI,OAAO,OAAO,kBAAkB,QAAQ,KAAK,GAC/C,OAAO,cAAc,OAAO;CAE9B,IAAI,QAAQ,UAAU,MACpB,OAAO,SAAS,OAAO;AAG3B;;ACrnBA,MAAM,kCAAuC,IAAI,IAAI;CACnD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;AAGD,IAAa,oBAAb,cAAuC,MAAM;CAC3C,OAAgB;CAEhB,cAAc;EACZ,MAAM,yBAAyB;CACjC;AACF;AAEA,MAAM,cAAmC,IAAI,IAAI,cAAc;AAG/D,MAAM,gBAAkD;CACtD,cAAc;CACd,cAAc;CACd,cAAc;CACd,iBAAiB;CACjB,cAAc;CACd,gBAAgB;CAChB,gBAAgB;AAClB;AAEA,MAAM,iBAAiB;AACvB,MAAM,YAAY;;AAGlB,SAAgB,kBAAkB,UAA0B;CAC1D,IAAI,SAAS;CACb,IAAI,QAAQ;CACZ,KAAK,MAAM,QAAQ,SAAS,YAAY,GACtC,IAAI,UAAU,KAAK,IAAI,GAAG;EACxB,IAAI,SAAS,OAAO,SAAS,GAC3B,UAAU;EAEZ,IAAI,KAAK,WAAW,CAAC,IAAA,KACnB,UAAU;EAEZ,QAAQ;CACV,OACE,QAAQ;CAGZ,OAAO;AACT;;;;;;AAOA,SAAgB,YAAY,UAA0B;CAIpD,IAAI,SAAS,SAAS,IAAI,GACxB,MAAM,IAAI,kBAAkB;CAE9B,MAAM,aAAa,kBAAkB,QAAQ;CAC7C,IAAI,gBAAgB,IAAI,UAAU,GAChC,MAAM,IAAI,YACR,IAAI,SAAS,yEACf;CAEF,IAAI,eAAe,WACjB,OAAO;CAET,MAAM,UACJ,iBAAiB,eACjB,iBAAiB,WAAW,WAAW,KAAK,GAAG;CACjD,KAAK,MAAM,aAAa,CAAC,SAAS,UAAU,GAC1C,IAAI,cAAc,KAAA,KAAa,YAAY,IAAI,SAAS,GACtD,OAAO;CAGX,MAAM,IAAI,YAAY,qBAAqB,UAAU;AACvD;AAEA,MAAM,cAAc,IAAI,YAAY,SAAS;CAAE,OAAO;CAAM,WAAW;AAAK,CAAC;AAC7E,MAAM,eAAe,IAAI,YAAY,SAAS,EAAE,WAAW,KAAK,CAAC;;AAGjE,SAAS,aAAa,OAAmB,OAAe,QAAQ,GAAW;CACzE,KAAK,IAAI,QAAQ,OAAO,QAAQ,MAAM,QAAQ,SAAS,GACrD,KAAK,MAAM,UAAU,MAAM,OACzB,OAAO;CAGX,OAAO,MAAM;AACf;AAEA,SAAS,YAAY,SAA+B;CAClD,MAAM,EAAE,UAAU;CAClB,IAAI,UAAU,aAAa,OAAA,GAAkB;CAC7C,IAAI,YAAY,MAAM,QACpB,OAAO,cAAc,KAAK;CAE5B,MAAM,SAAS,IAAI,YAAY;CAC/B,IAAI,QAAQ;CACZ,OAAO,UAAU,MAAM,QAAQ;EAC7B,OAAO,OAAO,MAAM,SAAS,OAAO,OAAO,CAAC;EAC5C,QAAQK,cACN,QACA,SACA,SACA,UAAU,GACV,2BACF;EACA,UAAU,aAAa,OAAA,KAAoB,KAAK;CAClD;CACA,OAAO,OAAO,MAAM,SAAS,KAAK,CAAC;CACnC,OAAO,OAAO,SAAS;AACzB;AAEA,MAAM,cAAc;CAClB;CACA;CACA;AACF;;;;;;AAOA,SAAS,aAAa,OAAmB,OAAuB;CAC9D,MAAM,OAAO,MAAM,UAAU;CAC7B,IAAI;CACJ,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACZ,IAAI,QAAQ,OAAQ,QAAQ,KAC1B,SAAS;MACJ,IAAI,QAAQ,OAAQ,QAAQ,KAAM;EACvC,SAAS;EACT,QAAQ,SAAS,MAAO,MAAO;EAC/B,QAAQ,SAAS,MAAO,MAAO;CACjC,OAAO,IAAI,QAAQ,OAAQ,QAAQ,KAAM;EACvC,SAAS;EACT,QAAQ,SAAS,MAAO,MAAO;EAC/B,QAAQ,SAAS,MAAO,MAAO;CACjC,OACE,OAAO;CAET,KAAK,IAAI,SAAS,GAAG,UAAU,QAAQ,UAAU,GAAG;EAClD,MAAM,OAAO,MAAM,QAAQ;EAC3B,IAAI,SAAS,KAAA,GACX,OAAO,EAAE,SAAS,IAAI;EAIxB,IAAI,QAFQ,WAAW,IAAI,QAAQ,QAEjB,QADN,WAAW,IAAI,QAAQ,MAEjC,OAAO,EAAE,SAAS,IAAI;CAE1B;CACA,OAAO,SAAS;AAClB;AAIA,SAASC,aAAW,SAAuB,QAAQ,GAAW;CAC5D,MAAM,EAAE,UAAU;CAClB,MAAM,QAAQ,UAAU,IAAI,QAAQ,MAAM,SAAS,KAAK;CACxD,IAAI;EACF,OAAO,YAAY,OAAO,KAAK;CACjC,QAAQ,CAER;CACA,MAAM,SAAS,IAAI,YAAY;CAC/B,IAAI,WAAW;CACf,IAAI,QAAQ;CACZ,OAAO,QAAQ,MAAM,QAAQ;EAC3B,KAAK,MAAM,UAAU,KAAA,KAAkB;GACrC,SAAS;GACT;EACF;EACA,MAAM,WAAW,aAAa,OAAO,KAAK;EAC1C,IAAI,WAAW,GAAG;GAChB,SAAS;GACT;EACF;EACA,IAAI,WAAW,OACb,OAAO,KAAK,aAAa,OAAO,MAAM,SAAS,UAAU,KAAK,CAAC,CAAC;EAElE,MAAM,SAAS,CAAC,YAAY;EAC5B,MAAM,SAAS,YAAY,CAAC,WAAW,MAAM;EAC7C,QAAQD,cAAY,QAAQ,SAAS,OAAO,QAAQ,QAAQ,MAAM;EAClE,WAAW;CACb;CACA,IAAI,WAAW,MAAM,QACnB,OAAO,KAAK,aAAa,OAAO,MAAM,SAAS,QAAQ,CAAC,CAAC;CAE3D,OAAO,OAAO,SAAS;AACzB;AAGA,SAAS,cACP,SACA,MACA,QACc;CACd,OAAO;EAAE,GAAG;EAAS,OAAO,OAAO,KAAK,GAAG,SAAS,OAAO;CAAO;AACpE;AAEA,SAAS,YACP,OACA,cACQ;CACR,MAAM,EAAE,UAAU;CAClB,IAAI,QAAQ;CACZ,IAAI,SAAS,gBAAgB;CAC7B,IAAI,iBAAiB,QAAQ,MAAM,UAAU,GAAG;EAC9C,IAAI,MAAM,OAAO,OAAQ,MAAM,OAAO,KACpC,QAAQ;OACH,IAAI,MAAM,OAAO,OAAQ,MAAM,OAAO,KAAM;GACjD,QAAQ;GACR,SAAS;EACX;CACF;CACA,MAAM,UAAU,cAAc,OAAO,IAAI,MAAM;CAC/C,MAAM,SAAS,IAAI,YAAY;CAC/B,IAAI,QAAQ;CACZ,OAAO,QAAQ,MAAM,QAAQ;EAC3B,IAAI,QAAQ,KAAK,MAAM,QAAQ;GAC7B,QAAQA,cACN,QACA,SACA,OACA,MAAM,QACN,gBACF;GACA;EACF;EACA,MAAM,QAAQ,MAAM,UAAU;EAC9B,MAAM,SAAS,MAAM,QAAQ,MAAM;EACnC,MAAM,OAAO,SAAS,QAAS,UAAU,IAAM,SAAS,IAAK;EAC7D,IAAI,QAAQ,SAAU,QAAQ,OAAQ;GACpC,MAAM,QAAQ,MAAM,QAAQ;GAC5B,MAAM,SAAS,MAAM,QAAQ;GAC7B,IAAI,UAAU,KAAA,KAAa,WAAW,KAAA,GAAW;IAC/C,QAAQA,cACN,QACA,SACA,OACA,MAAM,QACN,wBACF;IACA;GACF;GACA,MAAM,MAAM,SAAS,QAAS,UAAU,IAAM,SAAS,IAAK;GAC5D,IAAI,OAAO,SAAU,OAAO,OAAQ;IAClC,OAAO,KAAK,IAAI;IAChB,OAAO,KAAK,GAAG;IACf,SAAS;IACT;GACF;GACA,QAAQA,cACN,QACA,SACA,OACA,QAAQ,GACR,0BACF;GACA;EACF;EACA,IAAI,QAAQ,SAAU,QAAQ,OAAQ;GACpC,QAAQA,cACN,QACA,SACA,OACA,QAAQ,GACR,kBACF;GACA;EACF;EACA,OAAO,KAAK,IAAI;EAChB,SAAS;CACX;CACA,OAAO,OAAO,SAAS;AACzB;AAEA,SAAS,YACP,OACA,cACQ;CACR,MAAM,EAAE,UAAU;CAClB,IAAI,QAAQ;CACZ,IAAI,SAAS,gBAAgB;CAC7B,IAAI,iBAAiB,QAAQ,MAAM,UAAU,GAAG;EAC9C,MAAM,MAAM,MAAM,KAAK,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;EACrD,IAAI,QAAQ,eACV,QAAQ;OACH,IAAI,QAAQ,eAAe;GAChC,QAAQ;GACR,SAAS;EACX;CACF;CACA,MAAM,UAAU,cAAc,OAAO,IAAI,MAAM;CAC/C,MAAM,SAAS,IAAI,YAAY;CAC/B,IAAI,QAAQ;CACZ,OAAO,QAAQ,MAAM,QAAQ;EAC3B,IAAI,QAAQ,KAAK,MAAM,QAAQ;GAC7B,QAAQA,cACN,QACA,SACA,OACA,MAAM,QACN,gBACF;GACA;EACF;EACA,MAAM,KAAK,MAAM,UAAU;EAC3B,MAAM,KAAK,MAAM,QAAQ,MAAM;EAC/B,MAAM,KAAK,MAAM,QAAQ,MAAM;EAC/B,MAAM,KAAK,MAAM,QAAQ,MAAM;EAC/B,MAAM,OAAO,UACR,KAAM,MAAM,IAAM,MAAM,KAAO,MAAM,QAAS,KAC7C,MAAM,KAAO,MAAM,KAAO,MAAM,IAAK,QAAQ;EACnD,IAAI,OAAO,WAAa,QAAQ,SAAU,QAAQ,OAAS;GACzD,QAAQA,cACN,QACA,SACA,OACA,QAAQ,GACR,OAAO,UACH,sCACA,0DACN;GACA;EACF;EACA,OAAO,UAAU,IAAI;EACrB,SAAS;CACX;CACA,OAAO,OAAO,SAAS;AACzB;AAGA,MAAM,OAAO;AACb,MAAM,QAAQ;AAEd,SAAS,YAAY,MAAsB;CACzC,IAAI,QAAQ,MAAQ,QAAQ,IAC1B,OAAO,OAAO;CAEhB,IAAI,QAAQ,MAAQ,QAAQ,KAC1B,OAAO,OAAO,KAAO;CAEvB,IAAI,QAAQ,MAAQ,QAAQ,IAC1B,OAAO,OAAO,KAAO;CAEvB,IAAI,SAAS,MACX,OAAO;CAET,IAAI,SAAS,IACX,OAAO;CAET,OAAO;AACT;AAEA,SAAS,cAAc,MAAuB;CAC5C,OAAO,OAAA,OAAsB,SAAS;AACxC;AAEA,SAAS,gBAAgB,MAAuB;CAC9C,OAAO,QAAQ,SAAU,QAAQ;AACnC;AAEA,SAASE,iBAAe,MAAuB;CAC7C,OAAO,QAAQ,SAAU,QAAQ;AACnC;AAYA,SAAS,cACP,OACA,OACA,QACM;CACN,MAAM,SAAU,MAAM,UAAU,IAAK;CACrC,MAAM,QAAQ;CACd,IAAI,MAAM,OAAO,IACf;CAEF,MAAM,OAAO,MAAM,WAAY,MAAM,OAAO;CAC5C,MAAM,QAAQ;CACd,MAAM,WAAW,KAAK,MAAM,QAAQ;CACpC,IAAI,MAAM,cAAc,GAAG;EACzB,IAAIA,iBAAe,IAAI,GAAG;GACxB,OAAO,KAAK,MAAM,SAAS;GAC3B,OAAO,KAAK,IAAI;GAChB,MAAM,YAAY;GAClB;EACF;EACA,OAAO,KAAK,MAAM,SAAS;EAC3B,MAAM,YAAY;CACpB;CACA,IAAI,gBAAgB,IAAI,GACtB,MAAM,YAAY;MAElB,OAAO,KAAK,IAAI;AAEpB;AAIA,SAAS,eACP,SACA,OACA,OACA,QACQ;CACR,MAAM,OAAO,QAAQ,MAAM,UAAU;CACrC,MAAM,UAAU;CAChB,IAAI,MAAM,QAAQ,GAChB,OAAOF,cACL,QACA,SACA,MAAM,YACN,QAAQ,GACR,qCACF;CAEF,IAAI,MAAM,OAAO,KAAK,MAAM,WAAW,GACrC,OAAOA,cACL,QACA,SACA,MAAM,YACN,QAAQ,GACR,yCACF;CAEF,IAAI,MAAM,cAAc,KAAK,cAAc,IAAI,GAC7C,OAAO,KAAK,MAAM,SAAS;CAE7B,MAAM,YAAY;CAElB,OAAO,SAAS,QAAQ,QAAQ,IAAI;AACtC;AAEA,SAAS,WAAW,SAA+B;CACjD,MAAM,EAAE,UAAU;CAClB,MAAM,SAAS,IAAI,YAAY;CAC/B,MAAM,QAAmB;EACvB,SAAS;EACT,MAAM;EACN,QAAQ;EACR,WAAW;EACX,YAAY;CACd;CACA,IAAI,QAAQ;CACZ,SAAS;EACP,OAAO,QAAQ,MAAM,QAAQ;GAC3B,MAAM,OAAO,MAAM,UAAU;GAC7B,IAAI,MAAM,SAAS;IACjB,MAAM,QAAQ,YAAY,IAAI;IAC9B,IAAI,SAAS,GAAG;KACd,SAAS;KACT,cAAc,OAAO,OAAO,MAAM;IACpC,OACE,QAAQ,eAAe,SAAS,OAAO,OAAO,MAAM;IAEtD;GACF;GACA,IAAI,SAAS,MAAM;IACjB,MAAM,OAAO,MAAM,QAAQ;IAC3B,IAAI,SAAS,OAAO;KAClB,OAAO,KAAK,IAAI;KAChB,SAAS;IACX,OAAO,IAAI,SAAS,KAAA,KAAa,YAAY,IAAI,IAAI,GACnD,QAAQA,cACN,QACA,SACA,OACA,QAAQ,GACR,qBACF;SACK;KACL,MAAM,UAAU;KAChB,MAAM,YAAY;KAClB,MAAM,OAAO;KACb,MAAM,SAAS;KACf,MAAM,aAAa;KACnB,SAAS;IACX;IACA;GACF;GACA,IAAI,cAAc,IAAI,GAAG;IACvB,IAAI,MAAM,QAAQ;IAClB,OAAO,MAAM,MAAM,UAAU,cAAc,MAAM,QAAQ,CAAC,GACxD,OAAO;IAET,OAAO,OAAO,MAAM,SAAS,OAAO,GAAG,CAAC;IACxC,QAAQ;IACR;GACF;GACA,QAAQA,cACN,QACA,SACA,OACA,QAAQ,GACR,8BACF;EACF;EACA,MAAM,eACJ,MAAM,YACL,MAAM,cAAc,KACnB,MAAM,QAAQ,KACb,MAAM,OAAO,KAAK,MAAM,WAAW;EACxC,MAAM,UAAU;EAChB,IAAI,CAAC,cACH;EAEF,QAAQA,cACN,QACA,SACA,MAAM,YACN,MAAM,QACN,6BACF;EACA,IAAI,SAAS,MAAM,QACjB;CAEJ;CACA,OAAO,OAAO,SAAS;AACzB;AAEA,MAAM,YAAY;AAElB,SAAS,uBAAuB,SAA+B;CAC7D,MAAM,EAAE,UAAU;CAClB,MAAM,SAAS,IAAI,YAAY;CAC/B,IAAI,QAAQ;CACZ,OAAO,QAAQ,MAAM,QAAQ;EAE3B,KADa,MAAM,UAAU,OAChB,IAAM;GACjB,IAAI,MAAM,QAAQ;GAClB,OAAO,MAAM,MAAM,UAAU,MAAM,SAAS,IAC1C,OAAO;GAET,OAAO,OAAO,MAAM,SAAS,OAAO,GAAG,CAAC;GACxC,QAAQ;GACR;EACF;EAEA,IAAI,MAAM;EACV,OAAO,MAAM,QAAQ,SAAS,IAC5B,OAAO;EAET,MAAM,OAAO,MAAM,QAAQ;EAC3B,IAAI,MAAM,MAAM,KAAM,SAAS,OAAQ,SAAS,IAAO;GACrD,OAAO,KAAK,KAAK,OAAO,GAAG,CAAC;GAC5B,SAAS;GACT;EACF;EACA,OAAO,KAAK,KAAK,OAAO,MAAM,CAAC,CAAC;EAChC,MAAM,cAAc,QAAQ,MAAM;EAClC,MAAM,SAAS,SAAS,MAAO,IAAI;EACnC,IAAI,MAAM;EACV,IAAI,WAAW,cAAc;EAC7B,OACE,IAAI,SAAS,UACb,UAAU,KAAK,OAAO,aAAa,MAAM,aAAa,CAAC,CAAC,GACxD;GACA,OAAO,OAAO,aAAa,MAAM,aAAa,CAAC;GAC/C,YAAY;EACd;EACA,MAAM,OAAO,IAAI,SAAS,SAAS,KAAK,OAAO,SAAS,KAAK,EAAE;EAC/D,IAAI,SAAS,IACX,QAAQA,cACN,QACA,SACA,aACA,UACA,eAAe,SAAS,MAAO,MAAM,IAAI,YAC3C;OACK,IAAI,OAAO,SAChB,QAAQA,cACN,QACA,SACA,aACA,UACA,0BACF;OACK;GACL,OAAO,UAAU,IAAI;GACrB,QAAQ;EACV;CACF;CACA,OAAO,OAAO,SAAS;AACzB;AAEA,MAAM,gCAAgB,IAAI,IAAyB;AAGnD,SAAS,aAAa,OAAe,OAA4B;CAC/D,IAAI,QAAQ,cAAc,IAAI,KAAK;CACnC,IAAI,UAAU,KAAA,GAAW;EACvB,wBAAQ,IAAI,YAAA,GAAwB;EACpC,MAAM,SAAS,MAAM,WAAA,MAA0B,IAAA;EAC/C,KAAK,IAAI,OAAO,GAAG,OAAO,QAAQ,QAAQ,GACxC,MAAM,QAAQ;EAEhB,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GACjD,MAAM,SAAS,SAAS,MAAM,WAAW,KAAK;EAEhD,cAAc,IAAI,OAAO,KAAK;CAChC;CACA,OAAO;AACT;AAEA,SAAS,cAAc,OAAqB,OAAuB;CACjE,MAAM,QAAQ,aAAa,MAAM,OAAO,KAAK;CAE7C,MAAM,UAAU;EAAE,GAAG;EAAO,OAAO;CAAU;CAC7C,MAAM,EAAE,UAAU;CAElB,MAAM,SAAS,IAAI,YAAY,MAAM,MAAM;CAC3C,IAAI,QAAQ;CACZ,OAAO,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACvC,MAAM,OAAO,MAAM,MAAM,UAAU,MAAM;EACzC,IAAI,SAAS,gBACX;EAEF,OAAO,SAAS;CAClB;CACA,IAAI,UAAU,MAAM,QAClB,OAAO,iBAAiB,MAAM;CAEhC,MAAM,SAAS,IAAI,YAAY;CAC/B,OAAO,KAAK,iBAAiB,OAAO,SAAS,GAAG,KAAK,CAAC,CAAC;CACvD,OAAO,QAAQ,MAAM,QAAQ;EAC3B,MAAM,OAAO,MAAM,MAAM,UAAU,MAAM;EACzC,IAAI,SAAS,gBACX,QAAQA,cACN,QACA,SACA,OACA,QAAQ,GACR,+BACF;OACK;GACL,OAAO,KAAK,IAAI;GAChB,SAAS;EACX;CACF;CACA,OAAO,OAAO,SAAS;AACzB;AAEA,MAAM,MAAM;AACZ,MAAM,kCAAuC,IAAI,IAAI;CACnD;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,gBAAgB,OAAmB,OAAwB;CAClE,OACE,MAAM,WAAW,OACjB,gBAAgB,IACd,OAAO,aAAa,MAAM,QAAQ,MAAM,GAAG,MAAM,QAAQ,MAAM,CAAC,CAClE;AAEJ;AAKA,SAAS,qBAAqB,OAA+B;CAC3D,MAAM,SAAS,IAAI,WAAW,MAAM,MAAM;CAC1C,IAAI,SAAS;CACb,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACpD,IAAI,gBAAgB,OAAO,KAAK,KAAK,gBAAgB,OAAO,QAAQ,CAAC,GAAG;GACtE,SAAS;GACT;EACF;EACA,OAAO,UAAU,MAAM,UAAU;EACjC,UAAU;CACZ;CACA,OAAO,OAAO,SAAS,GAAG,MAAM;AAClC;AAGA,SAAS,aAAa,SAAuB,OAAuB;CAClE,MAAM,QACJ,UAAU,gBACN,qBAAqB,QAAQ,KAAK,IAClC,QAAQ;CACd,IAAI,QAAQ,WAAW,UACrB,IAAI;EACF,OAAO,IAAI,YAAY,OAAO;GAAE,OAAO;GAAM,WAAW;EAAK,CAAC,CAAC,CAAC,OAC9D,KACF;CACF,QAAQ;EACN,MAAM,IAAI,mBACR,IAAI,QAAQ,MAAM,uDACpB;CACF;CAEF,MAAM,OAAO,IAAI,YAAY,OAAO,EAAE,WAAW,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK;CAErE,OAAO,QAAQ,WAAW,WAAW,KAAK,WAAA,KAAwB,EAAE,IAAI;AAC1E;;;;;AAMA,SAAgB,SACd,OACA,UACA,SAAsB,UACd;CACR,MAAM,QAAQ,YAAY,QAAQ;CAClC,MAAM,UAAwB;EAAE;EAAO;EAAO;CAAO;CACrD,QAAQ,OAAR;EACE,KAAK,SACH,OAAO,YAAY,OAAO;EAC5B,KAAK,WACH,OAAO,cAAc,KAAK;EAC5B,KAAK,SACH,OAAO,WAAW,OAAO;EAC3B,KAAK,SACH,OAAOC,aAAW,OAAO;EAC3B,KAAK,aACH,OAAOA,aACL,SACA,MAAM,OAAO,OAAQ,MAAM,OAAO,OAAQ,MAAM,OAAO,MAAO,IAAI,CACpE;EACF,KAAK,UACH,OAAO,YAAY,SAAS,IAAI;EAClC,KAAK,aACH,OAAO,YAAY,SAAS,IAAI;EAClC,KAAK,aACH,OAAO,YAAY,SAAS,KAAK;EACnC,KAAK,UACH,OAAO,YAAY,SAAS,IAAI;EAClC,KAAK,aACH,OAAO,YAAY,SAAS,IAAI;EAClC,KAAK,aACH,OAAO,YAAY,SAAS,KAAK;EACnC,KAAK,sBACH,OAAO,uBAAuB,OAAO;EACvC,KAAK,aACH,MAAM,IAAI,aAAa,oBAAoB;CAG/C;CACA,MAAM,QAAQ,kBAAkB;CAChC,IAAI,UAAU,KAAA,GACZ,OAAO,cAAc,SAAS,KAAK;CAErC,MAAM,MAAM,UAAU,OAAO;CAC7B,IAAI,QAAQ,KAAA,GACV,OAAO;CAET,MAAM,QAAQ,cAAc;CAC5B,IAAI,UAAU,KAAA,GACZ,OAAO,aAAa,SAAS,KAAK;CAEpC,MAAM,IAAI,YAAY,qBAAqB,UAAU;AACvD;AAEA,SAAS,mBAAmB,MAAsB;CAChD,IAAI,OAAA,KACF,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;CAEhD,IAAI,OAAO,OACT,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;CAEhD,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;AAChD;;AAGA,IAAM,cAAN,MAAkB;CAChB;CACA,SAAS;CAET,YAAY,UAAkB;EAC5B,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,UAAU,EAAE,CAAC;CACrD;CAEA,KAAK,MAAoB;EACvB,IAAI,KAAK,WAAW,KAAK,OAAO,QAC9B,KAAK,KAAK,CAAC;EAEb,KAAK,OAAO,KAAK,UAAU;EAC3B,KAAK,UAAU;CACjB;CAEA,MAAM,OAAyB;EAC7B,IAAI,KAAK,SAAS,MAAM,SAAS,KAAK,OAAO,QAC3C,KAAK,KAAK,MAAM,MAAM;EAExB,KAAK,OAAO,IAAI,OAAO,KAAK,MAAM;EAClC,KAAK,UAAU,MAAM;CACvB;CAEA,KAAa,OAAqB;EAChC,MAAM,OAAO,IAAI,WACf,KAAK,IAAI,KAAK,OAAO,SAAS,GAAG,KAAK,SAAS,KAAK,CACtD;EACA,KAAK,IAAI,KAAK,OAAO,SAAS,GAAG,KAAK,MAAM,CAAC;EAC7C,KAAK,SAAS;CAChB;CAEA,SAAqB;EACnB,OAAO,KAAK,OAAO,SAAS,GAAG,KAAK,MAAM;CAC5C;AACF;AAEA,MAAM,eAAe,IAAI,YAAY;;AAGrC,SAAS,YAAY,MAAc,OAAuB;CACxD,OAAO,KAAK,YAAY,KAAK,KAAK;AACpC;AAEA,SAASE,cACP,OACA,MACA,WACA,UACA,OACA,QACO;CACP,MAAM,QAAQ,YAAY,MAAM,SAAS;CACzC,IAAI,MAAM,WAAW;CACrB,IAAI,OAAO,aAAa,QAAQ,QAAS,IAAI;CAC7C,OAAO,OAAO,KAAK,QAAQ;EACzB,MAAM,OAAO,YAAY,MAAM,IAAI;EACnC,IAAI,OAAO,OACT;EAEF,OAAO;EACP,QAAQ,OAAO,QAAS,IAAI;CAC9B;CACA,IAAI,MAAM,aAAa,GACrB,MAAM,IAAI,mBACR,IAAI,MAAM,kCAAkC,mBAAmB,KAAK,EAAE,gBAAgB,SAAS,IAAI,QACrG;CAEF,MAAM,IAAI,mBACR,IAAI,MAAM,8CAA8C,SAAS,GAAG,MAAM,EAAE,IAAI,QAClF;AACF;AAGA,SAAS,iBAAiB,MAAc,OAAuB;CAC7D,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAChD,IAAI,KAAK,WAAW,KAAK,KAAK,OAC5B,OAAO;CAGX,OAAO,KAAK;AACd;AAEA,SAAS,cACP,MACA,OACA,OACA,QACY;CACZ,MAAM,eAAe,iBAAiB,MAAM,KAAK;CACjD,IACE,iBAAiB,KAAK,WACrB,UAAA,OACC,iBAAiB,MAAA,GAAiB,MAAM,KAAK,SAG/C,OAAO,aAAa,OAAO,IAAI;CAEjC,MAAM,SAAS,IAAI,WAAW,KAAK,MAAM;CACzC,KAAK,IAAI,QAAQ,GAAG,QAAQ,cAAc,SAAS,GACjD,OAAO,SAAS,KAAK,WAAW,KAAK;CAEvC,IAAI,iBAAiB,KAAK,QACxB,OAAO;CAGT,MAAM,UAAU,IAAI,YAAY,KAAK,MAAM;CAC3C,QAAQ,MAAM,OAAO,SAAS,GAAG,YAAY,CAAC;CAC9C,IAAI,WAAW;CACf,IAAI,QAAQ;CACZ,OAAO,QAAQ,KAAK,QAAQ;EAC1B,MAAM,OAAO,YAAY,MAAM,KAAK;EACpC,MAAM,QAAQ,OAAO,QAAS,IAAI;EAClC,IAAI,OAAO,OACT,QAAQ,KAAK,IAAI;OACZ,IACL,WAAW,qBACX,QAAQ,SACR,QAAQ,OAER,QAAQ,KAAK,OAAO,KAAM;OACrB,IAAI,WAAW,WACpB,QAAQ,KAAK,EAAI;OACZ,IAAI,WAAW,oBACpB,QAAQ,MAAM,aAAa,OAAO,mBAAmB,IAAI,CAAC,CAAC;OACtD,IAAI,WAAW,UACpB,cACE,OACA,MACA,OACA,UACA,OACA,wBAAwB,MAAM,EAChC;EAEF,SAAS;EACT,YAAY;CACd;CACA,OAAO,QAAQ,OAAO;AACxB;AAEA,SAAS,WAAW,MAAc,QAAiC;CACjE,IAAI,KAAK,aAAa,GACpB,OAAO,aAAa,OAAO,IAAI;CAGjC,MAAM,UAAU,IAAI,YAAY,KAAK,SAAS,CAAC;CAC/C,IAAI,WAAW;CACf,IAAI,WAAW;CACf,IAAI,QAAQ;CACZ,OAAO,QAAQ,KAAK,QAAQ;EAC1B,MAAM,OAAO,YAAY,MAAM,KAAK;EACpC,MAAM,QAAQ,OAAO,QAAS,IAAI;EAClC,IAAI,QAAQ,SAAU,QAAQ,OAAQ;GACpC,QAAQ,MAAM,aAAa,OAAO,KAAK,MAAM,UAAU,KAAK,CAAC,CAAC;GAC9D,IAAI,WAAW,qBAAqB,QAAQ,SAAU,QAAQ,OAC5D,QAAQ,KAAK,OAAO,KAAM;QACrB,IAAI,WAAW,WACpB,QAAQ,KAAK,EAAI;QACZ,IAAI,WAAW,oBACpB,QAAQ,MAAM,aAAa,OAAO,mBAAmB,IAAI,CAAC,CAAC;QACtD,IAAI,WAAW,UACpB,MAAM,IAAI,mBACR,4CAA4C,KAAK,SAAS,EAAE,EAAE,gBAAgB,SAAS,yBACzF;GAEF,WAAW,QAAQ;EACrB;EACA,SAAS;EACT,YAAY;CACd;CACA,QAAQ,MAAM,aAAa,OAAO,KAAK,MAAM,QAAQ,CAAC,CAAC;CACvD,OAAO,QAAQ,OAAO;AACxB;;AAGA,SAAS,uBAAuB,MAA0B;CACxD,MAAM,YAAY,iBAAiB,MAAA,GAAkB;CACrD,MAAM,UAAU,IAAI,YAAY,KAAK,MAAM;CAC3C,KAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,SAAS,GAC9C,QAAQ,KAAK,KAAK,WAAW,KAAK,CAAC;CAErC,IAAI,QAAQ;CACZ,OAAO,QAAQ,KAAK,QAAQ;EAC1B,MAAM,OAAO,YAAY,MAAM,KAAK;EACpC,IAAI,OAAA,KACF,QAAQ,KAAK,IAAI;OACZ;GACL,MAAM,SACJ,OAAO,QACH,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,MACvC,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;GAC7C,QAAQ,MAAM,aAAa,OAAO,MAAM,CAAC;EAC3C;EACA,SAAS,OAAO,QAAS,IAAI;CAC/B;CACA,OAAO,QAAQ,OAAO;AACxB;;;;;AAMA,SAAgB,SACd,MACA,UACA,SAAsB,UACV;CAEZ,QADc,YAAY,QACd,GAAZ;EACE,KAAK,SACH,OAAO,WAAW,MAAM,MAAM;EAChC,KAAK,SACH,OAAO,cAAc,MAAM,SAAA,KAAsB,MAAM;EACzD,KAAK,WACH,OAAO,cAAc,MAAM,WAAA,KAAyB,MAAM;EAC5D,KAAK,sBACH,OAAO,uBAAuB,IAAI;EACpC,SACE,MAAM,IAAI,YAAY,wCAAwC,UAAU;CAC5E;AACF;;;AC9iCA,IAAa,WAAb,cAA8B,MAAM;CAClC,OAAgB;AAClB;AAEA,MAAMC,eAAa;AACnB,MAAM,cAAc;AAGpB,MAAM,cAAc;AACpB,MAAM,YAAY;AAClB,MAAM,oBAAoB;AAC1B,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AACzB,MAAM,UAAU;AAChB,MAAM,UAAU;AAChB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,aAAa;;AAGnB,MAAMC,OAAK;AACX,MAAMC,OAAK,OAAOD;AAClB,MAAME,sBAAoB;CACxB,KAAKF;CACL,KAAKA;CACL,MAAMA;CACNC;CACA,IAAIA;CACJ,IAAIA;CACJ,KAAKA;CACL,KAAKA;CACL,KAAKA;CACL,KAAKA;CACL,KAAKA;CACL,KAAKA;CACL,KAAKA;CACL,KAAKA;CACL,MAAMA;CACN,MAAMA;CACN,MAAMA;AACR;;AAGA,MAAM,SACJ,s+DA+BC,MAAM,GAAG,CAAC,CACV,IAAI,MAAM;;AAGb,MAAM,mBAAgC;CACpC,MAAM,wBAAQ,IAAI,YAAY,GAAG;CACjC,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG;EAC3C,IAAI,MAAM,SAAS;EACnB,KAAK,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,GAChC,MAAM,MAAM,aAAiB,OAAO,IAAK,WAAgB,OAAO;EAElE,MAAM,SAAS,QAAQ;CACzB;CACA,OAAO;AACT,EAAA,CAAG;;AAGH,SAAS,UAAU,KAAa,MAAsB;CACpD,QACI,OAAO,IAAM,WAAY,QAAQ,KAAM,QAAQ,UAAsB;AAE3E;AAEA,IAAM,YAAN,cAAwB,MAAM,CAAC;;;;;;AAO/B,IAAa,kBAAb,MAA6B;;CAE3B,MAAM;;CAEN,SAAS;CAGT,wBAA4B,IAAI,WAAW,CAAC;CAC5C,WAAmB;CACnB,SAAiB;CACjB,SAAiB;CAGjB,yBAA6B,IAAI,WAAW,CAAC;CAC7C,eAAuB;CACvB,WAAmB;CAGnB,WAAmB;CACnB,gBAAwB;CACxB,qBAA0B,IAAI,YAAY,CAAC;CAC3C,iBAAyB;CACzB,oBAA4B;CAC5B,qBAA6B;CAC7B,wBAAgC;CAChC,kBAA0B;CAC1B,UAAkB;CAClB,aAAqB;CACrB,cAAsB;CACtB,aAAqB;CACrB,KAAa;CACb,OAAe;CACf,aAAqB;CACrB,SAAiB;CACjB,QAAgB;CAChB,UAAyD,KAAK,IAAI;;;;;CAMlE,WAAW,MAAkB,YAAoB,KAAyB;EACxE,IAAI,KAAK,KACP,MAAM,IAAI,MAAM,+BAA+B;EAEjD,MAAM,OAAO,KAAK,MAAM,SAAS,KAAK,QAAQ;EAC9C,MAAM,QAAQ,IAAI,WAAW,KAAK,SAAS,KAAK,MAAM;EACtD,MAAM,IAAI,IAAI;EACd,MAAM,IAAI,MAAM,KAAK,MAAM;EAC3B,KAAK,QAAQ;EACb,KAAK,WAAW;EAChB,KAAK,SAAS;EACd,IAAI,SAAS;EACb,IAAI,WAAWC,oBAAkB;EACjC,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,UAAU,GAAG,CAAC;EACpD,KAAK,eAAe;EACpB,KAAK,WAAW,KAAK,OAAO;EAC5B,SAAS;GAEP,IADkB,KAAK,aACX,GAAG;IACb,KAAK,MAAM;IACX;GACF;GACA,MAAM,UAAU,KAAK,MAAM,SAAS,KAAK;GACzC,IAAI,KAAK,aAAa,KAAK,KAAK,gBAAgB,KAAK;IAGnD,KAAK,SAAS,EAAE,KAAK,iBAAiB,YAAY,YAAY;IAC9D;GACF;GACA,IAAI,YAAY,GACd;GAEF,IAAI,KAAK,aAAa,GAAG;IACvB,UAAU;IACV,YACEA,oBAAkB,KAAK,IAAI,QAAQA,oBAAkB,SAAS,CAAC,MAC/D;IACF,KAAK,KAAK,KAAK,IAAI,UAAU,GAAG,CAAC;GACnC;EACF;EACA,OAAO,KAAK,OAAO,SAAS,GAAG,KAAK,YAAY;CAClD;CAEA,KAAa,MAAoB;EAC/B,MAAM,QAAQ,IAAI,WAAW,IAAI;EACjC,MAAM,IAAI,KAAK,OAAO,SAAS,GAAG,KAAK,YAAY,CAAC;EACpD,KAAK,SAAS;EACd,KAAK,WAAW,OAAO,KAAK;CAC9B;;CAGA,eAAgC;EAC9B,IAAI;GACF,SAAS;IACP,IAAI,KAAK,UAAU;KACjB,IACE,KAAK,kBAAkB,KAAK,gBAAgB,IAAI,KAAK,UAAU,GAE/D,MAAM,IAAI,UAAU;KAEtB,IACE,KAAK,eAAe,KAAK,aAAa,KACtC,KAAK,gBAAgB,GAErB,OAAO;KAET,IAAI,CAAC,KAAK,uBAAuB,MAAM,KAAK,gBAC1C,MAAM,IAAI,UAAU;KAEtB,KAAK,0BACA,KAAK,yBAAyB,IAC9B,KAAK,0BAA0B,MAChC,CAAC,KAAK,wBACR;KACF,KAAK,WAAW;IAClB;IACA,MAAM,OAAO,KAAK,QAAQ,KAAK;IAC/B,IAAI,KAAK,SAAS,MAAM;KACtB,IAAI,KAAK,0BAA0B,KAAK,mBACtC,MAAM,IAAI,UAAU;KAEtB,OAAO;IACT;IACA,IAAI,KAAK,UAAUH,cACjB,OAAO;IAET,KAAK,WAAW;GAClB;EACF,SAAS,OAAO;GACd,IAAI,iBAAiB,WACnB,MAAM,IAAI,SAAS,qBAAqB;GAE1C,MAAM;EACR;CACF;;CAGA,KAAa,OAAwB;EACnC,OAAO,KAAK,SAAS,OAAO;GAC1B,IAAI,KAAK,YAAY,KAAK,MAAM,QAC9B,OAAO;GAET,KAAK,UACD,KAAK,UAAU,IAAM,KAAK,MAAM,KAAK,eAA0B;GACnE,KAAK,YAAY;GACjB,KAAK,UAAU;EACjB;EACA,OAAO;CACT;CAEA,KAAa,OAAuB;EAClC,KAAK,UAAU;EACf,OAAQ,KAAK,WAAW,KAAK,UAAY,KAAK,SAAS;CACzD;CAEA,CAAS,KAAK,OAA+C;EAC3D,OAAO,CAAC,KAAK,KAAK,KAAK,GACrB,MAAMA;EAER,OAAO,KAAK,KAAK,KAAK;CACxB;CAEA,CAAS,SAAyC;EAChD,IAAI,QAAQ;EACZ,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,SAAU,SAAS,KAAM,OAAO,KAAK,KAAK,CAAC,QAAQ;EAErD,OAAO;CACT;CAEA,CAAS,OAAO,OAAwD;EACtE,KAAK,MAAM,QAAQ,OACjB,KAAK,OAAO,KAAK,KAAK,CAAC,OAAO,MAC5B,MAAM,IAAI,UAAU;CAG1B;CAGA,CAAS,MAAoC;EAC3C,KAAK,MAAM,QAAQ;GAAC;GAAM;GAAM;EAAI,GAClC,KAAK,OAAO,KAAK,KAAK,CAAC,OAAO,MAC5B,MAAM,IAAI,UAAU;EAGxB,MAAM,QAAQ,OAAO,KAAK,KAAK,CAAC;EAChC,IAAI,QAAQ,MAAQ,QAAQ,IAC1B,MAAM,IAAI,UAAU;EAEtB,KAAK,gBAAgB,QAAQ;EAC7B,KAAK,KAAK,IAAI,YAAY,KAAK,gBAAgB,UAAU;EACzD,SAAS;GACP,MAAM,QAAQ,OAAO,KAAK,KAAK,CAAC;GAChC,IAAI,UAAU,IACZ;GAEF,IAAI,UAAU,IACZ,MAAM,IAAI,UAAU;GAEtB,OAAO,KAAK,OAAO;IAAC;IAAM;IAAM;IAAM;IAAM;GAAI,CAAC;GACjD,KAAK,iBAAiB,OAAO,KAAK,OAAO;GACzC,OAAO,KAAK,MAAM;GAClB,MAAM;EACR;EACA,OAAO,KAAK,OAAO;GAAC;GAAM;GAAM;GAAM;GAAM;EAAI,CAAC;EACjD,KAAK,oBAAoB,OAAO,KAAK,OAAO;CAC9C;CAGA,CAAS,QAAsC;EAC7C,KAAK,mBAAmB,OAAO,KAAK,KAAK,CAAC,OAAO;EACjD,IAAI,UAAU;EACd,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,UAAW,WAAW,KAAM,OAAO,KAAK,KAAK,CAAC;EAEhD,IAAI,UAAU,KAAK,aAAa,KAAK,eACnC,MAAM,IAAI,UAAU;EAEtB,KAAK,UAAU;EAGf,MAAM,UAAqB,CAAC;EAC5B,KAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,SAAS,GACvC,QAAQ,MAAM,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC;EAE1C,MAAM,6BAAa,IAAI,WAAW,GAAG;EACrC,IAAI,SAAS;EACb,MAAM,wBAAQ,IAAI,WAAW,GAAG;EAChC,KAAK,IAAI,OAAO,GAAG,OAAO,IAAI,QAAQ,GACpC,IAAI,QAAQ,UAAU,MACf;QAAA,IAAI,MAAM,GAAG,MAAM,IAAI,OAAO,GACjC,KAAK,OAAO,KAAK,KAAK,CAAC,OAAO,GAC5B,MAAM,OAAO,KAAK,OAAO;EAAA;EAKjC,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAS,GACxC,IAAI,MAAM,WAAW,GAAG;GACtB,WAAW,UAAU;GACrB,UAAU;EACZ;EAEF,IAAI,WAAW,GACb,MAAM,IAAI,UAAU;EAEtB,MAAM,YAAY,SAAS;EAG3B,MAAM,UAAU,OAAO,KAAK,KAAK,CAAC;EAClC,IAAI,UAAU,KAAK,UAAU,aAC3B,MAAM,IAAI,UAAU;EAEtB,IAAI,aAAa,OAAO,KAAK,KAAK,EAAE;EACpC,IAAI,aAAa,GACf,MAAM,IAAI,UAAU;EAEtB,MAAM,cAAc,IAAI,WAAW,gBAAgB;EACnD,KAAK,IAAI,QAAQ,GAAG,QAAQ,YAAY,SAAS,GAAG;GAClD,IAAI,QAAQ;GACZ,QAAQ,OAAO,KAAK,KAAK,CAAC,OAAO,GAAG;IAClC,SAAS;IACT,IAAI,SAAS,SACX,MAAM,IAAI,UAAU;GAExB;GACA,IAAI,QAAQ,kBACV,YAAY,SAAS;EAEzB;EACA,IAAI,aAAa,kBACf,aAAa;EAEf,MAAM,WAAW,IAAI,WAAW,gBAAgB;EAChD,MAAM,aAAa;GAAC;GAAG;GAAG;GAAG;GAAG;GAAG;EAAC;EACpC,KAAK,IAAI,QAAQ,GAAG,QAAQ,YAAY,SAAS,GAAG;GAClD,IAAI,QAAQ,YAAY;GACxB,MAAM,SAAS,WAAW;GAC1B,OAAO,QAAQ,GAAG;IAChB,WAAW,SAAS,WAAW,QAAQ;IACvC,SAAS;GACX;GACA,WAAW,KAAK;GAChB,SAAS,SAAS;EACpB;EAGA,MAAM,UAAwB,CAAC;EAC/B,KAAK,IAAI,QAAQ,GAAG,QAAQ,SAAS,SAAS,GAAG;GAC/C,MAAM,eAAe,IAAI,WAAW,iBAAiB;GACrD,IAAI,UAAU,OAAO,KAAK,KAAK,CAAC;GAChC,KAAK,IAAI,SAAS,GAAG,SAAS,WAAW,UAAU,GAAG;IACpD,SAAS;KACP,IAAI,UAAU,KAAK,UAAU,IAC3B,MAAM,IAAI,UAAU;KAEtB,KAAK,OAAO,KAAK,KAAK,CAAC,OAAO,GAC5B;KAEF,YAAY,OAAO,KAAK,KAAK,CAAC,OAAO,IAAI,IAAI;IAC/C;IACA,aAAa,UAAU;GACzB;GACA,QAAQ,KAAK,YAAY;EAC3B;EACA,MAAM,SAAuB,CAAC;EAC9B,MAAM,QAAsB,CAAC;EAC7B,MAAM,QAAsB,CAAC;EAC7B,MAAM,UAAoB,CAAC;EAC3B,KAAK,MAAM,gBAAgB,SAAS;GAClC,IAAI,SAAS;GACb,IAAI,SAAS;GACb,KAAK,IAAI,SAAS,GAAG,SAAS,WAAW,UAAU,GAAG;IACpD,MAAM,SAAS,aAAa;IAC5B,SAAS,KAAK,IAAI,QAAQ,MAAM;IAChC,SAAS,KAAK,IAAI,QAAQ,MAAM;GAClC;GACA,MAAM,QAAQ,IAAI,WAAW,iBAAiB;GAC9C,MAAM,OAAO,IAAI,WAAW,iBAAiB;GAC7C,MAAM,OAAO,IAAI,WAAW,iBAAiB;GAC7C,mBACE,OACA,MACA,MACA,cACA,QACA,QACA,SACF;GACA,OAAO,KAAK,KAAK;GACjB,MAAM,KAAK,IAAI;GACf,MAAM,KAAK,IAAI;GACf,QAAQ,KAAK,MAAM;EACrB;EAGA,MAAM,MAAM,SAAS;EACrB,MAAM,YAAY,aAAa,KAAK;EACpC,IAAI,UAAU;EACd,IAAI,WAAW;EACf,IAAI,UAAU;EACd,IAAI,SAAS,OAAO;EACpB,IAAI,QAAQ,MAAM;EAClB,IAAI,QAAQ,MAAM;EAClB,MAAM,0BAAU,IAAI,WAAW,GAAG;EAClC,MAAM,OAAO,IAAI,WAAW,SAAS;EACrC,MAAM,UAAU,IAAI,WAAW,MAAM,SAAS;EAC9C;GACE,IAAI,KAAK;GACT,KAAK,IAAI,KAAK,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG;IACnD,KAAK,IAAI,KAAK,IAAe,MAAM,GAAG,MAAM,GAAG;KAC7C,KAAK,MAAM,KAAK,YAAY;KAC5B,MAAM;IACR;IACA,QAAQ,MAAM,KAAK;GACrB;EACF;EACA,MAAM,KAAK,KAAK;EAChB,IAAI,SAAS;EAKb,MAAM,kBAAwB;GAC5B,IAAI,aAAa,GAAG;IAClB,WAAW;IACX,IAAI,WAAW,YACb,MAAM,IAAI,UAAU;IAEtB,WAAW;IACX,MAAM,OAAO,SAAS;IACtB,UAAU,QAAQ;IAClB,SAAS,OAAO;IAChB,QAAQ,MAAM;IACd,QAAQ,MAAM;GAChB;GACA,YAAY;EACd;EACA,MAAM,UAAU,IAAY,SAAyB;GACnD,MAAM,QAAQ,OAAQ,MAAM;GAC5B,IAAI,QAAQ,KAAK,SAAS,mBACxB,MAAM,IAAI,UAAU;GAEtB,OAAO,MAAM;EACf;EACA,MAAM,mBAA2B;GAC/B,UAAU;GACV,IAAI,KAAK;GACT,KAAK,KAAK,EAAE;GACZ,IAAI,OAAO,KAAK,KAAK,EAAE;GACvB,SAAS;IACP,IAAI,KAAK,IACP,MAAM,IAAI,UAAU;IAEtB,IAAI,QAAS,OAAO,KAClB,OAAO,OAAO,IAAI,IAAI;IAExB,MAAM;IACN,KAAK,KAAK,CAAC;IACX,OAAQ,QAAQ,IAAK,KAAK,KAAK,CAAC;GAClC;EACF;EACA,MAAM,aAAa,aAEe;GAChC,UAAU;GACV,IAAI,KAAK;GACT,OAAO,CAAC,KAAK,KAAK,EAAE,GAClB,MAAMA;GAER,IAAI,OAAO,KAAK,KAAK,EAAE;GACvB,SAAS;IACP,IAAI,KAAK,IACP,MAAM,IAAI,UAAU;IAEtB,IAAI,QAAS,OAAO,KAClB,OAAO,OAAO,IAAI,IAAI;IAExB,MAAM;IACN,OAAO,CAAC,KAAK,KAAK,CAAC,GACjB,MAAMA;IAER,OAAQ,QAAQ,IAAK,KAAK,KAAK,CAAC;GAClC;EACF,EAAE,KAAK,IAAI;EACX,MAAM,kBAA2B,KAAK,MAAM,SAAS,KAAK,YAAY;EAEtE,IAAI,UAAU,UAAU,IAAI,WAAW,IAAI,OAAO,WAAW;EAC7D,SAAS;GACP,IAAI,YAAY,KACd;GAEF,IAAI,YAAY,WAAW,YAAY,SAAS;IAC9C,IAAI,KAAK;IACT,IAAI,IAAI;IACR,GAAG;KACD,IAAI,KAAK,SACP,MAAM,IAAI,UAAU;KAEtB,MAAM,YAAY,UAAU,IAAI,IAAI;KACpC,KAAK;KACL,UAAU,UAAU,IAAI,WAAW,IAAI,OAAO,WAAW;IAC3D,SAAS,YAAY,WAAW,YAAY;IAC5C,MAAM;IACN,MAAM,KAAK,WAAW,KAAK,QAAQ;IACnC,QAAQ,MAAO,QAAQ,MAAiB;IACxC,OAAO,KAAK,GAAG;KACb,IAAI,UAAU,WACZ,MAAM,IAAI,UAAU;KAEtB,GAAG,UAAU;KACb,UAAU;KACV,MAAM;IACR;IACA;GACF;GACA,IAAI,UAAU,WACZ,MAAM,IAAI,UAAU;GAEtB,IAAI;GACJ,IAAI,KAAK,UAAU;GACnB,IAAI,KAAK,WAAW;IAClB,MAAM,KAAK,QAAQ;IACnB,KAAK,KAAK,KAAK;IACf,OAAO,KAAK,GAAG;KACb,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK;KAC/B,MAAM;IACR;IACA,KAAK,MAAM;GACb,OAAO;IACL,IAAI,MAAM,KAAK,MAAM,KAAK,SAAS;IACnC,MAAM,MAAM,KAAK;IACjB,IAAI,KAAM,QAAQ,OAAkB;IACpC,KAAK,KAAK;IACV,OAAO,KAAM,QAAQ,MAAiB;KACpC,KAAK,MAAM,KAAK,KAAK;KACrB,MAAM;IACR;IACA,QAAQ,OAAQ,QAAQ,OAAkB;IAC1C,OAAO,MAAM,GAAG;KACd,QAAQ,OAAQ,QAAQ,OAAkB;KAC1C,KAAK,QAAQ,QAAkB,KAC5B,QAAQ,MAAM,KAAgB,YAAY;KAE7C,OAAO;IACT;IACA,QAAQ,KAAM,QAAQ,KAAgB;IACtC,KAAK,QAAQ,MAAgB;IAC7B,IAAI,QAAQ,OAAO,GAAG;KACpB,IAAI,KAAK;KACT,KAAK,IAAI,KAAK,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG;MACnD,KAAK,IAAI,KAAK,IAAe,MAAM,GAAG,MAAM,GAAG;OAC7C,KAAK,MAAM,KAAM,QAAQ,MAAiB;OAC1C,MAAM;MACR;MACA,QAAQ,MAAM,KAAK;KACrB;IACF;GACF;GACA,MAAM,SAAS,WAAW;GAC1B,QAAQ,UAAW,QAAQ,UAAqB;GAChD,GAAG,UAAU;GACb,UAAU;GACV,UAAU,UAAU,IAAI,WAAW,IAAI,OAAO,WAAW;EAC3D;EAEA,IAAI,KAAK,UAAU,KAAK,KAAK,WAAW,QACtC,MAAM,IAAI,UAAU;EAEtB,KAAK,IAAI,QAAQ,GAAG,SAAS,KAAK,SAAS,GAAG;GAC5C,MAAM,QAAQ,QAAQ;GACtB,IAAI,QAAQ,KAAK,QAAQ,QACvB,MAAM,IAAI,UAAU;EAExB;EACA,MAAM,wBAAQ,IAAI,WAAW,GAAG;EAChC,KAAK,IAAI,QAAQ,GAAG,SAAS,KAAK,SAAS,GACzC,MAAM,SACH,QAAQ,QAAQ,KAAiB,MAAM,QAAQ;EAEpD,KAAK,IAAI,QAAQ,GAAG,SAAS,KAAK,SAAS,GAAG;GAC5C,MAAM,QAAQ,MAAM;GACpB,IAAI,QAAQ,KAAK,QAAQ,QACvB,MAAM,IAAI,UAAU;GAEtB,IAAI,QAAQ,KAAM,MAAM,QAAQ,KAAgB,OAC9C,MAAM,IAAI,UAAU;EAExB;EACA,KAAK,cAAc;EACnB,KAAK,aAAa;EAClB,KAAK,qBAAqB;EAC1B,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAAG;GAC9C,MAAM,KAAM,GAAG,SAAoB;GACnC,MAAM,SAAS,MAAM;GACrB,GAAG,WAAY,GAAG,UAAsB,SAAS,OAAQ;GACzD,MAAM,MAAM,SAAS;EACvB;EACA,KAAK,aAAa;EAClB,KAAK,OAAQ,GAAG,KAAK,aAAwB;EAC7C,KAAK,aAAa;EAClB,IAAI,KAAK,iBAAiB;GACxB,KAAK,SAAS;GACd,KAAK,QAAQ;GACb,KAAK,KAAK,KAAK,QAAQ;GACvB,KAAK,cAAc;GACnB,KAAK,MAAM,KAAK,SAAS;EAC3B,OAAO;GACL,KAAK,KAAK,KAAK,QAAQ;GACvB,KAAK,cAAc;EACrB;CACF;;CAGA,UAA0B;EACxB,IAAI,KAAK,QAAQ,aAAa,KAAK,eACjC,MAAM,IAAI,UAAU;EAEtB,MAAM,QAAQ,KAAK,GAAG,KAAK;EAC3B,KAAK,OAAO,UAAU;EACtB,OAAO,QAAQ;CACjB;;CAGA,WAA2B;EACzB,IAAI,KAAK,WAAW,GAAG;GACrB,KAAK,SAAS,OAAO,KAAK;GAC1B,KAAK,SAAS;GACd,IAAI,KAAK,UAAU,KACjB,KAAK,QAAQ;EAEjB;EACA,KAAK,UAAU;EACf,OAAO,KAAK,WAAW,IAAI,IAAI;CACjC;CAEA,UAAkB,MAAoB;EACpC,KAAK,OAAO,KAAK,gBAAgB;EACjC,KAAK,gBAAgB;EACrB,KAAK,YAAY;EACjB,KAAK,qBAAqB,UAAU,KAAK,oBAAoB,IAAI;CACnE;;CAGA,kBAAmC;EACjC,MAAM,MAAM,KAAK,aAAa;EAC9B,SAAS;GACP,SAAS;IACP,IAAI,KAAK,aAAa,GACpB,OAAO;IAET,IAAI,KAAK,gBAAgB,GACvB;IAEF,KAAK,UAAU,KAAK,UAAU;IAC9B,KAAK,eAAe;GACtB;GACA,IAAI,KAAK,eAAe,KACtB,OAAO;GAET,IAAI,KAAK,aAAa,KACpB,OAAO;GAET,KAAK,cAAc;GACnB,KAAK,aAAa,KAAK;GACvB,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,SAAS;GACxC,KAAK,cAAc;GACnB,IAAI,KAAK,eAAe,KACtB;GAEF,IAAI,OAAO,KAAK,IAAI;IAClB,KAAK,KAAK;IACV;GACF;GACA,KAAK,cAAc;GACnB,KAAK,KAAK,QAAQ,IAAI,KAAK,SAAS;GACpC,KAAK,cAAc;GACnB,IAAI,KAAK,eAAe,KACtB;GAEF,IAAI,OAAO,KAAK,IAAI;IAClB,KAAK,KAAK;IACV;GACF;GACA,KAAK,cAAc;GACnB,KAAK,KAAK,QAAQ,IAAI,KAAK,SAAS;GACpC,KAAK,cAAc;GACnB,IAAI,KAAK,eAAe,KACtB;GAEF,IAAI,OAAO,KAAK,IAAI;IAClB,KAAK,KAAK;IACV;GACF;GACA,KAAK,KAAK,QAAQ,IAAI,KAAK,SAAS;GACpC,KAAK,cAAc;GACnB,KAAK,cAAc,KAAK;GACxB,KAAK,KAAK,KAAK,QAAQ,IAAI,KAAK,SAAS;GACzC,KAAK,cAAc;EACrB;CACF;;;;;;CAQA,YAA6B;EAC3B,MAAM,KAAK,KAAK;EAChB,MAAM,SAAS,KAAK;EACpB,MAAM,MAAM,KAAK,aAAa;EAC9B,MAAM,YAAY,aAAa,KAAK;EACpC,IAAI,MAAM,KAAK;EACf,IAAI,KAAK,KAAK;EACd,IAAI,MAAM,KAAK;EACf,IAAI,OAAO,KAAK;EAChB,IAAI,KAAK,KAAK;EACd,IAAI,OAAO,KAAK;EAChB,IAAI,MAAM,KAAK;EACf,IAAI,QAAQ,KAAK;EACjB,IAAI,iBAAiB;EACrB,IAAI,UAAU;EAEd,MAAM,gBAAwB;GAC5B,IAAI,QAAQ,WACV,MAAM,IAAI,UAAU;GAEtB,MAAM,QAAQ,GAAG;GACjB,OAAO,UAAU;GACjB,OAAO,QAAQ;EACjB;EACA,MAAM,cAAoB;GACxB,OAAO,OAAO;GACd,OAAO;GACP,SAAS;GACT,MAAM,UAAU,KAAK,EAAE;EACzB;EACA,SAAS;GACP,IAAI,kBAAkB,MAAM,GAAG;IAC7B,IAAI,CAAC,gBAAgB;KACnB,OAAO,QAAQ,KAAK,QAAQ,GAAG;MAC7B,OAAO,OAAO;MACd,OAAO;MACP,SAAS;MACT,MAAM,UAAU,KAAK,EAAE;MACvB,OAAO;KACT;KACA,IAAI,UAAU,GACZ;IAEJ;IACA,iBAAiB;IACjB,IAAI,UAAU,GAAG;KACf,MAAM;KACN;IACF;IACA,MAAM;GACR;GACA,IAAI,OAAO,KAAK;IACd,UAAU;IACV;GACF;GACA,IAAI,SAAS,KAAK;IAChB,MAAM;IACN;GACF;GACA,KAAK;GACL,IAAI,KAAK,QAAQ;GACjB,QAAQ;GACR,IAAI,OAAO,IAAI;IACb,KAAK;IACL,iBAAiB;IACjB;GACF;GACA,IAAI,SAAS,KAAK;IAChB,iBAAiB;IACjB;GACF;GACA,MAAM;GACN,KAAK,QAAQ;GACb,QAAQ;GACR,IAAI,SAAS,KACX;GAEF,IAAI,OAAO,IAAI;IACb,KAAK;IACL;GACF;GACA,MAAM;GACN,KAAK,QAAQ;GACb,QAAQ;GACR,IAAI,SAAS,KACX;GAEF,IAAI,OAAO,IAAI;IACb,KAAK;IACL;GACF;GACA,KAAK,QAAQ;GACb,QAAQ;GACR,MAAM,KAAK;GACX,KAAK,QAAQ;GACb,QAAQ;EACV;EACA,KAAK,qBAAqB;EAC1B,KAAK,aAAa;EAClB,KAAK,cAAc;EACnB,KAAK,aAAa;EAClB,KAAK,KAAK;EACV,KAAK,OAAO;EACZ,KAAK,eAAe;EACpB,KAAK,WAAW;EAChB,OAAO;CACT;AACF;;AAGA,SAAS,mBACP,OACA,MACA,MACA,QACA,QACA,QACA,WACM;CACN,IAAI,KAAK;CACT,KAAK,IAAI,MAAM,QAAQ,OAAO,QAAQ,OAAO,GAC3C,KAAK,IAAI,SAAS,GAAG,SAAS,WAAW,UAAU,GACjD,IAAI,OAAO,YAAY,KAAK;EAC1B,KAAK,MAAM;EACX,MAAM;CACR;CAGJ,KAAK,KAAK,GAAG,GAAG,eAAe;CAC/B,KAAK,IAAI,SAAS,GAAG,SAAS,WAAW,UAAU,GAAG;EACpD,MAAM,QAAS,OAAO,UAAqB;EAC3C,KAAK,SAAU,KAAK,SAAoB;CAC1C;CACA,KAAK,IAAI,QAAQ,GAAG,QAAQ,iBAAiB,SAAS,GACpD,KAAK,SAAU,KAAK,SAAqB,KAAK,QAAQ;CAExD,MAAM,KAAK,GAAG,GAAG,eAAe;CAChC,IAAI,MAAM;CACV,KAAK,IAAI,MAAM,QAAQ,OAAO,QAAQ,OAAO,GAAG;EAC9C,OAAQ,KAAK,MAAM,KAAiB,KAAK;EACzC,MAAM,OAAO,MAAM;EACnB,QAAQ;CACV;CACA,KAAK,IAAI,MAAM,SAAS,GAAG,OAAO,QAAQ,OAAO,GAC/C,KAAK,QAAU,MAAM,MAAM,KAAgB,KAAM,KAAM,KAAK;AAEhE;;AC74BA,MAAM,eAA4B;CAChC,MAAM,wBAAQ,IAAI,YAAY,GAAG;CACjC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;EAC/B,IAAI,IAAI;EACR,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAC1B,IAAI,IAAI,IAAI,aAAiB,MAAM,IAAK,MAAM;EAEhD,MAAM,KAAK,MAAM;CACnB;CACA,OAAO;AACT,EAAA,CAAG;;AAGH,SAAgB,YACd,KACA,MACA,QAAQ,GACR,MAAc,KAAK,QACX;CACR,IAAI,QAAQ,CAAC;CACb,KAAK,IAAI,QAAQ,OAAO,QAAQ,KAAK,SAAS,GAC5C,QACG,OAAO,QAAS,KAAK,UAAqB,OAC1C,UAAU;CAEf,OAAO,CAAC,UAAU;AACpB;;;ACjBA,IAAa,YAAb,cAA+B,MAAM;CACnC,OAAgB;AAClB;AAEA,MAAM,eAAe,KAAK;AAC1B,MAAM,0BAA0B;AAChC,MAAM,qBAAqB;AAC3B,MAAM,eAAe;AACrB,MAAM,YAAY;AAElB,MAAM,SAAS;AACf,MAAM,aAAa;AACnB,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AAItB,MAAM,kBAAkB;AACxB,MAAM,kBAAkB;AACxB,MAAM,cAAc;AAEpB,MAAM,aAAa;AACnB,MAAM,mBAAmB;AACzB,MAAM,iBAAiB;AAEvB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,gBAAgB;AACtB,MAAMI,eAAa;;AAEnB,MAAM,gBAAgB;AAStB,SAAS,cAAc,OAA4B;CACjD,OAAO,IAAI,YAAY,KAAK,CAAC,CAAC,KAAK,SAAS;AAC9C;AAEA,SAAS,gBAA+B;CACtC,MAAM,MAAqB,CAAC;CAC5B,MAAM,MAAqB,CAAC;CAC5B,KAAK,IAAI,QAAQ,GAAG,QAAQ,gBAAgB,SAAS,GAAG;EACtD,IAAI,KAAK,cAAc,eAAe,CAAC;EACvC,IAAI,KAAK,cAAc,eAAe,CAAC;CACzC;CACA,OAAO;EACL,QAAQ,cAAc,CAAC;EACvB,MAAM,cAAc,GAAkB;EACtC;EACA;CACF;AACF;;AAWA,SAAS,iBAAiB,OAA0C;CAClE,IAAI,MAAM,WAAW,GACnB,OAAO;CAET,IAAI,OAAO,MAAM;CACjB,IAAI,OAAO,KACT,OAAO;CAET,MAAM,KAAK,KAAK,MAAM,OAAQ,EAAM;CACpC,QAAQ,KAAK,IAAI;CACjB,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;CAC9B,MAAM,KAAK,OAAO,KAAK;CACvB,IAAI,KAAK,KAAK,eACZ,OAAO;CAQT,OAAO;EAAE,WALL,MAAM,KACJ,MAAM,MAAiB,IACvB,MAAM,MAAiB,KACvB,MAAM,MAAiB,QAC3B;EACiB;EAAI;EAAI;CAAG;AAChC;;AAGA,MAAMC,eAAa,OAAO,YAAY;;AAEtC,MAAMC,gBAAc,OAAO,aAAa;;AAExC,MAAM,cAAc;;;;;;;;;;;AAYpB,IAAM,kBAAN,MAAsB;CACpB,MAAM;CACN,SAAS;CAET,wBAA4B,IAAI,WAAW,CAAC;CAC5C,WAAmB;CACnB,YAAoB;CACpB,QAAgBF;CAChB,OAAe;;CAEf,0BAA8B,IAAI,WAAW,CAAC;CAC9C,QAAgB;CAChB,cAAsB;CACtB;CACA;CACA;CACA;CACA;CACA,UAA2B,cAAc,GAAuB;CAChE,QAAyB,cAAc,MAAM;CAC7C,SAA0B,cAAc,MAAM;CAC9C,SAA0B,cAAc,MAAM;CAC9C,SAA0B,cAAc,MAAM;CAC9C,aAA8B,cAAc,GAAuB;CACnE,WAA2C,CAAC;CAC5C,aAA8B,cAAc,GAA+B;CAC3E,WAA4B,cAAc,UAAU;CACpD,cAA+B,cAAc;CAC7C,YAA6B,cAAc;CAC3C,QAAgB;CAChB,OAAe;CACf,OAAe;CACf,OAAe;CACf,OAAe;;CAEf,OACE;CAEF,YAAY,YAA4B;EAEtC,MAAM,OAAO,KAAK,IAAI,WAAW,UAAU,aAAa;EACxD,KAAK,WAAW,KAAK,KAAK,OAAO,EAAE,IAAI;EACvC,KAAK,WAAW,KAAK,WAAW,MAAM;EACtC,KAAK,KAAK,WAAW;EACrB,KAAK,eACD,OAAU,WAAW,OAAO,QAAW,WAAW,QAAS;EAC/D,KAAK,UAAU,cAAc,OAAW,WAAW,KAAK,WAAW,EAAG;EACtE,KAAK,IAAI,QAAQ,GAAG,QAAQ,aAAa,SAAS,GAChD,KAAK,SAAS,KAAK,cAAc,UAAU,CAAC;CAEhD;CAEA,WAAW,MAAkB,KAAyB;EAGpD,MAAM,OAAO,KAAK,MAAM,SAAS,KAAK,QAAQ;EAC9C,IAAI,KAAK,WAAW,GAClB,KAAK,QAAQ;OACR;GACL,KAAK,QAAQ,IAAI,WAAW,KAAK,SAAS,KAAK,MAAM;GACrD,KAAK,MAAM,IAAI,IAAI;GACnB,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM;EAClC;EACA,KAAK,WAAW;EAChB,KAAK,SAAS;EACd,MAAM,QAAQ,KAAK;EACnB,KAAK,cAAc,QAAQ;EAC3B,IAAI;GACF,KAAK,SAAS;GACd,OAAO,KAAK,cAAc,KAAK,CAAC,KAAK,KACnC,KAAK,MAAM,KAAK,aAAa;EAEjC,SAAS,OAAO;GACd,IAAI,UAAUE,eACZ,KAAK,SAAS;QACT,IAAI,UAAUD,cAAY,CAEjC,OAAO,IAAI,iBAAiB,aAC1B,MAAM,IAAI,UAAU,oBAAoB;QAExC,MAAM;EAEV;EAEA,OAAO,KAAK,QAAQ,SAAS,OAAO,KAAK,KAAK;CAChD;;CAGA,WAAyB;EACvB,OAAO,KAAK,YAAY,GAAG;GACzB,IAAI,KAAK,YAAY,KAAK,MAAM,QAC9B,MAAMA;GAER,MAAM,OAAO,KAAK,MAAM,KAAK;GAC7B,IAAI,KAAK,cAAc,KAAK,SAAS,GACnC,MAAM,IAAI,YAAY;GAExB,KAAK,QAAS,KAAK,QAAQ,IAAK,UAAU;GAC1C,KAAK,YAAY;GACjB,KAAK,aAAa;EACpB;CACF;;CAGA,eAAgC;EAC9B,IAAI,KAAK,MAAM,SAAS,KAAK,YAAY,aAAa;GACpD,KAAK,OAAO;GACZ,OAAO,KAAK,OAAO;EACrB;EACA,MAAM,QAAQ;GACZ,MAAM,KAAK;GACX,UAAU,KAAK;GACf,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,MAAM,KAAK;GACX,MAAM,KAAK;GACX,MAAM,KAAK;GACX,OAAO,KAAK;EACd;EACA,MAAM,OAA+D,CAAC;EACtE,KAAK,OAAO;EACZ,IAAI;GACF,OAAO,KAAK,OAAO;EACrB,SAAS,OAAO;GACd,IAAI,UAAUA,cAAY;IACxB,KAAK,IAAI,QAAQ,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;KACxD,MAAM,QAAQ,KAAK;KACnB,MAAM,MAAM,MAAM,SAAS,MAAM;IACnC;IACA,OAAO,OAAO,MAAM,KAAK;GAC3B;GACA,MAAM;EACR,UAAU;GACR,KAAK,OAAO;EACd;CACF;;CAGA,YAA0B;EACxB,IAAI,KAAK,QAAQ,cAAc;GAC7B,IAAI,KAAK,YAAY,KAAK,MAAM,QAC9B,MAAMA;GAER,KAAK,QAAS,KAAK,SAAS,MAAO;GACnC,KAAK,QACD,KAAK,QAAQ,IAAM,KAAK,MAAM,KAAK,eAA0B;GACjE,KAAK,YAAY;EACnB;CACF;;CAGA,IAAY,OAAoB,OAAuB;EACrD,KAAK,UAAU;EACf,MAAM,OAAO,MAAM;EACnB,KAAK,MAAM,KAAK;GAAE;GAAO;GAAO,OAAO;EAAK,CAAC;EAC7C,MAAM,SAAS,KAAK,UAAU,2BAA2B;EACzD,IAAI,KAAK,OAAO,OAAO;GACrB,KAAK,QAAQ;GACb,MAAM,SAAS,QAAS,qBAAqB,SAAU;GACvD,OAAO;EACT;EACA,KAAK,QAAS,KAAK,QAAQ,UAAW;EACtC,KAAK,OAAQ,KAAK,OAAO,UAAW;EACpC,MAAM,SAAS,QAAQ,SAAS;EAChC,OAAO;CACT;;CAGA,QAAgB,OAAoB,OAAuB;EACzD,IAAI,SAAS;EACb,OAAO,SAAS,OACd,SAAU,UAAU,IAAK,KAAK,IAAI,OAAO,MAAM;EAEjD,OAAO,SAAS;CAClB;CAEA,OAAe,SAAwB,UAA0B;EAC/D,IAAI,KAAK,IAAI,QAAQ,QAAQ,CAAC,MAAM,GAClC,OACE,gBACA,KAAK,QAAQ,QAAQ,IAAI,WAA0B,eAAe;EAGtE,IAAI,KAAK,IAAI,QAAQ,QAAQ,CAAC,MAAM,GAClC,OACE,KAEA,KAAK,QAAQ,QAAQ,IAAI,WAA0B,eAAe;EAGtE,OACE,KAGA,KAAK,QAAQ,QAAQ,MAAM,GAAkB;CAEjD;;CAGA,cAAsB,UAA2B;EAC/C,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,QAAQ,IAAI;CAC/C;CAEA,OAAe,UAA0B;EACvC,OAAO,KAAK,QAAQ,KAAK,QAAQ,WAAW;CAC9C;CAEA,IAAY,MAAoB;EAC9B,IAAI,KAAK,SAAS,KAAK,aACrB,MAAMC;EAER,IAAI,KAAK,SAAS,KAAK,QAAQ,QAAQ;GACrC,MAAM,QAAQ,IAAI,WAChB,KAAK,IAAI,OAAW,KAAK,QAAQ,SAAS,CAAC,CAC7C;GACA,MAAM,IAAI,KAAK,OAAO;GACtB,KAAK,UAAU;EACjB;EACA,KAAK,QAAQ,KAAK,SAAS;EAC3B,KAAK,SAAS;CAChB;;CAGA,cAAsB,SAA0B;EAC9C,MAAM,WAAW,KAAK,QAAQ,IAAI,KAAK,OAAO,CAAC,IAAI;EACnD,MAAM,OACJ,OAAQ,KAAK,SAAS,KAAK,WAAY,KAAK,gBAAgB,KAAK;EACnE,IAAI,SAAS;EACb,IAAI,CAAC,SAAS;GACZ,OAAO,SAAS,KACd,SAAU,UAAU,IAAK,KAAK,IAAI,KAAK,SAAS,OAAO,MAAM;GAE/D,OAAO,SAAS;EAClB;EACA,IAAI,YAAY,KAAK,OAAO,KAAK,IAAI,KAAK;EAC1C,IAAI,SAAS;EACb,OAAO,SAAS,KAAQ;GACtB,MAAM,WAAW,YAAY;GAC7B,MAAM,MAAM,KAAK,IAAI,KAAK,SAAS,OAAO,SAAS,WAAW,MAAM;GACpE,SAAU,UAAU,IAAK;GACzB,UAAU,QAAQ,IAAI,CAAC,WAAW;GAClC,cAAc;EAChB;EACA,OAAO,SAAS;CAClB;;CAGA,eAAuB,QAAwB;EAC7C,MAAM,cACJ,SAAS,IACL,SAAS,gBACT;EACN,MAAM,OAAO,KAAK,QAChB,KAAK,SAAS,cACd,UACF;EACA,IAAI,OAAO,kBACT,OAAO;EAET,IAAI,SAAS,SAAS,KAAK;EAC3B,IAAI,WAAW,KAAK,OAAO;EAC3B,IAAI,OAAO,gBAAgB;GACzB,WAAY,YAAY,UAAW;GAEnC,MAAM,OAAO,WAAW,OAAO;GAC/B,IAAI,SAAS;GACb,KAAK,IAAI,WAAW,GAAG,WAAW,OAAO,YAAY,GAAG;IACtD,MAAM,MAAM,KAAK,IAAI,KAAK,YAAY,OAAO,MAAM;IACnD,SAAU,UAAU,IAAK;IACzB,IAAI,QAAQ,GACV,WAAY,YAAY,KAAK,cAAe;GAEhD;GACA,OAAO;EACT;EAEA,SAAS;EACT,KAAK,IAAI,QAAQ,OAAO,QAAQ,GAAG,SAAS,GAAG;GAC7C,KAAK,UAAU;GACf,KAAK,WAAW;GAChB,KAAK,OAAQ,KAAK,OAAO,KAAK,UAAW;GACzC,MAAM,QAAS,KAAK,KAAK,SAAS,QAAS;GAC3C,KAAK,OAAQ,KAAK,QAAQ,KAAK,QAAQ,WAAY;GACnD,YAAa,YAAY,MAAO,QAAQ,MAAO,OAAQ;EACzD;EACA,WAAY,YAAY,eAAgB;EACxC,IAAI,SAAS;EACb,KAAK,IAAI,SAAS,GAAG,SAAS,YAAY,WAAW,GACnD,IAAI,KAAK,IAAI,KAAK,UAAU,SAAS,MAAM,MAAM,GAC/C,UAAU;EAGd,OAAQ,WAAW,WAAY;CACjC;;CAGA,SAA0B;EACxB,MAAM,WAAW,KAAK,QAAQ,KAAK;EACnC,MAAM,QAAQ,KAAK;EACnB,IAAI,KAAK,IAAI,KAAK,SAAS,QAAQ,iBAAiB,QAAQ,MAAM,GAAG;GACnE,IAAI,UAAU;GACd,IAAI,QAAQ,YACV,KAAK,QAAQ,SAAS,IAAI,IAAI,QAAQ;QACjC;IACL,KAAK,QAAQ,SAAS,IAAI,QAAQ,IAAI,QAAQ;IAC9C,UAAU;GACZ;GACA,KAAK,IAAI,KAAK,cAAc,OAAO,CAAC;GACpC,OAAO;EACT;EACA,IAAI;EACJ,IAAI,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,GAAG;GAErC,KAAK,QAAQ,QAAQ,aAAa,IAAI;GACtC,KAAK,OAAO,KAAK;GACjB,KAAK,OAAO,KAAK;GACjB,KAAK,OAAO,KAAK;GACjB,SAAS,KAAK,OAAO,KAAK,aAAa,QAAQ;GAC/C,KAAK,OAAO,KAAK,eAAe,MAAM;GACtC,IAAI,KAAK,SAASF,cAAY;IAE5B,KAAK,UAAU;IACf,IAAI,KAAK,SAAS,GAChB,MAAM,IAAI,YAAY;IAExB,OAAO;GACT;GACA,IAAI,CAAC,KAAK,cAAc,KAAK,IAAI,GAC/B,MAAM,IAAI,YAAY;EAE1B,OAAO;GAEL,IAAI,CAAC,KAAK,cAAc,CAAC,GACvB,MAAM,IAAI,YAAY;GAExB,IAAI,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM,GAEjC;QAAA,KAAK,IAAI,KAAK,YAAY,QAAQ,iBAAiB,QAAQ,MAAM,GACjE;KACA,KAAK,QAAQ,QAAQ,aAAa,IAAI;KACtC,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,CAAC;KAC/B,OAAO;IACT;UACK;IACL,IAAI;IACJ,IAAI,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM,GACnC,WAAW,KAAK;SACX;KACL,IAAI,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM,GACnC,WAAW,KAAK;UACX;MACL,WAAW,KAAK;MAChB,KAAK,OAAO,KAAK;KACnB;KACA,KAAK,OAAO,KAAK;IACnB;IACA,KAAK,OAAO,KAAK;IACjB,KAAK,OAAO;GACd;GACA,KAAK,QAAQ,QAAQ,aAAa,IAAI;GACtC,SAAS,KAAK,OAAO,KAAK,WAAW,QAAQ;EAC/C;EACA,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAC3C,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,CAAC;EAEjC,OAAO;CACT;AACF;AAEA,IAAM,cAAN,cAA0B,MAAM,CAAC;;;;;AAMjC,IAAa,sBAAb,MAAiC;CAC/B,SAAS;CAET,UAA0C;CAC1C,6BAAiC,IAAI,WAAW,CAAC;CAEjD,IAAI,MAAe;EACjB,OAAO,KAAK,SAAS,OAAO;CAC9B;CAEA,WAAW,MAAkB,YAAoB,KAAyB;EACxE,IAAI,QAAQ;EACZ,IAAI,KAAK,YAAY,MAAM;GACzB,MAAM,SAAS,IAAI,WAAW,KAAK,WAAW,SAAS,KAAK,MAAM;GAClE,OAAO,IAAI,KAAK,UAAU;GAC1B,OAAO,IAAI,MAAM,KAAK,WAAW,MAAM;GACvC,KAAK,aAAa;GAClB,IAAI,OAAO,UAAU,GACnB,uBAAO,IAAI,WAAW,CAAC;GAEzB,MAAM,iBACH,OAAO,KAAkB,OAAO,MAAiB;GACpD,IAAI,OAAO,UAAU,IAAI,gBACvB,uBAAO,IAAI,WAAW,CAAC;GAEzB,MAAM,aAAa,iBACjB,OAAO,SAAS,GAAG,IAAI,cAAc,CACvC;GACA,IAAI,eAAe,MACjB,MAAM,IAAI,UAAU,gCAAgC;GAEtD,KAAK,UAAU,IAAI,gBAAgB,UAAU;GAC7C,QAAQ,OAAO,SAAS,IAAI,cAAc;GAC1C,KAAK,6BAAa,IAAI,WAAW,CAAC;EACpC;EACA,MAAM,SAAS,KAAK,QAAQ,WAAW,OAAO,GAAG;EACjD,KAAK,SAAS,KAAK,QAAQ;EAC3B,OAAO;CACT;AACF;;;ACrgBA,IAAa,YAAb,cAA+B,MAAM;CACnC,OAAgB;AAClB;AAEA,MAAM,eAAe;AACrB,MAAM,aAAa;AACnB,MAAM,cAAc;AAGpB,MAAM,WAAW;AACjB,MAAM,cAAc;AACpB,MAAM,cAAc;;AAEpB,MAAM,UAAU;AAChB,MAAM,eAAe;;AAErB,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AAEzB,MAAM,QAAQ;CACZ;CAAI;CAAI;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAI;CAAG;CAAI;CAAG;CAAI;CAAG;CAAI;CAAG;AAChE;AACA,MAAM,cAAc;CAClB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CACzE;CAAI;CAAI;CAAK;CAAK;CAAK;CAAK;CAAK;AACnC;AACA,MAAM,eAAe;CACnB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAC3E;CAAG;CAAG;AACR;AACA,MAAM,YAAY;CAChB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAK;CAAK;CAAK;CAAK;CAAK;CAC1E;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAQ;CAAQ;AAC5D;AACA,MAAM,aAAa;CACjB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAC1E;CAAI;CAAI;CAAI;CAAI;AAClB;;AAiBA,MAAa,YAAY;CAAE,OAAO;CAAG,OAAO;CAAG,MAAM;AAAE;;AAIvD,MAAM,YAAY;CAAC;CAAG;CAAG;AAAC;;AAE1B,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;;AAGtB,SAAS,cACP,SACA,SACA,MACA,UACQ;CACR,MAAM,SAAS,CAAC;CAChB,MAAM,QAAS,SAAS,YAAc,MAAM,SAAS,kBAAkB;CACvE,OAAO,SAAS,WAAW,iBAAiB;AAC9C;AAEA,SAAS,YAAY,MAAc,QAAwB;CACzD,IAAI,WAAW;CACf,KAAK,IAAI,MAAM,GAAG,MAAM,QAAQ,OAAO,GACrC,WAAY,YAAY,IAAO,SAAS,MAAO;CAEjD,OAAO;AACT;AAIA,MAAM,yBAAS,IAAI,YAAY,EAAY;AAC3C,MAAM,2BAAW,IAAI,YAAY,EAAY;AAC7C,MAAM,wBAAQ,IAAI,YAAY,GAAG;AACjC,MAAM,0BAAU,IAAI,WAAW,GAAM;AACrC,MAAM,0BAAU,IAAI,WAAW,GAAM;;;;;AAMrC,SAAgB,WACd,SACA,OACA,OACA,MAEA,QACqB;CACrB,OAAO,KAAK,CAAC;CACb,KAAK,IAAI,SAAS,GAAG,SAAS,OAAO,UAAU,GAAG;EAChD,MAAM,SAAS,QAAQ,QAAQ;EAC/B,OAAO,UAAW,OAAO,UAAqB;CAChD;CACA,IAAI,MAAM;CACV,OAAO,OAAO,KAAK,OAAO,SAAS,GACjC,OAAO;CAET,IAAI,QAAQ,GAAG;EAGb,MAAM,UAAU;EAChB,OAAO;GAAE,SAAS,WAAW,GAAG,SAAS,OAAO;GAAG,MAAM;GAAG,UAAU;EAAE;CAC1E;CACA,IAAI,OAAO;CACX,KAAK,IAAI,SAAS,GAAG,UAAU,UAAU,UAAU,GAAG;EACpD,SAAS;EACT,QAAQ,OAAO;EACf,IAAI,OAAO,GACT,OAAO;CAEX;CACA,IAAI,OAAO,MAAM,SAAS,UAAU,SAAS,QAAQ,IACnD,OAAO;CAGT,IAAI,OAAO;CACX,KAAK,IAAI,SAAS,GAAG,UAAU,UAAU,UAAU,GAAG;EACpD,SAAS,UAAU;EACnB,OAAQ,OAAQ,OAAO,WAAuB;CAChD;CACA,MAAM,WAAW,KAAK,IAAI,KAAK,UAAU,KAAK;CAC9C,MAAM,WAAW,KAAK;CACtB,MAAM,OAAO,WAAW;CAGxB,MAAM,eAAe,MAAM;CAC3B,IAAI,cACF,QAAQ,KAAK,GAAG,GAAG,QAAQ;CAE7B,KAAK,IAAI,SAAS,GAAG,SAAS,OAAO,UAAU,GAAG;EAChD,MAAM,SAAS,QAAQ,QAAQ;EAC/B,IAAI,WAAW,GACb;EAEF,MAAM,WAAW,SAAS;EAC1B,SAAS,UAAU,WAAW;EAC9B,MAAM,WAAW,YAAY,UAAU,MAAM;EAC7C,MAAM,UAAU;EAChB,IAAI,SAAS,YAAY,SAAU,QAAQ,WAAW,OACpD,QAAQ,WAAW,QAAQ;CAE/B;CAEA,IAAI,OAAO;CACX,IAAI,cACF,KAAK,IAAI,OAAO,GAAG,OAAO,UAAU,QAAQ,GAAG;EAC7C,MAAM,UAAU,QAAQ;EACxB,IAAI,UAAU,GAAG;GACf,QAAQ,QAAQ;GAChB,QAAQ,KAAM,UAAU;EAC1B;CACF;CAEF,MAAM,UACJ,WAAW,KAAA,KAAa,QAAQ,OAAO,SACnC,SACA,IAAI,WAAW,IAAI;CACzB,IAAI,OAAO,GAET,QAAQ,KAAK,MAAmB;CAElC,IAAI,cACF,KAAK,IAAI,OAAO,GAAG,OAAO,UAAU,QAAQ,GAAG;EAC7C,MAAM,UAAU,QAAQ;EACxB,IAAI,UAAU,GAAG;GACf,MAAM,SAAS,QAAQ;GACvB,QAAQ,QAAQ,EAAG,UAAU,gBAAkB,UAAU;EAC3D;CACF;CAEF,KAAK,IAAI,SAAS,GAAG,SAAS,OAAO,UAAU,GAAG;EAChD,MAAM,SAAS,QAAQ,QAAQ;EAC/B,IAAI,WAAW,GACb;EAEF,MAAM,QAAS,UAAU,KAAM;EAC/B,MAAM,WAAW,MAAM;EACvB,IAAI,UAAU,UAAU;GACtB,KAAK,IAAI,QAAQ,UAAU,QAAQ,UAAU,SAAS,KAAK,QACzD,QAAQ,SAAS;GAEnB;EACF;EACA,MAAM,OAAO,WAAW;EACxB,MAAM,SAAS,QAAQ;EACvB,MAAM,eAAe,KAAO,QAAQ,QAAmB;EACvD,MAAM,OAAO,KAAM,SAAS;EAC5B,KACE,IAAI,QAAQ,aAAa,UACzB,QAAQ,cACR,SAAS,MAET,QAAQ,SAAS,SAAS;CAE9B;CACA,OAAO;EAAE;EAAS;EAAM;CAAS;AACnC;AAEA,MAAM,sBACG;CACL,MAAM,0BAAU,IAAI,WAAW,GAAG;CAClC,QAAQ,KAAK,GAAG,GAAG,GAAG;CACtB,QAAQ,KAAK,GAAG,KAAK,GAAG;CACxB,QAAQ,KAAK,GAAG,KAAK,GAAG;CACxB,QAAQ,KAAK,GAAG,KAAK,GAAG;CAExB,OAAO;EACL,WAAW,4BAFK,IAAI,WAAW,EAAE,EAAA,CAAE,KAAK,CAEV,GAAG,GAAG,IAAI,UAAU,KAAK;EACvD,SAAS,WAAW,SAAS,GAAG,KAAK,UAAU,IAAI;CACrD;AACF,EAAA,CAAG;AAEL,MAAMG,0BAAQ,IAAI,WAAW,CAAC;;AAE9B,MAAM,sBAAsB;;AAE5B,MAAM,aAAa;AACnB,MAAM,cAAc;;;;AAKpB,IAAa,mBAAb,MAA8B;;CAE5B,MAAM;CAEN;CACA,QAA4BA;CAC5B,WAAmB;CACnB,OAAe;CACf,OAAe;;CAEf,SAA6BA;;CAE7B,QAAgB;;CAEhB,MAAc;;CAEd,SAAiB;;CAEjB,cAAsB;CACtB,UAAkB;CAClB,QAAgB;CAChB,UAAoC;CACpC;CAGA,8BAA+B,IAAI,WAAW,EAAE;CAChD,gCAAiC,IAAI,WAAW,GAAG;CACnD,cAA+B,IAAI,WACjC,KAAK,UAAU,UAAU,MAC3B;CACA,gBAAiC,IAAI,WAAW,mBAAmB;CACnE,kBAAmC,IAAI,WAAW,mBAAmB;CAErE,YAAY,OAAiB;EAC3B,KAAK,OAAO,UAAU;EACtB,KAAK,UAAU,KAAK,IAAI;CAC1B;;CAGA,IAAI,iBAA6B;EAC/B,OAAO,KAAK,MAAMA,UAAQ,KAAK,MAAM,SAAS,KAAK,QAAQ;CAC7D;;;;;CAMA,WAAW,MAAkB,YAAY,GAAe;EACtD,IAAI,KAAK,YAAY,MACnB,MAAM,KAAK;EAEb,KAAK,QAAQ;EACb,KAAK,WAAW;EAChB,KAAK,YAAY,cAAc,IAAI,OAAO,oBAAoB,SAAS;EACvE,KAAK,KAAK,IAAI;EACd,OAAO,KAAK,aAAa;CAC3B;;;;;;CAOA,QAAoB;EAClB,IAAI,KAAK,YAAY,MACnB,OAAOA;EAET,KAAK,QAAQ,KAAK;EAClB,KAAK,WAAW;EAChB,KAAK,YAAY,OAAO,iBAAiB;EACzC,KAAK,KAAK,KAAK;EACf,OAAO,KAAK,aAAa;CAC3B;CAEA,YAAoB,OAAqB;EACvC,MAAM,OAAO,KAAK,IAAI,aAAa,KAAK,WAAW;EACnD,MAAM,SAAS,IAAI,WAAW,OAAO,KAAK,IAAI,OAAO,WAAW,CAAC;EACjE,OAAO,IAAI,KAAK,OAAO,SAAS,KAAK,MAAM,MAAM,KAAK,GAAG,CAAC;EAC1D,KAAK,SAAS;EACd,KAAK,QAAQ;EACb,KAAK,MAAM;EACX,KAAK,SAAS,OAAO;EACrB,KAAK,UAAU;CACjB;CAEA,eAAmC;EACjC,KAAK,YAAY;EACjB,KAAK,eAAe,KAAK,MAAM,KAAK;EACpC,OAAO,KAAK,OAAO,SAAS,KAAK,OAAO,KAAK,GAAG;CAClD;CAEA,KAAa,OAAsB;EACjC,IAAI,KAAK,KACP;EAEF,IAAI;EACJ,IAAI;GAEF,OAAO,KAAK,QAAQ,KAAK;EAC3B,SAAS,OAAO;GACd,IAAI,iBAAiB,WAAW;IAC9B,KAAK,UAAU;IACf,IAAI,CAAC,OACH;GAEJ;GACA,MAAM;EACR;EACA,IAAI,KAAK,SAAS,MAChB,KAAK,MAAM;CAEf;;CAGA,KAAa,QAAsB;EACjC,MAAM,OAAO,KAAK,IAChB,KAAK,QACL,KAAK,IAAI,KAAK,MAAM,QAAQ,KAAK,OAAO,SAAS,CAAC,CACpD;EACA,MAAM,QAAQ,IAAI,WAAW,IAAI;EACjC,MAAM,IAAI,KAAK,OAAO,SAAS,GAAG,KAAK,GAAG,CAAC;EAC3C,KAAK,SAAS;CAChB;CAEA,IAAY,QAAgB;EAC1B,OAAO,KAAK,cAAc,KAAK,MAAM,KAAK;CAC5C;CAEA,cAA4B;EAC1B,IAAI,KAAK,QAAQ,KAAK,MAAM,KAAK,SAC/B,KAAK,QAAQ,YAAY,KAAK,OAAO,KAAK,QAAQ,KAAK,SAAS,KAAK,GAAG;EAE1E,KAAK,UAAU,KAAK;CACtB;CAEA,MAAc,SAA4B;EACxC,OAAO,IAAI,UACT,SAAS,aAAa,6BAA6B,SACrD;CACF;;CAGA,KAAa,OAAwB;EACnC,OAAO,KAAK,OAAO,OAAO;GACxB,IAAI,KAAK,YAAY,KAAK,MAAM,QAC9B,OAAO;GAET,KAAK,QAAS,KAAK,MAAM,KAAK,aAAwB,KAAK;GAC3D,KAAK,YAAY;GACjB,KAAK,QAAQ;EACf;EACA,OAAO;CACT;CAEA,KAAa,OAAqB;EAChC,KAAK,UAAU;EACf,KAAK,QAAQ;CACf;CAGA,CAAS,OAAuC;EAC9C,OAAO,CAAC,KAAK,KAAK,EAAE,GAClB,MAAM;EAER,MAAM,QAAQ,KAAK,OAAO;EAC1B,KAAK,KAAK,EAAE;EACZ,OAAO;CACT;CAEA,CAAS,UAAU,OAA+C;EAChE,OAAO,CAAC,KAAK,KAAK,KAAK,GACrB,MAAM;EAER,MAAM,QAAQ,KAAK,QAAS,KAAK,SAAS;EAC1C,KAAK,KAAK,KAAK;EACf,OAAO;CACT;;;;;CAMA,OAAe,OAA6B;EAC1C,SAAS;GACP,IAAI,QAAQ,MAAM,QAAQ,KAAK,OAAO,MAAM;GAC5C,IAAI,QAAQ,GACV,QAAQ,cAAc,MAAM,SAAS,OAAO,KAAK,MAAM,MAAM,QAAQ;GAEvE,IAAI,UAAU,MAAM,KAAK,MAAM;IAC7B,KAAK,KAAK,UAAU,EAAE;IACtB,OAAO,QAAQ;GACjB;GACA,IAAI,KAAK,YAAY,KAAK,MAAM,QAC9B,OAAO;GAET,KAAK,QAAS,KAAK,MAAM,KAAK,aAAwB,KAAK;GAC3D,KAAK,YAAY;GACjB,KAAK,QAAQ;EACf;CACF;CAEA,CAAS,OAAO,OAAqD;EACnE,IAAI,SAAS,KAAK,OAAO,KAAK;EAC9B,OAAO,SAAS,GAAG;GACjB,MAAM;GACN,SAAS,KAAK,OAAO,KAAK;EAC5B;EACA,OAAO;CACT;CAGA,CAAS,OAAqC;EAC5C,OAAO,KAAK,OAAO,KAAK,QACtB,MAAM;EAER,IAAI,KAAK,OAAO,KAAK,OAAO,QAC1B,KAAK,KAAK,CAAC;CAEf;CAEA,CAAS,MAAoC;EAC3C,IAAI,KAAK,MACP,OAAO,KAAK,WAAW;EAEzB,IAAI,OAAO;EACX,OAAO,CAAC,MAAM;GACZ,MAAM,SAAS,OAAO,KAAK,UAAU,CAAC;GACtC,QAAQ,SAAS,OAAO;GACxB,MAAM,OAAO,WAAW;GACxB,IAAI,SAAS,GACX,OAAO,KAAK,YAAY;QACnB,IAAI,SAAS,GAClB,OAAO,KAAK,MAAM,aAAa,SAAS,aAAa,SAAS;QACzD,IAAI,SAAS,GAAG;IACrB,MAAM,SAAS,OAAO,KAAK,cAAc;IACzC,OAAO,KAAK,MAAM,OAAO,SAAS,OAAO,SAAS;GACpD,OACE,MAAM,KAAK,MAAM,oBAAoB;EAEzC;EAEA,KAAK,KAAK,KAAK,OAAO,CAAC;EACvB,IAAI,KAAK,MACP,OAAO,KAAK,YAAY;CAE5B;CAEA,QAAgB,MAAoB;EAClC,KAAK,QAAQ,YACX,KAAK,OACL,WAAW,GAAG,OAAO,KAAM,SAAS,CAAC,CACvC;CACF;CAEA,CAAS,aAA2C;EAClD,MAAM,QAAQ,OAAO,KAAK,KAAK;EAC/B,IAAI,UAAU,OACZ,MAAM,KAAK,MAAM,wBAAwB;EAE3C,KAAK,QAAQ;EACb,KAAK,QAAQ,KAAK;EAClB,OAAO,CAAC,KAAK,KAAK,EAAE,GAClB,MAAM;EAER,MAAM,QAAQ,KAAK,OAAO;EAC1B,KAAK,QAAQ,SAAU,GACrB,MAAM,KAAK,MAAM,4BAA4B;EAE/C,IAAI,QAAQ,OACV,MAAM,KAAK,MAAM,0BAA0B;EAE7C,KAAK,KAAK,EAAE;EACZ,MAAM,aAAa,QAAQ,SAAa;EACxC,MAAM,WAAW,SAAuB;GACtC,IAAI,WACF,KAAK,QAAQ,IAAI;EAErB;EACA,QAAQ,KAAK;EAEb,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,QAAQ,OAAO,KAAK,KAAK,CAAC;EAE5B,IAAI,QAAQ,MAAS;GACnB,MAAM,cAAc,OAAO,KAAK,KAAK;GACrC,QAAQ,WAAW;GACnB,OAAO,KAAK,UAAU,aAAa,SAAS;EAC9C;EACA,KAAK,MAAM,QAAQ,CAAC,MAAS,IAAO,GAClC,IAAI,QAAQ,MACV,OAAO,KAAK,WAAW,SAAS;EAGpC,IAAI,WAAW;GACb,OAAO,CAAC,KAAK,KAAK,EAAE,GAClB,MAAM;GAER,KAAK,KAAK,OAAO,YAAc,KAAK,QAAQ,QAC1C,MAAM,KAAK,MAAM,qBAAqB;GAExC,KAAK,KAAK,EAAE;EACd;EACA,KAAK,QAAQ;CACf;CAGA,CAAS,UACP,QACA,WAC8B;EAC9B,IAAI,OAAO;EACX,OAAO,OAAO,GAAG;GACf,IAAI,KAAK,YAAY,KAAK,MAAM,QAAQ;IACtC,MAAM;IACN;GACF;GACA,MAAM,MAAM,KAAK,IAAI,KAAK,WAAW,MAAM,KAAK,MAAM,MAAM;GAC5D,IAAI,WACF,KAAK,QAAQ,YAAY,KAAK,OAAO,KAAK,OAAO,KAAK,UAAU,GAAG;GAErE,QAAQ,MAAM,KAAK;GACnB,KAAK,WAAW;EAClB;CACF;CAGA,CAAS,WAAW,WAAkD;EACpE,SAAS;GACP,IAAI,KAAK,YAAY,KAAK,MAAM,QAAQ;IACtC,MAAM;IACN;GACF;GACA,MAAM,OAAO,KAAK,MAAM,KAAK;GAC7B,IAAI,WACF,KAAK,QAAQ,YACX,KAAK,OACL,KAAK,OACL,KAAK,UACL,KAAK,WAAW,CAClB;GAEF,KAAK,YAAY;GACjB,IAAI,SAAS,GACX;EAEJ;CACF;CAEA,CAAS,cAA4C;EACnD,MAAM,SAAS,OAAO,KAAK,KAAK;EAChC,MAAM,UAAU,OAAO,KAAK,KAAK;EACjC,KAAK,YAAY;EACjB,KAAM,WAAW,KAAM,YAAY,MAAM,KAAK,OAC5C,MAAM,KAAK,MAAM,sBAAsB;EAEzC,MAAM,UAAU,OAAO,KAAK,KAAK;EAEjC,MAAM,OADkB,KAAK,KAAK,MAChB,KAAM,aAAa,MAAM,KAAK,QAAQ,KAAK,IAC3D,MAAM,KAAK,MAAM,wBAAwB;CAE7C;CAEA,CAAS,cAA4C;EACnD,KAAK,KAAK,KAAK,OAAO,CAAC;EACvB,MAAM,SAAS,OAAO,KAAK,KAAK;EAEhC,IAAI,aAAY,OADU,KAAK,KAAK,KACP,QAC3B,MAAM,KAAK,MAAM,8BAA8B;EAEjD,IAAI,OAAO;EACX,OAAO,OAAO,GAAG;GACf,IAAI,KAAK,YAAY,KAAK,MAAM,QAAQ;IACtC,MAAM;IACN;GACF;GACA,OAAO,KAAK,KAAK;GACjB,MAAM,OAAO,KAAK,IAChB,MACA,KAAK,MAAM,SAAS,KAAK,UACzB,KAAK,OAAO,SAAS,KAAK,GAC5B;GACA,KAAK,OAAO,IACV,KAAK,MAAM,SAAS,KAAK,UAAU,KAAK,WAAW,IAAI,GACvD,KAAK,GACP;GACA,KAAK,OAAO;GACZ,KAAK,YAAY;GACjB,QAAQ;EACV;CACF;CAEA,CAAS,gBAIP;EACA,OAAO,CAAC,KAAK,KAAK,EAAE,GAClB,MAAM;EAER,MAAM,eAAe,KAAK,OAAO,MAAM;EACvC,MAAM,iBAAkB,KAAK,SAAS,IAAK,MAAM;EACjD,MAAM,aAAc,KAAK,SAAS,KAAM,MAAM;EAC9C,KAAK,KAAK,EAAE;EACZ,IAAI,cAAc,OAAO,gBAAgB,IACvC,MAAM,KAAK,MAAM,qCAAqC;EAExD,MAAM,EAAE,aAAa,eAAe,YAAY;EAChD,YAAY,KAAK,CAAC;EAClB,KAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,SAAS,GAC9C,YAAY,MAAM,UAAoB,OAAO,KAAK,UAAU,CAAC;EAE/D,MAAM,YAAY,WAChB,aACA,GACA,IACA,UAAU,OACV,KAAK,WACP;EACA,IAAI,cAAc,MAChB,MAAM,KAAK,MAAM,0BAA0B;EAE7C,MAAM,QAAQ,cAAc;EAC5B,IAAI,OAAO;EACX,OAAO,OAAO,OAAO;GACnB,IAAI,SAAS,OAAO,KAAK,OAAO,SAAS;GACzC,IAAI,WAAW,SAEb,SAAS;GAEX,IAAI,SAAS,IAAI;IACf,QAAQ,QAAQ;IAChB,QAAQ;IACR;GACF;GACA,IAAI;GACJ,IAAI,QAAQ;GACZ,IAAI,WAAW,IAAI;IACjB,OAAO,CAAC,KAAK,KAAK,CAAC,GACjB,MAAM;IAER,IAAI,SAAS,GACX,MAAM,KAAK,MAAM,2BAA2B;IAE9C,QAAQ,QAAQ,OAAO;IACvB,SAAS,KAAK,OAAO,KAAK,UAAU,CAAC;GACvC,OAAO,IAAI,WAAW,IACpB,SAAS,KAAK,OAAO,KAAK,UAAU,CAAC;QAErC,SAAS,MAAM,OAAO,KAAK,UAAU,CAAC;GAExC,IAAI,OAAO,SAAS,OAClB,MAAM,KAAK,MAAM,2BAA2B;GAE9C,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM;GACvC,QAAQ;EACV;EACA,IAAI,QAAQ,kBAAkB,GAC5B,MAAM,KAAK,MAAM,sCAAsC;EAEzD,MAAM,cAAc,WAClB,SACA,GACA,aACA,UAAU,MACV,KAAK,aACP;EACA,IAAI,gBAAgB,MAClB,MAAM,KAAK,MAAM,6BAA6B;EAEhD,MAAM,gBAAgB,WACpB,SACA,aACA,eACA,UAAU,OACV,KAAK,eACP;EACA,IAAI,kBAAkB,MACpB,MAAM,KAAK,MAAM,uBAAuB;EAE1C,OAAO;GAAE,WAAW;GAAe,SAAS;EAAY;CAC1D;CAEA,CAAS,MACP,aACA,eAC8B;EAC9B,SAAS;GACP,IACE,KAAK,MAAM,SAAS,KAAK,YAAY,cACrC,KAAK,MAAM,eAAe,KAAK,QAC/B;IACA,IAAI,KAAK,MAAM,cAAc,KAAK,OAAO,QACvC,KAAK,KAAK,WAAW;IAEvB,IAAI,KAAK,UAAU,aAAa,aAAa,GAC3C;IAEF;GACF;GAEA,MAAM,SAAS,OAAO,KAAK,OAAO,WAAW;GAC7C,IAAI,SAAS,cAAc;IACzB,OAAO,KAAK,KAAK;IACjB,KAAK,OAAO,KAAK,OAAO;IACxB,KAAK,OAAO;IACZ;GACF;GACA,IAAI,WAAW,cACb;GAEF,IAAI,UAAU,gBACZ,MAAM,KAAK,MAAM,6BAA6B;GAEhD,MAAM,cAAc,SAAS;GAC7B,MAAM,SACH,YAAY,gBACZ,OAAO,KAAK,UAAU,aAAa,YAAsB;GAC5D,MAAM,iBAAiB,OAAO,KAAK,OAAO,aAAa;GACvD,IAAI,kBAAkB,kBACpB,MAAM,KAAK,MAAM,uBAAuB;GAE1C,MAAM,WACH,UAAU,mBACV,OAAO,KAAK,UAAU,WAAW,eAAyB;GAC7D,KAAK,IAAI,OAAO,QAAQ,OAAO,GAAG,QAAQ,GAAG;IAC3C,OAAO,KAAK,KAAK;IACjB,IAAI,WAAW,KAAK,OAClB,MAAM,KAAK,MAAM,+BAA+B;IAElD,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,MAAM;IAC/C,KAAK,OAAO;GACd;EACF;CACF;;;;;;CAQA,UACE,aACA,eACS;EACT,MAAM,QAAQ,KAAK;EACnB,MAAM,SAAS,KAAK;EACpB,MAAM,gBAAgB,YAAY;EAClC,MAAM,aAAa,YAAY;EAC/B,MAAM,kBAAkB,cAAc;EACtC,MAAM,eAAe,cAAc;EACnC,MAAM,iBAAiB,YAAY;EACnC,MAAM,mBAAmB,cAAc;EACvC,MAAM,YAAY,MAAM,SAAU;EAClC,MAAM,aAAa,KAAK,IAAI,KAAK,QAAQ,OAAO,MAAM,IAAI;EAC1D,MAAM,YAAY,KAAK,cAAc,KAAK;EAC1C,IAAI,WAAW,KAAK;EACpB,IAAI,OAAO,KAAK;EAChB,IAAI,OAAO,KAAK;EAChB,IAAI,MAAM,KAAK;EACf,IAAI,aAAa;EACjB,IAAI,UAAyB;EAC7B,OAAO,WAAW,aAAa,OAAO,YAAY;GAChD,IAAI,OAAO,IAAI;IACb,QAAS,MAAM,aAAwB;IACvC,QAAS,MAAM,WAAW,MAAkB,OAAO;IACnD,YAAY;IACZ,QAAQ;GACV;GACA,IAAI,QAAQ,cAAc,OAAO;GACjC,IAAI,QAAQ,GACV,QAAQ,cAAc,eAAe,OAAO,MAAM,cAAc;GAElE,IAAI,OAAO,UAAU;GACrB,UAAU;GACV,QAAQ;GACR,MAAM,SAAS,QAAQ;GACvB,IAAI,SAAS,cAAc;IACzB,OAAO,OAAO;IACd,OAAO;IACP;GACF;GACA,IAAI,WAAW,cAAc;IAC3B,aAAa;IACb;GACF;GACA,IAAI,UAAU,gBAAgB;IAC5B,UAAU;IACV;GACF;GACA,IAAI,SAAS,YAAY,SAAS;GAClC,IAAI,QAAQ,aAAa,SAAS;GAClC,IAAI,QAAQ,GAAG;IACb,IAAI,OAAO,OAAO;KAChB,QAAS,MAAM,aAAwB;KACvC,YAAY;KACZ,QAAQ;IACV;IACA,UAAU,QAAS,KAAK,SAAS;IACjC,UAAU;IACV,QAAQ;GACV;GACA,IAAI,OAAO,IAAI;IACb,QAAS,MAAM,aAAwB;IACvC,QAAS,MAAM,WAAW,MAAkB,OAAO;IACnD,YAAY;IACZ,QAAQ;GACV;GACA,QAAQ,gBAAgB,OAAO;GAC/B,IAAI,QAAQ,GACV,QAAQ,cAAc,iBAAiB,OAAO,MAAM,gBAAgB;GAEtE,OAAO,UAAU;GACjB,UAAU;GACV,QAAQ;GACR,MAAM,iBAAiB,QAAQ;GAC/B,IAAI,kBAAkB,kBAAkB;IACtC,UAAU;IACV;GACF;GACA,IAAI,WAAW,UAAU;GACzB,QAAQ,WAAW;GACnB,IAAI,QAAQ,GAAG;IACb,OAAO,OAAO,OAAO;KACnB,QAAS,MAAM,aAAwB;KACvC,YAAY;KACZ,QAAQ;IACV;IACA,YAAY,QAAS,KAAK,SAAS;IACnC,UAAU;IACV,QAAQ;GACV;GACA,IAAI,WAAW,YAAY,KAAK;IAC9B,UAAU;IACV;GACF;GACA,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAAG;IAC9C,OAAO,OAAO,OAAO,MAAM;IAC3B,OAAO;GACT;EACF;EAEA,MAAM,SAAS,SAAS;EACxB,YAAY;EACZ,QAAQ,UAAU;EAClB,KAAK,WAAW;EAChB,KAAK,OAAO,QAAS,KAAK,QAAQ;EAClC,KAAK,OAAO;EACZ,KAAK,MAAM;EACX,IAAI,YAAY,MACd,MAAM,KAAK,MAAM,OAAO;EAE1B,OAAO;CACT;AACF;;;ACr3BA,IAAa,YAAb,cAA+B,MAAM;CACnC,OAAgB;AAClB;;AAGA,MAAM,cAAc;CAClB,SAAS;CACT,gBAAgB;CAChB,qBAAqB;CACrB,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,4BAA4B;CAC5B,+BAA+B;CAC/B,sBACE;CACF,gBAAgB;CAChB,eAAe;AACjB;;AAIA,IAAM,OAAN,cAAmB,MAAM;CACvB;CAEA,YAAY,MAAiB;EAC3B,MAAM,IAAI;EACV,KAAK,OAAO;CACd;AACF;AAEA,SAAS,KAAK,MAAwB;CACpC,MAAM,IAAI,KAAK,IAAI;AACrB;AAEA,MAAMC,0BAAQ,IAAI,WAAW,CAAC;AAC9B,MAAM,mBAAmB;AACzB,MAAM,6BAA6B;AACnC,MAAM,4BAA4B;AAClC,MAAM,yBAAyB;AAC/B,MAAM,sBAAsB;AAC5B,MAAM,sBAAsB;AAC5B,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB,KAAK;AAC3B,MAAM,gBAAgB;AACtB,MAAM,wBAAwB;;AAE9B,MAAM,kBAAkB,KAAK,KAAK;AAClC,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAC3B,MAAM,kBAAkB;AACxB,MAAM,6BAA6B;AACnC,MAAM,YAAY;AAClB,MAAM,sBAAsB,MAAM,MAAM;AACxC,MAAM,iBAAiB;CAAC;CAAG;CAAG;CAAG;AAAC;AAClC,MAAM,iBAAiB;CAAC;CAAG;CAAG;CAAG;AAAC;AAClC,MAAM,mBAAmB;AACzB,MAAM,4BAA4B;AAClC,MAAM,mBAAmB;AACzB,MAAM,4BAA4B;AAClC,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM,UAAU;AAChB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,cAAc;AAEpB,MAAM,KAAK;AACX,MAAM,KAAK,OAAO;;AAElB,MAAM,oBAAoB;CACxB,KAAK;CACL,KAAK;CACL,MAAM;CACN;CACA,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;AACR;AAEA,SAAS,OAAO,MAAkB,OAAuB;CACvD,OAAO,KAAK,UAAU;AACxB;AAEA,SAAS,KAAK,MAAkB,OAAuB;CACrD,OAAO,OAAO,MAAM,KAAK,IAAK,OAAO,MAAM,QAAQ,CAAC,KAAK;AAC3D;AAEA,SAAS,KAAK,MAAkB,OAAuB;CACrD,OAAO,KAAK,MAAM,KAAK,IAAK,OAAO,MAAM,QAAQ,CAAC,KAAK;AACzD;AAEA,SAAS,KAAK,MAAkB,OAAuB;CACrD,QAAQ,KAAK,MAAM,KAAK,IAAK,OAAO,MAAM,QAAQ,CAAC,KAAK,QAAS;AACnE;AAEA,SAAS,KAAK,MAAkB,OAAuB;CACrD,OAAO,OAAO,KAAK,MAAM,KAAK,CAAC,IAAK,OAAO,KAAK,MAAM,QAAQ,CAAC,CAAC,KAAK;AACvE;;AAGA,SAAS,UAAU,OAAuB;CACxC,OAAO,KAAK,KAAK,MAAM,KAAK;AAC9B;AAEA,SAAS,MAAM,OAAuB;CACpC,OAAO,KAAK,KAAK,MAAM,QAAQ,CAAC,KAAK;AACvC;AAEA,SAAS,MAAM,IAAY,IAAoB;CAC7C,OAAO,OAAO,IAAI,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE;AAC7C;;AAGA,SAAS,gBAAgB,IAAY,IAAY,OAAuB;CACtE,IAAI,UAAU,GACZ,OAAO;CAET,IAAI,QAAQ,IACV,QAAS,OAAO,QAAU,MAAO,KAAK,WAAa;CAErD,OAAO,OAAQ,QAAQ;AACzB;;AAGA,SAAS,gBAAgB,IAAY,IAAY,OAAuB;CACtE,IAAI,UAAU,GACZ,OAAO;CAET,IAAI,QAAQ,IACV,QAAS,MAAM,QAAU,OAAQ,KAAK,WAAa;CAErD,OAAQ,MAAO,QAAQ,OAAS;AAClC;AAEA,SAAS,KAAK,MAAsB;CAClC,OAAO,QAAQ,KAAK,cAAiB,KAAK,QAAQ;AACpD;AAKA,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AACtB,MAAM,eAAe;;AAErB,MAAM,cAAc;AAEpB,IAAM,YAAN,MAAgB;CACd,MAAkBA;CAClB,QAAQ;CACR,WAAW;CACX,MAAM;CACN,KAAK;CACL,KAAK;CACL,WAAW;CAEX,KAAa,IAAkB;EAC7B,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;EAC3B,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC;CACjC;;CAGA,KAAK,KAAiB,OAAe,MAAuB;EAC1D,KAAK,MAAM;EACX,IAAI,OAAO,GAAG;GACZ,KAAK,QAAQ;GACb,KAAK,WAAW;GAChB,KAAK,MAAM;GACX,KAAK,KAAK;GACV,KAAK,KAAK;GACV,KAAK,WAAW;GAChB,OAAO;EACT;EACA,KAAK,QAAQ;EACb,KAAK,WAAW,QAAQ;EACxB,MAAM,WAAW,OAAO,KAAK,QAAQ,OAAO,CAAC;EAC7C,KAAK,WAAW,WAAW,IAAI,UAAU,QAAQ,IAAI;EACrD,IAAI,QAAQ,GAAG;GACb,KAAK,MAAM,QAAQ,OAAO;GAC1B,KAAK,KAAK,KAAK,GAAG;GAClB,OAAO,aAAa;EACtB;EACA,KAAK,MAAM;EACX,IAAI,KAAK;EACT,IAAI,KAAK;EACT,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,SAAS,GAAG;GAC5C,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK;GACtC,IAAI,QAAQ,GACV,MAAM,QAAS,IAAI;QAEnB,MAAM,QAAS,KAAK,QAAQ;EAEhC;EACA,KAAK,KAAK,OAAO;EACjB,KAAK,KAAK,OAAO;EACjB,IAAI,aAAa,GACf,OAAO;EAET,KAAK,aAAa,IAAI,QAAQ;EAC9B,OAAO;CACT;;CAGA,KAAK,MAAsB;EACzB,MAAM,UAAW,KAAK,KAAK,WAAW,QAAQ,KAAM,MAAM;EAC1D,QAAQ,gBAAgB,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,OAAO;CACrE;;CAGA,SAAS,MAAsB;EAC7B,MAAM,OAAO,gBAAgB,KAAK,IAAI,KAAK,IAAI,KAAK,WAAW,EAAE;EACjE,OAAO,QAAQ,KAAK,OAAO,SAAU,KAAK;CAC5C;CAEA,KAAK,MAAsB;EACzB,MAAM,QAAQ,KAAK,KAAK,IAAI;EAC5B,KAAK,YAAY;EACjB,OAAO;CACT;CAEA,SAAS,MAAsB;EAC7B,MAAM,QAAQ,KAAK,SAAS,IAAI;EAChC,KAAK,YAAY;EACjB,OAAO;CACT;CAEA,iBAAiC;EAC/B,KAAK,OAAO,KAAK,aAAa;EAC9B,KAAK,YAAY;EACjB,KAAK,KAAK,KAAK,GAAG;EAClB,OAAO;CACT;CAEA,aAAqB;EACnB,IAAI,KAAK,MAAM,KAAK,UAClB,OAAO;EAET,OAAO,KAAK,eAAe;CAC7B;CAEA,SAAiB;EACf,IAAI,KAAK,WAAW,IAAI;GACtB,KAAK,MAAM;GACX,OAAO;EACT;EACA,IAAI,KAAK,OAAO,KAAK,UACnB,OAAO,KAAK,eAAe;EAE7B,IAAI,KAAK,QAAQ,KAAK,OACpB,OAAO,KAAK,WAAW,KAAK,oBAAoB;EAElD,IAAI,QAAQ,KAAK,aAAa;EAC9B,IAAI,SAAS;EACb,IAAI,KAAK,MAAM,QAAQ,KAAK,OAAO;GACjC,QAAQ,KAAK,MAAM,KAAK;GACxB,SAAS;EACX;EACA,KAAK,OAAO;EACZ,KAAK,YAAY,QAAQ;EACzB,KAAK,KAAK,KAAK,GAAG;EAClB,OAAO;CACT;CAEA,QAAiB;EACf,OAAO,KAAK,QAAQ,KAAK,SAAS,KAAK,aAAa;CACtD;AACF;AAKA,MAAM,QAA0B,CAAC,YAAe,UAAa;AAC7D,MAAM,QAA0B,CAAC,YAAe,SAAa;AAC7D,MAAM,QAA0B,CAAC,WAAe,UAAa;AAC7D,MAAM,QAA0B,CAAC,YAAe,UAAa;AAC7D,MAAM,QAA0B,CAAC,WAAe,SAAa;AAI7D,SAAS,MAAM,GAAQ,GAAa;CAClC,MAAM,KAAK,EAAE,KAAK,EAAE;CAEpB,OAAO,CADK,EAAE,KAAK,EAAE,MAAM,KAAK,aAAgB,IAAI,OAAQ,GAChD,OAAO,CAAC;AACtB;AAEA,SAAS,MAAM,GAAQ,GAAa;CAClC,MAAM,KAAK,EAAE;CACb,MAAM,KAAK,EAAE;CACb,MAAM,MAAM,KAAK;CACjB,MAAM,MAAM,OAAO;CACnB,MAAM,MAAM,KAAK;CACjB,MAAM,MAAM,OAAO;CACnB,MAAM,MAAM,MAAM;CAClB,MAAM,MAAM,MAAM;CAClB,MAAM,MAAM,MAAM;CAClB,MAAM,MAAM,MAAM;CAClB,MAAM,UAAU,QAAQ,OAAO,MAAM,UAAY,MAAM;CACvD,MAAM,OAAQ,SAAS,UAAY,KAAO,MAAM,WAAc;CAC9D,IAAI,KAAK,OAAO,QAAQ,OAAO,QAAQ,OAAO,WAAW;CACzD,KAAM,KAAK,KAAK,KAAK,EAAE,IAAI,EAAE,IAAI,KAAK,KAAK,IAAI,EAAE,EAAE,MAAO;CAC1D,OAAO,CAAC,IAAI,EAAE;AAChB;AAEA,SAAS,OAAO,GAAQ,MAAmB;CACzC,MAAM,CAAC,IAAI,MAAM;CACjB,IAAI,SAAS,IACX,OAAO,CAAC,IAAI,EAAE;CAEhB,IAAI,OAAO,IACT,OAAO,EACH,MAAM,OAAS,OAAQ,KAAK,UAAY,IACxC,MAAM,OAAS,OAAQ,KAAK,UAAY,CAC5C;CAEF,MAAM,QAAQ,OAAO;CACrB,OAAO,EACH,MAAM,QAAU,OAAQ,KAAK,WAAa,IAC1C,MAAM,QAAU,OAAQ,KAAK,WAAa,CAC9C;AACF;AAEA,SAAS,MAAM,GAAQ,GAAa;CAClC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC;AAClD;AAEA,SAAS,MAAM,GAAQ,MAAmB;CACxC,IAAI,QAAQ,IACV,OAAO,CAAC,GAAG,EAAE,OAAQ,OAAO,EAAG;CAEjC,OAAO,CAAC,EAAE,OAAO,OAAQ,EAAE,OAAO,OAAS,EAAE,MAAO,KAAK,UAAY,CAAC;AACxE;AAEA,SAAS,OAAO,MAAkB,OAAoB;CACpD,OAAO,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC;AAClD;AAEA,SAAS,SAAS,KAAU,OAAiB;CAC3C,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK;AACjE;AAEA,SAAS,cAAc,KAAU,OAAiB;CAChD,OAAO,MAAM,MAAM,MAAM,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK;AACvE;;AAGA,IAAM,QAAN,MAAY;CACV,QAAgB;CAChB,KAAkB,MAAM,OAAO,KAAK;CACpC,KAAkB;CAClB,KAAkB,CAAC,GAAG,CAAC;CACvB,KAAkB,CACf,CAAC,MAAM,MAAM,MAAM,OAAO,IAAI,IAAI,OAAQ,GAC3C,CAAC,MAAM,OAAO,CAChB;CACA,yBAA0B,IAAI,WAAW,EAAE;CAC3C,WAAmB;CAEnB,OAAO,MAAkB,OAAe,KAAmB;EACzD,KAAK,SAAS,MAAM;EACpB,IAAI,QAAQ;EACZ,IAAI,KAAK,YAAY,MAAM,SAAS,IAAI;GACtC,KAAK,OAAO,IAAI,KAAK,SAAS,OAAO,GAAG,GAAG,KAAK,QAAQ;GACxD,KAAK,YAAY,MAAM;GACvB;EACF;EACA,IAAI,KAAK,WAAW,GAAG;GACrB,MAAM,OAAO,KAAK,KAAK;GACvB,KAAK,OAAO,IAAI,KAAK,SAAS,OAAO,QAAQ,IAAI,GAAG,KAAK,QAAQ;GACjE,SAAS;GACT,KAAK,OAAO,KAAK,QAAQ,CAAC;GAC1B,KAAK,WAAW;EAClB;EACA,OAAO,QAAQ,MAAM,KAAK;GACxB,KAAK,OAAO,MAAM,KAAK;GACvB,SAAS;EACX;EACA,IAAI,QAAQ,KAAK;GACf,KAAK,OAAO,IAAI,KAAK,SAAS,OAAO,GAAG,CAAC;GACzC,KAAK,WAAW,MAAM;EACxB;CACF;CAEA,OAAe,MAAkB,OAAqB;EACpD,KAAK,KAAK,SAAS,KAAK,IAAI,OAAO,MAAM,KAAK,CAAC;EAC/C,KAAK,KAAK,SAAS,KAAK,IAAI,OAAO,MAAM,QAAQ,CAAC,CAAC;EACnD,KAAK,KAAK,SAAS,KAAK,IAAI,OAAO,MAAM,QAAQ,EAAE,CAAC;EACpD,KAAK,KAAK,SAAS,KAAK,IAAI,OAAO,MAAM,QAAQ,EAAE,CAAC;CACtD;;CAGA,cAAsB;EACpB,IAAI;EACJ,IAAI,KAAK,SAAS,IAAI;GACpB,OAAO,MACL,MAAM,OAAO,KAAK,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,GAC5C,MAAM,OAAO,KAAK,IAAI,EAAE,GAAG,OAAO,KAAK,IAAI,EAAE,CAAC,CAChD;GACA,OAAO,cAAc,MAAM,KAAK,EAAE;GAClC,OAAO,cAAc,MAAM,KAAK,EAAE;GAClC,OAAO,cAAc,MAAM,KAAK,EAAE;GAClC,OAAO,cAAc,MAAM,KAAK,EAAE;EACpC,OACE,OAAO,MAAM,KAAK,IAAI,KAAK;EAE7B,OAAO,MAAM,MAAM,CACjB,KAAK,MAAM,KAAK,QAAQ,KAAK,EAAE,MAAM,GACrC,KAAK,UAAU,CACjB,CAAC;EACD,MAAM,OAAO,KAAK;EAClB,IAAI,QAAQ;EACZ,IAAI,SAAS,KAAK;EAClB,OAAO,UAAU,GAAG;GAClB,OAAO,MAAM,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,MAAM,KAAK,CAAC,CAAC;GACxD,OAAO,MAAM,MAAM,OAAO,MAAM,EAAE,GAAG,KAAK,GAAG,KAAK;GAClD,SAAS;GACT,UAAU;EACZ;EACA,IAAI,UAAU,GAAG;GACf,OAAO,MAAM,MAAM,MAAM,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC;GACvD,OAAO,MAAM,MAAM,OAAO,MAAM,EAAE,GAAG,KAAK,GAAG,KAAK;GAClD,SAAS;GACT,UAAU;EACZ;EACA,OAAO,SAAS,GAAG;GACjB,OAAO,MAAM,MAAM,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC;GACzD,OAAO,MAAM,OAAO,MAAM,EAAE,GAAG,KAAK;GACpC,SAAS;GACT,UAAU;EACZ;EACA,OAAO,MAAM,MAAM,MAAM,MAAM,EAAE,CAAC;EAClC,OAAO,MAAM,MAAM,KAAK;EACxB,OAAO,MAAM,MAAM,MAAM,MAAM,EAAE,CAAC;EAClC,OAAO,MAAM,MAAM,KAAK;EACxB,OAAO,MAAM,MAAM,MAAM,MAAM,EAAE,CAAC;EAClC,OAAO,KAAK;CACd;AACF;AAYA,SAAS,WACP,MACA,gBACA,KACA,OACA,MACQ;CACR,IAAI,OAAO,GAAG;EACZ,MAAM,yBAAS,IAAI,WAAW,CAAC;EAC/B,OAAO,IAAI,IAAI,SAAS,OAAO,QAAQ,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC;EACzD,MAAM,SAAS,eAAe,MAAM,gBAAgB,QAAQ,GAAG,CAAC;EAChE,IAAI,OAAO,OAAO,MAChB,KAAK,qBAAqB;EAE5B,OAAO;CACT;CACA,OAAO,eAAe,MAAM,gBAAgB,KAAK,OAAO,IAAI;AAC9D;AAGA,SAAS,eACP,MACA,gBACA,KACA,OACA,MACQ;CACR,MAAM,OAAO,QAAQ;CACrB,IAAI,KAAK;CACT,IAAI,UAAU;CACd,MAAM,SAAS,iBAAiB;CAChC,IAAI,YAAY;CAChB,KAAK,KAAK,GAAG,GAAG,MAAM;CACtB,IAAI,YAAY,KAAK,KAAK,EAAE;CAC5B,IAAI,UAAU,YAAY,MAAO;CACjC,IAAI,SAAS,2BACX,KAAK,qBAAqB;CAE5B,MAAM,WAAW;CACjB,eAAe;CACf,IAAI,WAAW;CACf,IAAI,aAAa,KAAK,UAAU;CAChC,IAAI,YAAY,KAAK;CACrB,UAAU;CACV,MAAM,gBAAsB;EAC1B,IAAI,MAAM,OAAO,KAAK,MAAM,YAAY,MAAM,OAAO,GAAG;GACtD,MAAM,YAAY;GAClB,YAAY;EACd,OAAO;GACL,YAAY,KAAK,OAAO,IAAI;GAC5B,YAAY;GACZ,KAAK,OAAO;EACd;EACA,YAAY,KAAK,KAAK,EAAE,MAAM;CAChC;CACA,SAAS;EACP,IAAI,WAAW;GACb,IAAI,UAAU,OAAO,CAAC,YAAY,gBAAmB,CAAC,KAAK;GAC3D,OAAO,WAAW,IAAI;IACpB,WAAW;IACX,IAAI,MAAM,OAAO,GACf,MAAM;SACD;KACL,YAAY,KAAK,OAAO,IAAI;KAC5B,YAAY;KACZ,KAAK,OAAO;IACd;IACA,YAAY,KAAK,KAAK,EAAE,MAAM;IAC9B,UAAU,OAAO,CAAC,YAAY,gBAAmB,CAAC,KAAK;GACzD;GACA,WAAW,IAAI;GACf,eAAe,IAAI;GACnB,YAAY,IAAI;GAChB,WAAW,YAAY;GACvB,YAAY;GACZ,IAAI,WAAW,QACb;GAEF,QAAQ;EACV;EACA,MAAM,MAAM,IAAI,YAAY,IAAI;EAChC,IAAI;EACJ,KAAK,YAAa,YAAY,OAAQ,IAAI,KAAK;GAC7C,QAAQ,YAAa,YAAY;GACjC,YAAY,SAAS;EACvB,OAAO;GACL,QAAQ,YAAa,IAAI,YAAY;GACrC,IAAI,SAAS,WACX,SAAS;GAEX,YAAY;EACd;EACA,SAAS;EACT,IAAI,SAAS,GACX,aAAa;OAEb,aAAa;EAEf,KAAK,WAAW;EAChB,WAAW;EACX,YAAY,UAAU;EACtB,IAAI,YAAY,WAAW;GACzB,IAAI,aAAa,GACf;GAEF,SAAS,UAAU,SAAS,IAAI;GAChC,YAAY,KAAM,SAAS;EAC7B;EACA,IAAI,WAAW,QACb;EAEF,QAAQ;CACV;CACA,IAAI,cAAc,GAChB,KAAK,qBAAqB;CAE5B,IAAI,UAAU,QACZ,KAAK,qBAAqB;CAE5B,IAAI,WAAW,IACb,KAAK,qBAAqB;CAE5B,MAAO,WAAW,KAAM;CACxB,OAAO;EAAE,gBAAgB,UAAU;EAAG,MAAM,KAAK;EAAO;CAAS;AACnE;;AAYA,SAAS,UAAU,WAA2B;CAC5C,QAAQ,cAAc,MAAM,cAAc,KAAK;AACjD;;;;;;AAOA,SAAS,cACP,MACA,gBACA,UAMA;CACA,MAAM,YAAY,KAAK;CACvB,MAAM,UAAU,IAAI,WAAW,SAAS;CACxC,MAAM,aAAa,IAAI,YAAY,iBAAiB,CAAC;CACrD,IAAI,gBAAgB,YAAY;CAChC,IAAI,WAAW;CACf,MAAM,aAAa,KAAM,WAAW;CACpC,KAAK,IAAI,SAAS,GAAG,UAAU,gBAAgB,UAAU,GAAG;EAC1D,MAAM,QAAQ,KAAK;EACnB,IAAI,UAAU,IAAI;GAChB,QAAQ,iBAAiB;GACzB,iBAAiB;GACjB,WAAW,UAAU;EACvB,OAAO;GACL,IAAI,SAAS,YACX,WAAW;GAEb,WAAW,UAAU;EACvB;CACF;CACA,MAAM,YAAY,YAAY;CAC9B,MAAM,OAAO,UAAU,SAAS;CAChC,IAAI,WAAW;CACf,KAAK,IAAI,SAAS,GAAG,UAAU,gBAAgB,UAAU,GAAG;EAC1D,MAAM,QAAQ,KAAK;EACnB,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;GAC7C,QAAQ,YAAY;GACpB,WAAY,WAAW,OAAQ;GAC/B,OAAO,WAAW,eAChB,WAAY,WAAW,OAAQ;EAEnC;CACF;CACA,IAAI,aAAa,GAGf,KAAK,qBAAqB;CAE5B,MAAM,YAAY,IAAI,YAAY,SAAS;CAC3C,MAAM,SAAS,IAAI,WAAW,SAAS;CACvC,KAAK,IAAI,OAAO,GAAG,OAAO,WAAW,QAAQ,GAAG;EAC9C,MAAM,SAAS,QAAQ;EACvB,MAAM,OAAO,WAAW;EACxB,WAAW,UAAU,OAAO;EAC5B,MAAM,OAAO,WAAW,UAAU,IAAI;EACtC,OAAO,QAAQ;EACf,UAAU,SAAU,QAAQ,QAAQ,YAAa;CACnD;CACA,OAAO;EAAE;EAAU;EAAQ;EAAW;CAAQ;AAChD;AAEA,SAAS,cACP,MACA,gBACA,UACU;CACV,MAAM,SAAS,cAAc,MAAM,gBAAgB,QAAQ;CAC3D,OAAO;EACL,UAAU,OAAO;EACjB,QAAQ,OAAO;EACf,UAAU,OAAO;EACjB,QAAQ,OAAO;EACf;CACF;AACF;AAEA,IAAM,WAAN,MAAe;CACb,QAAQ;CAER;CACA;CAEA,YAAY,OAAiB,MAAiB;EAC5C,KAAK,QAAQ;EACb,KAAK,OAAO;EACZ,KAAK,QAAQ,KAAK,KAAK,MAAM,QAAQ;EACrC,KAAK,OAAO;CACd;CAEA,SAAiB;EACf,MAAM,EAAE,OAAO,SAAS;EACxB,MAAM,OAAO,KAAK;EAClB,MAAM,SAAS,MAAM,OAAO;EAC5B,MAAM,SAAS,MAAM,OAAO;EAC5B,MAAM,MAAM,MAAM,WAAW,KAAK,SAAS,MAAM,IAAI,KAAK,KAAK,MAAM;EACrE,KAAK,QAAS,MAAM,SAAS,QAAmB;EAChD,OAAO;CACT;AACF;;AAGA,SAAS,qBACP,KACA,aACA,KACA,OACA,MACQ;CACR,MAAM,uBAAO,IAAI,WAAW,GAAG;CAC/B,MAAM,SAAS,WAAW,MAAM,KAAK,KAAK,OAAO,IAAI;CACrD,IAAI,OAAO,WAAW,GACpB,KAAK,qBAAqB;CAE5B,MAAM,QAAQ,cAAc,MAAM,OAAO,gBAAgB,OAAO,QAAQ;CACxE,MAAM,OAAO,IAAI,UAAU;CAC3B,IAAI,CAAC,KAAK,KAAK,KAAK,QAAQ,OAAO,MAAM,OAAO,OAAO,IAAI,GACzD,KAAK,qBAAqB;CAE5B,MAAM,SAAS,IAAI,SAAS,OAAO,IAAI;CACvC,MAAM,SAAS,IAAI,SAAS,OAAO,IAAI;CACvC,IAAI,KAAK,OAAO,MAAM,cACpB,KAAK,qBAAqB;CAE5B,IAAI,KAAK;CACT,MAAM,OAAO;CACb,MAAM,SAAS,OAAO;CACtB,SAAS;EAEP,IAAI,EADW,KAAK,OACT,MAAM,kBAAkB,KAAK,SACtC;EAEF,IAAI,MAAM,OAAO,OAAO;EACxB,IAAI,KAAK,KAAK,OAAO,OAAO;EAC5B,IAAI,KAAK,KAAK,OAAO,OAAO;EAC5B,IAAI,KAAK,KAAK,OAAO,OAAO;EAC5B,MAAM;CACR;CACA,SAAS;EACP,IAAI,KAAK,OAAO,GACd,KAAK,qBAAqB;EAE5B,IAAI,MAAM,OAAO,OAAO;EACxB,MAAM;EACN,IAAI,KAAK,OAAO,MAAM,cAAc;GAClC,IAAI,MAAM,OAAO,OAAO;GACxB,MAAM;GACN;EACF;EACA,IAAI,KAAK,OAAO,GACd,KAAK,qBAAqB;EAE5B,IAAI,MAAM,OAAO,OAAO;EACxB,MAAM;EACN,IAAI,KAAK,OAAO,MAAM,cAAc;GAClC,IAAI,MAAM,OAAO,OAAO;GACxB,MAAM;GACN;EACF;CACF;CACA,OAAO;AACT;;AASA,SAAS,UACP,SACA,WACA,KACA,OACA,MACU;CACV,IAAI,CAAC,MACH,KAAK,qBAAqB;CAE5B,IAAI,QAAQ,OAAO,KAAK,KAAK;CAC7B,IAAI;CACJ,IAAI,SAAS,KAAK;EAChB,QAAQ,QAAQ;EAChB,QAAS,QAAQ,KAAM;EACvB,IAAI,QAAQ,IAAI,MACd,KAAK,qBAAqB;EAE5B,IAAI,SAAS,KACX,KAAK,qBAAqB;EAE5B,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;GAC7C,MAAM,OAAO,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC;GAC9C,QAAQ,SAAS,QAAQ;GACzB,QAAQ,QAAQ,KAAK,OAAO;EAC9B;CACF,OAAO;EACL,IAAI,QAAQ,IAAI,MACd,KAAK,qBAAqB;EAE5B,QAAQ,qBAAqB,SAAS,KAAK,KAAK,QAAQ,GAAG,KAAK;CAClE;CACA,UAAU,KAAK,GAAG,GAAG,EAAoB;CACzC,IAAI,cAAc;CAClB,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;EAC7C,MAAM,SAAS,QAAQ;EACvB,IAAI,SAAS,kBACX,KAAK,qBAAqB;EAE5B,UAAU,UAAW,UAAU,UAAqB;EACpD,eAAgB,KAAK,UAAW;CAClC;CACA,IAAI,gBAAgB,GAClB,KAAK,qBAAqB;CAE5B,MAAM,WAAW,UAAU,WAAW,IAAI;CAC1C,IAAI,WAAW,kBACb,KAAK,qBAAqB;CAE5B,MAAM,QAAQ,KAAK,YAAY;CAC/B,MAAM,QAAQ,KAAK,UAAU,IAAI;CACjC,MAAM,aAAa,UAAU,IAAI,IAAI;CACrC,IAAI,UAAU,MACZ,KAAK,qBAAqB;CAE5B,QAAQ,SAAS;CACjB,UAAU,cAAe,UAAU,cAAyB;CAC5D,MAAM,QAAQ,UAAU;CACxB,IAAI,QAAQ,KAAK,QAAQ,GACvB,KAAK,qBAAqB;CAE5B,OAAO;EAAE,WAAW,QAAQ;EAAG,MAAM,QAAQ;EAAG;CAAS;AAC3D;AAKA,MAAM,oBAAoB;AAE1B,IAAM,WAAN,MAAe;CACb,YAAY;CACZ,WAAW;;CAEX,qBAAc,IAAI,YAAY,IAAsB;;CAEpD,qBAAc,IAAI,YAAY,IAAsB;AACtD;;AAGA,SAAS,aACP,OACA,KACA,OACA,MACQ;CACR,MAAM,0BAAU,IAAI,WAAW,GAAG;CAClC,MAAM,0BAAU,IAAI,YAAY,EAAoB;CACpD,MAAM,QAAQ,UAAU,SAAS,SAAS,KAAK,OAAO,IAAI;CAC1D,MAAM,EAAE,cAAc;CACtB,IAAI,EAAE,aAAa;CACnB,MAAM,iBAAiB,KAAK,IAC1B,IACA,yBACF;CAEA,IAAI,WAAW,gBAAgB;EAC7B,MAAM,QAAQ,iBAAiB;EAC/B,KAAK,IAAI,SAAS,GAAG,SAAS,WAAW,UAAU,GAAG;GACpD,MAAM,SAAS,QAAQ;GACvB,QAAQ,UAAU,WAAW,IAAI,IAAI,SAAS;EAChD;EACA,KAAK,IAAI,SAAS,gBAAgB,SAAS,OAAO,UAAU,GAC1D,QAAQ,UAAU,QAAQ,SAAS;EAErC,KAAK,IAAI,SAAS,OAAO,SAAS,GAAG,UAAU,GAC7C,QAAQ,UAAU;EAEpB,WAAW;CACb;CACA,IAAI,WAAW,IACb,KAAK,qBAAqB;CAE5B,MAAM,YAAY;CAClB,MAAM,WAAW;CACjB,MAAM,4BAAY,IAAI,YAAY,EAAoB;CACtD,IAAI,gBAAgB;CACpB,KAAK,IAAI,SAAS,GAAG,SAAS,WAAW,GAAG,UAAU,GAAG;EACvD,UAAU,UAAU;EACpB,iBAAiB,QAAQ;CAC3B;CACA,MAAM,0BAAU,IAAI,WAAW,GAAG;CAClC,KAAK,IAAI,SAAS,GAAG,SAAS,WAAW,UAAU,GAAG;EACpD,MAAM,SAAS,QAAQ;EACvB,MAAM,WAAW,UAAU;EAC3B,UAAU,UAAU,WAAW;EAC/B,QAAQ,YAAY;CACtB;CACA,IAAI,SAAS,QAAQ;CACrB,IAAI,SAAS;CACb,KAAK,IAAI,SAAS,GAAG,SAAS,WAAW,GAAG,UAAU,GAAG;EACvD,MAAM,cAAc,QAAQ;EAC5B,MAAM,SAAU,KAAK,UAAW;EAChC,MAAM,SAAS,WAAW,IAAI;EAC9B,KAAK,IAAI,QAAQ,GAAG,QAAQ,aAAa,SAAS,GAAG;GACnD,MAAM,QAAU,QAAQ,SAAS,UAAqB,IAAK;GAC3D,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,MAAM;GAC5C,UAAU;EACZ;EACA,UAAU;CACZ;CACA,OAAO,MAAM;AACf;AAEA,SAAS,OACP,QACA,QACA,SACA,OACQ;CAER,QADiB,UAAU,IAAI,SAAS,WAAW,UAAU,OACzC,UAAU,MAAM,QAAQ,KAAK,OAAQ;AAC3D;;AAGA,SAAS,gBACP,IACA,MACA,QACA,OACA,KACA,QACA,UACA,SACA,OACM;CACN,MAAM,SAAS,MAAO,WAAW,SAAU;CAC3C,IAAI,WAAW;CACf,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,SAAS,GAAG;EACjD,MAAM,QAAQ,OAAO,OAAO,QAAkB,QAAQ,SAAS,KAAK;EACpE,GAAG,KAAK,OAAO,UAAU,WAAW,MAAM;EAC1C,YAAY;CACd;AACF;;AAGA,SAAS,aACP,IACA,MACA,WACA,cACA,SACA,WACA,YACA,QACA,WACA,gBACA,SACM;CACN,IAAI,YAAY,GAAG;EACjB,MAAM,SAAS,MAAO,YAAY,eAAgB;EAClD,MAAM,QAAQ,OAAO,SAAS,cAAc,GAAG,CAAC;EAChD,MAAM,WAAW,QAAQ;EACzB,IAAI,WAAW,GACb,GAAG,KAAK,OAAO,MAAM,OAAO,CAAC;OACxB,IAAI,WAAW,GACpB,GAAG,KAAK,OAAO,MAAM,OAAO,CAAC;OAE7B,KAAK,IAAI,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAC7C,GAAG,KAAK,OAAO,OAAO,OAAO,OAAO,QAAQ,CAAC;CAGnD;CACA,KAAK,IAAI,SAAS,WAAW,SAAS,YAAY,UAAU,GAAG;EAC7D,MAAM,QAAQ,UAAU;EACxB,MAAM,MAAM,UAAU,SAAS;EAC/B,MAAM,SAAS,iBAAiB;EAChC,gBACE,IACA,OAAQ,QAAQ,SAChB,QACA,OACA,KACA,SAAS,cACT,WACA,SACA,CACF;CACF;AACF;;AAGA,SAAS,aACP,OACA,KACA,OACA,MACQ;CACR,IAAI,cAAc;CAClB,MAAM,4BAAY,IAAI,YAAY,EAAoB;CACtD,MAAM,6BAAa,IAAI,YAAY,EAAoB;CACvD,MAAM,0BAAU,IAAI,WAAW,GAAG;CAClC,MAAM,QAAQ,UAAU,SAAS,WAAW,KAAK,OAAO,IAAI;CAC5D,MAAM,EAAE,UAAU,cAAc;CAChC,IAAI,WAAW,aACb,KAAK,qBAAqB;CAE5B,IACE,YAAY,6BACZ,cAAc,2BAEd,cAAc;CAEhB,IAAI,OAAO;CACX,OAAO,UAAU,UAAU,GACzB,QAAQ;CAGV,IAAI,gBAAgB;CACpB,KAAK,IAAI,SAAS,GAAG,SAAS,OAAO,GAAG,UAAU,GAAG;EACnD,WAAW,SAAS,KAAK;EACzB,iBAAiB,UAAU;CAC7B;CACA,WAAW,KAAK;CAChB,WAAW,OAAO,KAAK;CACvB,MAAM,yBAAS,IAAI,WAAW,GAAG;CACjC,KAAK,IAAI,SAAS,GAAG,SAAS,WAAW,UAAU,GAAG;EACpD,MAAM,SAAS,QAAQ;EACvB,MAAM,WAAW,WAAW,SAAS;EACrC,WAAW,SAAS,KAAK,WAAW;EACpC,OAAO,YAAY;CACrB;CACA,WAAW,KAAK;CAChB,MAAM,UAAyB,CAAC;CAChC,KAAK,IAAI,QAAQ,GAAG,QAAQ,kBAAkB,SAAS,GACrD,QAAQ,qBAAK,IAAI,YAAY,EAAoB,CAAC;CAEpD,MAAM,WAAW,QAAQ;CACzB,MAAM,UAAU,cAAc,WAAW;CACzC,IAAI,cAAc;CAClB,KAAK,IAAI,SAAS,GAAG,SAAS,OAAO,GAAG,UAAU,GAAG;EACnD,SAAS,UAAU;EACnB,eAAgB,UAAU,UAAqB,MAAM,SAAS;CAChE;CACA,MAAM,UAAU,WAAW,IAAI;CAC/B,KACE,IAAI,WAAW,SACf,WAAW,cAAc,UAAU,GACnC,YAAY,GACZ;EACA,MAAM,SAAS,QAAQ;EACvB,KAAK,IAAI,SAAS,GAAG,SAAS,OAAO,GAAG,UAAU,GAChD,OAAO,UAAW,SAAS,YAAuB;CAEtD;CAEA,MAAM,iBAAiB,WAAW;CAClC,MAAM,WAAW,iBAAiB;CAClC,MAAM,cAAc,iBAAiB;CACrC,MAAM,OAAO,OAAO;CACpB,KAAK,IAAI,SAAS,GAAG,SAAS,MAAM,UAAU,GAAG;EAC/C,MAAM,QAAQ,WAAW;EACzB,MAAM,MAAM,WAAW,SAAS;EAChC,MAAM,SAAS,iBAAiB;EAChC,IAAI,cAAc,UAAU,aAAa;GACvC,IAAI,WAAW,SAAS;GACxB,MAAM,SAAS,MAAO,cAAc,SAAU;GAC9C,MAAM,YAAY,KAAK,IAAI,SAAS,UAAU,CAAC;GAC/C,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,SAAS,GAAG;IACjD,aACE,MAAM,IACN,UACA,aACA,QACA,QAAQ,SACR,WACA,MACA,QACA,YACA,gBACA,OAAO,MACT;IACA,YAAY;GACd;EACF,OACE,gBACE,MAAM,IACN,SAAS,SACT,QACA,OACA,KACA,QACA,aACA,GACA,CACF;CAEJ;CACA,MAAM,WAAW;CACjB,MAAM,YAAY;CAClB,OAAO,MAAM;AACf;AAKA,SAAS,eACP,MACA,IACA,OACQ;CACR,MAAM,QAAQ,GAAG,KAAK,SAAS,KAAK;CACpC,KAAK,YAAY,QAAQ;CACzB,OAAO,UAAU;AACnB;;AAGA,SAAS,eACP,KACA,OACA,MACA,MACA,IACA,OACM;CACN,IAAI,IAAI;CACR,IAAI,OAAO,IAAI,GACb,SAAS;EAEP,IAAI,EADW,KAAK,OACT,MAAM,kBAAkB,IAAI,OAAO,IAC5C;EAEF,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;GACzC,IAAI,KAAK,eAAe,MAAM,IAAI,KAAK;GACvC,KAAK;EACP;CACF;MAEA,KAAK,OAAO;CAEd,OAAO,IAAI,MAAM;EACf,IAAI,KAAK,eAAe,MAAM,IAAI,KAAK;EACvC,KAAK;CACP;AACF;AAEA,SAAS,eACP,KACA,GACA,MACA,IACA,OACQ;CACR,MAAM,QAAQ,GAAG,KAAK,SAAS,KAAK;CACpC,IAAI,KAAK,QAAQ;CACjB,IAAI,IAAI,KAAM,UAAU,IAAK;CAC7B,KAAK,YAAa,UAAU,KAAM;CAClC,OAAO,UAAU;AACnB;;AAGA,SAAS,eACP,KACA,OACA,MACA,MACA,IACA,OACQ;CACR,IAAI,IAAI;CACR,IAAI,OAAO,KAAK,GAAG;EACjB,MAAM,WAAW,SAAS,KAAK,IAAI;EACnC,MAAM,QAAQ,SAAS,KAAK,OAAO,IAAI,OAAO;EAC9C,SAAS;GAEP,IAAI,EADW,KAAK,OACT,MAAM,kBAAkB,IAAI,QACrC;GAEF,KAAK,IAAI,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAC7C,KAAK,eAAe,KAAK,GAAG,MAAM,IAAI,KAAK;EAE/C;CACF,OACE,KAAK,OAAO;CAEd,IAAI,OAAO,KAAK,GAAG;EACjB,SAAS;GAEP,IAAI,EADW,KAAK,OACT,MAAM,kBAAkB,KAAK,OAAO,IAC7C;GAEF,KAAK,eAAe,KAAK,GAAG,MAAM,IAAI,KAAK;EAC7C;EACA,OAAO,KAAK,OAAO,GACjB,KAAK,eAAe,KAAK,GAAG,MAAM,IAAI,KAAK;CAE/C;CACA,IAAI,IAAI,MAAM;EAEZ,MAAM,QAAQ,GAAG,KAAK,SAAS,KAAK;EACpC,IAAI,KAAK,QAAQ;EACjB,MAAM,SAAU,UAAU,KAAM;EAChC,IAAI,UAAU,OAAO,GACnB,KAAK,YAAY;OACZ,IAAI,KAAK,WAAW,IAAI;GAC7B,KAAK,YAAY;GACjB,IAAI,KAAK,WAAW,IAClB,KAAK,WAAW;EAEpB;EACA,KAAK;CACP;CACA,OAAO;AACT;;AAGA,SAAS,aACP,OACA,KACA,SACA,KACA,OACA,MACM;CACN,MAAM,OAAO,IAAI,UAAU;CAC3B,IAAI,CAAC,KAAK,KAAK,KAAK,OAAO,IAAI,GAC7B,KAAK,qBAAqB;CAE5B,IAAI,MAAM,cAAc,GACtB,eAAe,KAAK,GAAG,MAAM,SAAS,MAAM,IAAI,MAAM,QAAQ;MAE9D,eAAe,KAAK,GAAG,MAAM,SAAS,MAAM,IAAI,MAAM,QAAQ;CAEhE,IAAI,CAAC,KAAK,MAAM,GACd,KAAK,qBAAqB;AAE9B;AAQA,SAAS,cAAc,KAAiB,OAAe,MAAuB;CAC5E,MAAM,UAAU,KAAK,KAAK,KAAK;CAC/B,MAAM,UAAU,KAAK,KAAK,QAAQ,CAAC;CACnC,MAAM,UAAU,KAAK,KAAK,QAAQ,CAAC;CACnC,MAAM,UAAU,QAAQ,UAAU,UAAU,UAAU;CACtD,MAAM,SAAS,QAAQ;CACvB,OAAO;EACL,SAAS;GAAC;GAAS;GAAS;GAAS;EAAO;EAC5C,QAAQ;GACN;GACA,SAAS;GACT,SAAS,UAAU;GACnB,SAAS,UAAU,UAAU;EAC/B;CACF;AACF;;AAGA,SAAS,qBACP,OACA,KACA,SACA,KACA,OACA,MACM;CACN,IAAI,OAAO,MAAM,UAAU,GACzB,KAAK,qBAAqB;CAE5B,MAAM,EAAE,QAAQ,YAAY,cAAc,KAAK,OAAO,IAAI;CAC1D,MAAM,cAAc,KAAK,OAAO,UAAU,KAAK,CAAC;CAChD,MAAM,WAAW;EAAC;EAAG;EAAa,IAAI;EAAa,IAAI;CAAW;CAClE,IAAK,QAAQ,KAAgB,KAAM,QAAQ,KAAgB,MACzD,KAAK,qBAAqB;CAE5B,IAAK,SAAS,KAAgB,SAC5B,KAAK,qBAAqB;CAE5B,MAAM,UAAU;EAAC;EAAG;EAAG;EAAG;CAAC,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC;CACtD,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,IACE,CAAE,QAAQ,MAAM,CAAe,KAC7B,KACA,OAAO,QACP,QAAQ,MACV,GAEA,KAAK,qBAAqB;CAG9B,MAAM,KAAK,MAAM;CACjB,MAAM,QAAQ,MAAM;CACpB,MAAM,KAAK,CAAC,GAAG,QAAQ;CACvB,MAAM,SAAS,UAAU;CACzB,IAAI,UAAW,GAAG,MAAiB,GAAG;EACpC,IAAI,YAAY;EAChB,OAAO,aAAc,GAAG,KAAgB,QAAQ;GAC9C,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;IACzC,IAAI,GAAG,UAAoB,eACzB,QAAQ,QACR,IACA,KACF;IACA,GAAG,SAAU,GAAG,SAAoB;GACtC;GAEF,IAAI,SAAS;GACb,KAAK,MAAM,UAAU,SACnB,SAAS,OAAO,WAAW,MAAM,kBAAkB;GAErD,YAAY;EACd;CACF;CACA,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,IAAK,GAAG,SAAqB,SAAS,QAAQ,IAC5C,KAAK,qBAAqB;CAG9B,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;EACzC,MAAM,MAAM,UAAU,IAAI,UAAW,SAAS,QAAQ;EACtD,eACE,KACA,GAAG,QACH,QAAQ,QACR,KACA,IACA,KACF;CACF;CACA,IAAI,CAAC,QAAQ,OAAM,WAAU,OAAO,MAAM,CAAC,GACzC,KAAK,qBAAqB;AAE9B;;AAGA,SAAS,qBACP,OACA,KACA,SACA,KACA,OACA,MACM;CACN,IAAI,OAAO,MAAM,UAAU,GACzB,KAAK,qBAAqB;CAE5B,MAAM,EAAE,QAAQ,YAAY,cAAc,KAAK,OAAO,IAAI;CAC1D,MAAM,cAAc,KAAK,OAAO,UAAU,KAAK,CAAC;CAChD,MAAM,WAAW;EAAC;EAAG;EAAa,IAAI;EAAa,IAAI;CAAW;CAClE,IAAK,QAAQ,KAAgB,KAAM,QAAQ,KAAgB,MACzD,KAAK,qBAAqB;CAE5B,IAAK,SAAS,KAAgB,SAC5B,KAAK,qBAAqB;CAE5B,MAAM,UAAU;EAAC;EAAG;EAAG;EAAG;CAAC,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC;CACtD,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,IACE,CAAE,QAAQ,MAAM,CAAe,KAC7B,KACA,OAAO,QACP,QAAQ,MACV,GAEA,KAAK,qBAAqB;CAG9B,MAAM,KAAK,MAAM;CACjB,MAAM,QAAQ,MAAM;CACpB,MAAM,KAAK,CAAC,GAAG,QAAQ;CACvB,MAAM,SAAS,UAAU;CACzB,MAAM,UAAU,UAAwB;EACtC,GAAG,SACA,GAAG,SACJ,eACE,KACA,GAAG,QACH,QAAQ,QACR,IACA,KACF;CACJ;CACA,IAAI,UAAW,GAAG,MAAiB,GAAG;EACpC,IAAI,YAAY;EAChB,OAAO,aAAc,GAAG,KAAgB,QAAQ;GAC9C,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,OAAO,CAAC;GAEV,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,OAAO,CAAC;GAEV,IAAI,SAAU,QAAQ,EAAE,CAAe,WAAW,MAAM;GACxD,SACG,QAAQ,EAAE,CAAe,WAAW,MAAM,kBAAkB;GAC/D,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,OAAO,CAAC;GAEV,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,OAAO,CAAC;GAEV,SACG,QAAQ,EAAE,CAAe,WAAW,MAAM,kBAAkB;GAC/D,SACG,QAAQ,EAAE,CAAe,WAAW,MAAM,kBAAkB;GAC/D,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,OAAO,KAAK;GAGhB,IAAI,OAAO;GACX,KAAK,MAAM,UAAU,SACnB,OAAO,OAAO,WAAW,MAAM,kBAAkB;GAInD,YAAY;EACd;CACF;CACA,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GACtC,IAAK,GAAG,SAAqB,SAAS,QAAQ,IAC5C,KAAK,qBAAqB;CAG9B,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;EACzC,MAAM,MAAM,UAAU,IAAI,UAAW,SAAS,QAAQ;EACtD,eACE,KACA,GAAG,QACH,QAAQ,QACR,KACA,IACA,KACF;CACF;CACA,IAAI,CAAC,QAAQ,OAAM,WAAU,OAAO,MAAM,CAAC,GACzC,KAAK,qBAAqB;AAE9B;;;;;AAiBA,SAAS,aACP,OACA,SACA,KACA,OACA,MACiB;CACjB,IAAI,YAAY,GACd,OAAO;CAET,IAAI,OAAO,IACT,KAAK,qBAAqB;CAE5B,IAAI,MAAM,aAAa,2BACrB,OAAO;CAET,MAAM,UAAU,KAAK,KAAK,KAAK;CAC/B,MAAM,UAAU,KAAK,KAAK,QAAQ,CAAC;CACnC,MAAM,UAAU,KAAK,KAAK,QAAQ,CAAC;CACnC,MAAM,UAAU,QAAQ,UAAU,UAAU,UAAU;CACtD,MAAM,QAAQ,QAAQ;CACtB,MAAM,OAAO;EACX;EACA,QAAQ;EACR,QAAQ,UAAU;EAClB,QAAQ,UAAU,UAAU;CAC9B;CACA,IACE,UAAU,KACV,UAAU,KACV,UAAU,KACT,WAAW,KAAK,UAAU,GAE3B,OAAO;CAET,IAAI,UAAU,KAAK,UAAU,MAC3B,KAAK,qBAAqB;CAE5B,MAAM,KAAK;EACR,KAAK,KAAgB;EACrB,KAAK,KAAgB;EACrB,KAAK,KAAgB;EACtB,QAAQ,OAAO;CACjB;CACA,MAAM,UAAU,KAAK,OAAO,UAAU,KAAK,CAAC;CAC5C,MAAM,KAAK;EAAC;EAAG;EAAS,IAAI;EAAS,IAAI;CAAO;CAChD,IAAK,GAAG,MAAiB,SACvB,OAAO;CAET,MAAM,SAAmB,CAAC;CAC1B,MAAM,SAAmB,CAAC;CAC1B,KAAK,MAAM,MAAM,IAAI;EAEnB,MAAM,WAAW,OAAO,KAAK,KAAK,CAAC;EACnC,MAAM,WAAW,WAAW,IAAI,UAAU,QAAQ,IAAI;EACtD,MAAM,CAAC,IAAI,MAAM,OAAO,KAAK,EAAE;EAC/B,MAAM,QAAa,CAAC,KAAK,KAAK,OAAO,CAAC;EACtC,OAAO,KAAK,gBAAgB,MAAM,IAAI,MAAM,IAAI,QAAQ,CAAC;EACzD,OAAO,KAAK,aAAa,IAAI,MAAM,KAAM,MAAM,MAAM,aAAc,CAAC;CACtE;CACA,OAAO;EAAE;EAAQ;EAAQ,SAAS;EAAO;EAAM;EAAI,MAAM;EAAS;CAAG;AACvE;AAEA,SAAS,UAAU,MAAgB,QAAgB,OAAqB;CACtE,MAAM,KAAK,KAAK,OAAO;CACvB,MAAM,KAAK,KAAK,OAAO;CACvB,KAAK,OAAO,UAAU,gBAAgB,IAAI,IAAI,KAAK;CACnD,KAAK,OAAO,UACV,SAAS,KAAK,IAAI,UAAU,IAAI,KAAM,MAAM,UAAW;AAC3D;;AAGA,SAAS,iBACP,MACA,KACA,QACM;CACN,MAAM,MAAM,MACV,KAAK,OAAO,SACZ,KAAK,OAAO,OACd;CACA,MAAM,SAAS,MAAM;CACrB,MAAM,UAAU,OAAO;CACvB,MAAM,KAAM,KAAK,GAAG,UAAqB;CACzC,KAAK,GAAG,UAAU;CAClB,MAAM,CAAC,IAAI,MAAM,OAAO,KAAK,EAAE;CAC/B,KAAK,OAAO,UAAU;CACtB,KAAK,OAAO,WAAW,KAAK,OAAO;CACnC,UAAU,MAAM,QAAQ,MAAM;AAChC;;AAGA,SAAS,WACP,MACA,KACA,KACA,IACM;CACN,SAAS;EACP,MAAM,SAAS,KAAK,OAAO,KAAK,OAAQ,KAAK,GAAG,MAAiB,CAAC;EAClE,MAAM,SAAS,KAAK,OAAQ,KAAK,GAAG,KAAgB,KAAK,WAAW,CAAC;EACrE,MAAM,QAAQ,KAAK,IAAI,QAAQ,MAAM;EACrC,MAAM,SAAU,KAAK,GAAG,KAAgB,QAAQ;EAChD,IAAI,KAAK,GAAG,OAAO,QACjB;EAEF,KAAK,IAAI,SAAS,GAAG,SAAS,GAAG,UAAU,GACzC,IAAK,KAAK,GAAG,UAAsB,KAAK,GAAG,SAAS,IAClD;EAGJ,GAAG;GACD,KAAK,IAAI,SAAS,GAAG,SAAS,GAAG,UAAU,GACzC,KAAK,IAAI,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG;IAC5C,MAAM,QAAQ,GAAI,KAAK,OAAO,YAAuB;IACrD,UAAU,MAAM,QAAQ,QAAQ,EAAI;IACpC,IAAK,KAAK,GAAG,UAAqB,UAAW,UAAU,IAAK;GAC9D;GAEF,KAAK,IAAI,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG;IAC5C,KAAK,GAAG,UAAW,KAAK,GAAG,UAAqB;IAChD,iBAAiB,MAAM,KAAK,MAAM;GACpC;EACF,SAAU,KAAK,GAAG,KAAgB;CACpC;AACF;;AAGA,SAAS,WACP,MACA,KACA,KACA,IACM;CACN,MAAM,OAAO;EACX,KAAK,GAAG;EACR,KAAK,GAAG;EACR,KAAK,GAAG;EACR,KAAK;CACP;CACA,MAAM,UAAU,WAAyB;EACvC,MAAM,QAAQ,GAAI,KAAK,OAAO,YAAuB;EACrD,MAAM,KAAK,KAAK,GAAG;EACnB,IAAI,MAAM,QAAQ;EAClB,IAAI,KAAK,KAAM,UAAU,IAAK;EAC9B,UAAU,MAAM,QAAS,UAAU,KAAM,EAAI;EAC7C,KAAK,GAAG,UAAU,MAAM,UAAU;CACpC;CACA,SAAS;EACP,IAAI,QAAQ,KAAK,OAAQ,KAAK,GAAG,KAAgB,KAAK,WAAW,CAAC;EAClE,KAAK,IAAI,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG;GAC5C,MAAM,OAAQ,KAAK,UAAsB,KAAK,GAAG;GAEjD,MAAM,SACJ,OAAO,IAAI,OAAO,oBAAoB,KAAK,MAAM,OAAO,EAAE;GAC5D,QAAQ,KAAK,IAAI,OAAO,MAAM;EAChC;EACA,MAAM,SAAU,KAAK,GAAG,KAAgB,QAAQ;EAChD,IAAI,KAAK,GAAG,OAAO,QACjB;EAEF,KAAK,IAAI,SAAS,GAAG,SAAS,GAAG,UAAU,GACzC,IAAK,KAAK,GAAG,UAAsB,KAAK,GAAG,SAAS,IAClD;EAGJ,GAAG;GACD,KAAK,IAAI,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG;IAC5C,OAAO,CAAC;IACR,OAAO,CAAC;IACR,OAAO,CAAC;GACV;GACA,OAAO,CAAC;GACR,KAAK,IAAI,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG;IAC5C,OAAO,CAAC;IACR,iBAAiB,MAAM,KAAK,MAAM;GACpC;EACF,SAAU,KAAK,GAAG,KAAgB;CACpC;AACF;;;;;;AAOA,SAAS,iBACP,OACA,KACA,SACA,KACA,OACA,MACS;CACT,MAAM,OAAO,aAAa,OAAO,SAAS,KAAK,OAAO,IAAI;CAC1D,IAAI,SAAS,MACX,OAAO;CAET,IAAI,MAAM,cAAc,GACtB,WAAW,MAAM,KAAK,KAAK,MAAM,EAAE;MAEnC,WAAW,MAAM,KAAK,KAAK,MAAM,EAAE;CAErC,MAAM,cAAc,KAAK,OAAO,UAAU,KAAK,CAAC;CAChD,IAAI,aAAa;CACjB,KAAK,IAAI,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG;EAC5C,aACE,eAAe,UAAU,aAAa,aAAa,cAAc;EAEnE,MAAM,KAAK,KAAK,GAAG;EACnB,MAAM,KAAK,KAAK,GAAG;EACnB,IAAI,KAAK,YACP,KAAK,qBAAqB;EAE5B,IAAI,KAAM,KAAK,KAAK,UAAqB,GACvC,KAAK,qBAAqB;EAE5B,MAAM,OAAO,IAAI,UAAU;EAC3B,KAAK,MAAM;EACX,MAAM,CAAC,IAAI,MAAM,OAAO,KAAK,EAAE;EAC/B,KAAK,KAAK;EACV,KAAK,KAAK;EACV,KAAK,WAAW,MACd,KAAK,OAAO,SACZ,KAAK,OAAO,OACd;EACA,KAAK,QAAQ,KAAK;EAClB,KAAK,WAAW,KAAK,UAAU;EAC/B,KAAK,MAAM;EACX,IAAI,MAAM,cAAc,GACtB,eACE,KACA,IACA,MACA,YACA,MAAM,IACN,yBACF;OACK,IACL,eACE,KACA,IACA,MACA,YACA,MAAM,IACN,yBACF,MAAM,YAEN,KAAK,qBAAqB;CAE9B;CACA,OAAO;AACT;;AAGA,SAAS,aACP,OACA,KACA,SACA,KACA,OACA,MACM;CACN,IAAI,iBAAiB,OAAO,KAAK,SAAS,KAAK,OAAO,IAAI,GACxD;CAEF,IAAI,MAAM,cAAc,GACtB,qBAAqB,OAAO,KAAK,SAAS,KAAK,OAAO,IAAI;MAE1D,qBAAqB,OAAO,KAAK,SAAS,KAAK,OAAO,IAAI;AAE9D;AAEA,MAAM,YAAoE;CACxE;EAAC;EAAG;EAAG;EAAG;CAAC;CACX;EAAC;EAAG;EAAG;EAAG;CAAC;CACX;EAAC;EAAK;EAAK;EAAK;CAAG;CACnB;EAAC;EAAK;EAAK;EAAK;CAAG;CACnB;EAAC;EAAK;EAAK;EAAK;CAAG;CACnB;EAAC;EAAK;EAAK;EAAK;CAAG;CACnB;EAAC;EAAK;EAAK;EAAK;CAAG;CACnB;EAAC;EAAK;EAAK;EAAK;CAAG;CACnB;EAAC;EAAK;EAAK;EAAM;CAAG;CACpB;EAAC;EAAK;EAAK;EAAM;CAAG;CACpB;EAAC;EAAK;EAAK;EAAM;CAAG;CACpB;EAAC;EAAK;EAAK;EAAM;CAAG;CACpB;EAAC;EAAK;EAAK;EAAM;CAAG;CACpB;EAAC;EAAM;EAAK;EAAM;CAAG;CACrB;EAAC;EAAM;EAAK;EAAM;CAAG;CACrB;EAAC;EAAM;EAAK;EAAM;CAAG;AACvB;;AAGA,SAAS,SAAS,SAAiB,SAA0B;CAC3D,MAAM,IAAI,WAAW,UAAU,KAAK,KAAK,MAAO,UAAU,KAAM,OAAO;CACvE,MAAM,OAAO,KAAK,MAAM,UAAU,GAAG;CACrC,MAAM,MAAM,UAAU;CACtB,MAAM,QAAS,IAAI,KAAK,IAAI,KAAK,SAAU;CAC3C,IAAI,QAAS,IAAI,KAAK,IAAI,KAAK,SAAU;CACzC,QAAS,SAAS,UAAU,OAAQ;CACpC,OAAO,QAAQ;AACjB;AAKA,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAC1E;CAAI;CAAI;CAAI;CAAI;CAAM;CAAQ;CAAQ;CAAQ;CAAQ;CAAS;CAC/D;CAAS;CAAS;AACpB;AACA,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAC3E;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;AACnC;AACA,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CACzE;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CACxE;CAAI;CAAI;CAAI;CAAM;CAAQ;CAAQ;CAAQ;CAAQ;CAAS;CAAS;CACpE;CAAS;AACX;AACA,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAC3E;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CACxE;CAAI;CAAI;AACV;AACA,MAAM,UAAU;CACd;CAAG;CAAG;CAAG;CAAG;CAAK;CAAM;CAAM;CAAM;CAAM;CAAQ;CAAQ;CAAQ;CACjE;CAAS;CAAS;CAAS;CAAS;CAAW;CAAW;CAC1D;CAAW;CAAY;CAAY;CAAY;CAAY;CAC3D;CAAc;CAAc;CAAc;CAAe;CACzD;AACF;AACA,MAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,UAAU,KAAK;AAC9D,MAAM,kBAAkB;CACtB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAC3E;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;AAChC;AACA,MAAM,kBAAkB;CACtB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAC3E;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CACxE;CAAI;CAAI;AACV;AACA,MAAM,kBAAkB;CACtB;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CACxE;CAAI;CAAI;CAAI;AACd;;AAYA,SAAS,cACP,MACA,gBACA,WACA,kBACA,UACU;CACV,MAAM,SAAS,cAAc,MAAM,gBAAgB,QAAQ;CAC3D,MAAM,OAAO,KAAK;CAClB,MAAM,QAAkB;EACtB,WAAW,IAAI,YAAY,IAAI;EAC/B,kBAAkB,IAAI,WAAW,IAAI;EACrC,QAAQ,OAAO;EACf,WAAW,OAAO;EAClB;CACF;CACA,KAAK,IAAI,OAAO,GAAG,OAAO,MAAM,QAAQ,GAAG;EACzC,MAAM,SAAS,OAAO,QAAQ;EAC9B,MAAM,UAAU,QAAQ,UAAU;EAClC,MAAM,iBAAiB,QAAQ,iBAAiB;CAClD;CACA,OAAO;AACT;;AAGA,SAAS,YAAY,WAAmB,kBAAoC;CAC1E,OAAO;EACL,WAAW,YAAY,GAAG,SAAS;EACnC,kBAAkB,WAAW,GAAG,gBAAgB;EAChD,QAAQ,WAAW,GAAG,CAAC;EACvB,WAAW,YAAY,GAAG,CAAC;EAC3B,UAAU;CACZ;AACF;AAEA,SAAS,gBACP,MACA,WACA,kBACA,UACU;CACV,OAAO,cACL,WAAW,KAAK,IAAI,GACpB,KAAK,SAAS,GACd,WACA,kBACA,QACF;AACF;AAEA,MAAM,mBAAmB,gBAAgB,iBAAiB,SAAS,SAAS,CAAC;AAC7E,MAAM,mBAAmB,gBAAgB,iBAAiB,SAAS,SAAS,CAAC;AAC7E,MAAM,mBAAmB,gBAAgB,iBAAiB,SAAS,SAAS,CAAC;AAE7E,IAAM,WAAN,MAAe;CACb,QAAQ;CAER;CAEA,YAAY,OAAiB,MAAiB;EAC5C,KAAK,QAAQ;EACb,KAAK,QAAQ,KAAK,KAAK,MAAM,QAAQ;EACrC,KAAK,OAAO;CACd;AACF;;AAUA,SAAS,MAAM,OAAe,OAAwB;CACpD,IAAI,QAAQ,KAAK,QAAQ,GACvB,OAAO,QAAQ;CAEjB,IAAI,QAAQ,KAAK,QAAQ,GACvB,OAAO,QAAQ;CAEjB,OAAO,QAAQ;AACjB;;AAGA,IAAM,SAAN,MAAa;CACX,uBAAmB,IAAI,WAAW,CAAC;CAEnC,OAAO,KAAmB;EACxB,IAAI,MAAM,KAAK,KAAK,QAAQ;GAC1B,MAAM,QAAQ,IAAI,WAChB,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,GAAG,KAAS,CAC/C;GACA,MAAM,IAAI,KAAK,IAAI;GACnB,KAAK,OAAO;EACd;CACF;AACF;AAEA,MAAM,aAAa;AACnB,MAAM,SAAS;AACf,MAAM,QAAQ;AACd,MAAM,UAAU;AAChB,MAAM,YAAY;AAClB,MAAM,UAAU;AAKhB,MAAM,QAAQ;AACd,MAAM,kBAAkB;;AAoBxB,SAAS,gBAAgB,KAAiB,OAAuB;CAC/D,MAAM,MAAM,OAAO,KAAK,QAAQ,yBAAyB,CAAC;CAC1D,MAAM,SAAS,MAAM;CACrB,MAAM,gBAAiB,OAAO,IAAK;CACnC,MAAM,QAAQ,OAAO;CACrB,OACE,0BACC,gBAAgB,IAAI,KACpB,eAAe,UACf,eAAe,UACf,iBAAiB,CAAC,QAAQ,IAAI;AAEnC;AAEA,SAAS,eACP,KACA,OACA,MACmB;CACnB,IAAI,OAAO,wBAAwB;EACjC,IAAI,OAAO,GAAG;GACZ,MAAM,SAAS,KAAK,IAAI,GAAG,IAAI;GAC/B,MAAM,yBAAS,IAAI,WAAW,CAAC;GAC/B,IAAI,SAAS,OAAO,MAAM,CAAC,CAAC,UAAU,GAAG,kBAAkB,IAAI;GAC/D,OAAO,IAAI,IAAI,SAAS,OAAO,QAAQ,MAAM,CAAC;GAC9C,IAAI,KAAK,QAAQ,CAAC,MAAM,kBAAkB;IACxC,IAAI,SAAS,OAAO,MAAM,CAAC,CAAC,UAC1B,GACA,4BACA,IACF;IACA,OAAO,IAAI,IAAI,SAAS,OAAO,QAAQ,MAAM,CAAC;IAC9C,KACG,KAAK,QAAQ,CAAC,IAAI,+BAA+B,MAClD,4BAEA,KAAK,gBAAgB;GAEzB;EACF;EACA,OAAO;GAAE,MAAM;GAAwB,QAAQ;EAAK;CACtD;CACA,MAAM,QAAQ,KAAK,KAAK,KAAK;CAC7B,IAAI,UAAU,kBAAkB;EAC9B,KACG,QAAQ,+BAA+B,MACxC,4BACA;GACA,IAAI,OAAO,qBACT,OAAO;IAAE,MAAM;IAAqB,QAAQ;GAAK;GAEnD,OAAO;IACL,MAAM;IACN,QAAQ;KACN,cAAc;KACd,cAAc;KACd,QAAQ,QAAQ;KAChB,kBAAkB,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;KAC7C,WAAW;KACX,YAAY;KACZ,YAAY;IACd;GACF;EACF;EACA,KAAK,gBAAgB;CACvB;CACA,MAAM,aAAa,gBAAgB,KAAK,KAAK;CAC7C,IAAI,OAAO,YACT,OAAO;EAAE,MAAM;EAAY,QAAQ;CAAK;CAE1C,MAAM,MAAM,OAAO,KAAK,QAAQ,CAAC;CACjC,IAAI,MAAM,QAAQ;CAClB,MAAM,iBAAiB,MAAM;CAC7B,MAAM,gBAAiB,OAAO,IAAK,OAAO;CAC1C,MAAM,iBAAkB,OAAO,IAAK,OAAO;CAC3C,MAAM,QAAQ,OAAO;CACrB,IAAI,aAAa;CACjB,IAAI,SAAS;CACb,IAAI,mBAAmB;CACvB,IAAI,MAAM,GACR,KAAK,4BAA4B;CAEnC,IAAI,CAAC,eAAe;EAClB,MAAM,SAAS,OAAO,KAAK,GAAG;EAC9B,OAAO;EACP,MAAM,aAAa,UAAU,KAAK;EAClC,IAAI,YAAY,eACd,KAAK,+BAA+B;EAEtC,aAAa,MAAM,OAAO,SAAS;EACnC,eAAe,cAAc,MAAM,OAAO,SAAS,CAAC;CACtD;CACA,IAAI,mBAAmB,GAAG;EACxB,SAAS,OAAO,KAAK,GAAG;EACxB,OAAO;CACT,OAAO,IAAI,mBAAmB,GAAG;EAC/B,SAAS,KAAK,KAAK,GAAG;EACtB,OAAO;CACT,OAAO,IAAI,mBAAmB,GAAG;EAC/B,SAAS,KAAK,KAAK,GAAG;EACtB,OAAO;CACT;CACA,IAAI,UAAU,GACR;MAAA,eACF,mBAAmB,OAAO,OAAO,KAAK,GAAG,CAAC;CAAA,OAEvC,IAAI,UAAU,GACnB,mBAAmB,OAAO,KAAK,KAAK,GAAG,IAAI,GAAG;MACzC,IAAI,UAAU,GACnB,mBAAmB,OAAO,KAAK,KAAK,GAAG,CAAC;MAExC,mBAAmB,KAAK,KAAK,GAAG;CAElC,IAAI,eACF,aAAa;CAEf,OAAO;EACL,MAAM;EACN,QAAQ;GACN,cAAc,OACZ,aAAa,OAAO,aAAa,IAAI,aAAa,OAAO,aAAa,CACxE;GACA;GACA;GACA;GACA,WAAW;GACX;GACA;EACF;CACF;AACF;;AAGA,SAAS,SAAS,KAAiB,OAAe,MAAuB;CACvE,IAAI,OAAO,GACT,OAAO;CAET,MAAM,QAAQ,KAAK,KAAK,KAAK;CAC7B,OACE,UAAU,cACV,UAAU,cACV,UAAU;AAEd;;AAGA,SAAS,uBACP,KACA,OACA,MACQ;CACR,IAAI,OAAO,qBACT,KAAK,eAAe;CAEtB,MAAM,UAAU,KAAK,KAAK,QAAQ,CAAC;CACnC,IAAK,UAAU,wBAAyB,IAAI,SAC1C,KAAK,4BAA4B;CAEnC,MAAM,gBAAgB,sBAAsB;CAC5C,IAAI,gBAAgB,MAClB,KAAK,eAAe;CAEtB,OAAO;AACT;AAEA,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM,gBAAgB;AACtB,MAAM,cAAc;;AAUpB,SAAS,cACP,KACA,OACA,MACiB;CACjB,IAAI,OAAO,mBACT,KAAK,eAAe;CAEtB,MAAM,SAAS,KAAK,KAAK,KAAK;CAC9B,MAAM,QAAQ,WAAW;CACzB,MAAM,YAAa,WAAW,IAAK;CACnC,MAAM,aAAa;EACjB;EACA;EACA,YAAY,SAAS,OAAO;EAC5B,UAAU;CACZ;CACA,IAAI,cAAc,QAChB,OAAO;EAAE,GAAG;EAAY,OAAO;CAAE;CAEnC,IAAI,cAAc,aAChB,KAAK,qBAAqB;CAE5B,OAAO;AACT;;AAGA,SAAS,wBACP,KACA,OACA,MACQ;CACR,IAAI;EACF,IAAI,SAAS,KAAK,OAAO,IAAI,GAE3B,OAAO;EAET,IACE,QAAQ,wBACP,KAAK,KAAK,KAAK,IAAI,+BAA+B,MACjD,4BAEF,OAAO,uBAAuB,KAAK,OAAO,IAAI;EAEhD,MAAM,SAAS,eAAe,KAAK,OAAO,IAAI;EAC9C,IAAI,OAAO,OAAO,KAAK,OAAO,WAAW,MACvC,OAAO;EAET,IAAI,KAAK,QAAQ,OAAO,OAAO;EAC/B,IAAI,YAAY,OAAO,OAAO,OAAO;EACrC,SAAS;GACP,MAAM,QAAQ,cAAc,KAAK,IAAI,SAAS;GAC9C,IAAI,oBAAoB,MAAM,QAAQ,WACpC,OAAO;GAET,MAAM,oBAAoB,MAAM;GAChC,aAAa,oBAAoB,MAAM;GACvC,IAAI,MAAM,WACR;EAEJ;EACA,IAAI,OAAO,OAAO,cAAc;GAC9B,IAAI,YAAY,GACd,OAAO;GAET,MAAM;EACR;EACA,OAAO,KAAK;CACd,SAAS,OAAO;EACd,IAAI,iBAAiB,MACnB,OAAO;EAET,MAAM;CACR;AACF;AAKA,MAAM,8BAA8B;AACpC,MAAM,4BAA4B;AAClC,MAAM,yBAAyB;AAC/B,MAAM,8BAA8B;AACpC,MAAM,uBAAuB;AAC7B,MAAM,mBAAmB;AAEzB,MAAM,cAAc;AACpB,MAAM,qBAAqB;AAC3B,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,eAAe;;;;;;AAarB,IAAMC,WAAN,MAAa;CACX,SAAgC,CAAC;CACjC,OAAO;CACP,MAAM;CACN,OAAO;CACP,QAAQ;CACR,YAAY;CAEZ,MAAM,MAAwB;EAC5B,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,GAAG;EAC7C,IAAI,KAAK,SAAS,MAChB,KAAK,YAAY;EAEnB,MAAM,OAAO,KAAK,SAAS,GAAG,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC;EACzD,IAAI,KAAK,SAAS,GAAG;GACnB,KAAK,OAAO,KAAK,KAAK,MAAM,CAAC;GAC7B,KAAK,QAAQ,KAAK;EACpB;EACA,KAAK,OAAO,KAAK;CACnB;AACF;AAOA,IAAM,aAAN,MAAiB;CACf,SAAS;CAGT,QAAgB;CAChB,WAAmB;CACnB,QAAgB;CAChB,UAAkB;CAClB,cAAsB;CACtB,QAA6B;EAC3B,cAAc;EACd,cAAc;EACd,QAAQ;EACR,kBAAkB;EAClB,WAAW;EACX,YAAY;EACZ,YAAY;CACd;CACA,iBAAwC;CACxC,cAAqC;CACrC,eAAsC;CACtC,UAAiC;CACjC,MAAsB,IAAI,OAAO;CACjC,UAAmC,KAAK;CACxC,MAAuB,IAAI,SAAS;CACpC,UAA4B;CAC5B,UAA4B;CAC5B,UAA4B;CAC5B,MAAwB;EAAC;EAAG;EAAG;CAAC;CAChC,aAAqB;CACrB,aAAqB;CACrB,MAAc,IAAI,MAAM;CACxB,mBAA2B;CAC3B,cAAsB;CACtB,YAAoB;CACpB,eAAuB;CACvB,UAAkB;CAClB,SAA6BD;CAC7B,SAAiB;CACjB,UAAkB;CAClB,2BAA4B,IAAI,WAC9B,KACF;CAGA,cAAsB;CACtB,+BAAgC,IAAI,WAAW,EAAE;CACjD,SAAiB;CACjB,SAA6BA;CAC7B,aAAqB;CACrB,QAAgB;CAChB,cAAsB;CACtB,WAAmB;CACnB,SAAiB;CACjB,cAAsB;;CAItB,iBAAiB,OAAc,KAAqB;EAClD,MAAM,SAAS,MAAM;EACrB,MAAM,OAAO,MAAM;EACnB,IAAI,KAAK;EACT,IAAI,eAAe;EACnB,OAAO,cAAc;GACnB,IAAI,KAAK,gBAAgB,aAAa;IACpC,KAAK,cAAc;IACnB,KAAK,SAAS;IACd,KAAK,QAAQ;IACb,KAAK,WAAW;IAChB,KAAK,SAAS;IACd,KAAK,cAAc;GACrB;GACA,IAAI,KAAK,gBAAgB,oBAAoB;IAC3C,IAAI;IACJ,IAAI;KACF,SAAS,eAAe,KAAK,cAAc,GAAG,KAAK,MAAM;IAC3D,SAAS,OAAO;KACd,IACE,iBAAiB,QACjB,SAAS,MAAM,MAAM,QAAQ,OAAO,MAAM,GAC1C;MACA,KAAK,SAAS;MACd,MAAM,MAAM;MACZ,OAAO;KACT;KACA,MAAM;IACR;IACA,IAAI,OAAO,SAAS,GAAG;KACrB,MAAM,SAAS,OAAO,OAAO,KAAK;KAClC,MAAM,YAAY,OAAO;KACzB,IAAI,SAAS,WAAW;MACtB,KAAK,aAAa,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,GAAG,KAAK,MAAM;MAChE,KAAK,UAAU;MACf,MAAM,MAAM;MACZ,eAAe,KAAK,cAAc,GAAG,KAAK,MAAM;MAChD,OACE,KAAK,IAAI,qBAAqB,OAAO,IAAI,IACzC,KAAK,SACL;KAEJ;KACA,KAAK,aAAa,IAChB,MAAM,KAAK,SAAS,IAAI,KAAK,MAAM,GACnC,KAAK,MACP;KACA,KAAK,SAAS,OAAO;KACrB,MAAM;KACN;IACF;IACA,MAAM,SAAS,OAAO;IACtB,KAAK,QAAQ;IACb,IACE,OAAO,qBAAqB,uBAC5B,OAAO,cAAc,mBACrB,OAAO,IAAI,QAAQ,IAAI,GAAG,KAAK,OAAO,kBACtC;KACA,MAAM,QAAQ,wBACZ,MAAM,MACN,QACA,OAAO,MACT;KACA,IAAI,SAAS,KAAK,SAAS,OAAO,QAAQ;MAExC,KAAK,qBAAqB,KAAK,MAAM,MAAM,QAAQ,KAAK;MACxD,KAAK,SAAS;MACd,KAAK,WAAW;MAChB,KAAK,cAAc;MACnB,eAAe;MACf;KACF;IACF;IACA,KAAK,gBAAgB;IACrB,KACG,KAAK,KAAK,cAAc,CAAC,IAAI,+BAA+B,MAC7D,4BACA;KACA,KAAK,WAAW,KAAK,KAAK,cAAc,CAAC;KACzC,KAAK,QAAQ;IACf,OAAO;KACL,KAAK,kBAAkB,KAAK,cAAc,GAAG,KAAK,MAAM;KACxD,KAAK,WAAW;KAChB,KAAK,QAAQ;IACf;IACA,MAAM,QAAQ,KAAK;IACnB,IAAI,MAAM,aAAa,MAAM,OAAO,qBAAqB,GACvD,MAAM,aAAa,MAAM,OAAO,qBAAqB;IAEvD,IAAI,MAAM,aAAa,OAAO,eAAe,GAC3C,KAAK,+BAA+B;IAEtC,MAAM,aAAa,OAAO,MAAM,UAAU;IAC1C,MAAM,mBAAmB,KAAK,IAAI,MAAM,cAAc,CAAC;IACvD,MAAM,YAAY,KAAK,IACrB,YACA,eACA,MAAM,YACR;IACA,MAAM,eAAe,OACnB,aAAa,YAAY,IAAI,EAC/B;IACA,MAAM,oBAAoB,OACxB,MAAM,mBAAmB,eACrB,MAAM,mBACN,YACN;IACA,IACE,KAAK,aAAa,oBAClB,KAAK,cAAc,mBACnB;KACA,KAAK,SAAS,IAAI,WAAW,gBAAgB;KAC7C,KAAK,aAAa;KAClB,KAAK,cAAc;IACrB;IACA,KAAK,cAAc;GACrB;GACA,IAAI,KAAK,gBAAgB,aAAa;IACpC,MAAM,eAAe,KAAK,yBAAyB,OAAO,EAAE;IAC5D,IAAI,iBAAiB,GAAG;KACtB,KAAK,cAAc;KACnB,eAAe;KACf;IACF;IACA,IAAI,OAAO,MAAM,cAAc;KAC7B,KAAK,yBAAyB,MAAM,MAAM,IAAI,YAAY;KAC1D,MAAM;KACN;IACF;IACA,IAAI,OAAO,MAAM;KACf,eAAe;KACf;IACF;IACA,KAAK,cAAc;GACrB;GACA,IAAI,KAAK,gBAAgB,aAAa;IACpC,MAAM,eAAe,KAAK;IAC1B,MAAM,SAAS,eAAe,KAAK;IACnC,IAAI;IACJ,IAAI,KAAK,UAAU,kBACjB,aAAa,KAAK,IAAI,QAAQ,OAAO,EAAE;SAClC;KACL,IAAI,SAAS,KAAK,aAAa,KAAK,OAClC,KAAK,qBAAqB;KAE5B,aAAa,KAAK,IAAI,QAAQ,OAAO,EAAE;KACvC,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,UAAU,GAAG,KAAK,KAAK;IACtE;IACA,MAAM;IACN,KAAK,SAAS;IACd,IAAI,aAAa,QAAQ;KACvB,eAAe;KACf;IACF;IACA,KAAK,QAAQ;IACb,KAAK,yBAAyB,KAAK,QAAQ,GAAG,YAAY;IAC1D;GACF;GACA,IAAI,KAAK,gBAAgB,cAAc;IACrC,MAAM,cAAc,KAAK,SAAS,KAAK;IACvC,MAAM,cAAc,KAAK,IACvB,KAAK,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,GAC9B,WACF;IACA,IAAI,MACF,KAAK,QAAQ,KAAK,SAChB,KAAK,UACL,KAAK,WAAW,WAClB,CACF;IACA,KAAK,YAAY;IACjB,IAAI,gBAAgB,aAAa;KAC/B,KAAK,cAAc;KACnB,IACE,OAAO,KAAK,WAAW,IAAI,KAAK,MAAM,oBACtC,KAAK,WAAW,KAAK,MAAM,eAAe,KAAK,aAC/C;MACA,KAAK,WAAW;MAChB,KAAK,SAAS;KAChB;KACA;IACF;IACA,eAAe;GACjB;EACF;EACA,MAAM,MAAM;EACZ,IAAI,KAAK,aAAa,GAAG;GACvB,IAAI,KAAK,WAAW,KAAK,UAAU;IACjC,IAAI,KAAK,aAAa;KACpB,IAAI,MAAM,OAAO,MAAM,MAAM;MAC3B,KAAK,cAAc;MACnB,OAAO;KACT;KACA,MAAM,OAAO;IACf;IACA,OAAO;GACT;GACA,IAAI,CAAC,KAAK,aAAa;IACrB,MAAM,OAAO;IACb,KAAK,cAAc;GACrB;GACA,OAAO;EACT;EACA,OAAO,KAAK;CACd;;CAGA,kBAAgC;EAC9B,KAAK,WAAW;EAChB,KAAK,QAAQ;EACb,KAAK,cAAc;EACnB,KAAK,iBAAiB;EACtB,KAAK,cAAc;EACnB,KAAK,eAAe;EACpB,KAAK,UAAU;EACf,KAAK,IAAI,YAAY;EACrB,KAAK,IAAI,WAAW;EACpB,KAAK,aAAa;EAClB,KAAK,aAAa;EAClB,KAAK,QAAQ;EACb,KAAK,MAAM;GAAC;GAAG;GAAG;EAAC;CACrB;;CAGA,kBACE,KACA,OACA,YACM;EACN,MAAM,SAAS,eAAe,KAAK,OAAO,UAAU;EACpD,IAAI,OAAO,OAAO,KAAK,OAAO,WAAW,MACvC,KAAK,eAAe;EAEtB,KAAK,QAAQ,OAAO;EACpB,IAAI,KAAK,MAAM,WAAW,GACxB,KAAK,kBAAkB;EAEzB,KAAK,mBAAmB,KAAK,MAAM;EACnC,KAAK,MAAM,IAAI,MAAM;CACvB;;CAGA,gBAAwB,KAAa,SAAuB;EAC1D,IAAI,QAAQ,KAAK,kBAAkB,UAAU,GAAG;GAC9C,KAAK,UAAU,KAAK;GACpB,KAAK,eACH,QAAQ,KAAK,kBAAkB,MAAM,KAAK,eAAe;GAC3D,KAAK,cAAc;GACnB,KAAK,iBAAiB;EACxB;CACF;CAEA,yBAAiC,WAA2B;EAC1D,IACE,KAAK,UAAU,0BACf,KAAK,UAAU,6BAEf,OAAO,KAAK;EAEd,IAAI,KAAK,UAAU,QACjB,OAAO,KAAK;EAEd,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,KAAK,QAAQ,CAAC;CACvD;;CAGA,yBACE,KACA,OACA,MACM;EACN,MAAM,cAAc,KAAK,UAAU;EACnC,MAAM,UAAU,cAAc,IAAI,KAAK,cAAc,KAAK;EAC1D,MAAM,cAAc,KAAK,mBACvB,KAAK,UACL,SACA,KACA,OACA,IACF;EACA,IAAI,CAAC,eAAe,CAAC,aACnB,KAAK,cAAc;OACd;GACL,KAAK,SAAS,KAAK,WAAW;GAC9B,KAAK,cAAc;EACrB;CACF;CAEA,4BAA0C;EACxC,IAAI,KAAK,MAAM,cAAc;GAC3B,KAAK,WAAW;GAChB,KAAK,QAAQ;EACf,OAAO;GACL,KAAK,WAAW;GAChB,KAAK,QAAQ;EACf;CACF;;CAIA,mBACE,KACA,aACA,KACA,OACA,MACQ;EACR,IAAI,SAAS,KAAK,yBAAyB,IAAI,GAC7C,KAAK,eAAe;EAEtB,KAAK,MAAM,KAAK;EAChB,KAAK,gBAAgB,KAAK,WAAW;EACrC,IAAI,KAAK,UAAU,2BAA2B;GAC5C,MAAM,QAAQ,cAAc,KAAK,OAAO,iBAAiB;GACzD,IAAI,MAAM,QAAQ,KAAK,MAAM,cAC3B,KAAK,qBAAqB;GAE5B,KAAK,WAAW,MAAM;GACtB,KAAK,QAAQ,MAAM;GACnB,KAAK,UAAU,MAAM;GACrB,IAAI,MAAM,OAAO;IACf,KAAK,QAAQ,MAAM,YACf,8BACA;IACJ,OAAO;GACT;GACA,IAAI,MAAM,WACR,KAAK,0BAA0B;QAC1B;IACL,KAAK,WAAW;IAChB,KAAK,QAAQ;GACf;GACA,OAAO;EACT;EACA,IACE,KAAK,UAAU,0BACf,KAAK,UAAU,6BACf;GACA,IAAI;GACJ,IAAI,KAAK,UAAU,eAAe;IAChC,QAAQ,KAAK,gBAAgB,KAAK,aAAa,KAAK,OAAO,MAAM,IAAI;IACrE,KAAK,WAAW;GAClB,OAAO,IAAI,KAAK,UAAU,QAAQ;IAChC,IAAI,OAAO,aACT,KAAK,kBAAkB;IAEzB,KAAK,IAAI,OAAO,MAAM,IAAI;IAC1B,KAAK,IAAI,KAAK,IAAI,IAAI,SAAS,OAAO,QAAQ,IAAI,GAAG,GAAG;IACxD,QAAQ;IACR,KAAK,YAAY;GACnB,OAAO,IAAI,KAAK,UAAU,QAAQ;IAChC,IAAI,KAAK,UAAU,aACjB,KAAK,kBAAkB;IAEzB,KAAK,IAAI,OAAO,MAAM,KAAK,OAAO;IAClC,KAAK,IAAI,KAAK,KAAK,OAAO,KAAK,KAAK,GAAG,KAAK,MAAM,KAAK,OAAO;IAC9D,QAAQ,KAAK;IACb,KAAK,WAAW;GAClB,OACE,KAAK,qBAAqB;GAE5B,IAAI,QAAQ,KAAK,MAAM,cACrB,KAAK,qBAAqB;GAE5B,KAAK,eAAe;GACpB,IAAI,KAAK,kBACP,KAAK,IAAI,OAAO,KAAK,IAAI,MAAM,KAAK,MAAM,KAAK;GAEjD,KAAK,iBAAiB,MAAM;GAC5B,IAAI,KAAK,WAAW,GAClB,OAAO;GAET,IAAI,KAAK,UAAU,6BAA6B;IAC9C,IACE,KAAK,MAAM,qBAAqB,uBAChC,OAAO,KAAK,WAAW,MAAM,KAAK,MAAM,kBAExC,KAAK,qBAAqB;IAE5B,KAAK,0BAA0B;GACjC,OAAO;IACL,KAAK,QAAQ;IACb,KAAK,WAAW;GAClB;GACA,OAAO;EACT;EACA,IAAI,KAAK,UAAU,sBAAsB;GACvC,IACE,KAAK,oBACL,KAAK,IAAI,YAAY,MAAM,KAAK,KAAK,KAAK,GAE1C,KAAK,gBAAgB;GAEvB,KAAK,WAAW;GAChB,KAAK,QAAQ;GACb,OAAO;EACT;EACA,IAAI,KAAK,UAAU,kBAAkB;GACnC,KAAK,WAAW;GAChB,KAAK,QAAQ;GACb,OAAO;EACT;EACA,OAAO,KAAK,SAAS;CACvB;;;;;CAMA,qBACE,KACA,KACA,OACA,MACM;EACN,MAAM,UAAU,IAAI,OAAO;EAC3B,KAAK,MAAM;EACX,IAAI,MAAM;EACV,IAAI,cAAc,IAAI,QAAQ,IAAI;EAClC,IAAI,KAAK;EACT,IAAI,YAAY;EAChB,IAAI,iBAAiB;EACrB,OAAO,aAAa,wBAAwB;GAC1C,IAAI,SAAS,KAAK,IAAI,SAAS,GAAG;IAEhC,KAAK,SAAS;IACd;GACF;GACA,IAAI,aAAa,GACD;SAAA,KAAK,KAAK,EAEjB,IAAI,+BAA+B,MACxC,4BACA;KACA,MAAM,gBAAgB,uBAAuB,KAAK,IAAI,SAAS;KAC/D,MAAM;KACN,aAAa;KACb;IACF;;GAEF,KAAK,gBAAgB;GACrB,KAAK,gBAAgB,KAAK,WAAW;GACrC,IAAI;GACJ,IAAI;IACF,SAAS,KAAK,gBAAgB,KAAK,aAAa,KAAK,IAAI,SAAS;GACpE,SAAS,OAAO;IACd,IACE,iBAAiB,QACjB,MAAM,SAAS,oBACf,gBAEA,KAAK,eAAe;IAEtB,MAAM;GACR;GACA,OAAO,OAAO;GACd,eAAe,OAAO;GACtB,MAAM,OAAO;GACb,aAAa,OAAO;GACpB,iBAAiB;EACnB;EACA,IAAI,aAAa,CAAC,KAAK,QACrB,KAAK,eAAe;EAEtB,IAAI,MAAM,QAAQ,KAAK,SAAS,GAAG,GAAG,CAAC;EACvC,KAAK,MAAM,KAAK;CAClB;;CAGA,gBACE,KACA,aACA,KACA,OACA,MACa;EACb,MAAM,OAAO,MAAM;EACnB,IAAI,KAAK;EACT,IAAI,KAAK;EACT,IAAI,YAAY;EAChB,IAAI,YAAY,GACd,KAAK,eAAe;EAEtB,MAAM,aAAa,gBAAgB,KAAK,EAAE;EAC1C,IAAI,YAAY,aAAa,mBAC3B,KAAK,eAAe;EAEtB,KAAK,kBAAkB,KAAK,IAAI,UAAU;EAC1C,MAAM;EACN,aAAa;EACb,SAAS;GACP,MAAM,QAAQ,cAAc,KAAK,IAAI,SAAS;GAC9C,MAAM;GACN,aAAa;GACb,IAAI,MAAM,QAAQ,WAChB,KAAK,eAAe;GAEtB,IAAI;GACJ,IAAI,MAAM,cAAc,eACtB,cAAc,KAAK,gBACjB,IACA,OAAO,IACP,KACA,IACA,MAAM,OACN,KACF;QACK,IAAI,MAAM,cAAc,QAAQ;IACrC,IAAI,MAAM,QAAQ,OAAO,IACvB,KAAK,kBAAkB;IAEzB,KAAK,IAAI,OAAO,KAAK,MAAM,KAAK;IAChC,KAAK,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,MAAM,KAAK,GAAG,EAAE;IACxD,cAAc,MAAM;GACtB,OAAO;IACL,IAAI,MAAM,WAAW,OAAO,IAC1B,KAAK,kBAAkB;IAEzB,KAAK,IAAI,OAAO,KAAK,MAAM,QAAQ;IACnC,KAAK,IAAI,KAAK,KAAK,OAAO,KAAK,EAAE,GAAG,IAAI,KAAK,MAAM,QAAQ;IAC3D,cAAc,MAAM;GACtB;GACA,IAAI,KAAK,kBACP,KAAK,IAAI,OAAO,KAAK,IAAI,MAAM,IAAI,KAAK,WAAW;GAErD,MAAM;GACN,MAAM,MAAM;GACZ,aAAa,MAAM;GACnB,IAAI,MAAM,WACR;EAEJ;EACA,IACE,KAAK,MAAM,qBAAqB,uBAChC,OAAO,KAAK,GAAG,MAAM,KAAK,MAAM,kBAEhC,KAAK,qBAAqB;EAE5B,IAAI,KAAK,MAAM,cAAc;GAC3B,IAAI,YAAY,GACd,KAAK,gBAAgB;GAEvB,IAAI,KAAK,IAAI,YAAY,MAAM,KAAK,KAAK,EAAE,GACzC,KAAK,gBAAgB;GAEvB,MAAM;GACN,aAAa;EACf;EACA,OAAO;GAAE,UAAU,KAAK;GAAO,SAAS,KAAK;EAAI;CACnD;;CAMA,gBACE,KACA,aACA,KACA,OACA,MACA,WACQ;EACR,MAAM,eAAe,KAAK,MAAM;EAChC,IAAI,OAAO,cACT,KAAK,eAAe;EAEtB,MAAM,WAAW,KAAK,eACpB,KACA,OACA,MACA,KACA,aACA,SACF;EACA,IAAI,KAAK,QAAQ;EACjB,IAAI,YAAY,OAAO;EAEvB,MAAM,mBADa,MAAM,KAAK,IAAI,aAAa,YAAY,KACpB,KAAK,gBAAgB;EAC5D,MAAM,UAAU,KAAK,iBAAiB,KAAK,IAAI,SAAS;EACxD,MAAM,EAAE,UAAU;EAClB,MAAM,QAAQ;EACd,aAAa,QAAQ;EACrB,IAAI,gBAAgB,KAAK,QAAQ,GAC/B,KAAK,kBAAkB;EAEzB,IAAI,qBAAqB;EACzB,IAAI,mBAAmB,KAAK,MAAM,QAAQ,GAAG;GAE3C,MAAM,QAAQ,KAAK;GACnB,IAAI,QAAQ;GACZ,KAAK,IAAI,OAAO,GAAG,OAAO,KAAK,MAAM,UAAU,QAAQ,GACrD,IAAK,MAAM,iBAAiB,QAAmB,IAC7C,SAAS;GAGb,UAAU,cAAc,MAAM;GAC9B,qBAAqB,SAAS;EAChC;EACA,IAAI,oBACF,OAAO,KAAK,cAAc,KAAK,aAAa,KAAK,IAAI,WAAW,KAAK;EAEvE,IAAI,KAAK,gBAAgB,OACvB,OAAO,KAAK,eAAe,KAAK,aAAa,KAAK,IAAI,WAAW,KAAK;EAExE,OAAO,KAAK,UAAU,KAAK,aAAa,KAAK,IAAI,WAAW,KAAK;CACnE;;CAGA,iBACE,KACA,aACA,SACA,WACA,mBACA,kBACM;EACN,MAAM,eAAe,KAAK,MAAM;EAChC,IACE,CAAC,aACD,cACE,eAAe,sBAAsB,UAAU,qBACjD;GACA,KAAK,YAAY,MAAM,eAAe;GACtC,KAAK,eAAe,KAAK,YAAY;GACrC,KAAK,cAAc;GACnB,KAAK,UAAU;EACjB,OAAO,IAAI,WAAW,oBAAoB;GACxC,KAAK,YAAY;GACjB,KAAK,eAAe;GACpB,KAAK,cAAc;GACnB,KAAK,UAAU;EACjB,OAAO;GACL,IAAI,kBAAkB;IACpB,KAAK,YACH,MACA,oBACA,UACA,qBACA;IACF,KAAK,eAAe,KAAK,YAAY,UAAU;GACjD,OAAO;IACL,KAAK,YAAY,MAAM,oBAAoB;IAC3C,KAAK,eAAe,MAAM;GAC5B;GACA,KAAK,cAAc;GACnB,KAAK,UAAU;EACjB;CACF;;CAGA,cAAsB,UAAsB,kBAAiC;EAC3E,MAAM,UAAU,SAAS;EACzB,IAAI,KAAK,gBAAgB,YAAY;GACnC,KAAK,SAAS,IAAI,UAAU,CAAC;GAC7B;EACF;EACA,IAAI,KAAK,gBAAgB,QAAQ;GAC/B,KAAK,IAAI,OAAO,KAAK,YAAY,OAAO;GACxC,KAAK,IAAI,KAAK,IAAI,UAAU,KAAK,SAAS;GAC1C;EACF;EACA,IAAI,kBAAkB;GACpB,MAAM,OAAO,UAAU;GACvB,KAAK,IAAI,OAAO,KAAK,YAAY,IAAI;GACrC,KAAK,IAAI,KAAK,IAAI,SAAS,SAAS,GAAG,IAAI,GAAG,KAAK,SAAS;GAC5D,KAAK,SAAS,IAAI,SAAS,SAAS,IAAI,GAAG,CAAC;GAC5C;EACF;EAGA,MAAM,aAAyB,KAAK,IAAI;EACxC,KAAK,IAAI,OAAO,KAAK,YAAY;EACjC,KAAK,CAAC,CAAC,IAAI,UAAU,KAAK,SAAS;EACnC,KAAK,SAAS,IACZ,KAAK,CAAC,CAAC,SACL,KAAK,eAAe,oBACpB,KAAK,YACP,GACA,CACF;EACA,MAAM,SAAS,KAAK,YAAY,qBAAqB;EACrD,KAAK,IAAI,OAAO,SAAS,UAAU,kBAAkB;EACrD,KAAK,CAAC,CAAC,WACL,QACA,KAAK,WACL,KAAK,YAAY,UAAU,kBAC7B;EACA,KAAK,YAAY;EACjB,KAAK,gBAAgB;CACvB;;CAIA,eACE,KACA,OACA,MACA,KACA,aACA,WACQ;EACR,IAAI,OAAO,iBACT,KAAK,qBAAqB;EAE5B,MAAM,QAAQ,OAAO,KAAK,KAAK;EAC/B,MAAM,aAAa,QAAQ;EAC3B,MAAM,eAAe,KAAK,MAAM;EAChC,MAAM,UAAW,SAAS,IAAK;EAC/B,MAAM,oBAAoB,KAAK,IAAI,cAAc,WAAW;EAC5D,IAAI,eAAe,KAAK,eAAe,GAAG;GACxC,IAAI,eAAe,KAAK,CAAC,KAAK,YAC5B,KAAK,sBAAsB;GAE7B,IAAI,OAAO,GACT,KAAK,qBAAqB;GAE5B,MAAM,MAAM,KAAK,KAAK,KAAK;GAC3B,IAAI,eAAe;GACnB,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI,WAAW,GAAG;IAChB,eAAe,YAAY;IAC3B,SAAS;IACT,UAAW,QAAQ,IAAK;IACxB,WAAY,QAAQ,KAAM;GAC5B,OAAO,IAAI,YAAY,GAAG;IACxB,SAAS;IACT,UAAW,QAAQ,IAAK;IACxB,WAAW,QAAQ;GACrB,OAAO;IACL,SAAS;IACT,UAAW,QAAQ,IAAK;IACxB,YAAY,QAAQ,MAAM,OAAO,KAAK,QAAQ,CAAC,IAAI;GACrD;GACA,IAAI,UAAU,cACZ,KAAK,qBAAqB;GAE5B,IAAI,CAAC,gBAAgB,UAAU,4BAC7B,KAAK,sBAAsB;GAE7B,IAAI,WAAW,SAAS,MACtB,KAAK,qBAAqB;GAE5B,IAAI,oBAAoB,SACtB,KAAK,kBAAkB;GAEzB,KAAK,iBACH,KACA,aACA,SACA,WACA,mBACA,KACF;GACA,MAAM,WAAW,IAAI,WAAW,UAAU,EAAuB;GACjE,MAAM,WAAW,QAAQ;GACzB,IAAI,YAAY;GAChB,IAAI;IACF,KAAK,sBACH,eAAe,GACf,cACA,UACA,SACA,KACA,UACA,QACF;GACF,SAAS,OAAO;IACd,IAAI,EAAE,iBAAiB,OACrB,MAAM;IAER,YAAY;GACd;GACA,KAAK,cAAc,SAAS,SAAS,GAAG,OAAO,GAAG,KAAK;GACvD,IAAI,WACF,KAAK,qBAAqB;GAE5B,KAAK,SAAS,KAAK;GACnB,KAAK,UAAU;GACf,KAAK,aAAa;GAClB,OAAO,WAAW;EACpB;EACA,IAAI;EACJ,IAAI;EACJ,IAAI,YAAY,GAAG;GACjB,SAAS;GACT,IAAI,eAAe,KAAK,OAAO,GAC7B,KAAK,qBAAqB;GAE5B,UAAU,KAAK,KAAK,KAAK,KAAK;EAChC,OAAO,IAAI,YAAY,GAAG;GACxB,SAAS;GACT,IAAI,QAAQ,eAAe,IAAI,IAAI,IACjC,KAAK,qBAAqB;GAE5B,UAAU,KAAK,KAAK,KAAK,KAAK;EAChC,OAAO;GACL,SAAS;GACT,UAAU,SAAS;EACrB;EACA,IAAI,UAAU,cACZ,KAAK,qBAAqB;EAE5B,IAAI,oBAAoB,SACtB,KAAK,kBAAkB;EAEzB,KAAK,iBACH,KACA,aACA,SACA,WACA,mBACA,IACF;EACA,IAAI,eAAe,GAAG;GAEpB,KAAK,cACH,IAAI,WAAW,OAAO,CAAC,CAAC,KAAK,OAAO,KAAK,QAAQ,MAAM,CAAC,GACxD,IACF;GACA,KAAK,SAAS,KAAK;GACnB,KAAK,UAAU;GACf,OAAO,SAAS;EAClB;EAEA,IAAI,SAAS,UAAU,sBAAsB,MAAM;GACjD,IAAI,UAAU,SAAS,MACrB,KAAK,qBAAqB;GAE5B,KAAK,cACH,IAAI,SAAS,QAAQ,QAAQ,QAAQ,SAAS,OAAO,GACrD,IACF;GACA,KAAK,SAAS,KAAK;GACnB,KAAK,UAAU;GACf,OAAO,SAAS;EAClB;EACA,KAAK,UAAU;EACf,KAAK,SAAS;EACd,KAAK,SAAS,QAAQ;EACtB,KAAK,UAAU;EACf,KAAK,eAAe,KAAK,SAAS;EAClC,KAAK,cAAc;EACnB,OAAO,SAAS;CAClB;;CAGA,sBACE,QACA,cACA,KACA,SACA,KACA,OACA,MACM;EACN,MAAM,QAAQ,KAAK;EACnB,IAAI,QAAQ;GACV,IAAI,cACF,aAAa,OAAO,KAAK,SAAS,KAAK,OAAO,IAAI;QAElD,aAAa,OAAO,KAAK,SAAS,KAAK,OAAO,IAAI;GAEpD;EACF;EACA,IAAI,cAAc;GAEhB,MAAM,aAAa,aAAa,OAAO,KAAK,OAAO,IAAI;GACvD,IAAI,cAAc,MAChB,KAAK,eAAe;GAEtB,aACE,OACA,KACA,SACA,KACA,QAAQ,YACR,OAAO,UACT;GACA;EACF;EAEA,IAAI,YAAY,GACd,KAAK,kBAAkB;EAEzB,IAAI,SAAS,GACX,KAAK,qBAAqB;EAE5B,MAAM,aAAa,SAAS,SAAS,IAAI,IACrC,aAAa,OAAO,KAAK,OAAO,IAAI,IACpC,aAAa,OAAO,KAAK,OAAO,IAAI;EACxC,IAAI,cAAc,MAChB,KAAK,eAAe;EAEtB,aACE,OACA,KACA,SACA,KACA,QAAQ,YACR,OAAO,UACT;CACF;;CAGA,iBACE,KACA,OACA,MACiC;EACjC,MAAM,OAAO,QAAQ;EACrB,IAAI,KAAK;EACT,IAAI,OAAO,GACT,KAAK,eAAe;EAEtB,IAAI,QAAQ,OAAO,KAAK,EAAE;EAC1B,MAAM;EACN,IAAI,QAAQ,KAAM;GAChB,IAAI,UAAU,KAAM;IAClB,IAAI,KAAK,IAAI,MACX,KAAK,eAAe;IAEtB,QAAQ,KAAK,KAAK,EAAE,IAAI;IACxB,MAAM;GACR,OAAO;IACL,IAAI,MAAM,MACR,KAAK,eAAe;IAEtB,SAAU,QAAQ,OAAS,KAAK,OAAO,KAAK,EAAE;IAC9C,MAAM;GACR;EACF;EACA,IAAI,UAAU,GAAG;GACf,IAAI,OAAO,MACT,KAAK,qBAAqB;GAE5B,OAAO;IAAE;IAAO,MAAM,KAAK;GAAM;EACnC;EACA,IAAI,KAAK,IAAI,MACX,KAAK,eAAe;EAEtB,MAAM,QAAQ,OAAO,KAAK,EAAE;EAC5B,IAAI,QAAQ,GACV,KAAK,qBAAqB;EAE5B,MAAM;EACN,MAAM,SACJ,MACA,KACA,QACA,WACA,MACA,cACA,YACsC;GACtC,MAAM,YAAY,OAAO;GACzB,IAAI,SAAS,GAAG;IAEd,IAAI,CAAC,WACH,KAAK,qBAAqB;IAE5B,MAAM,SAAS,OAAO,KAAK,EAAE;IAC7B,IAAI,SAAS,KACX,KAAK,qBAAqB;IAE5B,OAAO;KACL,MAAM;KACN,OAAO,YACL,UAAU,SACV,KAAK,OACP;IACF;GACF;GACA,IAAI,SAAS,GACX,OAAO;IAAE,MAAM;IAAG,OAAO;GAAa;GAExC,IAAI,SAAS,GAAG;IACd,IAAI,CAAC,KAAK,YACR,KAAK,qBAAqB;IAE5B,OAAO;KAAE,MAAM;KAAG,OAAO;IAAQ;GACnC;GACA,MAAM,uBAAO,IAAI,WAAW,GAAG;GAC/B,MAAM,SAAS,WAAW,MAAM,KAAK,KAAK,IAAI,SAAS;GACvD,IAAI,OAAO,WAAW,QACpB,KAAK,qBAAqB;GAE5B,OAAO;IACL,MAAM,OAAO;IACb,OAAO,cACL,MACA,OAAO,gBACP,WACA,MACA,OAAO,QACT;GACF;EACF;EACA,MAAM,KAAK,MACT,SAAS,GACT,QACA,YACA,SACA,SACA,kBACA,KAAK,OACP;EACA,KAAK,UAAU,GAAG;EAClB,MAAM,GAAG;EACT,MAAM,KAAK,MACR,SAAS,IAAK,GACf,SACA,aACA,SACA,SACA,kBACA,KAAK,OACP;EACA,KAAK,UAAU,GAAG;EAClB,MAAM,GAAG;EACT,MAAM,KAAK,MACR,SAAS,IAAK,GACf,QACA,YACA,SACA,SACA,kBACA,KAAK,OACP;EACA,KAAK,UAAU,GAAG;EAClB,MAAM,GAAG;EACT,OAAO;GAAE;GAAO,MAAM,KAAK;EAAM;CACnC;CAIA,gBAAoC;EAClC,IAAI,KAAK,YAAY,SACnB,OAAO,KAAK,IAAI;EAElB,OAAO,KAAK,YAAY,YAAY,KAAK,WAAW,KAAK;CAC3D;;CAGA,aAAqB,IAAY,QAAsB;EACrD,KAAK,IAAI,OAAO,KAAK,MAAM;EAC3B,MAAM,OAAO,KAAK,IAAI;EACtB,IAAI,KAAK,YAAY,SAAS;GAC5B,KAAK,IAAI,OAAO,KAAK,SAAS,MAAM;GACpC,KAAK,IAAI,KAAK,WAAW,IAAI,KAAK,QAAQ,KAAK,SAAS,MAAM;EAChE,OAAO;GACL,MAAM,SAAS,KAAK,cAAc;GAClC,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAC3C,KAAK,KAAK,SAAS,OAAO,KAAK,SAAS,UAAU;EAEtD;EACA,KAAK,UAAU;CACjB;;CAGA,UAAkB,IAAY,OAAe,QAAsB;EACjE,KAAK,IAAI,OAAO,KAAK,MAAM;EAC3B,MAAM,OAAO,KAAK,IAAI;EACtB,IAAI,KAAK,SAAS,QAAQ;GACxB,KAAK,WAAW,IAAI,OAAO,QAAQ,MAAM;GACzC;EACF;EACA,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAC3C,KAAK,KAAK,SAAS,KAAK,QAAQ;CAEpC;;;;;CAMA,aACE,IACA,MACA,UACA,UACA,OACQ;EACR,MAAM,UAAU,KAAK,SAAS;EAC9B,MAAM,iBAAiB,SAAS,YAAY,SAAS;EACrD,IAAI,MAAM,gBAAgB,OAAO,EAAE,GACjC,KAAK,kBAAkB;EAEzB,IAAI,MAAM,SAAS,WAAW,WAAW,KAAK,MAAM,GAClD,KAAK,qBAAqB;EAE5B,IAAI,SAAS,KAAK,KAAK,UAAU,KAAK,KAAK,SAAS,SAAS,WAC3D,KAAK,kBAAkB;EAEzB,KAAK,aAAa,IAAI,SAAS,SAAS;EACxC,MAAM,cAAc,KAAK,eAAe;EACxC,IAAI,cAAc,SAAS;EAC3B,IAAI,SAAS;EACb,IAAI,QAAQ,UAAU,SAAS;EAC/B,IAAI,MAAM,SAAS,QAAQ,UAAU,WAAW,GAAG;GACjD,IAAI,MAAM,SAAS,QAAQ,WAAW,KAAK,gBAAgB,EAAE,GAC3D,KAAK,qBAAqB;GAE5B,MAAM,UAAU,KAAK,WAAW;GAChC,QAAQ,WAAW,cAAc;GACjC,KAAK,IAAI,OAAO,KAAK,IAAI,UAAU,aAAa,OAAO,CAAC;GACxD,IAAI,QAAQ,eAAe,SAAS;IAClC,KAAK,IAAI,KAAK,WAAW,SAAS,OAAO,QAAQ,WAAW;IAC5D,OAAO,KAAK;GACd;GACA,MAAM,UAAU,UAAU;GAC1B,KAAK,IAAI,KAAK,WAAW,SAAS,OAAO,QAAQ,OAAO;GACxD,SAAS,UAAU;GACnB,eAAe;GACf,QAAQ;EACV;EACA,KAAK,UAAU,QAAQ,OAAO,WAAW;EACzC,OAAO,KAAK;CACd;CAEA,eACE,MACA,IACA,IACA,IACA,YACA,WACU;EACV,MAAM,SAAS,GAAG;EAClB,MAAM,SAAS,GAAG;EAClB,MAAM,SAAS,GAAG;EAClB,MAAM,SAAS,GAAG,MAAM,UAAU;EAClC,MAAM,SAAS,GAAG,MAAM,UAAU;EAClC,MAAM,SAAS,GAAG,MAAM,UAAU;EAClC,MAAM,SAAS,GAAG,MAAM,iBAAiB;EACzC,MAAM,SAAS,GAAG,MAAM,iBAAiB;EACzC,MAAM,SAAS,GAAG,MAAM,iBAAiB;EACzC,MAAM,YAAY,SAAS,SAAS;EACpC,IAAI;EACJ,IAAI,SAAS,GAAG;GACd,SAAS,SAAS,KAAK,SAAS,MAAM;GACtC,WAAW,KAAK,WAAW;GAC3B,WAAW,KAAK,WAAW;GAC3B,WAAW,KAAK;EAClB,OAAO;GACL,MAAM,MAAM,WAAW,IAAI,IAAI;GAC/B,IAAI,WAAW,GAAG;IAChB,SAAS,WAAW;IACpB,WAAW,KAAK,WAAW,IAAI;IAC/B,WAAW,KAAK;GAClB,OAAO;IACL,SAAS,SAAS,MAAM,KAAK,SAAS,CAAC;IACvC,IAAI,OACF,WAAW,IACN,WAAW,KAAgB,IAC3B,WAAW;IAClB,IAAI,SAAS,GACX,OAAO;IAET,IAAI,WAAW,GACb,WAAW,KAAK,WAAW;IAE7B,WAAW,KAAK,WAAW;IAC3B,WAAW,KAAK;IAChB,SAAS;GACX;EACF;EACA,IAAI,cAAc;EAClB,IAAI,SAAS,GACX,eAAe,KAAK,SAAS,MAAM;EAErC,IAAI,aAAa,IACf,KAAK,OAAO;EAEd,IAAI,YAAY;EAChB,IAAI,SAAS,GACX,aAAa,KAAK,SAAS,MAAM;EAEnC,IAAI,CAAC,WAAW;GACd,GAAG,QACA,GAAG,MAAM,UAAU,UACpB,KAAK,KAAK,GAAG,MAAM,OAAO,OAAiB;GAC7C,GAAG,QACA,GAAG,MAAM,UAAU,UACpB,KAAK,KAAK,GAAG,MAAM,OAAO,OAAiB;GAC7C,GAAG,QACA,GAAG,MAAM,UAAU,UACpB,KAAK,KAAK,GAAG,MAAM,OAAO,OAAiB;GAC7C,KAAK,OAAO;EACd;EACA,OAAO;GAAE;GAAW;GAAa;EAAO;CAC1C;;CAGA,eACE,KACA,OACA,MAOA;EACA,KAAK,aAAa;EAClB,MAAM,aAAa,CAAC,GAAG,KAAK,GAAG;EAC/B,MAAM,OAAO,IAAI,UAAU;EAC3B,IAAI,CAAC,KAAK,KAAK,KAAK,OAAO,IAAI,GAC7B,KAAK,qBAAqB;EAE5B,MAAM,KAAK,IAAI,SAAS,KAAK,SAAS,IAAI;EAC1C,MAAM,KAAK,IAAI,SAAS,KAAK,SAAS,IAAI;EAE1C,OAAO;GAAE;GAAM;GAAI,IAAA,IADJ,SAAS,KAAK,SAAS,IAClB;GAAG;GAAI;EAAW;CACxC;CAEA,QAAgB,YAA4B;EAC1C,KAAK,MAAM,WAAW,KAAI,UAAS,UAAU,CAAC;CAChD;;CAGA,UACE,KACA,YACA,KACA,OACA,MACA,SACQ;EACR,MAAM,OACJ,KAAK,gBAAgB,aAAa,MAAM,aAAa,KAAK;EAC5D,IAAI,KAAK;EACT,MAAM,SAAS,KAAK,SAAS,KAAK;EAClC,IAAI,SAAS;GACX,MAAM,QAAQ,KAAK,eAAe,KAAK,OAAO,IAAI;GAClD,KAAK,IAAI,QAAQ,SAAS,OAAO,SAAS,GAAG;IAC3C,MAAM,WAAW,KAAK,eACpB,MAAM,MACN,MAAM,IACN,MAAM,IACN,MAAM,IACN,MAAM,YACN,UAAU,CACZ;IACA,KAAK,KAAK,aAAa,IAAI,MAAM,UAAU,QAAQ,KAAK;GAC1D;GACA,IAAI,CAAC,MAAM,KAAK,MAAM,GACpB,KAAK,qBAAqB;GAE5B,KAAK,QAAQ,MAAM,UAAU;EAC/B;EACA,MAAM,aAAa,SAAS,KAAK;EACjC,IAAI,MAAM,YAAY,OAAO,EAAE,GAC7B,KAAK,kBAAkB;EAEzB,KAAK,aAAa,IAAI,UAAU;EAChC,MAAM;EACN,OAAO,KAAK;CACd;;CAGA,wBAAsC;EACpC,KAAK,UAAU;EACf,KAAK,SAAS;EACd,KAAK,cAAc;CACrB;;CAIA,eACE,KACA,YACA,KACA,OACA,MACA,SACQ;EACR,MAAM,OAAO,MAAM;EACnB,IAAI,KAAK;EACT,IAAI,eAAe,KAAK;EACxB,MAAM,YAAY,KAAK;EACvB,IAAI,SAAS;GACX,MAAM,QAAQ,KAAK,eAAe,KAAK,OAAO,IAAI;GAClD,IAAI,QAAQ;GACZ,IAAI,WAAqB;IAAE,WAAW;IAAG,aAAa;IAAG,QAAQ;GAAE;GACnE,IAAI,QAAQ;GACZ,OAAO,OAAO,SAAS,GAAG;IACxB,WAAW,KAAK,eACd,MAAM,MACN,MAAM,IACN,MAAM,IACN,MAAM,IACN,MAAM,YACN,UAAU,CACZ;IACA,IAAI,KAAK,SAAS,SAAS,YAAY,WAAW;KAChD,QAAQ;KACR;IACF;IACA,KAAK,KAAK,aAAa,IAAI,MAAM,UAAU,cAAc,IAAI;GAC/D;GACA,IAAI,SAAS,QAAQ,GAAG;IACtB,MAAM,cAAc,YAAY,KAAK;IACrC,IAAI,aAAa;KACf,IAAI,MAAM,aAAa,OAAO,EAAE,GAC9B,KAAK,kBAAkB;KAEzB,KAAK,aAAa,IAAI,WAAW;KACjC,SAAS,aAAa;KACtB,MAAM;IACR;IACA,KAAK,sBAAsB;IAC3B,eAAe;IACf,KAAK,KAAK,aAAa,IAAI,MAAM,UAAU,cAAc,KAAK;IAC9D,SAAS;GACX;GACA,OAAO,QAAQ,GAAG,SAAS,GAAG;IAC5B,MAAM,OAAO,KAAK,eAChB,MAAM,MACN,MAAM,IACN,MAAM,IACN,MAAM,IACN,MAAM,YACN,UAAU,CACZ;IACA,KAAK,KAAK,aAAa,IAAI,MAAM,MAAM,cAAc,KAAK;GAC5D;GACA,IAAI,CAAC,MAAM,KAAK,MAAM,GACpB,KAAK,qBAAqB;GAE5B,KAAK,QAAQ,MAAM,UAAU;EAC/B;EACA,IAAI,KAAK,gBAAgB,OAAO;GAC9B,MAAM,aAAa,eAAe,KAAK;GACvC,IAAI,MAAM,YAAY,OAAO,EAAE,GAC7B,KAAK,kBAAkB;GAEzB,KAAK,aAAa,IAAI,UAAU;GAChC,MAAM;GACN,KAAK,sBAAsB;GAC3B,eAAe;EACjB;EACA,MAAM,aAAa,eAAe,KAAK;EACvC,IAAI,MAAM,YAAY,OAAO,EAAE,GAC7B,KAAK,kBAAkB;EAEzB,KAAK,aAAa,IAAI,UAAU;EAChC,MAAM;EACN,OAAO,KAAK;CACd;;CAIA,cACE,KACA,YACA,KACA,OACA,MACA,OACQ;EACR,MAAM,OACJ,KAAK,gBAAgB,SAAS,KAAK,YAAY,MAAM;EACvD,IAAI,KAAK;EACT,IAAI,eAAe,KAAK;EACxB,MAAM,YAAY,KAAK;EACvB,MAAM,cAAc,aAA6B;GAC/C,IACE,KAAK,gBAAgB,SACrB,KAAK,SAAS,SAAS,YAAY,WACnC;IACA,MAAM,cAAc,YAAY,KAAK;IACrC,IAAI,aAAa;KACf,IAAI,MAAM,aAAa,OAAO,EAAE,GAC9B,KAAK,kBAAkB;KAEzB,KAAK,aAAa,IAAI,WAAW;KACjC,SAAS,aAAa;KACtB,MAAM;IACR;IACA,KAAK,sBAAsB;IAC3B,eAAe;IACf,KAAK,KAAK,aAAa,IAAI,MAAM,UAAU,cAAc,KAAK;IAC9D;GACF;GACA,KAAK,KAAK,aACR,IACA,MACA,UACA,cACA,KAAK,gBAAgB,KACvB;EACF;EACA,IAAI,OAAO;GACT,MAAM,SAAS;GACf,MAAM,YAAwB,CAAC;GAC/B,MAAM,aAAa,KAAK,IAAI,OAAO,MAAM;GACzC,MAAM,QAAQ,KAAK,eAAe,KAAK,OAAO,IAAI;GAClD,IAAI,QAAQ;GACZ,OAAO,QAAQ,YAAY,SAAS,GAClC,UAAU,SAAS,KAAK,eACtB,MAAM,MACN,MAAM,IACN,MAAM,IACN,MAAM,IACN,MAAM,YACN,UAAU,QAAQ,CACpB;GAEF,OAAO,QAAQ,OAAO,SAAS,GAAG;IAChC,MAAM,WAAW,KAAK,eACpB,MAAM,MACN,MAAM,IACN,MAAM,IACN,MAAM,IACN,MAAM,YACN,UAAU,QAAQ,CACpB;IACA,WAAW,UAAW,QAAQ,SAAU,EAAc;IACtD,UAAU,QAAQ,KAAK;GACzB;GACA,IAAI,CAAC,MAAM,KAAK,MAAM,GACpB,KAAK,qBAAqB;GAE5B,SAAS;GACT,OAAO,QAAQ,OAAO,SAAS,GAC7B,WAAW,UAAU,QAAQ,EAAc;GAE7C,KAAK,QAAQ,MAAM,UAAU;EAC/B;EACA,IAAI,KAAK,gBAAgB,OAAO;GAC9B,MAAM,aAAa,eAAe,KAAK;GACvC,IAAI,MAAM,YAAY,OAAO,EAAE,GAC7B,KAAK,kBAAkB;GAEzB,KAAK,aAAa,IAAI,UAAU;GAChC,MAAM;GACN,KAAK,UAAU;GACf,KAAK,SAAS;GACd,eAAe;EACjB;EACA,MAAM,aAAa,eAAe,KAAK;EACvC,IAAI,MAAM,YAAY,OAAO,EAAE,GAC7B,KAAK,kBAAkB;EAEzB,KAAK,aAAa,IAAI,UAAU;EAChC,MAAM;EACN,OAAO,KAAK;CACd;AACF;;;;;;AAUA,IAAa,mBAAb,MAA8B;;CAE5B,MAAM;;CAEN,SAAS;CAET,SAA0B,IAAI,WAAW;CAEzC,WAAW,MAAkB,YAAoB,KAAyB;EACxE,KAAK,SAAS;EACd,IAAI,KAAK,KACP,MAAM,IAAI,MAAM,0CAA0C;EAE5D,IAAI,KAAK,OAAO,QACd,OAAOA;EAET,MAAM,QAAe;GAAE;GAAM,KAAK;GAAG,MAAM,KAAK;EAAO;EACvD,MAAM,MAAM,IAAIC,SAAO;EACvB,IAAI,SAAS;EACb,MAAM,cAAc,SAAuB;GACzC,IAAI,MAAM;GACV,IAAI,QAAQ;GACZ,IAAI,OAAO,KAAK,IAAI,MAAM,MAAM,IAAI,IAAI;EAC1C;EACA,WAAW,kBAAkB,EAAY;EACzC,IAAI;GACF,SAAS;IACP,MAAM,SAAS,KAAK,OAAO,iBAAiB,OAAO,GAAG;IACtD,IAAI,KAAK,OAAO,QACd;IAEF,IAAI,WAAW,GAAG;KAChB,KAAK,MAAM;KACX;IACF;IACA,IAAI,IAAI,OAAO,IAAI,MAAM;KACvB,IAAI,IAAI,OAAO,IAAI,SAAS,IAAI,QAAQ,KAAK;MAC3C,KAAK,SAAS;MACd;KACF;KACA,UAAU;KACV,WACE,kBACE,KAAK,IAAI,QAAQ,kBAAkB,SAAS,CAAC,EAEjD;IACF,OAAO,IAAI,MAAM,QAAQ,MAAM,MAC7B;GAEJ;EACF,SAAS,OAAO;GACd,IAAI,iBAAiB,MACnB,MAAM,IAAI,UACR,wCAAwC,YAAY,MAAM,OAC5D;GAEF,MAAM;EACR;EACA,IAAI,IAAI,WACN,KAAK,SAAS;EAEhB,MAAM,SAAS,IAAI,WAAW,IAAI,IAAI;EACtC,IAAI,SAAS;EACb,KAAK,MAAM,SAAS,IAAI,QAAQ;GAC9B,OAAO,IAAI,OAAO,MAAM;GACxB,UAAU,MAAM;EAClB;EACA,OAAO;CACT;AACF;;;ACtwHA,IAAa,aAAb,cAAgC,MAAM;CACpC,OAAgB;AAClB;;AAGA,IAAa,sBAAb,cAAyC,MAAM;CAC7C,OAAgB;AAClB;;AAGA,IAAa,iBAAb,cAAoC,MAAM;CACxC,OAAgB;AAClB;;AAGA,IAAa,aAAb,cAAgC,MAAM;CACpC,OAAgB;AAClB;;AAGA,IAAa,YAAb,cAA+B,MAAM;CACnC,OAAgB;AAClB;;AAGA,IAAM,eAAN,cAA2B,MAAM;CAC/B,OAAgB;AAClB;;AAGA,IAAM,kBAAN,cAA8B,MAAM;CAClC,OAAgB;AAClB;;AAGA,IAAM,eAAN,cAA2B,MAAM;CAC/B,OAAgB;AAClB;AAEA,MAAM,YAAY,MAAM,MAAM;;AAG9B,IAAM,UAAN,MAAc;CACZ,WAAmB;CACnB;CAEA,YAAY,MAAkB;EAC5B,KAAK,OAAO;CACd;CAEA,IAAI,OAAe;EACjB,OAAO,OAAO,KAAK,KAAK,MAAM;CAChC;CAEA,KAAK,QAAgB,SAAgB,GAAW;EAC9C,IAAI,SAAS,aAAa,SAAS,CAAC,YAAY,IAC9C,MAAM,IAAI,gBAAgB,8CAA8C;EAE1E,IAAI,SAAS,MAAM,WAAW,GAC5B,MAAM,IAAI,aAAa,uBAAuB,QAAQ;EAExD,MAAM,WAAW,WAAW,IAAI,SAAS,KAAK,OAAO;EACrD,KAAK,WAAW,WAAW,KAAK,KAAK;EACrC,OAAO,KAAK;CACd;CAEA,OAAe;EACb,OAAO,KAAK;CACd;;CAGA,KAAK,OAAoC;EACvC,MAAM,SAAS,OAAO,KAAK;EAC3B,IAAI,SAAS,WACX,MAAM,IAAI,gBAAgB,8CAA8C;EAE1E,IAAI,KAAK,YAAY,KAAK,MACxB,uBAAO,IAAI,WAAW,CAAC;EAEzB,MAAM,YAAY,KAAK,OAAO,KAAK;EACnC,MAAM,SAAS,SAAS,MAAM,SAAS,YAAY,YAAY;EAC/D,MAAM,QAAQ,OAAO,KAAK,QAAQ;EAClC,KAAK,YAAY;EACjB,OAAO,KAAK,KAAK,SAAS,OAAO,QAAQ,OAAO,MAAM,CAAC;CACzD;AACF;AAEA,SAAS,WAAW,MAAkB,QAAwB;CAC5D,OAAQ,KAAK,UAAuB,KAAK,SAAS,MAAiB;AACrE;AAEA,SAAS,WAAW,MAAkB,QAAwB;CAC5D,QACG,WAAW,MAAM,MAAM,IAAK,WAAW,MAAM,SAAS,CAAC,KAAK,QAAS;AAE1E;AAEA,SAAS,WAAW,MAAkB,QAAwB;CAC5D,OACE,OAAO,WAAW,MAAM,MAAM,CAAC,IAC9B,OAAO,WAAW,MAAM,SAAS,CAAC,CAAC,KAAK;AAE7C;AAEA,SAAS,aACP,MACA,QACA,WACS;CACT,OAAO,UAAU,OAAO,MAAM,UAAU,KAAK,SAAS,WAAW,IAAI;AACvE;AAEA,MAAM,qBAAqB;CAAC;CAAM;CAAM;CAAM;AAAI;AAClD,MAAM,qBAAqB;CAAC;CAAM;CAAM;CAAM;AAAI;AAClD,MAAM,qBAAqB;CAAC;CAAM;CAAM;CAAM;AAAI;AAClD,MAAM,+BAA+B;CAAC;CAAM;CAAM;CAAM;AAAI;AAC5D,MAAM,uBAAuB;CAAC;CAAM;CAAM;CAAM;AAAI;AACpD,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AACzB,MAAM,mBAAmB;AACzB,MAAM,8BAA8B;AACpC,MAAM,sBAAsB;AAC5B,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAE5B,MAAM,iBAAiB;AACvB,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,oBAAoB;AAE1B,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,gBAAgB;AAEtB,MAAM,aAAa;AACnB,MAAM,aAAa;AAYnB,SAAS,gBAAgB,MAAkB,UAA6B;CACtE,OAAO;EACL,YAAY,WAAW,MAAM,CAAC;EAC9B,WAAW,WAAW,MAAM,CAAC;EAC7B;EACA,QAAQ,OAAO,WAAW,MAAM,EAAE,CAAC;EACnC,MAAM,OAAO,WAAW,MAAM,EAAE,CAAC;CACnC;AACF;;AAGA,SAAS,aACP,MACA,UACA,QACW;CACX,IAAI,SAAS,WAAW,OAAO,2BAA2B;CAC1D,IAAI,SAAS,IACX,OAAO;CAET,KAAK,KAAK,MAAM;CAChB,IAAI,OAAO,KAAK,KAAK,2BAA2B;CAChD,IAAI,KAAK,WAAW,6BAClB,MAAM,IAAI,UAAU,mBAAmB;CAEzC,IAAI,CAAC,aAAa,MAAM,GAAG,4BAA4B,GACrD,OAAO;CAET,MAAM,aAAa,WAAW,MAAM,CAAC;CACrC,MAAM,iBAAiB,WAAW,MAAM,CAAC;CACzC,MAAM,QAAQ,WAAW,MAAM,EAAE;CACjC,IAAI,eAAe,KAAK,QAAQ,GAC9B,MAAM,IAAI,WAAW,qDAAqD;CAE5E,UAAU,OAAO,mBAAmB;CACpC,IAAI,iBAAiB,QACnB,MAAM,IAAI,WAAW,gDAAgD;CAEvE,KAAK,KAAK,cAAc;CACxB,IAAI,YAAY,SAAS;CACzB,OAAO,KAAK,KAAK,mBAAmB;CACpC,IAAI,KAAK,WAAW,qBAClB,MAAM,IAAI,UAAU,mBAAmB;CAEzC,IACE,CAAC,aAAa,MAAM,GAAG,oBAAoB,KAC3C,mBAAmB,QACnB;EAEA,KAAK,KAAK,MAAM;EAChB,YAAY;EACZ,OAAO,KAAK,KAAK,mBAAmB;EACpC,IAAI,KAAK,WAAW,qBAClB,MAAM,IAAI,UAAU,mBAAmB;CAE3C;CACA,IAAI,CAAC,aAAa,MAAM,GAAG,oBAAoB,GAC7C,MAAM,IAAI,WAAW,iDAAiD;CAExE,MAAM,aAAa,WAAW,MAAM,CAAC;CACrC,MAAM,gBAAgB,WAAW,MAAM,EAAE;CACzC,MAAM,kBAAkB,WAAW,MAAM,EAAE;CAC3C,IACE,kBAAkB,kBAAkB,kBACpC,aAAa,QAAQ,OAAO,mBAAmB,IAAI,WAEnD,MAAM,IAAI,WAAW,+CAA+C;CAEtE,OAAO;EACL,YAAY,WAAW,MAAM,EAAE;EAC/B,WAAW,WAAW,MAAM,EAAE;EAC9B,UAAU,SAAS;EACnB,QAAQ;EACR,MAAM;CACR;AACF;;AAGA,SAAS,WAAW,MAAiC;CACnD,MAAM,WAAW,KAAK,KAAK,IAAI,CAAC;CAChC,KAAK,KAAK,OAAO,GAAkB,GAAG,CAAC;CACvC,IAAI,OAAO,KAAK,KAAK,iBAAiB;CACtC,IACE,KAAK,WAAW,qBAChB,aAAa,MAAM,GAAG,kBAAkB,KACxC,KAAK,QAAQ,KACb,KAAK,QAAQ,GACb;EACA,MAAM,WAAW,WAAW,OAAO,iBAAiB;EACpD,OAAO,aAAa,MAAM,UAAU,gBAAgB,MAAM,QAAQ,CAAC;CACrE;CACA,MAAM,kBAAkB,KAAK,IAC3B,OAAO,QAAQ,IAAI,kBAAkB,mBACrC,CACF;CACA,KAAK,KAAK,OAAO,eAAe,CAAC;CACjC,OAAO,KAAK,KAAK,KAAmC;CACpD,MAAM,QAAQ,YAAY,MAAM,kBAAkB;CAClD,IAAI,QAAQ,GACV,OAAO;CAET,MAAM,SAAS,KAAK,SAAS,OAAO,QAAQ,iBAAiB;CAC7D,IAAI,OAAO,WAAW,mBAEpB,OAAO;CAET,MAAM,WAAW,OAAO,kBAAkB,KAAK;CAC/C,OAAO,aAAa,MAAM,UAAU,gBAAgB,QAAQ,QAAQ,CAAC;AACvE;AAEA,SAAS,YAAY,MAAkB,QAAmC;CACxE,KAAK,IAAI,QAAQ,KAAK,SAAS,OAAO,QAAQ,SAAS,GAAG,SAAS,GACjE,IAAI,aAAa,MAAM,OAAO,MAAM,GAClC,OAAO;CAGX,OAAO;AACT;;AAGA,SAAgB,YAAY,MAA0B;CACpD,MAAM,QAAQ,KAAK,SAAS,EAAI,KAAK,CAAC,KAAK,SAAS,EAAI,IAAI,OAAM;CAClE,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,MACjB,IAAI,SAAS,IACX,QAAQ;MACH,IAAI,SAAS,MAAM,WAAW,CAAC,GACpC,QAAQ,KAAK;MACR,IAAI,SAAS,GAClB,QAAQ;MACH,IAAI,SAAS,IAClB,QAAQ;MACH,IAAI,SAAS,IAClB,QAAQ;MACH,IAAI,OAAO,MAAQ,QAAQ,KAChC,QAAQ,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;MAE/C,QAAQ,OAAO,aAAa,IAAI;CAGpC,OAAO,IAAI,QAAQ,OAAO;AAC5B;;AAGA,SAAS,iBAAiB,UAA0B;CAClD,MAAM,MAAM,SAAS,QAAQ,IAAI;CACjC,OAAO,OAAO,IAAI,SAAS,MAAM,GAAG,GAAG,IAAI;AAC7C;;AAiBA,SAAS,YAAY,MAAe,aAA2B;CAC7D,IAAI,QAAQ,KAAK;CACjB,OAAO,MAAM,UAAU,GAAG;EACxB,MAAM,OAAO,WAAW,OAAO,CAAC;EAChC,MAAM,SAAS,WAAW,OAAO,CAAC;EAClC,IAAI,SAAS,IAAI,MAAM,QACrB,MAAM,IAAI,WACR,uBAAuB,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,SAAS,OAAO,EAC5E;EAEF,MAAM,OAAO,MAAM,SAAS,GAAG,SAAS,CAAC;EACzC,IAAI,SAAS,GACX,iBAAiB,MAAM,IAAI;OACtB,IAAI,SAAS,OAClB,uBAAuB,MAAM,MAAM,WAAW;EAEhD,QAAQ,MAAM,SAAS,SAAS,CAAC;CACnC;AACF;AAEA,SAAS,iBAAiB,MAAe,OAAyB;CAChE,IAAI,OAAO;CACX,MAAM,QAAQ,SAAyB;EACrC,IAAI,KAAK,SAAS,GAChB,MAAM,IAAI,WAAW,8BAA8B,KAAK,YAAY;EAEtE,MAAM,QAAQ,WAAW,MAAM,CAAC;EAChC,OAAO,KAAK,SAAS,CAAC;EACtB,OAAO;CACT;CACA,IAAI,KAAK,aAAa,cAAc,KAAK,aAAa,YACpD,KAAK,WAAW,KAAK,WAAW;CAElC,IAAI,KAAK,iBAAiB,YACxB,KAAK,eAAe,KAAK,eAAe;CAE1C,IAAI,KAAK,iBAAiB,YACxB,KAAK,eAAe,KAAK,eAAe;AAE5C;AAEA,SAAS,uBACP,MACA,MACA,aACM;CACN,IAAI,KAAK,SAAS,GAChB,MAAM,IAAI,WAAW,2CAA2C;CAElE,IAAI,KAAK,OAAO,KAAK,WAAW,MAAM,CAAC,MAAM,aAC3C;CAEF,IAAI;CACJ,IAAI;EACF,OAAO,SAAS,KAAK,SAAS,CAAC,GAAG,OAAO;CAC3C,QAAQ;EACN,MAAM,IAAI,WACR,gEACF;CACF;CAEA,IAAI,SAAS,IACX,KAAK,WAAW,iBAAiB,IAAI;AAEzC;;AAGA,SAAS,gBAAgB,MAGvB;CACA,MAAM,SAAS,WAAW,IAAI;CAC9B,IAAI,WAAW,MACb,MAAM,IAAI,WAAW,wBAAwB;CAE/C,MAAM,SAAS,OAAO,WAAW,OAAO,OAAO,OAAO;CACtD,MAAM,WAAW,OAAO,SAAS;CACjC,IAAI,WAAW,IACb,MAAM,IAAI,WAAW,kCAAkC;CAEzD,KAAK,KAAK,QAAQ;CAClB,MAAM,YAAY,IAAI,QAAQ,KAAK,KAAK,OAAO,IAAI,CAAC;CACpD,MAAM,WAAsB,CAAC;CAC7B,MAAM,6BAAa,IAAI,IAAqB;CAC5C,IAAI,QAAQ;CACZ,OAAO,QAAQ,OAAO,MAAM;EAC1B,MAAM,UAAU,UAAU,KAAK,gBAAgB;EAC/C,IAAI,QAAQ,WAAW,kBACrB,MAAM,IAAI,WAAW,6BAA6B;EAEpD,IAAI,CAAC,aAAa,SAAS,GAAG,kBAAkB,GAC9C,MAAM,IAAI,WAAW,wCAAwC;EAE/D,MAAM,iBAAiB,WAAW,SAAS,EAAE;EAC7C,MAAM,cAAc,WAAW,SAAS,EAAE;EAC1C,MAAM,gBAAgB,WAAW,SAAS,EAAE;EAC5C,MAAM,cAAc,UAAU,KAAK,cAAc;EACjD,MAAM,cAAc,YAAY,GAAG,WAAW;EAC9C,MAAM,WAAW,WAAW,SAAS,CAAC;EACtC,MAAM,WAAW,SACf,aACA,WAAW,oBAAoB,UAAU,OAC3C;EACA,MAAM,QAAQ,UAAU,KAAK,WAAW;EACxC,UAAU,KAAK,aAAa;EAC5B,MAAM,OAAgB;GACpB,cAAc,OAAO,WAAW,SAAS,EAAE,CAAC;GAC5C,cAAc,WAAW,SAAS,EAAE;GACpC,KAAK,WAAW,SAAS,EAAE;GAC3B,WAAW;GACX;GACA,UAAU,OAAO,WAAW,SAAS,EAAE,CAAC;GACxC,UAAU,iBAAiB,QAAQ;GACnC;GACA,cAAc,OAAO,WAAW,SAAS,EAAE,CAAC;GAC5C,cAAc;EAChB;EACA,MAAM,iBAAiB,QAAQ;EAC/B,IAAI,iBAAiB,qBACnB,MAAM,IAAI,oBACR,oBAAoB,KAAK,MAAM,iBAAiB,EAAE,EAAE,GAAG,iBAAiB,IAC1E;EAEF,YAAY,MAAM,WAAW;EAC7B,KAAK,gBAAgB;EACrB,SAAS,KAAK,IAAI;EAClB,WAAW,IAAI,KAAK,UAAU,IAAI;EAClC,SACE,OAAO,gBAAgB,IACvB,OAAO,iBAAiB,cAAc,aAAa;CACvD;CAEA,MAAM,SAAS,SAAS,UAAU,GAAG,MACnC,EAAE,eAAe,EAAE,eACf,KACA,OAAO,EAAE,eAAe,EAAE,YAAY,CAC5C;CACA,IAAI,YAAY;CAChB,KAAK,MAAM,QAAQ,OAAO,WAAW,GAAG;EACtC,KAAK,YAAY;EACjB,YAAY,KAAK;CACnB;CACA,OAAO;EAAE;EAAU;CAAW;AAChC;;AAGA,IAAM,aAAN,MAAiB;CACf;CACA;CAEA,YAAY,MAAe,UAAkB;EAC3C,KAAK,OAAO;EACZ,KAAK,WAAW;CAClB;CAEA,OAAe;EACb,OAAO,KAAK;CACd;;CAGA,KAAK,QAAsB;EACzB,KAAK,KAAK,KAAK,KAAK,WAAW,OAAO,MAAM,CAAC;EAC7C,KAAK,WAAW,KAAK,KAAK,KAAK;CACjC;CAEA,KAAK,OAAoC;EACvC,KAAK,KAAK,KAAK,KAAK,QAAQ;EAC5B,MAAM,OAAO,KAAK,KAAK,KAAK,KAAK;EACjC,KAAK,WAAW,KAAK,KAAK,KAAK;EAC/B,OAAO;CACT;AACF;AAYA,IAAM,sBAAN,MAAwD;CACtD,OAAwB,IAAI,iBAAiB,GAAG;CAEhD,IAAI,MAAe;EACjB,OAAO,KAAK,KAAK;CACnB;CAEA,IAAI,iBAA6B;EAC/B,OAAO,KAAK,KAAK;CACnB;CAEA,WAAW,MAAkB,WAA+B;EAC1D,OAAO,KAAK,KAAK,WAAW,MAAM,SAAS;CAC7C;CAEA,QAAoB;EAClB,OAAO,KAAK,KAAK,MAAM;CACzB;AACF;;AAGA,SAAS,gBAAgB,cAAiD;CACxE,QAAQ,cAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,cACH,OAAO,IAAI,oBAAoB;EACjC,KAAK,WACH,OAAO,IAAI,gBAAgB;EAC7B,KAAK,UACH,OAAO,IAAI,oBAAoB;EACjC,KAAK,eACH,OAAO,IAAI,iBAAiB;EAC9B,SACE,MAAM,IAAI,oBAAoB,0CAA0C;CAC5E;AACF;AAEA,SAASC,cAAY,OAAmB,QAAgC;CACtE,IAAI,MAAM,WAAW,GACnB,OAAO;CAET,IAAI,OAAO,WAAW,GACpB,OAAO;CAET,MAAM,SAAS,IAAI,WAAW,MAAM,SAAS,OAAO,MAAM;CAC1D,OAAO,IAAI,KAAK;CAChB,OAAO,IAAI,QAAQ,MAAM,MAAM;CAC/B,OAAO;AACT;AAEA,MAAM,gBAAgB;;AAGtB,IAAM,aAAN,MAAiB;CACf;CACA;CACA;CACA,MAAc;CACd,aAAqB;;CAErB,aAAqB;CAErB;CACA;CAEA,YAAY,MAAkB,MAAe;EAC3C,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK,eAAe,KAAK;EACzB,KAAK,OAAO,KAAK;EACjB,KAAK,eAAe,gBAAgB,KAAK,YAAY;CACvD;;CAGA,KAAK,OAA2B;EAC9B,MAAM,SAAuB,CAAC;EAC9B,IAAI,SAAS;EACb,IAAI,SAAS;EACb,OAAO,SAAS,KAAK,CAAC,KAAK,KAAK;GAC9B,MAAM,OAAO,KAAK,MAAM,MAAM;GAC9B,IAAI,SAAS,KAAK,QAAQ;IACxB,OAAO,KAAK,KAAK,SAAS,GAAG,MAAM,CAAC;IACpC,UAAU;IACV;GACF;GACA,OAAO,KAAK,IAAI;GAChB,UAAU,KAAK;GACf,UAAU,KAAK;EACjB;EACA,IAAI,OAAO,WAAW,GACpB,OAAO,OAAO;EAEhB,MAAM,SAAS,IAAI,WAAW,MAAM;EACpC,IAAI,SAAS;EACb,KAAK,MAAM,SAAS,QAAQ;GAC1B,OAAO,IAAI,OAAO,MAAM;GACxB,UAAU,MAAM;EAClB;EACA,OAAO;CACT;;CAGA,MAAc,OAA2B;EACvC,IAAI,KAAK,OAAO,SAAS,GACvB,uBAAO,IAAI,WAAW,CAAC;EAEzB,MAAM,eAAe,KAAK;EAC1B,IAAI;EACJ,IAAI,iBAAiB,MAAM;GACzB,OAAO,KAAK,MAAM,KAAK;GACvB,KAAK,MAAM,KAAK,gBAAgB;EAClC,OAAO,IAAI,KAAK,KAAK,iBAAiB,cAAc;GAClD,OAAO,aAAa,kCAAkB,IAAI,WAAW,CAAC;GACtD,IAAI,QAAQ,KAAK,QACf,OAAOA,cAAY,MAAM,KAAK,MAAM,QAAQ,KAAK,MAAM,CAAC;GAE1D,MAAM,YAAY,KAAK,IAAI,OAAO,aAAa;GAC/C,OAAO,aAAa,WAAW,MAAM,WAAW,SAAS;GACzD,KAAK,MACH,aAAa,OACZ,KAAK,gBAAgB,OACnB,aAAa,gBAAgB,UAAU,OAAO;GACnD,IAAI,KAAK,OAAO,aAAa,UAAU,KAAA,GACrC,OAAOA,cAAY,MAAM,aAAa,MAAM,CAAC;EAEjD,OAAO;GACL,OAAO,KAAK,MAAM,KAAK;GAGvB,OAAO,aAAa,WAAW,MAAM,GAAG,KAAK;GAC7C,KAAK,MAAM,aAAa,OAAO,KAAK,gBAAgB;GACpD,IAAI,aAAa,WAAW,MAC1B,KAAK,aAAa;EAEtB;EACA,IAAI,OAAO,KAAK,MAAM,IAAI,KAAK,MAC7B,OAAO,KAAK,SAAS,GAAG,OAAO,KAAK,IAAI,CAAC;EAE3C,KAAK,QAAQ,OAAO,KAAK,MAAM;EAC/B,IAAI,KAAK,QAAQ,IAAI;GACnB,KAAK,MAAM;GACX,KAAK,aAAa;EACpB;EACA,KAAK,UAAU,IAAI;EACnB,OAAO;CACT;;CAGA,MAAc,OAA2B;EACvC,IAAI,KAAK,gBAAgB,IACvB,uBAAO,IAAI,WAAW,CAAC;EAEzB,IAAI,SAAS,OAAO,KAAK,IAAI,OAAO,aAAa,CAAC;EAClD,IAAI,SAAS,KAAK,cAChB,SAAS,KAAK;EAEhB,MAAM,OAAO,KAAK,KAAK,KAAK,MAAM;EAClC,KAAK,gBAAgB,OAAO,KAAK,MAAM;EACvC,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,WAAW,EAAE;EAEzB,OAAO;CACT;;CAGA,UAAkB,MAAwB;EACxC,KAAK,aAAa,YAAY,KAAK,YAAY,IAAI;EACnD,IAAI,KAAK,OAAO,CAAC,KAAK,cAAc,KAAK,eAAe,KAAK,KAAK,KAChE,MAAM,IAAI,WAAW,uBAAuBC,SAAO,KAAK,KAAK,QAAQ,GAAG;CAE5E;AACF;;AAGA,SAAS,WAAW,MAAe,MAAe,MAA0B;CAC1E,MAAM,SAAS,IAAI,WAAW,MAAM,KAAK,YAAY;CACrD,MAAM,SAAS,OAAO,KAAK,gBAAgB;CAC3C,IAAI,OAAO,WAAW,kBACpB,MAAM,IAAI,WAAW,uBAAuB;CAE9C,IAAI,CAAC,aAAa,QAAQ,GAAG,kBAAkB,GAC7C,MAAM,IAAI,WAAW,kCAAkC;CAEzD,MAAM,aAAa,OAAO,KAAK,WAAW,QAAQ,EAAE,CAAC;CACrD,MAAM,oBAAoB,WAAW,QAAQ,EAAE;CAC/C,IAAI,mBACF,OAAO,KAAK,iBAAiB;CAE/B,IAAI,KAAK,WAAW,uBAClB,MAAM,IAAI,oBAAoB,sCAAsC;CAEtE,IAAI,KAAK,WAAW,wBAClB,MAAM,IAAI,oBAAoB,gCAAgC;CAMhE,IAJuB,SACrB,YACA,WAAW,QAAQ,CAAC,IAAI,oBAAoB,UAAU,OAEvC,MAAM,KAAK,cAC1B,MAAM,IAAI,WACR,0BAA0BA,SAAO,KAAK,YAAY,EAAE,cAAc,YAAY,UAAU,EAAE,SAC5F;CAEF,IACE,KAAK,cAAc,QACnB,OAAO,KAAK,IAAI,KAAK,eAAe,KAAK,aAEzC,KAAK,cAAc,KAAK,cAExB,MAAM,IAAI,WACR,uBAAuBA,SAAO,KAAK,YAAY,EAAE,qBACnD;CAEF,IAAI,KAAK,WAAW,gBAClB,MAAM,IAAI,eACR,QAAQA,SAAO,IAAI,EAAE,gDACvB;CAEF,OAAO,IAAI,WAAW,QAAQ,IAAI;AACpC;;;;;;;;;;;;AAaA,SAAgB,mBACd,MACA,OACY;CACZ,MAAM,OAAO,IAAI,QAAQ,IAAI;CAC7B,MAAM,EAAE,UAAU,eAAe,gBAAgB,IAAI;CACrD,MAAM,QAAQ,SAAS;CACvB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,aAAa,yBAAyB;CAElD,MAAM,OAAO,WAAW,IAAI,MAAM,QAAQ;CAE1C,OADe,WAAW,MAAM,MAAM,MAAM,QAChC,CAAC,CAAC,KACZ,OAAO,UAAU,WAAW,QAAQ,MAAM,KAAK,YAAY,CAC7D;AACF;;AAGA,MAAa,mCAAgD,IAAI,IAAI;CACnE,CAAC,WAAW,OAAO;CACnB,CAAC,UAAU,MAAM;CACjB,CAAC,eAAe,WAAW;AAC7B,CAAC;;AChwBD,MAAM,SAAS,IAAI,YAAY,SAAS;CAAE,OAAO;CAAM,WAAW;AAAK,CAAC;AACxE,MAAM,UAAU,IAAI,YAAY,SAAS,EAAE,WAAW,KAAK,CAAC;;AAG5D,SAAS,eAAe,OAAmB,OAAuB;CAChE,MAAM,QAAQ,MAAM,UAAU;CAC9B,IAAI,QAAQ,KACV,OAAO;CAET,IAAI;CACJ,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACZ,IAAI,SAAS,OAAQ,SAAS,KAC5B,SAAS;MACJ,IAAI,SAAS,OAAQ,SAAS,KAAM;EACzC,SAAS;EACT,IAAI,UAAU,KACZ,QAAQ;OACH,IAAI,UAAU,KACnB,QAAQ;CAEZ,OAAO,IAAI,SAAS,OAAQ,SAAS,KAAM;EACzC,SAAS;EACT,IAAI,UAAU,KACZ,QAAQ;OACH,IAAI,UAAU,KACnB,QAAQ;CAEZ,OACE,OAAO;CAET,KAAK,IAAI,SAAS,GAAG,SAAS,QAAQ,UAAU,GAAG;EACjD,MAAM,OAAO,MAAM,QAAQ;EAC3B,IAAI,SAAS,KAAA,GACX,OAAO;EAIT,IAAI,QAFQ,WAAW,IAAI,QAAQ,QAEjB,QADN,WAAW,IAAI,QAAQ,MAEjC,OAAO;CAEX;CACA,OAAO;AACT;;AAGA,SAAgB,WACd,OACA,SAAuB,UACf;CACR,IAAI,WAAW,UACb,OAAO,OAAO,OAAO,KAAK;CAE5B,IAAI,WAAW,WACb,OAAO,QAAQ,OAAO,KAAK;CAE7B,IAAI;EACF,OAAO,OAAO,OAAO,KAAK;CAC5B,QAAQ,CAER;CAIA,MAAM,OAAO,IAAI,WAAW,MAAM,MAAM;CACxC,IAAI,aAAa;CACjB,IAAI,QAAQ;CACZ,OAAO,QAAQ,MAAM,QAAQ;EAC3B,MAAM,SAAS,eAAe,OAAO,KAAK;EAC1C,KAAK,IAAI,SAAS,GAAG,SAAS,QAAQ,UAAU,GAAG;GACjD,KAAK,cAAc,MAAM,QAAQ,WAAW;GAC5C,cAAc;EAChB;EACA,SAAS,KAAK,IAAI,QAAQ,CAAC;CAC7B;CACA,OAAO,OAAO,OAAO,KAAK,SAAS,GAAG,UAAU,CAAC;AACnD;;;ACxDA,MAAa,+BAAuC;;;;;;;;;AAUpD,MAAa,mCAA2C;AAExD,MAAM,cAAc;;;;;;AAwBpB,SAAS,mBAAmB,MAAiC;CAC3D,IAAI,CAAC,YAAY,KAAK,IAAI,GACxB,OAAO;CAET,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE;CACpC,MAAM,UAAU,KAAK,SAAS,KAAK;CACnC,MAAM,YAAY,KAAK,SAAS;CAChC,IAAI,cAAc,GAChB,OAAO;CAET,IAAI,cAAc,KAAK,UAAU,IAAI,WACnC,OAAO;CAET,OAAO,IAAI,WAAW,OAAO,KAAK,MAAM,QAAQ,CAAC;AACnD;AAEA,SAAS,WAAW,OAA4B;CAC9C,OAAO,IAAI,YAAY,mCAAmC,MAAM,YAAY;AAC9E;AAEA,SAASC,cAAY,OAAmB,QAAgC;CACtE,IAAI,OAAO,WAAW,GACpB,OAAO;CAET,MAAM,SAAS,IAAI,WAAW,MAAM,SAAS,OAAO,MAAM;CAC1D,OAAO,IAAI,KAAK;CAChB,OAAO,IAAI,QAAQ,MAAM,MAAM;CAC/B,OAAO;AACT;;;;;;;AAQA,SAAgB,sBACd,MACA,QAAgB,8BACJ;CACZ,MAAM,eAAe,IAAI,iBAAiB,EAAE;CAC5C,MAAM,eAAe,aAAa,WAAW,MAAM,QAAQ,CAAC;CAC5D,IAAI,aAAa,SAAS,OACxB,MAAM,WAAW,KAAK;CAIxB,MAAM,SAASA,cAAY,cAAc,aAAa,MAAM,CAAC;CAC7D,IAAI,CAAC,aAAa,KAChB,MAAM,IAAI,YAAY,qCAAqC;CAE7D,OAAO;AACT;;;;;AAYA,SAAS,cAAc,MAAkB,QAA4B;CACnE,MAAM,SAAS;EAAE,OAAO,OAAO;EAAO,OAAO;CAAG;CAChD,MAAM,SAAS,mBAAmB,OAAM,iBAAgB;EACtD,MAAM,QAAQ,iBAAiB,IAAI,YAAY;EAC/C,IAAI,UAAU,KAAA,KAAa,OAAO,iBAAiB,OAAO,OAAO;GAC/D,OAAO,QAAQ,OAAO;GACtB,OAAO,QAAQ;EACjB;EACA,OAAO,OAAO,QAAQ;CACxB,CAAC;CACD,IAAI,OAAO,SAAS,OAAO,OAAO;EAChC,IAAI,OAAO,OACT,MAAM,IAAI,YACR,gBAAgB,OAAO,MAAM,sBAAsB,OAAO,MAAM,sDAClE;EAEF,MAAM,WAAW,OAAO,KAAK;CAC/B;CACA,OAAO;AACT;AAEA,SAAS,iBAAiB,MAAkB,QAAwB;CAClE,MAAM,EAAE,UAAU;CAClB,IAAI,WAAW,MAAM,SAAS,GAAG;EAC/B,MAAM,SAAS,cAAc,MAAM,MAAM;EACzC,OAAO,iBAAiB,OAAO,MAAM;EACrC,OAAO,WAAW,QAAQ,QAAQ;CACpC;CACA,IAAI,WAAW,MAAM,UAAU,GAAG;EAChC,MAAM,eAAe,sBAAsB,MAAM,KAAK;EACtD,OAAO,iBAAiB,aAAa,MAAM;EAC3C,OAAO,WAAW,cAAc,QAAQ;CAC1C;CACA,IACE,WAAW,MAAM,SAAS,KAC1B,WAAW,MAAM,aAAa,KAC9B,WAAW,MAAM,UAAU,GAE3B,OAAO,WAAW,MAAM,QAAQ;CAElC,MAAM,IAAI,YAAY,0CAA0C;AAClE;AAEA,SAAS,eAAe,OAA6B;CACnD,OAAO,IAAI,YACT,yBAAyBC,YAAU,KAAK,IAAI,UAAU,KAAK,KAC3D,EAAE,OAAO,MAAM,CACjB;AACF;;;;;;AAOA,SAAgB,cACd,SACA,UAA0B,CAAC,GACnB;CACR,MAAM,SAAiB;EACrB,OAAO,QAAQ,uBAAA;EACf,gBACE,QAAQ,oBAAA;EACV,gBAAgB,QAAQ;CAC1B;CACA,IAAI;CACJ,IAAI,OAAO,YAAY,UAAU;EAC/B,MAAM,UAAU,mBAAmB,QAAQ,WAAW,YAAY,EAAE,CAAC;EACrE,IAAI,YAAY,MACd,OAAO;EAET,OAAO;CACT,OACE,OAAO,mBAAmB,aAAa,UAAU,IAAI,WAAW,OAAO;CAEzE,IAAI;EACF,OAAO,iBAAiB,MAAM,MAAM;CACtC,SAAS,OAAO;EACd,MAAM,eAAe,KAAK;CAC5B;AACF;;AAOA,eAAe,YACb,QACA,OACiB;CACjB,MAAM,SAAuB,CAAC;CAC9B,IAAI,OAAO;CACX,WAAW,MAAM,SAAS,QAA8C;EACtE,IAAI,OAAO,UAAU,UACnB,MAAM,IAAI,YAAY,iDAAiD;EAEzE,QAAQ,MAAM;EACd,IAAI,QAAQ,KAAK,OAAO,OACtB,MAAM,IAAI,YAAY,4BAA4B,MAAM,YAAY;EAEtE,OAAO,KAAK,KAAK;CACnB;CACA,OAAO,OAAO,OAAO,MAAM;AAC7B;;;;;AAMA,eAAsB,wBACpB,QACA,UAA0B,CAAC,GACV;CACjB,IAAI;CACJ,IAAI;EACF,OAAO,MAAM,YACX,QACA,QAAQ,gBAAA,SACV;CACF,SAAS,OAAO;EACd,MAAM,eAAe,KAAK;CAC5B;CACA,OAAO,cAAc,MAAM,OAAO;AACpC;;AAGA,eAAsB,0BACpB,UACA,UAA0B,CAAC,GACV;CACjB,IAAI;CACJ,IAAI;EACF,OAAO,MAAM,YACX,iBAAiB,QAAQ,GACzB,QAAQ,gBAAA,SACV;CACF,SAAS,OAAO;EACd,IAAK,MAA4B,SAAS,UACxC,MAAM,IAAI,YAAY,sBAAsB,EAAE,OAAO,MAAM,CAAC;EAE9D,MAAM;CACR;CACA,OAAO,cAAc,MAAM,OAAO;AACpC;;;;;;ACxQA,SAAgB,OACd,QACA,KACA,OACM;CACN,OAAO,eAAe,QAAQ,KAAK;EACjC,cAAc;EACd,YAAY;EACZ;EACA,UAAU;CACZ,CAAC;AACH;;ACKA,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;;AAE1B,MAAM,YAAY;;AAElB,MAAM,YAAY;AAElB,MAAM,sCAA2C,IAAI,IAAI,CAAC,SAAS,CAAC;;AAGpE,MAAM,MAAM,OAAO,aAAa;;AAEhC,MAAM,WAAW,OAAO,iBAAiB;;;;;;AAMzC,MAAM,uBAAuB,OAAO,4BAA4B;AAQhE,SAAS,MACP,QACA,QACA,OACM;CACN,OAAO,eAAe,QAAQ,QAAQ;EAAE;EAAO,cAAc;CAAK,CAAC;AACrE;;;;;AAMA,SAAgB,QAAW,OAAa;CACtC,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,OAAO,SAAS,KAAK,GACvE,MAAM,OAAO,KAAK,IAAI;CAExB,OAAO;AACT;;;;;AAcA,SAAgB,YACd,SACyB;CACzB,MAAM,QAAQ,IAAI,IAAI,QAAQ,QAAO,MAAK,CAAC,EAAE,GAAG,CAAC,CAAC,KAAI,MAAK,EAAE,GAAG,CAAC;CACjE,MAAM,SAAkC,CAAC;CACzC,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,WAAgC,CAAC;CACvC,KAAK,MAAM,EAAE,KAAK,OAAO,SAAS,SAChC,IAAI,CAAC,KACH,OAAO,QAAQ,KAAK,KAAK;MACpB,IAAI,MAAM,IAAI,GAAG,GACtB,SAAS,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,CAAC;MAC9B;EACL,QAAQ,IAAI,GAAG;EACf,OAAO,QAAQ,KAAK,QAAQ,KAAK,CAAC;CACpC;CAEF,MAAM,QAAQ,UAAU,OAAO;CAC/B,IAAI,SAAS,SAAS,GACpB,MAAM,QAAQ,sBAAsB,QAAQ;CAE9C,OAAO;AACT;;AAaA,SAAgB,YAAY,OAAgC;CAC1D,MAAM,UAAU;CAChB,MAAM,MAAM,QAAQ,SAAS;CAC7B,MAAM,UAAU,QAAQ;CACxB,MAAM,WAAW,QAAQ;CACzB,IAAI,CAAC,OAAO,YAAY,KAAA,KAAa,aAAa,KAAA,GAChD,OAAO;CAET,OAAO;EACL;EACA,SAAS,YAAY,KAAA,IAAY,OAAO,CAAC,GAAG,OAAO;EACnD,UACE,aAAa,KAAA,IACT,OACA,SAAS,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,KAAK,CAAC;CACnD;AACF;;AAGA,SAAgB,gBAAgB,OAAe,OAAuB;CACpE,IAAI,MAAM,KACR,QAAQ,KAAK;CAEf,IAAI,MAAM,YAAY,MACpB,MAAM,OAAO,UAAU,IAAI,IAAI,MAAM,OAAO,CAAC;CAE/C,IAAI,MAAM,aAAa,MACrB,MACE,OACA,sBACA,MAAM,SAAS,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,KAAK,CAAC,CAAU,CACrE;AAEJ;;;;;;AAOA,SAAgB,aAAa,KAAqB;CAChD,IAAI,CAAC,UAAU,KAAK,GAAG,GACrB,OAAO;CAET,OAAO,IAAI,QAAQ,mBAAkB,WAAU,IAAI,OAAO,YAAY,GAAG;AAC3E;;;;;;AAOA,SAAgB,aAAa,KAAqB;CAChD,IAAI,CAAC,UAAU,KAAK,GAAG,GACrB,OAAO;CAET,OAAO,IAAI,QAAQ,oBAAoB,QAAQ,WAC7C,OAAO,YAAY,CACrB;AACF;AAEA,SAASC,gBAAc,OAAkD;CACvE,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO;CAET,MAAM,YAAqB,OAAO,eAAe,KAAK;CACtD,OAAO,cAAc,OAAO,aAAa,cAAc;AACzD;;AAGA,MAAM,UAAU;;AAEhB,MAAM,WAAW;;AAEjB,MAAM,SAAS;;;;;;AAuBf,SAAS,UACP,OACA,eACA,SACA,YACa;CACb,IAAI,kBAAkB,QACpB,OAAO;EAAE,MAAM,gBAAgB,KAAK;EAAG,OAAO;CAAK;CAErD,IAAI,OAAO;CACX,IAAI,SAAS;CACb,IACE,OAAO,WAAW,YAClB,WAAW,QACV,OAAmB,MAEpB,OAAO;CAET,IAAI,MAAM,QAAQ,MAAM,GAAG;EACzB,MAAM,SAAoB,CAAC;EAE3B,OAAO;GAAE,MAAM;GAAQ,OAAO;IAAE;IAAQ,SADxB,OAAO,KAAI,SAAQ;KAAC;KAAM;KAAM;IAAI,CACN;IAAG,OAAO;GAAE;EAAE;CAC9D;CACA,IAAI,SAAS,WAAW,kBAAkB,KACxC,SAAS,OAAO,YAAY,MAAM;CAEpC,IAAI,CAACA,gBAAc,MAAM,GACvB,OAAO;EAAE,MAAM;EAAQ,OAAO;CAAK;CAErC,MAAM,SAAkC,CAAC;CACzC,MAAM,UAAuB,CAAC;CAC9B,MAAM,UAAU,SAAS,UAAW,OAAmB,YAAY,KAAA;CACnE,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,IAAI,SAAS,YAAY,SAAS,IAAI,GAAG,GACvC,QAAQ,KAAK;EAAC;EAAK;EAAO;CAAQ,CAAC;MAEnC,QAAQ,KAAK;EACX,QAAQ,GAAG;EACX;EACA,WAAW,IAAI,GAAG,IAAI,SAAS;CACjC,CAAC;CAGL,IAAI,SAAS,SACX,KAAK,MAAM,CAAC,KAAK,UAAW,OAAmB,yBAC7C,CAAC,GACD,QAAQ,KAAK;EAAC;EAAK;EAAO;CAAQ,CAAC;CAGvC,OAAO;EAAE,MAAM;EAAQ,OAAO;GAAE;GAAQ;GAAS,OAAO;EAAE;CAAE;AAC9D;;;;;AAMA,SAAS,YACP,OACA,SACA,YACS;CACT,MAAM,OAAO,UAAU,OAAO,SAAS,SAAS,UAAU;CAC1D,MAAM,QAAqB,KAAK,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC;CACxD,IAAI,QAAQ,MAAM,GAAG,EAAE;CACvB,OAAO,OAAO;EACZ,MAAM,QAAQ,MAAM,QAAQ,MAAM;EAClC,IAAI,UAAU,KAAA,GAAW;GACvB,MAAM,IAAI;GACV,QAAQ,MAAM,GAAG,EAAE;GACnB;EACF;EACA,MAAM,SAAS;EACf,MAAM,CAAC,KAAK,OAAO,QAAQ;EAC3B,MAAM,UAAU,UAAU,OAAO,MAAM,SAAS,UAAU;EAC1D,IAAI,QAAQ,MACV,MAAO,OAAqB,KAAK,QAAQ,IAAI;OAI7C,OAAO,MAAM,QAAmC,KAAK,QAAQ,IAAI;EAEnE,IAAI,QAAQ,OAAO;GACjB,MAAM,KAAK,QAAQ,KAAK;GACxB,QAAQ,QAAQ;EAClB;CACF;CACA,OAAO,KAAK;AACd;;;;;AAMA,SAAgB,gBACd,OACA,aAAkC,qBACzB;CACT,OAAO,YAAY,OAAO,cAAc,UAAU;AACpD;;;;;;AAOA,SAAgB,gBACd,OACA,aAAkC,qBACzB;CACT,OAAO,YAAY,OAAO,cAAc,UAAU;AACpD;;AAcA,SAAS,YAAY,MAAuB;CAC1C,MAAM,YAAqB,OAAO,eAAe,IAAI;CACrD,OACE,MAAM,QAAQ,IAAI,KAAK,cAAc,OAAO,aAAa,cAAc;AAE3E;;;;;;AAOA,SAAgB,gBAAgB,OAAgB,OAAwB;CAEtE,MAAM,UAA+B,CAAC,CAAC,OAAO,CAAC,CAAC;CAChD,MAAM,8BAAc,IAAI,IAAoB;CAC5C,KAAK,IAAI,OAAO,QAAQ,IAAI,GAAG,MAAM,OAAO,QAAQ,IAAI,GAAG;EACzD,MAAM,CAAC,MAAM,SAAS;EACtB,IAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,CAAC,YAAY,IAAI,GAChE;EAEF,IAAI,SAAS,OACX,OAAO;EAET,KAAK,YAAY,IAAI,IAAI,KAAK,OAAO,OACnC;EAEF,YAAY,IAAI,MAAM,KAAK;EAC3B,KAAK,MAAM,SAAS,OAAO,OAAO,IAAI,GACpC,QAAQ,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;EAGjC,KAAK,MAAM,GAAG,UAAW,KAAiB,yBAAyB,CAAC,GAClE,QAAQ,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;CAEnC;CACA,OAAO;AACT;;AAGA,MAAM,aAAa;;;;;;AAOnB,SAAgB,cAAc,OAAwB;CAEpD,MAAM,UAAqB,CAAC,KAAK;CACjC,IAAI,OAAO;CACX,OAAO,QAAQ,SAAS,GAAG;EACzB,MAAM,OAAO,QAAQ,IAAI;EACzB,QAAQ;EACR,IAAI,OAAO,SAAS,UAClB,QAAQ,KAAK;OACR,IAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,YAAY,IAAI,GAAG;GACzE,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,GAAG;IAC/C,QAAQ,IAAI;IACZ,QAAQ,KAAK,KAAK;GACpB;GACA,KAAK,MAAM,CAAC,KAAK,UAAW,KAAiB,yBAC3C,CAAC,GAAG;IACJ,QAAQ,IAAI;IACZ,QAAQ,KAAK,KAAK;GACpB;EACF;CACF;CACA,OAAO;AACT;;;AC3YA,IAAa,gBAAb,cAAmC,MAAM;CACvC,OAAgB;AAClB;AAEA,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAM,kBACJ;AAEF,MAAM,sBAAkC;CACtC,MAAM,QAAQ,IAAI,WAAW,WAAW,CAAC,CAAC,KAAK,GAAI;CACnD,KAAK,IAAI,QAAQ,GAAG,QAAQ,IAAwB,SAAS,GAC3D,MAAM,gBAAgB,WAAW,KAAK,KAAK;CAE7C,OAAO;AACT,EAAA,CAAG;AAEH,SAAS,QAAQ,MAAuC;CACtD,IAAI,OAAO,SAAS,UAClB,OAAO;CAET,IAAI;EACF,OAAO,SAAS,MAAM,OAAO;CAC/B,SAAS,OAAO;EACd,IAAI,iBAAiB,oBACnB,MAAM,IAAI,cACR,sDACF;EAEF,MAAM;CACR;AACF;AAEA,SAAS,YAAY,QAAoD;CAEvE,OAAO,IAAI,cACT,6DAFY,KAAK,MAAM,OAAO,SAAS,CAAC,IAAI,IAAI,EAEmB,wCACrE;AACF;;;;;;;AAQA,SAAgB,UACd,MACA,SAAS,OACG;CACZ,MAAM,QAAQ,QAAQ,IAAI;CAC1B,MAAM,SAAS,IAAI,WAAW,KAAK,OAAO,MAAM,SAAS,KAAK,CAAC,IAAI,CAAC;CACpE,IAAI,SAAS;CACb,IAAI,UAAU;CACd,IAAI,WAAW;CACf,IAAI,OAAO;CACX,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACpD,MAAM,MAAM,MAAM;EAClB,IAAI,QAAQ,YAAY;GACtB,QAAQ;GACR,IAAI,WAAW,KAAK,UAAU,QAAQ,GACpC;GAGF,IAAI,CAAC,QACH;GAEF,IAAI,YAAY,GACd;GAEF,MAAM,IAAI,cACR,YAAY,KAAK,UAAU,IACvB,gCACA,4BACN;EACF;EACA,MAAM,QAAQ,aAAa;EAC3B,IAAI,SAAS,IAAI;GACf,IAAI,QACF,MAAM,IAAI,cAAc,6BAA6B;GAEvD;EACF;EACA,IAAI,SAAS,KAAK,QAChB,MAAM,IAAI,cACR,UAAU,SAAS,IACf,8BACA,mCACN;EAEF,OAAO;EACP,QAAQ,SAAR;GACE,KAAK;IACH,UAAU;IACV,WAAW;IACX;GAEF,KAAK;IACH,UAAU;IACV,OAAO,UAAW,YAAY,IAAM,SAAS;IAC7C,UAAU;IACV,WAAW,QAAQ;IACnB;GAEF,KAAK;IACH,UAAU;IACV,OAAO,UAAW,YAAY,IAAM,SAAS;IAC7C,UAAU;IACV,WAAW,QAAQ;IACnB;GAEF;IACE,UAAU;IACV,OAAO,UAAW,YAAY,IAAK;IACnC,UAAU;IACV,WAAW;EAGf;CACF;CACA,IAAI,YAAY,GACd,MAAM,YAAY,EAAE,OAAO,CAAC;CAE9B,IAAI,YAAY,KAAK,UAAU,OAAO,GACpC,MAAM,IAAI,cAAc,mBAAmB;CAE7C,OAAO,OAAO,MAAM,GAAG,MAAM;AAC/B;;AAGA,SAAgB,UACd,MACA,WAAW,OACC;CACZ,IAAI,OAAO,SAAS,UAClB,IAAI;EACF,OAAO,UAAU,SAAS,MAAM,OAAO,GAAG,QAAQ;CACpD,SAAS,OAAO;EACd,IAAI,iBAAiB,oBACnB,MAAM,IAAI,UACR,sDACF;EAEF,MAAM;CACR;CAEF,OAAO,UAAU,MAAM,QAAQ;AACjC;;AAGA,SAAgB,UAAU,MAA0B;CAClD,OAAO,OAAO,KAAK,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU,CAAC,CAAC,SAChE,QACF;AACF;AAEA,SAAS,SAAS,MAAkC;CAClD,IAAI,SAAS,KAAA,GACX,OAAO;CAET,IAAI,QAAQ,MAAQ,QAAQ,IAC1B,OAAO,OAAO;CAEhB,IAAI,QAAQ,MAAQ,QAAQ,IAC1B,OAAO,OAAO;CAEhB,IAAI,QAAQ,MAAQ,QAAQ,KAC1B,OAAO,OAAO;CAEhB,OAAO;AACT;;AAGA,SAAgB,MAAM,MAAkB,SAAS,OAAmB;CAElE,MAAM,SAAS,IAAI,WAAW,KAAK,MAAM;CACzC,IAAI,UAAU;CACd,IAAI,QAAQ;CACZ,OAAO,QAAQ,KAAK,QAAQ;EAC1B,MAAM,OAAO,KAAK,UAAU;EAC5B,IAAI,SAAS,IAAM;GACjB,SAAS;GACT,IAAI,SAAS,KAAK,QAChB;GAEF,MAAM,OAAO,KAAK,UAAU;GAC5B,IAAI,SAAS,MAAQ,SAAS,IAAM;IAElC,IAAI,SAAS,IACX,OAAO,QAAQ,KAAK,UAAU,KAAK,WAAW,IAC5C,SAAS;IAGb,IAAI,QAAQ,KAAK,QACf,SAAS;GAEb,OAAO,IAAI,SAAS,IAAM;IACxB,OAAO,WAAW;IAClB,WAAW;IACX,SAAS;GACX,OAAO;IACL,MAAM,OAAO,SAAS,IAAI;IAC1B,MAAM,MAAM,SAAS,KAAK,QAAQ,EAAE;IACpC,IAAI,QAAQ,IAAI,KAAK,UAAU,QAAQ,KAAK,OAAO,GAAG;KACpD,OAAO,WAAY,QAAQ,IAAK;KAChC,WAAW;KACX,SAAS;IACX,OAAO;KACL,OAAO,WAAW;KAClB,WAAW;IACb;GACF;EACF,OAAO,IAAI,UAAU,SAAS,IAAM;GAClC,OAAO,WAAW;GAClB,WAAW;GACX,SAAS;EACX,OAAO;GACL,OAAO,WAAW;GAClB,WAAW;GACX,SAAS;EACX;CACF;CACA,OAAO,OAAO,MAAM,GAAG,OAAO;AAChC;AAEA,MAAM,WAAW;AACjB,MAAM,cAAc;;AAGpB,SAAgB,MAAM,MAA8B;CAClD,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,cAAc,qBAAqB;CAE/C,IAAI,aAAc,KAAK,MAAM,KAAK,WAAY;CAC9C,MAAM,SAAmB,CAAC;CAC1B,IAAI,WAAW;CACf,IAAI,WAAW;CACf,IAAI,WAAW;CACf,IAAI,YAAY,KAAK,SAAS;CAC9B,OAAO,YAAY,GAAG,aAAa,GAAG,YAAY,GAAG;EACnD,IAAI,QAAQ,YAAY,IAAK,KAAK,aAAa,IAAK;EACpD,IAAI,UAAU,MAAQ,UAAU,MAAQ,aAAa,GACnD,QAAQ;OACH;GACL,IAAI,QAAQ,YAAY,QAAQ,IAC9B,MAAM,IAAI,cAAc,cAAc;GAExC,QAAS,QAAQ,WAAY;EAC/B;EACA,WAAY,YAAY,IAAK;EAC7B,YAAY;EACZ,IAAI,YAAY,GAAG;GACjB,YAAY;GACZ,OAAO,KAAM,YAAY,WAAY,GAAI;GACzC,aAAa,KAAK,YAAY;GAC9B,aAAa;EACf;CACF;CACA,OAAO,YAAY,GAAG;EACpB,MAAM,QAAQ,KAAK,aAAa;EAChC,aAAa;EACb,YAAY;EACZ,IACE,UAAU,YACV,UAAU,eACV,UAAU,MACV,UAAU,IAEV,MAAM,IAAI,cAAc,kBAAkB;CAE9C;CACA,OAAO,WAAW,KAAK,MAAM;AAC/B;;;AClRA,IAAa,gBAAb,MAA2B;;CAEzB,OAAgB,MAAc;CAC9B,OAAwB;CACxB;CAEA,YAAY,OAAsB,MAAM;EACtC,KAAK,OAAO;CACd;;CAGA,IAAI,MAAc;EAChB,OAAQ,KAAK,YAAqC;CACpD;AACF;AAEA,IAAa,8BAAb,cAAiD,cAAc;CAC7D,OAAyB,MACvB;CACF,OAAiC;AACnC;AAEA,IAAa,8BAAb,cAAiD,cAAc;CAC7D,OAAyB,MACvB;CACF,OAAiC;AACnC;AAEA,IAAa,8BAAb,cAAiD,cAAc;CAC7D,OAAyB,MACvB;CACF,OAAiC;AACnC;AAEA,IAAa,sCAAb,cAAyD,cAAc;CACrE,OAAyB,MACvB;CACF,OAAiC;AACnC;AAEA,IAAa,gCAAb,cAAmD,cAAc;CAC/D,OAAyB,MACvB;CACF,OAAiC;AACnC;AAEA,IAAa,mCAAb,cAAsD,cAAc;CAClE,OAAyB,MACvB;CACF,OAAiC;AACnC;AAEA,IAAa,oCAAb,cAAuD,cAAc;CACnE,OAAyB,MACvB;CACF,OAAiC;AACnC;AAEA,IAAa,gDAAb,cAAmE,cAAc;CAC/E,OAAyB,MACvB;CACF,OACE;AACJ;AAEA,IAAa,6BAAb,cAAgD,cAAc;CAC5D,OAAyB,MACvB;CACF,OAAiC;AACnC;AAEA,IAAa,gCAAb,cAAmD,cAAc;CAC/D,OAAyB,MACvB;CACF,OAAiC;AACnC;AAEA,IAAa,4BAAb,cAA+C,cAAc;CAC3D,OAAyB,MACvB;CACF,OAAiC;AACnC;AAEA,IAAa,sBAAb,cAAyC,cAAc;CACrD,OAAyB,MACvB;CACF,OAAiC;AACnC;;AAGA,IAAa,eAAb,cAAkC,MAAM;CACtC,OAAgB;AAClB;;AAGA,IAAa,mBAAb,cAAsC,aAAa;CACjD,OAAgB;AAClB;;AAGA,IAAa,mBAAb,cAAsC,aAAa;CACjD,OAAgB;AAClB;;;;;AAMA,IAAa,iBAAb,cAAoC,MAAM;CACxC,OAAgB;CAEhB,YAAY,UAAU,oCAAoC;EACxD,MAAM,OAAO;CACf;AACF;;;ACnGA,SAAgB,QACd,MACA,WACA,WAAW,IACD;CACV,MAAM,QAAkB,CAAC;CACzB,MAAM,QAAQ,WAAW,IAAI,OAAO,oBAAoB;CACxD,IAAI,QAAQ;CACZ,OAAO,MAAM,SAAS,OAAO;EAC3B,MAAM,QAAQ,KAAK,QAAQ,WAAW,KAAK;EAC3C,IAAI,UAAU,IACZ;EAEF,MAAM,KAAK,KAAK,MAAM,OAAO,KAAK,CAAC;EACnC,QAAQ,QAAQ,UAAU;CAC5B;CACA,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC;CAC5B,OAAO;AACT;;AAGA,SAAgB,MAAM,MAAsB;CAC1C,OAAO,KAAK,WAAW,MAAM,MAAM,CAAC,CAAC,WAAW,MAAK,MAAK;AAC5D;;AAGA,SAAgBC,UAAQ,MAAsB;CAC5C,IAAI,KAAK,SAAS,GAAG;EACnB,IAAI,KAAK,WAAW,IAAG,KAAK,KAAK,SAAS,IAAG,GAC3C,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,WAAW,QAAQ,IAAI,CAAC,CAAC,WAAW,QAAO,IAAG;EAEzE,IAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAC3C,OAAO,KAAK,MAAM,GAAG,EAAE;CAE3B;CACA,OAAO;AACT;;AAGA,SAAgB,cAAc,MAA4B;CACxD,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC;CAClC,IAAI,MAAM,UAAU,GAClB,OAAO;EAAC;EAAM;EAAM;CAAI;CAE1B,OAAO;EAAC,MAAM,MAAM;EAAI,MAAM,MAAM;EAAI,MAAM,MAAM;CAAE;AACxD;AAEA,MAAM,uBACJ;AACF,MAAM,iBAAiB;AACvB,MAAM,aAAa;AAGnB,SAAS,qBAAqB,MAAsB;CAClD,IAAI,CAAC,KAAK,SAAS,GAAG,GACpB,OAAO;CAET,OAAO,KAAK,QAAQ,iBAAiB,QAAQ,QAC3C,OAAO,aAAa,OAAO,SAAS,KAAK,EAAE,CAAC,CAC9C;AACF;;AASA,SAAgB,aACd,QACwB;CACxB,MAAM,QAAQ,OAAO;CACrB,MAAM,UACJ,UAAU,KAAA,IAAY,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;CAClD,MAAM,0BAAU,IAAI,IAA4B;CAChD,KAAK,MAAM,CAAC,SAAS,aAAa,OAAO,MAAM,CAAC,GAAG;EACjD,MAAM,UAAU,QAAQ,SAAS,GAAG;EACpC,MAAM,QAAQA,UAAQ,QAAQ;EAC9B,MAAM,QAAQ,qBAAqB,KAAK,OAAO;EAC/C,IAAI,OAAO,WAAW,KAAA,GAAW;GAC/B,QAAQ,KAAK,CAAC,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;GAC3C;EACF;EACA,MAAM,OAAO,MAAM,OAAO,QAAQ;EAClC,MAAM,MACJ,MAAM,OAAO,QAAQ,KAAA,IAAY,OAAO,OAAO,MAAM,OAAO,GAAG;EACjE,MAAM,OAAO,QAAQ,IAAI,IAAI,KAAK,CAAC;EACnC,KAAK,KAAK;GAAE;GAAK;GAAO;EAAQ,CAAC;EACjC,QAAQ,IAAI,MAAM,IAAI;CACxB;CACA,KAAK,MAAM,CAAC,MAAM,SAAS,SAAS;EAElC,IAAI,gBADY,KAAK,MAAK,SAAQ,KAAK,QAAQ,CACrB,IACtB,KAAK,QAAO,SAAQ,KAAK,QAAQ,IAAI,IACrC,KAAK,KAAI,UAAS;GAAE,GAAG;GAAM,KAAK,KAAK,OAAO;EAAE,EAAE;EAEtD,gBAAgB,cAAc,UAC3B,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE,OAAO,EACrC;EACA,IAAI,WAAW;EACf,MAAM,SAAmB,CAAC;EAC1B,KAAK,MAAM,QAAQ,eACjB,IAAI,KAAK,SAAS;GAChB,OAAO,KAAK,qBAAqB,KAAK,KAAK,CAAC;GAC5C,WAAW;EACb,OACE,OAAO,KAAK,KAAK,KAAK;EAG1B,MAAM,QAAQ,MAAM,OAAO,KAAK,EAAE,CAAC;EACnC,IAAI,UAAU;GACZ,MAAM,CAAC,SAAS,UAAU,QAAQ,cAAc,KAAK;GACrD,QAAQ,KAAK,CAAC,MAAM;IAAC;IAAS;IAAU,IAAI,KAAK;GAAE,CAAC,CAAC;EACvD,OACE,QAAQ,KAAK,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;CAErC;CACA,OAAO;AACT;;AAGA,SAAgB,iBAAiB,MAA0B;CAGzD,MAAM,QAAQ,IAAI,WAAW,KAAK,MAAM;CACxC,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,KAAK,WAAW,KAAK;EAClC,IAAI,OAAO,YACT,OAAO,SAAS,MAAM,oBAAoB;EAE5C,MAAM,SAAS;CACjB;CACA,OAAO;AACT;;AAGA,SAAgB,qBACd,OACA,SAA+B,WAC/B,kBAAkB,YACV;CACR,IAAI,OAAO,UAAU,UACnB,OAAOA,UAAQ,KAAK;CAEtB,MAAM,CAAC,WAAW,QAAQ;CAC1B,IAAI;EACF,OAAO,SAAS,iBAAiB,IAAI,GAAG,WAAW,iBAAiB,MAAM;CAC5E,SAAS,OAAO;EACd,IAAI,iBAAiB,aACnB,OAAOA,UAAQ,IAAI;EAErB,MAAM;CACR;AACF;AAEA,UAAU,iBAAiB,MAA2C;CACpE,IAAI,SAAS;CACb,IAAI,WAAW;CACf,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,WAAW;EACX,MAAM,OAAO,KAAK,OAAO,KAAK;EAC9B,IAAI,QAAQ;GACV,MAAM,CAAC,OAAO,KAAK,MAAM;GACzB,SAAS;EACX,OAAO,IAAI,SAAS,MAClB,SAAS;OAET,MAAM,CAAC,OAAO,IAAI;CAEtB;CACA,IAAI,QACF,MAAM,CAAC,UAAU,IAAI;AAEzB;AAEA,SAAS,qBAAqB,MAAsB;CAClD,IAAI,CAAC,KAAK,SAAS,IAAG,GACpB,OAAO;CAET,IAAI,QAAQ;CACZ,IAAI,UAAyB;CAC7B,MAAM,SAAmB,CAAC;CAC1B,KAAK,MAAM,CAAC,UAAU,SAAS,iBAAiB,IAAI,GAAG;EACrD,IAAI,SAAS,MACX;EAEF,IAAI,YAAY,MACd,UAAU;OACL;GACL,IAAI,UAAU,SACZ,OAAO,KAAK,KAAK,MAAM,OAAO,OAAO,CAAC;GAExC,QAAQ,WAAW;GACnB,UAAU;EACZ;CACF;CACA,IAAI,QAAQ,KAAK,QACf,OAAO,KAAK,KAAK,MAAM,KAAK,CAAC;CAE/B,OAAO,OAAO,KAAK,EAAE;AACvB;AAEA,SAAS,iBAAiB,MAAuB;CAC/C,IAAI,QAAQ;CACZ,KAAK,MAAM,GAAG,SAAS,iBAAiB,qBAAqB,IAAI,CAAC,GAChE,IAAI,SAAS,KACX,SAAS;MACJ,IAAI,SAAS,KAAK;EACvB,SAAS;EACT,IAAI,QAAQ,GACV,OAAO;CAEX;CAEF,OAAO,UAAU;AACnB;AAEA,MAAM,WAAW;AACjB,MAAM,MAAM;AACZ,MAAMC,OAAK;AACX,MAAMC,QAAM;AACZ,MAAM,YAAY,WAAW,MAAMD;AACnC,MAAM,cAAc,UAAU,QAAQ,KAAK,EAAE;;;;;;;;AAS7C,MAAM,sBAAsB;;AAG5B,IAAM,iBAAN,MAAqB;CACnB,MAAc;CACd,SAAiB;CACjB,cAAgC,CAAC;CACjC;CAEA,YAAY,OAAe;EACzB,KAAK,QAAQ;CACf;CAEA,OAAuB;EACrB,OAAO,KAAK,MAAM,OAAO,KAAK,GAAG;CACnC;CAEA,WAA2B;EACzB,MAAM,SAAmB,CAAC;EAC1B,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ;GACnC,MAAM,OAAO,KAAK,KAAK;GACvB,IAAI,GAAG,IAAI,MAAM,SAAS,IAAI,GAAG;IAC/B,IAAI,CAAC,OAAO,SAAS,IAAI,GACvB,OAAO,KAAK,IAAI;IAElB,KAAK,OAAO;GACd,OAAO,IAAI,SAAS,KAClB,KAAK,YAAY,KAAK,KAAK,WAAW,CAAC;QAEvC;EAEJ;EACA,OAAO,OAAO,KAAK,EAAE;CACvB;CAEA,MAAc,QAAsB;EAClC,KAAK,UAAU;EACf,IAAI,KAAK,SAAS,qBAChB,MAAM,IAAI,eAAe;CAE7B;CAEA,cAA6B;EAC3B,MAAM,SAAwB,CAAC;EAC/B,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ;GACnC,MAAM,SAAS,OAAO;GACtB,KAAK,WAAW,MAAM;GACtB,IAAI,OAAO,WAAW,QACpB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;EAExB;EACA,OAAO;CACT;;;;;CAMA,WAAmB,QAA6B;EAC9C,KAAK,MAAM,CAAC;EACZ,KAAK,cAAc,CAAC;EACpB,KAAK,SAAS;EACd,MAAM,SAAS,KAAK;EACpB,MAAM,QAAQ,KAAK;EACnB,MAAM,QAAQ,KAAK,cAAc;EACjC,KAAK,SAAS;EACd,IAAI,KAAK,OAAO,KAAK,MAAM,QACrB;OAAA,MAAM,SAAS,GACjB,OAAO,KAAK,CAAC,KAAK,YAAY,KAAK,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;EAAA,OAErD,IAAI,KAAK,SAAS,KAAK,KAAK,CAAC,GAAG;GACrC,KAAK,MAAM;GACX,KAAK,cAAc;GACnB,MAAM,WAAW,KAAK,YAAY;GAClC,OAAO,KAAK,CAAC,KAAK,YAAY,KAAK,GAAG,GAAG,QAAQ,CAAC;EACpD,OAAO,IAAI,KAAK,KAAK,MAAM,KAAK;GAC9B,MAAM,WAAW,KAAK,MAAM;GAC5B,KAAK,OAAO;GACZ,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ;IACnC,KAAK,SAAS;IACd,IAAI,KAAK,MAAM,YAAY,KAAK,KAAK,MAAM,KAAK;KAC9C,KAAK,OAAO;KACZ;IACF;IACA,KAAK,WAAW,MAAM;GACxB;EACF,OAAO,IAAI,KAAK,KAAK,MAAM,KAAK;GAC9B,MAAM,YAAY,KAAK,aAAa;GACpC,IAAI,KAAK,YAAY,SAAS,GAC5B,OAAO,KAAK,CACV,GAAG,MAAM,KAAK,GAAG,EAAE,IAAI,KAAK,YAAY,KAAK,GAAG,EAAE,IAClD,SACF,CAAC;QAED,OAAO,KAAK,CAAC,MAAM,KAAK,GAAG,GAAG,SAAS,CAAC;EAE5C,OAAO,IAAI,MAAM,SAAS,GACxB,OAAO,KAAK,CAAC,KAAK,YAAY,KAAK,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;OACnD,IAAI,SAAS,SAAS,KAAK,KAAK,CAAC,GACtC,KAAK,OAAO;EAEd,KAAK,SAAS;EACd,IAAI,KAAK,MAAM,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,KAClD,KAAK,OAAO;EAEd,KAAK,UAAU;CACjB;CAEA,eAA+B;EAC7B,IAAI,KAAK,KAAK,MAAM,KAClB,OAAO;EAET,IAAI,cAAc;EAClB,KAAK,OAAO;EACZ,KAAK,SAAS;EACd,IAAI,SAAS;EACb,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ;GACnC,IAAI,aAAa;IACf,KAAK,UAAU;IACf,cAAc;GAChB,OAAO,IAAI,KAAK,KAAK,MAAM,KAAK;IAC9B,KAAK,OAAO;IACZ;GACF,OAAO,IAAI,KAAK,KAAK,MAAM,KAAK;IAC9B,KAAK,OAAO;IACZ,cAAc;GAChB,OAAO,IAAI,KAAK,KAAK,MAAM,KACzB,KAAK,OAAO;QACP;IACL,SAAS,KAAK,YAAY;IAC1B,KAAK,OAAO;IACZ;GACF;GACA,KAAK,SAAS;EAChB;EACA,OAAO;CACT;CAEA,cAA8B;EAC5B,MAAM,SAAmB,CAAC;EAC1B,KAAK,SAAS;EACd,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ;GACnC,IAAI,aAAa;GACjB,MAAM,OAAO,KAAK,KAAK;GACvB,IAAI,SAAS,KAAK;IAChB,IAAI,OAAO,SAAS,KAAK,QAAQ,OAAO,GAAG,EAAE,KAAK,EAAE,MAAM,IACxD,OAAO,IAAI;IAEb,OAAO,KAAK,GAAG;IACf,KAAK,OAAO;IACZ,aAAa;GACf,OAAO,IAAI,SAAS,MAClB,OAAO,KAAK,IAAI,MAAM,KAAK,SAAS,CAAC,EAAE,EAAE;QACpC,IAAI,UAAU,SAAS,IAAI,GAAG;IACnC,IAAI,OAAO,SAAS,KAAK,QAAQ,OAAO,GAAG,EAAE,KAAK,EAAE,MAAM,IACxD,OAAO,IAAI;IAEb;GACF,OACE,OAAO,KAAK,KAAK,QAAQ,CAAC;GAE5B,MAAM,KAAK,KAAK,SAAS;GACzB,IAAI,cAAc,IAChB,OAAO,KAAK,EAAE;EAElB;EACA,IAAI,KAAK,OAAO,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,KACnD,OAAO,OAAO,KAAK,EAAE;EAEvB,OAAO,KAAK,GAAG;EACf,KAAK,OAAO;EACZ,KAAK,SAAS;EACd,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,CAAC,QACH,OAAO;EAET,OAAO,OAAO,KAAK,EAAE,IAAI;CAC3B;CAEA,YAA4B;EAC1B,MAAM,SAAmB,CAAC;EAC1B,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ;GACnC,MAAM,OAAO,KAAK,KAAK;GACvB,IAAI,IAAI,SAAS,IAAI,GACnB,KAAK,OAAO;QACP,IAAI,SAAS,KAClB,KAAK,YAAY,KAAK,KAAK,WAAW,CAAC;QAClC,IAAI,SAAS,KAClB,OAAO,KAAK,KAAK,iBAAiB,CAAC;QAC9B,IAAI,SAAS,KAAK;IACvB,KAAK,OAAO;IACZ,OAAO,KAAK,GAAG;GACjB,OAAO,IAAI,SAAS,KAClB,OAAO;QACF,IAAI,UAAU,SAAS,IAAI,GAChC;QAEA,OAAO,KAAK,KAAK,QAAQ,CAAC;EAE9B;EACA,OAAO,OAAO,KAAK,EAAE;CACvB;CAEA,aACE,WACA,UACA,eACQ;EACR,IAAI,KAAK,KAAK,MAAM,WAClB,OAAO;EAIT,IAAI,OAAO;EACX,IAAI,SAAS;EACb,KAAK,OAAO;EACZ,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ;GACnC,MAAM,OAAO,KAAK,KAAK;GACvB,IAAI,QAAQ;IACV,QAAQ;IACR,SAAS;GACX,OAAO,IAAI,SAAS,SAAS,IAAI,GAAG;IAClC,KAAK,OAAO;IACZ;GACF,OAAO,IAAI,iBAAiB,SAAS,KAAK;IACxC,QAAQ,KAAK,WAAW;IACxB;GACF,OAAO,IAAI,SAAS,MAClB,SAAS;QAET,QAAQ;GAEV,KAAK,OAAO;EACd;EACA,OAAO;CACT;CAEA,WAA2B;EACzB,OAAO,KAAK,aAAa,MAAK,QAAO,KAAK;CAC5C;CAEA,aAA6B;EAC3B,KAAK,MAAM,CAAC;EACZ,MAAM,UAAU,KAAK,aAAa,KAAK,OAAO,IAAI;EAClD,KAAK,UAAU;EACf,OAAO;CACT;CAEA,mBAAmC;EACjC,OAAO,IAAI,KAAK,aAAa,KAAK,OAAO,KAAK,EAAE;CAClD;CAEA,QAAgB,WAAmB,WAAmB;EACpD,IAAI,OAAO;EACX,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ;GACnC,MAAM,OAAO,KAAK,KAAK;GACvB,IAAI,SAAS,SAAS,IAAI,GACxB;GAEF,QAAQ;GACR,KAAK,OAAO;EACd;EACA,OAAO;CACT;CAEA,gBAAkC;EAChC,MAAM,QAAkB,CAAC;EACzB,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ;GACnC,MAAM,OAAO,KAAK,KAAK;GACvB,IAAIC,MAAI,SAAS,IAAI,GACnB,KAAK,OAAO;QACP,IAAI,SAAS,MAClB,MAAM,KAAK,KAAK,SAAS,CAAC;QACrB,IAAI,SAAS,KAClB,KAAK,YAAY,KAAK,KAAK,WAAW,CAAC;QAClC,IAAI,YAAY,SAAS,IAAI,GAClC;QAEA,MAAM,KAAK,KAAK,QAAQ,WAAW,CAAC;EAExC;EACA,OAAO;CACT;AACF;;AAGA,SAAgB,YAAY,OAA8B;CACxD,IAAI,CAAC,OACH,OAAO,CAAC;CAEV,OAAO,IAAI,eAAe,KAAK,CAAC,CAAC,YAAY;AAC/C;;AAGA,SAAgB,aAAa,aAA+C;CAC1E,MAAM,WAAW,YAAY,KAAI,UAC/B,iBAAiB,KAAK,IAAI,QAAQ,UACpC;CACA,MAAM,SAAS,YAAY,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,SACnD,KAAK,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IACrC;CACA,IAAI,WAAW;CACf,KAAK,MAAM,SAAS,UAAU;EAC5B,MAAM,WAAW,qBAAqB,KAAK;EAC3C,YAAY,KAAK,SAAS,MAAM,GAAG,CAAC,CAAC,SAAS;CAChD;CACA,IAAI,OAAO,WAAW,UACpB,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;CAElB,OAAO;AACT;;;ACpiBA,IAAa,eAAb,cAAkC,MAAM;CACtC,OAAgB;AAClB;AAIA,MAAM,WACJ;CACE,cAAc;EAAC;EAAM;EAAM;CAAI;CAC/B,cAAc;EAAC;EAAM;EAAM;CAAI;CAC/B,cAAc;EAAC;EAAM;EAAM;CAAI;CAC/B,cAAc;EAAC;EAAM;EAAM;CAAI;CAC/B,cAAc;EAAC;EAAM;EAAM;CAAI;CAC/B,eAAe;EAAC;EAAM;EAAM;CAAI;CAChC,eAAe;EAAC;EAAM;EAAM;CAAI;CAChC,eAAe;EAAC;EAAM;EAAM;CAAI;CAChC,eAAe;EAAC;EAAM;EAAM;CAAI;CAChC,eAAe;EAAC;EAAM;EAAM;CAAI;CAChC,gBAAgB;EAAC;EAAM;EAAM;CAAI;CACjC,QAAQ;EAAC;EAAM;EAAM;CAAI;CACzB,YAAY;EAAC;EAAM;EAAM;CAAI;CAC7B,MAAM;EAAC;EAAU;EAAU;CAAI;CAC/B,QAAQ;EAAC;EAAU;EAAU;CAAI;CACjC,UAAU;EAAC;EAAU;EAAM;CAAa;CACxC,WAAW;EAAC;EAAU;EAAM;CAAa;CACzC,eAAe;EAAC;EAAU;EAAM;CAAI;CACpC,UAAU;EAAC;EAAU;EAAU;CAAI;CACnC,SAAS;EAAC;EAAY;EAAU;CAAO;AACzC;AAEF,MAAM,UAA4C;CAChD,SAAS;CACT,WAAW;CACX,SAAS;CACT,WAAW;CACX,SAAS;CACT,WAAW;CACX,SAAS;CACT,WAAW;CACX,SAAS;CACT,WAAW;CACX,SAAS;CACT,WAAW;CACX,SAAS;CACT,WAAW;CACX,SAAS;CACT,WAAW;CACX,SAAS;CACT,WAAW;CACX,UAAU;CACV,YAAY;CACZ,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,OAAO;AACT;AAEA,SAASC,SACP,OACA,KACe;CACf,OAAO,OAAO,OAAO,OAAO,GAAG,IAAI,MAAM,OAAO,KAAA;AAClD;AAGA,MAAM,uBACJ;AAGF,MAAM,gBAAgB;;;;;;AAOtB,SAAgB,kBACd,MACA,UACA,SAAuC,UAC3B;CACZ,MAAM,QAAQ,YAAY,QAAQ;CAClC,IACE,UAAU,WACV,UAAU,WACV,UAAU,aACV,qBAAqB,KAAK,KAAK,KAC/B,CAAC,cAAc,KAAK,IAAI,GAExB,OAAO,SAAS,MAAM,UAAU,MAAM;CAExC,IAAI,WAAW,YAAY,CAACC,UAAQ,IAAI,GAEtC,OAAO,SAAS,MAAM,OAAO;CAE/B,OAAO,SAAS,MAAM,SAAS,iBAAiB;AAClD;;AAGA,SAAgB,cAAc,MAAuB;CACnD,OAAO,CAAC,KAAK,aAAa;AAC5B;;AAGA,IAAa,UAAb,MAAqB;CACnB;CACA;CACA;CAEA,YAAY,cAAsB;EAChC,KAAK,IAAI,QAAQ,GAAG,QAAQ,aAAa,QAAQ,SAAS,GACxD,IAAI,aAAa,WAAW,KAAK,KAAK,KACpC,MAAM,IAAI,aAAa,YAAY;EAGvC,MAAM,QAAQ,aAAa,YAAY;EACvC,KAAK,eAAeD,SAAO,SAAS,KAAK,KAAK;EAC9C,MAAM,GAAG,cAAc,cAAcA,SACnC,UACA,KAAK,YACP,KAAK;GAAC;GAAY;GAAU;EAAI;EAChC,KAAK,eAAe;EACpB,MAAM,SAAS,cAAc,KAAK;EAClC,KAAK,gBAAgBA,SAAO,SAAS,MAAM,KAAK;CAClD;;CAGA,mBAA2B;EACzB,OAAO,KAAK,iBAAiB,KAAK;CACpC;;CAGA,WAAW,OAAoC;EAC7C,IAAI,MAAM,WAAW,GACnB,OAAO;EAET,IAAI,KAAK,iBAAiB,UAKxB,OAAO,iBAHL,OAAO,UAAU,WACb,kBAAkB,OAAO,KAAK,aAAa,IAC3C,KACuB;EAE/B,IAAI,KAAK,iBAAiB,MAKxB,OAAO,aAAa,SAHlB,OAAO,UAAU,WACb,kBAAkB,OAAO,KAAK,aAAa,IAC3C,OAC8B,SAAS,CAAC;EAEhD,IAAI,OAAO,UAAU,UACnB,OAAO,SAAS,kBAAkB,OAAO,KAAK,aAAa,GAAG,OAAO;EAGvE,OAAO,SAAS,OAAO,SAAS;CAClC;AACF;AAEA,MAAM,oBAAoB;;AAG1B,SAAgB,iBAAiB,OAA2B;CAC1D,IAAI,UAAU;CACd,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,mBACjD,WAAW,GAAG,UAAU,MAAM,SAAS,OAAO,QAAQ,iBAAiB,CAAC,EAAE;CAE5E,OAAO;AACT;AAEA,MAAM,+BAAe,IAAI,IACvB,uGACF;AAEA,SAAS,QAAQ,MAAsB;CACrC,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,GAAG,GAAG;AAC1E;AAEA,MAAM,qBAAqB;;AAG3B,SAAgB,aAAa,MAAsB;CACjD,IAAI,KAAK,WAAW,GAClB,OAAO;CAET,IAAI,aAAa;CACjB,KAAK,MAAM,QAAQ,MACjB,cACE,KAAK,WAAW,CAAC,IAAI,OAAO,CAAC,aAAa,IAAI,IAAI,IAC9C,QAAQ,IAAI,IACZ;CAER,MAAM,YAAY;CAClB,MAAM,iBAAiB;CACvB,MAAM,UAAoB,CAAC;CAC3B,KAAK,MAAM,QAAQ,aAAa,UAAU,GAAG;EAC3C,IAAI,QAAQ;EACZ,MAAM,YAAY,KAAK,SAAS,IAAI;EACpC,OAAO,SAAS,WAAW;GACzB,MAAM,OAAO,QAAQ;GACrB,IAAI,KAAK,OAAO,OAAO,KAAK;IAC1B,QAAQ,KAAK,KAAK,MAAM,OAAO,OAAO,CAAC,CAAC;IACxC,QAAQ,OAAO;GACjB,OAAO,IAAI,KAAK,OAAO,OAAO,KAAK;IACjC,QAAQ,KAAK,KAAK,MAAM,OAAO,IAAI,CAAC;IACpC,QAAQ,OAAO;GACjB,OAAO;IACL,QAAQ,KAAK,GAAG,KAAK,MAAM,OAAO,IAAI,EAAE,EAAE;IAC1C,QAAQ;GACV;EACF;EACA,MAAM,OAAO,KAAK,GAAG,EAAE;EACvB,IAAI,SAAS,OAAO,SAAS,KAAM;GACjC,MAAM,OAAO,QAAQ;GACrB,IAAI;GACJ,IAAI,QAAQ,GACV,SAAS,QAAQ,IAAI;QAChB,IAAI,SAAS,GAClB,SAAS,OAAO;QAEhB,SAAS,YAAY,QAAQ,IAAI;GAEnC,QAAQ,KAAK,KAAK,MAAM,OAAO,EAAE,IAAI,MAAM;EAC7C,OACE,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC;CAElC;CACA,MAAM,MAAM,WAAW,GAAG,EAAE;CAC5B,IAAI,QAAQ,QAAQ,QAAQ,MAC1B,QAAQ,KAAK,EAAE;CAEjB,OAAO,QAAQ,KAAK,IAAI;AAC1B;AAEA,MAAM,kCAAkB,IAAI,IAC1B,oEACF;;AAGA,SAAS,cACP,MACA,SACA,UACQ;CACR,IAAI,SAAS;CACb,KAAK,MAAM,QAAQ,SAAS,MAAM,WAAW,OAAO,GAAG;EACrD,MAAM,OAAO,OAAO,aAAa,IAAI;EACrC,UAAU,gBAAgB,IAAI,IAAI,IAC9B,OACA,IAAI,KAAK,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,GAAG,GAAG;CACzD;CACA,IAAI,YAAY,QAAQ,aAAa,MACnC,OAAO;CAET,OAAO,GAAG,WAAW,OAAO,GAAG,YAAY,GAAG,GAAG;AACnD;AAEA,SAASC,UAAQ,MAAuB;CACtC,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAChD,IAAI,KAAK,WAAW,KAAK,KAAK,KAC5B,OAAO;CAGX,OAAO;AACT;;AAGA,SAAgB,YAAY,OAAe,OAAkC;CAC3E,IAAI,UAAU,QAAQ,MAAM,WAAW,GACrC,OAAO;CAET,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,CAAC,SAAS,UAAU,QAAQ;EAClC,OAAO,GAAG,MAAM,IAAI,cAAc,MAAM,SAAS,QAAQ;CAC3D;CACA,IAAI,CAACA,UAAQ,KAAK,GAChB,OAAO,GAAG,MAAM,IAAI,cAAc,OAAO,SAAS,EAAE;CAEtD,OAAO,GAAG,MAAM,IAAI,MAAM,KAAK,EAAE;AACnC;;;;;;AAOA,SAAgB,oBAAoB,OAAuB;CACzD,IAAI,CAAC,cAAc,KAAK,GACtB,OAAO;CAET,OAAO,SACL,SAAS,OAAO,SAAS,iBAAiB,GAC1C,SACA,SACF;AACF;;AAGA,SAAgB,YAAY,OAA2B;CACrD,IAAI,OAAO,UAAU,UACnB,MAAM,IAAI,UACR,wDACF;CAEF,OAAO;AACT;;AC/SA,MAAM,mBAAmB;;AAUzB,IAAM,gBAAN,MAAoB;CAClB;CACA;CACA,OAAe;CACf,QAAgB;CAEhB,YAAY,MAAc,QAAgB;EACxC,KAAK,OAAO;EACZ,KAAK,SAAS;CAChB;CAEA,KAAK,MAAsB;EAGzB,IAAI,QAAQ,KAAK,SAAS,KAAK,UAAU,MAAM,KAAK,SAAS,OAC3D,OAAO,KAAK;EAEd,KAAK,OAAO;EACZ,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,QAAQ,IAAI;EAChD,OAAO,KAAK;CACd;AACF;AAWA,MAAM,YAAY;;;;;AAMlB,IAAM,qBAAN,MAAyB;CACvB;CACA;CACA;CACA;CACA;CAEA,YAAY,MAAc;EACxB,KAAK,OAAO;EACZ,KAAK,SAAS,IAAI,cAAc,MAAM,IAAI;EAC1C,KAAK,WAAW,IAAI,cAAc,MAAM,GAAG;EAC3C,KAAK,SAAS,IAAI,cAAc,MAAM,IAAI;EAC1C,KAAK,UAAU,IAAI,cAAc,MAAM,IAAI;CAC7C;CAEA,KAAK,MAAuC;EAC1C,MAAM,EAAE,SAAS;EACjB,IAAI,QAAQ,KAAK,OAAO,KAAK,IAAI;EACjC,OAAO,UAAU,IAAI;GAEnB,MAAM,WAAW,KAAK,SAAS,KAAK,QAAQ,CAAC;GAC7C,IAAI,aAAa,IACf,OAAO;GAET,MAAM,WAAW,KAAK,OAAO,WAAW,CAAC;GACzC,IACE,aAAa,MACb,UAAU,SAAS,QAAQ,KAC3B,KAAK,OAAO,WAAW,CAAC,MAAM,KAC9B;IAIA,MAAM,QAAQ,KAAK,OAAO,KAAK,WAAW,CAAC;IAC3C,IAAI,UAAU,IACZ,OAAO;IAET,MAAM,UAAU,KAAK,QAAQ,KAAK,WAAW,CAAC;IAC9C,IAAI,YAAY,MAAM,UAAU,OAC9B,OAAO;KACL;KACA,KAAK,QAAQ;KACb,SAAS,KAAK,MAAM,QAAQ,GAAG,QAAQ;KACvC;KACA,SAAS,KAAK,MAAM,WAAW,GAAG,KAAK;IACzC;GAEJ;GACA,QAAQ,KAAK,OAAO,KAAK,QAAQ,CAAC;EACpC;EACA,OAAO;CACT;AACF;;AAGA,SAAgB,eAAe,MAAuB;CACpD,OAAO,IAAI,mBAAmB,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;AAClD;;;;;AAMA,SAAgB,kBAAkB,MAAwB;CACxD,MAAM,UAAU,IAAI,mBAAmB,IAAI;CAC3C,MAAM,QAAkB,CAAC;CACzB,IAAI,WAAW;CACf,IAAI,QAAQ,QAAQ,KAAK,CAAC;CAC1B,OAAO,UAAU,MAAM;EACrB,MAAM,KACJ,KAAK,MAAM,UAAU,MAAM,KAAK,GAChC,MAAM,SACN,MAAM,UACN,MAAM,OACR;EACA,WAAW,MAAM;EACjB,QAAQ,QAAQ,KAAK,QAAQ;CAC/B;CACA,MAAM,KAAK,KAAK,MAAM,QAAQ,CAAC;CAC/B,OAAO;AACT;AAEA,MAAM,QAAQ;AACd,MAAM,UAAU;AAChB,MAAMC,UAAQ;AACd,MAAMC,QAAM;;;;;;AAOZ,SAAgB,kBAAkB,MAAuB;CACvD,IAAI,cAAc;CAClB,IAAI,kBAAkB;CACtB,IAAI,YAAY;CAChB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,KAAK,WAAW,KAAK;EAClC,IAAI,SAAS,OAAO;GAElB,MAAM,UAAU,eAAe,QAAQ,IAAI,cAAc;GACzD,IAAI,YAAY,MAAM,UAAU,WAC9B,OAAO;EAEX,OAAO,IAAI,SAAS,SAAS;GAC3B,kBAAkB;GAClB,cAAc;EAChB,OAAO,IAAI,SAASD,WAAS,SAASC,OACpC,YAAY;CAEhB;CACA,OAAO;AACT;;AAGA,SAAgB,uBAAuB,MAAsB;CAC3D,OAAO,KACJ,WAAW,KAAK,GAAG,CAAC,CACpB,QAAQ,mBAAkB,UACzB,OAAO,aAAa,OAAO,SAAS,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,CACzD;AACJ;;AAGA,SAAgB,iBAAiB,MAA0B;CACzD,IAAI,CAAC,MACH,uBAAO,IAAI,WAAW;CAExB,OAAO,UAAU,iBAAiB,IAAI,CAAC;AACzC;AAEA,SAAS,UAAU,QAA2C;CAC5D,IAAI,OAAO,WAAW,KAAK,OAAO,OAAO,KAAA,GACvC,OAAO,OAAO;CAEhB,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,QAClB,UAAU,MAAM;CAElB,MAAM,SAAS,IAAI,WAAW,MAAM;CACpC,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,QAAQ;EAC1B,OAAO,IAAI,OAAO,MAAM;EACxB,UAAU,MAAM;CAClB;CACA,OAAO;AACT;AAEA,MAAM,cAAc,WAAW,GAAG,EAAI;;;;;;;AActC,SAAgB,aAAa,QAAsC;CACjE,IAAI,CAAC,eAAe,MAAM,GACxB,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC;CAExB,MAAM,QAAgB,CAAC;CACvB,KAAK,MAAM,QAAQ,aAAa,MAAM,GAAG;EACvC,MAAM,QAAQ,kBAAkB,IAAI;EAEpC,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;GACpD,IAAI,YAAY,MAAM,UAAU;GAChC,IAAI,UAAU,GACZ,YAAY,SAAS,SAAS;GAEhC,IAAI,WACF,MAAM,KAAK;IAAE,MAAM;IAAW,UAAU;IAAM,SAAS;GAAK,CAAC;GAE/D,IAAI,QAAQ,IAAI,MAAM,QAAQ;IAC5B,MAAM,WAAW,MAAM,QAAQ,MAAM,GAAA,CAAI,YAAY;IACrD,MAAM,YAAY,MAAM,QAAQ,MAAM,GAAA,CAAI,YAAY;IACtD,MAAM,UAAU,MAAM,QAAQ,MAAM;IACpC,MAAM,KAAK;KAAE,MAAM;KAAS;KAAU;IAAQ,CAAC;GACjD;EACF;CACF;CAKA,MAAM,OAAe,CAAC;CACtB,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACpD,MAAM,OAAO,MAAM;EACnB,MAAM,WAAW,MAAM,QAAQ;EAC/B,MAAM,OAAO,MAAM,QAAQ;EAO3B,IAAI,EALF,aAAa,KAAA,KACb,SAAS,KAAA,KACT,SAAS,aAAa,QACtB,KAAK,aAAa,QAClB,UAAU,KAAK,IAAI,IAEnB,KAAK,KAAK,IAAI;CAElB;CACA,MAAM,UAAkD,CAAC;CACzD,KAAK,MAAM,QAAQ,MACjB,IAAI,KAAK,aAAa,MACpB,QAAQ,KAAK,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC;MACjC,IAAI,KAAK,aAAa,KAC3B,QAAQ,KAAK,CAAC,uBAAuB,KAAK,IAAI,GAAG,KAAK,OAAO,CAAC;MACzD;EACL,IAAI,UAAU,KAAK;EACnB,MAAM,WAAW,QAAQ,SAAS;EAClC,IAAI,UACF,WAAW,MAAM,MAAM,GAAG,IAAI,QAAQ;EAExC,IAAI;GACF,QAAQ,KAAK,CAAC,iBAAiB,OAAO,GAAG,KAAK,OAAO,CAAC;EACxD,SAAS,OAAO;GACd,IAAI,iBAAiB,eACnB,MAAM,IAAI,iBAAiB,uBAAuB;GAEpD,MAAM;EACR;CACF;CAIF,MAAM,YAA2C,CAAC;CAClD,IAAI,MAAoB,CAAC;CACzB,IAAI,cAA6B;CACjC,KAAK,MAAM,CAAC,MAAM,YAAY,SAAS;EACrC,MAAM,QAAQ,OAAO,SAAS,WAAW,iBAAiB,IAAI,IAAI;EAClE,IAAI,IAAI,WAAW,GAAG;GACpB,IAAI,KAAK,KAAK;GACd,cAAc;EAChB,OAAO,IAAI,YAAY,aAAa;GAClC,UAAU,KAAK,CAAC,UAAU,GAAG,GAAG,WAAW,CAAC;GAC5C,MAAM,CAAC,KAAK;GACZ,cAAc;EAChB,OAAO,IAAI,gBAAgB,MACzB,IAAI,KAAK,aAAa,KAAK;OAE3B,IAAI,KAAK,KAAK;CAElB;CACA,UAAU,KAAK,CAAC,UAAU,GAAG,GAAG,WAAW,CAAC;CAC5C,OAAO;AACT;AAUA,MAAM,iCAAiB,IAAI,IACzB,qEACF;AAEA,SAAS,eAAe,OAA2B;CACjD,IAAI,SAAS;CACb,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,OAAO,OAAO,aAAa,IAAI;EACrC,UAAU,eAAe,IAAI,IAAI,KAAK,SAAS,KAAO,IAAI;CAC5D;CACA,OAAO;AACT;AAEA,SAAS,eAAe,OAAmB,SAAyB;CAClE,IAAI,MAAM,WAAW,GACnB,OAAO;CAET,IAAI,UAAU;CACd,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,OAAO,OAAO,aAAa,IAAI;EACrC,IAAI,SAAS,IACX,WAAW;OACN,IAAI,eAAe,IAAI,IAAI,GAChC,WAAW;OAEX,WAAW,IAAI,KAAK,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,GAAG,GAAG;CAElE;CACA,OAAO,KAAK,QAAQ,KAAK,QAAQ;AACnC;AAEA,SAAS,mBAAmB,OAA2B;CAErD,OADe,KAAK,MAAM,MAAM,SAAS,CAC7B,IAAI,KAAK,MAAM,SAAS,IAAI,IAAI;AAC9C;AAEA,SAAS,mBAAmB,OAAmB,SAAyB;CACtE,IAAI,MAAM,WAAW,GACnB,OAAO;CAET,OAAO,KAAK,QAAQ,KAAK,UAAU,KAAK,EAAE;AAC5C;AAEA,SAAS,qBAAqB,OAAmB,SAAyB;CACxE,OAAO,mBAAmB,KAAK,IAAI,eAAe,KAAK,IACnD,mBAAmB,OAAO,OAAO,IACjC,eAAe,OAAO,OAAO;AACnC;AAIA,SAAS,iBAAiB,MAAsB;CAC9C,OAAO,qBAAqB,SAAS,MAAM,OAAO,GAAG,OAAO;AAC9D;AAIA,SAAS,wBAAwB,MAAsB;CACrD,OAAO,qBACL,SAAS,MAAM,SAAS,iBAAiB,GACzC,cACF;AACF;AAMA,IAAM,cAAN,MAAkB;CAChB,QAAiB,CAAC;CAClB;CAEA,YAAY,cAAc,GAAG;EAC3B,KAAK,cAAc;CACrB;CAEA,KAAK,KAAa,MAAoB;EACpC,KAAK,MAAM,KAAK,CAAC,KAAK,IAAI,CAAC;CAC7B;CAEA,MAAa;EACX,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE;CACpC;CAEA,IAAI,SAAiB;EACnB,IAAI,QAAQ,KAAK;EACjB,KAAK,MAAM,CAAC,KAAK,SAAS,KAAK,OAC7B,SAAS,IAAI,SAAS,KAAK;EAE7B,OAAO;CACT;CAEA,WAAmB;EACjB,OAAO,KAAK,MAAM,KAAK,CAAC,KAAK,UAAU,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE;CAC5D;CAEA,QAAc;EACZ,KAAK,QAAQ,CAAC;EACd,KAAK,cAAc;CACrB;CAEA,WAAoB;EAClB,OACE,KAAK,gBAAgB,MACpB,KAAK,MAAM,WAAW,KAAK,UAAU,KAAK,SAAS,CAAC;CAEzD;AACF;AAEA,MAAM,gBAAgB;AAEtB,IAAM,iBAAN,MAAqB;CACnB,QAA2B,CAAC;CAC5B;CAEA,YAAY,cAAsB;EAChC,KAAK,UAAU,IAAI,YAAY,YAAY;CAC7C;CAEA,SAAS,SAAyB;EAChC,KAAK,QAAQ;EACb,OAAO,KAAK,MAAM,KAAK,OAAO;CAChC;CAEA,UAAgB;EACd,MAAM,MAAM,KAAK,QAAQ,IAAI;EAC7B,IAAI,IAAI,OAAO,OAAO,IAAI,OAAO,IAC/B,KAAK,QAAQ,KAAK,IAAI,IAAI,IAAI,EAAE;EAElC,IAAI,KAAK,QAAQ,SAAS,GAAG;GAC3B,IAAI,KAAK,QAAQ,SAAS,KAAK,KAAK,MAAM,SAAS,GACjD,KAAK,MAAM,KAAK,MAAM,SAAS,MAAM,KAAK,QAAQ,SAAS;QAE3D,KAAK,MAAM,KAAK,KAAK,QAAQ,SAAS,CAAC;EAE3C;EACA,KAAK,QAAQ,MAAM;CACrB;CAEA,gBAAsB;EACpB,KAAK,QAAQ,KAAK,KAAK,EAAE;CAC3B;;CAGA,KAAK,KAAa,MAAc,SAAqC;EACnE,IAAI,YAAY,MAAM;GACpB,MAAM,SAAS,MAAM,KAAA,CAAM,MAAM,aAAa;GAC9C,IAAI,MAAM,IACR,MAAM,QAAQ,EAAE;QAEhB,MAAM,MAAM;GAEd,KAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,MAAM,QAAQ,SAAS,GACrD,KAAK,QAAQ,KAAK,MAAM,UAAU,IAAI,MAAM,QAAQ,MAAM,EAAE;GAE9D;EACF;EACA,KAAK,QAAQ,KAAK,KAAK,QAAQ,IAAI,CAAC;CACtC;AACF;;;;;AAMA,SAAgB,kBACd,MACA,OACA,UAAU,MACF;CAGR,IAAI,UAAgC;CACpC,IAAI,cAAc,KAAK,GACrB,UAAU;MAEV,IAAI;EACF,SAAS,OAAO,OAAO;CACzB,SAAS,OAAO;EACd,IAAI,EAAE,iBAAiB,qBACrB,MAAM;EAER,UAAU;CACZ;CAEF,MAAM,YAAY,IAAI,eAAe,KAAK,SAAS,CAAC;CAEpD,MAAM,QAAQ,aAAa,KAAK;CAChC,UAAU,KAAK,IAAI,MAAM,MAAM,IAAI,OAAO;CAC1C,KAAK,MAAM,QAAQ,MAAM,MAAM,CAAC,GAAG;EACjC,UAAU,QAAQ;EAClB,IAAI,YAAY,MAAM;GACpB,MAAM,WAAW,SAAS,IAAI;GAC9B,UAAU,KACR,KAAK,MAAM,GAAG,KAAK,SAAS,SAAS,MAAM,GAC3C,UACA,OACF;EACF,OACE,UAAU,KAAK,KAAK,IAAI,SAAS,IAAI,KAAK,OAAO;CAErD;CACA,IAAI,MAAM,SAAS,GACjB,UAAU,QAAQ;CAEpB,UAAU,cAAc;CACxB,MAAM,UAAU,UAAU,SAAS,OAAO;CAC1C,IAAI,kBAAkB,OAAO,GAC3B,MAAM,IAAI,iBACR,uDAAuDC,SAAO,OAAO,GACvE;CAEF,OAAO;AACT;;ACtgBA,MAAM,KAAK;AACX,MAAM,cAAc;AACpB,MAAM,uBAAuB;AAE7B,MAAM,iBAAiB;;;;;;;;;;;;;;;AAgBvB,IAAa,eAAb,MAA0B;CACxB,wBAAyB,IAAI,IAAqB;CAClD;CACA,QAAgB;CAEhB,YAAY,WAAW,GAAG;EACxB,KAAK,WAAW;CAClB;CAEA,IAAI,SAAsC;EACxC,OAAO,KAAK,MAAM,IAAI,OAAO;CAC/B;CAEA,IAAI,SAAkB,MAAoB;EACxC,KAAK,SAAS,eAAe,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,KAAK;EACjE,IAAI,KAAK,WAAW,KAAK,KAAK,QAAQ,KAAK,UACzC,MAAM,IAAI,mBACR,mDAAmD,KAAK,SAAS,2CACnE;EAEF,KAAK,MAAM,IAAI,SAAS,IAAI;CAC9B;;CAGA,OAAO,SAAwB;EAC7B,KAAK,MAAM,OAAO,OAAO;CAC3B;AACF;AAIA,SAAS,WAAW,QAAkB,MAAoB;CACxD,IAAI,CAAC,MACH;CAEF,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,aAAa,EAAE,IAAI,IAAI;AACxE;AAEA,SAAS,aAAa,QAAkB,SAAwB;CAC9D,KAAK,MAAM,CAAC,MAAM,UAAU,QAAQ,SAAS,GAAG;EAC9C,MAAM,SAAS,GAAG,KAAK,IAAI,kBAAkB,MAAM,KAAK,IAAI;EAE5D,IAAI,qBAAqB,KAAK,OAAO,MAAM,GAAG,EAAU,CAAC,GACvD,MAAM,IAAI,iBACR,mCAAmCC,SAAO,MAAM,GAClD;EAEF,OAAO,KAAK,MAAM;CACpB;CACA,OAAO,KAAK,EAAE;AAChB;AAEA,SAAS,WAAW,QAAkB,SAAgC;CACpE,IAAI,UAAU,QAAQ,WAAW;CACjC,IAAI,YAAY,MACd,OAAO;CAET,IAAI,OAAO,YAAY,UACrB,MAAM,IAAI,UAAU,+BAA+B;CAErD,IAAI,QAAsB;CAE1B,MAAM,MAAM,QAAQ;CACpB,MAAM,UAAU,cAAc,GAAG,IAAI,QAAQ,SAAS,SAAS,IAAI,KAAA;CACnE,IAAI,YAAY,KAAA,GAAW;EACzB,MAAM,YAAY,QAAQ,KAAK;EAC/B,UAAU,OAAO,2BAA2B;EAC5C,UAAU,WAAW,KAAK,YAAY,OAAO,CAAC;EAC9C,UAAU,UAAU,WAAW;EAC/B,QAAQ,CACN,UAAU,IAAI,2BAA2B,KAAK,IAC9C,UAAU,IAAI,cAAc,KAAK,EACnC;CACF;CACA,WAAW,QAAQ,OAAO;CAC1B,OAAO;AACT;AAEA,SAAS,gBACP,QACA,SACA,OACM;CACN,MAAM,WAAW,QAAQ,WAAW;CACpC,IAAI,OAAO,aAAa,UAAU;EAChC,OAAO,KAAK,QAAQ;EACpB;CACF;CACA,MAAM,SAAS,YAAY,CAAC,EAAA,CAAG,KAAI,SAAQ,QAAQ,MAAM,KAAK,CAAC;CAC/D,IAAI,WAAW,QAAQ,YAAY;CACnC,IAAI,CAAC,UAAU;EAGb,WAAW,aAAa,MAAM,KAAK,EAAE,CAAC;EACtC,QAAQ,YAAY,QAAQ;CAC9B;CACA,IAAI,QAAQ,aAAa,MAAM;EAC7B,WAAW,QAAQ,QAAQ,QAAQ;EACnC,OAAO,KAAK,EAAE;CAChB;CACA,OAAO,KAAK,KAAK,WAAW,IAAI;CAChC,MAAM,CAAC,OAAO,GAAG,QAAQ;CACzB,IAAI,UAAU,KAAA,GACZ,OAAO,KAAK,KAAK;CAEnB,KAAK,MAAM,QAAQ,MACjB,OAAO,KAAK,GAAG,GAAG,IAAI,WAAW,MAAM,IAAI;CAE7C,OAAO,KAAK,GAAG,GAAG,IAAI,SAAS,IAAI,IAAI;CACvC,IAAI,QAAQ,aAAa,MACvB,WAAW,QAAQ,QAAQ,QAAQ;AAEvC;AAEA,MAAMC,kBAAgB;AAEtB,MAAM,aAAa;AACnB,MAAM,wBAAwB;AAK9B,SAAS,aAAa,MAAsB;CAC1C,MAAM,QAAQ,YAAY,CAAC,CAAC,CAAC,gBAAgB,IAAI;CACjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,IAAI,OAAO,KAAK,CAAC,CAAC,SAAS,uBAAuB,GAAG,EAAE;CACpF,IAAI,YAAY;CAChB,KAAK,IAAI,UAAU,IAAK,WAAW,GAAG;EACpC,MAAM,UAAU,UAAU,QAAQA,iBAAe,MAAM;EAKvD,IAAI,CAAC,IAJoB,OACvB,OAAO,GAAG,aAAa,QAAQ,qBAC/B,GAEc,CAAC,CAAC,KAAK,IAAI,GACzB,OAAO;EAET,YAAY,GAAG,KAAK,GAAG;CACzB;AACF;AAEA,SAAS,qBACP,QACA,SACA,OACM;CACN,MAAM,SAAmB,CAAC;CAC1B,MAAM,UAAU,QAAQ,WAAW;CACnC,KAAK,MAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,GAAG;EACxD,MAAM,OAAO,QAAQ,MAAM,KAAK;EAChC,MAAM,QAAQ,KAAK,MAAM,EAAE;EAC3B,OAAO,KAAK,MAAM,GAAG,EAAE,MAAM,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI;CACtE;CACA,OAAO,KAAK,OAAO,KAAK,EAAE,CAAC;AAC7B;AAEA,SAAS,cACP,QACA,SACA,OACM;CACN,MAAM,EAAE,YAAY;CACpB,IAAI,MAAM,QAAQ,OAAO,GAAG;EAC1B,MAAM,QAAQ,QAAQ;EACtB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,WAAW,yBAAyB;EAEhD,OAAO,KAAK,QAAQ,OAAO,KAAK,CAAC;CACnC,OAAO,IAAI,YAAY,MACrB,OAAO,KAAK,OAAO;AAEvB;AAEA,SAAS,SACP,QACA,SACA,OACc;CACd,MAAM,OAAO,QAAQ,mBAAmB;CACxC,MAAM,MAAM,QAAQ,kBAAkB;CACtC,IAAI,SAAS,aACX,gBAAgB,QAAQ,SAAS,KAAK;MACjC,IAAI,SAAS,aAAa,QAAQ,mBACvC,qBAAqB,QAAQ,SAAS,KAAK;MACtC,IAAI,SAAS,WAClB,cAAc,QAAQ,SAAS,KAAK;MAEpC,OAAO,WAAW,QAAQ,OAAO;CAEnC,OAAO;AACT;;AAGA,SAAS,QAAQ,SAAkB,OAAoC;CACrE,MAAM,SAAS,OAAO,IAAI,OAAO;CACjC,IAAI,WAAW,KAAA,GACb,OAAO;CAET,MAAM,OAAiB,CAAC;CACxB,MAAM,QAAQ,SAAS,MAAM,SAAS,KAAK;CAC3C,IAAI,UAAU;CACd,IAAI,UAAU,MAAM;EAClB,UAAU,QAAQ,KAAK;EACvB,IAAI,QAAQ,IAAI,2BAA2B,MAAM,KAAA,GAC/C,QAAQ,IAAI,6BAA6B,MAAM,EAAE;OAEjD,QAAQ,cAAc,6BAA6B,MAAM,EAAE;EAE7D,QAAQ,cAAc,gBAAgB,MAAM,EAAE;CAChD;CACA,MAAM,SAAmB,CAAC;CAC1B,aAAa,QAAQ,OAAO;CAG5B,IAAI,OAAO,OAAO,KAAK,EAAE;CACzB,KAAK,MAAM,SAAS,MAClB,QAAQ;CAEV,OAAO,IAAI,SAAS,IAAI;CACxB,OAAO;AACT;;;;;;AAOA,SAAgB,SACd,SACA,QAA6B,MACrB;CACR,OAAO,QAAQ,SAAS,KAAK;AAC/B;;;AC1OA,SAAS,WAAW,OAAwC;CAC1D,MAAM,QAAQ,MAAM,QAAQ,GAAG;CAC/B,IAAI,UAAU,IACZ,OAAO,CAAC,QAAQ,KAAK,GAAG,IAAI;CAE9B,OAAO,CAAC,QAAQ,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,QAAQ,MAAM,MAAM,QAAQ,CAAC,CAAC,CAAC;AACzE;AAGA,SAAS,QACP,MACA,KACA,OACA,KACQ;CACR,MAAM,SAAS,KAAK;CACpB,MAAM,OACJ,QAAQ,IAAI,KAAK,IAAI,GAAG,SAAS,KAAK,IAAI,KAAK,IAAI,OAAO,MAAM;CAClE,MAAM,KAAK,MAAM,IAAI,KAAK,IAAI,GAAG,SAAS,GAAG,IAAI,KAAK,IAAI,KAAK,MAAM;CACrE,IAAI,KAAK,MACP,OAAO;CAET,MAAM,QAAQ,KAAK,MAAM,MAAM,EAAE;CACjC,IAAI,QAAQ;CACZ,IAAI,QAAQ,MAAM,QAAQ,GAAG;CAC7B,OAAO,UAAU,IAAI;EACnB,SAAS;EACT,QAAQ,MAAM,QAAQ,KAAK,QAAQ,IAAI,MAAM;CAC/C;CACA,OAAO;AACT;AAIA,SAAS,OACP,MACA,KACA,OACA,MAAM,KAAK,QACH;CACR,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK;CAC9B,IAAI,OAAO,KAAK,QACd,OAAO,KAAK,QAAQ,KAAK,IAAI;CAE/B,IAAI,MAAM,OAAO,IAAI,QACnB,OAAO;CAET,MAAM,QAAQ,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,GAAG;CAC/C,OAAO,UAAU,KAAK,KAAK,OAAO;AACpC;;AAGA,SAAgB,WAAW,OAAyB;CAClD,MAAM,OAAO,IAAI;CACjB,MAAM,QAAkB,CAAC;CACzB,IAAI,QAAQ;CACZ,OAAO,OAAO,MAAM,KAAK,KAAK,MAAM,OAAO;EACzC,SAAS;EACT,IAAI,MAAM,OAAO,MAAM,KAAK,KAAK;EACjC,IAAI,MAAM;EACV,IAAI,OAAO;EACX,OAAO,MAAM,GAAG;GACd,QAAQ,QAAQ,MAAM,MAAK,KAAK,GAAG,IAAI,QAAQ,MAAM,QAAO,KAAK,GAAG;GACpE,IAAI,OAAO,MAAM,GACf;GAEF,MAAM,OAAO,OAAO,MAAM,KAAK,MAAM,CAAC;GACtC,MAAM;GACN,MAAM;EACR;EACA,IAAI,MAAM,GACR,MAAM,KAAK;EAEb,MAAM,SAAS,OAAO,QAAQ,OAAO,MAAM,KAAK,OAAO,GAAG,IAAI;EAC9D,IAAI;EACJ,IAAI,WAAW,IACb,QAAQ,KAAK,MAAM,OAAO,GAAG;OAE7B,QAAQ,GAAG,SAAS,KAAK,MAAM,OAAO,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,GAAG,SAAS,KAAK,MAAM,SAAS,GAAG,GAAG,CAAC;EAEtG,MAAM,KAAK,QAAQ,KAAK,CAAC;EACzB,QAAQ;CACV;CACA,OAAO;AACT;AAGA,SAAS,YAAY,OAA6B;CAEhD,OAAO,IADO,MAAM,KAAI,SAAS,SAAS,OAAO,SAASC,SAAO,IAAI,CACtD,CAAC,CAAC,KAAK,IAAI,EAAE;AAC9B;AAEA,SAAS,aAAa,OAA+B;CACnD,IAAI,OAAO,UAAU,UACnB,OAAOC,UAAQ,KAAK;CAEtB,OAAO;EAAC,MAAM;EAAI,MAAM;EAAIA,UAAQ,MAAM,EAAE;CAAC;AAC/C;AAEA,SAAS,YAAY,QAAkC;CACrD,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,QAClB,UAAU,MAAM;CAElB,MAAM,SAAS,IAAI,WAAW,MAAM;CACpC,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,QAAQ;EAC1B,OAAO,IAAI,OAAO,MAAM;EACxB,UAAU,MAAM;CAClB;CACA,OAAO;AACT;AAKA,SAAS,kBAAkB,OAA+B;CACxD,MAAM,SAAS,IAAI,WAAW,MAAM,MAAM;CAC1C,IAAI,SAAS;CACb,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACpD,MAAM,OAAO,MAAM,UAAU;EAC7B,IAAI,SAAS,MAAQ,SAAS,IAAM;GAClC,OAAO,UAAU;GACjB,UAAU;EACZ;CACF;CACA,OAAO,OAAO,SAAS,GAAG,MAAM;AAClC;;;;;AAMA,UAAU,UAAU,OAA0C;CAC5D,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACZ,OAAO,QAAQ,MAAM,QAAQ;EAC3B,MAAM,OAAO,MAAM;EACnB,IAAI,SAAS,MAAQ,SAAS,IAAM;GAClC,MAAM,MAAM,SAAS,OAAO,KAAK;GACjC,SAAS,SAAS,MAAQ,MAAM,QAAQ,OAAO,KAAO,IAAI;GAC1D,QAAQ;EACV,OACE,SAAS;CAEb;CACA,IAAI,QAAQ,MAAM,QAChB,MAAM,MAAM,SAAS,KAAK;AAE9B;AAEA,SAAS,OAAO,MAAkB,QAAoC;CACpE,IAAI;EACF,OAAO,UAAU,MAAM,MAAM;CAC/B,SAAS,OAAO;EACd,IAAI,iBAAiB,eACnB,OAAO;EAET,MAAM;CACR;AACF;;AAGA,SAAgB,QAAQ,SAAoD;CAC1E,MAAM,WAAW,QAAQ,SAAS;CAElC,MAAM,SAAS,OAAO,YAAY,CAAC,SADnB,IAAI,WAAW,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,EACf,CAAC,CAAC,GAAG,IAAI;CAC3D,IAAI,WAAW,MACb,OAAO,CAAC,QAAQ,WAAW,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;CAEpE,MAAM,UAAU,OAAO,SAAS,KAAK;CACrC,IAAI,YAAY,MACd,OAAO,CAAC,SAAS,CAAC,IAAI,8BAA8B,CAAC,CAAC;CAExD,MAAM,SAAS,OACb,YAAY,CAAC,SAAS,WAAW,GAAG,IAAM,EAAI,CAAC,CAAC,GAChD,KACF;CACA,IAAI,WAAW,MACb,OAAO,CACL,QACA,CAAC,IAAI,8BAA8B,GAAG,IAAI,2BAA2B,CAAC,CACxE;CAEF,OAAO,CAAC,SAAS,CAAC,IAAI,0BAA0B,CAAC,CAAC;AACpD;AAEA,SAAS,gBAAgB,MAAkB,QAAyB;CAClE,IAAI,KAAK,SAAS,OAAO,QACvB,OAAO;CAET,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAClD,IAAI,KAAK,WAAW,OAAO,WAAW,KAAK,GACzC,OAAO;CAGX,OAAO;AACT;AAEA,SAAS,cAAc,OAA2B;CAChD,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,OACjB,QAAQ,OAAO,aAAa,IAAI;CAElC,OAAO;AACT;AAGA,MAAM,YACJ;AACF,MAAM,WAAW;AAEjB,SAAS,cAAc,MAA2B;CAChD,IAAI,CAAC,gBAAgB,MAAM,QAAQ,GACjC,OAAO;CAET,MAAM,OAAO,cAAc,KAAK,SAAS,CAAC,CAAC;CAC3C,MAAM,QAAQ,KAAK,QAAQ,GAAG;CAC9B,OAAO,UAAU,KAAK,UAAU,KAAK,OAAO,KAAK,MAAM,GAAG,KAAK,CAAC;AAClE;AAEA,SAAS,aAAa,MAA8B;CAClD,IAAI;EACF,OAAO,MAAM,IAAI;CACnB,SAAS,OAAO;EACd,IAAI,EAAE,iBAAiB,gBACrB,MAAM;EAER,MAAM,SAAS,KAAK,SAAU,KAAK,MAAM,KAAK,KAAM,MAAM,IAAI,KAAK,CAAC;EACpE,OAAO,MAAM,KAAK,SAAS,GAAG,MAAM,CAAC;CACvC;AACF;;;;;;;AAQA,SAAS,SAAS,SAAiC;CACjD,MAAM,QAAQ,UAAU,OAAO;CAC/B,IAAI,OAAO,MAAM,KAAK;CACtB,OAAO,CAAC,KAAK,QAAQ,CAAC,cAAc,KAAK,KAAK,GAC5C,OAAO,MAAM,KAAK;CAEpB,IAAI,KAAK,MACP,MAAM,IAAI,MAAM,wBAAwB;CAE1C,MAAM,SAAS,IAAI,WAAW,QAAQ,MAAM;CAC5C,IAAI,SAAS;CACb,KAAK,OAAO,MAAM,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO,MAAM,KAAK,GAAG;EACzD,MAAM,OAAO,KAAK;EAClB,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,iBAAiB;EAEnC,IAAI,QAAQ,cAAc,IAAI,GAAG,QAAQ,MAAM,OAC7C;EAEF,MAAM,UAAU,aAAa,IAAI;EACjC,IAAI,SAAS,QAAQ,SAAS,OAAO,QACnC,MAAM,IAAI,MAAM,2CAA2C;EAE7D,OAAO,IAAI,SAAS,MAAM;EAC1B,UAAU,QAAQ;CACpB;CACA,OAAO,OAAO,SAAS,GAAG,MAAM;AAClC;;AAGA,IAAa,UAAb,MAAqB;;CAEnB,UAA8B,CAAC;CAC/B,WAA0B;;CAE1B,UAAmB;CACnB,WAA0B;CAC1B,WAA0B;CAC1B,UAA2B,CAAC;CAC5B,cAAsB;;CAGtB,SAAS,QAA6B,MAAc;EAClD,OAAO,SAAS,MAAM,KAAK;CAC7B;;CAGA,WAAmB;EACjB,OAAO,KAAK,SAAS;CACvB;CAEA,cAAuB;EACrB,OAAO,MAAM,QAAQ,KAAK,OAAO;CACnC;CAEA,OAAO,SAAwB;EAC7B,IAAI,KAAK,YAAY,MACnB,KAAK,UAAU,CAAC,OAAO;OAClB,IAAI,MAAM,QAAQ,KAAK,OAAO,GACnC,KAAK,QAAQ,KAAK,OAAO;OAEzB,MAAM,IAAI,UACR,+DACF;CAEJ;;;;;;CAOA,aAAsB;EACpB,MAAM,EAAE,YAAY;EACpB,IAAI,OAAO,YAAY,YAAY,CAAC,cAAc,OAAO,GACvD,OAAO;EAET,IAAI;EACJ,IAAI;GACF,WAAW,SAAS,SAAS,SAAS,iBAAiB;EACzD,SAAS,OAAO;GACd,IAAI,iBAAiB,cACnB,OAAO;GAET,MAAM;EACR;EACA,IAAI;GACF,OAAO,SAAS,UAAU,KAAK,kBAAkB,KAAK,SAAS,SAAS;EAC1E,SAAS,OAAO;GACd,IAAI,iBAAiB,aACnB,OAAO,SAAS,UAAU,SAAS,SAAS;GAE9C,MAAM;EACR;CACF;;;;;CAMA,oBAAuC;EACrC,IAAI,MAAM,QAAQ,KAAK,OAAO,GAC5B,OAAO;EAET,MAAM,UAAU,KAAK,WAAW;EAChC,MAAM,MAAM,QACV,KAAK,IAAI,2BAA2B,KAAK,EAC3C,CAAC,CAAC,YAAY;EACd,IAAI;EACJ,IAAI;GACF,WAAW,SAAS,SAAS,SAAS,iBAAiB;EACzD,QAAQ;GACN,WAAW,iBAAiB,OAAO;EACrC;EACA,IAAI,QAAQ,oBACV,OAAO,MAAM,QAAQ;EAEvB,IAAI,QAAQ,UAAU;GACpB,MAAM,CAAC,OAAO,WAAW,QAAQ,kBAAkB,QAAQ,CAAC;GAC5D,KAAK,QAAQ,KAAK,GAAG,OAAO;GAC5B,OAAO;EACT;EACA,IACE,QAAQ,gBACR,QAAQ,cACR,QAAQ,SACR,QAAQ,SAER,IAAI;GACF,OAAO,SAAS,QAAQ;EAC1B,QAAQ;GACN,OAAO;EACT;EAEF,OAAO;CACT;;;;;;CAOA,WAAW,SAAiB,UAAmC,MAAY;EACzE,IAAI,YAAY,MAAM;GACpB,KAAK,UAAU;GACf;EACF;EACA,MAAM,KAAK,mBAAmB,UAAU,UAAU,IAAI,QAAQ,OAAO;EACrE,KAAK,UAAU,SACb,kBAAkB,SAAS,GAAG,eAAe,iBAAiB,GAC9D,SACA,iBACF;EACA,KAAK,WAAW,EAAE;CACpB;;CAGA,WAAW,SAAiC;EAC1C,MAAM,KAAK,mBAAmB,UAAU,UAAU,IAAI,QAAQ,OAAO;EACrE,IAAI,CAAC,KAAK,IAAI,cAAc,GAC1B,KAAK,IAAI,gBAAgB,KAAK;EAEhC,IAAI,KAAK,IAAI,cAAc,GACzB,KAAK,SAAS,WAAW,GAAG,iBAAiB,CAAC;OAE9C,KAAK,IACH,gBACA,eAAe,YAAY,WAAW,GAAG,iBAAiB,CAAC,GAC7D;EAEF,IAAI,GAAG,iBAAiB,GAAG,iBAAiB,CAAC,CAAC,YAAY,GACxD,KAAK,UAAU,GAAG,WAAY,KAAK,WAA6B,EAAE;EAEpE,IAAI,KAAK,IAAI,2BAA2B,GACtC;EAEF,IAAI,GAAG,iBAAiB,QAAQ,GAAG,iBAAiB,UAAU;GAG5D,MAAM,OAAQ,KAAK,WAA6B;GAChD,IAAI,UAA+B;GACnC,IAAI,MACF,IAAI;IACF,UAAU,SAAS,MAAM,SAAS,iBAAiB;GACrD,SAAS,OAAO;IACd,IAAI,EAAE,iBAAiB,eACrB,MAAM;IAER,UAAU,kBAAkB,MAAM,GAAG,aAAa;GACpD;GAEF,KAAK,UAAU,GAAG,WAAW,OAAO;GACpC,KAAK,IACH,6BACA,GAAG,iBAAiB,OAAO,qBAAqB,QAClD;GACA;EACF;EAEA,MAAM,OAAO,KAAK,kBAAkB;EACpC,IAAI,MAAM;EACV,IAAI,SAAS,MACX,IAAI;GACF,SAAS,MAAM,OAAO;EACxB,SAAS,OAAO;GACd,IAAI,EAAE,iBAAiB,eACrB,MAAM;GAER,MAAM;EACR;EAEF,KAAK,IAAI,6BAA6B,GAAG;CAC3C;;CAGA,SAAS,OAAe,OAAqB;EAC3C,MAAM,SAAS;EACf,IAAI,QAA4B,KAAK,IAAI,MAAM,IAC3C,KAAK,IAAI,MAAM,IACf;EACJ,IAAI,KAAK,SAAS,OAAO,MAAM,GAAG;GAChC,QAAQ;GACR,KAAK,MAAM,CAAC,UAAU,aAAa,KAAK,UAAU,MAAM,KAAK,CAAC,GAAG;IAC/D,MAAM,cACJ,SAAS,YAAY,MAAM,MAAM,YAAY,IACzC,YAAY,OAAO,KAAK,IACxB,YAAY,UAAU,QAAQ;IACpC,QAAQ,QAAQ,GAAG,MAAM,IAAI,gBAAgB;GAC/C;EACF,OAAO,IAAI,OACT,QAAQ,GAAG,MAAM,IAAI,YAAY,OAAO,KAAK;OAE7C,QAAQ,YAAY,OAAO,KAAK;EAElC,IAAI,UAAU,KAAK,IAAI,MAAM,GAAG;GAC9B,KAAK,OAAO,MAAM;GAClB,KAAK,IAAI,QAAQ,KAAK;EACxB;CACF;;CAGA,cAAc,MAAc,OAAqB;EAC/C,MAAM,QAAQ,KAAK,YAAY;EAC/B,MAAM,QAAQ,KAAK,QAAQ,WACxB,CAAC,SAAS,IAAI,YAAY,MAAM,KACnC;EACA,IAAI,UAAU,IACZ,MAAM,IAAI,SAAS,KAAK;EAE1B,KAAK,QAAQ,SAAS,CAAC,KAAK,QAAQ,MAAM,GAAG,MAAM,MAAM,KAAK;CAChE;;CAGA,OAAgB;EACd,MAAM,OAAO,OAAO,OAClB,OAAO,OAAO,OAAO,eAAe,IAAI,CAAW,GACnD,IACF;EACA,KAAK,UAAU,KAAK,QAAQ,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,KAAK,CAAC;EAC9D,KAAK,UAAU,CAAC,GAAG,KAAK,OAAO;EAC/B,OAAO;CACT;CAEA,IAAI,SAAiB;EACnB,OAAO,KAAK,QAAQ;CACtB;CAEA,IAAI,MAAuB;EACzB,MAAM,QAAQ,KAAK,YAAY;EAC/B,OAAO,KAAK,QAAQ,MAAM,CAAC,SAAS,IAAI,YAAY,MAAM,KAAK;CACjE;CAEA,OAAiB;EACf,OAAO,KAAK,QAAQ,KAAK,CAAC,SAAS,GAAG;CACxC;CAKA,SAAmB;EACjB,OAAO,KAAK,QAAQ,KAAK,GAAG,WAAW,oBAAoB,KAAK,CAAC;CACnE;CAEA,QAA4B;EAC1B,OAAO,KAAK,QAAQ,KAAK,CAAC,KAAK,WAAW,CACxC,KACA,oBAAoB,KAAK,CAC3B,CAAC;CACH;;CAGA,WAA+B;EAC7B,OAAO,KAAK,QAAQ,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,KAAK,CAAC;CACxD;CAEA,IAAI,MAAkC;EACpC,MAAM,QAAQ,KAAK,YAAY;EAC/B,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,SAC9B,IAAI,IAAI,YAAY,MAAM,OACxB,OAAO,oBAAoB,KAAK;CAItC;CAEA,OAAO,MAAoC;EACzC,MAAM,QAAQ,KAAK,YAAY;EAC/B,MAAM,SAAS,KAAK,QACjB,QAAQ,CAAC,SAAS,IAAI,YAAY,MAAM,KAAK,CAAC,CAC9C,KAAK,GAAG,WAAW,oBAAoB,KAAK,CAAC;EAChD,OAAO,OAAO,SAAS,IAAI,SAAS,KAAA;CACtC;;CAGA,IAAI,MAAc,OAAqB;EACrC,KAAK,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC;CACjC;;CAGA,OAAO,MAAc,OAAqB;EACxC,KAAK,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC;CACjC;;CAGA,OAAO,MAAoB;EACzB,MAAM,QAAQ,KAAK,YAAY;EAC/B,KAAK,UAAU,KAAK,QAAQ,QAAQ,CAAC,SAAS,IAAI,YAAY,MAAM,KAAK;CAC3E;CAEA,iBAAyB;EACvB,MAAM,QAAQ,KAAK,IAAI,cAAc;EACrC,IAAI,UAAU,KAAA,GACZ,OAAO,KAAK,eAAe;EAE7B,MAAM,QAAQ,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY;EAC/C,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,GAC9B,OAAO;EAET,OAAO;CACT;CAEA,qBAA6B;EAC3B,OAAO,KAAK,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;CAChD;CAEA,oBAA4B;EAC1B,OAAO,KAAK,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;CAChD;CAEA,iBAAyB;EACvB,OAAO,KAAK;CACd;CAEA,eAAe,OAAqB;EAClC,KAAK,cAAc;CACrB;CAEA,kBACE,QACoC;EACpC,MAAM,QAAQ,KAAK,IAAI,MAAM;EAC7B,IAAI,UAAU,KAAA,GACZ;EAEF,MAAM,SAA6B,CAAC;EACpC,KAAK,MAAM,SAAS,WAAW,KAAK,GAAG;GACrC,MAAM,QAAQ,MAAM,QAAQ,GAAG;GAC/B,IAAI,UAAU,IACZ,OAAO,KAAK,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QAEhC,OAAO,KAAK,CACV,QAAQ,MAAM,MAAM,GAAG,KAAK,CAAC,GAC7B,QAAQ,MAAM,MAAM,QAAQ,CAAC,CAAC,CAChC,CAAC;EAEL;EACA,OAAO,aAAa,MAAM;CAC5B;;CAGA,UAAU,SAAS,gBAAoD;EACrE,OAAO,KAAK,kBAAkB,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK,WAAW,CAC3D,KACA,aAAa,KAAK,CACpB,CAAC;CACH;;CAGA,SAAS,OAAe,SAAS,gBAAwC;EACvE,IAAI,CAAC,KAAK,IAAI,MAAM,GAClB;EAEF,MAAM,QAAQ,MAAM,YAAY;EAChC,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,kBAAkB,MAAM,KAAK,CAAC,GAC5D,IAAI,IAAI,YAAY,MAAM,OACxB,OAAO,aAAa,KAAK;CAI/B;;CAGA,cAAkC;EAChC,IAAI,WAAW,KAAK,SAAS,YAAY,qBAAqB;EAC9D,IAAI,aAAa,KAAA,GACf,WAAW,KAAK,SAAS,QAAQ,cAAc;EAEjD,IAAI,aAAa,KAAA,GACf;EAEF,OAAO,QAAQ,qBAAqB,QAAQ,CAAC;CAC/C;;CAGA,cAAkC;EAChC,MAAM,WAAW,KAAK,SAAS,UAAU;EACzC,IAAI,aAAa,KAAA,GACf;EAGF,OAAO,SAAS,qBAAqB,QAAQ,CAAC;CAChD;;CAGA,YAAY,UAAwB;EAClC,MAAM,SAAS,KAAK,kBAAkB,cAAc;EACpD,IAAI,WAAW,KAAA,GACb,MAAM,IAAI,iBAAiB,8BAA8B;EAE3D,IAAI,QAAQ;EACZ,MAAM,YAAoC,OAAO,KAAK,CAAC,KAAK,WAAW;GACrE,IAAI,IAAI,YAAY,MAAM,YAAY;IACpC,QAAQ;IACR,OAAO,CAAC,YAAY,IAAI,SAAS,EAAE;GACrC;GACA,OAAO,CAAC,KAAK,KAAK;EACpB,CAAC;EACD,IAAI,CAAC,OACH,UAAU,KAAK,CAAC,YAAY,IAAI,SAAS,EAAE,CAAC;EAE9C,MAAM,YAAY,UACf,KAAK,CAAC,KAAK,WAAW;GACrB,IAAI,UAAU,IACZ,OAAO;GAET,OAAO,GAAG,IAAI,GAAG,OAAO,UAAU,WAAW,QAAQ,YAAY,KAAK;EACxE,CAAC,CAAC,CACD,KAAK,IAAI;EACZ,KAAK,UAAU,KAAK,QAAQ,KAAK,CAAC,MAAM,WACtC,KAAK,YAAY,MAAM,iBAAiB,CAAC,MAAM,SAAS,IAAI,CAAC,MAAM,KAAK,CAC1E;CACF;;CAGA,oBAAwC;EACtC,MAAM,MAAM,KAAK,SAAS,SAAS;EACnC,IAAI,QAAQ,KAAA,GACV;EAEF,IAAI;EACJ,IAAI,OAAO,QAAQ,UACjB,UAAU;OACL;GACL,MAAM,WAAW,IAAI,MAAM;GAC3B,IAAI;IACF,UAAU,SAAS,iBAAiB,IAAI,EAAE,GAAG,QAAQ;GACvD,SAAS,OAAO;IACd,IAAI,EAAE,iBAAiB,eAAe,iBAAiB,eACrD,MAAM;IAER,UAAU,IAAI;GAChB;EACF;EACA,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GACnD,IAAI,QAAQ,WAAW,KAAK,KAAK,KAC/B;EAGJ,OAAO,QAAQ,YAAY;CAC7B;;CAGA,wBAA4C;EAC1C,MAAM,QAAQ,KAAK,IAAI,qBAAqB;EAC5C,IAAI,UAAU,KAAA,GACZ;EAEF,OAAO,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY;CAC1C;;;;;CAMA,CAAC,OAA2B;EAC1B,MAAM;EAGN,MAAM,QAA8C,CAAC;EACrD,IAAI,MAAM,QAAQ,KAAK,OAAO,GAC5B,MAAM,KAAK;GAAE,OAAO,KAAK;GAAS,MAAM;EAAE,CAAC;EAE7C,KAAK,IAAI,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,KAAA,GAAW,MAAM,MAAM,GAAG,EAAE,GAAG;GAClE,MAAM,OAAO,IAAI,MAAM,IAAI;GAC3B,IAAI,SAAS,KAAA,GAAW;IACtB,MAAM,IAAI;IACV;GACF;GACA,IAAI,QAAQ;GACZ,MAAM;GACN,IAAI,MAAM,QAAQ,KAAK,OAAO,GAC5B,MAAM,KAAK;IAAE,OAAO,KAAK;IAAS,MAAM;GAAE,CAAC;EAE/C;CACF;AACF;;AClxBA,MAAM,gBAAgB;;AAEtB,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;AAoCpC,SAAS,gBAAgB,OAAmC;CAC1D,IAAI,QAAQ;CACZ,MAAM,YAAY,MAAM,QAAQ,KAAK;CACrC,IACE,cAAc,MACd,CAAC,4BAA4B,KAAK,MAAM,MAAM,GAAG,SAAS,CAAC,GAE3D,QAAQ,YAAY;MACf,IAAI,MAAM,WAAW,IAAI,GAC9B,QAAQ;CAEV,MAAM,KAAK,MAAM,YAAY,GAAG;CAChC,IAAI,KAAK,OACP,OAAO;CAET,MAAM,YAAY,MAAM,MAAM,KAAK,CAAC,CAAC,OAAO,aAAa;CACzD,MAAM,MAAM,cAAc,KAAK,MAAM,SAAS,QAAQ;CACtD,OAAO;EAAE;EAAO;EAAI,aAAa,KAAK;CAAI;AAC5C;AAEA,SAAS,UAAU,OAAuB;CACxC,MAAM,QAAQ,gBAAgB,KAAK;CACnC,IAAI,UAAU,MACZ,OAAO;CAET,MAAM,EAAE,OAAO,IAAI,gBAAgB;CACnC,IAAI,CAAC,aAIH,OAAO,GAAG,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,MAAM,MAAM,EAAE;CAErD,MAAM,WAAW,MAAM,MAAM,OAAO,EAAE;CACtC,MAAM,QAAQ,SAAS,QAAQ,GAAG;CAClC,MAAM,SAAS,UAAU,KAAK,QAAQ,GAAG,SAAS,MAAM,GAAG,KAAK,EAAE;CAClE,OAAO,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,SAAS,MAAM,MAAM,EAAE;AAC3D;AAmBA,SAAgB,qBACd,OACoB;CACpB,IAAI,OAAO,UAAU,UACnB,OAAO,UAAU,KAAK;CAExB,OAAO,MAAM,KAAI,SAAS,OAAO,SAAS,WAAW,UAAU,IAAI,IAAI,IAAK;AAC9E;;;;;;;;AASA,SAAgB,WAAW,OAAyB;CAClD,MAAM,QAAQ,gBAAgB,KAAK;CACnC,IAAI,UAAU,MACZ,OAAO,CAAC;CAEV,MAAM,WAAW,MAAM,MAAM,MAAM,OAAO,MAAM,EAAE;CAClD,MAAM,QAAQ,SAAS,QAAQ,GAAG;CAClC,MAAM,SAAS,UAAU,KAAK,WAAW,SAAS,MAAM,QAAQ,CAAC;CACjE,MAAM,YAAY,OAAO,OAAO,aAAa;CAC7C,MAAM,SAAS,cAAc,KAAK,SAAS,OAAO,MAAM,GAAG,SAAS;CACpE,OAAO,CAAC,mBAAG,IAAI,IAAI,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,QAAO,SAAQ,SAAS,EAAE;AAClE;;;;;;;;AASA,SAAgB,sBACd,MACA,aACQ;CACR,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,eAAe,CAAC,GAAG;EACrC,SAAS,OAAO,WAAW,OAAO,UAAU,KAAK,CAAC;EAClD,KAAK,MAAM,UAAU,WAAW,KAAK,GACnC,SAAS,OAAO,WAAW,QAAQ,KAAK;CAE5C;CACA,OAAO;AACT;;;AC5HA,IAAa,YAAb,cAA+B,MAAM;CACnC,OAAgB;AAClB;;AAGA,IAAa,iBAAb,cAAoC,UAAU;CAC5C,OAAgB;AAClB;;AAGA,IAAa,mBAAb,cAAsC,eAAe;CACnD,OAAgB;AAClB;;AAGA,IAAa,eAAb,cAAkC,eAAe;CAC/C,OAAgB;AAClB;;AAGA,IAAa,YAAb,cAA+B,eAAe;CAC5C,OAAgB;AAClB;;AAGA,IAAa,sBAAb,cAAyC,eAAe;CACtD,OAAgB;AAClB;;;;;;AAOA,IAAa,aAAb,cAAgC,MAAM;CACpC,OAAgB;AAClB;;AAGA,IAAa,kBAAb,cAAqC,UAAU;CAC7C,OAAgB;CAChB;;CAEA;CAEA,YAAY,SAAiB,QAAgB,MAAc,IAAI;EAC7D,MAAM,OAAO;EACb,KAAK,SAAS;EACd,KAAK,MAAM;CACb;AACF;;;;;;;;AASA,SAAgB,kBAAkB,OAAuC;CACvE,IAAI,iBAAiB,YACnB,OAAO;CAET,IAAI,iBAAiB,iBACnB,OAAO,QAAQ,MAAM,OAAO,YAAY,MAAM,IAAI;CAEpD,OAAO,GAAG,MAAM,KAAK,IAAI,MAAM;AACjC;AA+BA,MAAM,kBAAkB;AACxB,MAAM,aAAa;AACnB,MAAM,cAAc;AACpB,MAAM,kBAAkB;;AAGxB,SAAgB,UAAU,KAAqB;CAC7C,MAAM,SAAS,qBAAqB,GAAG;CACvC,MAAM,MAAM,OAAO,OAAO,eAAe;CACzC,OAAO,QAAQ,KAAK,SAAS,OAAO,MAAM,GAAG,GAAG;AAClD;;AAGA,SAAS,QAAQ,MAAsB;CACrC,OAAO,KAAK,WAAW,kBAAiB,YACtC,OAAO,KAAK,QAAQ,WAAW,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,MAAM,CACjE;AACF;;;;;;AAOA,SAAgB,oBAAoB,KAGlC;CACA,IAAI,CAAC,IAAI,SAAS,GAAG,GACnB,OAAO;EAAE;EAAK,eAAe;CAAK;CAEpC,MAAM,SAAS,IAAI,IAAI,GAAG;CAC1B,IAAI,OAAO,aAAa,MAAM,OAAO,aAAa,IAChD,OAAO;EAAE;EAAK,eAAe;CAAK;CAEpC,MAAM,cAAc,GAAG,QAAQ,OAAO,QAAQ,EAAE,GAAG,QAAQ,OAAO,QAAQ;CAC1E,OAAO,WAAW;CAClB,OAAO,WAAW;CAClB,OAAO;EACL,KAAK,OAAO;EACZ,eAAe,SAAS,OAAO,KAAK,WAAW,CAAC,CAAC,SAAS,QAAQ;CACpE;AACF;AAEA,SAAS,gBAAgB,QAAwB;CAC/C,IAAI,SAAS,KACX,OAAO;CAET,IAAI,SAAS,KACX,OAAO;CAET,IAAI,SAAS,KACX,OAAO;CAET,OAAO;AACT;AAEA,SAAS,eACP,OACA,WACW;CACX,IAAI,iBAAiB,WACnB,OAAO;CAET,IACE,iBAAiB,UAChB,MAAM,SAAS,kBAAkB,MAAM,SAAS,eAEjD,OAAO,IAAI,iBAAiB,WAAW;CAEzC,MAAM,QAAQ,iBAAiB,QAAQ,MAAM,QAAQ,KAAA;CAQrD,OAAO,IAAI,WANT,iBAAiB,QACb,MAAM,UACN,iBAAiB,QACf,MAAM,UACN,OAAO,KAAK,EAAA,CAGV,WAAW,cAAa,WAAU,UAAU,MAAM,CAAC,CAC7D;AACF;AAEA,SAAS,aAAa,UAAkC;CACtD,OAAO,IAAI,eAAe,yBAAyB,SAAS,OAAO;AACrE;;AAGA,eAAsB,SACpB,UACA,UACqB;CACrB,MAAM,WAAW,OAAO,SAAS,QAAQ,IAAI,gBAAgB,CAAC;CAC9D,IAAI,OAAO,SAAS,QAAQ,KAAK,WAAW,UAAU;EACpD,MAAM,SAAS,MAAM,OAAO;EAC5B,MAAM,aAAa,QAAQ;CAC7B;CACA,IAAI,SAAS,SAAS,MACpB,uBAAO,IAAI,WAAW;CAIxB,MAAM,SAAS,SAAS,KAAK,UAAU;CACvC,MAAM,SAAuB,CAAC;CAC9B,IAAI,QAAQ;CACZ,SAAS;EAEP,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;EAC1C,IAAI,MACF;EAEF,SAAS,MAAM;EACf,IAAI,QAAQ,UAAU;GAEpB,MAAM,OAAO,OAAO;GACpB,MAAM,aAAa,QAAQ;EAC7B;EACA,OAAO,KAAK,KAAK;CACnB;CAGA,MAAM,SAAS,OAAO,OAAO,QAAQ,KAAK;CAC1C,OAAO,IAAI,WAAW,OAAO,QAAQ,OAAO,YAAY,OAAO,UAAU;AAC3E;;AAGA,SAAS,gBAAgB,UAA2B;CAClD,IAAI;EACF,YAAY,QAAQ;EACpB,OAAO;CACT,SAAS,OAAO;EACd,IAAI,iBAAiB,aACnB,OAAO;EAET,MAAM;CACR;AACF;;;;;;AAOA,SAAgB,mBACd,MACA,aACQ;CACR,IAAI,KAAK,WAAW,GAClB,OAAO;CAET,IAAI,WAAW;CACf,IAAI,gBAAgB,MAAM;EACxB,MAAM,UAAU,IAAI,QAAQ;EAC5B,QAAQ,IAAI,gBAAgB,WAAW;EACvC,MAAM,UAAU,QAAQ,kBAAkB;EAC1C,IAAI,YAAY,KAAA,KAAa,gBAAgB,OAAO,GAClD,WAAW;CAEf;CACA,OAAO,SAAS,MAAM,UAAU,SAAS;AAC3C;;AAGA,eAAsB,QACpB,KACA,SACuB;CACvB,IAAI,CAAC,IAAI,SAAS,GAAG,GAAG;EACtB,IAAI,WAAW,KAAK,GAAG,GACrB,MAAM,IAAI,WAAW,aAAa;EAEpC,MAAM,IAAI,oBACR,6DACF;CACF;CACA,MAAM,WAAW,IAAI,IAAI,GAAG;CAC5B,MAAM,EAAE,KAAK,YAAY,kBAAkB,oBAAoB,GAAG;CAClE,MAAM,SAAS,IAAI,IAAI,UAAU;CAEjC,IAAI,OAAO,aAAa,WAAW,OAAO,aAAa,UACrD,MAAM,IAAI,oBACR,4CAA4C,OAAO,SAAS,KAC9D;CAEF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,UAAU,CAAC,CAAC,GAC5D,OAAO,aAAa,IAAI,KAAK,KAAK;CAEpC,IAAI,WAAW;CACf,IAAI,kBAAkB,MACpB,WAAW,SAAS,WAChB,GAAG,SAAS,SAAS,GAAG,SAAS,SAAS,KAC1C,GAAG,SAAS,SAAS;CAE3B,MAAM,WAAW,qBACf,GAAG,OAAO,SAAS,IAAI,WAAW,OAAO,OAAO,OAAO,UACzD;CACA,MAAM,UAAU,EAAE,GAAG,QAAQ,QAAQ;CACrC,IAAI,kBAAkB,MACpB,QAAQ,gBAAgB;CAE1B,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,MAAM,QAAQ;GAC7B;GACA,UAAU;GACV,QAAQ,YAAY,QAAQ,QAAQ,UAAU,GAAI;EACpD,CAAC;CACH,SAAS,OAAO;EACd,MAAM,eAAe,OAAO,YAAY;CAC1C;CACA,MAAM,EAAE,WAAW;CACnB,MAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;CACvD,IAAI;CACJ,IAAI;EACF,OAAO,MAAM,SAAS,UAAU,QAAQ,YAAA,QAAkC;CAC5E,SAAS,OAAO;EACd,MAAM,eAAe,OAAO,SAAS;CACvC;CACA,MAAM,YAAY,UAAU,OAAO,SAAS;CAC5C,OAAO;EACL;EACA;EACA,KAAK;EACL;EACA,YAAY,mBAAmB,MAAM,WAAW;EAChD,YAAqB,KAAK,MAAM,IAAI,YAAY,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;EACrE,sBAAsB;GACpB,IAAI,CAAC,WAAW;IACd,MAAM,SAAS,aAAa,WAAW;IACvC,MAAM,IAAI,gBACR,GAAG,gBAAgB,MAAM,EAAE,IAAI,OAAO,GAAG,OAAO,aAAa,SAAS,0FACoB,UAC1F,QACA,QACF;GACF;EACF;CACF;AACF;;ACvVA,MAAM,cAAc,KAAK,KAAK,aAAa,0BAA0B;AAErE,IAAI,cAA6B;;AAGjC,SAAgB,iBAAyB;CACvC,IAAI,gBAAgB,MAClB,OAAO;CAET,IAAI,YAAY,YAAY;CAC5B,SAAS;EACP,IAAI,WAAW,KAAK,KAAK,WAAW,WAAW,CAAC,GAAG;GACjD,cAAc;GACd,OAAO;EACT;EACA,MAAM,SAAS,KAAK,QAAQ,SAAS;EACrC,IAAI,WAAW,WACb,MAAM,IAAI,MACR,wDAAwD,YAAY,UACtE;EAEF,YAAY;CACd;AACF;;AAGA,SAAgB,gBAAgB,MAAsB;CACpD,OAAO,KAAK,KAAK,eAAe,GAAG,aAAa,IAAI;AACtD;AAEA,IAAI,iBAAgD;;;;;AAMpD,SAAgB,qBAA6C;CAC3D,mBAAmB,OAAO,uBAAuB,CAAC,MAC/C,WAAyC,OAAO,wBAC3C,IACR;CACA,OAAO;AACT;;AC5BA,MAAM,4BACJ;AAEF,MAAMC,6BAA2B;AACjC,MAAM,sBAAsB;;;;;;AAO5B,MAAa,eAAyB,CAAC;AAavC,SAAS,SAAS,QAAkB,MAAoB;CACtD,KAAK,MAAM,QAAQ,aAAa,IAAI,GAAG;EACrC,MAAM,WAAW,QAAQ,IAAI;EAC7B,IAAI,UACF,OAAO,KAAK,QAAQ;CAExB;AACF;AAGA,MAAM,mCAAmB,IAAI,IAA+B;;;;;;;;;;;;;AAc5D,SAAgB,iBACd,UAAmC,CAAC,GACjB;CACnB,MAAM,MAAM,KAAK,UAAU;EACzB,QAAQ,OAAO;EACf,QAAQ,iBAAiB;EACzB,QAAQ,WAAW;EACnB,QAAQ,sBAAsB;CAChC,CAAC;CACD,MAAM,UAAU,iBAAiB,IAAI,GAAG;CACxC,IAAI,YAAY,KAAA,GACd,OAAO;CAET,MAAM,OAAO,kBAAkB,OAAO,CAAC,CAAC,cAAc;EACpD,iBAAiB,OAAO,GAAG;CAC7B,CAAC;CACD,iBAAiB,IAAI,KAAK,IAAI;CAC9B,OAAO;AACT;AAEA,eAAe,kBACb,SACmB;CACnB,MAAM,MAAM,QAAQ,OAAO;CAC3B,MAAM,UAAU,QAAQ,WAAW;CACnC,MAAM,qBAAqB,QAAQ,sBAAsB;CAEzD,MAAM,SAAmB,CAAC;CAE1B,IAAI,EAAE,WAAW,qBACf,IAAI;EACF,OAAO,MAAM,sCAAsC,UAAU,GAAG,EAAE,IAAI;EACtE,MAAM,WAAW,MAAM,QAAQ,KAAK;GAClC,SAAS,EAAE,cAAc,WAAW;GACpC,SAASA;GACT,UAAU;EACZ,CAAC;EACD,SAAS,eAAe;EACxB,SAAS,QAAQ,SAAS,KAAK,CAAC;CAClC,SAAS,OAAO;EACd,IAAI,EAAE,iBAAiB,aAAa,iBAAiB,aACnD,MAAM;EAER,OAAO,QACL,kCAAkC,kBAAkB,KAAK,GAC3D;CACF;CAGF,IAAI,OAAO,WAAW,GAAG;EACvB,MAAM,OAAO,QAAQ,iBAAiB,gBAAgB,mBAAmB;EACzE,OAAO,KAAK,8BAA8B,MAAM;EAChD,SAAS,QAAQ,MAAM,SAAS,MAAM,MAAM,CAAC;CAC/C;CAGA,aAAa,SAAS;CACtB,KAAK,MAAM,SAAS,QAClB,aAAa,KAAK,KAAK;CAEzB,OAAO;AACT;AAKA,SACE,cACA,aAAa,gBAAgB,mBAAmB,GAAG,MAAM,CAC3D;AAGA,MAAM,uBAAuB;AAE7B,MAAM,gBAAgB;CACpB,mBAAmB;CACnB,qBAAqB;CACrB,UAAU;CACV,iBAAiB;CACjB,aAAa;CACb,kBAAkB;AACpB;;;;;;AAOA,SAAgB,cAAc,QAA+B;CAG3D,MAAM,UADU,OAAO,SAAS,GAAG,IAAI,OAAO,MAAM,GAAG,EAAE,IAAI,OAAA,CACtC,YAAY,CAAC,CAAC,MAAM,GAAG;CAC9C,IAAI,OAAO,SAAS,EAAE,GACpB,OAAO;CAET,MAAM,SAAS,OAAO,KAAK,GAAG;CAC9B,MAAM,SAAS,gBAAgB,QAAQ,aAAa;CAEpD,IAAI,eAAe,SAAS,OAAO,MAAM,GAAG,CAAC,CAAC,SAAS;CAKvD,MAAM,QAAQ,gBACZ,GAAG,qBAAqB,GAAG,UAC3B,aACF;CACA,IAAI,SAAS,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,OAAO,SAAS,GACvD,eAAe,OAAO;CAExB,IAAI,OAAO,SAAS,eAAe,GACjC,OAAO;CAET,OAAO,OAAO,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,KAAK,GAAG;AACnD;;;;;;;AAQA,SAAgB,cAAc,QAA+B;CAC3D,MAAM,UAAU,OAAO,YAAY;CACnC,MAAM,eAAe,cAAc,OAAO;CAC1C,KAAK,MAAM,YAAY,cACrB,IAAI,QAAQ,SAAS,QAAQ,GAC3B,OAAO,QAAQ,QAAQ,UAAU,GAAG,GAAG,GAAG;CAG9C,OAAO;AACT;;;ACrMA,IAAa,WAAb,cAA8B,MAAM;CAClC,OAAgB;AAClB;;AAGA,MAAM,mBAAmB;AAIzB,MAAM,cAAc;CAClB,aAAa;CACb,YAAY;CACZ,SAAS;CACT,eAAe;CACf,oBAAoB;CACpB,SAAS;AACX;AAGA,MAAMC,QAAM;AACZ,MAAM,YAAY;AAClB,MAAM,QAAQ;AAEd,SAAS,YAAY,MAAuB;CAC1C,OAAO,SAAS,QAAQ,SAAS;AACnC;;;;;;AAOA,UAAU,cAAc,MAAiC;CACvD,IAAI,QAAQ;CACZ,OAAO,QAAQ,KAAK,QAAQ;EAC1B,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK;EACxC,MAAM,MAAM,YAAY,KAAK,KAAK,SAAS,UAAU;EACrD,MAAM,KAAK,MAAM,OAAO,GAAG;EAC3B,QAAQ;CACV;AACF;AAEA,IAAM,YAAN,MAAgB;CACd,QAA0B,YAAY;CACtC,SAAmB,CAAC;CACpB,QAAQ;CACR,cAAc;CAEd,QAAc;EACZ,KAAK,QAAQ,YAAY;EACzB,KAAK,SAAS,CAAC;EACf,KAAK,QAAQ;EACb,KAAK,cAAc;CACrB;CAEA,YAAkB;EAChB,KAAK,OAAO,KAAK,KAAK,KAAK;EAC3B,KAAK,QAAQ;EACb,KAAK,cAAc;CACrB;CAEA,QAAQ,MAAoB;EAC1B,IAAI,KAAK,eAAe,kBACtB,MAAM,IAAI,SAAS,kCAAkC,iBAAiB,EAAE;EAE1E,KAAK,SAAS;EACd,KAAK,eAAe;CACtB;;CAGA,YAAY,MAAoB;EAC9B,QAAQ,KAAK,OAAb;GACE,KAAK,YAAY;IACf,IAAI,SAASA,OACX;IAEF,IAAI,YAAY,IAAI,GAAG;KACrB,KAAK,QAAQ,YAAY;KACzB;IACF;IACA,KAAK,QAAQ,YAAY;IACzB,KAAK,WAAW,IAAI;IACpB;GAEF,KAAK,YAAY;IACf,KAAK,WAAW,IAAI;IACpB;GAEF,KAAK,YAAY;IACf,IAAI,YAAY,IAAI,KAAK,SAASA,OAAK;KACrC,KAAK,UAAU;KACf,KAAK,QACH,SAASA,QAAM,YAAY,cAAc,YAAY;IACzD,OAAO,IAAI,SAAS,WAAW;KAC7B,KAAK,UAAU;KACf,KAAK,QAAQ,YAAY;IAC3B,OACE,KAAK,QAAQ,IAAI;IAEnB;GAEF,KAAK,YAAY;IACf,IAAI,SAASA,OACX;IAEF,IAAI,SAAS,OACX,KAAK,QAAQ,YAAY;SAEzB,KAAK,QAAQ,IAAI;IAEnB;GAEF,KAAK,YAAY;IACf,IAAI,SAAS,OAAO;KAClB,KAAK,QAAQ,IAAI;KACjB,KAAK,QAAQ,YAAY;IAC3B,OAAO,IAAI,SAAS,WAAW;KAC7B,KAAK,UAAU;KACf,KAAK,QAAQ,YAAY;IAC3B,OAAO,IAAI,YAAY,IAAI,KAAK,SAASA,OAAK;KAC5C,KAAK,UAAU;KACf,KAAK,QACH,SAASA,QAAM,YAAY,cAAc,YAAY;IACzD,OAAO;KAEL,KAAK,QAAQ,IAAI;KACjB,KAAK,QAAQ,YAAY;IAC3B;IACA;GAEF,KAAK,YAAY;IACf,IAAI,SAASA,OACX,KAAK,QAAQ,YAAY;SACpB,IAAI,CAAC,YAAY,IAAI,GAC1B,MAAM,IAAI,SACR,2FACF;IAEF;GAEF,SACE,MAAM,IAAI,SAAS,sBAAsB;EAE7C;CACF;CAEA,WAAmB,MAAoB;EACrC,IAAI,YAAY,IAAI,KAAK,SAASA,OAAK;GACrC,KAAK,UAAU;GACf,KAAK,QAAQ,SAASA,QAAM,YAAY,cAAc,YAAY;EACpE,OAAO,IAAI,SAAS,OAClB,KAAK,QAAQ,YAAY;OACpB,IAAI,SAAS,WAClB,KAAK,UAAU;OACV;GACL,KAAK,QAAQ,IAAI;GACjB,KAAK,QAAQ,YAAY;EAC3B;CACF;AACF;;;;;;;AAQA,UAAiB,YAAY,MAAmC;CAC9D,MAAM,SAAS,IAAI,UAAU;CAC7B,MAAM,QAAQ,cAAc,IAAI;CAChC,SAAS;EACP,OAAO,MAAM;EACb,IAAI,QAAQ;EACZ,GAAG;GACD,MAAM,OAAO,MAAM,KAAK;GACxB,IAAI,KAAK,SAAS,MAAM;IACtB,QAAQ;IACR;GACF;GACA,KAAK,MAAM,QAAQ,KAAK,OACtB,OAAO,YAAY,IAAI;GAEzB,OAAO,YAAYA,KAAG;EACxB,SAAS,OAAO,UAAU,YAAY;EACtC,IAAI,OAAO;GAET,IACE,OAAO,gBAAgB,KACvB,OAAO,UAAU,YAAY,eAC7B;IACA,OAAO,UAAU;IACjB,MAAM,OAAO;GACf;GACA;EACF;EACA,MAAM,OAAO;CACf;AACF;;;;;;;;AAiBA,UAAiB,aAAa,MAAqC;CACjE,MAAM,OAAO,YAAY,IAAI;CAC7B,MAAM,SAAS,KAAK,KAAK;CACzB,IAAI,OAAO,SAAS,MAClB;CAEF,MAAM,aAAa,OAAO;CAC1B,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,IAAI,WAAW,GACjB;EAEF,MAAM,uBAAmB,IAAI,IAAI;EACjC,KAAK,MAAM,CAAC,UAAU,UAAU,IAAI,QAAQ,GAAG;GAC7C,IAAI,YAAY,WAAW,QACzB;GAEF,KAAK,IAAI,WAAW,WAAqB,KAAK;EAChD;EACA,IAAI,IAAI,SAAS,WAAW,QAC1B,KAAK,IAAI,MAAM,IAAI,MAAM,WAAW,MAAM,CAAC;OAE3C,KAAK,MAAM,QAAQ,WAAW,MAAM,IAAI,MAAM,GAC5C,KAAK,IAAI,MAAM,IAAI;EAGvB,MAAM;CACR;AACF;;;ACnOA,IAAa,eAAb,cAAkC,MAAM;CACtC,OAAgB;AAClB;;AAGA,IAAa,aAAb,cAAgC,aAAa;CAC3C,OAAgB;;CAGhB;CAEA,YAAY,UAAyB,MAAM;EACzC,MACE,YAAY,OACR,iCACA,qCAAqC,QAAQ,QAAQ,CAAC,EAAE,SAC9D;EACA,KAAK,UAAU;CACjB;AACF;AAaA,SAAS,UAAU,OAAwB;CACzC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAEA,SAAS,aAAa,QAA4C;CAChE,OAAO,OACJ,KACC,UAAS,UAAU,MAAM,WAAW,YAAY,UAAU,MAAM,KAAK,GACvE,CAAC,CACA,KAAK,IAAI;AACd;;AAGA,IAAa,kBAAb,cAAqC,WAAW;CAC9C,OAAgB;CAChB;CAEA,YAAY,SAAiB,QAAoC;EAC/D,MAAM,OAAO;EACb,KAAK,UAAU,yCAAyC,QAAQ,QAAQ,CAAC,EAAE,YAAY,aAAa,MAAM;EAC1G,KAAK,SAAS;CAChB;AACF;;AAGA,IAAa,eAAb,cAAkC,aAAa;CAC7C,OAAgB;CAEhB,YAAY,UAAU,6BAA6B;EACjD,MAAM,OAAO;CACf;AACF;;AAGA,IAAa,cAAb,cAAiC,aAAa;CAC5C,OAAgB;CAEhB,YACE,UAAU,gEACV;EACA,MAAM,OAAO;CACf;AACF;;AAGA,IAAa,iBAAb,cAAoC,aAAa;CAC/C,OAAgB;CAEhB,YAAY,UAAU,4BAA4B;EAChD,MAAM,OAAO;CACf;AACF;;AAGA,IAAa,YAAb,cAA+B,eAAe;CAC5C,OAAgB;CAEhB,cAAc;EACZ,MAAM,0DAA0D;CAClE;AACF;;AAGA,IAAa,gBAAb,cAAmC,aAAa;CAC9C,OAAgB;CAEhB,YAAY,QAAgB;EAC1B,MAAM,8BAA8B,QAAQ;CAC9C;AACF;;AAGA,IAAa,aAAb,cAAgC,eAAe;CAC7C,OAAgB;CAEhB,cAAc;EACZ,MAAM,uBAAuB;CAC/B;AACF;;AAGA,IAAa,eAAb,cAAkC,eAAe;CAC/C,OAAgB;CAEhB,cAAc;EACZ,MAAM,kCAAkC;CAC1C;AACF;;AAGA,IAAa,cAAb,cAAiC,aAAa;CAC5C,OAAgB;CAEhB,cAAc;EACZ,MAAM,kCAAkC;CAC1C;AACF;;AAGA,IAAa,WAAb,cAA8B,aAAa;CACzC,OAAgB;;CAEhB;CAEA,YAAY,QAA2B;EACrC,MAAM,SACJ,OAAO,SAAS,IACZ,kCACA;EACN,MAAM,GAAG,OAAO,IAAI,OAAO,KAAK,IAAI,GAAG;EACvC,KAAK,SAAS;CAChB;AACF;;AAGA,IAAa,WAAb,cAA8B,aAAa;CACzC,OAAgB;CAEhB,cAAc;EACZ,MAAM,0DAA0D;CAClE;AACF;;AAGA,IAAa,WAAb,cAA8B,aAAa;CACzC,OAAgB;;CAGhB,YAAY,UAAkB;EAC5B,MACE,gEAAgE,UAClE;CACF;AACF;;AAGA,IAAa,gBAAb,cAAmC,aAAa;CAC9C,OAAgB;CAChB;;CAGA,YAAY,UAAkB,QAAoC;EAChE,MACE,8CAA8C,SAAS,IAAI,aAAa,MAAM,GAChF;EACA,KAAK,SAAS;CAChB;AACF;;AAGA,IAAa,gBAAb,cAAmC,aAAa;CAC9C,OAAgB;CAEhB,cAAc;EACZ,MAAM,kCAAkC;CAC1C;AACF;;AAGA,IAAa,mBAAb,cAAsC,aAAa;CACjD,OAAgB;CAEhB,YAAY,UAAU,wCAAwC;EAC5D,MAAM,OAAO;CACf;AACF;;;ACvNA,MAAa,cAAiC;CAC5C;CAAI;CAAI;CAAI;CAAI;CAAI;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CACtE;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAM;CAAM;CAAM;CACzE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CACxE;CAAM;CAAM;CAAM;CAAM;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAClE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CACtE;CAAO;CAAO;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CACtE;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CAChE;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CAAQ;CAChE;CAAQ;CAAQ;CAA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ACA,GACA,GACA,GACA,YACA,YACA,YACA,SACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,UACA,GACA,YACA,UACA,YACA,KACA,GACA,YACA,QACA,GACA,WACA,MACA,YACA,YACA,YACA,SACA,IACA,YACA,WACA,YACA,GACA,YACA,UACA,YACA,QACA,YACA,UACA,YACA,SACA,YACA,WACA,GACA,GACA,YACA,WACA,YACA,GACA,YACA,UACA,GACA,GACA,WACA,UACA,GACA,GACA,WACA,UACA,YACA,GACA,WACA,UACA,GACA,GACA,GACA,GACA,GACA,GACA,YACA,QACA,IACA,GACA,YACA,WACA,IACA,GACA,GACA,GACA,YACA,MACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,YACA,YACA,SACA,QACA,YACA,YACA,SACA,YACA,YACA,GACA,UACA,YACA,YACA,YACA,YACA,WACA,YACA,YACA,UACA,YACA,YACA,YACA,YACA,YACA,YACA,WACA,WACA,GACA,OACA,GACA,GACA,GACA,GACA,GACA,GACA,KACA,MACA,YACA,YACA,SACA,YACA,YACA,WACA,YACA,MACA,GACA,GACA,GACA,GACA,GACA,GACA,YACA,YACA,YACA,YACA,YACA,IACA,GACA,GACA,YACA,YACA,YACA,YACA,YACA,IACA,GACA,GACA,GACA,WACA,YACA,WACA,GACA,SACA,YACA,YACA,UACA,GACA,YACA,YACA,YACA,YACA,QACA,GACA,YACA,YACA,IACA,GACA,YACA,YACA,YACA,SACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,UACA,GACA,YACA,UACA,YACA,YACA,YACA,YACA,QACA,GACA,WACA,QACA,YACA,YACA,YACA,YACA,UACA,YACA,YACA,YACA,OACA,YACA,YACA,YACA,QACA,YACA,YACA,YACA,SACA,YACA,YACA,OACA,OACA,YACA,YACA,YACA,OACA,YACA,YACA,SACA,OACA,YACA,YACA,SACA,OACA,YACA,YACA,YACA,OACA,YACA,YACA,SACA,OACA,GACA,GACA,GACA,GACA,YACA,WACA,UACA,GACA,YACA,YACA,UACA,GACA,UACA,YACA,YACA,YACA,YACA,UACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,WACA,GACA,KACA,SACA,YACA,YACA,YACA,YACA,YACA,UACF;AAEA,MAAM,eAA2B,WAAW,GAC1C,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,GACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,CACF;AAEA,MAAM,aAAyB,WAAW,GACxC,IACA,GACA,IACA,IACA,IACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,IACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,CACF;AAEA,MAAM,aAAa;AACnB,MAAM,WAAW;AACjB,MAAM,aAAa;AACnB,MAAM,WAAW;AACjB,MAAM,mBAAmB;AAGzB,SAASC,SAAO,OAAmB,MAAuB;CACxD,MAAM,OAAO,MAAM,QAAQ,eAAe;CAC1C,MAAM,MAAM,OAAO;CAGnB,SADE,eAAe,QAAQ,qBAAqB,OAAO,gBAAgB,KACrD,MAAM,MAAM,eAAgB;AAC9C;;AAGA,SAAgB,aAAa,MAAuB;CAClD,OAAOA,SAAO,cAAc,IAAI;AAClC;;AAGA,SAAgB,WAAW,MAAuB;CAChD,OAAOA,SAAO,YAAY,IAAI;AAChC;;;AC/0BA,MAAM,gBAAmC;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,mBAAmB;AACzB,MAAM,wBAAwB;AAC9B,MAAM,0BAA0B;AAChC,MAAM,2BAA2B;AACjC,MAAM,yBAAyB;AAC/B,MAAM,yBAAyB;AAC/B,MAAM,gCAAgC;AACtC,MAAM,mCAAmC;AACzC,MAAM,6BAA6B;AACnC,MAAM,6BAA6B;AACnC,MAAM,yBAAyB;AAC/B,MAAM,6BAA6B;AACnC,MAAM,mCAAmC;AACzC,MAAM,qBAAqB;AAC3B,MAAM,qBAAqB;;;;;;AAO3B,IAAa,aAAb,cAAgC,MAAM;CACpC,OAAgB;;CAEhB;;CAEA;;CAEA;CAEA,YAAY,MAAc,QAAgB,QAAgB;EACxD,MACE,GAAG,cAAc,SAAS,gBAAgB,SAAS,OAAO,WAAW,QACvE;EACA,KAAK,OAAO;EACZ,KAAK,SAAS;EACd,KAAK,SAAS;CAChB;AACF;AAGA,IAAM,eAAN,MAAmB;CACjB;CAEA,YAAY,MAAc;EACxB,KAAK,OAAO;CACd;AACF;AAKA,MAAM,YAAY;AAClB,MAAM,aAAa;AACnB,MAAM,QAAQ;AACd,MAAM,SAAS;AACf,MAAM,UAAU;AAChB,MAAM,WAAW;AACjB,MAAM,WAAW;AACjB,MAAM,QAAQ;AACd,MAAM,QAAQ;AACd,MAAM,QAAQ;AACd,MAAM,UAAU;AAChB,MAAM,UAAU;AAChB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,UAAU;AAChB,MAAM,SAAS;AACf,MAAM,UAAU;AAChB,MAAM,SAAS;AACf,MAAM,UAAU;AAChB,MAAM,OAAO;AACb,MAAM,YAAY;AAClB,MAAM,SAAS;AACf,MAAM,WAAW;AACjB,MAAM,UAAU;AAChB,MAAM,WAAW;AACjB,MAAM,WAAW;AACjB,MAAM,cAAc;AACpB,MAAM,YAAY;AAClB,MAAM,UAAU;AAChB,MAAM,UAAU;AAChB,MAAM,SAAS;AACf,MAAM,UAAU;AAChB,MAAM,WAAW;AACjB,MAAM,YAAY;AAGlB,MAAM,qBAAiC;CACrC,MAAM,yBAAQ,IAAI,WAAW,GAAG,EAAA,CAAE,KAAK,QAAQ;CAC/C,KAAK,IAAI,IAAI,GAAG,IAAI,IAAM,KAAK,GAC7B,MAAM,KAAK;CAEb,MAAM,KAAQ;CACd,MAAM,MAAQ;CACd,MAAM,MAAQ;CACd,MAAM,MAAQ;CACd,MAAM,UAA8B;EAClC,CAAC,KAAK,OAAO;EACb,CAAC,MAAK,OAAO;EACb,CAAC,KAAK,MAAM;EACZ,CAAC,KAAK,SAAS;EACf,CAAC,KAAK,MAAM;EACZ,CAAC,KAAK,OAAO;EACb,CAAC,KAAK,OAAO;EACb,CAAC,KAAK,OAAO;EACb,CAAC,KAAK,MAAM;EACZ,CAAC,KAAK,OAAO;EACb,CAAC,KAAK,QAAQ;EACd,CAAC,KAAK,QAAQ;EACd,CAAC,KAAK,OAAO;EACb,CAAC,KAAK,MAAM;EACZ,CAAC,KAAK,SAAS;EACf,CAAC,KAAK,OAAO;EACb,CAAC,KAAK,KAAK;EACX,CAAC,KAAK,SAAS;EACf,CAAC,KAAK,KAAK;EACX,CAAC,KAAK,QAAQ;EACd,CAAC,KAAK,OAAO;EACb,CAAC,KAAK,OAAO;EACb,CAAC,KAAK,SAAS;EACf,CAAC,KAAK,SAAS;CACjB;CACA,KAAK,MAAM,CAAC,MAAM,SAAS,SACzB,MAAM,KAAK,WAAW,CAAC,KAAK;CAE9B,KAAK,IAAI,IAAI,IAAM,KAAK,IAAM,KAAK,GACjC,MAAM,KAAK;CAEb,KAAK,IAAI,IAAI,IAAM,KAAK,IAAM,KAAK,GAAG;EACpC,MAAM,KAAK;EACX,MAAM,IAAI,MAAQ;CACpB;CACA,KAAK,IAAI,IAAI,IAAM,KAAK,IAAM,KAAK,GAAG;EACpC,MAAM,KAAK;EACX,MAAM,IAAI,MAAQ;CACpB;CACA,OAAO;AACT,EAAA,CAAG;AAKH,MAAM,oBAAoB;AAC1B,MAAM,WAAW;AACjB,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AACzB,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,0BAA0B;AAChC,MAAM,wBAAwB;AAC9B,MAAM,8BAA8B;AACpC,MAAM,4BAA4B;AAClC,MAAM,cAAc;AACpB,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AAC5B,MAAM,iBAAiB;AACvB,MAAM,eAAe;AACrB,MAAM,SAAS;AACf,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,UAAU;AAChB,MAAM,eAAe;AACrB,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AACvB,MAAM,WAAW;AACjB,MAAM,cAAc;AACpB,MAAM,iBAAiB;AACvB,MAAM,SAAS;AACf,MAAM,cAAc;AACpB,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAC1B,MAAM,cAAc;AACpB,MAAM,uBAAuB;AAC7B,MAAM,qBAAqB;AAC3B,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AACtB,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAC5B,MAAM,2BAA2B;AACjC,MAAM,2BAA2B;AACjC,MAAM,uBAAuB;AAC7B,MAAM,YAAY;AAClB,MAAM,wBAAwB;AAC9B,MAAM,uBAAuB;AAI7B,MAAM,mBAAmB;AACzB,MAAM,eAAe;AACrB,MAAM,oBAAoB;AAE1B,MAAM,iBAAiB;AACvB,MAAMC,uBAAqB;AAC3B,MAAMC,uBAAqB;AAC3B,MAAMC,sBAAoB;AAC1B,MAAMC,sBAAoB;AAC1B,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,MAAM;AAEZ,SAASC,iBAAe,MAAuB;CAC7C,OAAO,QAAQF,uBAAqB,QAAQC;AAC9C;;;;;;AAOA,IAAM,YAAN,MAAgB;CACd;CACA;CAEA;CAEA;;CAEA,OAAO;CAEP,YAAY,MAAc,OAAgB,SAAkB;EAC1D,KAAK,OAAO;EACZ,KAAK,MAAM,KAAK;EAChB,KAAK,QAAQ;EACb,KAAK,UAAU;CACjB;CAEA,KAAK,KAAqB;EACxB,MAAM,OAAO,KAAK,KAAK,WAAW,GAAG;EACrC,IAAI,OAAO,aACT,OAAO,YAAY,SAAS;EAE9B,IAAI,QAAQH,wBAAsB,QAAQG,qBACxC,OAAO,QAAQF,uBAAqB,WAAW;EAEjD,OAAO,SAAS,gBAAgB,SAAS,eACrC,YACA;CACN;CAEA,KAAK,KAAqB;EACxB,OAAO,KAAK,KAAK,WAAW,GAAG;CACjC;CAEA,GAAG,KAAa,MAAuB;EACrC,OAAO,KAAK,KAAK,WAAW,GAAG,MAAM,KAAK,WAAW,CAAC;CACxD;CAEA,YAAoB,KAAsB;EACxC,OAAO,CAACG,iBAAe,KAAK,KAAK,WAAW,MAAM,CAAC,CAAC;CACtD;CAGA,YAAY,KAAa,KAAa,MAAsB;EAC1D,QAAQ,MAAR;GACE,KAAK,aACH,OAAO;GACT,KAAK;IACH,IAAI,MAAM,MAAM,GACd,OAAO;IAET,OAAO,KAAK,YAAY,GAAG,IAAI,eAAe;GAChD,KAAK;GACL,KAAK;GACL,KAAK,UACH,OAAO;GACT,SACE,OAAO;EACX;CACF;CAGA,SAAS,KAAa,KAAa,MAAsB;EACvD,QAAQ,MAAR;GACE,KAAK,aACH,OAAO,WAAW,KAAK,KAAK,GAAG,CAAC,IAAI,IAAI;GAC1C,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,UACH,OAAO;GACT,KAAK,UAEH,OAAO,MAAM,MAAM,IAAI,oBAAoB;GAC7C,SACE,OAAO;EACX;CACF;CAGA,WAAW,KAAa,KAAa,MAAsB;EACzD,QAAQ,MAAR;GACE,KAAK,aACH,OAAO,aAAa,KAAK,KAAK,GAAG,CAAC,IAAI,IAAI;GAC5C,KAAK;GACL,KAAK,QACH,OAAO;GACT,KAAK,UACH,OAAO,MAAM,MAAM,IAAI,oBAAoB;GAC7C,SACE,OAAO;EACX;CACF;CAGA,KAAa,MAAc,KAAqB;EAC9C,IAAI,SAAS,mBACX,OAAO;EAET,KAAK,OAAO;EACZ,OAAO;CACT;CAEA,cAA8B;EAC5B,OAAO,KAAK,UAAU,cAAc;CACtC;CAGA,YAAY,OAAe,KAAqB;EAC9C,IAAI,MAAM;EACV,IAAI,MAAM,KAAK;GACb,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG;IACtB,KAAK,OAAO;IACZ,OAAO;GACT;GACA,OAAO;GACP,OAAO,MAAM,KAAK;IAChB,MAAM,OAAO,KAAK,KAAK,GAAG;IAC1B,MAAM,OAAO,KAAK,YAAY,KAAK,KAAK,IAAI;IAC5C,IAAI,OAAO,GAAG;KACZ,OAAO;KACP;IACF;IACA,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;IAE5B,IAAI,SAAS,UAAU;KACrB,OAAO;KACP,IAAI,OAAO,KACT,OAAO;KAET,IAAI,KAAK,GAAG,KAAK,GAAG,GAAG;MACrB,OAAO;MACP,IAAI,OAAO,KACT,OAAO;MAET,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG;OACtB,KAAK,OAAO;OACZ,OAAO;MACT;MACA,KAAK,OAAO,MAAM;MAClB,OAAO;KACT;KACA;IACF;IACA,OAAO;GACT;EACF;EACA,OAAO;CACT;CAGA,SAAS,OAAe,KAAqB;EAC3C,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO;EAET,QAAQ,KAAK,KAAK,GAAG,GAArB;GACE,KAAK,UACH,OAAO,KAAK,YAAY,MAAM,GAAG,GAAG;GACtC,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK;GACL,KAAK;IACH,OAAO;IACP;GACF;IACE,KAAK,OAAO;IACZ,OAAO;EACX;EACA,OAAO,MAAM,KACX,QAAQ,KAAK,KAAK,GAAG,GAArB;GACE,KAAK,WAAW;IACd,IAAI,MAAM,MAAM,GACd,OAAO;IAGT,MAAM,YAAY,KAAK,KAAK,MAAM,CAAC;IACnC,IACE,cAAc,QACd,cAAc,SACd,cAAc,SACd,cAAc,WACd;KACA,KAAK,OAAO;KACZ,OAAO;IACT;IACA,KAAK,OAAO;IACZ,OAAO;GACT;GACA,KAAK;GACL,KAAK;GACL,KAAK;IACH,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;GACL,KAAK;IACH,OAAO;IACP;GACF;IACE,KAAK,OAAO;IACZ,OAAO;EACX;EAEF,OAAO;CACT;CAGA,aAAqB,OAAe,KAAqB;EACvD,IAAI,MAAM,UAAU,GAClB,OAAO;EAET,MAAM,SAAS,KAAK,KAAK,MAAM,OAAO,GAAG;EACzC,IAAI,WAAW,OACb,OAAO;EAET,OAAO,OAAO,YAAY,MAAM,QAAQ,cAAc;CACxD;CAGA,OAAO,OAAe,KAAqB;EACzC,IAAI,MAAM;EACV,MAAM,SAAS;EACf,IAAI,OAAO,KACT,OAAO;EAET,MAAM,QAAQ,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;EACtD,IAAI,SAAS,GACX,OAAO,KAAK,KAAK,UAAU,oBAAoB,QAAQ,cAAc,GAAG;EAE1E,OAAO;EACP,OAAO,MAAM,KAAK;GAChB,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,MAAM,OAAO,KAAK,SAAS,KAAK,KAAK,IAAI;GACzC,IAAI,OAAO,GAAG;IACZ,OAAO;IACP;GACF;GACA,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;GAE5B,IAAI,SAAS,QAAQ,SAAS,SAAS,SAAS,OAAO;IACrD,MAAM,MAAM,KAAK,aAAa,QAAQ,GAAG;IACzC,IAAI,QAAQ,aAAa;KACvB,KAAK,OAAO;KACZ,OAAO;IACT;IACA,OAAO;IACP,OAAO,MAAM,KAAK;KAChB,MAAM,QAAQ,KAAK,KAAK,GAAG;KAC3B,MAAM,YAAY,KAAK,YAAY,KAAK,KAAK,KAAK;KAClD,IAAI,YAAY,GAAG;MACjB,OAAO;MACP;KACF;KACA,IAAI,YAAY,GACd,OAAO,KAAK,KAAK,WAAW,GAAG;KAEjC,IAAI,UAAU,UAAU;MACtB,OAAO;MACP,IAAI,OAAO,KACT,OAAO;MAET,IAAI,KAAK,GAAG,KAAK,GAAG,GAAG;OACrB,KAAK,OAAO,MAAM;OAClB,OAAO;MACT;MACA;KACF;KACA,OAAO;IACT;IACA,OAAO;GACT;GACA,IAAI,SAAS,UAAU;IACrB,MAAM,MAAM,KAAK,aAAa,QAAQ,GAAG;IACzC,IAAI,QAAQ,aAAa;KACvB,KAAK,OAAO;KACZ,OAAO;IACT;IACA,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,IAAI,KAAK,GAAG,KAAK,GAAG,GAAG;KACrB,KAAK,OAAO,MAAM;KAClB,OAAO;IACT;GACF;GACA,KAAK,OAAO;GACZ,OAAO;EACT;EACA,OAAO;CACT;CAGA,iBAAiB,OAAe,KAAqB;EACnD,IAAI,MAAM;EACV,MAAM,WAAW;EACjB,IAAI,MAAM,MAAM,GACd,OAAO;EAET,KAAK,MAAM,QAAQ,UAAU;GAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG;IACvB,KAAK,OAAO;IACZ,OAAO;GACT;GACA,OAAO;EACT;EACA,KAAK,OAAO;EACZ,OAAO;CACT;CAEA,gBAAgB,OAAuB;EACrC,MAAM,EAAE,QAAQ;EAChB,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO,KAAK,YAAY;EAE1B,MAAM,OAAO,KAAK,KAAK,GAAG;EAC1B,QAAQ,MAAR;GACE,KAAK;IACH,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,GACnB;IAEF,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG;KACtB,OAAO;KACP;IACF;IACA,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK;IACH,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,IAAI,KAAK,KAAK,GAAG,MAAM,OACrB,OAAO;IAET,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,SAAS;IACP,MAAM,OAAO,KAAK,YAAY,KAAK,KAAK,IAAI;IAC5C,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;IAE5B,OAAO,OAAO,IAAI,OAAO;GAC3B;EACF;EACA,OAAO,KAAK,QAAQ,KAAK,KAAK,KAAK;CACrC;CAGA,QAAgB,OAAe,KAAa,WAA4B;EACtE,IAAI,MAAM;EACV,OAAO,MAAM,KAEX,QADa,KAAK,KAAK,GACZ,GAAX;GACE,KAAK;IACH,IAAI,MAAM,MAAM,KAAK,KAAK,YAAY,GAAG,GAAG;KAC1C,KAAK,OAAO;KACZ,OAAO;IACT;IACA,OAAO;IACP;GACF,KAAK;IACH,IAAI,aAAa,MAAM,OAAO,GAAG;KAC/B,IAAI,CAAC,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG;MAC1B,OAAO;MACP;KACF;KACA,IAAI,MAAM,OAAO,GAAG;MAClB,IAAI,CAAC,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG;OAC1B,OAAO;OACP;MACF;MACA,KAAK,OAAO,MAAM;MAClB,OAAO;KACT;IACF;IACA,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;GACL,KAAK;IACH,IAAI,CAAC,WAAW;KACd,OAAO;KACP;IACF;IACA,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IACH,KAAK,OAAO;IACZ,OAAO;GACT,SACE,OAAO;EACX;EAEF,KAAK,OAAO;EACZ,OAAO;CACT;CAGA,WAAW,OAAe,KAAqB;EAC7C,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO;EAET,MAAM,QAAQ,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;EACtD,IAAI,SAAS,GACX,OAAO,KAAK,KAAK,UAAU,oBAAoB,QAAQ,cAAc,GAAG;EAE1E,OAAO;EACP,OAAO,MAAM,KAAK;GAChB,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,MAAM,OAAO,KAAK,SAAS,KAAK,KAAK,IAAI;GACzC,IAAI,OAAO,GAAG;IACZ,OAAO;IACP;GACF;GACA,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;GAE5B,QAAQ,MAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;KACH,KAAK,OAAO,GAAG,MAAM,KAAK,OAAO,GAAG;MAClC,MAAM,QAAQ,KAAK,KAAK,GAAG;MAC3B,IAAI,UAAU,QAAQ,UAAU,SAAS,UAAU,OACjD;MAEF,IAAI,UAAU,OAAO;OACnB,KAAK,OAAO,MAAM;OAClB,OAAO;MACT;MACA,KAAK,OAAO;MACZ,OAAO;KACT;KACA,OAAO;IACT,KAAK;KACH,KAAK,OAAO,MAAM;KAClB,OAAO;IACT;KACE,KAAK,OAAO;KACZ,OAAO;GACX;EACF;EACA,OAAO;CACT;CAGA,eAAuB,OAAe,KAAqB;EACzD,IAAI,MAAM;EACV,IAAI,MAAM,KAAK;GACb,MAAM,QAAQ,KAAK,KAAK,GAAG;GAC3B,IAAI,UAAU,YAAY,UAAU,QAAQ;IAC1C,KAAK,OAAO;IACZ,OAAO;GACT;GACA,KAAK,OAAO,GAAG,MAAM,KAAK,OAAO,GAAG;IAClC,MAAM,OAAO,KAAK,KAAK,GAAG;IAC1B,IAAI,SAAS,YAAY,SAAS,QAChC;IAEF,IAAI,SAAS,SAAS;KACpB,KAAK,OAAO,MAAM;KAClB,OAAO;IACT;IACA,KAAK,OAAO;IACZ,OAAO;GACT;EACF;EACA,OAAO;CACT;CAGA,YAAoB,OAAe,KAAqB;EACtD,IAAI,MAAM;EACV,IAAI,MAAM,KAAK;GACb,IAAI,KAAK,GAAG,KAAK,GAAG,GAClB,OAAO,KAAK,eAAe,MAAM,GAAG,GAAG;GAEzC,IAAI,KAAK,KAAK,GAAG,MAAM,UAAU;IAC/B,KAAK,OAAO;IACZ,OAAO;GACT;GACA,KAAK,OAAO,GAAG,MAAM,KAAK,OAAO,GAAG;IAClC,MAAM,OAAO,KAAK,KAAK,GAAG;IAC1B,IAAI,SAAS,UACX;IAEF,IAAI,SAAS,SAAS;KACpB,KAAK,OAAO,MAAM;KAClB,OAAO;IACT;IACA,KAAK,OAAO;IACZ,OAAO;GACT;EACF;EACA,OAAO;CACT;CAGA,QAAQ,OAAe,KAAqB;EAC1C,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO;EAET,MAAM,YAAY,KAAK,KAAK,GAAG;EAC/B,MAAM,QAAQ,KAAK,WAAW,KAAK,KAAK,SAAS;EACjD,IAAI,QAAQ,GACV,OAAO,KAAK,KAAK,OAAO,GAAG;EAE7B,IAAI,UAAU,kBAAkB;GAC9B,IAAI,cAAc,QAChB,OAAO,KAAK,YAAY,MAAM,GAAG,GAAG;GAEtC,KAAK,OAAO;GACZ,OAAO;EACT;EACA,OAAO;EACP,OAAO,MAAM,KAAK;GAChB,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,MAAM,OAAO,KAAK,SAAS,KAAK,KAAK,IAAI;GACzC,IAAI,OAAO,GAAG;IACZ,OAAO;IACP;GACF;GACA,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;GAE5B,IAAI,SAAS,SAAS;IACpB,KAAK,OAAO,MAAM;IAClB,OAAO;GACT;GACA,KAAK,OAAO;GACZ,OAAO;EACT;EACA,OAAO;CACT;CAIA,oBAA4B,OAAe,KAAqB;EAC9D,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO;EAET,MAAM,OAAO,KAAK,KAAK,GAAG;EAC1B,IAAI,SAAS,QACX,OAAO,KAAK,YAAY,KAAK,KAAK,2BAA2B;EAE/D,IAAI,SAAS,OAAO;GAClB,KAAK,OAAO,MAAM;GAClB,OAAO;EACT;EACA,IAAI,SAAS,QAAQ,SAAS,SAAS,SAAS,OAAO;GACrD,KAAK,OAAO;GACZ,OAAO;EACT;EACA,SAAS;GACP,OAAO;GACP,IAAI,OAAO,KACT,OAAO;GAET,MAAM,QAAQ,KAAK,KAAK,GAAG;GAC3B,MAAM,OAAO,KAAK,WAAW,KAAK,KAAK,KAAK;GAC5C,IAAI,OAAO,GACT,OAAO,uBAAuB,MAAM;GAEtC,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;GAE5B,QAAQ,OAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK,OACH;IACF,KAAK;KACH,KAAK,OAAO,MAAM;KAClB,OAAO;IACT,KAAK,QACH,OAAO,KAAK,YAAY,KAAK,KAAK,2BAA2B;IAC/D;KACE,KAAK,OAAO;KACZ,OAAO;GACX;EACF;CACF;CAGA,YAAoB,OAAe,KAAa,KAAqB;EACnE,MAAM,MAAM,QAAQ;EACpB,IAAI,OAAO,KACT,OAAO;EAET,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG;GACtB,KAAK,OAAO;GACZ,OAAO;EACT;EACA,KAAK,OAAO,MAAM;EAClB,OAAO;CACT;CAIA,SAAS,OAAe,KAAqB;EAC3C,IAAI,MAAM;EACV,OAAO,MAAM,KAAK;GAChB,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,MAAM,OAAO,KAAK,SAAS,KAAK,KAAK,IAAI;GACzC,IAAI,OAAO,GAAG;IACZ,OAAO;IACP;GACF;GACA,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;GAE5B,IAAI,SAAS,QAAQ,SAAS,SAAS,SAAS,OAC9C,SAAS;IACP,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,MAAM,QAAQ,KAAK,KAAK,GAAG;IAC3B,IAAI,UAAU,WACZ;IAEF,IAAI,UAAU,QAAQ,UAAU,SAAS,UAAU,OAAO;KACxD,KAAK,OAAO;KACZ,OAAO;IACT;GACF;QACK,IAAI,SAAS,WAAW;IAC7B,KAAK,OAAO;IACZ,OAAO;GACT;GAEA,IAAI;GACJ,SAAS;IACP,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,OAAO,KAAK,KAAK,GAAG;IACpB,IAAI,SAAS,WAAW,SAAS,SAC/B;IAEF,IAAI,SAAS,QAAQ,SAAS,SAAS,SAAS,OAAO;KACrD,KAAK,OAAO;KACZ,OAAO;IACT;GACF;GACA,OAAO;GAEP,SAAS;IACP,IAAI,OAAO,KACT,OAAO;IAET,MAAM,YAAY,KAAK,KAAK,GAAG;IAC/B,IAAI,cAAc,MAChB;IAEF,MAAM,YAAY,KAAK,YAAY,KAAK,KAAK,SAAS;IACtD,IAAI,YAAY,GAAG;KACjB,OAAO;KACP;IACF;IACA,IAAI,YAAY,GACd,OAAO,KAAK,KAAK,WAAW,GAAG;IAEjC,IAAI,cAAc,QAAQ;KACxB,MAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,GAAG;KACrC,IAAI,OAAO,GACT,OAAO;KAET,MAAM,KAAK;KACX;IACF;IACA,IAAI,cAAc,OAAO;KACvB,KAAK,OAAO;KACZ,OAAO;IACT;IACA,OAAO;GACT;GACA,MAAM,QAAQ,KAAK,oBAAoB,MAAM,GAAG,GAAG;GACnD,IAAI,QAAQ,qBACV,OAAO;GAET,MAAM,sBAAsB;EAC9B;EACA,OAAO;CACT;CAGA,OAAO,OAAe,KAAqB;EACzC,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO;EAET,MAAM,YAAY,KAAK,KAAK,GAAG;EAC/B,MAAM,QAAQ,KAAK,WAAW,KAAK,KAAK,SAAS;EACjD,IAAI,QAAQ,GACV,OAAO,KAAK,KAAK,OAAO,GAAG;EAE7B,IAAI,UAAU,kBACZ,QAAQ,WAAR;GACE,KAAK;IACH,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,QAAQ,KAAK,KAAK,GAAG,GAArB;KACE,KAAK,UACH,OAAO,KAAK,YAAY,MAAM,GAAG,GAAG;KACtC,KAAK,SACH,OAAO,KAAK,iBAAiB,MAAM,GAAG,GAAG;KAC3C;MACE,KAAK,OAAO;MACZ,OAAO;IACX;GACF,KAAK,UACH,OAAO,KAAK,OAAO,MAAM,GAAG,GAAG;GACjC,KAAK,QACH,OAAO,KAAK,WAAW,MAAM,GAAG,GAAG;GACrC;IACE,KAAK,OAAO;IACZ,OAAO;EACX;EAEF,OAAO;EAEP,OAAO,MAAM,KAAK;GAChB,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,MAAM,OAAO,KAAK,SAAS,KAAK,KAAK,IAAI;GACzC,IAAI,OAAO,GAAG;IACZ,OAAO;IACP;GACF;GACA,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;GAE5B,QAAQ,MAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;KACH,OAAO;KACP,OAAO,MAAM,KAAK;MAChB,MAAM,QAAQ,KAAK,KAAK,GAAG;MAC3B,MAAM,YAAY,KAAK,WAAW,KAAK,KAAK,KAAK;MACjD,IAAI,YAAY,GACd,OAAO,KAAK,SAAS,MAAM,WAAW,GAAG;MAE3C,IAAI,YAAY,GACd,OAAO,KAAK,KAAK,WAAW,GAAG;MAEjC,QAAQ,OAAR;OACE,KAAK;QACH,KAAK,OAAO,MAAM;QAClB,OAAO;OACT,KAAK,QACH,OAAO,KAAK,YAAY,KAAK,KAAK,yBAAyB;OAC7D,KAAK;OACL,KAAK;OACL,KAAK;QACH,OAAO;QACP;OACF;QACE,KAAK,OAAO;QACZ,OAAO;MACX;KACF;KACA,OAAO;IACT,KAAK;KACH,KAAK,OAAO,MAAM;KAClB,OAAO;IACT,KAAK,QACH,OAAO,KAAK,YAAY,KAAK,KAAK,yBAAyB;IAC7D;KACE,KAAK,OAAO;KACZ,OAAO;GACX;EACF;EACA,OAAO;CACT;CAEA,WAAW,OAAuB;EAChC,MAAM,EAAE,QAAQ;EAChB,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO,KAAK,YAAY;EAE1B,MAAM,OAAO,KAAK,KAAK,GAAG;EAC1B,QAAQ,MAAR;GACE,KAAK,OACH,OAAO,KAAK,OAAO,MAAM,GAAG,GAAG;GACjC,KAAK,QACH,OAAO,KAAK,QAAQ,MAAM,GAAG,GAAG;GAClC,KAAK;IACH,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,IAAI,KAAK,KAAK,GAAG,MAAM,OACrB,OAAO;IAET,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK;IACH,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,GACnB;IAEF,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG;KACtB,OAAO;KACP;IACF;IACA,KAAK,OAAO;IACZ,OAAO;GACT,SAAS;IACP,MAAM,OAAO,KAAK,YAAY,KAAK,KAAK,IAAI;IAC5C,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;IAE5B,OAAO,OAAO,IAAI,OAAO;GAC3B;EACF;EACA,OAAO,KAAK,QAAQ,KAAK,KAAK,IAAI;CACpC;CAGA,YAAoB,OAAe,KAAqB;EACtD,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO;EAET,MAAM,YAAY,KAAK,KAAK,GAAG;EAC/B,MAAM,QAAQ,KAAK,WAAW,KAAK,KAAK,SAAS;EACjD,IAAI,QAAQ,GACV,OAAO,KAAK,KAAK,OAAO,GAAG;EAE7B,IAAI,UAAU,kBAAkB;GAC9B,KAAK,OAAO;GACZ,OAAO,cAAc,QACnB,cAAc,SACd,cAAc,SACd,cAAc,YACZ,cACA;EACN;EACA,OAAO;EACP,OAAO,MAAM,KAAK;GAChB,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,MAAM,OAAO,KAAK,SAAS,KAAK,KAAK,IAAI;GACzC,IAAI,OAAO,GAAG;IACZ,OAAO;IACP;GACF;GACA,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;GAE5B,IAAI,SAAS,SAAS;IACpB,KAAK,OAAO,MAAM;IAClB,OAAO;GACT;GACA,KAAK,OAAO;GACZ,OAAO;EACT;EACA,OAAO;CACT;CAGA,cAAsB,OAAe,KAAqB;EACxD,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO;EAET,MAAM,QAAQ,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;EACtD,IAAI,SAAS,GACX,OAAO,KAAK,KAAK,UAAU,oBAAoB,QAAQ,cAAc,GAAG;EAE1E,OAAO;EACP,OAAO,MAAM,KAAK;GAChB,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,MAAM,OAAO,KAAK,SAAS,KAAK,KAAK,IAAI;GACzC,IAAI,OAAO,GAAG;IACZ,OAAO;IACP;GACF;GACA,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;GAE5B,QAAQ,MAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;KACH,KAAK,OAAO;KACZ,OAAO;IACT;KACE,KAAK,OAAO;KACZ,OAAO;GACX;EACF;EACA,OAAO;CACT;CAEA,QAAgB,MAAc,OAAe,KAAqB;EAChE,IAAI,MAAM;EACV,OAAO,MAAM,KAAK;GAChB,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,MAAM,OAAO,KAAK,YAAY,KAAK,KAAK,IAAI;GAC5C,IAAI,OAAO,GAAG;IACZ,OAAO;IACP;GACF;GACA,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;GAE5B,OAAO;GACP,KAAK,SAAS,WAAW,SAAS,YAAY,SAAS,MAAM;IAC3D,IAAI,OAAO,KACT,OAAO;IAET,KAAK,OAAO;IACZ,QAAQ,KAAK,KAAK,GAAG,GAArB;KACE,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK,SACH,OAAO;KACT,SACE,OAAO;IACX;GACF;EACF;EACA,OAAO;CACT;CAEA,UAAU,OAAuB;EAC/B,MAAM,EAAE,QAAQ;EAChB,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO,KAAK,YAAY;EAE1B,IAAI;EAEJ,QADa,KAAK,KAAK,GACZ,GAAX;GACE,KAAK,SACH,OAAO,KAAK,QAAQ,SAAS,MAAM,GAAG,GAAG;GAC3C,KAAK,SACH,OAAO,KAAK,QAAQ,SAAS,MAAM,GAAG,GAAG;GAC3C,KAAK;IACH,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,QAAQ,KAAK,KAAK,GAAG,GAArB;KACE,KAAK,SACH,OAAO,KAAK,SAAS,MAAM,GAAG,GAAG;KACnC,KAAK,UACH,OAAO,KAAK,OAAO,MAAM,GAAG,GAAG;KACjC,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;MACH,KAAK,OAAO,MAAM;MAClB,OAAO;KACT;MAEE,IAAI,CAAC,KAAK,SAAS,KAAK,KAAK,GAAG,KAAK,aAAa;OAChD,KAAK,OAAO,MAAM;OAClB,OAAO;MACT;MACA,KAAK,OAAO;MACZ,OAAO;IACX;GACF,KAAK;IACH,IAAI,MAAM,MAAM,KAAK;KACnB,KAAK,OAAO;KAEZ,OAAO;IACT;IACA,OAAO,KAAK,YAAY,KAAK,GAAG;GAClC,KAAK;GACL,KAAK,OACH,OAAO,KAAK,YAAY,KAAK,GAAG;GAClC,KAAK,WACH,OAAO,KAAK,YAAY,MAAM,GAAG,GAAG;GACtC,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK;IACH,OAAO;IACP,IAAI,OAAO,KACT,OAAO;IAET,IAAI,KAAK,GAAG,KAAK,GAAG,GAAG;KACrB,IAAI,MAAM,MAAM,GACd,OAAO;KAET,IAAI,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG;MACzB,KAAK,OAAO,MAAM;MAClB,OAAO;KACT;IACF;IACA,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK,SACH,OAAO,KAAK,WAAW,MAAM,GAAG,GAAG;GACrC,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK,QACH,OAAO,KAAK,cAAc,MAAM,GAAG,GAAG;GACxC,KAAK;IACH,IAAI,MAAM,MAAM,GACd,OAAO;IAET,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;GACL,KAAK;IACH,MAAM;IACN,OAAO;IACP;GACF,KAAK;GACL,KAAK;GACL,KAAK;IACH,MAAM;IACN,OAAO;IACP;GACF,KAAK;IACH,IAAI,aAAa,KAAK,KAAK,GAAG,CAAC,GAC7B,MAAM;SACD,IAAI,WAAW,KAAK,KAAK,GAAG,CAAC,GAClC,MAAM;SACD;KACL,KAAK,OAAO;KACZ,OAAO;IACT;IACA,OAAO;IACP;GACF;IACE,KAAK,OAAO;IACZ,OAAO;EACX;EACA,OAAO,MAAM,KAAK;GAChB,MAAM,QAAQ,KAAK,KAAK,GAAG;GAC3B,MAAM,OAAO,KAAK,SAAS,KAAK,KAAK,KAAK;GAC1C,IAAI,OAAO,GAAG;IACZ,OAAO;IACP;GACF;GACA,IAAI,OAAO,GACT,OAAO,KAAK,KAAK,MAAM,GAAG;GAE5B,QAAQ,OAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;KACH,KAAK,OAAO;KACZ,OAAO;IACT,KAAK,SACH,OAAO,KAAK,WAAW,KAAK,KAAK,aAAa;IAChD,KAAK,QACH,OAAO,KAAK,WAAW,KAAK,KAAK,iBAAiB;IACpD,KAAK,UACH,OAAO,KAAK,WAAW,KAAK,KAAK,iBAAiB;IACpD;KACE,KAAK,OAAO;KACZ,OAAO;GACX;EACF;EACA,OAAO,CAAC;CACV;CAEA,WAAmB,KAAa,KAAa,UAA0B;EACrE,IAAI,QAAQ,aAAa;GACvB,KAAK,OAAO;GACZ,OAAO;EACT;EACA,KAAK,OAAO,MAAM;EAClB,OAAO;CACT;CAEA,WAAmB,OAAe,KAAqB;EACrD,MAAM,MAAM;EACZ,IAAI,OAAO,KACT,OAAO;EAET,QAAQ,KAAK,KAAK,GAAG,GAArB;GACE,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK;IACH,KAAK,OAAO,MAAM;IAClB,OAAO;GACT,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IACH,KAAK,OAAO;IACZ,OAAO;GACT;IACE,KAAK,OAAO;IACZ,OAAO;EACX;CACF;CAEA,YAAoB,OAAe,KAAqB;EACtD,IAAI,MAAM;EACV,SAAS;GACP,OAAO;GACP,IAAI,OAAO,KACT;GAEF,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,IAAI,SAAS,QAAQ,SAAS,OAC5B;GAGF,IAAI,SAAS,SAAS,MAAM,MAAM,KAChC;GAEF,KAAK,OAAO;GACZ,OAAO;EACT;EACA,KAAK,OAAO;EACZ,OAAO;CACT;CAEA,kBAAkB,OAAe,KAAqB;EACpD,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO;EAET,OAAO,MAAM,KACX,QAAQ,KAAK,KAAK,GAAG,GAArB;GACE,KAAK;IACH,OAAO;IACP;GACF,KAAK;IACH,IAAI,QAAQ,OACV,OAAO,KAAK,QAAQ,MAAM,GAAG,GAAG;IAElC,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;IAEH,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;IACH,IAAI,QAAQ,OAAO;KACjB,KAAK,OAAO,MAAM;KAClB,OAAO;IACT;IACA,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;IACH,IAAI,QAAQ,OACV,OAAO,KAAK,UAAU,KAAK,GAAG;IAEhC,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;IACH,IAAI,QAAQ,OAAO;KACjB,KAAK,OAAO,MAAM;KAClB,OAAO;IACT;IACA,KAAK,OAAO;IACZ,OAAO;GACT,SACE,OAAO;EACX;EAEF,KAAK,OAAO;EACZ,OAAO;CACT;CAEA,eAAe,OAAe,KAAqB;EACjD,IAAI,MAAM;EACV,IAAI,OAAO,KACT,OAAO;EAET,OAAO,MAAM,KACX,QAAQ,KAAK,KAAK,GAAG,GAArB;GACE,KAAK;IACH,OAAO;IACP;GACF,KAAK;IACH,IAAI,QAAQ,OACV,OAAO,KAAK,QAAQ,MAAM,GAAG,GAAG;IAElC,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;IACH,IAAI,QAAQ,OAAO;KACjB,MAAM,MAAM,KAAK,YAAY,MAAM,GAAG,GAAG;KACzC,OAAO,QAAQ,cAAc,cAAc;IAC7C;IACA,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;IACH,IAAI,QAAQ,OAAO;KACjB,KAAK,OAAO,MAAM;KAClB,OAAO;IACT;IACA,KAAK,OAAO;IACZ,OAAO;GACT,KAAK;IACH,IAAI,QAAQ,OACV,OAAO,KAAK,UAAU,KAAK,GAAG;IAEhC,KAAK,OAAO;IACZ,OAAO;GACT,SACE,OAAO;EACX;EAEF,KAAK,OAAO;EACZ,OAAO;CACT;CAEA,UAAkB,IAAY,KAAqB;EACjD,IAAI,MAAM,KAAK;EACf,IAAI,OAAO,KACT,OAAO;EAET,IAAI,KAAK,KAAK,GAAG,MAAM,OACrB,OAAO;EAET,KAAK,OAAO;EACZ,OAAO;CACT;;CAGA,WAAW,OAAuB;EAChC,IAAI,MAAM;EACV,SACE,QAAQ,KAAK,KAAK,GAAG,GAArB;GACE,KAAK;IACH,OAAO;IACP;GACF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IACH,OAAO;IACP;GACF,SACE,OAAO,MAAM;EACjB;CAEJ;;CAGA,cAAc,OAAuB;EACnC,IAAI,MAAM,QAAQ;EAClB,IAAI,SAAS;EACb,IAAI,KAAK,GAAG,KAAK,GAAG,GAClB,KAAK,OAAO,GAAG,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,OAAO,GAAG;GAC3C,SAAS,SAAS,KAAK,OAAO,SAAS,KAAK,KAAK,OAAO,GAAG,GAAG,EAAE;GAChE,IAAI,UAAU,gBACZ,OAAO;EAEX;OAEA,OAAO,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,OAAO,GAAG;GACnC,SAAS,SAAS,MAAM,KAAK,KAAK,GAAG,IAAI;GACzC,IAAI,UAAU,gBACZ,OAAO;EAEX;EAEF,OAAO,mBAAmB,MAAM;CAClC;;CAGA,iBAAiB,OAAe,KAAqB;EACnD,OAAO,oBAAoB,IAAI,KAAK,KAAK,MAAM,OAAO,GAAG,CAAC,KAAK;CACjE;;CAGA,oBAAoB,OAAe,KAAqB;EACtD,KAAK,IAAI,MAAM,QAAQ,GAAG,MAAM,MAAM,GAAG,OAAO,GAAG;GACjD,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,QAAQ,MAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK,QACH;IACF,KAAK;KACH,IAAI,KAAK,GAAG,KAAK,GAAI,GACnB,OAAO;KAET;IACF,SAAS;KACP,MAAM,OAAO,KAAK,KAAK,GAAG;KAG1B,IAAI,GADD,SAAS,WAAW,SAAS,cAAc,OAAO,gBACjC,SAAS,MAAQ,SAAS,IAC5C,OAAO;IAEX;GACF;EACF;EACA,OAAO;CACT;AACF;AAIA,MAAM,sBAAsB;AAE5B,MAAM,sCAAmD,IAAI,IAAI;CAC/D,CAAC,MAAM,GAAG;CACV,CAAC,MAAM,GAAG;CACV,CAAC,OAAO,GAAG;CACX,CAAC,QAAQ,IAAG;CACZ,CAAC,QAAQ,GAAG;AACd,CAAC;AAED,MAAM,gBAAgB;AAEtB,SAAS,mBAAmB,QAAwB;CAClD,IAAI,UAAUJ,wBAAsB,UAAUG,qBAC5C,OAAO;CAET,IACE,SAAS,iBACT,WAAW,KACX,WAAW,MACX,WAAW,IAEX,OAAO;CAET,IAAI,WAAW,gBAAgB,WAAW,cACxC,OAAO;CAET,OAAO;AACT;AAKA,MAAM,aAAa;AACnB,MAAM,YAAY;AAClB,MAAM,gBAAgB;AACtB,MAAM,sBAAsB;AAC5B,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAC1B,MAAM,yBAAyB;AAC/B,MAAM,yBAAyB;AAC/B,MAAM,+BAA+B;AACrC,MAAM,qBAAqB;AAC3B,MAAM,2BAA2B;AACjC,MAAM,yBAAyB;AAC/B,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAC1B,MAAM,wBAAwB;AAC9B,MAAM,wBAAwB;AAC9B,MAAM,uBAAuB;AAC7B,MAAM,4BAA4B;AAClC,MAAM,qBAAqB;AAC3B,MAAM,qBAAqB;AAC3B,MAAM,0BAA0B;AAChC,MAAM,6BAA6B;AACnC,MAAM,0BAA0B;AAChC,MAAM,sBAAsB;AAC5B,MAAM,4BAA4B;AAClC,MAAM,yBAAyB;AAC/B,MAAM,4BAA4B;AAClC,MAAM,gCAAgC;AACtC,MAAM,oBAAoB;AAC1B,MAAM,4BAA4B;AAClC,MAAM,+BAA+B;AACrC,MAAM,gCAAgC;AACtC,MAAM,+BAA+B;AACrC,MAAM,6BAA6B;AACnC,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AACzB,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAC5B,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AACzB,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAC7B,MAAM,wBAAwB;AAC9B,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;AAC7B,MAAM,2BAA2B;AACjC,MAAM,2BAA2B;AACjC,MAAM,4BAA4B;AAClC,MAAM,UAAU;AAChB,MAAM,eAAe;AACrB,MAAM,wBAAwB;AAE9B,MAAM,0BAA6C;CACjD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,oBAAoB;AAC1B,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,aAAa;AACnB,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,UAAU;;AAGhB,IAAM,cAAN,MAAkB;CAChB,QAAQ;CACR,QAAQ;CACR,WAAW;CACX;CAEA,YAAY,WAAsB;EAChC,KAAK,YAAY;CACnB;CAEA,QAAgB,KAAa,KAAa,SAA0B;EAClE,OACE,MAAM,QAAQ,QAAQ,UACtB,KAAK,UAAU,KAAK,WAAW,SAAS,GAAG;CAE/C;CAEA,SAAyB;EACvB,KAAK,QAAQ;EACb,OAAO;CACT;CAEA,KAAa,OAAe,MAAsB;EAChD,KAAK,QAAQ;EACb,OAAO;CACT;CAEA,UAAkB,OAAe,UAAkB,MAAsB;EACvE,KAAK,WAAW;EAChB,OAAO,KAAK,KAAK,OAAO,IAAI;CAC9B;CAEA,KAAK,KAAa,KAAa,KAAqB;EAClD,QAAQ,KAAK,OAAb;GACE,KAAK;GACL,KAAK;IACH,QAAQ,KAAR;KACE,KAAK,cACH,OAAO,KAAK,KAAK,WAAW,SAAS;KACvC,KAAK;MACH,IAAI,KAAK,UAAU,WACjB,OAAO,KAAK,KAAK,WAAW,aAAa;MAE3C;KACF,KAAK,QACH,OAAO,KAAK,KAAK,WAAW,OAAO;KACrC,KAAK,aACH,OAAO,KAAK,KAAK,WAAW,YAAY;KAC1C,KAAK,SACH,OAAO;KACT,KAAK;MACH,IAAI,CAAC,KAAK,QAAQ,MAAM,GAAG,KAAK,SAAS,GACvC;MAEF,OAAO,KAAK,KAAK,YAAY,iBAAiB;KAChD,KAAK,oBACH,OAAO,KAAK,KAAK,SAAS,mBAAmB;IAGjD;IACA,OAAO,KAAK,OAAO;GACrB,KAAK,WACH,QAAQ,KAAR;IACE,KAAK,cACH,OAAO;IACT,KAAK,QACH,OAAO;IACT,KAAK,aACH,OAAO;IACT,KAAK,oBACH,OAAO,KAAK,KAAK,SAAS,mBAAmB;IAC/C,SACE,OAAO,KAAK,OAAO;GACvB;GACF,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,UACV,OAAO,KAAK,KAAK,YAAY,iBAAiB;IAEhD,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,QAAQ,KAAR;KACE,KAAK,cACH,OAAO;KACT,KAAK,kBACH,OAAO,KAAK,KAAK,mBAAmB,4BAA4B;KAClE,KAAK,gBACH,OAAO,KAAK,KAAK,WAAW,kBAAkB;KAChD,KAAK;MACH,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,GACjC,OAAO,KAAK,KAAK,YAAY,iBAAiB;MAEhD,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,GACjC,OAAO,KAAK,KAAK,YAAY,iBAAiB;IAKpD;IACA,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,aACV,OAAO,KAAK,KAAK,YAAY,sBAAsB;IAErD,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,aACV,OAAO,KAAK,KAAK,YAAY,sBAAsB;IAErD,OAAO,KAAK,OAAO;GACrB,KAAK,YACH,QAAQ,KAAR;IACE,KAAK,cACH,OAAO;IACT,KAAK,kBACH,OAAO,KAAK,KAAK,mBAAmB,4BAA4B;IAClE,KAAK,gBACH,OAAO,KAAK,KAAK,WAAW,kBAAkB;IAChD,SACE,OAAO,KAAK,OAAO;GACvB;GACF,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,gBACV,OAAO,KAAK,KAAK,WAAW,kBAAkB;IAEhD,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,QAAQ,KAAR;KACE,KAAK,cACH,OAAO;KACT,KAAK;MACH,IAAI,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,GACrC,OAAO,KAAK,KAAK,WAAW,gBAAgB;MAE9C,IAAI,KAAK,QAAQ,MAAM,GAAG,KAAK,SAAS,GACtC,OAAO,KAAK,KAAK,YAAY,iBAAiB;MAEhD,IAAI,KAAK,QAAQ,MAAM,GAAG,KAAK,SAAS,GACtC,OAAO,KAAK,KAAK,YAAY,iBAAiB;MAEhD,IAAI,KAAK,QAAQ,MAAM,GAAG,KAAK,UAAU,GACvC,OAAO,KAAK,KAAK,aAAa,kBAAkB;MAElD;KACF,KAAK,QACH,OAAO;KACT,KAAK,aACH,OAAO;KACT,KAAK,sBACH,OAAO;KACT,KAAK,mBACH,OAAO,KAAK,KAAK,YAAY,iBAAiB;KAChD,KAAK,UACH,OAAO;IAGX;IACA,OAAO,KAAK,OAAO;GACrB,KAAK,WACH,QAAQ,KAAR;IACE,KAAK,cACH,OAAO;IACT,KAAK,aACH,OAAO,KAAK,KAAK,WAAW,gBAAgB;IAC9C,KAAK,UACH,OAAO,KAAK,KAAK,WAAW,wBAAwB;IACtD,SACE,OAAO,KAAK,OAAO;GACvB;GACF,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,UACV,OAAO,KAAK,KAAK,WAAW,sBAAsB;IAEpD,OAAO,KAAK,OAAO;GACrB,KAAK;GACL,KAAK,WAAW;IACd,MAAM,UAAU,KAAK,UAAU;IAC/B,QAAQ,KAAR;KACE,KAAK,cACH,OAAO;KACT,KAAK;MACH,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,GACjC,OAAO,KAAK,KACV,UAAU,YAAY,WACtB,gBACF;MAEF,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,GACjC,OAAO,KAAK,KACV,UAAU,YAAY,WACtB,gBACF;MAEF;KACF,KAAK,aACH,OAAO,KAAK,UACV,cACA,kBACA,iBACF;IAGJ;IACA,OAAO,KAAK,OAAO;GACrB;GACA,KAAK;GACL,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,aACV,OAAO,KAAK,KACV,KAAK,UAAU,YAAY,YAAY,WACvC,qBACF;IAEF,OAAO,KAAK,OAAO;GACrB,KAAK;GACL,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,aACV,OAAO,KAAK,KACV,KAAK,UAAU,YAAY,YAAY,YACvC,qBACF;IAEF,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,QAAQ,KAAR;KACE,KAAK,cACH,OAAO;KACT,KAAK,gBACH,OAAO,KAAK,KAAK,mBAAmB,oBAAoB;KAC1D,KAAK,UACH,IAAI,KAAK,QAAQ,KAAK,KAAK,OAAO,GAChC,OAAO,KAAK,KAAK,WAAW,gBAAgB;IAKlD;IACA,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,UACV,OAAO,KAAK,UACV,cACA,kBACA,yBACF;IAEF,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,gBACV,OAAO,KAAK,KAAK,mBAAmB,oBAAoB;IAE1D,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,UACV,OAAO,KAAK,KAAK,aAAa,kBAAkB;IAElD,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,UAAU;KACpB,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,GACjC,OAAO,KAAK,KAAK,aAAa,kBAAkB;KAElD,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,GACjC,OAAO,KAAK,KAAK,aAAa,kBAAkB;IAEpD;IACA,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,aACV,OAAO,KAAK,KAAK,aAAa,uBAAuB;IAEvD,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,aACV,OAAO,KAAK,UACV,cACA,oBACA,uBACF;IAEF,OAAO,KAAK,OAAO;GACrB,KAAK,aACH,QAAQ,KAAR;IACE,KAAK,cACH,OAAO;IACT,KAAK,aACH,OAAO,KAAK,UACV,cACA,oBACA,uBACF;IACF,KAAK,gBACH,OAAO,KAAK,KAAK,mBAAmB,0BAA0B;IAChE,SACE,OAAO,KAAK,OAAO;GACvB;GACF,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,UACV,OAAO,KAAK,KAAK,YAAY,yBAAyB;IAExD,OAAO,KAAK,OAAO;GACrB,KAAK,YACH,QAAQ,KAAR;IACE,KAAK,cACH,OAAO;IACT,KAAK,gBACH,OAAO,KAAK,KAAK,mBAAmB,iBAAiB;IACvD,KAAK,UACH,OAAO,KAAK,KAAK,YAAY,mBAAmB;IAClD,SACE,OAAO,KAAK,OAAO;GACvB;GACF,KAAK;IACH,QAAQ,KAAR;KACE,KAAK,cACH,OAAO;KACT,KAAK;MACH,KAAK,MAAM,CAAC,OAAO,YAAY,wBAAwB,QAAQ,GAC7D,IAAI,KAAK,QAAQ,KAAK,KAAK,OAAO,GAChC,OAAO,KAAK,KAAK,YAAY,4BAA4B,KAAK;MAGlE,IAAI,KAAK,QAAQ,KAAK,KAAK,UAAU,GACnC,OAAO,KAAK,KAAK,YAAY,iBAAiB;MAEhD;KAEF,KAAK,gBACH,OAAO,KAAK,KAAK,YAAY,iBAAiB;IAGlD;IACA,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,eAAe,QAAQ,UACjC,OAAO,KAAK,KAAK,YAAY,yBAAyB;IAExD,OAAO,KAAK,OAAO;GACrB,KAAK;GACL,KAAK,YAAY;IACf,MAAM,cAAc,KAAK,UAAU;IACnC,QAAQ,KAAR;KACE,KAAK,cACH,OAAO;KACT,KAAK,iBACH,OAAO,KAAK,KAAK,YAAY,iBAAiB;KAChD,KAAK,QACH,OAAO,KAAK,KACV,cAAc,aAAa,YAC3B,iBACF;KACF,SACE,OAAO,KAAK,OAAO;IACvB;GACF;GACA,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,gBACV,OAAO,KAAK,KAAK,YAAY,iBAAiB;IAEhD,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,UACV,OAAO,KAAK,KAAK,YAAY,6BAA6B;IAE5D,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,QAAQ,KAAR;KACE,KAAK,cACH,OAAO;KACT,KAAK;MACH,IAAI,KAAK,QAAQ,MAAM,GAAG,KAAK,SAAS,GACtC,OAAO,KAAK,KAAK,YAAY,4BAA4B;MAE3D,IAAI,KAAK,QAAQ,MAAM,GAAG,KAAK,UAAU,GACvC,OAAO,KAAK,KAAK,YAAY,6BAA6B;MAE5D,IAAI,KAAK,QAAQ,MAAM,GAAG,KAAK,OAAO,GACpC,OAAO,KAAK,KAAK,YAAY,iBAAiB;MAEhD;KACF,KAAK,aACH,OAAO,KAAK,KAAK,YAAY,4BAA4B;IAG7D;IACA,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,aACV,OAAO,KAAK,KAAK,YAAY,0BAA0B;IAEzD,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,UACV,OAAO,KAAK,KAAK,YAAY,iBAAiB;IAEhD,OAAO,KAAK,OAAO;GACrB,KAAK;IACH,QAAQ,KAAR;KACE,KAAK,cACH,OAAO;KACT,KAAK;MACH,IAAI,KAAK,QAAQ,KAAK,KAAK,OAAO,GAChC,OAAO,KAAK,UACV,cACA,mBACA,kBACF;MAEF,IAAI,KAAK,QAAQ,KAAK,KAAK,KAAK,GAC9B,OAAO,KAAK,UACV,cACA,mBACA,gBACF;MAEF;KACF,KAAK;MACH,KAAK,QAAQ;MACb,OAAO,KAAK,KAAK,YAAY,eAAe;IAGhD;IACA,OAAO,KAAK,OAAO;GACrB,KAAK;GACL,KAAK;IACH,QAAQ,KAAR;KACE,KAAK,cACH,OAAO;KACT,KAAK;MACH,IACE,KAAK,UAAU,cACf,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,GAEnC,OAAO,KAAK,KAAK,YAAY,mBAAmB;MAElD;KACF,KAAK;MACH,IAAI,KAAK,UAAU,YAAY;OAC7B,KAAK,QAAQ;OACb,OAAO,KAAK,KAAK,YAAY,eAAe;MAC9C;MACA,KAAK,SAAS;MACd,OAAO;KACT,KAAK,UACH,OAAO,KAAK,KAAK,YAAY,oBAAoB;KACnD,KAAK,mBACH,OAAO,KAAK,KAAK,YAAY,wBAAwB;KACvD,KAAK,mBACH,OAAO,KAAK,KAAK,YAAY,wBAAwB;KACvD,KAAK,eACH,OAAO,KAAK,KAAK,YAAY,yBAAyB;IAG1D;IACA,OAAO,KAAK,OAAO;GACrB,KAAK,YACH,QAAQ,KAAR;IACE,KAAK,cACH,OAAO;IACT,KAAK,iBACH,OAAO,KAAK,UACV,cACA,mBACA,gBACF;IACF,KAAK,0BACH,OAAO,KAAK,UACV,cACA,mBACA,oBACF;IACF,KAAK,QACH,OAAO,KAAK,KAAK,YAAY,iBAAiB;IAChD,SACE,OAAO,KAAK,OAAO;GACvB;GACF,KAAK;IACH,IAAI,QAAQ,cACV,OAAO;IAET,IAAI,QAAQ,UACV,OAAO,KAAK,KAAK,YAAY,oBAAoB;IAEnD,OAAO,KAAK,OAAO;GACrB,KAAK,YACH,QAAQ,KAAR;IACE,KAAK,cACH,OAAO;IACT,KAAK,0BACH,OAAO,KAAK,UACV,cACA,mBACA,oBACF;IACF,KAAK,QACH,OAAO,KAAK,KAAK,YAAY,iBAAiB;IAChD,SACE,OAAO,KAAK,OAAO;GACvB;GACF,KAAK,YACH,QAAQ,KAAR;IACE,KAAK,cACH,OAAO;IACT,KAAK,iBACH,OAAO,KAAK,WAAW,gBAAgB;IACzC,KAAK,0BACH,OAAO,KAAK,WAAW,oBAAoB;IAC7C,KAAK,0BACH,OAAO,KAAK,WAAW,oBAAoB;IAC7C,KAAK,sBACH,OAAO,KAAK,WAAW,qBAAqB;IAC9C,KAAK,WACH,OAAO,KAAK,KAAK,YAAY,mBAAmB;IAClD,KAAK,QACH,OAAO,KAAK,KAAK,YAAY,iBAAiB;IAChD,SACE,OAAO,KAAK,OAAO;GACvB;GACF,KAAK;IACH,IAAI,QAAQ,cACV,OAAO,KAAK;IAEd,IAAI,QAAQ,gBACV,OAAO,KAAK,KAAK,mBAAmB,KAAK,QAAQ;IAEnD,OAAO,KAAK,OAAO;GACrB,SACE,OAAO;EACX;CACF;CAEA,WAAmB,MAAsB;EACvC,KAAK,SAAS;EACd,IAAI,KAAK,UAAU,GAAG;GACpB,KAAK,WAAW;GAChB,KAAK,QAAQ;EACf;EACA,OAAO;CACT;AACF;AA4CA,MAAM,aAAa;AACnB,MAAM,cAAc;AAEpB,IAAM,iBAAN,MAAqB;CACnB;CACA;CACA;CACA,WAAW;CAEX,aAAqB;CACrB,qBAA6B;CAC7B,iBAAyB;CACzB,aAAqB;CACrB,eAAuB;CACvB,iBAA4C,CAAC;CAC7C,+BAAgC,IAAI,IAAyB;CAC7D,iCAAkC,IAAI,IAAY;CAClD,kBAA0B;CAC1B,kBAA0B;CAC1B,uBAA+B;CAC/B,oBAA4B;CAE5B,iBAAyB;CAEzB,YAAY,WAAsB,UAAyB;EACzD,KAAK,MAAM;EACX,KAAK,SAAS,IAAI,YAAY,SAAS;EACvC,KAAK,WAAW;CAClB;CAEA,KAAa,MAAc,IAAoB;EAC7C,IAAI,OAAO,KAAA,GACT,KAAK,WAAW;EAElB,MAAM,IAAI,aAAa,IAAI;CAC7B;;CAGA,IAAI,UAAkB,WAAyB;EAC7C,KAAK,SAAS,GAAG,UAAU,SAAS;CACtC;CAEA,SAAiB,OAAe,UAAkB,WAAyB;EACzE,MAAM,EAAE,KAAK,cAAc;EAC3B,IAAI,IAAI;EACR,IAAI,MAAM;EACV,IAAI,OAAO;EACX,SAAS;GACP,KAAK,WAAW;GAChB,IAAI,OAAO,GACT,QAAQ,KAAR;IACE,KAAK;KACH,KAAK,KAAK,yBAAyB,IAAI;KACvC;IACF,KAAK;KACH,KAAK,KAAK,wBAAwB;KAClC;IACF,KAAK;KACH,KAAK,KAAK,sBAAsB;KAChC;IACF,KAAK;KACH,MAAM;KACN;IACF,KAAK;KACH,KAAK,KAAK,qBAAqB;KAC/B;IACF;KACE,MAAM,CAAC;KACP,OAAO,UAAU;GACrB;GAEF,MAAM,OAAO,KAAK,OAAO,KAAK,KAAK,GAAG,IAAI;GAC1C,QAAQ,MAAR;IACE,KAAK;KACH,KAAK,eAAe,GAAG,IAAI;KAC3B;IACF,KAAK;KACH,KAAK,eAAe;KACpB,KAAK,iBAAiB,KAAK,SAAS,qBAAqB,KAAA;KACzD;IACF,KAAK;KACH,IAAI,KAAK,gBAAgB;MACvB,KAAK,iBAAiB;MACtB,KAAK,SAAS,mBAAmB;KACnC;KACA;IACF,KAAK;IACL,KAAK;IACL,KAAK,yBAAyB;KAC5B,IAAI,SAAS,wBAAwB;MACnC,KAAK,aAAa;MAClB,KAAK,qBAAqB;KAC5B;KACA,MAAM,MAAM,UAAU,oBAAoB,GAAG,IAAI;KACjD,IAAI,OAAO,GACT,KAAK,KAAK,oBAAoB,GAAG;KAEnC;IACF;IACA,KAAK;KACH,IAAI,KAAK,gBAAgB;MACvB,KAAK,iBAAiB;MACtB,KAAK,SAAS,mBAAmB;KACnC;KACA,IAAI,KAAK,cACP,KAAK,qBAAqB;KAE5B;IACF,KAAK;KACH,KAAK,UAAU,CAAC;KAChB;IACF,KAAK;KACH,KAAK,kBAAkB,UAAU,KAAK,MAAM,GAAG,IAAI;KACnD;IACF,KAAK;KACH,KAAK,kBAAkB,UAAU,KAAK,MAAM,GAAG,IAAI;KACnD,KAAK,uBAAuB;KAC5B,KAAK,oBAAoB;KACzB;IACF,KAAK;KACH,KAAK,uBAAuB;KAC5B;IACF,KAAK;KACH,KAAK,oBAAoB;KACzB;IACF,KAAK;IACL,KAAK;KACH,IAAI,KAAK,gBACP,KAAK,gBAAgB,MAAM,KAAK,iBAAiB;KAEnD;IACF,KAAK;IACL,KAAK;KACH,IAAI,KAAK,gBAAgB;MACvB,MAAM,QAAQ,KAAK,oBACjB,KAAK,sBACL,IAAI,GACJ,OAAO,CACT;MACA,KAAK,gBAAgB,OAAO,KAAK;KACnC;KACA;IACF,KAAK;KACH,IAAI,KAAK,gBAAgB;MACvB,MAAM,QAAQ,KAAK,iBAAiB,IAAI,GAAG,OAAO,CAAC;MACnD,IAAI,KAAK,YACP,KAAK,SAAS,WAAW;MAE3B,IAAI,UAAU,GACZ,MAAM,IAAI,aAAa,KAAK;KAEhC;KACA;IACF,KAAK;KACH,KAAK,qBAAqB;KAC1B,KAAK,eAAe;KACpB,KAAK,aAAa;KAClB;IACF,KAAK;IACL,KAAK;KACH,IAAI,KAAK,kBAAkB,KAAK,YAC9B,KAAK,SAAS,WAAW;KAE3B;IACF,KAAK;KACH,KAAK,aACH,UAAU,iBAAiB,GAAG,IAAI,MAAM,MAAM,KAAK;KACrD;IACF,KAAK;KACH,KAAK,aAAa,KAAK;KACvB;IACF,KAAK;KACH,IAAI,QAAQ,sBACV,KAAK,KAAK,0BAA0B;KAEtC,IAAI,QAAQ,cACV,KAAK,KAAK,0BAA0B;KAEtC,KAAK,KAAK,gBAAgB;KAC1B;IACF,KAAK;KACH,KAAK,eAAe,KAAK,OAAO,SAAS;KACzC;IACF,KAAK;KACH,IAAI,KAAK,eAAe,KAAK,OAAO,WAAW,YAC7C,KAAK,KAAK,gBAAgB;KAE5B,KAAK,eAAe,KAAK,OAAO,SAAS;KACzC;IACF,KAAK;KACH,IAAI,KAAK,eAAe,KAAK,OAAO,WAAW,aAC7C,KAAK,KAAK,gBAAgB;KAE5B,KAAK,eAAe,KAAK,OAAO,SAAS;KACzC;IACF,KAAK;KAGH,KAAK,qBAAqB;KAC1B,KAAK,iBAAiB,KAAK;GAI/B;GACA,IAAI;GACJ,MAAM,UAAU,UAAU,CAAC;GAC3B,CAAC,CAAE,QAAS;EACd;CACF;CAEA,YAAoB,MAA2B;EAC7C,IAAI,OAAO,KAAK,aAAa,IAAI,IAAI;EACrC,IAAI,CAAC,MAAM;GACT,OAAO;IAAE,UAAU,CAAC;IAAG,4BAAY,IAAI,IAAI;GAAE;GAC7C,KAAK,aAAa,IAAI,MAAM,IAAI;EAClC;EACA,OAAO;CACT;CAEA,gBAAwB,OAAsB,MAAqB;EACjE,MAAM,OAAO,KAAK,YAAY,KAAK,eAAe;EAClD,MAAM,OAAO,KAAK;EAElB,KAAK,UAAU,QAAQ,SAAS,KAAK,WAAW,IAAI,IAAI,GACtD;EAEF,KAAK,SAAS,KAAK;GAAE,SAAS,KAAK;GAAsB;GAAM;EAAM,CAAC;EACtE,IAAI,CAAC,KAAK,sBACR,KAAK,eAAe,IAAI,IAAI;EAE9B,IAAI,CAAC,KAAK,WAAW,IAAI,IAAI,GAC3B,KAAK,WAAW,IAAI,MAAM,KAAK,SAAS,SAAS,CAAC;CAEtD;CAIA,iBAAyB,OAAe,KAAqB;EAC3D,MAAM,EAAE,KAAK,cAAc;EAC3B,IAAI,MAAM;EACV,SAAS;GAEP,QADY,UAAU,eAAe,KAAK,GAChC,GAAV;IACE,KAAK;KACH,KAAK,WAAW;KAChB,OAAO;IACT,KAAK,UACH,OAAO;IACT,KAAK;KACH,IAAI,UAAU,cAAc,GAAG,IAAI,GAAG;MACpC,KAAK,WAAW;MAChB,OAAO;KACT;KACA;IACF,KAAK;KACH,KAAK,WAAW;KAChB,OAAO;IACT,KAAK;KACH,KAAK,WAAW,UAAU;KAC1B,OAAO;IACT,KAAK,iBACH,UAAU,OAAO,MAAM;GAI3B;GACA,MAAM,UAAU;EAClB;CACF;CAGA,oBACE,SACA,OACA,KACQ;EACR,MAAM,EAAE,KAAK,cAAc;EAC3B,IAAI,QAAQ;EACZ,IAAI,MAAM;EACV,MAAM,oBACJ,MAAM,WAAW,KAAK,MAAM,SAAS,GAAG;EAC1C,SAAS;GACP,MAAM,MAAM,UAAU,kBAAkB,KAAK,GAAG;GAChD,IAAI,EAAE,SAAS;GACf,QAAQ,KAAR;IACE,KAAK;KACH,IAAI,CAAC,WAAW,MAAM,SAAS,GAAG,GAChC,QAAQ,MAAM,MAAM,GAAG,EAAE;KAE3B,OAAO;IACT,KAAK;KACH,KAAK,KAAK,yBAAyB,IAAI;KACvC;IACF,KAAK;KACH,KAAK,KAAK,yBAAyB,GAAG;KACtC;IACF,KAAK,cAAc;KACjB,MAAM,OAAO,UAAU,cAAc,GAAG;KACxC,IAAI,OAAO,GACT,KAAK,KAAK,wBAAwB,GAAG;KAEvC,IAAI,CAAC,WAAW,SAAS,MAAQ,YAAY,GAC3C;KAEF,SAAS,OAAO,cAAc,IAAI;KAClC;IACF;IACA,KAAK;KACH,SAAS,UAAU,KAAK,MAAM,KAAK,IAAI;KACvC;IACF,KAAK;IACL,KAAK;IACL,KAAK;KACH,IAAI,QAAQ,iBACV,OAAO,MAAM;KAEf,IAAI,CAAC,WAAW,YAAY,GAC1B;KAEF,SAAS;KACT;IACF,KAAK,gBAAgB;KACnB,MAAM,OAAO,UAAU,iBAAiB,MAAM,GAAG,OAAO,CAAC;KACzD,IAAI,SAAS,IAAI;MACf,SAAS;MACT;KACF;KACA,IAAI,CAAC,KAAK,sBAAsB,KAAK,YACnC,KAAK,KAAK,0BAA0B;KAEtC;IACF;IACA,SAEE,KAAK,KAAK,yBAAyB,GAAG;GAC1C;GACA,MAAM;EACR;CACF;CAEA,eAAuB,GAAW,MAAoB;EACpD,MAAM,SAAS,aAAa,KAAK,KAAK,GAAG,IAAI;EAC7C,IAAI,OAAO,OAAO,GAChB,KAAK,KAAK,oBAAoB,OAAO,GAAG;EAE1C,IAAI,OAAO,YACT,KAAK,aAAa;CAEtB;CAGA,cAAsB,OAA+B;EACnD,MAAM,EAAE,KAAK,cAAc;EAC3B,MAAM,UAAU;EAChB,MAAM,WAAW;EACjB,MAAM,QAAQ;EACd,IAAI,QAAQ;EACZ,IAAI,OAAO;EACX,MAAM,OAAuB,CAAC;EAC9B,IAAI,UAAwB;GAC1B,MAAM;GACN,YAAY;GACZ,UAAU;GACV,YAAY;EACd;EACA,KAAK,IAAI,MAAM,QAAQ,IAAK,OAAO,GAAG;GACpC,MAAM,OAAO,UAAU,KAAK,GAAG;GAC/B,QAAQ,MAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;KACH,IAAI,UAAU,OAAO;MACnB,UAAU;OACR,MAAM;OACN,YAAY;OACZ,UAAU;OACV,YAAY;MACd;MACA,QAAQ;KACV;KACA,IAAI,SAAS,UACX,OAAO;KAET;IACF,KAAK;IACL,KAAK;KACH,IAAI,UAAU,UAAU;MACtB,QAAQ,aAAa,MAAM;MAC3B,QAAQ;MACR,OAAO;KACT,OAAO,IAAI,SAAS,MAAM;MACxB,QAAQ;MACR,QAAQ,WAAW;MACnB,KAAK,KAAK,OAAO;MACjB,KAAK,SAAS,YAAY;KAC5B;KACA;IACF,KAAK;KACH,QAAQ,aAAa;KACrB;IACF,KAAK;KACH,IAAI,UAAU,SACZ,QAAQ;UACH,IACL,UAAU,YACV,QAAQ,eACP,QAAQ,QAAQ,cACf,CAAC,UAAU,GAAG,KAAK,GAAG,KACtB,UAAU,GAAG,MAAM,GAAG,GAAG,KACzB,UAAU,KAAK,MAAM,CAAC,MAAM,OAE9B,QAAQ,aAAa;KAEvB;IACF,KAAK;IACL,KAAK;KACH,IAAI,UAAU,SACZ,QAAQ;UACH,IAAI,UAAU,UACnB,QAAQ,aAAa;KAEvB;IACF,KAAK;IACL,KAAK,QACH,IAAI,UAAU,UACZ,OAAO;GAKb;EACF;CACF;CAIA,UAAkB,UAAkB,aAA+B;EACjE,MAAM,EAAE,KAAK,cAAc;EAC3B,MAAM,cAAc,KAAK,aAAa,IAAI,WAAW;EACrD,MAAM,uBAAO,IAAI,IAAY;EAC7B,MAAM,SAAmB,CAAC;EAC1B,KAAK,MAAM,OAAO,KAAK,cAAc,QAAQ,GAAG;GAC9C,MAAM,OAAO,UAAU,KAAK,MAC1B,IAAI,MACJ,IAAI,OAAO,UAAU,WAAW,IAAI,IAAI,CAC1C;GACA,IAAI,KAAK,IAAI,IAAI,GACf,KAAK,KAAK,+BAA+B,IAAI,IAAI;GAEnD,KAAK,IAAI,IAAI;GACb,IAAI;GACJ,IAAI,IAAI,YACN,QAAQ,UAAU,KAAK,MAAM,IAAI,YAAY,IAAI,QAAQ;QACpD;IACL,IAAI,UAAU;IACd,IAAI,eAAe,KAAK,eAAe,IAAI,IAAI,GAAG;KAChD,MAAM,QAAQ,YAAY,WAAW,IAAI,IAAI;KAC7C,IAAI,UAAU,KAAA,GACZ,UAAU,YAAY,SAAS,MAAM,EAAE,WAAW;IAEtD;IACA,QAAQ,KAAK,oBAAoB,SAAS,IAAI,YAAY,IAAI,QAAQ;GACxE;GACA,OAAO,KAAK,MAAM,KAAK;EACzB;EACA,KAAK,MAAM,oBAAoB,aAAa,YAAY,CAAC,GACvD,IAAI,CAAC,KAAK,IAAI,iBAAiB,IAAI,KAAK,iBAAiB,UAAU,MAAM;GACvE,KAAK,IAAI,iBAAiB,IAAI;GAC9B,OAAO,KAAK,iBAAiB,MAAM,iBAAiB,KAAK;EAC3D;EAEF,OAAO;CACT;CAEA,UAAkB,OAAqB;EACrC,MAAM,EAAE,KAAK,WAAW,aAAa;EAGrC,MAAM,WAAqB,CAAC;EAC5B,MAAM,YAAsB,CAAC;EAC7B,IAAI,IAAI;EACR,SAAS;GACP,KAAK,WAAW;GAChB,MAAM,MAAM,UAAU,WAAW,CAAC;GAClC,MAAM,EAAE,SAAS;GACjB,QAAQ,KAAR;IACE,KAAK;KACH,SAAS,cAAc,IAAI;KAC3B,KAAK,KAAK,qBAAqB;KAC/B;IACF,KAAK;KACH,KAAK,KAAK,qBAAqB;KAC/B;IACF,KAAK;KACH,KAAK,KAAK,yBAAyB,IAAI;KACvC;IACF,KAAK;KACH,KAAK,KAAK,wBAAwB;KAClC;IACF,KAAK;KACH,KAAK,KAAK,sBAAsB;KAChC;IACF,KAAK,gBAAgB;KACnB,MAAM,OAAO,UAAU,iBAAiB,IAAI,GAAG,OAAO,CAAC;KACvD,IAAI,SAAS,IACX,SAAS,cAAc,IAAI;UACtB,IAAI,CAAC,KAAK,sBAAsB,KAAK,YAC1C,KAAK,KAAK,0BAA0B;KAEtC;IACF;IACA,KAAK;IACL,KAAK,yBAAyB;KAC5B,MAAM,aAAa,UAAU,WAAW,IAAI,CAAC;KAC7C,MAAM,OAAO,UAAU,KAAK,MAAM,IAAI,GAAG,IAAI,IAAI,UAAU;KAC3D,SAAS,KAAK,IAAI,GAAG,UAAU;KAC/B,UAAU,KAAK,IAAI;KACnB,MAAM,aAAa,KAAK,UAAU,GAAG,IAAI;KACzC,SAAS,aAAa,MAAM,UAAU;KACtC;IACF;IACA,KAAK;IACL,KAAK,6BAA6B;KAChC,MAAM,OAAO,UAAU,KAAK,MAC1B,IAAI,GACJ,IAAI,IAAI,UAAU,WAAW,IAAI,CAAC,CACpC;KACA,MAAM,aAAa,KAAK,UAAU,GAAG,IAAI;KACzC,SAAS,aAAa,MAAM,UAAU;KACtC,KAAK,WAAW;KAChB,SAAS,WAAW,IAAI;KACxB,IAAI,UAAU,WAAW,GAAG;MAC1B,KAAK,OAAO,IAAI;MAChB;KACF;KACA;IACF;IACA,KAAK,aAAa;KAChB,MAAM,UAAU,IAAI;KACpB,MAAM,SAAS,UAAU,WAAW,OAAO;KAC3C,MAAM,aAAa,SAAS,IAAI,KAAK;KACrC,MAAM,YAAY,SAAS,IAAI,KAAK;KACpC,IACE,WAAW,cACX,UAAU,KAAK,MAAM,SAAS,UAAU,MAAM,MAC5C,UAAU,KAAK,MAAM,WAAW,YAAY,UAAU,GAExD,KAAK,KAAK,wBAAwB,OAAO;KAE3C,SAAS,WAAW,UAAU,IAAI,KAAK,EAAE;KACzC,IAAI,UAAU,WAAW,GAAG;MAC1B,KAAK,OAAO,IAAI;MAChB;KACF;KACA;IACF;IACA,KAAK,cAAc;KACjB,MAAM,OAAO,UAAU,cAAc,CAAC;KACtC,IAAI,OAAO,GACT,KAAK,KAAK,sBAAsB;KAElC,SAAS,cAAc,OAAO,cAAc,IAAI,CAAC;KACjD;IACF;IACA,KAAK;KACH,KAAK,KAAK,0BAA0B;KACpC;IACF,KAAK;KACH,SAAS,cAAc,IAAI;KAC3B;IACF,KAAK,qBAAqB;KACxB,MAAM,QAAQ,KAAK,eAAe,IAAI;KACtC,KAAK,WAAW;KAChB,IAAI;KACJ;IACF;IACA,KAAK;KACH,SAAS,cAAc,UAAU,KAAK,MAAM,GAAG,UAAU,GAAG,CAAC;KAC7D,KAAK,KAAK,uBAAuB,UAAU,GAAG;KAC9C;IACF,KAAK,gBACH,SAAS,cAAc,UAAU,KAAK,MAAM,GAAG,IAAI,CAAC;GAKxD;GACA,IAAI;EACN;CACF;CAEA,eAAuB,OAAuB;EAC5C,MAAM,EAAE,KAAK,WAAW,aAAa;EACrC,IAAI,IAAI;EACR,KAAK,WAAW;EAChB,SAAS;GACP,MAAM,MAAM,UAAU,gBAAgB,CAAC;GACvC,MAAM,EAAE,SAAS;GACjB,QAAQ,KAAR;IACE,KAAK,sBACH,OAAO;IACT,KAAK;KACH,SAAS,cAAc,IAAI;KAC3B;IACF,KAAK;KACH,SAAS,cAAc,UAAU,KAAK,MAAM,GAAG,IAAI,CAAC;KACpD;IACF,KAAK;KACH,KAAK,KAAK,yBAAyB,IAAI;KACvC;IACF,KAAK;KACH,KAAK,KAAK,sBAAsB;KAChC;IACF,SAEE,KAAK,KAAK,gCAAgC;GAC9C;GACA,IAAI;GACJ,KAAK,WAAW;EAClB;CACF;CAEA,OAAe,OAAqB;EAClC,MAAM,EAAE,KAAK,cAAc;EAC3B,IAAI,IAAI;EACR,KAAK,WAAW;EAChB,SAAS;GACP,MAAM,MAAM,UAAU,UAAU,CAAC;GACjC,MAAM,EAAE,SAAS;GACjB,QAAQ,KAAR;IACE,KAAK;IACL,KAAK,UACH;IACF,KAAK;IACL,KAAK;IACL,KAAK,aACH;IACF,KAAK;KACH,KAAK,KAAK,yBAAyB,IAAI;KACvC;IACF,KAAK;KACH,KAAK,KAAK,wBAAwB;KAClC;IACF,KAAK;KACH,KAAK,KAAK,sBAAsB;KAChC;IACF,SACE,KAAK,KAAK,gCAAgC;GAC9C;GACA,IAAI;GACJ,KAAK,WAAW;EAClB;CACF;AACF;AAUA,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AAEtB,SAAS,cAAc,MAAuB;CAC5C,OACG,QAAQ,iBAAiB,QAAQ,iBACjC,QAAQ,iBAAiB,QAAQ;AAEtC;AAEA,SAAS,YAAY,MAAuB;CAC1C,OAAO,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS;AACrE;AAUA,SAAS,qBACP,WACA,OACA,KACiB;CACjB,MAAM,WAAW,QAAwB;EACvC,IAAI,OAAO,KACT,OAAO;EAET,MAAM,OAAO,UAAU,KAAK,GAAG;EAC/B,OAAO,OAAO,cAAc,OAAO;CACrC;CACA,IAAI,MAAM;CACV,IAAI,QAAQ,KACV,OAAO;EAAE,MAAM;EAAM,MAAM;EAAO,IAAI;EAAM,OAAO;CAAE;CAEvD,IAAI,CAAC,YAAY,QAAQ,GAAG,CAAC,GAC3B,OAAO;EAAE,MAAM;EAAM,MAAM;EAAK,IAAI;EAAO,OAAO;CAAE;CAEtD;EACE,OAAO;QACA,YAAY,QAAQ,GAAG,CAAC;CACjC,IAAI,QAAQ,KACV,OAAO;EAAE,MAAM;EAAM,MAAM;EAAO,IAAI;EAAM,OAAO;CAAE;CAEvD,MAAM,YAAY;CAClB,IAAI;CACJ,SAAS;EACP,IAAI,IAAI,QAAQ,GAAG;EACnB,IAAI,MAAM,IACR,OAAO;GAAE,MAAM;GAAM,MAAM;GAAK,IAAI;GAAO,OAAO;EAAE;EAEtD,IAAI,MAAM,IAAM;GACd,UAAU;GACV;EACF;EACA,IAAI,YAAY,CAAC,GAAG;GAClB,UAAU;GACV,GAAG;IACD,OAAO;IACP,IAAI,QAAQ,GAAG;GACjB,SAAS,YAAY,CAAC;GACtB,IAAI,MAAM,IACR,OAAO;IAAE,MAAM;IAAM,MAAM;IAAK,IAAI;IAAO,OAAO;GAAE;GAEtD;EACF;EACA,OAAO;CACT;CACA,IAAI,QAAQ,WACV,OAAO;EAAE,MAAM;EAAM,MAAM;EAAK,IAAI;EAAO,OAAO;CAAE;CAEtD,OAAO;CACP,IAAI,IAAI,QAAQ,GAAG;CACnB,OAAO,YAAY,CAAC,GAAG;EACrB,OAAO;EACP,IAAI,QAAQ,GAAG;CACjB;CACA,IAAI,MAAM,MAAQ,MAAM,IACtB,OAAO;EAAE,MAAM;EAAM,MAAM;EAAK,IAAI;EAAO,OAAO;CAAE;CAEtD,MAAM,OAAO;CACb,OAAO;CACP,MAAM,QAAQ;CACd,QAAS,OAAO,GAAG;EACjB,IAAI,QAAQ,GAAG;EACf,IAAI,MAAM,MACR;EAQF,IAAI,EALF,cAAc,CAAC,KACd,KAAK,iBAAiB,KAAK,iBAC5B,MAAM,MACN,MAAM,MACN,MAAM,KAEN,OAAO;GAAE,MAAM;GAAM,MAAM;GAAK,IAAI;GAAO,OAAO;EAAE;CAExD;CACA,OAAO;EAAE,MAAM,CAAC,WAAW,OAAO;EAAG,MAAM,MAAM;EAAG,IAAI;EAAM;CAAM;AACtE;AAEA,SAAS,aACP,WACA,GACA,MACe;CACf,MAAM,EAAE,SAAS;CACjB,MAAM,MAAM,OAAO;CACnB,MAAM,UAAU,OAAyB,YACvC,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,MAAM;CACrC,IAAI,YAAY,qBAAqB,WAAW,IAAI,GAAG,GAAG;CAC1D,IAAI,EAAE,UAAU,MAAM,UAAU,OAC9B,OAAO;EAAE,KAAK,UAAU;EAAM,YAAY;CAAM;CAElD,IAAI,OAAO,UAAU,MAAM,SAAS,GAAG;EACrC,MAAM,WAAW,UAAU,OAAO;EAClC,MAAM,UAAU,KAAK,MAAM,UAAU,OAAO,QAAQ;EAEpD,IAAI,CAAC,eAAe,KAAK,OAAO,GAC9B,OAAO;GAAE,KAAK,UAAU;GAAO,YAAY;EAAM;EAEnD,YAAY,qBAAqB,WAAW,UAAU,MAAM,GAAG;EAC/D,IAAI,CAAC,UAAU,IACb,OAAO;GAAE,KAAK,UAAU;GAAM,YAAY;EAAM;EAElD,IAAI,CAAC,UAAU,MACb,OAAO;GAAE,KAAK;GAAI,YAAY;EAAM;CAExC,OACE,OAAO;EAAE,KAAK,UAAU,KAAK;EAAI,YAAY;CAAM;CAErD,IAAI,OAAO,UAAU,MAAM,UAAU,GAAG;EAEtC,IAAI,CAAC,cADS,UAAU,QAAQ,MAAM,UAAU,KAAK,UAAU,KAAK,IAAI,EAChD,GACtB,OAAO;GAAE,KAAK,UAAU;GAAO,YAAY;EAAM;EAEnD,YAAY,qBAAqB,WAAW,UAAU,MAAM,GAAG;EAC/D,IAAI,CAAC,UAAU,IACb,OAAO;GAAE,KAAK,UAAU;GAAM,YAAY;EAAM;EAElD,IAAI,CAAC,UAAU,MACb,OAAO;GAAE,KAAK;GAAI,YAAY;EAAM;CAExC;CACA,IAAI,CAAC,OAAO,UAAU,MAAM,YAAY,GACtC,OAAO;EAAE,KAAK,UAAU,KAAK;EAAI,YAAY;CAAM;CAErD,MAAM,QAAQ,KAAK,MAAM,UAAU,OAAO,UAAU,OAAO,CAAC;CAC5D,IAAI,UAAU,SAAS,UAAU,MAC/B,OAAO;EAAE,KAAK,UAAU;EAAO,YAAY;CAAM;CAEnD,IAAI,MAAM,UAAU;CACpB,OAAO,MAAM,OAAO,YAAY,UAAU,KAAK,GAAG,CAAC,GACjD,OAAO;CAET,IAAI,QAAQ,KACV,OAAO;EAAE,KAAK;EAAK,YAAY;CAAM;CAEvC,OAAO;EAAE,KAAK;EAAI,YAAY,UAAU;CAAM;AAChD;;AAMA,SAAS,WAAW,MAAc,MAAgC;CAChE,IAAI,OAAO;CACX,IAAI,SAAS;CACb,IAAI,MAAM;CACV,OAAO,MAAM,MAAM;EACjB,MAAM,OAAO,KAAK,WAAW,GAAG;EAChC,IAAI,SAAS,IAAM;GACjB,QAAQ;GACR,SAAS;GACT,OAAO;EACT,OAAO,IAAI,SAAS,IAAM;GACxB,QAAQ;GACR,SAAS;GACT,OAAO;GACP,IAAI,MAAM,QAAQ,KAAK,WAAW,GAAG,MAAM,IACzC,OAAO;EAEX,OAAO;GACL,UAAU;GACV,OACE,QAAQH,wBACR,QAAQC,wBACR,MAAM,IAAI,OACN,IACA;EACR;CACF;CACA,OAAO,CAAC,MAAM,MAAM;AACtB;AAEA,MAAM,sBAAsB;AAC5B,MAAM,mBAAmB;AAIzB,SAAS,YAAY,MAAsB;CACzC,IAAI,KAAK,SAAS,GAChB,OAAO;CAET,IAAI,KAAK,WAAW,CAAC,MAAM,GACzB,OAAO,KAAK,WAAW,IAAI,IAAI;CAEjC,IACE,KAAK,WAAW,CAAC,IAAI,eACrB,KAAK,SAAS,KACd,KAAK,WAAW,CAAC,MAAM,GAEvB,OAAO;CAET,OAAO;AACT;AAIA,MAAM,cAAc;AAEpB,MAAM,yBACJ,IAAI,WAAW,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO;AAErD,SAAS,UAAU,MAAc,OAAkC;CACjE,MAAM,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI;CAC3C,MAAM,QAAQ,KAAK,MAAM,MAAM,SAAS,CAAC;CAGzC,MAAM,QAAQ,IAAI,YAAY,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK;CACxE,IAAK,UAAU,qBAAsB,wBACnC,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;EAC7C,MAAM,OAAO,MAAM;EACnB,MAAM,UAAW,OAAO,QAAS,IAAM,QAAQ;CACjD;CAKF,MAAM,SAAmB,CAAC;CAC1B,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,aACjD,OAAO,KACL,QAAQ,MACN,OAAO,cACP,MACA,MAAM,SAAS,OAAO,QAAQ,WAAW,CAC3C,CACF;CAEF,OAAO,CAAC,OAAO,KAAK,EAAE,GAAG,MAAM,SAAS,MAAM,CAAC;AACjD;;;;;;;;;AAUA,SAAgB,WAAW,MAAc,UAA+B;CACtE,MAAM,QAAQ,YAAY,IAAI;CAC9B,MAAM,CAAC,MAAM,WAAW,UAAU,IAAI,CAAC,MAAM,KAAK,IAAI,UAAU,MAAM,KAAK;CAC3E,MAAM,YAAY,IAAI,UAAU,MAAM,UAAU,GAAG,OAAO;CAC1D,MAAM,SAAS,IAAI,eAAe,WAAW,QAAQ;CACrD,IAAI;EACF,IAAI;EACJ,IAAI,UAAU,KAAK,KAAK,WAAW,MAAM,SAAS,OAAO,SAAS,OAEhE,WAAW;OACN,IAAI,UAAU,KAAK,KAAK,WAAW,CAAC,MAAM,KAAK;GACpD,WAAW;GACX,UAAU,OAAO;EACnB,OACE,WAAW,UAAU,UAAU,CAAC;EAElC,OAAO,IAAI,UAAU,UAAU,IAAI;CACrC,SAAS,OAAO;EACd,IAAI,iBAAiB,cAAc;GACjC,MAAM,CAAC,MAAM,UAAU,WAAW,MAAM,OAAO,QAAQ;GACvD,MAAM,IAAI,WAAW,MAAM,MAAM,MAAM,MAAM;EAC/C;EACA,MAAM;CACR;AACF;;AC/1GA,MAAM,oBAAoB;;AAG1B,IAAa,aAAb,MAAwB;CACtB,SAAoC,CAAC;CACrC,SAA2B,CAAC;CAE5B,KAAK,OAAqB;EACxB,KAAK,OAAO,KAAK,KAAK;EACtB,IAAI,KAAK,OAAO,UAAU,mBAAmB;GAC3C,KAAK,OAAO,KAAK,KAAK,OAAO,KAAK,EAAE,CAAC;GACrC,KAAK,SAAS,CAAC;EACjB;CACF;;CAGA,OAAsB;EACpB,IAAI,KAAK,OAAO,WAAW,GACzB,OAAO,KAAK,OAAO,WAAW,IAAI,OAAO,KAAK,OAAO,KAAK,EAAE;EAE9D,OAAO,KAAK,OAAO,KAAK,EAAE,IAAI,KAAK,OAAO,KAAK,EAAE;CACnD;AACF;;ACtBA,MAAM,qBAAqB;AAC3B,MAAM,qBAAqB;AAC3B,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;;AAG1B,IAAa,wBAAb,cAA2C,MAAM;CAC/C,OAAgB;AAClB;;;;;;AAOA,SAAgB,oBAAoB,MAAoB;CAEtD,IAAI,KAAK,aAAa,GACpB;CAEF,IAAI,YAAY;CAChB,IAAI,WAAW;CACf,IAAI,SAAS;CACb,IAAI,WAAW;CACf,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,KAAK,WAAW,KAAK;EAClC,MAAM,OAAO,KAAK,WAAW,QAAQ,CAAC;EACtC,MAAM,SACJ,QAAQ,sBACR,QAAQ,sBACR,QAAQ,qBACR,QAAQ;EAGV,IADE,CAAC,UAAU,QAAQ,sBAAsB,QAAQ,mBACzC;GACR,IAAI,WAAW,GAAG;IAChB,WAAW;IACX,WAAW;GACb;GACA,SAAS;EACX,OAAO,IAAI,YAAY,GACrB;EAEF,IAAI,QACF,SAAS;EAEX,aAAa;CACf;CACA,IAAI,WAAW,GACb;CAMF,MAAM,IAAI,sBACR,8BAJA,aAAa,SACT,iBAAiB,SAAS,SAAS,EAAE,EAAE,gBAAgB,aACvD,0BAA0B,SAAS,GAAG,SAEN,yBACtC;AACF;;;ACZA,IAAM,mBAAN,cAA+B,MAAM;CACnC,OAAgB;AAClB;;AAGA,IAAM,OAAN,cAAmB,MAAM;CACvB,OAAgB;AAClB;AAEA,MAAM,YAAY;AAClB,MAAM,0BAA0B;AAChC,MAAM,kBAAkB;AACxB,MAAM,6BAA0C,IAAI,IAAI;CACtD,CAAC,MAAM,GAAG;CACV,CAAC,MAAM,GAAG;CACV,CAAC,OAAO,GAAG;CACX,CAAC,QAAQ,IAAG;CACZ,CAAC,QAAQ,GAAG;AACd,CAAC;AACD,MAAM,cAAc;AACpB,MAAM,wBAAwB;AAC9B,MAAM,WAAW;AACjB,MAAM,UAAU;AAChB,MAAM,UAAU;AAChB,MAAM,aAAa;AACnB,MAAM,YAAY;AAElB,SAAS,QAAQ,MAAuB;CACtC,OACE,SAAS,cACT,SAAS,YACT,SAAS,WACT,SAAS;AAEb;;AAGA,SAAS,UAAU,MAAuB;CACxC,IAAI,OAAO,YACT,OAAO,SAAS,YAAY,SAAS,WAAW,SAAS;CAE3D,IAAI,QAAQ,OACV,OAAO;CAET,IAAI,QAAQ,SAAW,QAAQ,OAC7B,OAAO;CAET,OAAO,QAAQ,SAAa,QAAQ;AACtC;AAGA,SAAS,gBAAgB,MAAuB;CAC9C,IAAI,OAAO,KACT,OACG,QAAQ,MAAQ,QAAQ,OACxB,QAAQ,MAAQ,QAAQ,MACzB,SAAS,MACT,SAAS;CAGb,OACG,QAAQ,OAAQ,QAAQ,OACxB,QAAQ,OAAQ,QAAQ,OACxB,QAAQ,OAAQ,QAAQ,OACxB,QAAQ,OAAU,QAAQ,OAC1B,QAAQ,OAAU,QAAQ,QAC1B,QAAQ,QAAW,QAAQ,QAC3B,QAAQ,QAAW,QAAQ,QAC3B,QAAQ,SAAW,QAAQ,SAC3B,QAAQ,SAAW,QAAQ,SAC3B,QAAQ,SAAW,QAAQ,SAC3B,QAAQ,SAAW,QAAQ,SAC3B,QAAQ,SAAa,QAAQ;AAElC;AAEA,SAAS,WAAW,MAAuB;CACzC,IAAI,gBAAgB,IAAI,GACtB,OAAO;CAET,OACE,SAAS,MACT,SAAS,MACR,QAAQ,MAAQ,QAAQ,MACzB,SAAS,OACR,QAAQ,OAAU,QAAQ,OAC1B,QAAQ,QAAW,QAAQ;AAEhC;AAGA,MAAM,gBAAgB;AAEtB,MAAM,wBAA2C;CAC/C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,gCAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,MAAM,+BAAe,IAAI,IAAI;CAC3B;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,MAAM,8BAAc,IAAI,IAAI,CAAC,SAAS,MAAM,CAAC;AAC7C,MAAM,+BAAe,IAAI,IAAI;CAC3B;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,mCAAmB,IAAI,IAAI;CAAC;CAAM;CAAM;CAAM;CAAM;AAAI,CAAC;AAG/D,MAAM,uBAAuB;;;;;;;AAQ7B,SAAS,UAAU,MAAc,UAA4C;CAC3E,MAAM,QAAQ,SAAS,YAAY;CACnC,IAAI,YAAY,IAAI,KAAK,GACvB,OAAO,CAAC,MAAM,KAAK;CAErB,MAAM,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI;CAC3C,IAAI,cAAc,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,GAAG;EACvD,MAAM,QAAQ,aAAa,IAAI,KAAK,IAAI,MAAO;EAC/C,IAAI,MAAM;EACV,OAAO,MAAM,MAAM,UAAW,MAAM,OAAkB,OACpD,OAAO;EAIT,MAAM,SAAmB,CAAC;EAC1B,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAS,sBACxC,OAAO,KACL,OAAO,aACL,GAAG,MAAM,SAAS,OAAO,KAAK,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CACtE,CACF;EAEF,OAAO,CAAC,OAAO,KAAK,EAAE,GAAG,MAAM,MAAM,MAAM;CAC7C;CACA,IAAI,eAAe;CACnB,IAAI,SAAS;CACb,IAAI,UAAU;CACd,IAAI,UAAU,kBAAkB,UAAU,UAAU;EAClD,MAAM,MAAM,MAAM,WAAU,SAAQ,iBAAiB,IAAI,IAAI,CAAC;EAC9D,IAAI,OAAO,GAAG;GACZ,SAAS,MAAM,SAAS,GAAG,GAAG;GAC9B,UAAU;EACZ;CACF,OAAO,IAAI,aAAa,IAAI,KAAK,GAC/B,eAAe,MAAM,SAAS,IAAI,IAAI,aAAa;CAErD,IAAI;CACJ,IAAI;EACF,UAAU,IAAI,YAAY,cAAc,EAAE,OAAO,KAAK,CAAC;CACzD,QAAQ;EACN,OAAO;CACT;CACA,IAAI;EACF,OAAO,CAAC,QAAQ,OAAO,MAAM,GAAG,OAAO;CACzC,QAAQ;EAEN,IAAI,MAAM;EACV,IAAI,OAAO,OAAO;EAClB,OAAO,MAAM,MAAM;GACjB,MAAM,SAAS,KAAK,MAAM,MAAM,QAAQ,CAAC;GACzC,IAAI;IACF,IAAI,YAAY,cAAc,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,OAC7C,OAAO,SAAS,GAAG,MAAM,CAC3B;IACA,MAAM;GACR,QAAQ;IACN,OAAO,SAAS;GAClB;EACF;EACA,OAAO,CACL,IAAI,YAAY,YAAY,CAAC,CAAC,OAAO,OAAO,SAAS,GAAG,GAAG,CAAC,GAC5D,IACF;CACF;AACF;AAEA,SAAS,kBAAkB,MAAsB;CAC/C,OAAO,KAAK,SAAS,IAAI,IACrB,KAAK,WAAW,QAAQ,IAAI,CAAC,CAAC,WAAW,MAAM,IAAI,IACnD;AACN;AAIA,SAAS,gBAAgB,MAAc,aAAqC;CAC1E,QAAQ,MAAR;EACE,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO,cAAc,WAAW;EAClC,KAAK,SACH,OAAO;EACT,KAAK,SACH,OAAO,cAAc,UAAU;EACjC,KAAK,UACH,OAAO,cAAc,SAAS;EAChC,SAIE,OAAO,OAAO,aAAa,aAAa;CAC5C;AACF;AAIA,SAAS,gBAAgB,OAAe,OAAe,KAAqB;CAC1E,MAAM,OAAO,MAAM,WAAW,KAAK;CACnC,IAAI,QAAQ,SAAW,QAAQ,SAAW,QAAQ,IAAI,KAAK;EACzD,MAAM,MAAM,MAAM,WAAW,QAAQ,CAAC;EACtC,IAAI,OAAO,SAAW,OAAO,OAC3B,QAAQ,OAAO,SAAW,QAAU,MAAM,SAAW;CAEzD;CACA,OAAO;AACT;AAGA,MAAM,oBAAoB,KAAK;AAC/B,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;;;;;;AAOzB,IAAM,SAAN,MAAa;CACX,SAAoC,CAAC;CACrC,QAAyB,IAAI,WAAW,iBAAiB;CACzD,UAA2B,IAAI,YAAY;CAC3C,SAAiB;CAEjB,QAAsB;EACpB,IAAI,KAAK,SAAS,GAAG;GAEnB,KAAK,OAAO,KACV,KAAK,QAAQ,OAAO,KAAK,MAAM,SAAS,GAAG,KAAK,MAAM,GAAG,EACvD,QAAQ,KACV,CAAC,CACH;GACA,KAAK,SAAS;EAChB;CACF;;CAGA,KAAK,MAAoB;EACvB,IAAI,KAAK,WAAW,mBAClB,KAAK,MAAM;EAEb,KAAK,MAAM,KAAK,UAAU;EAC1B,KAAK,UAAU;CACjB;;CAGA,UAAU,MAAoB;EAC5B,IAAI,OAAO,KAAM;GACf,KAAK,KAAK,IAAI;GACd;EACF;EACA,MAAM,QAAQ,QAAQ,SAAW,QAAQ,QAAU,QAAU;EAC7D,IAAI,QAAQ,gBACV,KAAK,KAAK,MAAQ,SAAS,CAAE;OACxB,IAAI,QAAQ,kBAAkB;GACnC,KAAK,KAAK,MAAQ,SAAS,EAAG;GAC9B,KAAK,KAAK,MAAS,SAAS,IAAK,EAAK;EACxC,OAAO;GACL,KAAK,KAAK,MAAQ,SAAS,EAAG;GAC9B,KAAK,KAAK,MAAS,SAAS,KAAM,EAAK;GACvC,KAAK,KAAK,MAAS,SAAS,IAAK,EAAK;EACxC;EACA,KAAK,KAAK,MAAQ,QAAQ,EAAK;CACjC;;CAGA,MAAM,OAAqB;EACzB,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;GACpD,MAAM,OAAO,gBAAgB,OAAO,OAAO,MAAM,MAAM;GACvD,IAAI,OAAO,OACT,SAAS;GAEX,KAAK,UAAU,IAAI;EACrB;CACF;;CAGA,KAAK,OAAe,OAAe,KAAa,aAA4B;EAC1E,KAAK,IAAI,QAAQ,OAAO,QAAQ,KAAK,SAAS,GAAG;GAC/C,MAAM,OAAO,gBAAgB,OAAO,OAAO,GAAG;GAC9C,IAAI,OAAO,OACT,SAAS;GAEX,MAAM,UAAU,gBAAgB,MAAM,WAAW;GACjD,IAAI,YAAY,MACd,KAAK,UAAU,IAAI;QAEnB,KAAK,MAAM,OAAO;EAEtB;CACF;CAEA,WAAmB;EACjB,KAAK,MAAM;EACX,KAAK,OAAO,KAAK,KAAK,QAAQ,OAAO,CAAC;EACtC,OAAO,KAAK,OAAO,KAAK,EAAE;CAC5B;AACF;AAEA,SAAS,YAAY,IAAoC;CACvD,OAAO,GAAG,UAAU,KAAK,KAAK,GAAG,OAAO,MAAM,KAAK,GAAG,OAAO,GAAG,GAAG,MAAM;AAC3E;AAmBA,IAAM,mBAAN,MAAuB;CACrB;CACA,MAAc;CACd,aAAqB;CACrB,aAAqB;CACrB,oBAA4B;CAC5B,+BAAuC;CACvC,2BAA4B,IAAI,IAA+B;CAC/D,MAAuB,IAAI,OAAO;CAGlC,aAAqB;CAGrB,iBAAyB;CACzB,WAAkC;CAElC,eAA0C,CAAC;CAG3C,kBAA0B;CAG1B,UAAkB;CAElB,YAAY,MAAc;EACxB,KAAK,OAAO;CACd;CAEA,QAAsB;EACpB,KAAK,aAAa;CACpB;CAEA,KAAa,SAAS,GAAW;EAC/B,OAAO,KAAK,KAAK,YAAY,KAAK,MAAM,MAAM,KAAK;CACrD;CAEA,GAAW,SAA0B;EACnC,OAAO,KAAK,KAAK,WAAW,SAAS,KAAK,GAAG;CAC/C;CAEA,IAAY,MAAe;EACzB,OAAO,KAAK,OAAO,KAAK,KAAK;CAC/B;CAEA,aAA6B;EAC3B,MAAM,QAAQ,KAAK;EACnB,OAAO,CAAC,KAAK,OAAO,QAAQ,KAAK,KAAK,WAAW,KAAK,GAAG,CAAC,GACxD,KAAK,OAAO;EAEd,OAAO,KAAK,MAAM;CACpB;CAEA,YAAmC;EACjC,MAAM,QAAQ,KAAK;EACnB,MAAM,QAAQ,KAAK,KAAK;EACxB,IAAI,QAAQ,KAAK,CAAC,gBAAgB,KAAK,GACrC,OAAO;EAET,KAAK,OAAO,QAAQ,QAAU,IAAI;EAClC,SAAS;GACP,MAAM,OAAO,KAAK,KAAK;GACvB,IAAI,OAAO,KAAK,CAAC,WAAW,IAAI,GAC9B;GAEF,KAAK,OAAO,OAAO,QAAU,IAAI;EACnC;EACA,OAAO,KAAK,KAAK,MAAM,OAAO,KAAK,GAAG;CACxC;CAEA,eAAsC;EACpC,MAAM,QAAQ,KAAK;EACnB,SAAS;GACP,MAAM,OAAO,KAAK,KAAK;GACvB,IAAI,OAAO,KAAK,CAAC,WAAW,IAAI,GAC9B;GAEF,KAAK,OAAO,OAAO,QAAU,IAAI;EACnC;EACA,OAAO,KAAK,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAO,KAAK,GAAG,IAAI;CAC/D;;CAKA,MAAoB;EAClB,IAAI;GACF,KAAK,cAAc;EACrB,SAAS,OAAO;GACd,IAAI,EAAE,iBAAiB,OACrB,MAAM;EAEV;EACA,IAAI,KAAK,aAAa,MACpB,OAAO;GAAE,YAAY;GAAO,KAAK;EAAG;EAEtC,IAAI,KAAK,YACP,OAAO;GAAE,YAAY;GAAM,KAAK;EAAG;EAErC,IAAI,KAAK,gBACP,OAAO;GAAE,YAAY;GAAO,KAAK;EAAO;EAG1C,OAAO,KAAK,aAAa,SAAS,GAChC,KAAK,aAAa;EAEpB,OAAO;GAAE,YAAY;GAAO,KAAK,KAAK,IAAI,SAAS;EAAE;CACvD;CAEA,gBAA8B;EAC5B,IAAI,KAAK,KAAK,WAAW,CAAC,MAAM,OAC9B,KAAK,MAAM;EAEb,IAAI,KAAK,GAAG,OAAO,KAAK,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC,CAAC,GAChE,KAAK,oBAAoB;EAE3B,KAAK,UAAU;EACf,IAAI,KAAK,GAAG,WAAW,GAAG;GACxB,KAAK,aAAa;GAClB,KAAK,UAAU;EACjB;EACA,IAAI,KAAK,KAAK,MAAM,IAAM;GACxB,KAAK,MAAM;GACX;EACF;EACA,KAAK,iBAAiB;EACtB,IAAI,KAAK,aAAa,MACpB,KAAK,UAAU;CAEnB;CAGA,YAA0B;EACxB,SAAS;GACP,KAAK,WAAW;GAChB,IAAI,KAAK,GAAG,IAAI,GACd,KAAK,QAAQ;QACR,IAAI,KAAK,GAAG,MAAM,GACvB,KAAK,aAAa;QAElB;EAEJ;CACF;CAKA,qBACE,OAC0B;EAC1B,MAAM,QAAQ,KAAK,KAAK;EACxB,IAAI,UAAU,MAAQ,UAAU,IAAM;GACpC,KAAK,MAAM;GACX,OAAO;EACT;EACA,KAAK,OAAO;EACZ,MAAM,QAAQ,KAAK;EACnB,OACE,CAAC,KAAK,OACN,MAAM,KAAK,KAAK,WAAW,KAAK,GAAG,GAAG,KAAK,MAAM,KAAK,GAEtD,KAAK,OAAO;EAEd,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAO,KAAK,GAAG;EAC7C,IAAI,KAAK,KAAK,MAAM,OAAO;GACzB,KAAK,OAAO;GACZ,OAAO,CAAC,OAAO,IAAI;EACrB;EAEA,KAAK,MAAM;EACX,OAAO,CAAC,OAAO,KAAK;CACtB;CAEA,qBAA6B,MAA6B;EACxD,IAAI,CAAC,KAAK,GAAG,IAAI,GACf,OAAO;EAET,KAAK,OAAO,KAAK;EACjB,KAAK,WAAW;EAChB,IAAI,KAAK,KAAK,MAAM,IAAM;GACxB,KAAK,MAAM;GACX,OAAO;EACT;EACA,KAAK,OAAO;EACZ,KAAK,WAAW;EAChB,OAAO;CACT;CAEA,sBAAoC;EAClC,KAAK,OAAO;EACZ,KAAK,WAAW;EAChB,IAAI,UAAyB;EAC7B,IAAI,KAAK,qBAAqB,SAAS,MAAM,MAAM;GACjD,MAAM,SAAS,KAAK,sBAAsB,MAAM,UAC9C,UAAU,IAAI,SAAS,KAAO,QAAQ,MAAQ,QAAQ,EACxD;GAGA,IAAI,UAAU,mBAAmB,KAAK,OAAO,EAAE,GAC7C,CAAC,WAAW;EAEhB;EACA,IAAI,YAAY,MACd,KAAK,MAAM;OACN,IAAI,YAAY,SAAS,CAAC,aAAa,KAAK,OAAO,GAExD,KAAK,MAAM;EAEb,IAAI,CAAC,QAAQ,KAAK,KAAK,WAAW,KAAK,GAAG,CAAC,GAAG;GAC5C,IAAI,KAAK,GAAG,IAAI,GAAG;IACjB,KAAK,OAAO;IACZ;GACF;GACA,KAAK,MAAM;EACb;EACA,KAAK,WAAW;EAChB,IAAI,cAAc;EAClB,IAAI,KAAK,qBAAqB,UAAU,MAAM,MAAM;GAClD,MAAM,OAAO,KAAK,sBAAsB,MAAM,UAAU;IACtD,MAAM,SACH,QAAQ,MAAQ,QAAQ,MAAU,QAAQ,MAAQ,QAAQ;IAC7D,IAAI,UAAU,GACZ,OAAO;IAET,OACE,UACC,QAAQ,MAAQ,QAAQ,MACzB,SAAS,MACT,SAAS,MACT,SAAS;GAEb,CAAC;GACD,IAAI,SAAS,QAAQ,CAAC,KAAK,MAAM,KAAK,OAAO,IAC3C,KAAK,MAAM;QACN;IACL,cAAc;IACd,KAAK,eAAe,KAAK,EAAE;GAC7B;EACF;EACA,IAAI,eAAe,CAAC,QAAQ,KAAK,KAAK,WAAW,KAAK,GAAG,CAAC,GAAG;GAC3D,IAAI,KAAK,GAAG,IAAI,GAAG;IACjB,KAAK,OAAO;IACZ;GACF;GACA,KAAK,MAAM;EACb;EACA,KAAK,WAAW;EAChB,IAAI,KAAK,qBAAqB,YAAY,MAAM,MAAM;GACpD,MAAM,QAAQ,KAAK,sBACjB,SACE,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS,EAChE;GACA,IAAI,QAAQ,OAAO,OACjB,KAAK,aAAa;QACb,IAAI,QAAQ,OAAO,MACxB,KAAK,MAAM;EAEf;EACA,KAAK,WAAW;EAChB,IAAI,KAAK,GAAG,IAAI,GACd,KAAK,OAAO;OACP,IAAI,KAAK,KAAK,MAAM,IAAM;GAC/B,KAAK,MAAM;GACX,KAAK,OAAO;EACd,OAAO;GACL,KAAK,MAAM;GAEX,IAAI,QAAQ,KAAK;GACjB,OACE,QAAQ,KAAK,KAAK,UAClB,KAAK,KAAK,WAAW,KAAK,MAAM,MAChC,KAAK,KAAK,WAAW,KAAK,MAAM,GAEhC,SAAS;GAEX,KAAK,MAAM,KAAK,IAAI,QAAQ,GAAG,KAAK,KAAK,MAAM;EACjD;CACF;CAEA,eAAuB,MAAoB;EAEzC,MAAM,UAAU,UADH,KAAK,KAAK,MAAM,KAAK,GACL,GAAG,IAAI;EACpC,IAAI,YAAY,MAAM;GAEpB,KAAK,MAAM;GACX;EACF;EACA,MAAM,CAAC,MAAM,WAAW;EACxB,KAAK,OAAO,KAAK,KAAK,MAAM,GAAG,KAAK,GAAG,IAAI;EAC3C,IAAI,SAAS;GACX,KAAK,MAAM;GACX,KAAK,SAAS,KAAK,KAAK;EAC1B;CACF;CAIA,SAAiB;CAIjB,eAAwC;EACtC,MAAM,EAAE,SAAS;EACjB,MAAM,QAAQ,KAAK,MAAM;EACzB,IAAI,QAAQ;EAGZ,SAAS;GACP,IAAI,SAAS,KAAK,QAAQ;IACxB,KAAK,MAAM;IACX,KAAK,MAAM,KAAK;IAChB,OAAO;GACT;GACA,MAAM,OAAO,KAAK,WAAW,KAAK;GAClC,IAAI,SAAS,MAAQ,KAAK,WAAW,QAAQ,CAAC,MAAM,IAAM;IACxD,IAAI,KAAK,WAAW,QAAQ,CAAC,MAAM,IAAM;KACvC,KAAK,MAAM,QAAQ;KACnB,OAAO;MAAE,MAAM;MAAW,OAAO,KAAK,MAAM,OAAO,KAAK;KAAE;IAC5D;IACA,KAAK,MAAM;IACX,SAAS;IACT;GACF;GACA,IACG,QAAQ,cAAc,QAAQ,aAC/B,SAAS,YACT,SAAS,SACT;IACA,SAAS;IACT;GACF;GACA;EACF;EAIA,IAAI,QAAQ;EAEZ,MAAM,aAAqB;GACzB,MAAM,OAAO,KAAK,YAAY,KAAK,KAAK;GACxC,IAAI,SAAS,SAAS;IACpB,QAAQ,KAAK,WAAW,QAAQ,CAAC,MAAM,UAAU,IAAI;IACrD,OAAO;GACT;GACA,QAAQ,OAAO,QAAU,IAAI;GAC7B,OAAO;EACT;EACA,IAAI,YAAY;EAChB,IAAI,IAAI,KAAK;EACb,IAAI,IAAI,GAAG;GACT,KAAK,MAAM;GACX,KAAK,MAAM,KAAK;GAChB,OAAO;EACT;EACA,IAAI,CAAC,UAAU,CAAC,GAAG;GACjB,KAAK,MAAM;GACX,KAAK,MAAM;GACX,OAAO;EACT;EACA,SAAS;EACT,IAAI,YAAY;EAChB,IAAI,IAAI,KAAK;EACb,IAAI,IAAI,GAAG;GACT,KAAK,MAAM;GACX,KAAK,MAAM,KAAK;GAChB,OAAO;EACT;EACA,IAAI,CAAC,UAAU,CAAC,GAAG;GACjB,KAAK,MAAM;GACX,KAAK,MAAM;GACX,OAAO;EACT;EACA,SAAS;EACT,IAAI,MAAM,KAAK;EACf,OACE,OAAO,KACP,UAAU,GAAG,MACZ,QAAQ,MAAQ,MAAM,MAAQ,MAAM,KACrC;GACA,IAAI,MAAM,MAAQ,MAAM,IACtB,KAAK,MAAM;GAEb,IAAI;GACJ,YAAY;GACZ,IAAI;GACJ,YAAY;GACZ,SAAS;GACT,MAAM,KAAK;EACb;EACA,IAAI,MAAM,GAAG;GACX,KAAK,MAAM;GACX,KAAK,MAAM,KAAK;GAChB,OAAO;EACT;EACA,IAAI,CAAC,UAAU,GAAG,GAAG;GACnB,KAAK,MAAM;GACX,KAAK,MAAM;GACX,OAAO;EACT;EACA,KAAK,MAAM,QAAQ;EACnB,OAAO;GACL,MAAM;GACN,OAAO,kBAAkB,KAAK,MAAM,OAAO,SAAS,CAAC;EACvD;CACF;CAEA,UAAiD;EAC/C,MAAM,EAAE,SAAS;EACjB,KAAK,OAAO;EACZ,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,WAAW,MAAM;GACnB,KAAK,MAAM;GACX,OAAO;EACT;EACA,IAAI,OAAO,YAAY,MAAM,OAC3B,KAAK,MAAM;EAEb,IAAI,KAAK,GAAG,IAAI,GAAG;GACjB,KAAK,OAAO;GACZ,OAAO;IAAE,MAAM;IAAM;IAAQ,OAAO;GAAG;EACzC;EACA,IAAI,KAAK,WAAW,MAAM,GACxB,KAAK,MAAM;EAEb,MAAM,QAAQ,KAAK;EACnB,IAAI,QAAQ;EACZ,OAAO,QAAQ,KAAK,QAAQ;GAC1B,MAAM,OAAO,KAAK,YAAY,KAAK,KAAK;GACxC,IAAI,SAAS,MAAQ,KAAK,WAAW,QAAQ,CAAC,MAAM,IAAM;IACxD,KAAK,MAAM,QAAQ;IACnB,OAAO;KACL,MAAM;KACN;KACA,OAAO,kBAAkB,KAAK,MAAM,OAAO,KAAK,CAAC;IACnD;GACF;GACA,IAAI,CAAC,UAAU,IAAI,GACjB;GAEF,SAAS,OAAO,QAAU,IAAI;EAChC;EACA,KAAK,MAAM;EACX,KAAK,MAAM;EACX,OAAO;CACT;CAIA,cAAqC;EACnC,MAAM,QAAQ,KAAK,KAAK;EACxB,IAAI,UAAU,MAAQ,UAAU,IAC9B,OAAO;EAET,MAAM,QAAQ,KAAK,KAAK,QAAQ,OAAO,aAAa,KAAK,GAAG,KAAK,MAAM,CAAC;EACxE,IAAI,QAAQ,GACV,OAAO;EAET,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,MAAM,GAAG,KAAK;EACjD,KAAK,MAAM,QAAQ;EACnB,OAAO;CACT;CAGA,gBAAwB,QAAoC;EAC1D,IAAI,KAAK,GAAG,QAAQ,GAAG;GACrB,KAAK,OAAO;GACZ,IAAI,KAAK,WAAW,MAAM,GACxB,KAAK,MAAM;GAEb,MAAM,WAAW,KAAK,YAAY;GAClC,IAAI,aAAa,MAAM;IACrB,KAAK,MAAM;IACX,OAAO;KAAE,UAAU;KAAM,UAAU;IAAK;GAC1C;GACA,OAAO;IAAE,UAAU;IAAM;GAAS;EACpC;EACA,IAAI,KAAK,GAAG,QAAQ,GAAG;GACrB,KAAK,OAAO;GACZ,IAAI,KAAK,WAAW,MAAM,GACxB,KAAK,MAAM;GAEb,MAAM,WAAW,KAAK,YAAY;GAClC,IAAI,aAAa,QAAQ,CAAC,cAAc,KAAK,QAAQ,GAAG;IAEtD,KAAK,MAAM;IACX,MAAM,IAAI,KAAK;GACjB;GACA,MAAM,SAAS,KAAK,WAAW;GAC/B,MAAM,QAAQ,KAAK,KAAK;GACxB,IAAI,UAAU,MAAQ,UAAU,IAAM;IACpC,IAAI,QACF,KAAK,MAAM;IAEb,OAAO;KAAE;KAAU,UAAU;IAAK;GACpC;GACA,IAAI,WAAW,GACb,KAAK,MAAM;GAEb,MAAM,WAAW,KAAK,YAAY;GAClC,IAAI,aAAa,MACf,KAAK,MAAM;GAEb,OAAO;IAAE;IAAU;GAAS;EAC9B;EACA,OAAO;CACT;CAEA,eAA6B;EAC3B,KAAK,OAAO;EACZ,IAAI,KAAK,WAAW,MAAM,GACxB,KAAK,MAAM;EAGb,IADa,KAAK,UACX,MAAM,MACX,KAAK,MAAM;EAEb,KAAK,WAAW;EAChB,MAAM,WAAW,KAAK,gBAAgB,IAAI;EAC1C,IACE,aACC,SAAS,aAAa,QAAQ,SAAS,aAAa,OAErD,KAAK,oBAAoB;EAG3B,KAAK,aAAa;EAClB,KAAK,WAAW;EAChB,IAAI,KAAK,KAAK,MAAM,IAAM;GACxB,KAAK,OAAO;GACZ,IAAI,CAAC,KAAK,oBAAoB,GAC5B;GAEF,IAAI,KAAK,KAAK,MAAM,IAAM;IACxB,KAAK,OAAO;IACZ,KAAK,WAAW;GAClB;EACF;EACA,IAAI,KAAK,KAAK,MAAM,IAClB,KAAK,OAAO;OAGZ,KAAK,MAAM;CAEf;CAOA,sBAAuC;EACrC,KAAK,WAAW;EAChB,OAAO,CAAC,KAAK,OAAO,KAAK,KAAK,MAAM,IAAM;GACxC,MAAM,SAAS,KAAK;GACpB,IAAI;IACF,IAAI,KAAK,GAAG,MAAM,GAChB,KAAK,aAAa;SACb,IAAI,KAAK,GAAG,IAAI,GACrB,KAAK,QAAQ;SACR,IAAI,KAAK,GAAG,UAAU,GAC3B,KAAK,uBAAuB;SACvB,IAAI,KAAK,GAAG,WAAW,GAC5B,KAAK,wBAAwB;SACxB,IAAI,KAAK,GAAG,WAAW,GAC5B,KAAK,wBAAwB;SACxB,IAAI,KAAK,GAAG,YAAY,GAC7B,KAAK,yBAAyB;SACzB,IAAI,KAAK,KAAK,MAAM,IACzB,KAAK,8BAA8B;SAC9B;KAGL,KAAK,MAAM;KACX,KAAK,OAAO,KAAK,KAAK,IAAI,QAAU,IAAI;KACxC,OAAO;IACT;GACF,SAAS,OAAO;IACd,IAAI,EAAE,iBAAiB,mBACrB,MAAM;IAER,KAAK,MAAM;GACb;GACA,IAAI,KAAK,QAAQ,QAAQ;IACvB,KAAK,MAAM;IACX,KAAK,OAAO,KAAK,KAAK,IAAI,QAAU,IAAI;IACxC,OAAO;GACT;GACA,KAAK,WAAW;EAClB;EACA,OAAO;CACT;CAEA,gBAA8B;EAC5B,IAAI,KAAK,WAAW,MAAM,GAAG;GAC3B,KAAK,MAAM;GACX,MAAM,IAAI,iBAAiB;EAC7B;CACF;CAEA,cAA8B;EAC5B,MAAM,OAAO,KAAK,UAAU;EAC5B,IAAI,SAAS,MAAM;GACjB,KAAK,MAAM;GACX,MAAM,IAAI,iBAAiB;EAC7B;EACA,OAAO;CACT;CAEA,wBAAsC;EACpC,KAAK,WAAW;EAChB,IAAI,KAAK,KAAK,MAAM,IAAM;GACxB,KAAK,MAAM;GACX,MAAM,IAAI,iBAAiB;EAC7B;EACA,KAAK,OAAO;CACd;CAEA,gCAA8C;EAC5C,KAAK,OAAO;EACZ,MAAM,OAAO,KAAK,YAAY;EAC9B,IAAI,KAAK,KAAK,MAAM,IAAM;GACxB,KAAK,MAAM;GACX,MAAM,IAAI,iBAAiB;EAC7B;EACA,KAAK,OAAO;EAGZ,KAAK,+BAA+B;EACpC,IAAI,KAAK,cAAc,CAAC,KAAK,SAAS,IAAI,IAAI,MAAM,GAClD,KAAK,MAAM;CAEf;CAEA,yBAAuC;EACrC,KAAK,OAAO;EACZ,KAAK,cAAc;EACnB,IAAI,YAAY;EAChB,IAAI,KAAK,KAAK,MAAM,IAAM;GACxB,KAAK,OAAO;GACZ,KAAK,cAAc;GACnB,YAAY;EACd;EACA,MAAM,OAAO,KAAK,YAAY;EAC9B,KAAK,cAAc;EACnB,MAAM,MAAM,YAAY,IAAI,SAAS;EACrC,IAAI,WAAW;EAEf,IADc,KAAK,YACX,MAAM,MAAM;GAClB,MAAM,WAAW,KAAK,gBAAgB,KAAK;GAC3C,IACE,CAAC,YACA,SAAS,aAAa,QAAQ,SAAS,aAAa,MACrD;IACA,KAAK,MAAM;IACX,MAAM,IAAI,iBAAiB;GAC7B;GACA,MAAM,SAAS,KAAK,WAAW;GAC/B,IAAI,CAAC,aAAa,SAAS,KAAK,KAAK,GAAG,OAAO,GAAG;IAChD,KAAK,OAAO;IACZ,KAAK,cAAc;IACnB,KAAK,YAAY;GACnB;EACF,OACE,WAAW;EAEb,KAAK,sBAAsB;EAC3B,IAAI,CAAC,aAAa,WAAW,IAAI,IAAI,GACnC;EAEF,IAAI,KAAK,SAAS,IAAI,GAAG,GACvB;EAEF,KAAK,SAAS,IAAI,KAAK,EAAE,SAAS,CAAC;CACrC;CAEA,2BAAyC;EACvC,KAAK,OAAO;EACZ,KAAK,cAAc;EACnB,KAAK,YAAY;EACjB,KAAK,cAAc;EACnB,MAAM,WAAW,KAAK,gBAAgB,KAAK;EAC3C,IACE,CAAC,YACA,SAAS,aAAa,QAAQ,SAAS,aAAa,MACrD;GACA,KAAK,MAAM;GACX,MAAM,IAAI,iBAAiB;EAC7B;EACA,KAAK,sBAAsB;CAC7B;CAEA,iBAAyB,OAAsB;EAE7C,KAAK,OAAO;EACZ,SAAS;GACP,KAAK,WAAW;GAEhB,KADc,QAAQ,KAAK,UAAU,IAAI,KAAK,aAAa,OAC7C,MAAM;IAClB,KAAK,MAAM;IACX,MAAM,IAAI,iBAAiB;GAC7B;GACA,KAAK,WAAW;GAChB,IAAI,KAAK,KAAK,MAAM,KAAM;IACxB,KAAK,OAAO;IACZ;GACF;GACA,IAAI,KAAK,KAAK,MAAM,IAAM;IACxB,KAAK,OAAO;IACZ;GACF;GACA,KAAK,MAAM;GACX,MAAM,IAAI,iBAAiB;EAC7B;CACF;CAEA,0BAAwC;EACtC,KAAK,OAAO;EACZ,KAAK,cAAc;EACnB,KAAK,YAAY;EACjB,SAAS;GACP,MAAM,SAAS,KAAK,WAAW;GAC/B,IAAI,KAAK,KAAK,MAAM,IAAM;IACxB,KAAK,OAAO;IACZ;GACF;GACA,IAAI,WAAW,GAAG;IAChB,KAAK,MAAM;IACX,MAAM,IAAI,iBAAiB;GAC7B;GACA,KAAK,YAAY;GACjB,KAAK,cAAc;GACnB,IAAI,KAAK,GAAG,UAAU,GAAG;IACvB,KAAK,OAAO;IACZ,KAAK,cAAc;IACnB,IAAI,KAAK,KAAK,MAAM,IAAM;KACxB,KAAK,MAAM;KACX,MAAM,IAAI,iBAAiB;IAC7B;IACA,KAAK,iBAAiB,IAAI;GAC5B,OAAO,IAAI,KAAK,KAAK,MAAM,IACzB,KAAK,iBAAiB,KAAK;QACtB;IACL,MAAM,UAAU,sBAAsB,MAAK,cACzC,KAAK,GAAG,SAAS,CACnB;IACA,IAAI,CAAC,SAAS;KACZ,KAAK,MAAM;KACX,MAAM,IAAI,iBAAiB;IAC7B;IACA,KAAK,OAAO,QAAQ;GACtB;GACA,KAAK,cAAc;GACnB,IAAI,KAAK,GAAG,WAAW,GACrB,KAAK,OAAO;QACP,IAAI,KAAK,GAAG,UAAU,GAC3B,KAAK,OAAO;QACP;IACL,IAAI,KAAK,GAAG,QAAQ,GAAG;KACrB,KAAK,OAAO;KACZ,KAAK,cAAc;IACrB;IACA,KAAK,sBAAsB;GAC7B;EACF;CACF;CAGA,wBAAsC;EACpC,MAAM,QAAQ,KAAK,KAAK;EACxB,IAAI,UAAU,MAAQ,UAAU,IAAM;GACpC,KAAK,MAAM;GACX,MAAM,IAAI,iBAAiB;EAC7B;EACA,KAAK,OAAO;EACZ,SAAS;GACP,IAAI,KAAK,KAAK;IACZ,KAAK,MAAM;IACX,MAAM,IAAI,iBAAiB;GAC7B;GACA,MAAM,OAAO,KAAK,KAAK;GACvB,IAAI,SAAS,OAAO;IAClB,KAAK,OAAO;IACZ;GACF;GACA,IAAI,SAAS,IAAM;IACjB,IAAI,KAAK,wBAAwB,IAAI,MAAM,MAAM;KAC/C,KAAK,MAAM;KACX,MAAM,IAAI,iBAAiB;IAC7B;IACA;GACF;GACA,IAAI,SAAS,IACX,KAAK,MAAM;GAEb,KAAK,OAAO,OAAO,QAAU,IAAI;EACnC;CACF;CAEA,0BAAwC;EACtC,KAAK,OAAO;EACZ,KAAK,cAAc;EACnB,KAAK,YAAY;EACjB,KAAK,cAAc;EACnB,IAAI,KAAK,GAAG,OAAO,GACjB,KAAK,OAAO;OACP,IAAI,KAAK,GAAG,KAAK,GACtB,KAAK,OAAO;OACP,IAAI,KAAK,KAAK,MAAM,IACzB,KAAK,kBAAkB;OAClB;GACL,KAAK,MAAM;GACX,MAAM,IAAI,iBAAiB;EAC7B;EACA,KAAK,sBAAsB;CAC7B;CAIA,oBAAkC;EAChC,MAAM,aAAa,CAAC,CAAC;EACrB,KAAK,OAAO;EACZ,SAAS;GACP,KAAK,WAAW;GAChB,IAAI,KAAK,KAAK,MAAM,IAAM;IACxB,KAAK,OAAO;IACZ,IAAI,WAAW,UAAU,yBAAyB;KAEhD,KAAK,MAAM;KACX,MAAM,IAAI,iBAAiB;IAC7B;IACA,WAAW,KAAK,CAAC;IACjB;GACF;GACA,IAAI,KAAK,GAAG,SAAS,GACnB,KAAK,OAAO;QACP,IAAI,KAAK,UAAU,MAAM,MAAM;IACpC,KAAK,MAAM;IACX,MAAM,IAAI,iBAAiB;GAC7B,OACE,KAAK,eAAe;GAGtB,SAAS;IACP,KAAK,WAAW;IAChB,MAAM,OAAO,KAAK,KAAK;IACvB,IAAI,SAAS,OAAQ,SAAS,IAAM;KAClC,MAAM,UAAU,WAAW,GAAG,EAAE;KAChC,IAAI,YAAY,KAAK,YAAY,MAAM;MACrC,KAAK,MAAM;MACX,MAAM,IAAI,iBAAiB;KAC7B;KACA,WAAW,WAAW,SAAS,KAAK;KACpC,KAAK,OAAO;KACZ;IACF;IACA,IAAI,SAAS,IAAM;KACjB,KAAK,MAAM;KACX,MAAM,IAAI,iBAAiB;IAC7B;IACA,KAAK,OAAO;IACZ,WAAW,IAAI;IACf,KAAK,eAAe;IACpB,IAAI,WAAW,WAAW,GACxB;GAEJ;EACF;CACF;CAEA,iBAA+B;EAC7B,MAAM,OAAO,KAAK,KAAK;EACvB,IAAI,SAAS,MAAQ,SAAS,MAAQ,SAAS,IAC7C,KAAK,OAAO;CAEhB;CAKA,eAA+B;EAC7B,IAAI,QAAQ;EACZ,IAAI,SAAS;EACb,IAAI,KAAK,KAAK,MAAM,KAAM;GACxB,KAAK,OAAO;GACZ,SAAS;IACP,MAAM,OAAO,KAAK,KAAK;IACvB,IAAI,SAAS,IAAM;KACjB,KAAK,OAAO;KACZ;IACF;IACA,MAAM,QAAQ,OAAO,SAAS,OAAO,aAAa,IAAI,GAAG,EAAE;IAC3D,IAAI,OAAO,KAAK,OAAO,MAAM,KAAK,GAAG;KACnC,QAAQ;KACR,SAAS;KACT;IACF;IACA,QAAQ,KAAK,IAAI,QAAQ,KAAK,OAAO,OAAU;IAC/C,UAAU;IACV,KAAK,OAAO;GACd;EACF,OACE,SAAS;GACP,MAAM,OAAO,KAAK,KAAK;GACvB,IAAI,SAAS,IAAM;IACjB,KAAK,OAAO;IACZ;GACF;GACA,IAAI,OAAO,MAAQ,OAAO,IAAM;IAC9B,QAAQ;IACR,SAAS;IACT;GACF;GACA,QAAQ,KAAK,IAAI,QAAQ,MAAM,OAAO,KAAO,OAAU;GACvD,UAAU;GACV,KAAK,OAAO;EACd;EAEF,IAAI,WAAW,KAAK,UAAU,GAAG;GAC/B,KAAK,MAAM;GACX,OAAO;EACT;EACA,IAAI,QAAQ,aAAa;GACvB,KAAK,MAAM;GACX,OAAO;EACT;EACA,IAAI,CAAC,UAAU,KAAK,GAAG;GACrB,KAAK,MAAM;GACX,IAAI,SAAS,SAAW,SAAS,OAE/B,KAAK,iBAAiB;EAE1B;EACA,OAAO;CACT;CAGA,kBAAyC;EACvC,MAAM,OAAO,KAAK,UAAU;EAC5B,IAAI,SAAS,MAAM;GACjB,KAAK,MAAM;GACX,OAAO;EACT;EACA,IAAI,KAAK,KAAK,MAAM,IAAM;GACxB,KAAK,MAAM;GACX,OAAO;EACT;EACA,KAAK,OAAO;EACZ,OAAO;CACT;CAEA,0BAA2C;EACzC,OACE,KAAK,cACL,EAAE,KAAK,qBAAqB,KAAK;CAErC;CAIA,wBAAgC,OAA+B;EAC7D,KAAK,OAAO;EACZ,IAAI,KAAK,KAAK,MAAM,IAAM;GACxB,KAAK,OAAO;GACZ,MAAM,OAAO,KAAK,aAAa;GAC/B,IAAI,SAAS,GACX,OAAO;GAET,IAAI,SAAS,SAAS,IACpB,OAAO;GAET,OAAO,OAAO,cAAc,IAAI;EAClC;EACA,MAAM,OAAO,KAAK,gBAAgB;EAClC,IAAI,SAAS,MACX,OAAO;EAET,MAAM,aAAa,WAAW,IAAI,IAAI;EACtC,IAAI,eAAe,KAAA,GACjB,OAAO,SAAS,eAAe,MAAM,UAAU;EAEjD,IAAI,KAAK,SAAS,IAAI,IAAI,GACxB,OAAO,IAAI,KAAK;EAElB,IAAI,KAAK,wBAAwB,GAC/B,KAAK,MAAM;EAEb,OAAO;CACT;CAGA,wBAAsC;EACpC,KAAK,OAAO;EACZ,IAAI,KAAK,KAAK,MAAM,IAAM;GACxB,KAAK,OAAO;GACZ,MAAM,OAAO,KAAK,aAAa;GAC/B,IAAI,SAAS,GACX,KAAK,WAAW,OAAO,cAAc,IAAI,CAAC;GAE5C;EACF;EACA,MAAM,OAAO,KAAK,gBAAgB;EAClC,IAAI,SAAS,MACX;EAEF,MAAM,aAAa,WAAW,IAAI,IAAI;EACtC,IAAI,eAAe,KAAA,KAAa,CAAC,KAAK,SAAS,IAAI,IAAI,GAAG;GACxD,IAAI,KAAK,wBAAwB,GAC/B,KAAK,MAAM;GAEb,KAAK,qBAAqB,IAAI;GAC9B;EACF;EACA,IAAI,CAAC,KAAK,YACR;EAEF,IAAI,eAAe,KAAA,GACjB,KAAK,qBAAqB,IAAI;OAE9B,KAAK,WAAW,UAAU;CAE9B;CAKA,aAA2B;EACzB,IAAI,KAAK,iBAAiB;GACxB,KAAK,IAAI,KAAK,EAAI;GAClB,KAAK,kBAAkB;EACzB;CACF;CAEA,qBAA6B,MAAoB;EAC/C,KAAK,WAAW;EAChB,KAAK,UAAU;EACf,KAAK,IAAI,KAAK,EAAI;EAClB,KAAK,IAAI,MAAM,IAAI;EACnB,KAAK,IAAI,KAAK,EAAI;CACpB;CAEA,kBAA0B,SAAyB;EACjD,KAAK,WAAW;EAChB,KAAK,UAAU;EACf,KAAK,IAAI,MAAM,MAAM;EACrB,KAAK,IAAI,MAAM,QAAQ,KAAK;EAC5B,KAAK,IAAI,MAAM,KAAK;CACtB;CAEA,aAAqB,IAAkC;EACrD,KAAK,WAAW;EAChB,KAAK,UAAU;EACf,KAAK,IAAI,MAAM,YAAY,EAAE,CAAC;CAChC;CAGA,eAA6B;EAC3B,MAAM,OAAO,KAAK,aAAa,IAAI;EACnC,IAAI,KAAK,iBAAiB;GACxB,KAAK,IAAI,MAAM,IAAI;GACnB,KAAK,kBAAkB;EACzB,OAAO;GACL,KAAK,IAAI,MAAM,IAAI;GACnB,KAAK,IAAI,MAAM,IAAI;GACnB,KAAK,IAAI,KAAK,EAAI;EACpB;EAEA,KAAK,UAAU;CACjB;CAMA,WAAmB,OAAe,QAAQ,GAAG,MAAM,MAAM,QAAc;EACrE,IAAI,QAAQ,OACV;EAEF,KAAK,WAAW;EAChB,MAAM,MAAM,KAAK,IAAI,KAAK,SAAS,CAAC;EACpC,IAAI,OAAO,MAAM,SAAS,iBAAiB;GAGzC,KAAK,IAAI,KAAK,OAAO,OAAO,SAAS,kBAAkB,MAAM,KAAK;GAClE,KAAK,UAAU;GACf,KAAK,MAAM;GACX,MAAM,IAAI,KAAK;EACjB;EACA,KAAK,IAAI,KAAK,OAAO,OAAO,KAAK,KAAK;EACtC,KAAK,UAAU,OAAO,MAAM;CAC9B;CAKA,sBAA6C;EAC3C,MAAM,QAAQ,KAAK,KAAK;EACxB,IAAI,UAAU,MAAQ,UAAU,IAAM;GACpC,KAAK,MAAM;GACX,OAAO;EACT;EACA,KAAK,OAAO;EACZ,MAAM,QAAQ,IAAI,WAAW;EAC7B,IAAI,WAAW,KAAK;EACpB,MAAM,eAAqB;GACzB,IAAI,KAAK,MAAM,UACb,MAAM,KAAK,KAAK,KAAK,MAAM,UAAU,KAAK,GAAG,CAAC;EAElD;EACA,SAAS;GACP,IAAI,KAAK,KAAK;IACZ,KAAK,MAAM;IACX,OAAO;GACT;GACA,MAAM,OAAO,KAAK,KAAK;GACvB,IAAI,SAAS,OAAO;IAClB,OAAO;IACP,KAAK,OAAO;IACZ,OAAO,MAAM,KAAK,KAAK;GACzB;GACA,IAAI,SAAS,IAAM;IACjB,OAAO;IACP,MAAM,QAAQ,KAAK,wBAAwB,KAAK;IAChD,IAAI,UAAU,MACZ,OAAO;IAET,MAAM,KAAK,KAAK;IAChB,WAAW,KAAK;IAChB;GACF;GACA,IAAI,SAAS,IACX,KAAK,MAAM;GAEb,MAAM,QAAQ,OAAO,QAAU,IAAI;GACnC,IAAI,SAAS,WAAW,KAAK,KAAK,CAAC,MAAM,SAAS;IAEhD,OAAO;IACP,KAAK,OAAO;IACZ,WAAW,KAAK;GAClB,OAAO,IAAI,SAAS,cAAc,QAAQ,IAAI,GAAG;IAC/C,OAAO;IACP,MAAM,KAAK,GAAG;IACd,KAAK,OAAO;IACZ,WAAW,KAAK;GAClB,OAAO,IAAI,UAAU,IAAI,GACvB,KAAK,OAAO;QACP;IAGL,KAAK,MAAM;IACX,OAAO;IACP,MAAM,KAAK,OAAO,aAAa,MAAW,OAAO,cAAc,IAAI,CAAC;IACpE,KAAK,OAAO;IACZ,WAAW,KAAK;GAClB;EACF;CACF;CAKA,gBAAkD;EAChD,KAAK,OAAO;EACZ,MAAM,OAAO,KAAK,UAAU;EAC5B,IAAI,SAAS,MAAM;GAEjB,KAAK,MAAM;GACX,OAAO;EACT;EACA,MAAM,MAAgB;GAAE,YAAY,CAAC;GAAG;GAAM,YAAY,CAAC;GAAG,MAAM;EAAK;EACzE,KAAK,WAAW;EAChB,SAAS;GACP,MAAM,OAAO,KAAK,KAAK;GASvB,IAPE,SAAS,MACR,SAAS,MAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC,MAAM,MAM9C,EAJX,QAAQ,cACR,SAAS,YACT,SAAS,WACT,SAAS,YACe,KAAK,KAC7B;GAEF,MAAM,gBAAgB,KAAK,UAAU;GACrC,IAAI,kBAAkB,MAAM;IAE1B,KAAK,MAAM;IACX;GACF;GACA,KAAK,WAAW;GAChB,IAAI,QAAuB;GAC3B,IAAI,KAAK,KAAK,MAAM,IAAM;IACxB,KAAK,OAAO;IACZ,KAAK,WAAW;IAChB,QAAQ,KAAK,oBAAoB;GACnC,OAEE,KAAK,MAAM;GAEb,IAAI,UAAU,MACZ,KAAK,aAAa,KAAK,eAAe,KAAK;GAE7C,MAAM,OAAO,KAAK,KAAK;GACvB,IACE,SAAS,MACR,SAAS,MAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC,MAAM,IAEzD;GAEF,IAAI,KAAK,WAAW,MAAM,GAAG;IAE3B,KAAK,MAAM;IACX;GACF;EACF;EACA,IAAI;EACJ,IAAI,KAAK,GAAG,IAAI,GAAG;GACjB,KAAK,OAAO;GACZ,OAAO;EACT,OAAO,IAAI,KAAK,KAAK,MAAM,IAAM;GAC/B,KAAK,OAAO;GACZ,OAAO;EACT,OAAO;GAEL,KAAK,MAAM;GACX,OAAO;EACT;EACA,KAAK,cAAc,GAAG;EACtB,OAAO,CAAC,MAAM,IAAI;CACpB;CAGA,cAAsB,KAAqB;EACzC,MAAM,EAAE,QAAQ;EAChB,KAAK,WAAW;EAChB,IAAI,KAAK,EAAI;EACb,IAAI,MAAM,IAAI,IAAI;EAClB,KAAK,MAAM,CAAC,QAAQ,QAAQ,IAAI,YAAY;GAC1C,IAAI,MAAM,WAAW,KAAK,cAAa,SAAS;GAChD,IAAI,WAAW,IAAI;IACjB,IAAI,MAAM,MAAM;IAChB,IAAI,MAAM,KAAI;GAChB;GACA,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,IAAI;GACjC,IAAI,KAAK,EAAI;EACf;EACA,KAAK,MAAM,CAAC,MAAM,UAAU,IAAI,YAAY;GAC1C,IAAI,KAAK,UAAU;GACnB,IAAI,MAAM,IAAI;GACd,IAAI,MAAM,KAAI;GACd,IAAI,KAAK,OAAO,GAAG,MAAM,QAAQ,IAAI;GACrC,IAAI,KAAK,EAAI;EACf;CACF;CAEA,aAAqB,KAAe,MAAc,OAAqB;EACrE,IAAI,yBAAS,IAAI,IAAY;EAC7B,MAAM,EAAE,SAAS;EACjB,IAAI,SAAS,WAAW,KAAK,WAAW,QAAQ,GAAG;GACjD,MAAM,SAAS,SAAS,UAAU,KAAK,KAAK,MAAM,CAAC;GACnD,IAAI,KAAK,IAAI,IAAI,GAAG;IAClB,KAAK,MAAM;IACX;GACF;GACA,KAAK,IAAI,IAAI;GACb,IACE,WAAW,SACX,WAAW,WACV,WAAW,MAAM,UAAU,IAE5B;GAEF,IAAI,WAAW,KAAK,CAAC,QAAQ,KAAK,CAAC;GACnC;EACF;EACA,IAAI,KAAK,IAAI,IAAI,GAEf,KAAK,MAAM;EAEb,KAAK,IAAI,IAAI;EACb,IAAI,WAAW,KAAK,CAAC,MAAM,KAAK,CAAC;CACnC;CAIA,eAAsC;EACpC,MAAM,UAAU,KAAK,cAAc;EACnC,IAAI,YAAY,MACd,OAAO;EAET,MAAM,CAAC,MAAM,QAAQ;EACrB,IAAI,MAAM;GACR,KAAK,aAAa,KAAK,IAAI;GAC3B,KAAK,kBAAkB;EACzB,OACE,KAAK,IAAI,MAAM,IAAI;EAErB,KAAK,UAAU;EACf,OAAO;CACT;CAEA,mBAAiC;EAC/B,KAAK,WAAW,KAAK,aAAa;EAClC,IAAI,KAAK,aAAa,SAAS,GAC7B,KAAK,aAAa;CAEtB;CAGA,YAAoB,UAAwB;EAC1C,KAAK,OAAO;EACZ,MAAM,OAAO,KAAK,UAAU;EAC5B,KAAK,WAAW;EAChB,IAAI,KAAK,KAAK,MAAM,IAClB,KAAK,OAAO;OAEZ,KAAK,MAAM;EAEb,IAAI,SAAS,UAEX,KAAK,MAAM;CAEf;CAGA,eAA6B;EAC3B,MAAM,QAAQ,KAAK;EACnB,MAAM,YACJ,KAAK,UAAU,IAAI,KAAK,SAAS,KAAK,KAAK;EAC7C,OAAO,KAAK,MAAM,IAAI,GAAG;GACvB,MAAM,OAAO,KAAK,KAAK,WAAW,KAAK,GAAG;GAC1C,IAAI,SAAS,IAAM;IACjB,MAAM,OAAO,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;IAC9C,IAAI,SAAS,IAAM;KAGjB,KAAK,YAAY,MAAM,GAAG,EAAE,CAAW;KACvC,KAAK,aAAa;KAClB,IAAI,MAAM,WAAW,GACnB;IAEJ,OAAO,IAAI,SAAS,IAAM;KACxB,MAAM,KAAK,KAAK,QAAQ;KACxB,IAAI,IACF,KAAK,aAAa,EAAE;IAExB,OAAO,IAAI,KAAK,GAAG,MAAM,GAAG;KAC1B,MAAM,UAAU,KAAK,aAAa;KAClC,IAAI,SACF,KAAK,kBAAkB,OAAO;IAElC,OAAO,IAAI,KAAK,GAAG,WAAW,GAC5B,KAAK,WAAW;SACX;KACL,IAAI,MAAM,UAAU,WAAW;MAE7B,KAAK,MAAM;MACX,MAAM,IAAI,KAAK;KACjB;KACA,KAAK,aAAa;IACpB;GACF,OAAO,IAAI,SAAS,IAClB,KAAK,sBAAsB;QAE3B,KAAK,cAAc;EAEvB;EACA,IAAI,KAAK,UAAU,GACjB,MAAM,IAAI,KAAK;CAEnB;CAEA,aAA2B;EACzB,MAAM,QAAQ,KAAK,MAAM;EACzB,IAAI,QAAQ;EACZ,MAAM,EAAE,SAAS;EACjB,OAAO,QAAQ,KAAK,QAAQ;GAC1B,MAAM,OAAO,KAAK,YAAY,KAAK,KAAK;GACxC,IAAI,SAAS,MAAQ,KAAK,WAAW,OAAO,KAAK,GAAG;IAClD,MAAM,QAAQ,kBAAkB,KAAK,MAAM,OAAO,KAAK,CAAC;IACxD,IAAI,UAAU,MAAM,KAAK,UAAU,GAAG;KAEpC,KAAK,WAAW;KAChB,KAAK,UAAU;IACjB;IACA,KAAK,WAAW,KAAK;IACrB,KAAK,MAAM,QAAQ;IACnB;GACF;GACA,IAAI,CAAC,UAAU,IAAI,GAAG;IACpB,KAAK,MAAM;IACX,KAAK,MAAM;IACX;GACF;GACA,SAAS,OAAO,QAAU,IAAI;EAChC;EAEA,KAAK,MAAM;EACX,KAAK,MAAM,KAAK;CAClB;CAGA,gBAA8B;EAC5B,MAAM,EAAE,SAAS;EACjB,MAAM,QAAQ,KAAK,UAAU,IAAI,KAAK,SAAS,KAAK;EACpD,IAAI,QAAQ,KAAK;EACjB,IAAI,QAAQ;EACZ,SAAS;GACP,IAAI,SAAS,OAAO;IAClB,KAAK,WAAW,MAAM,OAAO,KAAK;IAClC,KAAK,MAAM;IACX;GACF;GACA,MAAM,OAAO,KAAK,WAAW,KAAK;GAClC,IAAI,SAAS,MAAQ,SAAS,IAAM;IAClC,KAAK,WAAW,MAAM,OAAO,KAAK;IAClC,KAAK,MAAM;IACX;GACF;GACA,IAAI,SAAS,IAAM;IACjB,IAAI,KAAK,WAAW,OAAO,KAAK,GAAG;KAGjC,KAAK,MAAM;KACX,KAAK,MAAM,QAAQ;KACnB;IACF;IACA,SAAS;IACT;GACF;GACA,IACG,QAAQ,cAAc,QAAQ,aAC/B,SAAS,YACT,SAAS,SACT;IACA,SAAS;IACT;GACF;GACA,IAAI,SAAS,WAAW,KAAK,WAAW,QAAQ,CAAC,MAAM,SAAS;IAE9D,KAAK,WAAW,MAAM,OAAO,KAAK;IAClC,QAAQ,QAAQ;IAChB,SAAS;IACT;GACF;GACA;EACF;EACA,KAAK,WAAW,MAAM,OAAO,KAAK;EAClC,MAAM,eAAe;EACrB,OAAO,QAAQ,OAAO;GACpB,MAAM,OAAO,KAAK,YAAY,KAAK,KAAK;GACxC,IAAI,SAAS,MAAQ,SAAS,MAAQ,CAAC,UAAU,IAAI,GACnD;GAEF,IAAI,SAAS,MAAQ,KAAK,WAAW,OAAO,KAAK,GAC/C,KAAK,MAAM;GAEb,SAAS,OAAO,QAAU,IAAI;EAChC;EACA,KAAK,WACH,kBAAkB,KAAK,MAAM,cAAc,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,CACpE;EACA,IAAI,QAAQ,OAAO;GACjB,MAAM,OAAO,KAAK,YAAY,KAAK,KAAK;GACxC,IAAI,SAAS,MAAQ,SAAS,IAAM;IAElC,KAAK,MAAM;IACX,SAAS,OAAO,QAAU,IAAI;GAChC;EACF;EACA,KAAK,MAAM;CACb;AACF;;;;;;;;;AAqBA,SAAgB,WAAW,MAA4B;CACrD,IAAI;EACF,oBAAoB,IAAI;CAC1B,QAAQ;EACN,OAAO;GAAE,YAAY;GAAO,KAAK;EAAO;CAC1C;CACA,MAAM,QAAQ,KAAK,WAAW,CAAC,MAAM,QAAU,IAAI;CACnD,IAAI,SAAS,MAAO,KAAK,SAAS,SAAS,KAAK,WAAW,KAAK,MAAM,GAEpE,OAAO;EAAE,YAAY;EAAO,KAAK;CAAO;CAO1C,OAAO,IAAI,iBAHI,KAAK,WAAW,QAAgB,IAC3C,IAAI,YAAY,UAAU,CAAC,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,IACjE,IAC8B,CAAC,CAAC,IAAI;AAC1C;;;;;;AC72DA,IAAa,gBAAb,cAAmC,MAAM;CACvC,OAAgB;AAClB;;AAGA,MAAa,gBACX;;;;;;;AAQF,IAAa,kBAAb,cAAqC,MAAM;CACzC,OAAgB;CAEhB,cAAc;EACZ,MAAM,aAAa;CACrB;AACF;;;;;;AAOA,IAAa,gBAAb,cAAmC,MAAM;CACvC,OAAgB;AAClB;AAeA,SAAS,eAA0B;CAGjC,OAAO,OAAO,OAAO,IAAI;AAC3B;AAGA,SAAS,SACP,MACA,KACA,MACW;CACX,MAAM,SAAS,QAAQ,aAAa;CACpC,IAAI,OAAO,OAAO,QAAQ,GAAG,GAAG;EAC9B,MAAM,WAAW,OAAO;EACxB,IAAI,MAAM,QAAQ,QAAQ,GACxB,SAAS,KAAK,IAAI;OAElB,OAAO,OAAO,CAAC,UAAU,IAAI;CAEjC,OACE,OAAO,OAAO;CAEhB,OAAO;AACT;AAOA,SAAS,oBAA2B;CAClC,MAAM,IAAI,gBAAgB;AAC5B;;;;;;;;;;;;AAaA,SAAgB,eACd,MACA,UAA2B,CAAC,GACV;CAClB,oBAAoB,IAAI;CACxB,MAAM,mBACJ,QAAQ,kBAAkB,QAAQ,KAAA,IAAY;CAChD,MAAM,WAAW,QAAQ,YAAY,OAAO;CAC5C,MAAM,WAAW,QAAQ,YAAY,OAAO;CAC5C,MAAM,QAAiB,CAAC;CACxB,IAAI,QAAQ;CACZ,IAAI,OAAyB;CAC7B,IAAI,OAAO,IAAI,WAAW;CAC1B,MAAM,kBAAwB;EAC5B,SAAS;EACT,IAAI,QAAQ,UACV,MAAM,IAAI,cACR,qBAAqB,SAAS,yBAChC;CAEJ;CACA,WAAW,MAAM;EACf,WAAW;EACX,cAAc,OAAqB;GACjC,KAAK,KAAK,KAAK;EACjB;EACA,WAAW,MAAoB;GAC7B,MAAM,QAAQ,MAAM,IAAI;GACxB,IAAI,CAAC,OACH;GAEF,IAAI,QAAQ,KAAK,KAAK;GACtB,MAAM,UAAU;GAChB,CAAC,CAAE,MAAM,QAAS;GAClB,IAAI,OACF,QAAQ,QAAQ,KAAK,KAAK;GAE5B,IAAI,YAAY,MACd,OAAO,SAAS,MAAM,MAAM,KAAK;QAC5B;IACL,IAAI,OACF,SAAS,SAAS,SAAS,KAAK;IAElC,OAAO,SAAS,MAAM,MAAM,OAAO;GACrC;EACF;EACA,aAAmB;GACjB,MAAM,IAAI,cAAc,uBAAuB;EACjD;EACA;EACA,aAAa,OAAe,YAA4B;GACtD,UAAU;GACV,IAAI,MAAM,UAAU,UAClB,MAAM,IAAI,cAAc,uBAAuB,SAAS,UAAU;GAEpE,MAAM,KAAK;IAAE;IAAM;GAAK,CAAC;GACzB,IAAI,QAA0B;GAC9B,KAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS,GAAG;IACzD,UAAU,aAAa;IACvB,MAAM,IAAI,WAAW,YAAY,WAAW,QAAQ,MAAM;GAC5D;GACA,OAAO;GACP,OAAO,IAAI,WAAW;EACxB;CACF,CAAC;CACD,OAAO;AACT;;;ACpGA,MAAa,qBAAqB;;;;;AAMlC,MAAa,iDAAsD,IAAI,IAAI;CACzE;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,MAAa,yDACX,IAAI,IAAI,CAAC,aAAa,aAAa,CAAC;AAEtC,MAAM,8BAA8B;CAAC;CAAM;CAAW;AAAkB;AACxE,MAAM,iCAAiC,OACrC,CAAC,GAAG,8BAA8B,CAAC,CAAC,KAAK,CAC3C;AAOA,MAAM,aAAa;AACnB,MAAM,aAAa;;AAEnB,MAAM,gBAAgB,IAAI,OACxB,0CAA0C,YAAY,MAAM,YAAY,qBACxE,GACF;AAEA,MAAM,kBAAkB;;;;;;AAOxB,SAAS,IAAI,OAAwB;CACnC,OAAO,OAAO,KAAK,IAAI,OAAO,KAAK,IAAI,MAAM,KAAK;AACpD;;;;;AAMA,SAAgB,WAAW,OAAyB;CAClD,IAAI,UAAU,QAAQ,UAAU,KAAA,GAC9B,OAAO;CAET,IAAI,OAAO,KAAK,GAAG;EACjB,MAAM,OAAO,MAAM;EACnB,OAAO,SAAS,QAAQ,SAAS,KAAA,IAAY,OAAO,IAAI,IAAI;CAC9D;CACA,OAAO;AACT;;AAGA,SAAS,oBAAoB,OAAyB;CACpD,OAAO,OAAO,UAAU,WAAW,MAAM,YAAY,IAAI;AAC3D;;AA0BA,MAAM,YAAY;CAAE,MAAM;CAAM,OAAO;CAAI,KAAK;AAAG;AAEnD,SAAS,WAAW,OAAmB,KAA4B;CACjE,MAAM,kBAAkB,IAAI,aAAa,KAAK;CAC9C,IAAI,gBAAgB,MAAM,WAAW;CACrC,IAAI,cAAc,QAAQ,KAAK,IAAI,GACjC,gBAAgB,cAAc,WAAW,MAAgB;CAE3D,MAAM,WAAW,KAAK,KAAK,IAAI,aAAa,aAAa,IAAI,eAAe;CAC5E,MAAM,eAAe,cAAc,YAChC,WAAW,KAAK,eACnB;CAGA,IACE,aAAa,SAAS,UAAU,QAChC,aAAa,UAAU,UAAU,SACjC,aAAa,QAAQ,UAAU,KAE/B,MAAM,IAAII,kBAAgB,yBAAyB;CAErD,IAAI,aAAa,GACf,OAAO;EACL;EACA;EACA;EACA,QAAQ,CAAC;GAAE,UAAU;GAAG,MAAM;GAAG,SAAS;EAAgB,CAAC;CAC7D;CAEF,MAAM,SAAqB,CACzB;EACE,UAAU;EACV,MAAM;EACN,SAAS,cAAc,WAAW,eAAe,CAAC,CAAC,aAAa,KAAK;CACvE,CACF;CACA,IAAI,WAAW,GACb,OAAO,KAAK;EAAE,UAAU;EAAG,MAAM,WAAW;EAAG,SAAS;CAAgB,CAAC;CAE3E,OAAO,KAAK;EACV,UAAU,WAAW;EACrB,MAAM;EACN,SAAS,IAAI,aAAa,YAAY;CACxC,CAAC;CACD,OAAO;EAAE;EAAiB;EAAe;EAAU;CAAO;AAC5D;;;;;;;;;;;;;;AAeA,IAAa,eAAb,MAA0B;CACxB;CACA;CACA,UAA4B;CAE5B,YAAY,OAAmB,KAAiB;EAC9C,KAAK,QAAQ;EACb,KAAK,MAAM;CACb;;;;;;CAOA,QACE,YACA,aAAqB,OAAO,mBACf;EACb,MAAM,EAAE,OAAO,QAAQ;EACvB,IAAI,MAAM,YAAY,IAAI,SACxB,MAAM,IAAI,YACR,uDACF;EAEF,IAAI,MAAM,QAAQ,GAAG,IAAI,GACvB,MAAM,IAAIC,eAAa,gCAAgC;EAEzD,IAAI,MAAM,SACR,MAAM,IAAIA,eAAa,sCAAsC;EAE/D,IAAI,MAAM,qBAAqB,IAAI,kBACjC,MAAM,IAAIA,eAAa,yCAAyC;EAElE,IAAI,aAAa,GACf,MAAM,IAAIA,eAAa,kCAAkC;EAE3D,IAAI,IAAI,aAAa,KAAK,KAAK,KAAK,eAAe,KAAK,eAAe,IACrE,OAAO,CAAC;EAEV,KAAK,YAAY,WAAW,OAAO,GAAG;EACtC,OAAO,KAAK,YAAY,KAAK,SAAS,YAAY,UAAU;CAC9D;CAEA,YACE,QACA,YACA,YACa;EAEb,MAAM,aAAa,OAAO,UAAU;EACpC,IAAI,CAAC,OAAO,SAAS,UAAU,GAC7B,MAAM,IAAID,kBAAgB,mCAAmC;EAE/D,MAAM,SAAS,OAAO,OAAO,KAAI,UAAS;GACxC,MAAM,QAAS,MAAM,UAAU,OAAO,kBAAmB;GACzD,MAAM,QAAQ,KAAK,MAAM,KAAK;GAC9B,OAAO;IAAE;IAAO,OAAO,OAAO,KAAK;IAAG,UAAU,QAAQ;IAAO,MAAM;GAAE;EACzE,CAAC;EACD,IAAI,YAAY,OAAO,UAAU;EACjC,KAAK,MAAM,SAAS,QAClB,aAAa,MAAM,QAAQ,OAAO,MAAM,MAAM,IAAI;EAGpD,MAAM,WAAW,OAAO,OAAO,QAAQ;EACvC,IAAI,QACF,aAAa,KACT,YAAY,WACV,YACA,WACF,WAAW,YAAY,KACrB,WAAW,YACX;EACR,MAAM,aAAa,CAAC,GAAG,MAAM,CAAC,CAAC,MAC5B,GAAG,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,EAAE,MAAM,QAClE;EACA,KAAK,MAAM,SAAS,YAAY;GAC9B,MAAM,OAAO,OAAO,MAAM,MAAM,IAAI;GACpC,MAAM,QAAQ,QAAQ,OAAO,QAAQ;GACrC,MAAM,OAAO,OAAO,KAAK;GACzB,SAAS;EACX;EAIA,IAAI,cAAc;EAClB,KAAK,MAAM,EAAE,OAAO,OAAO,UAAU,QACnC,eAAe,QAAQ,KAAK,MAAM,OAAO;EAE3C,IAAI,cAAc,YAChB,MAAM,IAAI,uBACR,kFACF;EAGF,MAAM,UAAuB,CAAC;EAC9B,KAAK,MAAM,EAAE,OAAO,OAAO,UAAU,QAAQ;GAE3C,MAAM,UACJ,QAAQ,KAAK,MAAM,WAAW,MAAM,OAAO,MAAM,WAAW;GAC9D,KAAK,IAAI,MAAM,MAAM,UAAU,MAAM,SAAS,OAAO,GAAG;IACtD,MAAM,QAAQ,SAAS,MAAM,MAAM,WAAW,OAAO,KAAK;IAC1D,QAAQ,KAAK;KACX,OACE,QAAQ,IACJ,KAAK,QACL,OAAO,cAAc,WAAW,MAAM,eAAe;KAC3D,KACE,QAAQ,OAAO,WAAW,IACtB,KAAK,MACL,OAAO,cAAc,YAAY,MAAM,KAAK,eAAe;KACjE,OAAO,SAAS,KAAK;IACvB,CAAC;GACH;EACF;EACA,OAAO;CACT;AACF;;;;;;AAOA,SAAgB,oBACd,OACA,KACA,YACa;CACb,OAAO,IAAI,aAAa,OAAO,GAAG,CAAC,CAAC,QAAQ,UAAU;AACxD;AAEA,MAAM,kBAAkB;;;;;;AAaxB,MAAM,qBAAqB;;;;;;;;;;AAW3B,IAAa,yBAAb,MAAoC;CAClC;CACA;;;;;CAMA,YAAY,YAAoB,aAAa,GAAG;EAC9C,KAAK,QAAQ;EACb,KAAK,cAAc;CACrB;;CAGA,MAAM,QAAuC;EAC3C,OAAO,KAAK,IACV,IACC,cAAc,MAAM,IAAI,KAAK,eAAe,kBAC/C;CACF;;CAGA,KAAK,QAAwB;EAC3B,OAAO,KAAK,IAAI,KAAK,MAAM,KAAK,QAAQ,MAAM,GAAG,CAAC;CACpD;CAEA,MAAM,QAAsB;EAC1B,KAAK,SAAS;CAChB;AACF;;;;;AAMA,SAAgB,mBACd,cACA,SACA,SACA,OACA,WAEA,WAAyB,IAAI,aAAa,SAAS,KAAK,GAMxD,aAA8C,GACxC;CACN,IAAI,CAAC,WAAW;EACd,QAAQ,KAAK;GACX,GAAG;GACH,oBAAoB;GACpB,eAAe,QAAQ,SAAS,eAAe;GAC/C,aAAa,MAAM,SAAS,eAAe;EAC7C,CAAC;EACD;CACF;CACA,MAAM,aAAa,WAAW,aAAa,SAAS,CAAC;CACrD,IAAI,sBAAsB,wBAAwB;EAEhD,MAAM,SAAS,WAAW,MAAM,YAAY;EAC5C,MAAM,UAAU,SAAS,QAAQ,YAAY,WAAW,KAAK,MAAM,CAAC;EACpE,WAAW,MAAM,SAAS,QAAQ,MAAM;EACxC,YAAY,cAAc,SAAS,OAAO;EAC1C;CACF;CACA,MAAM,OACJ,aAAa,IACT,KAAK,IAAI,aAAa,QAAQ,QAAQ,CAAC,IACvC,OAAO;CACb,YAAY,cAAc,SAAS,SAAS,QAAQ,YAAY,IAAI,CAAC;AACvE;AAEA,SAAS,YACP,cACA,SACA,SACM;CACN,KAAK,MAAM,UAAU,SACnB,QAAQ,KAAK;EACX,GAAG;EACH,OAAO,OAAO;EACd,oBAAoB;EACpB,eAAe,OAAO,MAAM,SAAS,eAAe;EACpD,aAAa,OAAO,IAAI,SAAS,eAAe;CAClD,CAAC;AAEL;;;;;;AAOA,SAAS,iBAAiB,YAAqB,WAA0B;CACvE,IAAI,CAAC,WACH;CAEF,IAAI,oBAAoB,wCAAwC,UAAU,GACxE,OAAO,QACL,+BAA+B,OAAO,UAAU,EAAE,4CAA4C,gCAChG;MACK,IACL,eAAe,QACf,eAAe,KAAA,KACf,CAAC,oBAAoB,gCAAgC,UAAU,GAE/D,OAAO,QACL,uCAAuC,OAAO,UAAU,EAAE,iCAAiC,gCAC7F;AAEJ;AAEA,SAAS,iBACP,SACA,WAC2B;CAC3B,MAAM,SAAoC,CAAC;CAC3C,KAAK,MAAM,UAAU,OAAO,OAAO,GAAG;EACpC,IAAI,EAAE,WAAW,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,MAAM,OAClE;EAEF,MAAM,SAAS,QAAQ,QAAQ,QAAQ;EACvC,IAAI,WAAoB;EACxB,IACE,WAAW,QAAQ,UAAU,KAC7B,QAAQ,QAAQ,UAAU,MAAM,MAEhC,WAAW,QAAQ,QAAQ,UAAU;OAChC,IAAI,WACT,OAAO,QACL,wBAAwB,OAAO,MAAM,EAAE,kEACzC;EAEF,IAAI,UAAmB;EACvB,IAAI,WAAW,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,MAAM,MAChE,UAAU,oBAAoB,QAAQ,QAAQ,QAAQ,CAAC;EAEzD,OAAO,KAAK;GACV,QAAQ,QAAQ,MAAM;GACtB,UAAU,QAAQ,QAAQ;GAC1B,QAAQ,QAAQ,OAAO;GACvB,aAAa,QAAQ,WAAW,YAAY,QAAQ,cAAc,CAAC,CAAC;EACtE,CAA4B;CAC9B;CACA,OAAO;AACT;AAEA,SAAS,gBAAgB,SAA4C;CACnE,MAAM,SAAmC,CAAC;CAC1C,KAAK,MAAM,UAAU,OAAO,OAAO,GAAG;EACpC,IAAI,EAAE,WAAW,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,MAAM,OAClE;EAEF,IAAI,QAAiB;EACrB,IAAI,WAAW,QAAQ,OAAO,KAAK,QAAQ,QAAQ,OAAO,MAAM,MAC9D,QAAQ,QAAQ,QAAQ,OAAO;EAEjC,IAAI,UAAmB;EACvB,IAAI,WAAW,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,MAAM,MAChE,UAAU,oBAAoB,QAAQ,QAAQ,QAAQ,CAAC;EAEzD,OAAO,KAAK;GACV,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,CAAC;GACzC,OAAO,QAAQ,KAAK;GACpB,QAAQ,QAAQ,OAAO;GACvB,aAAa,QAAQ,WAAW,YAAY,QAAQ,cAAc,CAAC,CAAC;EACtE,CAA2B;CAC7B;CACA,OAAO;AACT;;AAGA,MAAM,oCAAiD,IAAI,IAAI;CAC7D,CAAC,eAAe,YAAY;CAC5B,CAAC,iBAAiB,cAAc;CAChC,CAAC,eAAe,YAAY;AAC9B,CAAC;;;;;AAMD,SAAS,kBACP,aACgC;CAChC,OAAO,YACL,OAAO,QAAQ,WAAW,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW;EAChD,MAAM,WAAW,kBAAkB,IAAI,GAAG;EAC1C,OAAO,aAAa,KAAA,IAChB;GAAE;GAAK;GAAO,KAAK;EAAK,IACxB;GAAE,KAAK;GAAU,OAAO,QAAQ,KAAK;GAAG,KAAK;EAAM;CACzD,CAAC,CACH;AACF;;;;;AAMA,eAAsB,kBACpB,QACA,QACA,YAAY,OACZ,eAA0C,MACV;CAGhC,MAAM,MAAM,QAAQ,SAAS,MAAM,GAAG,KAAK;CAC3C,MAAM,WAAW,QAAQ,KAAK,WAAW;CACzC,IAAI,aAAa,MACf,MAAM,IAAIC,eAAa,4BAA4B;CAErD,IAAI,OAAO,aAAa,UACtB,MAAM,YAAY,UAAU,OAAO;CAErC,MAAM,SAAS,MAAM,iBAAiB,UAAU;EAAE;EAAQ;CAAa,CAAC;CACxE,MAAM,QAAQ,WAAW,QAAQ,KAAK,OAAO,CAAC;CAE9C,MAAM,kBAAkB,SAAS,QAAQ,KAAK,kBAAkB,CAAC;CACjE,IAAI,cAAuB;CAC3B,IAAI,OAAgB;CACpB,IAAI,MAAe;CACnB,IAAI,WAAW,iBAAiB,aAAa,GAC3C,cAAc,oBAAoB,QAAQ,iBAAiB,aAAa,CAAC;CAE3E,IAAI,WAAW,iBAAiB,MAAM,GACpC,OAAO,oBAAoB,QAAQ,iBAAiB,MAAM,CAAC;CAE7D,IAAI,WAAW,iBAAiB,KAAK,GACnC,MAAM,oBAAoB,QAAQ,iBAAiB,KAAK,CAAC;CAE3D,MAAM,SAAS,QAAQ,iBAAiB,KAAK;CAC7C,MAAM,aAAa,WAAW,QAAQ,QAAQ,MAAM,MAAM;CAC1D,MAAM,UAAU,QAAQ,iBAAiB,MAAM;CAC/C,MAAM,cAAc,YAAY,QAAQ,QAAQ,OAAO,MAAM;CAE7D,IAAI,UAAqB,CAAC;CAC1B,IAAI,WAAW,iBAAiB,QAAQ,GAAG;EACzC,MAAM,SAAS,QAAQ,iBAAiB,QAAQ;EAChD,UAAU,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;CACpD;CACA,KAAK,MAAM,UAAU,SAAS;EAI5B,OAAO,QAAkB,WADT,WAAW,YAAY,QAAQ,SAAS,CACpB,CAAO;EAC3C,iBAAiB,YAAY,QAAQ,MAAM,GAAG,SAAS;CACzD;CAEA,MAAM,cAAc,SAClB,WAAW,QAAQ,YAAY,IAC3B,QAAQ,QAAQ,YAAY,IAC5B,QAAQ,QAAQ,aAAa,CACnC;CACA,MAAM,aAAa,QAAQ,aAAa,aAAa;CACrD,YAAY,cACV,OAAO,eAAe,WAAW,WAAW,YAAY,IAAI;CAE9D,MAAM,iBAAiB,QAAQ,QAAQ,cAAc;CACrD,IAAI;CACJ,IAAI,OAAO,cAAc,GAAG;EAC1B,cAAc,EAAE,GAAG,eAAe;EAClC,IAAI,CAAC,WAAW,aAAa,KAAK,GAChC,YAAY,MAAM,CAAC;EAErB,IAAI,CAAC,WAAW,aAAa,MAAM,GACjC,YAAY,OAAO,CAAC;CAExB,OACE,cAAc;EAAE,MAAM,CAAC;EAAG,KAAK,CAAC;CAAE;CAEpC,IAAI,CAAC,MAAM,QAAQ,YAAY,IAAI,GACjC,YAAY,OAAO,CAAC,YAAY,IAAI;CAEtC,MAAM,cAAc,iBAAiB,YAAY,MAAM,SAAS;CAChE,IAAI,CAAC,MAAM,QAAQ,YAAY,GAAG,GAChC,YAAY,MAAM,CAAC,YAAY,GAAG;CAEpC,MAAM,aAAa,gBAAgB,YAAY,GAAG;CAIlD,IACE,YAAY,aAAa,eAAe,MAAM,QAC9C,YAAY,aAAa,eAAe,MAAM,KAAA,GAC9C;EACA,IAAI,eAAwB;EAC5B,MAAM,UAAU,YAAY;EAC5B,IAAI,QAAQ,SAAS,GAAG;GACtB,MAAM,YAAY,QAAQ,GAAG,EAAE;GAC/B,IAAI,WAAW,WAAW,QAAQ,GAChC,eAAe,QAAQ,WAAW,QAAQ;EAE9C;EACA,IAAI,iBAAiB,MACnB,eAAe,IAAI,YAAY,CAAC,CAAC,YAAY;EAE/C,YAAY,gBAAgB;CAC9B;CACA,IAAI,aAAsB;CAC1B,IAAI,WAAW,aAAa,aAAa,GAAG;EAC1C,aAAa,YAAY;EACzB,OAAO,YAAY;CACrB;CACA,YAAY,cAAc;CAE1B,OAAO;EACL;EACA;EACA,WAAW;GACT,KAAK;GACL,MAAM;GACN,OAAO,cAAc;EACvB;EACA,iBAAiB;GACf,aAAa,QAAQ,WAAW;GAChC,MAAM,QAAQ,IAAI;GAClB,KAAK,QAAQ,GAAG;GAChB,uBAAuB,QAAQ,KAAI,WACjC,QAAQ,MAAM,CAChB;EACF;EACA,aAAa,kBAAkB,WAAW;EAC1C,aAAa;GAAE,MAAM;GAAa,KAAK;EAAW;CACpD;AACF;AAWA,SAAS,WAAW,SAAoD;CACtE,MAAM,EAAE,SAAS,SAAS,WAAW,YAAY,GAAG,SAAS;CAC7D,OAAO,oBAAoB;EACzB,GAAG;EACH,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY,QAAQ;EACvD,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY,QAAQ;CACzD,CAAC;AACH;AAEA,SAAS,oBAAoB,QAAiB,KAAsB;CAClE,OAAO,WAAW,QAAQ,GAAG,KAAK,QAAQ,QAAQ,GAAG,MAAM,OACvD,QAAQ,QAAQ,GAAG,IACnB;AACN;;AAGA,MAAM,aAAa,EAAE,MAAM;AAC3B,MAAM,aAAa,MAAM,MAAM;AAC/B,MAAM,cAAc,MAAM,MAAM,KAAK;AACrC,MAAM,cAAc,EAAE,MAAM,OAAO;AACnC,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAC9B,MAAMC,aAAW;AACjB,MAAMC,aAAW;;AAGjB,SAAS,QAAQ,WAA2B;CAE1C,MAAM,SAAS,YAAY;CAC3B,MAAM,OAAO,OAAO,YAAY,SAAS,qBAAqB;CAC9D,OAAO,wBAAO,IAAI,KAAK,OAAO,GAAI,EAAA,CAAE,eAAe,CAAC,IAAI,SAAS;AACnE;;;;;;;AAQA,SAAS,wBAAwB,WAAoC;CACnE,MAAM,QAAQ,OAAO,SAAS;CAC9B,IAAI,QAAQ,cAAc,QAAQ,YAChC,MAAM,IAAIH,kBAAgB,4CAA4C;CAExE,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,qBAAqB;EACjD,MAAM,wBAAO,IAAI,KAAK,OAAO,KAAK,IAAI,GAAI,EAAA,CAAE,YAAY;EACxD,IAAI,OAAOE,cAAY,OAAOC,YAC5B,MAAM,IAAIF,eAAa,gCAAgC,MAAM;EAE/D,OAAO,iBAAiB,OAAO,KAAK,CAAC;CACvC;CAGA,MAAM,OAAO,QAAQ,KAAK;CAC1B,IAAI,OAAO,eAAe,OAAO,aAC/B,MAAM,IAAID,kBAAgB,4CAA4C;CAExE,MAAM,IAAIC,eAAa,gCAAgC,MAAM;AAC/D;AAEA,SAAS,UAAU,QAAuC;CACxD,OAAO;EAAE,UAAU,OAAO;EAAa,UAAU,OAAO;CAAY;AACtE;AAEA,eAAe,YACb,SACA,cACA,eACA,QACA,WAC0B;CAC1B,IAAI,SAAS;CACb,IAAI,MAAM,QAAQ,QAAQ,YAAY,yBAAuB;CAC7D,MAAM,IAAI,QAAQ,YAAY,EAAE;CAIhC,MAAM,SAAS,QAAQ,eAAe,KAAK,UAAU,MAAM,CAAC,GAAG,UAAU;CACzE,MAAM,iBAAiB,QAAQ,QAAQ,iBAAiB;CAExD,IAAI,OAAO,YAAY,gBAAgB,OAAO,CAAC,GAAG;EAChD,MAAM,YAAY,WAAW,eAAe,KAAK;EAEjD,IAAI,cAAc,QAAQ,OAAO,aAAA,EAAkB,GACjD,OAAO,MACL,oDAAoD,OAAO,eAAe,KAAK,GACjF;EAEF,OAAO,gBAAgB,SAAS,SAAS;CAC3C;CACA,MAAM,SAAS,WAAW,QAAQ,SAAS,IACvC,QAAQ,QAAQ,SAAS,IACzB;CAEJ,IAAI,QAAQ,gBAAgB,UAAU,MAAM,MAAM;EAChD,MAAM,QAAQ,QAAQ,gBAAgB,OAAO;EAC7C,IAAI,UAAU,MACZ,OAAO,gBAAgB,YAAYG,UAAQ,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;CAEjE;CACA,IAAI,UAAU,QAAQ,gBAAgB,UAAU;CAChD,IAAI,YAAY,QAAQ,CAAC,WAAW,SAAS,GAAG,GAAG;EACjD,IAAI,OAAO,YAAY,UACrB,MAAM,YAAY,SAAS,OAAO;EAEpC,MAAM,aAAa,cAAc,OAAO;EACxC,IAAI,eAAe,MACjB,UAAU;CAEd;CACA,IAAI,CAAC,SAAS,OAAO,GAAG;EACtB,OAAO,MAAM,yCAAyC,OAAO,MAAM,GAAG;EACtE,MAAM,IAAI,SACR,iFACF;CACF;CACA,MAAM,WAAW,QAAQ,gBAAgB,OAAO;CAChD,MAAM,sBAAsB,WAC1B,YAAY,gBAAgB,oBAAoB,CAClD;CACA,MAAM,cAAc,QAAQ,gBAAgB,WAAW;CACvD,IAAI,OAAO,gBAAgB,UACzB,MAAM,YAAY,aAAa,SAAS;CAE1C,MAAM,WAAW,YACd,WAAW,KAAK,EAAE,CAAC,CACnB,WAAW,KAAK,EAAE,CAAC,CACnB,MAAM,GAAG,CAAC,CAAC;CAEd,MAAM,YAAY,QAAQ,gBAAgB,YAAY;CACtD,MAAM,UAAU,WAAWA,UAAQ,QAAQ,WAAW,OAAO,GAAG,GAAG,CAAC,CAAC,EAAE;CACvE,MAAM,QAAQ,WAAWA,UAAQ,QAAQ,WAAW,KAAK,GAAG,GAAG,CAAC,CAAC,EAAE;CACnE,MAAM,cAAc,SAAS,OAAO,KAAK,IAAI,OAAO,OAAO,CAAC;CAC5D,MAAM,oBACJ,OAAO,WAAW,IAAI,OAAO,kCAAkC;CACjE,MAAM,YAAY,wBAAwB,OAAO;CACjD,MAAM,UAAU,wBAAwB,KAAK;CAC7C,MAAM,UAAU,yBAAyB,WAAW,EAAE,OAAO,KAAK,CAAC;CACnE,MAAM,QAAQ,yBAAyB,SAAS,EAAE,OAAO,KAAK,CAAC;CAI/D,IAAI,WAAW,gBAAgB,OAAO,GAAG;EACvC,MAAM,YAAY,eAAe;EAEjC,UADa,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS,EAAA,CAE3D,KAAI,UAAS,QAAQ,WAAW,KAAK,CAAC,CAAC,CAAC,CACxC,QAAO,SAAQ,SAAS,IAAI,CAAC;CAClC;CACA,MAAM,YAAY,WAAW,YAAY,gBAAgB,WAAW,CAAC;CAErE,MAAM,oBAAoB;EACxB,SAAS,QAAQ,OAAO;EACxB,UAAU,QAAQ,QAAQ;EAC1B,qBAAqB,QAAQ,mBAAmB;EAChD;EACA;EACA;EACA,+BAA+B;EAC/B,yBAAyB;EACzB;EACA,WAAW,QAAQ,SAAS;CAC9B;CAEA,IAAI,kBAAkB,QAAQ,QAAQ,kBAAkB;CACxD,IAAI,MAAM,QAAQ,eAAe,GAAG;EAClC,IAAI,gBAAgB,WAAW,GAC7B,MAAM,IAAIC,eAAa,yBAAyB;EAElD,kBAAkB,gBAAgB;CACpC;CACA,MAAM,YACJ,iBAAA,sCACA,WAAW,gBAAgB,WAAW,KACtC,4BAA4B,MAAK,UAC/B,WAAW,iBAAiB,KAAK,CACnC;CAEF,MAAM,SAAS,QAAQ,iBAAiB,QAAQ;CAChD,MAAM,QAAQ,oBAAoB,iBAAiB,OAAO,KAAK;CAC/D,MAAM,OAAO,oBAAoB,iBAAiB,MAAM,KAAK;CAC7D,MAAM,IAAI,QAAQ,iBAAiB,GAAG;CACtC,MAAM,KAAK,oBAAoB,iBAAiB,IAAI,KAAK;CACzD,MAAM,MAAM,oBAAoB,iBAAiB,KAAK;CACtD,MAAM,KAAK,oBAAoB,iBAAiB,IAAI;CACpD,MAAM,KAAK,oBAAoB,iBAAiB,IAAI;CACpD,IAAI,OAAO,QAAQ,CAAC;EAAC;EAAQ;EAAc;CAAQ,CAAC,CAAC,SAAS,EAAY,GACxE,OAAO,QAAQ,qBAAqB,eAAe,IAAI,EAAE,CAAC,GAAG;CAE/D,MAAM,UAAU,oBAAoB,iBAAiB,SAAS;CAC9D,IAAI,YAAY,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,SAAS,OAAiB,GAC5D,OAAO,QAAQ,0BAA0B,eAAe,IAAI,OAAO,CAAC,GAAG;CAEzE,MAAM,kBAAkB,oBACtB,iBACA,kBACF;CACA,IACE,oBAAoB,QACpB,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,SAAS,eAAyB,GAEvD,OAAO,QACL,mCAAmC,eAAe,IAAI,eAAe,CAAC,GACxE;CAEF,MAAM,qBAAqB;EACzB,QAAQ,QAAQ,MAAM;EACtB,OAAO,QAAQ,KAAK;EACpB,MAAM,QAAQ,IAAI;EAClB,GAAG,QAAQ,CAAC;EACZ,IAAI,QAAQ,EAAE;EACd,KAAK,QAAQ,GAAG;EAChB,IAAI,QAAQ,EAAE;EACd,IAAI,QAAQ,EAAE;EACd,SAAS,QAAQ,OAAO;EACxB,iBAAiB,QAAQ,eAAe;CAC1C;CACA,MAAM,WAAW,IAAI,aAAa,SAAS,KAAK;CAEhD,MAAM,eACJ,qBAAqB,OAAO,uBAAuB,IAC/C,IAAI,uBACF,OAAO,sBACP,cAAc;EACZ;EACA;EACA;EACA;CACF,CAAC,CACH,IACA;CAEN,MAAM,UAA6B,CAAC;CACpC,MAAM,gBAAgB,QAAQ,QAAQ,QAAQ;CAC9C,IAAI,MAAM,QAAQ,aAAa,GAAG;EAChC,MAAM,eAAe,IAAI,mBAAmB,MAAM;EAClD,KAAK,IAAI,QAAQ,GAAG,QAAQ,cAAc,QAAQ,SAAS,GAAG;GAC5D,IAAI,cAAc,QAAQ,QAAQ,KAAK,QAAQ,OAAO,GAAG;IACvD,OAAO,MAAM,uBAAuB;IACpC,MAAM,UAAU;IAChB,OAAO,MAAM,aAAa,MAAM,GAAG,cAAc,QAAQ;GAC3D;GACA,IAAI;IAOF,mBACE,MAPmB,kBACnB,cAAc,QACd,QACA,WACA,YACF,GAGE,SACA,SACA,OACA,mBACA,UACA,YACF;GACF,SAAS,OAAO;IAId,IACE,iBAAiB,mBACjB,iBAAiB,wBAEjB,MAAM;IAER,OAAO,QACL,2BAA2B,eAAeC,YAAU,KAAK,CAAC,GAC5D;GACF;EACF;CACF,OAEE,mBACE,MAFmB,kBAAkB,eAAe,QAAQ,SAAS,GAGrE,SACA,SACA,OACA,mBACA,UACA,YACF;CAGF,OAAO;EACL,WAAW,QAAQ,MAAM;EACzB;EACA,gBAAgB;EAChB,iBAAiB;EACjB;CACF;AACF;;;;;;;;AASA,eAAsB,cACpB,WACA,OACY;CACZ,IAAI,cAAc,MAChB,OAAO,MAAM,IAAI;CAEnB,MAAM,cAAiD,EAAE,IAAI,KAAK;CAClE,MAAM,UAAU,YAA2B;EACzC,IAAI;GACF,MAAM,UAAU;EAClB,SAAS,OAAO;GACd,YAAY,KAAK,EAAE,MAAM;GACzB,MAAM;EACR;CACF;CACA,IAAI;CACJ,IAAI;EACF,SAAS,MAAM,MAAM,OAAO;CAC9B,SAAS,OAAO;EACd,MAAM,YAAY,OAAO,OAAO,QAAQ,YAAY,GAAG;CACzD;CACA,IAAI,YAAY,OAAO,MACrB,MAAM,YAAY,GAAG;CAEvB,OAAO;AACT;;;;;;AAOA,eAAsB,wBACpB,KACA,UAAuC,CAAC,GACd;CAC1B,MAAM,SAAS,WAAW,OAAO;CACjC,OAAO,cAAc,QAAQ,aAAa,MAAM,OAAM,cACpD,kBAAkB,KAAK,QAAQ,SAAS,CAC1C;AACF;AAEA,eAAe,kBACb,KACA,QACA,WAC0B;CAC1B,IAAI,OAAO,OAAO,QAAQ,WAAW,MAAM,WAAW,KAAK,QAAQ;CAGnE,MAAM,eAAe,cAAc,KAAK,IAAI,CAAC,GAAG,MAAM;CAEtD,MAAM,SAAmB,CAAC;CAC1B,IAAI;EACF,QAAQ,eAAe,MAAM,UAAU,MAAM,CAAC,GAAG,UAAU;CAC7D,SAAS,OAAO;EACd,IAAI,iBAAiB,iBACnB,MAAM,IAAI,uBAAuB,eAAe,EAAE,OAAO,MAAM,CAAC;EAElE,IAAI,iBAAiB,eACnB,MAAM,IAAI,uBAAuB,gBAAgB,MAAM,WAAW,EAChE,OAAO,MACT,CAAC;EAEH,OAAO,KAAK,gBAAgBA,YAAU,KAAK,GAAG;EAC9C,IAAI,aAAa;EACjB,IAAI;GAIF,CAAC,CAAE,YAAY,KAAK,QAAS,WAAW,IAAI;EAC9C,QAAQ;GAEN,OAAO;EACT;EACA,IAAI,YACF,MAAM,IAAI,uBAAuB,eAAe,EAAE,OAAO,MAAM,CAAC;CAEpE;CAEA,IAAI;CACJ,IAAI;EACF,SAAS,MAAM,YAAY,MAAM,cAAc,QAAQ,QAAQ,SAAS;CAC1E,SAAS,OAAO;EACd,IAAI,iBAAiB,wBACnB,MAAM;EAER,IAAI,iBAAiB,cAAc,iBAAiB,eAClD,MAAM,IAAI,uBAAuB,gBAAgBA,YAAU,KAAK,KAAK,EACnE,OAAO,MACT,CAAC;EAEH,IAAI,iBAAiB,UACnB,MAAM,IAAI,uBAAuB,kBAAkB,MAAM,WAAW,EAClE,OAAO,MACT,CAAC;EAEH,IAAI,iBAAiB,kBACnB,MAAM,IAAI,uBAAuB,mCAAmC,EAClE,OAAO,MACT,CAAC;EAEH,MAAM,IAAI,uBACR,qBAAqBA,YAAU,KAAK,IAAI,UAAU,KAAK,KACvD,EAAE,OAAO,MAAM,CACjB;CACF;CACA,IAAI,gBAAgB,QAAA,GAAwB,GAC1C,MAAM,IAAI,uBACR,2DACF;CAEF,OAAO;AACT;;;;;;;;AAcA,eAAsB,yBACpB,OACA,UAA2C,CAAC,GAClB;CAC1B,OAAO,eACL,OAAM,mBAAkB,cAAc,OAAO,cAAc,GAC3D,OACF;AACF;;;;;;;AAQA,eAAsB,iCACpB,UACA,UAA2C,CAAC,GAClB;CAC1B,OAAO,gBACL,mBAAkB,0BAA0B,UAAU,cAAc,GACpE,OACF;AACF;AAEA,eAAe,eACb,SACA,SAC0B;CAC1B,MAAM,EAAE,WAAW,qBAAqB,GAAG,kBAAkB;CAC7D,MAAM,SAAS,oBAAoB,aAAa;CAChD,IAAI;CACJ,IAAI;EACF,MAAM,MAAM,QAAQ,EAAE,oBAAoB,CAAC;CAC7C,SAAS,OAAO;EACd,MAAM,IAAI,uBAAuBA,YAAU,KAAK,IAAI,UAAU,KAAK,GAAG,EACpE,OAAO,MACT,CAAC;CACH;CACA,OAAO,wBAAwB,KAAK;EAAE;EAAQ,WAAW,aAAa;CAAK,CAAC;AAC9E;;AAGA,MAAa,uBAA0C;CACrD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,YAAY,UAA2B,IAAI,KAAK,CAAC,CAAC,YAAY;;;;;;;AAOpE,SAAS,WAAW,QAAiB,OAAuB;CAC1D,MAAM,QAAQ,WAAW,YAAY,QAAQ,KAAK,CAAC;CACnD,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO;CAET,OAAO,MAAM,QAAQ,KAAK,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK;AACzD;;AAGA,SAAS,SAAS,OAAyB;CACzC,IACE,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,OAAO,UAAU,YAChB,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAEpD,OAAO;CAET,OAAO;AACT;;;;;AAMA,SAAgB,gCACd,SACU;CACV,MAAM,aAAa,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;CAC9D,MAAM,OAAiB,CAAC;CACxB,KAAK,MAAM,UAAU,YAAY;EAC/B,MAAM,WAAW,OAAO;EACxB,MAAM,SAAS,OAAO;EACtB,MAAM,eAAuB;GAC3B,YAAY,OAAO;GACnB,UAAU,SAAS;GACnB,WAAW,SAAS;GACpB,wBAAwB,SAAS;GACjC,WAAW,SAAS;GACpB,YAAY,SAAS;GACrB,UAAU,SAAS;GACnB,qBAAqB,SAAS;GAC9B,QAAQ,UAAU,KAAK,SAAS,MAAM;GACtC,QAAQ,OAAO;GACf,OAAO,OAAO;GACd,MAAM,OAAO;GACb,GAAG,OAAO;GACV,IAAI,OAAO;GACX,IAAI,OAAO,MAAM;GACjB,KAAK,OAAO;GACZ,IAAI,OAAO;GACX,SAAS,OAAO,WAAW;GAC3B,kBAAkB,OAAO,mBAAmB;EAC9C;EACA,KAAK,MAAM,UAAU,OAAO,SAAS;GACnC,MAAM,UAAU,OAAO,gBAAgB;GACvC,KAAK,KAAK;IACR,GAAG;IACH,YAAY,OAAO;IACnB,UAAU,OAAO;IACjB,mBAAmB,OAAO,OAAO;IACjC,gBAAgB,OAAO,OAAO;IAC9B,oBAAoB,OAAO,OAAO;IAClC,oBAAoB,OAAO,OAAO;IAClC,aAAa,OAAO,OAAO;IAC3B,aAAa,OAAO,OAAO;IAC3B,YAAY,OAAO,OAAO;IAC1B,gBAAgB,OAAO,OAAO;IAC9B,kBAAkB,OAAO,OAAO;IAChC,OAAO,OAAO;IACd,aAAa,OAAO,UAAU;IAC9B,cAAc,OAAO,UAAU;IAC/B,eAAe,OAAO,UAAU;IAChC,aAAa,OAAO,gBAAgB;IACpC,yBAAyB,QACtB,KAAI,MAAK,WAAW,GAAG,MAAM,CAAC,CAAC,CAC/B,KAAK,GAAG;IACX,0BAA0B,QACvB,KAAI,MAAK,WAAW,GAAG,SAAS,CAAC,CAAC,CAClC,KAAK,GAAG;IACX,eAAe,OAAO,YAAY;IAClC,aAAa,OAAO,YAAY;IAChC,aAAa,OAAO,YAAY;IAChC,cAAc,OAAO,YAAY,KAC9B,KAAI,MAAK,SAAS,EAAE,MAAM,CAAC,CAAC,CAC5B,KAAK,GAAG;IACX,gBAAgB,OAAO,YAAY,KAChC,QAAO,MAAK,cAAc,CAAC,CAAC,CAC5B,KAAI,MAAK,SAAS,EAAE,QAAQ,CAAC,CAAC,CAC9B,KAAK,GAAG;IACX,cAAc,OAAO,YAAY,KAC9B,KAAI,MAAK,SAAS,EAAE,MAAM,CAAC,CAAC,CAC5B,KAAK,GAAG;IACX,aAAa,OAAO,YAAY,IAC7B,KAAI,MAAK,SAAS,EAAE,MAAM,CAAC,CAAC,CAC5B,KAAK,GAAG;IACX,YAAY,OAAO,YAAY,IAC5B,KAAI,MAAK,SAAS,EAAE,KAAK,CAAC,CAAC,CAC3B,KAAK,GAAG;IACX,aAAa,OAAO,YAAY,IAC7B,KAAI,MAAK,SAAS,EAAE,MAAM,CAAC,CAAC,CAC5B,KAAK,GAAG;GACb,CAAC;EACH;CACF;CACA,OAAO,KAAK,KAAI,QACd,OAAO,YACL,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,SAAS,KAAK,CAAC,CAAC,CAClE,CACF;AACF;;AAGA,SAAgB,4BACd,SACA,UAAsB,CAAC,GACf;CACR,MAAM,OAAO,gCAAgC,OAAO,CAAC,CAAC,KAAI,QACxD,OAAO,YACL,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,KAAK,CAAC,CAAC,CACjE,CACF;CACA,OAAO,UAAU,sBAAsB,MAAM,OAAO;AACtD;;AC10CA,MAAM,cAAc;AACpB,MAAM,WAAW;AACjB,MAAM,SAAS;AACf,MAAM,eAAe;AAiBrB,MAAM,KAAK;AACX,MAAMC,OAAK;AACX,MAAMC,SAAO;AACb,MAAM,QAAQ;AACd,MAAM,MAAM;;AAGZ,SAAS,kBAAkB,MAAsB;CAC/C,IAAI,MAAM,KAAK;CACf,IAAI,MAAM,KAAK,KAAK,WAAW,MAAM,CAAC,MAAMD,MAC1C,OAAO;CAET,IAAI,MAAM,KAAK,KAAK,WAAW,MAAM,CAAC,MAAM,IAC1C,OAAO;CAET,OAAO,MAAM,GAAG;EACd,MAAM,OAAO,KAAK,WAAW,MAAM,CAAC;EACpC,IAAI,SAAS,SAAS,SAAS,KAC7B;EAEF,OAAO;CACT;CACA,OAAO,KAAK,MAAM,GAAG,GAAG;AAC1B;;AAGA,IAAM,aAAN,MAAiB;CACf;CACA,WAAmB;CAInB,SAAoC,CAAC;CACrC,WAA0C,CAAC;CAI3C,6BAA8B,IAAI,IAAoB;CACtD,gBAAwB;CAExB,YAAY,MAAc;EACxB,KAAK,OAAO;CACd;;CAGA,QAAgB,OAAuB;EACrC,MAAM,EAAE,SAAS;EACjB,KAAK,IAAI,QAAQ,OAAO,QAAQ,KAAK,QAAQ,SAAS,GAAG;GACvD,MAAM,OAAO,KAAK,WAAW,KAAK;GAClC,IAAI,SAASA,MACX,OAAO,QAAQ;GAEjB,IAAI,SAAS,IACX,OAAO,KAAK,WAAW,QAAQ,CAAC,MAAMA,OAAK,QAAQ,IAAI,QAAQ;EAEnE;EACA,OAAO,KAAK;CACd;CAEA,eAAe,SAA2B;EACxC,KAAK,SAAS,KAAK,OAAO;EAC1B,IAAI,QAAQ,SAAS,SACnB,KAAK,iBAAiB;OACjB;GACL,MAAM,EAAE,cAAc;GACtB,KAAK,WAAW,IAAI,YAAY,KAAK,WAAW,IAAI,SAAS,KAAK,KAAK,CAAC;EAC1E;CACF;CAEA,gBAAsB;EACpB,MAAM,UAAU,KAAK,SAAS,IAAI;EAClC,IAAI,YAAY,KAAA,GACd;EAEF,IAAI,QAAQ,SAAS,SAAS;GAC5B,KAAK,iBAAiB;GACtB;EACF;EACA,MAAM,SAAS,KAAK,WAAW,IAAI,QAAQ,SAAS,KAAK,KAAK;EAC9D,IAAI,QAAQ,GACV,KAAK,WAAW,IAAI,QAAQ,WAAW,KAAK;OAE5C,KAAK,WAAW,OAAO,QAAQ,SAAS;CAE5C;;;;;;;CAQA,MAAc,MAAuB;EACnC,MAAM,QAAQ,KAAK,WAAW,CAAC;EAC/B,IAAI,UAAU,MAAM,UAAUA,MAC5B,OAAO,KAAK,gBAAgB;EAE9B,IAAI,KAAK,WAAW,SAAS,KAAK,CAAC,KAAK,WAAW,IAAI,GACrD,OAAO;EAET,MAAM,YAAY,kBAAkB,IAAI;EACxC,OACE,KAAK,WAAW,IAAI,SAAS,KAC5B,UAAU,SAAS,IAAI,KAAK,KAAK,WAAW,IAAI,UAAU,MAAM,GAAG,EAAE,CAAC;CAE3E;;CAGA,WAAmB;EACjB,MAAM,UAAU,KAAK,OAAO,GAAG,EAAE;EACjC,IAAI,YAAY,KAAA,GAAW;GACzB,IAAI,KAAK,MAAM,OAAO,GACpB,OAAO;GAET,KAAK,OAAO,IAAI;GAChB,OAAO;EACT;EACA,IAAI,KAAK,YAAY,KAAK,KAAK,QAC7B,OAAO;EAET,MAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;EACtC,MAAM,OAAO,KAAK,KAAK,MAAM,KAAK,UAAU,GAAG;EAC/C,KAAK,WAAW;EAChB,IAAI,KAAK,MAAM,IAAI,GAAG;GACpB,KAAK,OAAO,KAAK,IAAI;GACrB,OAAO;EACT;EACA,OAAO;CACT;CAEA,WAAW,MAAoB;EAC7B,KAAK,OAAO,KAAK,IAAI;CACvB;;;;;CAMA,YAAoB;EAClB,IAAI,OAAO;EACX,OAAO,KAAK,OAAO,SAAS,GAAG;GAC7B,MAAM,OAAO,KAAK,SAAS;GAC3B,IAAI,SAAS,IACX,OAAO;GAET,QAAQ;EACV;EACA,MAAM,EAAE,SAAS;EACjB,MAAM,QAAQ,KAAK;EACnB,MAAM,YAAY,KAAK,gBAAgB;EACvC,MAAM,eAAe,KAAK,WAAW,OAAO;EAC5C,IAAI,CAAC,aAAa,CAAC,cAAc;GAC/B,KAAK,WAAW,KAAK;GACrB,OAAO,OAAO,KAAK,MAAM,KAAK;EAChC;EACA,OAAO,KAAK,WAAW,KAAK,QAAQ;GAClC,MAAM,QAAQ,KAAK,WAAW,KAAK,QAAQ;GAC3C,IAAI,cAAc,UAAU,MAAM,UAAUA,OAC1C;GAEF,MAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;GACtC,IACE,gBACA,UAAUC,UACV,KAAK,MAAM,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC,GAEzC;GAEF,KAAK,WAAW;EAClB;EACA,OAAO,OAAO,KAAK,MAAM,OAAO,KAAK,QAAQ;CAC/C;;;;;CAMA,EAAE,OAAO,YAA+B;EACtC,SAAS;GACP,MAAM,OAAO,KAAK,SAAS;GAC3B,IAAI,SAAS,IACX;GAEF,MAAM;EACR;CACF;AACF;AAGA,SAAS,kBAAkB,OAA4C;CACrE,MAAM,QAAQ,MAAM,MAAM;CAC1B,MAAM,QAAQ,MAAM,QAAQ,GAAG;CAC/B,MAAM,OAAO,MAAM,MAAM,GAAG,KAAK;CACjC,MAAM,QAAQ,SACZ,CAAC,MAAM,MAAM,QAAQ,CAAC,GAAG,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GACnD,QACF;CAEA,IAAI,MAAM,MAAM;CAChB,OAAO,MAAM,KAAK,OAAO,SAAS,MAAM,OAAO,MAAM,CAAC,CAAC,GACrD,OAAO;CAET,OAAO,CAAC,MAAM,MAAM,MAAM,GAAG,GAAG,CAAC;AACnC;AAEA,IAAM,aAAN,MAAiB;CACf;CACA,WAAuC,CAAC;CACxC,MAA8B;CAC9B,OAA+B;CAK/B,0BAA2B,IAAI,IAAa;CAC5C;CACA;CACA,QAAgB;CAChB,cAAsB;CAEtB,YAAY,MAAc,YAAoB,QAAqB;EACjE,KAAK,QAAQ,IAAI,WAAW,IAAI;EAChC,KAAK,aAAa;EAClB,KAAK,SAAS;CAChB;CAEA,QAAiB;EACf,KAAK,SAAS;EACd,MAAM,OAAO,KAAK,WAAW;EAC7B,IAAI,KAAK,mBAAmB,MAAM,eAAe,CAAC,KAAK,YAAY,GACjE,KAAK,QAAQ,KAAK,IAAI,kCAAkC,CAAC;EAE3D,OAAO;CACT;CAEA,UAA2B;EACzB,IAAI,KAAK,QAAQ,MACf,MAAM,IAAI,MAAM,oBAAoB;EAEtC,OAAO,KAAK;CACd;CAEA,cAA+B;EAC7B,IAAI,KAAK,SAAS,MAChB,MAAM,IAAI,MAAM,iBAAiB;EAEnC,OAAO,KAAK;CACd;CAEA,aAA2B;EACzB,MAAM,EAAE,iBAAiB,KAAK;EAC9B,KAAK,SAAS;EACd,IAAI,eAAe,KAAK,KAAK,QAAQ,cACnC,MAAM,IAAI,mBACR,uBAAuB,aAAa,6BACtC;EAEF,MAAM,UAAU,IAAI,QAAQ;EAC5B,IAAI,KAAK,QAAQ,QAAQ,KAAK,QAAQ,IAAI,KAAK,GAAG,GAChD,QAAQ,eAAe,gBAAgB;EAEzC,KAAK,SAAS,GAAG,EAAE,CAAC,EAAE,OAAO,OAAO;EACpC,KAAK,SAAS,KAAK,OAAO;EAC1B,KAAK,MAAM;EACX,KAAK,OAAO;CACd;CAEA,aAA8B;EAC5B,MAAM,UAAU,KAAK,SAAS,IAAI;EAClC,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,wBAAwB;EAE1C,KAAK,MAAM,KAAK,SAAS,GAAG,EAAE,KAAK;EACnC,OAAO;CACT;CAEA,WAAyB;EAIvB,IAAI,KAAK,SAAS,SAAS,KAAK,YAC9B,MAAM,IAAI,eAAe;EAE3B,KAAK,WAAW;EAChB,MAAM,UAAoB,CAAC;EAC3B,KAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,IAAI,CAAC,YAAY,KAAK,IAAI,GAAG;IAC3B,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG;KACxB,KAAK,QAAQ,CAAC,CAAC,QAAQ,KAAK,IAAI,iCAAiC,CAAC;KAClE,KAAK,MAAM,WAAW,IAAI;IAC5B;IACA;GACF;GACA,KAAK,gBAAgB;GACrB,QAAQ,KAAK,IAAI;EACnB;EACA,KAAK,aAAa,OAAO;EACzB,MAAM,MAAM,KAAK,QAAQ;EACzB,MAAM,cAAc,IAAI,eAAe;EACvC,IAAI,gBAAgB,oBAClB,KAAK,QAAQ,IAAI,GAAG;EAEtB,IAAI,gBAAgB,2BAA2B;GAC7C,KAAK,oBAAoB;GACzB;EACF;EACA,IAAI,IAAI,mBAAmB,MAAM,WAAW;GAC1C,KAAK,SAAS;GACd,KAAK,WAAW;GAChB;EACF;EACA,IAAI,IAAI,mBAAmB,MAAM,aAAa;GAC5C,KAAK,eAAe,GAAG;GACvB;EACF;EACA,IAAI,WAAW,KAAK,MAAM,UAAU,CAAC;CACvC;CAEA,kBAAgC;EAC9B,MAAM,EAAE,mBAAmB,KAAK;EAChC,KAAK,eAAe;EACpB,IAAI,iBAAiB,KAAK,KAAK,cAAc,gBAC3C,MAAM,IAAI,mBACR,uBAAuB,eAAe,iCACxC;CAEJ;CAEA,sBAAoC;EAClC,SAAS;GACP,KAAK,MAAM,eAAe,EAAE,MAAM,QAAQ,CAAC;GAC3C,KAAK,SAAS;GACd,KAAK,WAAW;GAChB,KAAK,MAAM,cAAc;GAEzB,KAAK,MAAM,SAAS;GACpB,MAAM,OAAO,KAAK,MAAM,SAAS;GACjC,IAAI,SAAS,IACX;GAEF,KAAK,MAAM,WAAW,IAAI;EAC5B;CACF;CAEA,eAAuB,KAAoB;EACzC,MAAM,WAAW,IAAI,YAAY;EACjC,IAAI,aAAa,KAAA,GAAW;GAC1B,IAAI,QAAQ,KAAK,IAAI,4BAA4B,CAAC;GAClD,IAAI,WAAW,KAAK,MAAM,UAAU,CAAC;GACrC;EACF;EACA,MAAM,OAAO,IAAI,IAAI,2BAA2B,KAAK,OAAA,CAAQ,YAAY;EACzE,IAAI,CAAC;GAAC;GAAQ;GAAQ;EAAQ,CAAC,CAAC,SAAS,GAAG,GAC1C,IAAI,QAAQ,KAAK,IAAI,8CAA8C,CAAC;EAEtE,MAAM,YAAY,KAAK;EACvB,MAAM,iBAAiB,SAAyC;GAC9D,IAAI,CAAC,KAAK,WAAW,SAAS,GAC5B,OAAO;GAET,aAAa,YAAY,UAAU;GACnC,OAAO,aAAa,KAAK,IAAI;EAC/B;EACA,IAAI,oBAAoB;EACxB,MAAM,WAAqB,CAAC;EAC5B,IAAI;EACJ,IAAI,oBAAoB;EACxB,SAAS;GACP,IAAI,OAAO,KAAK,MAAM,SAAS;GAC/B,IAAI,SAAS,IACX;GAEF,MAAM,QAAQ,cAAc,IAAI;GAChC,IAAI,UAAU,MAAM;IAClB,SAAS,KAAK,IAAI;IAClB;GACF;GACA,IAAI,MAAM,OAAO,KAAA,GAAW;IAC1B,oBAAoB;IACpB,UAAU,MAAM;IAChB;GACF;GACA,IAAI,mBAAmB;IACrB,IAAI,SAAS,SAAS,GAAG;KACvB,MAAM,WAAW,SAAS,GAAG,EAAE,KAAK;KACpC,SAAS,SAAS,SAAS,KAAK,SAAS,QAAQ,QAAQ,EAAE;KAC3D,IAAI,WAAW,SAAS,KAAK,EAAE;IACjC;IACA,oBAAoB;IACpB,KAAK,MAAM,WAAW,IAAI;IAC1B;GACF;GAEA,SAAS;IACP,OAAO,KAAK,MAAM,SAAS;IAC3B,IAAI,cAAc,IAAI,MAAM,MAAM;KAChC,KAAK,MAAM,WAAW,IAAI;KAC1B;IACF;GACF;GACA,KAAK,MAAM,eAAe;IAAE,MAAM;IAAY;GAAU,CAAC;GACzD,KAAK,SAAS;GACd,MAAM,OAAO,KAAK,YAAY;GAC9B,IAAI,KAAK,mBAAmB,MAAM,aAAa;IAC7C,MAAM,EAAE,aAAa;IACrB,IAAI,aAAa,IACf,KAAK,WAAW;SACX,IAAI,aAAa,MACtB,KAAK,WAAW,SAAS,QAAQ,QAAQ,EAAE;GAE/C,OAAO,IAAI,OAAO,KAAK,YAAY,UACjC,KAAK,UAAU,KAAK,QAAQ,QAAQ,QAAQ,EAAE;GAEhD,KAAK,MAAM,cAAc;GACzB,KAAK,WAAW;GAChB,KAAK,OAAO,KAAK;EACnB;EACA,IAAI,mBAAmB;GACrB,IAAI,QAAQ,KAAK,IAAI,4BAA4B,CAAC;GAClD,IAAI,WAAW,SAAS,KAAK,EAAE,CAAC;GAEhC,KAAK,MAAM,UAAU;GACrB,IAAI,WAAW;GACf;EACF;EACA,IAAI,CAAC,mBAAmB;GACtB,IAAI,QAAQ,KAAK,IAAI,4BAA4B,CAAC;GAClD;EACF;EACA,MAAM,WAAW,KAAK,MAAM,UAAU;EAGtC,IAAI,WAAW,UAAU,WAAW,SAAS,QAAQ,UAAU,EAAE;CACnE;CAEA,aAAqB,OAAgC;EACnD,IAAI,aAAa;EACjB,IAAI,YAAsB,CAAC;EAC3B,MAAM,MAAM,KAAK,QAAQ;EACzB,KAAK,MAAM,CAAC,QAAQ,SAAS,MAAM,QAAQ,GAAG;GAC5C,IAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAI,GAAG;IACjD,IAAI,CAAC,YAAY;KACf,IAAI,QAAQ,KAAK,IAAI,oCAAoC,IAAI,CAAC;KAC9D;IACF;IACA,UAAU,KAAK,IAAI;IACnB;GACF;GACA,IAAI,YAAY;IACd,IAAI,OAAO,GAAG,kBAAkB,SAAS,CAAC;IAC1C,aAAa;IACb,YAAY,CAAC;GACf;GACA,IAAI,KAAK,WAAW,OAAO,GAAG;IAC5B,IAAI,WAAW,GAAG;KAChB,IAAI,WAAW,KAAK,QAAQ,QAAQ,EAAE;KACtC;IACF;IACA,IAAI,WAAW,MAAM,SAAS,GAAG;KAC/B,KAAK,MAAM,WAAW,IAAI;KAC1B;IACF;IACA,IAAI,QAAQ,KAAK,IAAI,8BAA8B,IAAI,CAAC;IACxD;GACF;GACA,MAAM,QAAQ,KAAK,QAAQ,GAAG;GAC9B,IAAI,UAAU,GAAG;IACf,IAAI,QAAQ,KAAK,IAAI,oBAAoB,sBAAsB,CAAC;IAChE;GACF;GACA,aAAa,KAAK,MAAM,GAAG,KAAK;GAChC,YAAY,CAAC,IAAI;EACnB;EACA,IAAI,YACF,IAAI,OAAO,GAAG,kBAAkB,SAAS,CAAC;CAE9C;AACF;;;;;;;;;AAUA,SAAgB,kBACd,MACA,aAAA,KACA,SAAsB,sBACb;CACT,OAAO,IAAI,WAAW,MAAM,YAAY,MAAM,CAAC,CAAC,MAAM;AACxD;;AC7gBA,MAAM,OAAO;AACb,MAAM,eAAe,IAAI,OACvB,WAAW,YAAY,uBAAuB,YAAY,UAC1D,IACF;AACA,MAAM,iBAAiB;AACvB,MAAM,YAAY;AAClB,MAAM,OAAO,gCAAgC,eAAe;AAE5D,MAAM,OAAO,MAAM,KAAK;AACxB,MAAM,QAAQ,GAAG,KAAK,sBAAsB,KAAK;AACjD,MAAM,SAAS,GAAG,KAAK,sBAAsB,KAAK;AAElD,MAAM,YAAY,IAAI,OACpB,OAAO,MAAM,oBAAoB,OAAO,mDACxC,GACF;AACA,MAAM,YAAY;AAoBlB,SAAS,SAAS,MAAsB;CACtC,OAAO,QAAQ,MAAM,SAAS;AAChC;;AAGA,SAAS,KAAK,KAAqB;CACjC,MAAM,QAAgB,CAAC;CACvB,IAAI,MAAgB,CAAC;CACrB,IAAI,SAA6B,CAAC;CAClC,IAAI,WAAqB,CAAC;CAC1B,IAAI,QAAQ;CACZ,IAAI,QAAuB;CAC3B,IAAI,UAAU;CACd,IAAI,aAAa;CACjB,IAAI,QAAQ;CACZ,IAAI,UAAU;CACd,IAAI,UAAU;CACd,IAAI,QAAQ;CAEZ,MAAM,QAAQ,QAAsB;EAClC,MAAM,OAAO,IAAI,KAAK,EAAE;EACxB,MAAM,UAAU,IAAI,MAAM,OAAO,GAAG;EACpC,IAAI,SAAS,IAAI,KAAK,SAAS,SAAS,KAAK,UAAU,KAAK,OAAO,GACjE,MAAM,KAAK;GACT,KAAK;GACL;GACA;GACA;GACA,cAAc;EAChB,CAAC;EAEH,MAAM,CAAC;EACP,SAAS,CAAC;EACV,WAAW,CAAC;EACZ,QAAQ,MAAM;EACd,aAAa;CACf;CAEA,KAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,SAAS,GAAG;EAClD,MAAM,OAAO,IAAI,OAAO,KAAK;EAC7B,IAAI,SAAS;GACX,IAAI,CAAC,SACH,IAAI,KAAK,IAAI;GAEf,UAAU;GACV;EACF;EACA,IAAI,SAAS,SAAS,SAAS,WAAW,UAAU;GAClD,UAAU;GACV,IAAI,CAAC,SACH,IAAI,KAAK,IAAI;GAEf;EACF;EACA,IAAI,SAAS;GACX,IAAI,SAAS,KAAK;IAChB,WAAW;IACX,aAAa,KAAK,IAAI,YAAY,OAAO;GAC3C,OAAO,IAAI,SAAS,KAClB,WAAW;GAEb;EACF;EACA,IAAI,OAAO;GACT,IAAI,KAAK,IAAI;GACb,IAAI,SAAS,MACX,QAAQ;GAEV;EACF;EACA,IAAI,SAAS;GACX,IAAI,KAAK,IAAI;GACb,IAAI,SAAS,KACX,UAAU;GAEZ;EACF;EACA,IAAI,SAAS,KAAK;GAChB,UAAU;GACV,aAAa,KAAK,IAAI,YAAY,CAAC;GACnC,IAAI,KAAK,GAAG;EACd,OAAO,IAAI,SAAS,MAAK;GACvB,QAAQ;GACR,IAAI,KAAK,IAAI;EACf,OAAO,IAAI,SAAS,KAAK;GACvB,UAAU;GACV,IAAI,KAAK,IAAI;EACf,OAAO,IAAI,SAAS,KAAK;GACvB,IAAI,UAAU,MACZ,QAAQ,IAAI;QAEZ,SAAS,KAAK,cAAc;GAE9B,IAAI,KAAK,IAAI;EACf,OAAO,IAAI,SAAS,KAAK;GACvB,IAAI,UAAU,MACZ,SAAS,KAAK,iBAAiB;QAC1B;IACL,OAAO,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC;IAC/B,QAAQ;GACV;GACA,IAAI,KAAK,IAAI;EACf,OAAO,IAAI,UAAU,QAAQ,SAAS,KACpC,KAAK,KAAK;OACL,IAAI,UAAU,QAAQ,SAAS,KAAK;GACzC,IAAI,SAAS,OAAO,SAAS,GAAG;IAC9B,SAAS,KAAK,wBAAwB;IACtC,IAAI,KAAK,IAAI;GACf,OAAO;IACL,QAAQ;IACR,IACE,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC,KACzB,UAAU,KAAK,IAAI,MAAM,OAAO,KAAK,CAAC,GACtC;KACA,SAAS,KAAK,oBAAoB;KAClC,KAAK,KAAK;IACZ;IACA,MAAM,CAAC;IACP,QAAQ,QAAQ;GAClB;EACF,OAAO,IAAI,UAAU,QAAQ,SAAS,KAAK;GACzC,IAAI,CAAC,OACH,SAAS,KAAK,iBAAiB;GAEjC,KAAK,KAAK;GACV,QAAQ;EACV,OAAO;GACL,IAAI,SAAS,OAAO,SAAS,KAC3B,SAAS,KAAK,qBAAqB;GAErC,IAAI,KAAK,IAAI;EACf;CACF;CACA,IAAI,SAAS,WAAW,WAAW,UAAU,QAAQ,SACnD,SAAS,KAAK,oBAAoB;CAEpC,IAAI,OACF,SAAS,KAAK,gBAAgB;CAEhC,KAAK,IAAI,MAAM;CACf,OAAO;AACT;;AAMA,SAAS,QAAQ,OAA8B;CAC7C,IAAI,QAAQ,SAAS,MAAM,QAAQ,MAAM,GAAG,CAAC;CAC7C,IAAI,UAAU,KAAK,KAAK,GACtB,OAAO;CAGT,IAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,GAAG;EAClD,IAAI,UAAU;EACd,IAAI,UAAU;EACd,MAAM,UAAoB,CAAC;EAC3B,IAAI,QAAQ;EACZ,IAAI,aAAa;EACjB,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;GACpD,MAAM,OAAO,MAAM,OAAO,KAAK;GAC/B,IAAI,SACF,UAAU;QACL,IAAI,SAAS,QAAQ,SAC1B,UAAU;QACL,IAAI,SAAS,KAClB,UAAU;QACL,IAAI,SAAS,KAClB,UAAU;QACL,IAAI,CAAC,YAAY,SAAS,OAAO,SAAS,MAAM;IACrD,MAAM,SAAS,SAAS,MAAM,MAAM,OAAO,KAAK,CAAC;IACjD,IAAI,QACF,QAAQ,KAAK,MAAM;IAErB,QAAQ,QAAQ;IAChB,IAAI,SAAS,KAAK;KAChB,aAAa;KACb;IACF;GACF;EACF;EACA,IAAI,CAAC,YACH,OAAO;EAET,IACE,QAAQ,WAAW,KACnB,QAAQ,MACN,WAAU,CAAC,OAAO,WAAW,GAAG,KAAK,CAAC,UAAU,KAAK,QAAQ,QAAQ,CACvE,GAEA,OAAO;EAET,QAAQ,SAAS,MAAM,MAAM,KAAK,CAAC;CACrC;CACA,IAAI,CAAC,UAAU,KAAK,KAAK,GACvB,OAAO;CAET,IAAI,aAAa;CACjB,IAAI,SAAS;CACb,IAAI,UAAU;CACd,IAAI,UAAU;CACd,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,SACF,UAAU;OACL,IAAI,SAAS,SAAS,UAAU,UACrC,UAAU;OACL,IAAI,SAAS,QAAO,CAAC,SAC1B,SAAS,CAAC;OACL,IAAI,SAAS,OAAO,CAAC,QAC1B,UAAU;OACL,IAAI,SAAS,OAAO,SACzB,UAAU;EAEZ,IAAI,EAAE,SAAS,OAAO,SAAS,QAAS,UAAU,SAChD,cAAc;CAElB;CACA,OAAO;AACT;;AAGA,SAAS,YAAY,OAAwB;CAC3C,IAAI,SAAS;CACb,IAAI,UAAU;CACd,KAAK,MAAM,QAAQ,SAAS,MAAM,QAAQ,MAAM,GAAG,CAAC,GAAG;EACrD,IAAI,KAAK,WAAW,CAAC,IAAI,MAAM,SAAS,KACtC,OAAO;EAET,IAAI,SACF,UAAU;OACL,IAAI,SAAS,QAAQ,QAC1B,UAAU;OACL,IAAI,SAAS,MAClB,SAAS,CAAC;OACL,IAAI,CAAC,UAAU,aAAa,SAAS,IAAI,GAC9C,OAAO;CAEX;CACA,OAAO,QAAQ,SAAS,KAAK,CAAC,KAAK,EAAE,UAAU;AACjD;;AAGA,SAAS,YAAY,OAAuB;CAC1C,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,UAAU;CACd,KAAK,MAAM,QAAQ,SAAS,MAAM,QAAQ,MAAM,GAAG,CAAC,GAClD,IAAI,SAAS;EACX,UAAU;EACV,UAAU;CACZ,OAAO,IAAI,SAAS,QAAQ,QAC1B,UAAU;MACL,IAAI,SAAS,MAClB,SAAS,CAAC;MAEV,UAAU;CAGd,OAAO,SAAS,MAAM;AACxB;;AAGA,SAAS,YACP,OACA,OACA,SACA,UACyB;CACzB,aAAa,YAAY;CACzB,MAAM,QAAQ,aAAa,KAAK,KAAK;CACrC,IAAI,CAAC,OACH,OAAO;CAET,MAAM,MAAM,QAAQ,MAAM,EAAE,CAAC;CAC7B,IACE,MAAM,MAAM,UACZ,EAAE,UAAU,QAAS,KAAA,CAAO,SAAS,MAAM,OAAO,GAAG,CAAC,GAEtD,OAAO;CAET,IAAI,MAAM,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,IACnC,SAAS,IAAI,uBAAuB;CAEtC,IAAI;EACF,MAAM,SAAmB,CAAC;EAC1B,KAAK,MAAM,CAAC,MAAM,YAAY,aAAa,MAAM,EAAE,GAAG;GACpD,IAAI;GACJ,IAAI,OAAO,SAAS,UAClB,OAAO;QACF;IACL,IAAI,YAAY,WAAW,QAAA,CAAS,MAAM,GAAG,CAAC,CAAC,MAAM;IACrD,IAAI,aAAa,gBACf,WAAW;IAEb,OAAO,SAAS,MAAM,QAAQ;GAChC;GACA,IAAI,UAAU,KAAK,IAAI,GAAG;IACxB,SAAS,IAAI,sBAAsB;IACnC,OAAO;GACT;GACA,KAAK,MAAM,QAAQ,MACjB,IAAI,KAAK,WAAW,CAAC,IAAI,MAAM,SAAS,KACtC,OAAO;GAGX,OAAO,KAAK,IAAI;EAClB;EACA,OAAO,CAAC,OAAO,KAAK,EAAE,GAAG,GAAG;CAC9B,SAAS,OAAO;EAGd,IAAI,iBAAiB,eAAe,iBAAiB,cACnD,OAAO;EAET,MAAM;CACR;AACF;;AAGA,SAAS,cACP,OACA,aACA,UACQ;CACR,MAAM,QAAQ,MAAM,QAAQ,MAAM,GAAG;CACrC,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,UAAU;CACd,IAAI,SAAS;CACb,IAAI,UAAU;CACd,IAAI,QAAQ;CACZ,OAAO,QAAQ,MAAM,QAAQ;EAC3B,MAAM,OAAO,MAAM,OAAO,KAAK;EAC/B,IAAI,SACF,UAAU;OACL,IAAI,SAAS,SAAS,UAAU,UACrC,UAAU;OACL,IAAI,WAAW,SAAS,KAC7B,WAAW;OACN,IAAI,CAAC,UAAU,SAAS,KAC7B,WAAW;OACN,IAAI,CAAC,WAAW,SAAS,MAC9B,SAAS,CAAC;OACL,IAAI,CAAC,UAAU,CAAC,WAAW,SAAS,KACzC,SAAS;OACJ,IACL,CAAC,WACA,WAAW,WACZ,SAAS,QACR,UAAU,MACR,UAAU,QAAS,KAAA,CAAO,SAAS,MAAM,OAAO,QAAQ,CAAC,CAAC,IAC7D;GACA,IAAI,OAAO,YAAY,OAAO,OAAO,UAAU,GAAG,QAAQ;GAC1D,IAAI,MAAM;IACR,MAAM,SAAS,CAAC,KAAK,EAAE;IACvB,IAAI,MAAM,KAAK;IACf,OAAO,MAAM,MAAM,QAAQ;KACzB,IAAI,YAAY;KAChB,OACE,YAAY,MAAM,UAClB,KAAM,SAAS,MAAM,OAAO,SAAS,CAAC,GAEtC,aAAa;KAEf,IAAI,cAAc,KAChB;KAEF,OAAO,YAAY,OAAO,WAAW,UAAU,GAAG,QAAQ;KAC1D,IAAI,CAAC,MACH;KAEF,OAAO,KAAK,KAAK,EAAE;KACnB,MAAM,KAAK;IACb;IACA,IAAI,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,WAAW,MAAM,MAAM;IAClD,IAAI,SACF,OAAO,KAAK,WAAW,KAAK,KAAK,CAAC,CAAC,WAAW,KAAK,KAAK;SAExD,OAAO,IAAI,KAAK,WAAW,MAAK,MAAK,EAAE;IAEzC,UAAU;IACV,QAAQ;IACR;GACF;EACF;EACA,UAAU;EACV,SAAS;CACX;CACA,OAAO;AACT;;AAGA,SAAgB,mBACd,KACA,aACsC;CACtC,MAAM,UAAyB,CAAC;CAChC,MAAM,cAAmC,CAAC;CAC1C,KAAK,MAAM,QAAQ,KAAK,GAAG,GAAG;EAC5B,IAAI,aAA4B,CAAC;EACjC,MAAM,kCAAkB,IAAI,IAAY;EACxC,MAAM,SAAS,KAAK,OAAO,KAAK,KAAK,KAAK,MAAM,GAAG,KAAK,OAAO,EAAE,CAAC,EAAE,IAAI;EACxE,MAAM,OAAO,YACX,cAAc,cAAc,QAAQ,MAAM,eAAe,IAAI,MAC/D;EACA,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,WAAW,KAAK,OAAO,QAAQ,GAAG;GAC1D,MAAM,UAAU,QAAQ,KAAK,KAAK,MAAM,OAAO,GAAG,KAAK,CAAC;GACxD,IAAI,SACF,WAAW,KAAK,CAAC,UAAU,IAAI,OAAO,IAAI,OAAO,CAAC;EAEtD;EACA,IAAI,SAAwB;EAC5B,IAAI,WAA0B,CAAC;EAC/B,IAAI,KAAK,SAAS,SAAS,GACzB,SAAS,CAAC,GAAG,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG;OACnD,IAAI,KAAK,OAAO,SAAS,GAAG;GACjC,MAAM,CAAC,MAAM,SAAS,KAAK,OAAO,MAAM,CAAC,GAAG,CAAC;GAC7C,IAAI,KAAK,OAAO,WAAW,KAAK,SAAS,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC,GACjE,SAAS;QACJ,IAAI,WAAW,WAAW,GAC/B,SAAS;QACJ;IACL,WAAW;IACX,IACE,SAAS,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,KACjC,CAAC,YAAY,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,GAErC,SAAS;GAEb;EACF,OAAO;GACL,MAAM,UAAU,QAAQ,KAAK,IAAI;GACjC,IAAI,SAAS;IACX,WAAW,CAAC,CAAC,IAAI,OAAO,CAAC;IACzB,aAAa;GACf,OACE,SAAS;EAEb;EACA,MAAM,cAAc,UAAU,KAAK,KAAK,GAAG;EAC3C,IAAI,aACF,SAAS;EAEX,IAAI,SAAS,SAAS,KAAK,CAAC,aAAa;GAEvC,IAAI,SAAS,KAAK,eAAe,KAAK,KAAK,MAAM,KAAK;GACtD,IAAI,aACF,SAAS,cAAc,QAAQ,KAAK,OAAO,SAAS,GAAG,eAAe;GAExE,MAAM,SAAS,aAAa,CAAC,MAAM,CAAC;GACpC,MAAM,kBAAkB,OACrB,QAAQ,GAAG,aAAa,OAAO,CAAC,CAChC,KAAK,GAAG,aAAa,OAAO;GAC/B,MAAM,oBAAoB,SAAS,KAAK,GAAG,aAAa,OAAO;GAC/D,IACE,gBAAgB,WAAW,kBAAkB,UAC7C,gBAAgB,OACb,SAAS,UAAU,YAAY,kBAAkB,MACpD,GAEA,WAAW,OAAO,QAAQ,GAAG,aAAa,OAAO;QAEjD,WAAW;EAEf;EACA,IAAI,gBAAgB,OAAO,GACzB,SAAS,CAAC,QAAQ,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,SAAS,CAAC,CAAC,CAClD,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;EAEb,QAAQ,KAAK,GAAG,QAAQ;EACxB,IAAI,QACF,YAAY,KAAK;GACf;GACA,KAAK,KAAK;GACV,WAAW,SAAS,SAAS;GAC7B,YAAY,WAAW,KAAK,CAAC,cAAc,cAAc;IACvD,cAAc;IACd;GACF,EAAE;EACJ,CAAC;CAEL;CACA,OAAO,CAAC,SAAS,WAAW;AAC9B;;AAGA,SAAgB,aACd,WACA,SACA,cAAc,OACC;CACf,IAAI,cAAc,QAAQ,cAAc,KAAA,GACtC,OAAO,CAAC;CAEV,IAAI,CAAC,SAAS,SAAS,GACrB,OAAO,aAAa,CAAC,SAAS,CAAC;CAEjC,MAAM,CAAC,QAAQ,eAAe,mBAAmB,WAAW,WAAW;CAEvE,KAAK,MAAM,cAAc,aACvB,SAAS,KAAK,UAAU;CAE1B,OAAO,OAAO,SAAS,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C;;ACtiBA,MAAM,SAAS;CACb;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAM,WAAW;CAAC;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;AAAK;AACjE,MAAM,QAA0C;CAC9C,IAAI;CACJ,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;AACP;AAIA,MAAM,OAAO,IAAI,OACf,0DAA0D,OAAO,KAAK,GAAG,EAAE,wFAC3E,GACF;AAEA,MAAM,gBAAgB;CAAC;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;AAAE;AACrE,MAAM,WAAW;AACjB,MAAM,WAAW;AACjB,MAAM,gBAAgB;AACtB,MAAMC,kBAAgB;AA0BtB,MAAM,eAA2B;CAAE,OAAO;CAAM,UAAU;CAAG,SAAS,CAAC;AAAE;AAEzE,SAAS,QAAQ,QAA4B;CAC3C,OAAO;EAAE,OAAO;EAAM,UAAU;EAAG,SAAS,CAAC,MAAM;CAAE;AACvD;;AAGA,SAAgB,aAAa,OAA4B;CACvD,MAAM,OAAO,IAAI,KAAK,MAAM,OAAO;CACnC,MAAM,OAAO,QAAgB,QAAQ,MACnC,OAAO,MAAM,CAAC,CAAC,SAAS,OAAO,GAAG;CACpC,OACE,GAAG,IAAI,KAAK,eAAe,GAAG,CAAC,EAAE,GAAG,IAAI,KAAK,YAAY,IAAI,CAAC,EAAE,GAAG,IAAI,KAAK,WAAW,CAAC,EAAA,GACpF,IAAI,KAAK,YAAY,CAAC,EAAE,GAAG,IAAI,KAAK,cAAc,CAAC,EAAE,GAAG,IAAI,KAAK,cAAc,CAAC,EAAE;AAE1F;AAGA,SAAS,WAAW,KAA4B;CAC9C,MAAM,SAAmB,CAAC;CAC1B,IAAI,QAAQ;CACZ,IAAI,UAAU;CACd,IAAI,MAAM;CACV,KAAK,MAAM,QAAQ,KAAK;EACtB,IAAI,OAAO;GACT,IAAI,SACF,UAAU;QACL,IAAI,SAAS,MAClB,UAAU;QACL,IAAI,SAAS,KAClB,SAAS;QACJ,IAAI,SAAS,KAClB,SAAS;GAEX;EACF;EACA,IAAI,SAAS,KAAK;GAChB,QAAQ;GACR,MAAM;EACR,OAAO,IAAI,SAAS,KAClB,OAAO;OACF,IAAI,SAAU,SAAS,IAAI,GAChC,MAAM;OACD;GACL,IAAI,OAAO,OAAO,SAAS,GACzB,OAAO,KAAK,GAAG;GAEjB,MAAM;GACN,OAAO,KAAK,IAAI;EAClB;CACF;CACA,OAAO,QAAQ,OAAO,OAAO,KAAK,EAAE;AACtC;AAGA,SAAS,aAAa,QAAwB;CAC5C,MAAM,OAAO,SAAS,IAAI,MAAM;CAChC,MAAM,UAAU,KAAK,IAAI,MAAM;CAE/B,IAAI,SAAS,KAAK,MAAM,UAAU,CAAC;CACnC,MAAM,YAAY,UAAU;CAC5B,IAAI,YAAY,KAAM,cAAc,KAAK,SAAS,MAAM,GACtD,UAAU;CAEZ,OAAO,GAAG,OAAO,KAAK,MAAM,SAAS,EAAE,EAAE,GAAG,SAAS;AACvD;AAEA,SAAS,YAAY,MAAc,OAAe,KAAsB;CACtE,IAAI,OAAO,KAAK,OAAO,YAAY,MAAM,GACvC,OAAO;CAET,MAAM,OAAQ,OAAO,MAAM,KAAK,OAAO,QAAQ,KAAM,OAAO,QAAQ;CAEpE,OAAO,QADO,UAAU,KAAK,OAAO,KAAM,cAAc,QAAQ,MAAM;AAExE;;AAGA,SAAgB,cAAc,KAA4C;CACxE,IAAI,QAAQ,QAAQ,QAAQ,KAAA,GAC1B,OAAO;CAET,MAAM,SAAS,WAAW,GAAG;CAC7B,MAAM,QAAQ,WAAW,OAAO,OAAO,KAAK,KAAK,MAAM;CACvD,IAAI,UAAU,MACZ,OAAO,QAAQ,qBAAqB;CAEtC,MAAM,GAEJ,SACA,SACA,WACA,WAAW,IACX,UACA,YACA,YACA,WACA,WAAW,MACT;CACJ,MAAM,aAAa,SAAS,QAAQ,QAAQ,EAAE;CAC9C,IAAI,WAAW,SAAS,GACtB,OAAO,QAAQ,mBAAmB;CAEpC,IAAI,OAAO,OAAO,cAAc,GAAG;CACnC,IAAI,SAAS,WAAW,GACtB,QAAQ,OAAO,KAAK,MAAO;MACtB,IAAI,SAAS,WAAW,GAC7B,QAAQ;CAEV,MAAM,QACJ,OAAO,SAAS,aAAa,GAAA,CAAI,YAAY,CAA4B,IACzE;CACF,MAAM,MAAM,OAAO,WAAW,EAAE;CAChC,IAAI,CAAC,YAAY,MAAM,OAAO,GAAG,GAC/B,OAAO,QAAQ,uBAAuB;CAExC,IAAI,OAAO,UACT,OAAO,QAAQ,uBAAuB;CAExC,MAAM,OAAO,OAAO,YAAY,EAAE;CAClC,MAAM,SAAS,OAAO,cAAc,EAAE;CACtC,MAAM,SAAS,OAAO,cAAc,GAAG;CACvC,IAAI,OAAO,MAAM,SAAS,MAAM,SAAS,IACvC,OAAO,QAAQ,cAAc;CAE/B,MAAM,OAAO,SAAS,YAAY;CAClC,IAAI;CACJ,IAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,GAAG;EAChD,IAAI,KAAK,WAAW,KAAK,OAAO,KAAK,MAAM,EAAE,CAAC,IAAI,IAChD,OAAO,QAAQ,cAAc;EAE/B,IAAI,CAAC,WACH,OAAO,QAAQ,qBAAqB;EAEtC,SAAS,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,KAAK,MAAM,CAAC,CAAC;EAC7D,IAAI,KAAK,WAAW,GAAG,GACrB,SAAS,CAAC;CAEd,OAAO;EACL,IAAI,SAAS,KACX,OAAO,QAAQ,cAAc;EAE/B,SAAS,MAAM,SAAS;CAC1B;CACA,MAAM,OAAO,KAAK,IAChB,KACA,QAAQ,GACR,KACA,MACA,QACA,KAAK,IAAI,QAAQ,EAAE,CACrB;CAEA,MAAM,OAAO,IAAI,KAAK,IAAI;CAC1B,KAAK,eAAe,MAAM,QAAQ,GAAG,GAAG;CACxC,IAAI,UAAU,KAAK,QAAQ,IAAI,SAAS;CACxC,IAAI,WAAW,IACb,WAAWA;CAEb,MAAM,aAAa,IAAI,KAAK,OAAO,CAAC,CAAC,eAAe;CACpD,IAAI,aAAa,YAAY,aAAa,GACxC,OAAO,QAAQ,mBAAmB;CAEpC,MAAM,UAAoB,CAAC;CAC3B,IAAI,SAAS;EAEX,MAAM,mBAAmB,KAAK,UAAU,IAAI,KAAK;EACjD,IACE,SAAS,QAAQ,QAAQ,YAAY,CAA8B,MACnE,iBAEA,QAAQ,KAAK,kBAAkB;CAEnC;CACA,OAAO;EAAE,OAAO,EAAE,QAAQ;EAAG,UAAU,aAAa,MAAM;EAAG;CAAQ;AACvE;;AAGA,SAAgB,gBACd,QACA,KACA,QACA,YACkB;CAClB,OAAO,OAAO,QAAQ,KAAI,YAAW;EACnC;EACA;EACA,WAAW,OAAO,UAAU;EAC5B,OAAO,OAAO,UAAU,OAAO,OAAO,aAAa,OAAO,KAAK;EAC/D;EACA;CACF,EAAE;AACJ;;;AC/PA,IAAa,kBAAb,cAAqC,MAAM;CACzC,OAAgB;AAClB;;;;;AAMA,IAAa,2BAAb,cAA8C,gBAAgB;CAC5D,OAAgB;AAClB;;;ACCA,IAAa,iCAAb,cAAoD,gBAAgB;CAClE,OAAgB;AAClB;AAEA,MAAM,MAAM;AACZ,MAAM,UACJ;AACF,MAAM,gBAAgB,IAAI,OACxB,qCAAqC,YAAY,kDAAkD,YAAY,YAAY,YAAY,SAAS,YAAY,6BAC5J,KACF;AACA,MAAM,QAAQ;AACd,MAAM,gBAAgB;AAetB,SAAS,YAAY,OAAuB;CAC1C,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,UAAU;CACd,IAAI,aAAa;CACjB,KAAK,MAAM,QAAQ,QAAQ,OAAO,GAAG,GAAG;EACtC,IAAI,IAAI,SAAS,IAAI,KAAK,CAAC,QAAQ;GACjC,aAAa;GACb;EACF;EACA,IAAI,YAAY;GACd,UAAU;GACV,aAAa;EACf;EACA,UAAU;EACV,IAAI,SACF,UAAU;OACL,IAAI,SAAS,MAClB,UAAU;OACL,IAAI,SAAS,MAClB,SAAS,CAAC;CAEd;CACA,OAAO;AACT;;AAKA,SAAgB,cACd,OACA,SACoD;CACpD,IAAI,aAAyB,CAAC;CAC9B,IAAI,UAAU;CACd,IAAI,QAAQ;CACZ,IAAI,UAAU;CACd,IAAI,QAAQ;CACZ,IAAI,UAAU;CACd,MAAM,aAAuB,CAAC;CAC9B,IAAI,WAAmC;CACvC,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACpD,MAAM,OAAO,MAAM,OAAO,KAAK;EAC/B,IAAI,SAAS;GACX,UAAU;GACV;EACF;EACA,IAAI,SAAS;GACX,IAAI,SAAS,MACX,UAAU;QACL,IAAI,SAAS,KAClB,WAAW;QACN,IAAI,SAAS,KAClB,WAAW;GAEb;EACF;EACA,IAAI,SAAS,SAAS;GACpB,IAAI,SAAS,MACX,UAAU;QACL,IAAI,SAAS,SAAS,MAC3B,QAAQ;QACH,IAAI,WAAW,SAAS,KAC7B,UAAU;GAEZ;EACF;EACA,IAAI,SAAS,KACX,UAAU;OACL,IAAI,SAAS,KAClB,MAAM,IAAI,+BAA+B,0BAA0B;OAC9D,IAAI,SAAS,MAClB,QAAQ;OACH,IAAI,SAAS,KAClB,UAAU;OACL,IAAI,SAAS,KAAK;GACvB,IAAI,OACF,MAAM,IAAI,+BAA+B,sBAAsB;GAEjE,QAAQ;EACV,OAAO,IAAI,SAAS,KAClB,QAAQ;OACH,IAAI,CAAC,OAAO;GACjB,IAAI,SAAS,KACX,WAAW,KAAK,KAAK;QAChB,IACL,WAAW,WAAW,MACrB,UAAU,KAAK,GAAG,IAAI,GAAG,SAAS,MAAM,OAAO,QAAQ,CAAC,CAAC,IAC1D;IACA,QAAQ,YAAY;IACpB,MAAM,QAAQ,QAAQ,KAAK,KAAK;IAChC,IAAI,OAAO;KACT,MAAM,WAAW,MAAM,MAAM,GAAA,CAAI,YAAY;KAC7C,MAAM,WAAW,QAAQ,MAAM,EAAE,CAAC;KAClC,IAAI,MAAM;KACV,OAAO,MAAM,MAAM,UAAU,IAAI,SAAS,MAAM,OAAO,GAAG,CAAC,GACzD,OAAO;KAGT,IACE,YAAY,UACZ,CAAC,MACE,MAAM,KAAK,MAAM,CAAC,CAAC,CACnB,YAAY,CAAC,CACb,WAAW,QAAQ,GAEtB,WAAW,KAAK;MAAC;MAAO;MAAU;KAAO,CAAC;IAE9C,OAAO,IAAI,MAAM,KAAK,IAAI,KAAK,aAAa,MAAM;KAChD,cAAc,YAAY;KAC1B,WAAW,cAAc,KAAK,KAAK;IACrC;GACF;EACF;CACF;CACA,MAAM,WAAgC;EACpC,CAAC,UAAU,GAAG,kBAAkB;EAChC,CAAC,OAAO,wBAAwB;EAChC,CAAC,SAAS,yBAAyB;EACnC,CAAC,OAAO,wBAAwB;CAClC;CACA,KAAK,MAAM,CAAC,YAAY,WAAW,UACjC,IAAI,YACF,MAAM,IAAI,+BAA+B,MAAM;CAGnD,IAAI,MAAM,MAAM;CAChB,IAAI,OAAsB;CAC1B,IAAI,cAAuC;CAC3C,MAAM,CAAC,gBAAgB,mBAAmB;CAC1C,IAAI,mBAAmB,KAAA,GAAW;EAChC,MAAM;EACN,OAAO,QAAQ,MAAM,MAAM,MAAM,CAAC,GAAG,GAAG;EACxC,IAAI,oBAAoB,KAAA,GAAW;GAGjC,MAAM,QAAQ,kBADC,QAAQ,MAAM,MAAM,MAAM,GAAG,eAAe,GAAG,GAC9B,GAAQ,CAAC;GACzC,IAAI,WAAW,WAAW,KAAK,MAAM,WAAW,GAC9C,MAAM,IAAI,+BAA+B,2BAA2B;GAEtE,MAAM,CAAC,QAAQ,IAAI,SAAS,MAAM;GAClC,IACE,WAAW,WAAW,KACtB,WAAW,GAAG,EAAE,CAAC,GAAG,OAAO,QAC3B,MAAM,YAAY,MAAM,SACxB,CAAC,OAAO,WAAW,GAAG,KACtB,CAAC,OAAO,SAAS,GAAG,GAEpB,MAAM,IAAI,+BAA+B,2BAA2B;GAEtE,cAAc,CAAC,OAAO,YAAY,MAAM,CAAC;GACzC,OAAO,QAAQ,MAAM,MAAM,kBAAkB,CAAC,GAAG,GAAG;GACpD,SAAS,KAAK;IAAE,QAAQ;IAA4B,WAAW;GAAK,CAAC;EACvE;CACF,OAAO,IAAI,aAAa,MAAM;EAC5B,MAAM,SAAS;EACf,OAAO,SAAS,MAAM;EACtB,MAAM,gBAAgB,SAAS;EAC/B,aAAa,WAAW,QAAQ,CAAC,WAAW,QAAQ,aAAa;CACnE;CACA,MAAM,UAA8B,CAAC;CACrC,KAAK,MAAM,CAAC,UAAU,GAAG,OAAO,aAAa,WAAW,QAAQ,GAAG;EACjE,MAAM,OAAO,WAAW,WAAW,EAAE,GAAG,MAAM;EAC9C,QAAQ,KAAK,CAAC,SAAS,YAAY,MAAM,MAAM,OAAO,IAAI,CAAC,CAAC,CAAC;CAC/D;CACA,IAAI,gBAAgB,MAClB,QAAQ,KAAK,WAAW;CAE1B,OAAO,CAAC,SAAS,IAAI;AACvB;AAEA,MAAM,gBAAgB;;;;;;AAOtB,SAAS,cAAc,MAAsB;CAC3C,OAAO,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,IAAI,CAAC;AAChD;;AAGA,SAAgB,cACd,UACA,SACqB;CACrB,MAAM,yBAAS,IAAI,IAAoB;CACvC,MAAM,CAAC,SAAS,QAAQ,cAAc,UAAU,OAAO;CACvD,IAAI,SAAS,MACX,OAAO,IAAI,QAAQ,IAAI;CAEzB,KAAK,MAAM,CAAC,SAAS,UAAU,SAC7B,IAAI,YAAY,mBAAmB,YAAY,mBAAmB;EAChE,MAAM,QAAQ,cAAc,KAAK,cAAc,KAAK,CAAC;EACrD,IAAI,OACF,OAAO,IAAI,QAAQ,QAAQ,KAAK,GAAG,GAAG,MAAM,MAAM,EAAE;CAExD,OAAO,IAAI,YAAY,QACjB;MAAA,CAAC,OAAO,IAAI,MAAM,GACpB,OAAO,IAAI,SAAS,KAAK;CAAA,OAG3B,OAAO,IAAI,SAAS,KAAK;CAI7B,KAAK,MAAM,aAAa;EAAC;EAAM;EAAQ;CAAM,GAAG;EAC9C,MAAM,YAAY,OAAO,IAAI,SAAS,KAAK;EAC3C,KAAK,MAAM,CAAC,QAAQ,YAAY,CAC9B,CAAC,iBAAiB,eAAe,GACjC,CAAC,mBAAmB,iBAAiB,CACvC,GACE,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,UAAU,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG;GAKpE,MAAM,QAAQ,IAJM,OAClB,GAAG,QAAQ,QAAQ,eAAe,MAAM,EAAE,GAAG,YAAY,cACzD,IAEkB,CAAC,CAAC,KAAK,cAAc,SAAS,CAAC;GACnD,IAAI,OACF,OAAO,IAAI,QAAQ,MAAM,MAAM,EAAE;EAErC;CAEJ;CACA,IAAI,OAAO,SAAS,GAClB,MAAM,IAAI,+BACR,kCAAkC,UACpC;CAEF,OAAO;AACT;;AAOA,SAAgB,iBACd,WACA,SACA,aACe;CACf,MAAM,SAAsB,CAAC;CAC7B,KAAK,MAAM,CAAC,OAAO,aAAa,UAAU,QAAQ,GAAG;EACnD,MAAM,cAAoC,CAAC;EAC3C,IAAI;GACF,OAAO,KAAK,EAAE,QAAQ,cAAc,UAAU,WAAW,EAAE,CAAC;EAC9D,SAAS,OAAO;GACd,IAAI,EAAE,iBAAiB,iCACrB,MAAM;GAER,OAAO,KAAK,EAAE,wBAAQ,IAAI,IAAI,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,EAAE,CAAC;GACpD,IAAI,CAAC,MAAM,QAAQ,WAAW,6BAA6B,GACzD,YAAY,KAAK;IAAE,QAAQ,MAAM;IAAS,WAAW;GAAM,CAAC;EAEhE;EACA,IAAI,YAAY,KAAA,GACd,KAAK,MAAM,UAAU,aAAa;GAChC,OAAO,MAAM;GACb,OAAO,SAAS;GAChB,OAAO,aAAa;GACpB,QAAQ,KAAK,MAAM;EACrB;CAEJ;CACA,OAAO,gBAAgB,QAAQ,WAAW,WAAW;AACvD;AAEA,SAAS,gBACP,WACA,YACA,aACe;CACf,MAAM,SAAmD,CAAC;CAC1D,MAAM,YAAgD,CAAC;CACvD,IAAI,MAAM;CACV,KACE,IAAI,aAAa,UAAU,SAAS,GACpC,cAAc,GACd,cAAc,GACd;EACA,MAAM,EAAE,WAAW,UAAU,eAAe,EAAE,wBAAQ,IAAI,IAAI,EAAE;EAChE,MAAM,QAAgD,CAAC;EACvD,KAAK,MAAM,CAAC,KAAK,UAAU,QACzB,IAAI,OACF,MAAM,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,KAAK;EAGtD,MAAM,MAAM,MAAM;EAClB,IAAI;EACJ,MAAM,OAAO,OAAO,IAAI,MAAM;EAC9B,IAAI,SAAS,KAAA,GAAW;GACtB,MAAM,SAAS,cAAc,IAAI;GACjC,MAAM,OAAO;GACb,MAAM,WAAW;GACjB,aAAa,KACX,GAAG,gBACD,QACA,WAAW,eAAe,MAC1B,YACA,UACF,CACF;EACF;EACA,IAAI,OAAO,SAAS,KAAK,KAAK;GAC5B,MAAM,SAAS,UAAU,MAAM;GAC/B,MAAM,QAAQ,UAAU,IAAI,UAAU,OAAO,WAAW,MAAO;EACjE,OACE,MAAM,QAAQ;EAEhB,IAAI,KACF,MAAM,WAAW,aAAa,GAAG;EAEnC,OAAO,KAAK,KAAK;EACjB,UAAU,KAAK,GAAG;EAClB,OAAO;CACT;CACA,OAAO;AACT;;ACnUA,MAAM,MAAM,UAAU,YAAY;;AAGlC,MAAa,oBAAuC;CAClD;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAM,qBAA0C,IAAI,IAAI,iBAAiB;AAEzE,MAAM,eAAkC;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,iCAAsC,IAAI,IAAI;CAClD;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,qCAA0C,IAAI,IAAI;CACtD;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,oCAAyC,IAAI,IAAI;CACrD;CACA;CACA;CACA;AACF,CAAC;;;;;;;AAwBD,MAAM,gBAAgB;;AAGtB,SAAS,IAAI,MAAsB;CACjC,OAAO,cAAc,KAAK,IAAI,IAAI,OAAO,KAAK,UAAU,KAAK;AAC/D;;AAGA,SAAS,aAAa,OAA0C;CAC9D,OAAO,QAAQ,IAAI,KAAK,IAAI;AAC9B;;AAGA,SAAS,YAAY,KAAiB,UAA0B;CAC9D,IAAI,IAAI,WAAW,GACjB,OAAO;CAET,IAAI;CACJ,IAAI;EACF,OAAO,SAAS,KAAK,QAAQ;CAC/B,SAAS,OAAO;EACd,IAAI,EAAE,iBAAiB,eAAe,iBAAiB,eACrD,MAAM;EAER,OAAO,SAAS,KAAK,SAAS,QAAQ;CACxC;CACA,OAAO,IAAI,IAAI;AACjB;;AAGA,SAAgB,iBAAiB,QAA2C;CAC1E,IAAI,CAAC,QACH,OAAO;CAET,IAAI,SAAS;CACb,IAAI;EACF,KAAK,MAAM,CAAC,MAAM,YAAY,aAAa,MAAM,GAC/C,UACE,OAAO,SAAS,WACZ,aAAa,IAAI,IACjB,YAAY,MAAM,WAAW,OAAO;CAE9C,SAAS,OAAO;EACd,IAAI,EAAE,iBAAiB,oBAAoB,iBAAiB,eAC1D,MAAM;EAER,IAAI,MAAM,gCAAgC,QAAQ;EAClD,UAAU;CACZ;CACA,OAAO,QAAQ,MAAM;AACvB;;AAGA,SAAS,cACP,QACmB;CACnB,IAAI,WAAW,KAAA,KAAa,OAAO,WAAW,GAC5C,OAAO;CAET,MAAM,UAAU,OAAO,KAAI,UAAS,iBAAiB,KAAK,CAAC;CAC3D,IAAI,QAAQ,WAAW,GACrB,OAAO,QAAQ,QAAQ,MAAM,EAAE;CAEjC,OAAO;AACT;;AAGA,SAAS,YACP,MACA,OACA,MACe;CACf,IAAI,SAAS,MACX,MAAM,IAAI,UAAU,4CAA4C;CAElE,MAAM,aAAa,KAAK,QAAQ,KAAK;CACrC,IAAI,eAAe,IACjB,OAAO;CAET,MAAM,QAAQ,aAAa,MAAM;CACjC,MAAM,MAAM,KAAK,QAAQ,MAAM,KAAK;CACpC,IAAI,QAAQ,IACV,OAAO;CAET,OAAO,QAAQ,KAAK,MAAM,OAAO,GAAG,CAAC;AACvC;AAEA,MAAM,YAAY;;AAGlB,SAAS,aAAa,SAAS,IAAY;CACzC,IAAI,SAAS;CACb,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAC3C,UAAU,UAAU,OAAO,UAAU,EAAgB,CAAC;CAExD,OAAO;AACT;AAEA,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAMC,uBAAqB;AAE3B,SAASC,aAAW,MAAsB;CACxC,OAAO,OAAO,WAAW,MAAM,MAAM;AACvC;AAGA,SAAS,SAAS,UAAoC;CACpD,MAAM,MAAM,SAAS,YAAY,GAAG;CACpC,IAAI,OAAO,GACT,OAAO,CAAC,UAAU,EAAE;CAEtB,IAAI,UAAU;CACd,OAAO,SAAS,OAAO,OAAO,MAAM,KAClC,WAAW;CAEb,IAAI,MAAM,SACR,OAAO,CAAC,UAAU,EAAE;CAEtB,OAAO,CAAC,SAAS,MAAM,GAAG,GAAG,GAAG,SAAS,MAAM,GAAG,CAAC;AACrD;AAEA,SAAS,yBAAyB,UAAoC;CACpE,MAAM,QAAQ,SAAS,YAAY;CACnC,KAAK,MAAM,aAAa,qBACtB,IAAI,MAAM,SAAS,SAAS,KAAK,SAAS,SAAS,UAAU,QAC3D,OAAO,CACL,SAAS,MAAM,GAAG,CAAC,UAAU,MAAM,GACnC,SAAS,MAAM,CAAC,UAAU,MAAM,CAClC;CAGJ,OAAO,SAAS,QAAQ;AAC1B;AAEA,SAAS,cAAc,MAAc,QAAwB;CAC3D,IAAI,SAAS;CACb,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,MAAM;EACvB,MAAM,OAAOA,aAAW,IAAI;EAC5B,IAAI,OAAO,OAAO,KAAK,IAAI,GAAG,MAAM,GAClC;EAEF,UAAU;EACV,QAAQ;CACV;CACA,OAAO;AACT;;AAGA,SAAgB,uBAAuB,UAAiC;CACtE,IAAI,SAAS,SAAS,IAAQ,GAC5B,OAAO;CAET,MAAM,aAAa,SAAS,WAAW,MAAM,GAAG;CAChD,MAAM,WAAW,WAAW,MAAM,WAAW,YAAY,GAAG,IAAI,CAAC;CACjE,IAAI,aAAa,MAAM,aAAa,OAAO,aAAa,MACtD,OAAO;CAET,IAAIA,aAAW,QAAQ,KAAKD,sBAC1B,OAAO;CAET,IAAI,CAAC,MAAM,aAAa,yBAAyB,QAAQ;CACzD,IAAIC,aAAW,SAAS,IAAID,uBAAqB,GAAG;EAClD,OAAO;EACP,YAAY;CACd;CACA,OACE,cAAc,MAAMA,uBAAqBC,aAAW,SAAS,CAAC,IAAI;AAEtE;;AAGA,SAAS,eAAe,MAAwB;CAC9C,MAAM,OAAO,IAAI,QAAQ;CACzB,KAAK,eAAe,KAAK,eAAe,CAAC;CACzC,KAAK,MAAM,CAAC,MAAM,UAAU,KAAK,SAAS,GACxC,IAAI,kBAAkB,IAAI,KAAK,YAAY,CAAC,GAC1C,KAAK,IAAI,MAAM,KAAK;CAGxB,OAAO;AACT;;AAYA,IAAa,aAAb,MAAa,WAAW;CACtB;CACA,cAA+C,CAAC;CAChD,YAA+B,CAAC;CAChC,WAA8B,CAAC;CAC/B,iBAAoC,CAAC;CACrC,UAAkC,CAAC;CACnC,oCAA0C,IAAI,IAAI;CAClD,aAAa;CACb,uBAAqD,CAAC;CACtD,wBAAuD,CAAC;CACxD,oBAA+C,CAAC;CAChD;CACA,OAAoC;CACpC,WAAgC;CAChC,8BAA+B,IAAI,IAAsB;CACzD,iCAAkC,IAAI,IAA2B;CACjE;CACA;CACA,YAAyC;;;;;;;CAQzC,OAAO,WACL,MACA,SAAsB,sBACV;EACZ,IAAI;GACF,OAAO,IAAI,WACT,kBAAkB,MAAA,KAA+B,MAAM,GACvD,MACF;EACF,SAAS,OAAO;GACd,IAAI,EAAE,iBAAiB,iBACrB,MAAM;GAER,MAAM,IAAI,yBACR,8EACA,EAAE,OAAO,MAAM,CACjB;EACF;CACF;CAEA,YAAY,SAAkB,SAAsB,sBAAsB;EACxE,KAAK,UAAU;EACf,KAAK,SAAS;EACd,KAAK,MAAM,CAAC,MAAM,UAAU,QAAQ,MAAM,GAAG;GAC3C,MAAM,MAAM,KAAK,YAAY;GAC7B,MAAM,OAAO,KAAK,YAAY,IAAI,GAAG,KAAK,CAAC;GAC3C,KAAK,KAAK,KAAK;GACf,KAAK,YAAY,IAAI,KAAK,IAAI;EAChC;EACA,KAAK,sBAAsB;EAC3B,MAAM,8BAAc,IAAI,IAAoB;EAC5C,KAAK,MAAM,CAAC,MAAM,QAAQ,QAAQ,SAAS,GAAG;GAC5C,MAAM,SAAS,KAAK,YAAY;GAChC,IAAI,WAAW,UAAU,WAAW,eAClC;GAEF,MAAM,aAAa,YAAY,IAAI,MAAM,KAAK;GAC9C,YAAY,IAAI,QAAQ,aAAa,CAAC;GACtC,MAAM,SAAS,cAAc,GAAG;GAChC,IAAI,WAAW,UAAU,eAAe,GAAG;IACzC,KAAK,OAAO,OAAO;IACnB,KAAK,WAAW,OAAO;GACzB;GACA,KAAK,kBAAkB,KACrB,GAAG,gBAAgB,QAAQ,KAAK,QAAQ,UAAU,CACpD;EACF;EACA,KAAK,WAAW,iBACd,QACG,SAAS,CAAC,CACV,QAAQ,CAAC,UAAU,KAAK,YAAY,MAAM,UAAU,CAAC,CACrD,KAAK,GAAG,WAAW,KAAK,GAC3B,KAAK,uBACL,KAAK,iBACP;EACA,IAAI,KAAK,sBAAsB,SAAS,GACtC,KAAK,WAAW,wBAAwB,EACtC,oBAAoB,KAAK,sBAAsB,KAC7C,WACE,kCAAkC,OAAO,WAAW,KAAK,OAAO,QACpE,EACF,CAAC;EAEH,IAAI,KAAK,kBAAkB,SAAS,GAClC,KAAK,WAAW,oBAAoB,EAClC,gBAAgB,KAAK,kBAAkB,KACrC,WACE,qBAAqB,OAAO,OAAO,GAAG,OAAO,WAAW,KAAK,OAAO,QACxE,EACF,CAAC;EAEH,KAAK,WAAW;EAChB,KAAK,aAAa,KAAK,SAAS;CAClC;CAEA,WAAmB,UAAkB,OAA0B;EAC7D,KAAK,aAAa;EAClB,KAAK,kBAAkB,IAAI,QAAQ;EACnC,KAAK,QAAQ,KAAK,KAAK;CACzB;CAEA,wBAAsC;EACpC,KAAK,MAAM,UAAU,mBACnB,KAAK,MAAM,CAAC,YAAY,WACtB,KAAK,YAAY,IAAI,MAAM,KAAK,CAAC,EAAA,CACjC,QAAQ,GAAG;GACX,MAAM,cAAmC,CAAC;GAC1C,MAAM,YAAY,aAAa,OAAO,aAAa,IAAI;GACvD,IAAI,eAAe,GACjB,KAAK,eAAe,IAAI,QAAQ,SAAS;GAE3C,KAAK,MAAM,UAAU,aAAa;IAChC,OAAO,SAAS;IAChB,OAAO,aAAa;IACpB,KAAK,qBAAqB,KAAK,MAAM;GACvC;EACF;EAEF,IAAI,KAAK,qBAAqB,SAAS,GACrC,KAAK,WAAW,uBAAuB,EACrC,mBAAmB,KAAK,qBAAqB,KAC3C,WACE,wBAAwB,OAAO,OAAO,GAAG,OAAO,WAAW,KAAK,OAAO,QAC3E,EACF,CAAC;CAEL;;CAGA,YAAY,MAA2B;EACrC,MAAM,QAAQ,KAAK,YAAY;EAC/B,IAAI,mBAAmB,IAAI,KAAK,GAC9B,QAAQ,KAAK,eAAe,IAAI,KAAK,KAAK,CAAC,EAAA,CACxC,QAAQ,GAAG,aAAa,OAAO,CAAC,CAChC,KAAK,CAAC,aAAa,aAA+B,CACjD,gBAAgB,UAAU,KAAK,aAC/B,OACF,CAAC;EAEL,OAAO,cAAc,KAAK,YAAY,IAAI,KAAK,CAAC;CAClD;CAEA,cAAsB,MAAe,aAA2B;EAC9D,MAAM,WAAqB,CAAC;EAC5B,KAAK,MAAM,UAAU,KAAK,SAAS;GACjC,SAAS,KAAK,GAAG,OAAO,KAAK,IAAI,OAAO,KAAK;GAC7C,KAAK,kBAAkB,IAAI,OAAO,IAAI;EACxC;EACA,IAAI,SAAS,SAAS,GAAG;GACvB,KAAK,aAAa;GAClB,KAAK,QAAQ,KAAK,GAAG,cAAc,SAAS,CAAC;EAC/C;CACF;CAEA,aAA2B;EACzB,MAAM,QAA8B,CAAC;EACrC,MAAM,wCAAwB,IAAI,IAAa;EAC/C,KAAK,MAAM,QAAQ,KAAK,QAAQ,KAAK,GAAG;GACtC,KAAK,cAAc,MAAM,KAAK,eAAe,CAAC;GAC9C,MAAM,SAAS,sBAAsB,IAAI,IAAI;GAC7C,MAAM,KAAK,CAAC,MAAM,MAAM,CAAC;GACzB,IAAI,KAAK,YAAY,GAAG;IACtB,MAAM,cAAc,KAAK,sBAAsB;IAC/C,MAAM,eACH,gBAAgB,KAAA,KAAa,gBAAgB,YAC7C,gBAAgB,YAAY,QAAQ,KAAK,YAAY,CAAC;IACzD,IAAI,UAAU,cAAc;KAC1B,MAAM,UAAU,KAAK,WAAW;KAChC,KAAK,MAAM,SAAS,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,GACtD,sBAAsB,IAAI,KAAK;IAEnC;GACF;EACF;EACA,IAAI,KAAK,kBAAkB,IAAI,eAAe,GAAG;GAC/C,MAAM,WAAW,KAAK,QAAQ,YAAY;GAC1C,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,UAAU,oDAAkD;GAExE,MAAM,WAAW,YACf,KAAK,QAAQ,UACb,KAAK,YACL,KAAK,SAAS,GAChB;GACA,IAAI,aAAa,MACf,MAAM,KAAK,CACT,kBAAkB,UAAA,KAAmC,KAAK,MAAM,GAChE,IACF,CAAC;EAEL;EAEA,KAAK,YAAY,IAAI,aAAa,KAAK,OAAO,oBAAoB;EAClE,IAAI;GACF,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,YAAY,MAAM,QAAQ,GAClD,KAAK,UAAU,MAAM,QAAQ,KAAK;EAEtC,UAAU;GACR,KAAK,YAAY;EACnB;CACF;CAEA,UAAkB,MAAe,QAAiB,OAAqB;EACrE,MAAM,WAAW,eAAe,IAAI;EACpC,IAAI,WAAW,iBAAiB,SAAS,YAAY,CAAC;EACtD,MAAM,cAAc,aAClB,SAAS,sBAAsB,CACjC,CAAC,CAAC,YAAY;EACd,IAAI,KAAK,YAAY,KAAK,gBAAgB,cACxC;EAEF,MAAM,UAAU,SAAS,kBAAkB,KAAK;EAChD,MAAM,aAAa,SAAS,kBAAkB,KAAK;EACnD,MAAM,YAAY,aAAa,SAAS,IAAI,YAAY,CAAC;EACzD,MAAM,iBAAiB,aAAa,SAAS,kBAAkB,CAAC;EAChE,MAAM,eACJ,CAAC,UACD,CAAC,KAAK,YAAY,KAClB,gBAAgB,YAChB,CAAC,cAAc,WAAW,CAAC,CAAC,SAAS,KAAK,eAAe,CAAC;EAC5D,IAAI,eAAe;EACnB,IAAI,UACF,eAAe;OACV,IACL,aACA,mBAAmB,UACnB,mBAAmB,SACnB;GACA,eAAe;GACf,WAAW;EACb,OAAO,IAAI,MAAM,SAAS,cAAc,GAAG;GAEzC,eAAe;GACf,WAAW,GAAG,aAAa,EAAE;EAC/B,OAAO,IAAI,gBAAgB,cAAc;GACvC,eAAe;GACf,WAAW,GAAG,aAAa,EAAE;EAC/B;EACA,IAAI,cACF,KAAK,cAAc,MAAM,UAAU,UAAU,YAAY,SAAS;EAEpE,IAAI,CAAC,gBAAgB,cAAc;GACjC,MAAM,UAAU,KAAK,kBAAkB,MAAM,SAAS,KAAK;GAC3D,IAAI,SAAS;IACX,MAAM,UAAU,KAAK,kBAAkB;IACvC,IAAI,YAAY,QACd,KAAK,SAAS,KAAK,OAAO;SACrB,IAAI,YAAY,SACrB,KAAK,UAAU,KAAK,OAAO;SACtB;KACL,IAAI,QAAQ,iBAAiBC,SAAO,OAAO,EAAE,aAAa;KAC1D,KAAK,eAAe,KAAK,OAAO;IAClC;GACF;EACF;CACF;CAEA,cACE,MACA,UACA,UACA,YACA,WACM;EACN,MAAM,kBAAkB,aAAa,SAAS,eAAe,CAAC;EAC9D,IAAI,mBAAmB,QACrB,aAAa,SAAS,IAAI,2BAA2B,KAAK,EAAE,CAC9D,CAAC,CAAC,YAAY;EACd,MAAM,qBAAqB,aACzB,SAAS,IAAI,qBAAqB,CACpC;EACA,IAAI;EACJ,IAAI;EACJ,MAAM,MAAM,KAAK,WAAW;EAC5B,IAAI,MAAM,QAAQ,GAAG,GAAG;GAGtB,UAAU;GACV,KAAK,MAAM,SAAS,KAClB,WAAW,MAAM,SAAS,KAAK,SAAS;GAE1C,SAAS;EACX,OAAO,IAAI,qBAAqB,UAAU;GACxC,UAAU,OAAO;GACjB,SAAS;EACX,OAAO;GAEL,UAAU,UAAU,KAAK,kBAAkB,qBAAK,IAAI,WAAW,CAAC;GAChE,SAAS;GACT,mBAAmB;EACrB;EACA,KAAK,YAAY,KAAK;GACpB;GACA,eAAe,uBAAuB,QAAQ;GAC9C;GACA;GACA,mBAAmB;GACnB,cAAc;GACd,uBAAuB;GACvB,SAAS;GACT,2BAA2B;EAC7B,CAAC;CACH;CAEA,kBACE,MACA,SACA,OACQ;EACR,MAAM,UAAU,KAAK,kBAAkB;EACvC,MAAM,MAAM,QACV,aAAa,KAAK,IAAI,2BAA2B,KAAK,EAAE,CAC1D,CAAC,CAAC,YAAY;EACd,KACG,CAAC,OAAO,QAAQ,UAAU,QAAQ,WACnC,OAAO,KAAK,YAAY,UAExB,OAAO,KAAK;EAEd,IAAI,YAAY,QAAQ,QAAQ,WAAW,GACzC,OAAO;EAET,IAAI;EACJ,IAAI;GACF,OAAO,SAAS,SAAS,OAAO;EAClC,SAAS,OAAO;GACd,IAAI,EAAE,iBAAiB,eAAe,iBAAiB,eACrD,MAAM;GAER,IAAI;GACJ,IAAI;IACF,OAAO,SAAS,SAAS,OAAO;IAChC,WAAW;GACb,QAAQ;IACN,OAAO,SAAS,SAAS,SAAS,SAAS;IAC3C,WAAW;GACb;GACA,KAAK,WAAW,uBAAuB,GACpC,KAAK,eAAe,IAAI,CACvB,6BAA6B,MAAM,YAAYA,SAAO,OAAO,EAAE,WAAW,SAAS,0CACrF,EACF,CAAC;EACH;EACA,OAAO,IAAI,IAAI;CACjB;;CAGA,IAAI,OAAe;EACjB,OAAO;GAAC,GAAG,KAAK;GAAW,GAAG,KAAK;GAAU,GAAG,KAAK;EAAc,CAAC,CAAC,KACnE,cACF;CACF;;CAGA,IAAI,YAAsB;EACxB,MAAM,0BAAU,IAAI,IAAY;EAChC,MAAM,QAAQ,CAAC,KAAK,YAAY,IAAI,GAAG,KAAK,YAAY,UAAU,CAAC;EACnE,KAAK,MAAM,QAAQ,OACjB,KAAK,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,GAC/C,IAAI,MAAM,QAAQ,IAAI,GACpB,QAAQ,IAAI,SAAS,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,GAAA,CAAI,YAAY,CAAC,CAAC;EAI1E,OAAO,CAAC,GAAG,OAAO;CACpB;CAEA,aAAqB,MAAuB;EAC1C,QAAQ,MAAR;GACE,KAAK,eACH,OAAO,KAAK;GACd,KAAK,QACH,OAAO,KAAK;GACd,KAAK,QACH,OAAO,KAAK;GACd,KAAK,YACH,OAAO,KAAK;GACd,KAAK,YACH,OAAO,KAAK;GACd,SACE,OAAO,KAAK;EAChB;CACF;CAEA,WAA4C;EAC1C,MAAM,OAAgC,CAAC;EACvC,MAAM,uBAAO,IAAI,IAAY;GAC3B,GAAG,KAAK,QAAQ,KAAK,CAAC,CAAC,KAAI,QAAO,IAAI,YAAY,CAAC;GACnD,GAAG;GACH,GAAG;EACL,CAAC;EACD,KAAK,MAAM,OAAO,MAAM;GACtB,IAAI,mBAAmB,IAAI,GAAG,GAC5B;GAEF,MAAM,QAAQ,eAAe,IAAI,GAAG,IAChC,KAAK,aAAa,GAAG,IACrB,KAAK,YAAY,GAAG;GACxB,IAAI,SAAS,KAAK,GAChB,UAAU,MAAM,KAAK,KAAK;EAE9B;EACA,IAAI,KAAK,qBAAqB,SAAS,GACrC,KAAK,yBAAyB,KAAK;EAErC,IAAI,KAAK,sBAAsB,SAAS,GACtC,KAAK,0BAA0B,KAAK;EAEtC,IAAI,KAAK,kBAAkB,SAAS,GAClC,KAAK,sBAAsB,KAAK;EAElC,KAAK,cAAc,KAAK;EACxB,IAAI,KAAK,YAAY;GACnB,KAAK,UAAU,KAAK;GACpB,KAAK,qBAAqB,CAAC,GAAG,KAAK,iBAAiB;EACtD;EACA,OAAO;CACT;;CAGA,IAAI,OAAgC;EAClC,MAAM,OAAO,gBAAgB,KAAK,UAAU;EAC5C,IAAI,KAAK,SAAS,QAAQ,KAAK,MAC7B,KAAK,OAAO,aAAa,KAAK,IAAI;EAEpC,OAAO;CACT;;CAGA,IAAI,UAAuC;EACzC,MAAM,wBAAQ,IAAI,IAAoB;EACtC,KAAK,MAAM,OAAO,KAAK,QAAQ,KAAK,GAClC,IAAI,CAAC,MAAM,IAAI,IAAI,YAAY,CAAC,GAC9B,MAAM,IAAI,IAAI,YAAY,GAAG,GAAG;EAGpC,MAAM,UAAuC,CAAC;EAC9C,KAAK,MAAM,QAAQ,MAAM,OAAO,GAC9B,UAAU,SAAS,MAAM,KAAK,YAAY,IAAI,CAAC;EAEjD,OAAO;CACT;AACF;;AAGA,SAAgB,UACd,QACA,KACA,OACM;CACN,OAAO,eAAe,QAAQ,KAAK;EACjC;EACA,YAAY;EACZ,UAAU;EACV,cAAc;CAChB,CAAC;AACH;AAEA,SAAS,SAAS,OAAyB;CACzC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,SAAS;CAExB,OAAO,QAAQ,KAAK;AACtB;;;;;;;;AC3uBA,SAAgB,aAAa,MAA0B;CACrD,MAAM,QAAQ,SAAS,MAAM,OAAO;CACpC,MAAM,iBAAiB,MAAM,SAAS;CACtC,IAAI,mBAAmB,GACrB,OAAO,UAAU,KAAK;CAExB,MAAM,SAAS,IAAI,WAAW,MAAM,SAAS,IAAI,cAAc,CAAC,CAAC,KAAK,EAAI;CAC1E,OAAO,IAAI,OAAO,CAAC;CACnB,OAAO,UAAU,MAAM;AACzB;;;;;AAMA,SAAgB,kBACd,iBACc;CACd,MAAM,OAAO,gBAAgB;CAC7B,MAAM,cAAc,SAAS,KAAK,OAAQ,QAAQ;CAClD,MAAM,UAAU,gBAAgB,MAAM;CACtC,MAAM,eAAe,QAAQ,MAAM,GAAG;CACtC,IAAI,QAAuB;CAC3B,IAAI,SAAwB;CAC5B,IAAI,aAAa,SAAS,GAAG;EAC3B,SAAS,aAAa,MAAM,GAAA,CAAI,YAAY;EAC5C,UAAU,aAAa,GAAG,EAAE,KAAK,GAAA,CAAI,YAAY;CACnD;CACA,OAAO;EAAE;EAAa;EAAS;EAAO;CAAO;AAC/C;AAEA,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAM,sBAAsB;;;;;;AAM5B,MAAM,qBAAqB;AAE3B,MAAM,iBAAiB;AAKvB,MAAM,wBAAwB;AAE9B,MAAM,eAAe;AACrB,MAAM,gBAAgB;AACtB,MAAM,kBAAkB;;AAGxB,SAAS,WAAW,WAA2B;CAC7C,IAAI,aAAa,cACf,OAAO;CAET,IAAI,aAAa,eACf,OAAO;CAET,OAAO,aAAa,kBAAkB,IAAI;AAC5C;;AAGA,SAAS,aAAa,MAAc,UAA0B;CAC5D,IAAI,QAAQ;CACZ,IAAI,MAAM;CACV,KAAK,MAAM,QAAQ,MAAM;EACvB,SAAS,WAAW,KAAK,YAAY,CAAC,KAAK,CAAC;EAC5C,IAAI,QAAQ,UACV,OAAO,KAAK,MAAM,GAAG,GAAG;EAE1B,OAAO,KAAK;CACd;CACA,OAAO;AACT;;;;;;;;;;;;;;AAeA,SAAgB,sBAAsB,OAA8B;CAClE,IAAI,OAAO,SAAS;CACpB,KAAK,MAAM,QAAQ,wBACjB,OAAO,KAAK,WAAW,MAAM,EAAE;CAEjC,OAAO,KAAK,WAAW,uBAAuB,EAAE;CAEhD,IAAI,MAAM,IAAI,IAAI,qBAChB,OAAO,aAAa,MAAM,mBAAmB;CAE/C,OAAO,aAAa,KAAK,WAAW,gBAAgB,EAAE,GAAG,kBAAkB;CAC3E,OAAO,SAAS,MAAM,IAAI;AAC5B;AAGA,MAAM,aAAyD;CAC7D,QAAQ,CAAC,IAAI,mBAAmB;CAChC,QAAQ,CAAC,IAAI,gBAAgB;CAC7B,QAAQ,CAAC,GAAG,2BAA2B;CACvC,SAAS,CAAC,IAAI,iBAAiB;AACjC;AAEA,SAAS,YAAY,OAAgB,MAAsB;CACzD,IACE,iBAAiB,SACjB,UAAU,SACV,OAAO,MAAM,SAAS,UACtB;EACA,MAAM,QAAQ,WAAW,MAAM;EAC/B,IAAI,UAAU,KAAA,GACZ,OAAO,UAAU,MAAM,GAAG,IAAI,MAAM,GAAG,IAAIC,SAAO,IAAI;CAE1D;CACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAGA,eAAe,YAAY,MAAgC;CACzD,MAAM,SAAS,iBAAiB,IAAI;CACpC,IAAI,cAAc;CAClB,IAAI,QAAQ;CACZ,IAAI;EACF,WAAW,MAAM,SAAS,QAAQ;GAChC,MAAM,OAAO,QAAQ,OAAO,KAAK,KAAmB,CAAC,CAAC,SAAS,QAAQ;GACvE,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;IACnD,IAAI,eAAe,KAAK,WAAW,SAAS,KAAK,GAC/C,OAAO;IAET,IACE,eACA,QAAQ,IAAI,KAAK,UACjB,QAAQ,WAAW,KAAK,MAAM,KAAK,CAAC,GACpC;KACA,QAAQ,KAAK,MAAM,KAAK;KACxB;IACF;IACA,cAAc,KAAK,OAAO,KAAK,MAAM;IACrC,QAAQ;GACV;EACF;CACF,UAAU;EACR,OAAO,QAAQ;CACjB;CACA,OAAO;AACT;;;;;AAMA,eAAsB,OAAO,MAAgC;CAC3D,IAAI;EACF,OAAO,MAAM,YAAY,IAAI;CAC/B,SAAS,OAAO;EACd,OAAO,MAAM,iCAAiC,YAAY,OAAO,IAAI,GAAG;EACxE,OAAO;CACT;AACF;AAEA,MAAM,gBAAgB,WAAW,GAC/B,KACA,KACA,IACA,KACA,KACA,KACA,IACA,GACF;;AAGA,SAAgB,aAAa,SAA2B;CACtD,IACE,EAAE,mBAAmB,eACrB,QAAQ,SAAS,cAAc,QAE/B,OAAO;CAET,OAAO,cAAc,OAAO,MAAM,UAAU,QAAQ,WAAW,IAAI;AACrE;;AAGA,MAAa,wBAAwB;;AAGrC,IAAa,qBAAb,cAAwC,MAAM;CAC5C,OAAgB;AAClB;AAEA,MAAM,qBAAqB;;;;;AAM3B,SAAS,cAAc,KAA4B;CACjD,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,UAAU;EACd,IAAI,WAAW;EACf,MAAM,UAAU,UAA8B;GAC5C,IAAI,SACF;GAEF,UAAU;GACV,aAAa,KAAK;GAClB,IAAI,UAAU,MACZ,QAAQ;QAER,OAAO,KAAK;EAEhB;EACA,MAAM,QAAQ,MAAM,cAAc,CAAC,YAAY,GAAG;GAChD;GACA,OAAO;GACP,aAAa;EACf,CAAC;EACD,MAAM,QAAQ,iBAAiB;GAC7B,WAAW;GACX,MAAM,KAAK,SAAS;EACtB,GAAG,qBAAqB;EACxB,MAAM,KAAK,UAAU,UAAiC;GACpD,IAAI,MAAM,SAAS,UAAU;IAC3B,OACE,IAAI,iBACF,6DACF,CACF;IACA;GACF;GACA,OAAO,KAAK;EACd,CAAC;EACD,MAAM,KACJ,UACC,MAAqB,WAAkC;GACtD,IAAI,UACF,OACE,IAAI,iBACF,mEAAmE,wBAAwB,IAAK,EAClG,CACF;QACK,IAAI,WAAW,MAAM;IAC1B,MAAM,SAASC,YAAY,QAAQ;IACnC,OACE,IAAI,mBACF,YAAY,mBAAmB,uBAAuB,OAAO,IAAI,OAAO,GAC1E,CACF;GACF,OAAO,IAAI,SAAS,GAClB,OAAO,IAAI;QAEX,OACE,IAAI,mBACF,YAAY,mBAAmB,kCAAkC,OAAO,IAAI,EAAE,EAChF,CACF;EAEJ,CACF;CACF,CAAC;AACH;;;;;;;;;;;AAYA,eAAsB,kBACpB,UACA,UAAU,GACW;CACrB,IAAI,CAAC,aAAa,QAAQ,GACxB,MAAM,IAAIC,eAAa,gDAAgD;CAEzE,MAAM,SAAS,MAAM,QAAQ,KAAK,KAAK,OAAO,GAAG,UAAU,CAAC;CAC5D,IAAI;EACF,MAAM,UAAU,KAAK,KAAK,QAAQ,YAAY,GAAG,QAAQ;EACzD,MAAM,cAAc,MAAM;EAC1B,MAAM,YAAY,KAAK,KAAK,QAAQ,YAAY;EAChD,IAAI;GACF,IAAI,UAAU,GAAG;IACf,MAAM,EAAE,SAAS,MAAM,KAAK,SAAS;IACrC,IAAI,OAAO,SACT,MAAM,mBAAmB,MAAM,OAAO;GAE1C;GACA,OAAO,IAAI,WAAW,MAAM,SAAS,SAAS,CAAC;EACjD,SAAS,OAAO;GACd,IAAK,MAAgC,SAAS,UAC5C,MAAM,IAAI,iBACR,6DACF;GAEF,MAAM;EACR;CACF,UAAU;EACR,MAAM,GAAG,QAAQ;GAAE,WAAW;GAAM,OAAO;EAAK,CAAC;CACnD;AACF;AAYA,SAAS,SAAS,OAAiC;CACjD,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,aAAa,OAAwB;CAC5C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;;;AAMA,SAAS,YACP,QACA,yBACQ;CACR,MAAM,UAAU,OAAO;CACvB,MAAM,SAAS,OAAO;CACtB,OAAO,UAAU;CAEjB,IAAI,MAAM,QAAQ,OAAO,QAAQ,GAC1B;OAAA,MAAM,YAAY,OAAO,UAC5B,IAAI,cAAc,UAAU;GAC1B,IAAI,SAAS,aAAa,MACxB,OAAO,SAAS;QAEhB,SAAS,WAAW,OAAO,SAAS,QAAQ,CAAC,CAAC,WAAW,KAAK,GAAG;EAErE;;CAIJ,IAAI,EAAE,UAAU,SAAS;EAGvB,MAAM,aAAc,QAAmB;EACvC,OAAO,OAAO,cAAc,UAAU,IAAI,aAAa;CACzD;CACA,IAAI,OAAO,SAAS,QAAQ,OAAO,SAAS,KAAA,GAAW;EACrD,MAAM,QAAS,OAAO,KAAmB;EACzC,OAAO,OAAO,kBAAkB,KAAyB;CAC3D;CAEA,OAAO,OACL,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,WAAW,KAAK,GAAG,IAAI;CAGvE,IAAI,cAAc,QAAQ;EACxB,OAAO,WAAY,OAAO,WAAW,CAAwB,IAC3D,iBACF;EACA,OAAO,OAAO;CAChB,OACE,OAAO,WAAW,CAAC;CAErB,KAAK,MAAM,OAAO;EAAC;EAAM;EAAM;CAAK,GAClC,OAAO,OACL,OAAO,SACF,OAAO,IAAI,CAAwB,IAAI,iBAAiB,IACzD,CAAC;CAET,IAAI,kBAAkB,QAAQ;EAC5B,OAAO,eAAgB,OAAO,eAAe,CAAwB,IACnE,iBACF;EACA,OAAO,OAAO;CAChB;CAEA,IAAI,iBAAiB,QAAQ;EAC3B,MAAM,cAAc,OAAO;EAC3B,KAAK,MAAM,cAAc,aAAa;GACpC,IAAI,EAAE,aAAa,aACjB;GAEF,MAAM,UAAU,OAAO,WAAW,OAAO;GACzC,IAAI;IACF,MAAM,QACJ,WAAW,8BAA8B,WACrC,aAAa,OAAO,IACpB,SAAS,SAAS,OAAO;IAC/B,WAAW,SAAS,WAAW,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,KAAK;GACrE,SAAS,OAAO;IACd,OAAO,MAAM,gCAAgC,aAAa,KAAK,GAAG;GACpE;EACF;EACA,IAAI,yBACF,KAAK,MAAM,cAAc,aACvB,OAAO,WAAW;CAGxB,OACE,OAAO,cAAc,CAAC;CAGxB,IAAI,EAAE,aAAa,SACjB,OAAO,UAAU;CAEnB,IAAI,MAAM,QAAQ,OAAO,OAAO,GAG9B,MAAM,IAAI,UAAU,0CAA0C;CAEhE,OAAO,wBAAwB,sBAC7B,OAAO,YAAY,OAAO,OAAO,OAAO,OAAO,OAAO,CACxD;CACA,IAAI,EAAE,UAAU,SACd,OAAO,OAAO;CAEhB,OAAO;AACT;AAEA,SAAS,cAAc,OAAyB;CAC9C,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,SAAS;CAExB,OAAO,QAAQ,KAAK;AACtB;AAIA,MAAM,iBAAmD;CACvD,wBAAwB;CACxB,qBAAqB;CACrB,oBAAoB;CACpB,cAAc;CACd,uBAAuB;CACvB,aAAa;CACb,yBAAyB;CACzB,UAAU;CACV,YAAY;AACd;AACA,MAAM,gBAAkD;CACtD,UAAU;CACV,eAAe;CACf,iBAAiB;AACnB;AACA,MAAM,kBAAoD;CACxD,2BAA2B;CAC3B,mBAAmB;CACnB,eAAe;AACjB;AACA,MAAM,iBAAmD,EACvD,cAAc,cAChB;AAEA,SAAS,WACP,OACA,SACS;CACT,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO;CAET,MAAM,SAAiB,CAAC;CACxB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAC7C,UACE,QACA,OAAO,OAAO,SAAS,GAAG,IAAK,QAAQ,QAAQ,MAAO,KACtD,KACF;CAEF,OAAO;AACT;AAEA,SAAS,WAAW,QAA6B;CAC/C,MAAM,SAAiB,CAAC;CACxB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;EACjD,IAAI,YAAY;EAChB,IAAI,QAAQ,cAAc,MAAM,QAAQ,KAAK,GAC3C,YAAY,MAAM,KAAI,QAAO,WAAW,KAAK,aAAa,CAAC;OACtD,IAAI,QAAQ,iBAAiB,MAAM,QAAQ,KAAK,GACrD,YAAY,MAAM,KAAI,eACpB,WAAW,YAAY,eAAe,CACxC;OACK,IAAI,QAAQ,4BAA4B,MAAM,QAAQ,KAAK,GAChE,YAAY,MAAM,KAAI,WAAU;GAC9B,MAAM,UAAU,WAAW,QAAQ,CAAC,CAAC;GACrC,IAAI,MAAM,QAAQ,QAAQ,UAAU,GAClC,QAAQ,aAAa,QAAQ,WAAW,KAAI,cAC1C,WAAW,WAAW,cAAc,CACtC;GAEF,OAAO;EACT,CAAC;EAKH,UAAU,QAHK,OAAO,OAAO,gBAAgB,GAAG,IAC3C,eAAe,QAAQ,MACxB,KACsB,SAAS;CACrC;CACA,OAAO;AACT;;;;;;;;;AAUA,eAAsBC,aACpB,MACA,UAA6B,CAAC,GACR;CACtB,IAAI;CACJ,IAAI,OAAO,SAAS,YAAY,EAAE,gBAAgB,aAEhD,MAAM,IAAI,UACR,0CAA0C,OAAO,MACnD;CAEF,IAAI,OAAO,SAAS,UAGlB,OAAO,KAAK,aAAa;MAGzB,OAAO,SADO,aAAa,IAAI,IAAI,MAAM,kBAAkB,IAAI,IAAI,MAC5C,SAAS,SAAS;CAE3C,OAAO,eAAe,MAAM,OAAO;AACrC;;;;;AAMA,SAAgB,eACd,MACA,UAA6B,CAAC,GACjB;CAEb,OAAO,WACL,YAFa,WAAW,WAAW,MAAM,QAAQ,MAEhC,GAAG,QAAQ,2BAA2B,KAAK,CAC9D;AACF;;;;;;ACzkBA,MAAa,6BAAgD;CAC3D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AASA,MAAM,wBACJ;AAGF,MAAM,gBAAgB,IAAI,OAAO,IAAI,YAAY,IAAI,GAAG;AAExD,MAAM,mBAAsC;CAC1C;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,kBAAqC;CACzC;CACA;CACA;CACA;AACF;;AAGA,MAAa,qBAAwC;CACnD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AASA,SAAS,eAAe,OAAyB;CAC/C,OAAO,MACJ,MAAM,GAAG,CAAC,CACV,KAAI,UAAS,QAAQ,KAAK,CAAC,CAAC,CAC5B,QAAO,UAAS,UAAU,EAAE;AACjC;;AAGA,SAAS,SAAS,QAA8B,KAAsB;CACpE,IAAI,CAAC,OAAO,IAAI,GAAG,GACjB,MAAM,IAAI,SAAS,GAAG;CAExB,OAAO,OAAO,IAAI,GAAG;AACvB;;AAGA,SAAS,2BAA2B,QAAoC;CAItE,IAAI,OAAO,IAAI,oBAAoB,GAAG;EACpC,MAAM,eAAe,QAAQ,OAAO,OAAO,IAAI,oBAAoB,CAAC,CAAC;EACrE,OAAO,IACL,6BACA,aAAa,YAAY,MAAM,SAAS,CAAC,IAAI,eAAe,YAAY,CAC1E;EACA,OAAO,OAAO,oBAAoB;CACpC,OAAO;EACL,OAAO,QACL,+GAEF;EACA,OAAO,IAAI,6BAA6B,CAAC,CAAC;CAC5C;CAGA,IAAI,CAAC,OAAO,IAAI,cAAc,GAAG;EAC/B,OAAO,QACL,2FAEF;EACA,OAAO,IAAI,gBAAgB,OAAO;CACpC;CACA,OAAO,IACL,gBACA,eAAe,OAAO,OAAO,IAAI,cAAc,CAAC,CAAC,CACnD;CAIA,IAAI,CAAC,OAAO,IAAI,eAAe,GAAG;EAChC,OAAO,QACL,qGAEF;EACA,OAAO,IAAI,iBAAiB,cAAc;CAC5C;CAGA,IAAI,CAAC,OAAO,IAAI,wBAAwB,GAAG;EACzC,OAAO,QACL,oGAEF;EACA,OAAO,IAAI,0BAA0B,IAAI;CAC3C;CAEA,KAAK,MAAM,iBAAiB,iBAC1B,IAAI,CAAC,OAAO,IAAI,aAAa,GAC3B,OAAO,IAAI,eAAe,IAAI;AAGpC;AAEA,SAAS,wBAAwB,QAAoC;CACnE,IAAI,OAAO,IAAI,iBAAiB,GAAG;EACjC,MAAM,QAAQ,OAAO,OAAO,IAAI,iBAAiB,CAAC,CAAC,CAAC,YAAY;EAChE,MAAM,QAAQ,iBAAiB,MAAK,WAAU,MAAM,SAAS,MAAM,CAAC;EACpE,IAAI,UAAU,KAAA,GACZ,OAAO,IAAI,mBAAmB,KAAK;CAEvC,OACE,OAAO,IAAI,mBAAmB,IAAI;CAEpC,IAAI,CAAC,iBAAiB,SAAS,OAAO,IAAI,iBAAiB,CAAW,GACpE,OAAO,IAAI,mBAAmB,OAAO;AAEzC;;AAGA,SAAS,iBAAiB,cAA0C;CAClE,MAAM,aAAsB,aAAa;CACzC,IAAI,OAAO,eAAe,YAAY,eAAe,MACnD,OAAO;CAET,MAAM,SAAU,WAAoC;CACpD,OAAO,OAAO,WAAW,YAAY,WAAW,KAAK,SAAS;AAChE;AAEA,eAAe,mBACb,gBACA,QACA,SACA,SACwB;CACxB,MAAM,SAAS,oBAAoB,OAAO;CAG1C,MAAM,yBAAS,IAAI,IAAqB;CACxC,KAAK,MAAM,SAAS,eAAe,SAAS,qBAAqB,GAAG;EAClE,MAAM,GAAG,OAAO,IAAI,QAAQ,MAAM;EAClC,OAAO,IAAI,KAAK,YAAY,CAAC,CAAC,WAAW,KAAK,GAAG,GAAG,KAAK;CAC3D;CAEA,IAAI,CAAC,OAAO,IAAI,cAAc,GAAG;EAC/B,IAAI,YAAY,MACd,MAAM,IAAI,qBAAqB,qCAAqC;EAEtE,OAAO,IAAI,gBAAgB,QAAQ,UAAU,CAAC;CAChD;CACA,IAAI,CAAC,OAAO,IAAI,SAAS,GACvB,OAAO,IAAI,WAAW,IAAI;CAE5B,IAAI,CAAC,OAAO,IAAI,YAAY,GAC1B,OAAO,IAAI,cAAc,IAAI;CAE/B,wBAAwB,MAAM;CAE9B,MAAM,aAAa,yBACjB,OAAO,OAAO,IAAI,cAAc,CAAC,GACjC,EAAE,OAAO,KAAK,CAChB;CACA,OAAO,IAAI,oBAAoB,WAAW,SAAS,mBAAmB,CAAC;CAGvE,MAAM,YADW,OAAO,SAAS,QAAQ,WAAW,CAC3B,CAAC,CAAC,MAAM,aAAa,CAAC,CAAC,MAAM;CACtD,OAAO,IAAI,UAAU,MAAM,iBAAiB,WAAW,EAAE,OAAO,CAAC,CAAC;CAClE,OAAO,OAAO,WAAW;CAEzB,2BAA2B,MAAM;CAEjC,MAAM,eAAe,MAAMC,aAAW,QAAQ;EAC5C,yBAAyB,OAAO;EAChC,QAAQ;CACV,CAAC;CAED,IAAI,CAAC,OAAO,IAAI,iBAAiB,GAAG;EAGlC,MAAM,SAAS,iBAAiB,YAAY;EAC5C,IAAI,WAAW,MACb,MAAM,IAAI,qBACR,oIAGF;EAEF,OAAO,IAAI,mBAAmB,MAAM;CACtC;CAEA,MAAM,oBACJ,aAAa,YAAY,SAAS,KAAK,aAAa,SAAS;CAC/D,IAAI,qBAAqB,aAAa,YAAY;EAChD,OAAO,aAAa;EACpB,OAAO,aAAa;EACpB,OAAO,aAAa;CACtB;CACA,OAAO,IAAI,uBAAuB,iBAAiB;CACnD,OAAO,IAAI,UAAU,MAAM;CAC3B,OAAO,IAAI,iBAAiB,YAAY;CAExC,MAAM,SAAkC,CAAC;CACzC,KAAK,MAAM,CAAC,KAAK,UAAU,QACzB,OAAO,QAAQ,aAAa,GAAG,GAAG,KAAK;CAEzC,OAAO;AACT;;;;;;;;;AAUA,eAAsB,mBACpB,gBACA,QACA,SACA,UAAqC,CAAC,GACd;CACxB,IAAI;EACF,OAAO,MAAM,mBAAmB,gBAAgB,QAAQ,SAAS,OAAO;CAC1E,SAAS,OAAO;EACd,IAAI,iBAAiB,sBAEnB,MAAM;EAER,IAAI,iBAAiB,UACnB,MAAM,IAAI,qBAAqB,kBAAkB,MAAM,WAAW,EAChE,OAAO,MACT,CAAC;EAEH,MAAM,IAAI,qBACR,qBAAqBC,YAAU,KAAK,IAAI,UAAU,KAAK,KACvD,EAAE,OAAO,MAAM,CACjB;CACF;AACF;;AAGA,MAAa,sBACX;;;;;;AAOF,SAAgB,8BACd,SACU;CACV,MAAM,aAAa,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;CAC9D,MAAM,OAAiB,CAAC;CACxB,KAAK,MAAM,UAAU,YAAY;EAC/B,MAAM,MAAc,CAAC;EACrB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,OAAO,KAAK,aAAa,GAAG,GAAG,KAAK;EAEtC,MAAM,EAAE,WAAW;EACnB,IAAI,oBAAoB,OAAO;EAC/B,IAAI,qBAAqB,OAAO;EAChC,IAAI,qBAAqB,OAAO;EAChC,IAAI,cAAc,OAAO;EACzB,IAAI,cAAc,OAAO;EACzB,IAAI,aAAa,OAAO;EACxB,IAAI,iBAAiB,OAAO;EAC5B,IAAI,mBAAmB,OAAO;EAC9B,IAAI,iBAAiB,OAAO;EAC5B,OAAO,IAAI;EACX,IAAI,UAAU,OAAO,aAAa,WAAW;EAC7C,IAAI,eAAe,OAAO,YAAY,KAAK,GAAG;EAC9C,IAAI,4BAA4B,OAAO,yBAAyB,KAAK,GAAG;EACxE,OAAO,IAAI;EACX,OAAO,IAAI;EACX,KAAK,KAAK,GAAG;CACf;CACA,OAAO;AACT;;AAGA,MAAa,iCACX;;AAGF,SAAgB,0BACd,SACA,UAAsB,CAAC,GACf;CACR,MAAM,OAAO,8BAA8B,OAAO,CAAC,CAAC,KAAI,QAAO;EAC7D,MAAM,SAAiB,CAAC;EACxB,KAAK,MAAM,OAAO,oBAChB,OAAO,OAAO,QAAQ,OAAO,OAAO,KAAK,GAAG,IAAI,IAAI,OAAO,IAAI;EAEjE,OAAO;CACT,CAAC;CACD,OAAO,UAAU,oBAAoB,MAAM,OAAO;AACpD;;AAGA,MAAa,6BACX;;ACpVF,MAAM,mCAAwC,IAAI,IAAI;CACpD;CACA;CACA;AACF,CAAC;;;;;;AAOD,IAAa,eAAb,MAA0B;CACxB;CAEA,YAAY,MAAc;EACxB,KAAK,OAAO;CACd;AACF;AAEA,MAAM,gBAAkD;CACtD,MAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;CACN,KAAM;CACN,MAAM;CACN,MAAM;AACR;AAEA,MAAM,wBAAwB;AAC9B,MAAM,uBAAuB;AAE7B,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAE3B,SAAS,eAAe,MAAuB;CAC7C,OAAO,QAAQ,uBAAuB,QAAQ;AAChD;AAEA,SAAS,gBAAgB,MAAc,OAAwB;CAC7D,MAAM,OAAO,KAAK,WAAW,KAAK;CAClC,IAAI,OAAO,wBAAwB,OAAO,oBACxC,OAAO;CAET,IAAI,OAAO,qBACT,OAAO,CAAC,eAAe,KAAK,WAAW,QAAQ,CAAC,CAAC;CAEnD,MAAM,WAAW,KAAK,WAAW,QAAQ,CAAC;CAC1C,OAAO,EAAE,YAAY,wBAAwB,WAAW;AAC1D;;;;;AAMA,SAAS,oBAAoB,MAAsB;CACjD,IAAI,SAAS;CACb,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,KAAK,OAAO,KAAK;EAC9B,MAAM,OAAO,KAAK,WAAW,KAAK;EAClC,MAAM,QAAQ,cAAc;EAC5B,IAAI,UAAU,KAAA,GACZ,UAAU;OACL,IAAI,OAAO,yBAAyB,gBAAgB,MAAM,KAAK,GACpE,UAAU,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;OAEjD,UAAU;CAEd;CACA,OAAO,GAAG,OAAO;AACnB;;AAGA,SAAS,aAAa,MAAsB;CAC1C,IAAI,SAAS;CACb,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,KAAK,OAAO,KAAK;EAC9B,MAAM,OAAO,KAAK,WAAW,KAAK;EAClC,MAAM,QAAQ,cAAc;EAC5B,IAAI,UAAU,KAAA,GACZ,UAAU;OACL,IAAI,OAAO,yBAAyB,OAAO,sBAChD,UAAU,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;OAEjD,UAAU;CAEd;CACA,OAAO,GAAG,OAAO;AACnB;AAEA,SAAS,aAAa,OAAuB;CAC3C,IAAI,OAAO,MAAM,KAAK,GACpB,OAAO;CAET,IAAI,CAAC,OAAO,SAAS,KAAK,GACxB,OAAO,QAAQ,IAAI,aAAa;CAIlC,OAAO,OAAO,UAAU,KAAK,IACzB,OAAO,KAAK,CAAC,CAAC,SAAS,IACvB,YAAY,KAAK;AACvB;AAEA,SAAS,cAAc,OAAiD;CACtE,MAAM,YAAqB,OAAO,eAAe,KAAK;CACtD,OAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAEA,SAAS,SAAS,OAAwB;CACxC,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO,MAAM,aAAa,QAAQ;CAEpC,OAAO,OAAO;AAChB;;AAGA,SAAgB,YACd,OACA,UAA8B,CAAC,GACvB;CACR,MAAM,SAAS,QAAQ,UAAU;CAEjC,MAAM,CAAC,eAAe,gBACpB,QAAQ,eAAe,WAAW,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI;CACpE,MAAM,aACH,QAAQ,eAAe,OAAQ,eAAe;CAGjD,MAAM,gBAAgB,SAA0C;EAC9D,IAAI,UAAU;EACd,SAAS;GACP,IAAI,YAAY,QAAQ,YAAY,KAAA,GAClC,OAAO;GAET,IAAI,YAAY,MACd,OAAO;GAET,IAAI,YAAY,OACd,OAAO;GAET,IAAI,OAAO,YAAY,UACrB,OAAO,WAAW,OAAO;GAE3B,IAAI,OAAO,YAAY,UACrB,OAAO,QAAQ,mBAAmB,CAAC,OAAO,SAAS,OAAO,IACtD,SACA,aAAa,OAAO;GAE1B,IAAI,OAAO,YAAY,UACrB,OAAO,QAAQ,SAAS;GAE1B,IAAI,mBAAmB,cACrB,OAAO,QAAQ,mBAAmB,iBAAiB,IAAI,QAAQ,IAAI,IAC/D,SACA,QAAQ;GAEd,IAAI,MAAM,QAAQ,OAAO,GACvB,OAAO;IACL,OAAO;IACP,SAAS,QAAQ,KAAK,UAA6B,CAAC,IAAI,KAAK,CAAC;IAC9D,OAAO;IACP,MAAM;GACR;GAEF,IAAI,OAAO,YAAY,YAAY,cAAc,OAAO,GACtD,OAAO;IACL,OAAO;IACP,SAAS,OAAO,QAAQ,OAAO,CAAC,CAAC,KAC9B,CAAC,KAAK,WAA8B,CACnC,GAAG,WAAW,GAAG,IAAI,gBACrB,KACF,CACF;IACA,OAAO;IACP,MAAM;GACR;GAEF,IAAI,QAAQ,YAAY,KAAA,GACtB,MAAM,IAAI,YACR,kBAAkB,SAAS,OAAO,EAAE,0BACtC;GAEF,UAAU,QAAQ,QAAQ,OAAO;EACnC;CACF;CAIA,MAAM,MAAgB,CAAC;CACvB,MAAM,QAAyB,CAAC;CAChC,MAAM,WAAW,UAAwB;EACvC,IAAI,WAAW,MACb,IAAI,KAAK,KAAK,IAAI,OAAO,SAAS,KAAK,GAAG;CAE9C;CACA,MAAM,SAAS,YAA0C;EACvD,IAAI,OAAO,YAAY,UACrB,IAAI,KAAK,OAAO;OACX,IAAI,QAAQ,QAAQ,WAAW,GACpC,IAAI,KAAK,GAAG,QAAQ,OAAO,QAAQ,OAAO;OACrC;GACL,IAAI,KAAK,QAAQ,IAAI;GACrB,MAAM,KAAK,OAAO;EACpB;CACF;CACA,MAAM,aAAa,KAAK,CAAC;CACzB,KAAK,IAAI,QAAQ,MAAM,GAAG,EAAE,GAAG,OAAO,QAAQ,MAAM,GAAG,EAAE,GAAG;EAC1D,MAAM,QAAQ,MAAM,QAAQ,MAAM;EAClC,IAAI,UAAU,KAAA,GAAW;GACvB,MAAM,IAAI;GACV,QAAQ,MAAM,MAAM;GACpB,IAAI,KAAK,MAAM,KAAK;GACpB;EACF;EACA,IAAI,MAAM,QAAQ,GAChB,IAAI,KAAK,aAAa;EAExB,MAAM,SAAS;EACf,QAAQ,MAAM,MAAM;EACpB,IAAI,KAAK,MAAM,EAAE;EACjB,MAAM,aAAa,MAAM,EAAE,CAAC;CAC9B;CACA,OAAO,IAAI,KAAK,EAAE;AACpB;;AAYA,MAAM,gBAAgB;;;;;;;;;AAYtB,SAAgB,gBAAgB,OAAyB;CACvD,IAAI,OAAO,UAAU,UACnB,OAAO,cAAc,QAAQ,MAAM,SAAS,CAAC;CAE/C,IAAI,iBAAiB,cACnB,OAAO,cAAc,QAAQ,MAAM,IAAI;CAEzC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,KAAI,SAAQ,gBAAgB,IAAI,CAAC;CAEhD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,cAAc,KAAK,GAAG;EACvE,MAAM,SAAkC,CAAC;EACzC,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,GAC5C,OAAO,QAAQ,KAAK,gBAAgB,IAAI,CAAC;EAE3C,OAAO;CACT;CACA,OAAO;AACT;;;;;;;;;;AC/OA,SAAgB,WACd,UACA,UACA,QACA,eACM;CACN,uBAAuB,QAAQ,aAAa;CAC5C,IAAI,SAAS,WAAW,GAAG;EACzB,iBAAiB,UAAU,IAAI;EAC/B;CACF;CACA,KAAK,MAAM,WAAW,UACpB,iBAAiB,UAAU,OAAO;AAEtC;;AAqBA,SAAgB,qBAAqB,QAAoC;CACvE,OAAO;EAAE,MAAM;EAAuB;CAAO;AAC/C;;AAGA,SAAgB,oBAAoB,QAAoC;CACtE,OAAO;EAAE,MAAM;EAAsB;CAAO;AAC9C;AASA,SAAS,WAAW,MAA8B;CAChD,OAAO;EACL,QAAQ,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;EAC5C,MAAM,KAAK;EACX,aAAa,KAAK,SAAS,oBAAoB,KAAK,MAAM,IAAI;CAChE;AACF;;;;;AASA,eAAsB,YACpB,MACA,KACA,UACkB;CAClB,IAAI;CACJ,IAAI,KAAK,WAAW,MAClB,KAAK,OAAO,OAAO,UAAU,KAAK,IAAI,IAAI,SAAS,KAAK,QAAQ,KAAA;MAMhE,MAAK,OAJa,KAAK,WAAW,KAAK,MAAM,IAAA,OACzC,cAAc,KAAK,MAAM,CAAC,CAAC,QAAA,OAC3B,KAAK,SAAA,CAEK,KAAK;CAErB,IAAI,OAAO,OAAO,YAChB,MAAM,IAAI,UACR,GAAG,KAAK,UAAU,UAAU,6BAA6B,KAAK,MAChE;CAEF,MAAM,MAAM;CACZ,IAAI,KAAK,gBAAgB,MACvB,OAAO,IAAI,GAAG;CAEhB,OAAO,IAAI,KAAK,EAAE,QAAQ,sBAAsB,KAAK,WAAW,EAAE,CAAC;AACrE;;AAsBA,SAAgB,yBACd,QACmB;CACnB,MAAM,MAAM,QAAQ;CACpB,OAAO;EACL,UAAU,YAAY;EACtB,gBAAgB,YAAY;EAC5B,cAAc,CAAC,GAAG,YAAY;EAC9B,eAAe,OAAO,IAAI,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI;CAClD;AACF;;;;;;AAOA,SAAgB,uBACd,OACA,eACM;CACN,IAAI,MAAM,aAAa,MACrB,YAAY,WAAW,MAAM;CAE/B,YAAY,iBAAiB,MAAM;CACnC,aAAa,OAAO,GAAG,aAAa,QAAQ,GAAG,MAAM,YAAY;CACjE,IAAI,MAAM,kBAAkB,MAAM;EAChC,cAAc,MAAM;EACpB,KAAK,MAAM,CAAC,KAAK,UAAU,MAAM,eAC/B,cAAc,IAAI,KAAK,KAAK;CAEhC;AACF;AAIA,MAAM,gBACJ;CACE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,YAAA;AACF;AAEF,MAAM,kBAAkB;AA4BxB,SAAgB,YAAY,OAAgB,QAAQ,GAAiB;CACnE,IAAI,EAAE,iBAAiB,QACrB,OAAO;EACL,MAAM;EACN,SAAS,OAAO,KAAK;EACrB,OAAO;EACP,OAAO;EACP,MAAM;CACR;CAEF,MAAM,OAAQ,MAA6B;CAC3C,OAAO;EACL,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,OAAO,MAAM,SAAS;EACtB,OACE,MAAM,UAAU,KAAA,KAAa,QAAQ,kBACjC,YAAY,MAAM,OAAO,QAAQ,CAAC,IAClC;EACN,MAAM,OAAO,SAAS,WAAW,OAAO;CAC1C;AACF;AAEA,SAAgB,YAAY,SAA8B;CACxD,MAAM,aAAa,OAAO,OAAO,eAAe,QAAQ,IAAI,IACxD,cAAc,QAAQ,QACtB,KAAA;CACJ,MAAM,QAAQ,aACV,IAAI,WAAW,QAAQ,OAAO,IAC9B,IAAI,MAAM,QAAQ,OAAO;CAC7B,IAAI,MAAM,SAAS,QAAQ,MACzB,MAAM,OAAO,QAAQ;CAEvB,IAAI,QAAQ,UAAU,MACpB,MAAM,QAAQ,QAAQ;CAExB,IAAI,QAAQ,UAAU,MACpB,MAAM,QAAQ,YAAY,QAAQ,KAAK;CAEzC,IAAI,QAAQ,SAAS,MACnB,MAA6B,OAAO,QAAQ;CAE9C,OAAO;AACT;AAEA,SAAS,aACP,OACA,MACA,UACM;CACN,IAAI,iBAAiB,OAAO;EAC1B,SAAS,KAAK;GAAE,MAAM,CAAC,GAAG,IAAI;GAAG,OAAO,YAAY,KAAK;EAAE,CAAC;EAC5D;CACF;CACA,IAAI,iBAAiB,YAAY;EAC/B,SAAS,KAAK;GAAE,MAAM,CAAC,GAAG,IAAI;GAAG,UAAU,MAAM,OAAO;EAAE,CAAC;EAC3D;CACF;CACA,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;EAC/C,MAAM,WAAW,YAAY,KAAK;EAClC,IAAI,aAAa,MACf,SAAS,KAAK;GAAE,MAAM,CAAC,GAAG,IAAI;GAAG;EAAS,CAAC;CAE/C;CACA,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,KAAK,MAAM,CAAC,OAAO,SAAS,MAAM,QAAQ,GAAG;GAC3C,KAAK,KAAK,KAAK;GACf,aAAa,MAAM,MAAM,QAAQ;GACjC,KAAK,IAAI;EACX;EACA;CACF;CACA,IACE,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,YAAY,OAAO,KAAK,GACzB;EACA,IAAI,iBAAiB,KACnB;EAEF,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,GAAG;GAC/C,KAAK,KAAK,GAAG;GACb,aAAa,MAAM,MAAM,QAAQ;GACjC,KAAK,IAAI;EACX;CACF;AACF;;AAGA,SAAgB,YAAY,OAA8B;CACxD,MAAM,WAA2B,CAAC;CAClC,aAAa,OAAO,CAAC,GAAG,QAAQ;CAChC,OAAO;EAAE;EAAO;CAAS;AAC3B;AAEA,SAAS,QAAQ,MAAe,WAAyC;CACvE,IAAI,UAAU;CACd,KAAK,MAAM,OAAO,WAChB,UAAW,QAA6C;CAE1D,OAAO;AACT;;AAGA,SAAgB,YAAY,SAAgC;CAC1D,IAAI,EAAE,UAAU;CAChB,KAAK,MAAM,WAAW,QAAQ,UAAU;EACtC,IAAI,QAAQ,UAAU;GACpB,MAAM,SAAS,QAAQ,OAAO,QAAQ,IAAI;GAC1C,IAAI,OAAO,WAAW,YAAY,WAAW,MAC3C,gBAAgB,QAAQ,QAAQ,QAAQ;GAE1C;EACF;EACA,IAAI;EACJ,IAAI,QAAQ,OACV,UAAU,YAAY,QAAQ,KAAK;OAC9B,IAAI,QAAQ,UACjB,UAAU,IAAI,WAAW,QAAQ,QAAQ;OAEzC;EAEF,IAAI,QAAQ,KAAK,WAAW,GAAG;GAC7B,QAAQ;GACR;EACF;EACA,IAAI,SAAS;EACb,KAAK,MAAM,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,GACxC,SAAS,OAAO;EAElB,MAAM,OAAO,QAAQ,KAAK,GAAG,EAAE;EAC/B,OAAO,QAAQ;CACjB;CACA,OAAO;AACT;;;;;AA2BA,IAAa,oBAAb,cAAuC,MAAM;CAC3C,OAAgB;AAClB;;;;;;;;AASA,IAAa,qBAAb,cAAwC,MAAM;CAC5C,OAAgB;AAClB;;AAGA,IAAa,kBAAb,cAAqC,MAAM;CACzC,OAAgB;AAClB;AAEA,MAAM,sBACJ;AAEF,MAAM,iBAAiB,YAAY,IAAI,SAAS,KAAK;;AAGrD,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;AAuBzB,MAAM,sBAAsB;AAE5B,SAAS,aAAa,MAAkB,QAAuC;CAC7E,MAAM,iBAAiB,WAAW,OAAO,CAAC,IAAI,EAAE,gBAAgB,OAAO;CACvE,IAAI,gBAAgB;EAClB,MAAM,QAAQ,IAAI,IAAI,qBAAqB,YAAY,GAAG;EAE1D,IAD+B,SAAS,cAAc,UAAU,YAE9D,OAAO,IAAI,OAAO,OAAO;GAAE,YAAY;GAAM,GAAG;EAAe,CAAC;EAElE,OAAO,IAAI,OAAO,kBAAkB;GAClC,MAAM;GACN,YAAY;IAAE,GAAG;IAAM,OAAO,MAAM;GAAK;GACzC,GAAG;EACL,CAAC;CACH;CAIA,OAAO,IAAI,OAAO,IAAI,IAAI,wBAAwB,YAAY,GAAG,GAAG;EAClE,YAAY;EACZ,GAAG;CACL,CAAC;AACH;AAqBA,MAAM,gBAAgB;;AAGtB,MAAM,0BAA0B;;AAEhC,MAAM,2BAA2B;;;;;;;;;;AAWjC,SAAgB,kBAAkB,iBAAiC;CACjE,OAAO,KAAK,IACV,GACA,KAAK,IACH,yBACA,KAAK,MAAM,kBAAkB,wBAAwB,CACvD,CACF;AACF;AAEA,IAAM,aAAN,MAAiB;CACf;CACA;CACA;CACA;CACA,UAAyC,CAAC;CAC1C,QAAqC,CAAC;CACtC,SAAiB;CACjB,SAA+B;CAC/B,UAAkB;CAElB,YACE,MACA,MACA,YACA,iBACA;EACA,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK,eACH,eAAe,QAAQ,aAAa,IAAI,aAAa,gBAAgB;EACvE,KAAK,iBACH,oBAAoB,QAAQ,kBAAkB,IAC1C;GACE,wBAAwB;GACxB,0BAA0B,kBAAkB,eAAe;EAC7D,IACA;CACR;CAEA,OAAO,KAAwB;EAC7B,IAAI;EACJ,IAAI;EACJ,MAAM,UAAU,IAAI,SAAkB,gBAAgB,kBAAkB;GACtE,UAAU;GACV,SAAS;EACX,CAAC;EAED,QAAQ,YAAY,KAAA,CAAS;EAC7B,MAAM,OAAiB;GACrB,IAAI,KAAK;GACT;GACA,OAAO;GACP;GACA;GACA;EACF;EACA,KAAK,UAAU;EACf,IAAI,KAAK,QAAQ;GACf,KAAK,QAAQ;GACb,OAAO,KAAK,MAAM;GAClB,OAAO;EACT;EACA,KAAK,MAAM,KAAK,IAAI;EACpB,KAAK,SAAS;EACd,OAAO;CACT;CAEA,WAAyB;EACvB,OAAO,KAAK,MAAM,SAAS,KAAK,CAAC,KAAK,UAAU,CAAC,KAAK,SAAS;GAC7D,IAAI,OAAO,KAAK,QAAQ,MAAK,UAAS,MAAM,YAAY,IAAI;GAC5D,IAAI,CAAC,QAAQ,KAAK,QAAQ,SAAS,KAAK,MACtC,OAAO,KAAK,MAAM;GAEpB,IAAI,CAAC,MACH;GAEF,MAAM,OAAO,KAAK,MAAM,MAAM;GAC9B,KAAK,QAAQ;GACb,KAAK,UAAU;GACf,IAAI,KAAK,OACP,KAAK,WAAW,IAAI;GAEtB,MAAM,UAA2B;IAC/B,MAAM;IACN,IAAI,KAAK;IACT,KAAK,KAAK;GACZ;GAEA,KAAK,OAAO,YAAY,OAAO;EACjC;CACF;CAEA,QAA4B;EAC1B,MAAM,QAAoB;GACxB,QAAQ,aAAa,KAAK,MAAM,KAAK,cAAc;GACnD,SAAS;GACT,OAAO;GACP,MAAM;GACN,OAAO;EACT;EACA,MAAM,OAAO,GAAG,YAAY,YAA+B;GACzD,IAAI,QAAQ,SAAS,SAAS;IAC5B,MAAM,QAAQ;IAEd,KAAK,WAAW,KAAK;IACrB;GACF;GACA,MAAM,OAAO,MAAM;GACnB,IAAI,MAAM,QAAQ,SAAS,QAAQ,KAAK,OAAO,QAAQ,IACrD;GAEF,KAAK,QAAQ,KAAK;GAClB,KAAK,QAAQ;GACb,IAAI,QAAQ,IACV,KAAK,QAAQ,YAAY,QAAQ,KAAK,CAAC;QAEvC,KAAK,OAAO,YAAY,QAAQ,KAAK,CAAC;GAExC,KAAK,SAAS;EAChB,CAAC;EACD,MAAM,OAAO,GAAG,UAAS,UAAS;GAChC,KAAK,aAAa,OAAO,KAAK;EAChC,CAAC;EACD,MAAM,OAAO,GAAG,SAAQ,SAAQ;GAC9B,IAAI,KAAK,WAAW,MAAM,YAAY,MAAM;IAC1C,KAAK,OAAO,KAAK;IACjB;GACF;GACA,KAAK,aACH,uBACA,IAAI,MAAM,kCAAkC,OAAO,IAAI,GAAG,CAC5D;EACF,CAAC;EACD,KAAK,QAAQ,KAAK,KAAK;EACvB,OAAO;CACT;;CAGA,WAAmB,OAAyB;EAC1C,MAAM,OAAO,MAAM;EACnB,IAAI,KAAK,iBAAiB,QAAQ,SAAS,QAAQ,MAAM,UAAU,MACjE;EAEF,MAAM,QAAQ,iBAAiB;GAC7B,KAAK,QAAQ,OAAO,IAAI;EAC1B,GAAG,KAAK,YAAY;CACtB;;CAGA,QAAgB,OAAyB;EACvC,IAAI,MAAM,UAAU,MAAM;GACxB,aAAa,MAAM,KAAK;GACxB,MAAM,QAAQ;EAChB;EACA,MAAM,UAAU;CAClB;CAEA,OAAe,OAAyB;EACtC,MAAM,OAAO;EACb,MAAM,QAAQ,KAAK,QAAQ,QAAQ,KAAK;EACxC,IAAI,UAAU,IACZ,KAAK,QAAQ,OAAO,OAAO,CAAC;CAEhC;;;;;;CAOA,aAAqB,OAAmB,OAAsB;EAC5D,IAAI,MAAM,MACR;EAEF,MAAM,OAAO,MAAM;EACnB,KAAK,QAAQ,KAAK;EAClB,KAAK,OAAO,KAAK;EACjB,IAAI,CAAC,MAAM,OAAO;GAChB,KAAK,UAAU,OAAO,IAAI;GAC1B;EACF;EACA,IAAI,SAAS,MAAM;GACjB,KAAK,QAAQ;GACb,KAAK,OACH,IAAI,mBACF,8DACA,EAAE,MAAM,CACV,CACF;EACF;EACA,KAAK,SAAS;CAChB;CAEA,QAAgB,OAAmB,MAAsB;EACvD,IAAI,MAAM,QAAQ,MAAM,YAAY,MAClC;EAEF,KAAK,QAAQ,KAAK;EAClB,KAAK,OAAO,KAAK;EACjB,MAAW,OAAO,UAAU;EAC5B,KAAK,QAAQ;EACb,KAAK,OACH,IAAI,gBACF,6BAA6B,QAAQ,KAAK,gBAAgB,KAAK,aAAa,EAAE,SAChF,CACF;EACA,KAAK,SAAS;CAChB;CAEA,UAAkB,OAAgB,YAAmC;EACnE,IAAI,KAAK,QACP;EAEF,KAAK,SAAS,IAAI,kBAAkB,qBAAqB,EAAE,MAAM,CAAC;EAClE,IAAI,eAAe,MAAM;GACvB,WAAW,QAAQ;GACnB,WAAW,OAAO,KAAK,MAAM;EAC/B;EACA,KAAK,MAAM,SAAS,KAAK,SACvB,IAAI,MAAM,SAAS;GACjB,MAAM,QAAQ,QAAQ;GACtB,MAAM,QAAQ,OAAO,KAAK,MAAM;GAChC,KAAK,QAAQ,KAAK;EACpB;EAEF,KAAK,MAAM,QAAQ,KAAK,MAAM,OAAO,CAAC,GAAG;GACvC,KAAK,QAAQ;GACb,KAAK,OAAO,KAAK,MAAM;EACzB;EACA,KAAU,UAAU;CACtB;;CAGA,eAAqB;EACnB,KAAK,MAAM,QAAQ,KAAK,MAAM,OAAO,CAAC,GAAG;GACvC,KAAK,QAAQ;GACb,KAAK,QAAQ,KAAA,CAAS;EACxB;CACF;;CAGA,MAAM,QAAuB;EAC3B,KAAK,UAAU;EACf,KAAK,aAAa;EAClB,MAAM,QAAQ,IACZ,KAAK,QAAQ,KACX,UACE,IAAI,SAAc,YAAW;GAC3B,MAAM,OAAO,KAAK,cAAc,QAAQ,CAAC;GAGzC,MAAM,OAAO,YAAY,EAFU,MAAM,QAEV,CAAC;EAClC,CAAC,CACL,CACF;CACF;;CAGA,MAAM,YAA2B;EAC/B,KAAK,UAAU;EACf,KAAK,aAAa;EAClB,MAAM,UAAU,CAAC,GAAG,KAAK,OAAO;EAChC,KAAK,MAAM,SAAS,SAClB,KAAK,QAAQ,KAAK;EAEpB,MAAM,QAAQ,IAAI,QAAQ,KAAI,UAAS,MAAM,OAAO,UAAU,CAAC,CAAC;CAClE;AACF;AAyCA,SAAS,QACP,MACgC;CAChC,IAAI,OAAO,iBAAiB,MAC1B,OAAQ,KAA0B,OAAO,cAAc,CAAC;CAE1D,OAAQ,KAAqB,OAAO,SAAS,CAAC;AAChD;AAEA,SAAS,MAAM,SAGb;CACA,IAAI;CAIJ,OAAO;EAAE,SAAA,IAHW,SAAmB,YAAW;GAChD,QAAQ,iBAAiB,QAAQ,SAAS,GAAG,UAAU,GAAI;EAC7D,CACe;EAAG,cAAc,aAAa,KAAK;CAAE;AACtD;;AAGA,eAAe,QACb,MACA,WACA,mBACe;CACf,SAAS;EACP,MAAM,QAAQ,MAAM,iBAAiB;EACrC,MAAM,UAAU,MAAM,QAAQ,KAAK,CACjC,KAAK,QAAQ,WACL,cACA,MACR,GACA,MAAM,OACR,CAAC;EACD,MAAM,OAAO;EACb,IAAI,YAAY,QACd;EAEF,MAAM,UAAU;CAClB;AACF;;;;;;;;;;;;;;;;;AAkBA,SAAgB,YACd,MACA,MACA,QACA,UAAoC,CAAC,GAClB;CACnB,IAAI,SAAS,GACX,MAAM,IAAIC,eAAW,mCAAmC,QAAQ;CAElE,OAAO,SAAe,MAAM,MAAM,QAAQ,OAAO;AACnD;AAEA,gBAAgB,SACd,MACA,MACA,QACA,SACmB;CACnB,MAAM,EACJ,eAAe,GACf,YAAY,MACZ,oBAAoB,IACpB,aAAa,MACb,aAAa,MACb,aAAa,KAAK,QAAQ,cAAc,MACxC,kBAAkB,KAAK,QAAQ,mBAAmB,SAChD;CACJ,MAAM,WAAW,QAAQ,IAAI;CAC7B,MAAM,OAAO,YAAwC,SAAS,KAAK;CAEnE,MAAM,QAAQ,MAAM,KAAK;CACzB,IAAI,MAAM,MACR;CAGF,MAAM,WAAW,OAAO,SACrB,QAAO,YAAW,mBAAmB,WAAW,CAAC,CACjD,KAAI,YAAY,QAAwB,YAAY;CACvD,MAAM,OAAO,IAAI,WACf,QACA;EACE,UAAU,OAAO,kBAAkB;EACnC;EACA,MAAM,WAAW,IAAI;EACrB,QAAQ,yBAAyB,KAAK,MAAM;CAC9C,GACA,YACA,eACF;CACA,MAAM,SAAS,OAAO,UAAoB,SAA8B;EACtE,IAAI,QAAQ,cAAc,MACxB,MAAM,QAAQ,UAAU,WAAW,iBAAiB;EAEtD,IAAI;GACF,OAAQ,MAAM,SAAS;EACzB,SAAS,OAAO;GACd,IAAI,eAAe,QAAQ,iBAAiB,mBAC1C,MAAM;GAER,OAAO,WAAW,OAAO,SAAS,GAAQ;EAC5C;CACF;CACA,MAAM,aAAa,KAAK,IAAI,eAAe,QAAQ,CAAC;CACpD,IAAI,WAAW;CACf,IAAI;EACF,MAAM,SAAqB,CAAC,KAAK,OAAO,MAAM,KAAK,CAAC;EACpD,OAAO,OAAO,SAAS,YAAY;GACjC,MAAM,OAAO,MAAM,KAAK;GACxB,IAAI,KAAK,MACP;GAEF,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC;EACrC;EAEA,OAAO,OAAO,SAAS,GAAG;GAExB,MAAM,MAAM,OADG,OAAO,MACE,GAAG,IAAI;GAE/B,IAAI,eAAe,QAAS,MAAM,WAAW,GAAI;IAC/C,KAAK,aAAa;IAClB,KAAK,MAAM,aAAa,QACtB,IAAI,UAAU,UAAU,aACtB,MAAM,MAAM,OAAO,WAAW,KAAK;IAGvC;GACF;GAEA,MAAM,OAAO,MAAM,KAAK;GACxB,IAAI,CAAC,KAAK,MACR,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC;EAEvC;EACA,WAAW;CACb,UAAU;EACR,IAAI,UACF,MAAM,KAAK,MAAM;OAEjB,MAAM,KAAK,UAAU;CAEzB;AACF;;;ACx8BA,IAAa,kBAAb,cAAqC,MAAM;CACzC,OAAgB;CAChB;CACA;CACA;CACA;CACA;CAEA,YAAY,KAAa,KAAa,KAAa;EACjD,IAAI,SAAS;EACb,IAAI,cAAc;EAClB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAS,GACxC,IAAI,IAAI,WAAW,KAAK,MAAM,IAAM;GAClC,UAAU;GACV,cAAc;EAChB;EAEF,MAAM,QAAQ,MAAM;EACpB,MAAM,GAAG,IAAI,SAAS,OAAO,UAAU,MAAM,SAAS,IAAI,EAAE;EAC5D,KAAK,MAAM;EACX,KAAK,MAAM;EACX,KAAK,MAAM;EACX,KAAK,SAAS;EACd,KAAK,QAAQ;CACf;AACF;;AAGA,IAAa,iBAAb,cAAoC,MAAM;CACxC,OAAgB;CAEhB,YAAY,UAAkB;EAC5B,MAAM,gCAAgC,SAAS,aAAa;CAC9D;AACF;;AAGA,IAAM,UAAN,MAAc;CACZ;CACA,YAAY,KAAa;EACvB,KAAK,MAAM;CACb;AACF;AAEA,MAAM,SAAS;AACf,MAAM,UAA4C;CAChD,MAAK;CACL,KAAK;CACL,MAAM;CACN,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AACA,MAAM,OAAO;AAEb,SAAS,eAAe,MAAc,OAAuB;CAC3D,IAAI,WAAW;CACf,OAAO,WAAW,KAAK,QAAQ;EAC7B,MAAM,OAAO,KAAK,WAAW,QAAQ;EACrC,IAAI,SAAS,MAAQ,SAAS,KAAQ,SAAS,MAAQ,SAAS,IAC9D;EAEF,YAAY;CACd;CACA,OAAO;AACT;;AAGA,SAAS,WAAW,MAAc,KAA+B;CAC/D,MAAM,QAAQ,MAAM;CACpB,IAAI,SAAS;CACb,IAAI,WAAW;CACf,SAAS;EACP,IAAI,WAAW;EACf,OAAO,WAAW,KAAK,QAAQ;GAC7B,MAAM,OAAO,KAAK,WAAW,QAAQ;GACrC,IAAI,SAAS,MAAQ,SAAS,MAAQ,OAAO,IAC3C;GAEF,YAAY;EACd;EACA,IAAI,YAAY,KAAK,QACnB,MAAM,IAAI,gBAAgB,mCAAmC,MAAM,KAAK;EAE1E,UAAU,KAAK,MAAM,UAAU,QAAQ;EACvC,MAAM,OAAO,KAAK,WAAW,QAAQ;EACrC,IAAI,SAAS,IACX,OAAO,CAAC,QAAQ,WAAW,CAAC;EAE9B,IAAI,OAAO,IACT,MAAM,IAAI,gBAAgB,gCAAgC,MAAM,QAAQ;EAG1E,MAAM,SAAS,KAAK,OAAO,WAAW,CAAC;EACvC,IAAI,WAAW,IACb,MAAM,IAAI,gBAAgB,mCAAmC,MAAM,KAAK;EAE1E,IAAI,WAAW,KAAK;GAClB,MAAM,UAAU,QAAQ;GACxB,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,gBAAgB,oBAAoB,MAAM,QAAQ;GAE9D,UAAU;GACV,WAAW,WAAW;GACtB;EACF;EACA,MAAM,MAAM,KAAK,MAAM,WAAW,GAAG,WAAW,CAAC;EACjD,IAAI,CAAC,KAAK,KAAK,GAAG,GAChB,MAAM,IAAI,gBAAgB,0BAA0B,MAAM,WAAW,CAAC;EAExE,IAAI,YAAY,OAAO,SAAS,KAAK,EAAE;EACvC,WAAW,WAAW;EACtB,IACE,aAAa,SACb,aAAa,SACb,KAAK,MAAM,UAAU,WAAW,CAAC,MAAM,OACvC;GACA,MAAM,SAAS,KAAK,MAAM,WAAW,GAAG,WAAW,CAAC;GACpD,IAAI,CAAC,KAAK,KAAK,MAAM,GACnB,MAAM,IAAI,gBAAgB,0BAA0B,MAAM,WAAW,CAAC;GAExE,MAAM,MAAM,OAAO,SAAS,QAAQ,EAAE;GACtC,IAAI,OAAO,SAAW,OAAO,OAAS;IACpC,YAAY,SAAc,YAAY,SAAY,OAAO,MAAM;IAC/D,YAAY;GACd;EACF;EACA,UAAU,OAAO,cAAc,SAAS;CAC1C;AACF;;AAUA,SAAS,WACP,MACA,OACA,SACoE;CACpE,MAAM,OAAO,KAAK,OAAO,KAAK;CAC9B,IAAI,SAAS,IACX,MAAM,IAAI,QAAQ,KAAK;CAEzB,IAAI,SAAS,MAAK;EAChB,MAAM,CAAC,OAAO,OAAO,WAAW,MAAM,QAAQ,CAAC;EAC/C,OAAO;GAAE;GAAK;EAAM;CACtB;CACA,IAAI,SAAS,OAAO,SAAS,KAC3B,OAAO;EAAE,KAAK,QAAQ;EAAG,MAAM;CAAK;CAEtC,MAAM,WAAgC;EACpC,CAAC,QAAQ,IAAI;EACb,CAAC,QAAQ,IAAI;EACb,CAAC,SAAS,KAAK;EACf,CAAC,OAAO,GAAU;EAClB,CAAC,YAAY,OAAO,iBAAiB;EACrC,CAAC,aAAa,OAAO,iBAAiB;CACxC;CACA,KAAK,MAAM,CAAC,SAAS,UAAU,UAC7B,IAAI,KAAK,WAAW,SAAS,KAAK,GAChC,OAAO;EAAE,KAAK,QAAQ,QAAQ;EAAQ;CAAM;CAGhD,OAAO,YAAY;CACnB,MAAM,QAAQ,OAAO,KAAK,IAAI;CAC9B,IAAI,UAAU,MACZ,MAAM,IAAI,QAAQ,KAAK;CAEzB,MAAM,UAAU,MAAM,OAAO,KAAA,KAAa,MAAM,OAAO,KAAA;CACvD,IAAI,CAAC,SAAS;EAEZ,MAAM,SAAS,MAAM,EAAE,CAAC,UAAU,MAAM,EAAE,CAAC,WAAW,GAAG,IAAI,IAAI;EACjE,IAAI,SAAA,MACF,MAAM,eAAe,MAAM;CAE/B;CACA,MAAM,QAAQ,OAAO,MAAM,EAAE;CAC7B,IAAI,YAAY,SACd,OAAO;EACL,KAAK,QAAQ,MAAM,EAAE,CAAC;EACtB,OAAO,IAAI,aACT,UAAU,gBAAgB,KAAK,IAAI,OAAO,MAAM,EAAE,CAAC,CAAC,SAAS,CAC/D;CACF;CAEF,IAAI,YAAY,YAAY,CAAC,WAAW,CAAC,OAAO,cAAc,KAAK,GACjE,OAAO;EAAE,KAAK,QAAQ,MAAM,EAAE,CAAC;EAAQ,OAAO,OAAO,MAAM,EAAE;CAAE;CAEjE,OAAO;EACL,KAAK,QAAQ,MAAM,EAAE,CAAC;EACtB,OAAO,OAAO,GAAG,OAAO,EAAE,KAAK,CAAC,UAAU,IAAI;CAChD;AACF;;AAGA,SAAS,UACP,MACA,OACA,SACA,UACmB;CACnB,MAAM,QAAqB,CAAC;CAC5B,IAAI,QAAQ;CACZ,IAAI;CACJ,IAAI,cAAc;CAElB,SAAS;EACP,IAAI,CAAC,aAAa;GAChB,MAAM,UAAU,WAAW,MAAM,OAAO,OAAO;GAC/C,QAAQ,QAAQ;GAChB,IAAI,UAAU,SAAS;IACrB,IAAI,MAAM,UAAU,UAClB,MAAM,IAAI,eAAe,QAAQ;IAEnC,IAAI,QAAQ,SAAS,KAAK;KACxB,QAAQ,eAAe,MAAM,KAAK;KAClC,IAAI,KAAK,OAAO,KAAK,MAAM,KAAK;MAC9B,UAAU,CAAC;MACX,cAAc;MACd,SAAS;KACX,OACE,MAAM,KAAK;MAAE,MAAM;MAAS,OAAO,CAAC;KAAE,CAAC;KAEzC;IACF;IACA,QAAQ,eAAe,MAAM,KAAK;IAClC,IAAI,KAAK,OAAO,KAAK,MAAM,KAAK;KAC9B,UAAU,CAAC;KACX,cAAc;KACd,SAAS;KACT;IACF;IACA,IAAI,KAAK,OAAO,KAAK,MAAM,MACzB,MAAM,IAAI,gBACR,qDACA,MACA,KACF;IAEF,MAAM,CAAC,KAAK,UAAU,WAAW,MAAM,QAAQ,CAAC;IAChD,QAAQ,eAAe,MAAM,MAAM;IACnC,IAAI,KAAK,OAAO,KAAK,MAAM,KACzB,MAAM,IAAI,gBAAgB,2BAA2B,MAAM,KAAK;IAElE,QAAQ,eAAe,MAAM,QAAQ,CAAC;IACtC,MAAM,KAAK;KAAE;KAAK,MAAM;KAAU,OAAO,CAAC;IAAE,CAAC;IAC7C;GACF;GACA,UAAU,QAAQ;GAClB,cAAc;EAChB;EAEA,MAAM,MAAM,MAAM,GAAG,EAAE;EACvB,IAAI,QAAQ,KAAA,GACV,OAAO,CAAC,SAAS,KAAK;EAExB,cAAc;EACd,IAAI,IAAI,SAAS,SAAS;GACxB,IAAI,MAAM,KAAK,OAAO;GACtB,QAAQ,eAAe,MAAM,KAAK;GAClC,MAAM,OAAO,KAAK,OAAO,KAAK;GAC9B,IAAI,SAAS,KAAK;IAChB,MAAM,IAAI;IACV,UAAU,IAAI;IACd,cAAc;IACd,SAAS;IACT;GACF;GACA,IAAI,SAAS,KACX,MAAM,IAAI,gBAAgB,2BAA2B,MAAM,KAAK;GAElE,MAAM,QAAQ;GACd,QAAQ,eAAe,MAAM,QAAQ,CAAC;GACtC,IAAI,KAAK,OAAO,KAAK,MAAM,KACzB,MAAM,IAAI,gBACR,8CACA,MACA,KACF;GAEF;EACF;EAEA,OAAO,IAAI,OAAO,IAAI,KAAK,OAAO;EAClC,QAAQ,eAAe,MAAM,KAAK;EAClC,MAAM,OAAO,KAAK,OAAO,KAAK;EAC9B,IAAI,SAAS,KAAK;GAChB,MAAM,IAAI;GACV,UAAU,IAAI;GACd,cAAc;GACd,SAAS;GACT;EACF;EACA,IAAI,SAAS,KACX,MAAM,IAAI,gBAAgB,2BAA2B,MAAM,KAAK;EAElE,MAAM,QAAQ;EACd,QAAQ,eAAe,MAAM,QAAQ,CAAC;EACtC,IAAI,KAAK,OAAO,KAAK,MAAM,KACzB,MAAM,IAAI,gBACR,+CACA,MACA,KACF;EAEF,IAAI,KAAK,OAAO,KAAK,MAAM,MACzB,MAAM,IAAI,gBACR,qDACA,MACA,KACF;EAEF,MAAM,CAAC,KAAK,UAAU,WAAW,MAAM,QAAQ,CAAC;EAChD,QAAQ,eAAe,MAAM,MAAM;EACnC,IAAI,KAAK,OAAO,KAAK,MAAM,KACzB,MAAM,IAAI,gBAAgB,2BAA2B,MAAM,KAAK;EAElE,QAAQ,eAAe,MAAM,QAAQ,CAAC;EACtC,IAAI,MAAM;CACZ;AACF;;AAsBA,SAAS,gBAAgB,OAAuB;CAC9C,IAAI,CAAC,OAAO,SAAS,KAAK,GACxB,OAAO,QAAQ,IAAI,aAAa;CAElC,OAAO,YAAY,KAAK;AAC1B;;AAGA,SAAgB,YACd,MACA,UAA8B,CAAC,GACtB;CACT,IAAI,KAAK,WAAW,GAAG,GACrB,MAAM,IAAI,gBACR,iDACA,MACA,CACF;CAEF,MAAM,QAAQ,eAAe,MAAM,CAAC;CACpC,IAAI;CACJ,IAAI;CACJ,IAAI;EACF,IAAI,UAAsB;EAC1B,IAAI,QAAQ,cACV,UAAU;OACL,IAAI,QAAQ,aACjB,UAAU;EAEZ,CAAC,OAAO,OAAO,UACb,MACA,OACA,SACA,QAAQ,YAAY,OAAO,iBAC7B;CACF,SAAS,OAAO;EACd,IAAI,iBAAiB,SACnB,MAAM,IAAI,gBAAgB,mBAAmB,MAAM,MAAM,GAAG;EAE9D,MAAM;CACR;CACA,MAAM,eAAe,MAAM,GAAG;CAC9B,IAAI,QAAQ,KAAK,QACf,MAAM,IAAI,gBAAgB,cAAc,MAAM,GAAG;CAEnD,OAAO;AACT;;AC/XA,MAAM,eAAkC;CAAC;CAAQ;CAAO;AAAiB;AAEzE,MAAM,kBAAqC;CACzC;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,0BAGA;CACJ,CAAC,kBAAkB,cAAc;CACjC,CAAC,gBAAgB,aAAa;CAC9B,CAAC,yBAAyB,qBAAqB;CAC/C,CAAC,qBAAqB,iBAAiB;CACvC,CAAC,uBAAuB,mBAAmB;AAC7C;;AAGA,MAAa,sBAAyC;CACpD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;AAOA,SAAS,SAAS,OAAyB;CACzC,IAAI,UAAU,QAAQ,UAAU,KAAA,GAC9B,OAAO;CAET,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAChD,OAAO;CAET,OAAO;AACT;AAEA,SAAS,KAAK,OAAgB,gBAA8C;CAC1E,IAAI,iBAAiB,UACnB,OAAO,IAAI,qBAAqB,GAAG,eAAe,IAAI,MAAM,WAAW,EACrE,OAAO,MACT,CAAC;CAEH,OAAO,IAAI,qBAAqBC,YAAU,KAAK,IAAI,UAAU,KAAK,GAAG,EACnE,OAAO,MACT,CAAC;AACH;;AAQA,MAAM,sBAAsB;AAE5B,SAAS,cAAc,OAAgB,OAAuB;CAC5D,IAAI,OAAO,UAAU,UACnB,MAAM,IAAI,qBACR,GAAG,MAAM,yBAAyB,WAAW,KAAK,GACpD;CAEF,OAAO;AACT;AAEA,SAAS,kBAAkB,OAA2B,OAAqB;CACzE,KAAK,MAAM,QAAQ,OACjB,cAAc,MAAM,GAAG,MAAM,MAAM;AAEvC;;AAGA,SAAS,aAAa,OAAgB,OAAwB;CAC5D,IACE,UAAU,QACV,OAAO,UAAU,YACjB,CAAC,OAAO,cAAc,KAAK,GAE3B,MAAM,IAAI,qBACR,GAAG,MAAM,2BAA2B,WAAW,KAAK,GACtD;CAEF,OAAO;AACT;;AAGA,SAAS,cAAc,OAAgB,OAAwB;CAC7D,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,MAAM,IAAI,qBACR,GAAG,MAAM,yBAAyB,WAAW,KAAK,GACpD;CAEF,OAAO;AACT;;AAGA,SAAS,gBAAgB,OAAgB,OAAuB;CAC9D,MAAM,OAAO,cAAc,OAAO,KAAK;CACvC,IAAI,QAAQ,KAAK,UAAU;CAC3B,IAAI,OACF,IAAI;EACF,yBAAyB,MAAM,EAAE,OAAO,KAAK,CAAC;CAChD,QAAQ;EACN,QAAQ;CACV;CAEF,IAAI,CAAC,OACH,MAAM,IAAI,qBAAqB,GAAG,MAAM,0BAA0B;CAEpE,OAAO;AACT;;AAGA,SAAgB,2BACd,gBACuB;CACvB,IAAI;EACF,MAAM,UAAiC;GACrC,YAAY,QACV,cAAc,QAAQ,gBAAgB,aAAa,GAAG,aAAa,CACrE;GACA,oBAAoB,QAClB,aACE,QAAQ,gBAAgB,sBAAsB,GAC9C,sBACF,CACF;EACF;EACA,KAAK,MAAM,CAAC,WAAW,mBAAmB,yBAAyB;GACjE,MAAM,QAAQ,SAAS,YAAY,gBAAgB,SAAS,CAAC;GAC7D,IAAI,UAAU,MACZ,OACE,SACA,gBACA,QAAQ,cAAc,OAAO,SAAS,CAAC,CACzC;EAEJ;EAGA,IAAI,oBAAoB,SACtB,YAAY,gBAAgB,wBAAwB,CACtD;EACA,IAAI,sBAAsB,MACxB,oBAAoB,SAClB,YAAY,gBAAgB,qBAAqB,CACnD;EAEF,IAAI,sBAAsB,MACxB,QAAQ,oBAAoB,QAC1B,cAAc,mBAAmB,wBAAwB,CAC3D;EAEF,OAAO;CACT,SAAS,OAAO;EACd,MAAM,KAAK,OAAO,wCAAwC;CAC5D;AACF;;AAGA,SAAgB,yBAAyB,QAAgC;CACvE,IAAI;EACF,MAAM,aAAa,QAAQ,QAAQ,QAAQ;EAC3C,MAAM,eAAe,QAAQ,YAAY,eAAe;EACxD,MAAM,aAAa,QAAQ,YAAY,aAAa;EAEpD,IAAI,CAAC,aAAa,SAAS,UAAU,GACnC,MAAM,IAAI,qBACR,uBAAuB,eAAe,MAAM,UAAU,CAAC,GACzD;EAEF,MAAM,YAA2B;GAC/B,cAAc,QAAQ,cAAc,cAAc,eAAe,CAAC;GAClE;EACF;EACA,IAAI,WAAW,YAAY,eAAe,GAAG;GAC3C,MAAM,gBAAgB,QAAQ,YAAY,eAAe;GACzD,IAAI,MAAM,QAAQ,aAAa,KAAK,cAAc,SAAS,GAAG;IAC5D,kBAAkB,eAAe,eAAe;IAChD,UAAU,gBAAgB,QAAQ,aAAa;GACjD;EACF;EACA,IAAI,WAAW,YAAY,iBAAiB,GAAG;GAC7C,MAAM,WAAW,QAAQ,YAAY,iBAAiB;GACtD,IAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;IAClD,kBAAkB,UAAU,iBAAiB;IAC7C,UAAU,iBAAiB,QAAQ,QAAQ;GAC7C;EACF;EACA,MAAM,UAAU,QAAQ,QAAQ,SAAS;EACzC,UAAU,yBAAyB,QACjC,aACE,QAAQ,SAAS,gCAAgC,GACjD,gCACF,CACF;EACA,UAAU,qBAAqB,QAC7B,aACE,QAAQ,SAAS,6BAA6B,GAC9C,6BACF,CACF;EACA,IAAI,WAAW,QAAQ,iBAAiB,GAAG;GACzC,MAAM,iBAA0C,CAAC;GACjD,KAAK,MAAM,WAAW,OAAO,QAAQ,QAAQ,iBAAiB,CAAC,GAC7D,eAAe,KAAK,2BAA2B,OAAO,CAAC;GAEzD,UAAU,iBAAiB;EAC7B;EACA,OAAO;CACT,SAAS,OAAO;EACd,MAAM,KAAK,OAAO,+BAA+B;CACnD;AACF;;AAGA,SAAgB,uBACd,QACA,UAAgE,CAAC,GAClD;CACf,MAAM,UACJ,QAAQ,wBAAA;CACV,IAAI;EAGF,IAAI,UAAU,KAAK,OAAO,SAAS,SACjC,MAAM,IAAI,qBACR,sBAAsB,OAAO,OAAO,qBAAqB,QAAQ,uCACnE;EAQF,MAAM,aAAsB,YAH1B,OAAO,WAAW,WAAW,SAAS,WAAW,QAAQ,SAAS,GAGtB;GAC5C,aAAa;GACb,UAAA;EACF,CAAC;EACD,KAAK,MAAM,iBAAiB,iBAC1B,IAAI,CAAC,WAAW,YAAY,aAAa,GACvC,MAAM,IAAI,MAAM,2BAA2B,cAAc,EAAE;EAG/D,MAAM,gBAAgB,QAAQ,YAAY,UAAU;EACpD,IAAI,CAAC,MAAM,QAAQ,aAAa,GAC9B,MAAM,IAAI,qBACR,gCAAgC,WAAW,aAAa,GAC1D;EAEF,MAAM,WAAW,cAAc,KAAI,WACjC,yBAAyB,MAAM,CACjC;EACA,MAAM,YAAY,QAAQ,YAAY,YAAY;EAIlD,IAAI,gBAAgB,YAAA,GAA4B,GAC9C,MAAM,IAAI,MACR,8CACF;EAEF,MAAM,cAAc,QAAQ,YAAY,cAAc;EACtD,IAAI,MAAM,QAAQ,WAAW,GAC3B,kBAAkB,aAAa,cAAc;OAE7C,cAAc,aAAa,cAAc;EAE3C,OAAO;GACL,kBAAkB,QAChB,cACE,QAAQ,YAAY,mBAAmB,GACvC,mBACF,CACF;GACA,WAAW,QACT,gBAAgB,QAAQ,WAAW,gBAAgB,GAAG,gBAAgB,CACxE;GACA,SAAS,QACP,gBAAgB,QAAQ,WAAW,cAAc,GAAG,cAAc,CACpE;GACA,aAAa,QAAQ,WAAW;GAChC,UAAU,QACR,cAAc,QAAQ,YAAY,WAAW,GAAG,WAAW,CAC7D;GACA;EACF;CACF,SAAS,OAAO;EACd,MAAM,KAAK,OAAO,wBAAwB;CAC5C;AACF;;;;;AAMA,SAAgB,8BACd,SACU;CACV,MAAM,aAAa,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;CAC9D,MAAM,OAAiB,CAAC;CACxB,KAAK,MAAM,UAAU,YAAY;EAC/B,MAAM,SAAiB;GACrB,mBAAmB,OAAO;GAC1B,YAAY,OAAO;GACnB,UAAU,OAAO;GACjB,WAAW,OAAO;EACpB;EACA,KAAK,MAAM,UAAU,OAAO,UAAU;GAGpC,MAAM,eAAuB,EAAE,GAAG,OAAO;GACzC,IAAI,OAAO,kBAAkB,KAAA,GAC3B,aAAa,iBAAiB,UAAU,KAAK,OAAO,aAAa;GAEnE,IAAI,OAAO,mBAAmB,KAAA,GAC5B,aAAa,mBAAmB,UAAU,KAAK,OAAO,cAAc;GAEtE,KAAK,KAAK;IACR,GAAG;IACH,eAAe,OAAO;IACtB,aAAa,OAAO;IACpB,0BAA0B,OAAO;IACjC,sBAAsB,OAAO;GAC/B,CAAC;GACD,KAAK,MAAM,kBAAkB,OAAO,kBAAkB,CAAC,GAAG;IACxD,MAAM,gBAAwB,EAAE,GAAG,aAAa;IAChD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,cAAc,GACtD,OAAO,eAAe,aAAa,GAAG,GAAG,KAAK;IAEhD,KAAK,KAAK,aAAa;GACzB;EACF;CACF;CACA,OAAO;AACT;;AAGA,SAAgB,0BACd,SACA,UAAsB,CAAC,GACf;CACR,MAAM,OAAO,8BAA8B,OAAO,CAAC,CAAC,KAAI,QACtD,OAAO,YACL,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,KAAK,CAAC,CAAC,CACjE,CACF;CACA,OAAO,UAAU,qBAAqB,MAAM,OAAO;AACrD;;;;;;;;;AC7UA,MAAa,oBACX;AAEF,MAAM,iBAAiB;;AAGvB,SAAS,UAAU,MAA0B;CAE3C,MAAM,QADY,KAAK,SAAS,EACV,KAAK,CAAC,KAAK,SAAS,EAAI,IAAI,OAAM;CACxD,MAAM,YAAY,MAAM,WAAW,CAAC;CACpC,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,MACjB,IAAI,SAAS,aAAa,SAAS,IACjC,QAAQ,KAAK,OAAO,aAAa,IAAI;MAChC,IAAI,SAAS,GAClB,QAAQ;MACH,IAAI,SAAS,IAClB,QAAQ;MACH,IAAI,SAAS,IAClB,QAAQ;MACH,IAAI,QAAQ,MAAQ,OAAO,KAChC,QAAQ,OAAO,aAAa,IAAI;MAEhC,QAAQ,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;CAGnD,OAAO,IAAI,QAAQ,OAAO;AAC5B;;;;;AAMA,SAAS,iBAAiB,MAAiC;CACzD,IAAI;EACF,OAAO,UAAU,IAAI;CACvB,SAAS,OAAO;EACd,IAAI,iBAAiB,iBAAiB,iBAAiB,WACrD,OAAO;EAET,MAAM;CACR;AACF;AAEA,MAAM,YAAY;CAAC;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;AAAK;AAClE,MAAM,cAAc;CAClB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,SAAgB,eAAe,UAA8B;CAC3D,MAAM,OAAO,UAA0B,OAAO,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG;CACpE,IAAI,OAAO;CACX,IAAI,SAAS,qBAAqB,MAAM;EACtC,MAAM,SAAS,SAAS;EACxB,MAAM,WAAW,KAAK,IAAI,MAAM;EAChC,OAAO,GAAG,SAAS,IAAI,MAAM,MAAM,IAAI,KAAK,MAAM,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE;CACvF;CACA,MAAM,MAAM,UAAU,SAAS,QAAQ,MAAM;CAC7C,MAAM,QAAQ,YAAY,SAAS,QAAQ,MAAM;CACjD,OAAO,GAAG,IAAI,IAAI,IAAI,SAAS,GAAG,EAAE,GAAG,MAAM,GAAG,OAAO,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,IAAI,SAAS,IAAI,EAAE,GAAG,IAAI,SAAS,MAAM,EAAE,GAAG,IAAI,SAAS,MAAM,EAAE,GAAG;AAClK;;AAeA,SAAS,iBAAiB,MAAqC;CAC7D,MAAM,0BAAU,IAAI,IAAqB;CACzC,MAAM,QAA8B,CAAC,CAAC,MAAM,KAAK,CAAC;CAClD,OAAO,MAAM,SAAS,GAAG;EACvB,MAAM,CAAC,SAAS,gBAAgB,MAAM,IAAI;EAC1C,MAAM,UAAU,QAAQ,WAAW;EACnC,MAAM,WAAW,MAAM,QAAQ,OAAO,IAClC,QAAQ,QAAO,UAAS,iBAAiB,OAAO,IAChD,CAAC;EACL,IAAI,cAAc;GAChB,IAAI,SAAS;GACb,KAAK,MAAM,SAAS,UAClB,SAAS,KAAK,IAAI,SAAS,QAAQ,IAAI,KAAK,KAAK,KAAK,CAAC;GAEzD,QAAQ,IAAI,SAAS,MAAM;GAC3B;EACF;EACA,MAAM,KAAK,CAAC,SAAS,IAAI,CAAC;EAC1B,KAAK,MAAM,SAAS,UAClB,IAAI,CAAC,QAAQ,IAAI,KAAK,GACpB,MAAM,KAAK,CAAC,OAAO,KAAK,CAAC;CAG/B;CACA,OAAO;AACT;;;;;;;;AASA,SAAS,YACP,OACA,SACA,WACQ;CACR,IAAI,iBAAiB,SAAS;EAC5B,KAAK,QAAQ,IAAI,KAAK,KAAK,KAAA,KACzB,MAAM,IAAI,eAAe;EAE3B,MAAM,OAAO,MAAM,SAAS,SAAS;EACrC,UAAU,OAAO,KAAK;EACtB,OAAO;CACT;CACA,OAAO,MAAM,KAAK;AACpB;;;;;;;;;;;;;;;;AAiBA,SAAgB,kBAAkB,MAAe,UAA0B;CACzE,IAAI;EACF,MAAM,MAAM,QACV,KAAK,IAAI,2BAA2B,KAAK,EAC3C,CAAC,CAAC,YAAY;EACd,IAAI,QAAQ,sBAAsB,QAAQ,UACxC,OAAO;EAGT,MAAM,eAAe,KAAK,kBAAkB;EAC5C,IAAI,iBAAiB,MAAM;GACzB,MAAM,UAAU,KAAK,kBAAkB,KAAK;GAC5C,IAAI;IACF,OAAO,SAAS,cAAc,SAAS,SAAS;GAClD,SAAS,OAAO;IACd,IAAI,iBAAiB,aACnB,OAAO,SAAS,cAAc,SAAS,SAAS;IAElD,MAAM;GACR;EACF;EAEA,IAAI,OAAO;EACX,IAAI,QAAiB,KAAK,WAAW;EACrC,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GACzC,QAAQ,MAAM;EAEhB,IACE,iBAAiB,WACjB,MAAM,QAAQ,MACZ,WAAU,kBAAkB,gCAC9B,GAEA,OAAO,SAAS,QAAQ,QAAQ,IAAI;EAGtC,IAAI,QAAQ,oBACV,OAAO,SACL,MAAM,SAAS,MAAM,SAAS,SAAS,CAAC,GACxC,SACA,SACF;EAEF,OAAO,WAAW,UAAU,IAAI,GAAG,SAAS;CAC9C,QAAQ;EACN,OAAO;CACT;AACF;;AAGA,SAAgB,gBAAgB,OAAoC;CAClE,OAAO,OAAO,UAAU,WACpB,OAAO,WAAW,OAAO,MAAM,IAC/B,MAAM;AACZ;AAEA,MAAM,OAAO;AACb,MAAM,YAAY;AAClB,MAAM,kBAAkB;AACxB,MAAM,0BAA0B;;;;;AAMhC,SAAS,mBACP,OACA,WACQ;CACR,IAAI,QAAQ;CACZ,IAAI,OAAO,UAAU,UAAU;EAC7B,QAAQ,MAAM,WAAW,IAAI,IAAI,IAAI;EACrC,wBAAwB,YAAY;EACpC,OAAO,SAAS,aAAa,wBAAwB,KAAK,KAAK,GAC7D,SAAS;EAEX,OAAO;CACT;CACA,IAAI,cAAc;CAClB,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG;EACxD,MAAM,OAAO,MAAM;EACnB,IAAI,eAAe,SAAS,QAAQ,MAAM,QAAQ,OAAO,MAAM;GAC7D,SAAS;GACT,IAAI,QAAQ,WACV,OAAO;EAEX;EACA,cAAc,SAAS,aAAa,SAAS;CAC/C;CACA,OAAO;AACT;;;;;;;AAQA,SAAgB,iBACd,OACA,QACM;CACN,MAAM,EAAE,cAAc,iBAAiB;CACvC,IAAI,eAAe,GAAG;EACpB,MAAM,OAAO,gBAAgB,KAAK;EAClC,IAAI,OAAO,cACT,MAAM,mBAAmB,MAAM,YAAY;CAE/C;CACA,IACE,eAAe,KACf,mBAAmB,OAAO,YAAY,IAAI,cAE1C,MAAM,IAAI,mBACR,uBAAuB,aAAa,sCACtC;AAEJ;AAgBA,eAAe,UACb,OACA,QACuB;CACvB,IAAI;CACJ,IAAI,OAAO,UAAU,UACnB,OAAO;MACF,IAAI,aAAa,KAAK,GAAG;EAE9B,MAAM,YAAY,MAAM,kBAAkB,OAAO,OAAO,YAAY;EACpE,iBAAiB,WAAW,MAAM;EAClC,OAAO,WAAW,WAAW,SAAS;CACxC,OACE,OAAO,WAAW,OAAO,SAAS;CAEpC,MAAM,UAAU,WAAW,WAAW,MAAM,MAAM,CAAC,CAAC;CAIpD,IAAI,UAAU,WAAW,IAAI,IAAI;CACjC,IAAI,OAAO,OAAO,SAAS,MAAM,GAAG;EAClC,MAAM,QAAQ,QAAQ;EACtB,IAAI,OAAO,UAAU,UACnB,MAAM,YAAY,OAAO,SAAS;EAEpC,UAAU,yBAAyB,KAAK;CAC1C;CACA,MAAM,OAAO,eAAe,OAAO;CACnC,OAAO;EACL;EACA;EACA;EACA;EACA,SAAS,kBAAkB,MAAA,KAAuC,MAAM;CAC1E;AACF;;;;;;AAOA,SAAS,uBACP,SACA,aAC4C;CAC5C,MAAM,YAAY,QAAQ,QAAQ,WAAW;CAC7C,MAAM,QACJ,cAAc,KACV,CAAC,OAAO,IACR,CACE,QAAQ,MAAM,GAAG,SAAS,GAC1B,QAAQ,MAAM,YAAY,CAAkB,CAC9C;CACN,IAAI;CACJ,IAAI;EACF,MAAM,yBAAS,IAAI,IAAoB;EACvC,KAAK,MAAM,UAAU,MAAM,MAAM,GAAA,CAAI,SAAS,iBAAiB,GAAG;GAChE,MAAM,aAAa,MAAM,MAAM,GAAA,CAAI,YAAY,CAAC,CAAC,WAAW,KAAK,GAAG;GACpE,OAAO,IAAI,WAAW,QAAQ,MAAM,MAAM,EAAE,CAAC;EAC/C;EACA,MAAM,SAAS,SAAyB;GACtC,MAAM,QAAQ,OAAO,IAAI,IAAI;GAC7B,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,SAAS,IAAI;GAEzB,OAAO;EACT;EACA,iBAAiB,iBAAiB,MAAM,eAAe,EAAE,eAAe,MAAM,mBAAmB;CACnG,SAAS,OAAO;EACd,MAAM,IAAI,mBACR,yCAAyC,YAAY,KAAKC,YAAU,KAAK,IAAI,UAAU,KAAK,KAC5F,EAAE,OAAO,MAAM,CACjB;CACF;CACA,MAAM,OAAO,MAAM;CACnB,IAAI,SAAS,KAAA,GAEX,MAAM,IAAIC,eAAa,yBAAyB;CAElD,MAAM,SAAS,SAAS,IAAI;CAC5B,OAAO,MAAM,eAAe,MAAM,CAAC;CACnC,OAAO;EAAE;EAAgB;CAAO;AAClC;;AAGA,SAAS,mBAAmB,gBAAgC;CAC1D,IAAI;CACJ,IAAI,eAAe,SAAS,eAAe,GACzC,SAAS;MACJ;EACL,MAAM,UAAU,iBAAiB,cAAc;EAC/C,IAAI,YAAY,MACd,OAAO;EAGT,SAAS,UAAU,OAAO;CAC5B;CACA,SAAS,SAAS,SAAS,QAAQ,IAAI,GAAG,GAAG;CAC7C,OAAO,OAAO,WAAW,OAAO,EAAE,CAAC,CAAC,WAAW,OAAO,IAAI;AAC5D;;;;;;;;;;;;;AAcA,eAAsB,iBACpB,OACA,UAAmC,CAAC,GACb;CACvB,MAAM,EAAE,YAAY,MAAM,GAAG,kBAAkB;CAC/C,MAAM,SAAS,oBAAoB,aAAa;CAChD,OAAO,cAAc,WAAW,OAAM,YACpC,WAAW,OAAO,QAAQ,OAAO,CACnC;AACF;AAEA,eAAe,WACb,OACA,QACA,WACuB;CACvB,iBAAiB,OAAO,MAAM;CAE9B,IAAI;CACJ,IAAI;EACF,UAAU,MAAM,UAAU,OAAO,MAAM;CACzC,SAAS,OAAO;EACd,IAAI,iBAAiB,oBACnB,MAAM;EAER,MAAM,IAAI,YAAYD,YAAU,KAAK,IAAI,UAAU,KAAK,GAAG,EACzD,OAAO,MACT,CAAC;CACH;CACA,MAAM,EAAE,SAAS,SAAS,MAAM,YAAY;CAE5C,IAAI,cAAc;CAClB,IAAI,iBAAgC;CACpC,IAAI,SAAwB;CAC5B,IAAI,OAAO,OAAO,SAAS,MAAM,GAC/B,OAAO,KACL,qBAAqB,eAAe,MAAM,QAAQ,IAAI,CAAC,EAAE,MAAM,MACjE;CAEF,IAAI,OAAO,OAAO,SAAS,SAAS,GAGlC,cAAc,eAAe,MAAM,QAAQ,OAAO,CAAC;CASrD,IAAI;EACF,MAAM,SAAS,MAAM,YAAY,SAAS,aAAa,QAAQ,SAAS;EACxE,IAAI,gBAAgB,QAClB,OAAO;EAET,CAAC,CAAE,gBAAgB,UAAW;CAChC,SAAS,OAAO;EACd,IAAI,iBAAiB,aACnB,MAAM;EAER,MAAM,IAAI,YACR,yCAAyC,YAAY,KAAKA,YAAU,KAAK,IAAI,UAAU,KAAK,KAC5F,EAAE,OAAO,MAAM,CACjB;CACF;CAEA,IAAI,kBAAkB,QAAQ;EAC5B,IAAI;EACJ,IAAI;GACF,gBAAgB,MAAM,mBACpB,gBACA,QACA,SACA,EAAE,OAAO,CACX;EACF,SAAS,OAAO;GACd,IAAI,iBAAiB,sBACnB,MAAM,IAAI,qBACR,yBAAyB,YAAY,yCAAyC,MAAM,WACpF,EAAE,OAAO,MAAM,CACjB;GAEF,MAAM;EACR;EACA,OAAO;GAAE,YAAY;GAAW,QAAQ;EAAc;CACxD;CAIA,MAAM,IAAI,mBACR,yBAAyB,YAAY,wBACvC;AACF;;;;;AAWA,eAAe,YACb,SACA,aACA,QACA,WACsC;CACtC,IAAI,iBAAgC;CACpC,IAAI,SAAwB;CAC5B,IAAI,mBAAmB;CACvB,MAAM,UAAU,iBAAiB,OAAO;CACxC,MAAM,YAAY,IAAI,aAAa,OAAO,oBAAoB;CAC9D,MAAM,eAAmC,EAAE,MAAM,EAAE;CACnD,KAAK,MAAM,QAAQ,QAAQ,KAAK,GAAG;EACjC,MAAM,cAAc,KAAK,eAAe,CAAC,CAAC,YAAY;EACtD,MAAM,gBAAgB,KAAK,WAAW;EACtC,MAAM,cAAc,MAAM,QAAQ,aAAa,IAC3C,gBACA,CAAC,aAAa;EAClB,IAAI,YAAY,WAAW,GACzB,MAAM,IAAIC,eAAa,yBAAyB;EAElD,IAAI,UAAU,YAAY,YAAY,IAAI,SAAS,SAAS;EAC5D,IAAI,YAAY,WAAW,YAAY,KAAK,gBAAgB,aAC1D;EAEF,IAAI,gBAAgB,2BAA2B;GAC7C,mBAAmB;GACnB,iBAAiB,mBAAmB,kBAAkB,MAAM,OAAO,CAAC;EACtE,OAAO,IACL,oBACA,2BAA2B,SAAS,WAAW,GAE/C,SAAS,kBAAkB,MAAM,OAAO;OACnC,IAAI,gBAAgB,2BAA2B;GACpD,IAAI,CAAC,QAAQ,OAAO,CAAC,CAAC,WAAW,GAAG,GAClC,UAAU,WAAW,UAAU,OAAO,GAAG,SAAS;GAEpD,OAAO;IACL,YAAY;IACZ,QAAQ,uBAAuB,SAAS,MAAM;GAChD;EACF,OAAO,IAAI,gBAAgB,2BACzB,OAAO;GACL,YAAY;GACZ,QAAQ,uBAAuB,cAAc,OAAO,GAAG,MAAM;EAC/D;OACK,IAAI,gBAAgB,cACrB;OAAA,QAAQ,SAAS,cAAc,GACjC,CAAC,CAAE,gBAAgB,UAAW,uBAC5B,SACA,WACF;EAAA,OAEG;GACL,MAAM,SAAS,MAAM,gBACnB,SACA,aACA,QACA,WACA,YACF;GACA,IAAI,WAAW,MACb,OAAO;EAEX;CACF;CACA,OAAO;EAAE;EAAgB;CAAO;AAClC;;;;;;AAkBA,eAAe,gBACb,SACA,aACA,QACA,WACA,eAAmC,EAAE,MAAM,EAAE,GACf;CAC9B,MAAM,eAAe,iBAAiB,OAAO;CAC7C,IAAI,iBAAiB,MAEnB,OAAO;CAET,IAAI;EACF,MAAM,cACJ,WAAW,cAAc,SAAS,KAClC,WAAW,cAAc,UAAU,IAC/B,cAAc,cAAc,EAC1B,iBAAgB,SAAQ;GACtB,aAAa,QAAQ;EACvB,EACF,CAAC,IACD,WAAW,cAAc,SAAS;EACxC,MAAM,WAAW,QAAQ,WAAW;EACpC,IAAI,SAAS,WAAW,GAAG,GACzB,OAAO;GACL,YAAY;GACZ,QAAQ,uBAAuB,aAAa,MAAM;EACpD;EAEF,IAAI,SAAS,WAAW,GAAG,GACzB,OAAO;GACL,YAAY;GACZ,QAAQ,MAAM,wBAAwB,aAAa;IACjD;IACA;GACF,CAAC;EACH;EAIF,IAAI,aAAa,OAAA,WACf,MAAM,IAAI,mBACR,6CAA6C,6BAA6B,OAC5E;EAEF,OAAO;CACT,SAAS,OAAO;EACd,IAAI,iBAAiB,oBACnB,MAAM;EAER,IAAI,iBAAiB,oBACnB,MAAM,IAAI,YACR,yBAAyB,YAAY,iCAAiC,MAAM,WAC5E,EAAE,OAAO,MAAM,CACjB;EAEF,MAAM,IAAI,YACR,yCAAyC,YAAY,KAAKD,YAAU,KAAK,IAAI,UAAU,KAAK,KAC5F,EAAE,OAAO,MAAM,CACjB;CACF;AACF;;;;;;;;AASA,eAAsB,oBACpB,gBACA,SACqC;CACrC,IAAI;EACF,OAAO,MAAM,iBAAiB,gBAAgB,EAAE,QAAQ,QAAQ,OAAO,CAAC;CAC1E,SAAS,OAAO;EACd,IAAI,iBAAiB,aACnB,OAAO;EAET,MAAM;CACR;AACF;;AAGA,MAAM,wBAAwB;AAC9B,MAAM,kBAAkB;;AAGxB,SAAS,SAAS,OAA+B;CAC/C,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,KAAA,GAC3D,OAAO,SAAS;CAElB,OAAO,MAAM,KAAK;AACpB;;;;;;;;;;;;;AAcA,SAAgB,mBAAmB,QAAiC;CAClE,MAAM,EAAE,gBAAgB,oBAAoB;CAC5C,IAAI,SAAS,SAAS,gBAAgB,MAAM;CAE5C,IAAI,OAAO,WAAW,UACpB,SAAS,OAAO,WAAW,kBAAiB,YAC1C,QAAQ,YAAY,CACtB;CAEF,MAAM,MAAM,KAAK,UAAU;EACzB,SAAS,eAAe,OAAO;EAC/B,SAAS,eAAe,QAAQ;EAChC;CACF,CAAC;CACD,OAAO,IAAI,SAAS,wBAChB,WAAW,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,KAAK,IAC7C;AACN;;;;;;AAmBA,SAAgB,oBACd,aACA,kBACA,gBACA,gBACA,SACY;CACZ,MAAM,EAAE,wBAAwB,uBAAuB,SAAS;CAChE,IAAI,YAAY,eAAe,aAAa;EAC1C,MAAM,YAAY,YAAY,OAAO,eAAe;EACpD,MAAM,WAAW,YAAY,OAAO,eAAe;EACnD,MAAM,YAAY,mBAAmB,YAAY,MAAM;EAIvD,IAFE,uBAAuB,IAAI,SAAS,KACnC,yBAAyB,QAAQ,qBAAqB,IAAI,SAAS,GAEpE,OAAO,MACL,4CAA4C,eAAe,MAAM,SAAS,CAAC,EAAE,YAAY,eAAe,MAAM,QAAQ,CAAC,GACzH;OACK;GACL,IAAI,yBAAyB,MAC3B,uBAAuB,IAAI,WAAW,IAAI;QAE1C,qBAAqB,IAAI,SAAS;GAEpC,iBAAiB,KAAK,YAAY,MAAM;EAC1C;CACF,OAAO,IAAI,YAAY,eAAe,WACpC,eAAe,KAAK,YAAY,MAAM;MACjC,IAAI,YAAY,eAAe,YACpC,eAAe,KAAK,YAAY,MAAM;CAExC,OAAO,YAAY;AACrB;;ACtzBA,MAAM,KAAK;AACX,MAAM,YAAY,WAAW,KAAK;CAAC;CAAM;CAAM;CAAM;CAAM;AAAI,CAAC;AAChE,MAAM,kBAAkB;AACxB,MAAM,wBAAQ,IAAI,WAAW,CAAC;AAO9B,SAAS,eAAe,MAA2B;CACjD,OAAO,UAAU,OAAO,MAAM,UAAU,KAAK,WAAW,IAAI;AAC9D;;AAGA,SAAS,WAAW,MAAiB,OAA8B;CACjE,MAAM,UAAU,UAAU,SAAS,KAAK,KAAK;CAC7C,OAAO;EACL,QAAQ,KAAK;EACb,QAAQ,KAAK,SAAS,MAAM;EAC5B,MACE,UAAU,IACN,WAAW,KAAK,CAAC,GAAG,KAAK,MAAM,GAAG,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,IAC7D,KAAK;CACb;AACF;;AAGA,eAAe,gBAAgB,MAAmC;CAChE,IAAI;EACF,OAAO,MAAM,KAAK,MAAM,UAAU,MAAM;CAC1C,SAAS,OAAO;EACd,MAAM,OAAQ,MAAgC;EAC9C,IAAI,SAAS,UAGX,OAAO,KAAK,MAAM,IAAI;EAExB,IAAI,SAAS,YAAY,SAAS,SAChC,OAAO,KAAK,MAAM,GAAG;EAEvB,MAAM;CACR;AACF;;;;;;;AAiBA,gBAAgB,UAAU,MAA6C;CACrE,IAAI,SAAS;CAEb,IAAI,UAA4B;CAChC,MAAM,SAAS,IAAI,WAAW,eAAe;CAC7C,SAAS;EACP,MAAM,EAAE,cAAc,MAAM,KAAK,KAAK,QAAQ,GAAG,OAAO,QAAQ,MAAM;EACtE,IAAI,cAAc,GAChB;EAEF,MAAM,QAAQ,OAAO,SAAS,GAAG,SAAS;EAC1C,MAAM,cAAc;EACpB,UAAU;EACV,IAAI,YAAY;EAChB,KACE,IAAI,QAAQ,MAAM,QAAQ,EAAE,GAC5B,UAAU,IACV,QAAQ,MAAM,QAAQ,IAAI,SAAS,GACnC;GACA,MAAM,OAAO,MAAM,SAAS,WAAW,QAAQ,CAAC;GAChD,IAAI,YAAY,MACd,MAAM;IACJ,QAAQ,cAAc;IACtB,QAAQ,KAAK;IACb,MAAM,KAAK,SAAS,GAAG,UAAU,MAAM;GACzC;QACK;IACL,MAAM,WAAW,SAAS,IAAI;IAC9B,UAAU;GACZ;GACA,YAAY,QAAQ;EACtB;EACA,IAAI,YAAY,MAAM,QACpB,UAAU,WACR,WAAW;GAAE,QAAQ,cAAc;GAAW,QAAQ;GAAG,MAAM;EAAM,GACrE,MAAM,SAAS,SAAS,CAC1B;CAEJ;CACA,IAAI,YAAY,MACd,MAAM;AAEV;;AAGA,IAAa,aAAb,MAAa,WAAW;CACtB;CACA;CAEA,YAAoB,MAAkB,KAAiB;EACrD,KAAK,OAAO;EACZ,KAAK,MAAM;CACb;;;;;CAMA,aAAa,KAAK,MAAmC;EACnD,MAAM,OAAO,MAAM,gBAAgB,IAAI;EACvC,IAAI;GACF,OAAO,IAAI,WAAW,MAAM,MAAM,WAAW,YAAY,IAAI,CAAC;EAChE,SAAS,OAAO;GACd,MAAM,KAAK,MAAM;GACjB,MAAM;EACR;CACF;;CAGA,aAAqB,YAAY,MAAuC;EACtE,MAAM,SAAmB,CAAC;EAC1B,MAAM,QAAkB,CAAC;EACzB,IAAI,eAAe;EACnB,IAAI,MAAM;EACV,WAAW,MAAM,EAAE,QAAQ,SAAS,QAAQ,UAAU,UAAU,IAAI,GAAG;GACrE,MAAM,UAAU;GAChB,IAAI,eAAe,IAAI,GAAG;IACxB,IAAI,MAAM,SAAS,OAAO,QACxB,MAAM,KAAK,eAAe,UAAU,IAAI,OAAO;IAEjD,OAAO,KAAK,OAAO;IACnB,eAAe;GACjB,OAAO,IAAI,WAAW,KAAK,KAAK,OAAO,IACrC,eAAe;QAEf,eAAe;EAEnB;EAEA,MAAM,KAAK,eAAe,MAAM,IAAI,GAAG;EACvC,MAAM,QAAQ,KAAK,IAAI,OAAO,QAAQ,MAAM,MAAM;EAClD,MAAM,MAAkB,CAAC;EACzB,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAC1C,IAAI,KAAK;GAAE,OAAO,OAAO,UAAU;GAAG,MAAM,MAAM,UAAU;EAAE,CAAC;EAEjE,OAAO;CACT;;CAGA,OAAiB;EACf,OAAO,KAAK,IAAI,KAAK,QAAQ,UAAU,KAAK;CAC9C;CAEA,IAAI,SAAiB;EACnB,OAAO,KAAK,IAAI;CAClB;;CAGA,KAAK,KAAqB;EACxB,MAAM,EAAE,OAAO,SAAS,KAAK,MAAM,GAAG;EACtC,OAAO,KAAK,IAAI,OAAO,OAAO,CAAC;CACjC;CAEA,MAAc,KAAuB;EACnC,MAAM,QAAQ,KAAK,IAAI;EACvB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,WAAW,wBAAwB,KAAK;EAEpD,OAAO;CACT;;CAGA,MAAM,SAAS,KAAkC;EAC/C,MAAM,EAAE,OAAO,SAAS,KAAK,MAAM,GAAG;EACtC,MAAM,MAAM,IAAI,WAAW,KAAK,IAAI,OAAO,OAAO,CAAC,CAAC;EACpD,IAAI,SAAS;EACb,OAAO,SAAS,IAAI,QAAQ;GAC1B,MAAM,EAAE,cAAc,MAAM,KAAK,KAAK,KACpC,KACA,QACA,IAAI,SAAS,QACb,QAAQ,MACV;GACA,IAAI,cAAc,GAChB;GAEF,UAAU;EACZ;EACA,MAAM,OAAO,IAAI,SAAS,GAAG,MAAM;EACnC,MAAM,eAAe,KAAK,QAAQ,EAAE;EACpC,OAAO,iBAAiB,qBACpB,IAAI,WAAW,CAAC,IAChB,KAAK,MAAM,eAAe,CAAC;CACjC;;;;;CAMA,MAAM,UAAU,KAA8B;EAE5C,OAAO,kBADM,SAAS,MAAM,KAAK,SAAS,GAAG,GAAG,SAAS,iBAChC,CAAI,CAAC,CAAC,SAAS;CAC1C;CAEA,MAAM,QAAuB;EAC3B,MAAM,KAAK,KAAK,MAAM;CACxB;AACF;;;;;;ACtLA,MAAM,qBAAqB;AAE3B,MAAM,eAAe;;;;;AAMrB,SAAgB,eAAe,MAAuB;CACpD,MAAM,UAAU,KAAK,QAAQ,IAAI;CACjC,MAAM,YAAY,YAAY,KAAK,OAAO,KAAK,MAAM,GAAG,OAAO;CAC/D,OAAO,mBAAmB,KAAK,SAAS;AAC1C;;AAGA,SAAS,gBAAgB,MAAc,OAAuB;CAC5D,IAAI,SAAS;CACb,IAAI,QAAQ;CACZ,KAAK,MAAM,QAAQ,MAAM;EACvB,IAAI,UAAU,OACZ;EAEF,UAAU;EACV,SAAS;CACX;CACA,OAAO;AACT;;;;;;AAOA,SAAgB,qBACd,SACA,gBACA,cACA,YACQ;CACR,MAAM,QAAQ,SACZ,OAAO,YAAY,WACf,gBAAgB,SAAS,YAAY,IACrC,WAAW,QAAQ,SAAS,GAAG,YAAY,GAAG,SAAS,CAC7D;CACA,IAAI,MAAM,WAAW,GAAG,GACtB,OAAO,6BAA6B,eAAe;CAErD,IAAI,MAAM,WAAW,GAAG,GACtB,OAAO,4BAA4B,aAAa;CAElD,IAAI,eAAe,KAAK,GACtB,OAAO,yBAAyB,WAAW;CAE7C,OAAO;AACT;;;;;;AAqBA,SAAS,kBAAkB,QAAqC;CAC9D,OAAO,OAAO,eAAe,IACzB,KAAK,IAAI,OAAO,cAAc,4BAA4B,IAC1D;AACN;;AAGA,eAAe,YACb,OACA,SACqB;CACrB,IAAI,OAAO,UAAU,YAAY,iBAAiB,KAAK;EACrD,MAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,cAAc,KAAK;EACxE,OAAO,MAAM,WAAW,UAAU;EAClC,IAAI,YAAY,MAAM;GACpB,MAAM,EAAE,SAAS,MAAM,KAAK,QAAQ;GACpC,IAAI,OAAO,SACT,MAAM,IAAI,mBACR,WAAW,KAAK,qBAAqB,QAAQ,kCAC/C;EAEJ;EACA,OAAO,IAAI,WAAW,MAAM,SAAS,QAAQ,CAAC;CAChD;CACA,IAAI,iBAAiB,YACnB,OAAO;CAET,IAAI,iBAAiB,aACnB,OAAO,IAAI,WAAW,KAAK;CAK7B,MAAM,WAAWE,MAAO,OAAO,cAAc,CAAC;CAC9C,MAAM,SAAuB,CAAC;CAC9B,IAAI,OAAO;CACX,SAAS;EACP,MAAM,EAAE,MAAM,OAAO,UAAU,MAAM,SAAS,KAAK;EACnD,IAAI,MACF,OAAO,IAAI,WAAW,OAAO,OAAO,MAAM,CAAC;EAE7C,IAAI,OAAO,UAAU,UAEnB,MAAM,IAAI,UACR,+DACF;EAEF,QAAQ,MAAM;EACd,IAAI,YAAY,QAAQ,OAAO,SAC7B,MAAM,IAAI,mBACR,uBAAuB,QAAQ,oDACjC;EAEF,OAAO,KAAK,KAAK;CACnB;AACF;;AAGA,eAAe,sBACb,SACA,QACA,WAC0B;CAC1B,IAAI;CACJ,IAAI;EACF,MAAM,cAAc,OAAO;CAC7B,SAAS,OAAO;EACd,MAAM,IAAI,uBAAuBC,YAAU,KAAK,IAAI,UAAU,KAAK,GAAG,EACpE,OAAO,MACT,CAAC;CACH;CACA,OAAO,wBAAwB,KAAK;EAAE;EAAQ;CAAU,CAAC;AAC3D;;;;;;;;;;AAWA,eAAsB,gBACpB,OACA,UAAkC,CAAC,GACZ;CACvB,MAAM,EAAE,YAAY,MAAM,GAAG,kBAAkB;CAC/C,MAAM,SAAS,oBAAoB,aAAa;CAChD,MAAM,MAAM,MAAM,YAAY,OAAO,kBAAkB,MAAM,CAAC;CAC9D,MAAM,UACJ,WAAW,KAAK,SAAS,KAAK,WAAW,KAAK,UAAU,IACpD,cAAc,GAAG,IACjB;CAEN,IAAI;EACF,OAAO;GACL,YAAY;GACZ,QAAQ,MAAM,sBAAsB,SAAS,QAAQ,SAAS;EAChE;CACF,SAAS,gBAAgB;EACvB,IAAI,EAAE,0BAA0B,yBAC9B,MAAM;EAER,IAAI;GACF,OAAO;IACL,YAAY;IACZ,QAAQ,uBAAuB,SAAS,MAAM;GAChD;EACF,SAAS,cAAc;GACrB,IAAI,EAAE,wBAAwB,uBAC5B,MAAM;GAER,IAAI;IACF,OAAO,MAAM,iBAAiB,SAAS;KAAE;KAAQ;IAAU,CAAC;GAC9D,SAAS,YAAY;IACnB,IAAI,EAAE,sBAAsB,qBAC1B,MAAM;IAER,MAAM,IAAI,YACR,qBACE,SACA,gBACA,cACA,UACF,GACA,EAAE,OAAO,WAAW,CACtB;GACF;EACF;CACF;AACF;;;;;;AAOA,eAAsB,mBACpB,UACA,SACyC;CACzC,IAAI;EACF,OAAO,CACL,UACA,MAAM,gBAAgB,UAAU,EAAE,QAAQ,QAAQ,OAAO,CAAC,CAC5D;CACF,SAAS,OAAO;EACd,OAAO,CACL,UACA,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC1D;CACF;AACF;;AAGA,SAAS,oBACP,MACA,KACA,QAC2B;CAC3B,MAAM,OAAO,KAAK,KAAK,GAAG;CAC1B,IAAI,OAAO,eAAe,KAAK,OAAO,OAAO,cAC3C,OAAO,mBAAmB,MAAM,OAAO,YAAY;CAErD,OAAO;AACT;;;;;;;;;;AAWA,SAAS,gBAAgB,OAAgB,OAAqB;CAE5D,MAAM,kBAAkB,oBAAoB,KAAK;CACjD,IAAI,oBAAoB,MACtB,MAAM;CAER,IAAI,iBAAiB,oBAAoB;EACvC,OAAO,QAAQ,eAAe,MAAM,OAAO,CAAC;EAC5C;CACF;CACA,MAAM,OAAO,iBAAiB,QAAQ,MAAM,OAAO;CACnD,OAAO,QACL,eACE,oBAAoB,QAAQ,EAAE,IAAI,KAAK,IAAIA,YAAU,KAAK,GAC5D,CACF;AACF;;;;;;;;AAkBA,eAAsB,wBACpB,OACA,UAA0C,CAAC,GAClB;CACzB,MAAM,EAAE,SAAS,GAAG,GAAG,kBAAkB;CACzC,MAAM,SAAS,oBAAoB,aAAa;CAChD,MAAM,mBAAsC,CAAC;CAC7C,MAAM,iBAAkC,CAAC;CACzC,MAAM,iBAAkC,CAAC;CACzC,MAAM,YAAY,gBAAoC;EACpD,oBACE,aACA,kBACA,gBACA,gBACA,EAAE,wBAAwB,OAAO,uBAAuB,CAC1D;CACF;CAEA,MAAM,OAAO,MAAM,WAAW,KAAK,KAAK;CACxC,IAAI;EACF,MAAM,cAAc,KAAK,KAAK;EAC9B,MAAM,gBAAgB,YAAY;EAClC,OAAO,MAAM,SAAS,cAAc,eAAe,OAAO;EAE1D,IAAI,SAAS,KAAK,gBAAgB,GAAG;GAEnC,MAAM,YAAsB,CAAC;GAC7B,gBAAgB,OAAmC;IACjD,KAAK,MAAM,CAAC,OAAO,QAAQ,YAAY,QAAQ,GAAG;KAChD,OAAO,KAAK,sBAAsB,QAAQ,EAAE,MAAM,eAAe;KACjE,MAAM,WAAW,oBAAoB,MAAM,KAAK,MAAM;KACtD,IAAI,aAAa,MAAM;MACrB,gBAAgB,UAAU,KAAK;MAC/B;KACF;KACA,MAAM,UAAU,MAAM,KAAK,SAAS,GAAG;KACvC,UAAU,KAAK,KAAK;KACpB,MAAM;IACR;GACF;GACA,WAAW,MAAM,UAAU,YAGzB,qBAAqB,MAAM,GAAG,KAAK,GAAG,QAAQ,EAC9C,aAAY,UACV,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,EAC5D,CAAC,GAAG;IACF,MAAM,QAAQ,UAAU,MAAM,KAAK;IACnC,IAAI,kBAAkB,OACpB,gBAAgB,QAAQ,KAAK;SAE7B,SAAS,MAAM;GAEnB;EACF,OACE,KAAK,MAAM,CAAC,OAAO,QAAQ,YAAY,QAAQ,GAAG;GAChD,OAAO,KAAK,sBAAsB,QAAQ,EAAE,MAAM,eAAe;GACjE,MAAM,WAAW,oBAAoB,MAAM,KAAK,MAAM;GACtD,IAAI,aAAa,MAAM;IACrB,gBAAgB,UAAU,KAAK;IAC/B;GACF;GACA,MAAM,iBAAiB,MAAM,KAAK,SAAS,GAAG;GAC9C,IAAI;GACJ,IAAI;IACF,cAAc,MAAM,iBAAiB,gBAAgB,EAAE,OAAO,CAAC;GACjE,SAAS,OAAO;IACd,gBAAgB,OAAO,KAAK;IAC5B;GACF;GACA,SAAS,WAAW;EACtB;CAEJ,UAAU;EACR,MAAM,KAAK,MAAM;CACnB;CAGA,OAAO;EAAE;EAAkB;EAAgB;CAAe;AAC5D"}