@socprime/logtotal-sanitizer 0.2.0-beta.0 → 0.2.0-beta.2
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.
- package/CHANGELOG.md +29 -1
- package/README.md +40 -0
- package/{chunk-ISVRNSZF.cjs → chunk-EUNFMCKE.cjs} +78 -15
- package/chunk-EUNFMCKE.cjs.map +1 -0
- package/{chunk-FUDPRHOC.js → chunk-M4CEAFAP.js} +39 -16
- package/chunk-M4CEAFAP.js.map +1 -0
- package/{chunk-5R34WEOD.js → chunk-VMPXBCSL.js} +78 -15
- package/chunk-VMPXBCSL.js.map +1 -0
- package/{chunk-DBC5DTD5.cjs → chunk-XPVOBYVK.cjs} +63 -40
- package/chunk-XPVOBYVK.cjs.map +1 -0
- package/cli.js +112 -26
- package/cli.js.map +1 -1
- package/{index-HPy5z0l3.d.cts → index-BYhIh1ru.d.cts} +6 -0
- package/{index-HPy5z0l3.d.ts → index-BYhIh1ru.d.ts} +6 -0
- package/index.cjs +25 -25
- package/index.d.cts +2 -2
- package/index.d.ts +2 -2
- package/index.js +2 -2
- package/node.cjs +27 -27
- package/node.d.cts +2 -2
- package/node.d.ts +2 -2
- package/node.js +3 -3
- package/package.json +1 -1
- package/rules.cjs +5 -5
- package/rules.d.cts +1 -1
- package/rules.d.ts +1 -1
- package/rules.js +1 -1
- package/chunk-5R34WEOD.js.map +0 -1
- package/chunk-DBC5DTD5.cjs.map +0 -1
- package/chunk-FUDPRHOC.js.map +0 -1
- package/chunk-ISVRNSZF.cjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,35 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [
|
|
8
|
+
## [0.2.0-beta.2] - 2026-09-21
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- JSON field redaction: Windows placeholder values (`""` and `"-"`) are left unchanged instead
|
|
13
|
+
of being replaced with a token.
|
|
14
|
+
- `users` rule: `DOMAIN\user` is now also matched when the separator is JSON-escaped
|
|
15
|
+
(`"User": "CORP\\jdoe"`), so accounts in pretty-printed JSON that never parses line by line are
|
|
16
|
+
redacted. The account segment gets the same token as the plain-text form.
|
|
17
|
+
- `hosts` rule: quoted JSON host fields (`"Computer": "box1"`, `"SubjectDomainName": "CORP"`) are
|
|
18
|
+
matched by key name, case- and `-`/`_`-insensitive. The plain-text `computer=` pattern only
|
|
19
|
+
matched lowercase keys with no quote between the key and the separator.
|
|
20
|
+
- `hosts` rule: the domain half of a quoted `"DOMAIN\account"` value becomes a `HOST` token, so a
|
|
21
|
+
workstation name correlates with the same name in a `Computer` field. Anchored on both quotes,
|
|
22
|
+
and guarded by the well-known-domain and filename exclusions the `users` rule already uses, so
|
|
23
|
+
path segments such as `"System32\cmd.exe"` are left alone.
|
|
24
|
+
- `hosts` rule: UNC computer names are also matched when the separators are JSON-escaped
|
|
25
|
+
(`"\\\\FILESRV01\\share"`).
|
|
26
|
+
|
|
27
|
+
## [0.2.0-beta.1] - 2026-09-15
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- `jsonKeyContains` on `SanitizeRule`: JSON field names are matched when the normalized key
|
|
32
|
+
contains a fragment, after an exact `jsonKeys` miss. The first active rule wins.
|
|
33
|
+
- `hosts` rule: `computer` in `jsonKeys`, plus `jsonKeyContains` for `computer` and `domainname`
|
|
34
|
+
(covers Windows Event fields such as `Computer`, `SubjectDomainName`, `TargetDomainName`).
|
|
35
|
+
- `users` rule: `jsonKeyContains` for `owner` and `username` (covers `jobOwner`,
|
|
36
|
+
`SubjectUserName`, `TargetUserName`, and similar).
|
|
9
37
|
|
|
10
38
|
## [0.2.0-beta.0] - 2026-09-07
|
|
11
39
|
|
package/README.md
CHANGED
|
@@ -205,3 +205,43 @@ Exit codes: `0` ok, `1` runtime error or `--fail-on-match`, `2` usage error.
|
|
|
205
205
|
## Token correlation
|
|
206
206
|
|
|
207
207
|
Tokens are HMAC-SHA-256 of `ruleId || 0x00 || original`, truncated to 16 hex chars. Same key + same value + same rule ⇒ same token. A different key produces different tokens. Generated keys use encoding `hex`; pasted keys default to `utf8`.
|
|
208
|
+
|
|
209
|
+
## Integrations
|
|
210
|
+
|
|
211
|
+
The sanitizer is a library first, so most real deployments wrap it in something else: a pipeline function, a stream processor, a sidecar. This index tracks integrations that exist today and ones we (or partners) intend to build. Entries maintained outside SOC Prime are marked as such and are not endorsed or supported by SOC Prime.
|
|
212
|
+
|
|
213
|
+
Status values: **Available** — released and usable. **Planned** — committed, in design or development. **Wanted** — no owner yet; open an issue to claim one.
|
|
214
|
+
|
|
215
|
+
| Integration | Maintainer | Status | Description |
|
|
216
|
+
| --- | --- | --- | --- |
|
|
217
|
+
| [Cribl Stream Pack](https://github.com/M3NIX/cribl-logtotal-sanitizer) | [@M3NIX](https://github.com/M3NIX) (community) | Available | Cribl Stream Pack that sanitizes `_raw` in-pipeline using a Worker Group Secret as the HMAC key. Ships a Function, a passthrough fallback route, and 100 synthetic preview events. Also on [packs.cribl.io](https://packs.cribl.io/packs/cc-stream-logtotal-sanitizer). |
|
|
218
|
+
| Kafka — sanitize on produce | SOC Prime | Planned | Sanitizes events at the ingestion edge, before they are written to the topic, so raw secrets and identifiers never land in Kafka storage or replicas. |
|
|
219
|
+
| Kafka — sanitize on consume | SOC Prime | Planned | Leaves the topic intact and sanitizes on read, for cases where the cluster is trusted but a specific downstream consumer or third party is not. |
|
|
220
|
+
| [Tenzir](https://tenzir.com) | Open — contributors welcome | Planned | Sanitizer operator for TQL pipelines, applied to selected fields. Likely via the Python or shell operator until a native operator exists. |
|
|
221
|
+
| [Onum](https://onum.com) (CrowdStrike) | Open — contributors welcome | Planned | Sanitizer action in an Onum pipeline, ahead of delivery to Falcon Next-Gen SIEM or any other destination. |
|
|
222
|
+
| [Vector](https://vector.dev) (Datadog) | Open — contributors welcome | Wanted | Sanitization stage in a Vector topology, via an `exec` transform or an HTTP round trip to a sanitizer sidecar. |
|
|
223
|
+
| [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/) | Open — contributors welcome | Wanted | Log record processor. The Collector is Go, so this is an external-processor or sidecar pattern rather than an in-process extension. |
|
|
224
|
+
| [Logstash](https://www.elastic.co/logstash) | Open — contributors welcome | Wanted | Filter stage. JRuby runtime means calling the Node CLI or a sanitizer service rather than embedding the library. |
|
|
225
|
+
| [Fluent Bit](https://fluentbit.io) | Open — contributors welcome | Wanted | Filter plugin. Needs either a WASM port of the rule engine or a sidecar; the Lua filter cannot host the library directly. |
|
|
226
|
+
| [Redpanda Connect](https://www.redpanda.com/connect) (Benthos) | Open — contributors welcome | Wanted | Processor in a Connect pipeline, using the `subprocess` or `http` processor against the CLI or a sanitizer service. |
|
|
227
|
+
| [Apache NiFi](https://nifi.apache.org) | Open — contributors welcome | Wanted | Custom processor or `ExecuteStreamCommand` wrapping the CLI, for flow-file content sanitization. |
|
|
228
|
+
| [Splunk Edge Processor / Ingest Processor](https://www.splunk.com/en_us/products/ingest-processor.html) | Open — contributors welcome | Wanted | Sanitization before data reaches the indexer. SPL2 pipelines do not currently accept custom code, so feasibility needs evaluation. |
|
|
229
|
+
| [Elastic ingest pipeline](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html) | Open — contributors welcome | Wanted | Index-time sanitization. Painless cannot host the library, so realistically this means sanitizing upstream in Logstash or a sidecar and documenting the pattern. |
|
|
230
|
+
| [Microsoft Sentinel DCR transformation](https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/data-collection-transformations) | Open — contributors welcome | Wanted | Sanitization before ingestion into Log Analytics. DCR transformations are KQL-only, so this needs an upstream agent or Azure Function approach. |
|
|
231
|
+
| [DataBahn](https://databahn.ai) | Open — contributors welcome | Wanted | Sanitizer stage in a DataBahn pipeline, ahead of any downstream destination. |
|
|
232
|
+
| [Observo AI](https://observo.ai) | Open — contributors welcome | Wanted | Sanitizer stage in an Observo pipeline, complementing its own reduction and routing. |
|
|
233
|
+
| [Axoflow / AxoSyslog](https://axoflow.com) | Open — contributors welcome | Wanted | Sanitization in an AxoSyslog / Axoflow pipeline before forwarding to a SIEM or object storage. |
|
|
234
|
+
| [Abstract Security](https://www.abstract.security) | Open — contributors welcome | Wanted | Sanitizer stage in an Abstract streaming pipeline ahead of routing to a lake or SIEM. |
|
|
235
|
+
| [VirtualMetric DataStream](https://virtualmetric.com) | Open — contributors welcome | Wanted | Sanitization stage in a DataStream pipeline before delivery to downstream destinations. |
|
|
236
|
+
| [Beacon](https://beacon.security/) | Open — contributors welcome | Wanted | Sanitization stage in a Beacon pipeline before delivery to downstream destinations. |
|
|
237
|
+
|
|
238
|
+
### Contributing an integration
|
|
239
|
+
|
|
240
|
+
Integrations live in their own repositories under their own maintainers; this table is just an index. To be listed, open a PR adding a row with a working link, and make sure the project:
|
|
241
|
+
|
|
242
|
+
- pins a released `@socprime/logtotal-sanitizer` version and states the minimum supported one
|
|
243
|
+
- reads the HMAC key from the host platform's secret store, never from a config file or
|
|
244
|
+
a hardcoded default
|
|
245
|
+
- documents that token stability requires the same key, library version, and rule set
|
|
246
|
+
across every node
|
|
247
|
+
- ships a synthetic sample for testing, with no real log data
|
|
@@ -314,6 +314,15 @@ var homePathsRule = {
|
|
|
314
314
|
validate: validateHomeUser
|
|
315
315
|
};
|
|
316
316
|
|
|
317
|
+
// src/rules/shared/windowsAccounts.ts
|
|
318
|
+
var BACKSLASH = "\\\\";
|
|
319
|
+
var JSON_BACKSLASH = "\\\\\\\\";
|
|
320
|
+
var WINDOWS_FILE_EXT = "exe|dll|sys|bat|cmd|ps1|vbs|msi|tmp|hiv|log|dat|txt|ini|xml|json|lnk|cpl|ocx|drv";
|
|
321
|
+
var NOT_WINDOWS_FILENAME = `(?![A-Za-z0-9_$.-]*\\.(?:${WINDOWS_FILE_EXT})(?![A-Za-z0-9]))`;
|
|
322
|
+
var WELL_KNOWN_DOMAIN = "(?:BUILTIN|NT SERVICE|NT AUTHORITY|Users|Settings|Files)";
|
|
323
|
+
var NETBIOS_DOMAIN = "[A-Za-z0-9](?:[A-Za-z0-9.-]{0,13}[A-Za-z0-9])?";
|
|
324
|
+
var ACCOUNT_SEGMENT = "[A-Za-z0-9_](?:[A-Za-z0-9_.$-]*[A-Za-z0-9$])";
|
|
325
|
+
|
|
317
326
|
// src/rules/definitions/hostnames.ts
|
|
318
327
|
var GTLD = [
|
|
319
328
|
"abbott",
|
|
@@ -1279,10 +1288,39 @@ var TLD_COLLISION = FILE_EXT_COLLISION_TLDS.join("|");
|
|
|
1279
1288
|
var LABEL = "[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?";
|
|
1280
1289
|
var HOST_EXACT = `(?:(?<![\\w.$-])(?<![^:/\\\\][/\\\\])(?:${LABEL}\\.)+(?:${TLD_EXACT})(?!\\.?\\w))`;
|
|
1281
1290
|
var HOST_COLLISION = `(?:(?:https?|sftp|ftps?|wss?)://(?:[^/@\\s]+@)?)((?:${LABEL}\\.)+(?:${TLD_COLLISION}))(?!\\.?\\w)`;
|
|
1282
|
-
|
|
1291
|
+
function uncComputerPattern(separator) {
|
|
1292
|
+
return `(?:${separator}${separator})([A-Za-z][A-Za-z0-9-]{0,14})(?=${separator}[A-Za-z0-9$])`;
|
|
1293
|
+
}
|
|
1294
|
+
var UNC_COMPUTER = uncComputerPattern(BACKSLASH);
|
|
1295
|
+
var UNC_COMPUTER_JSON = uncComputerPattern(JSON_BACKSLASH);
|
|
1283
1296
|
var SPN_HOST = "(?:\\b[A-Za-z][A-Za-z0-9]*/)([A-Za-z0-9][A-Za-z0-9.-]*)(?=@[A-Z0-9.-]+\\b)";
|
|
1284
1297
|
var HOST_CTX_KEY = "(?:host|hostname|computer)";
|
|
1285
|
-
var
|
|
1298
|
+
var HOST_VALUE = "[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?";
|
|
1299
|
+
var HOST_CTX = `(?:\\b${HOST_CTX_KEY}\\s*[=:]\\s*)(${HOST_VALUE})`;
|
|
1300
|
+
function anyCase(word) {
|
|
1301
|
+
let pattern = "";
|
|
1302
|
+
for (const char of word) {
|
|
1303
|
+
const lower = char.toLowerCase();
|
|
1304
|
+
const upper = char.toUpperCase();
|
|
1305
|
+
pattern += lower === upper ? char : `[${lower}${upper}]`;
|
|
1306
|
+
}
|
|
1307
|
+
return pattern;
|
|
1308
|
+
}
|
|
1309
|
+
var QUOTED_DOMAIN_ACCOUNT = `(?:")(?!${WELL_KNOWN_DOMAIN}\\\\{1,2})(${NETBIOS_DOMAIN})(?=\\\\{1,2}${NOT_WINDOWS_FILENAME}${ACCOUNT_SEGMENT}")`;
|
|
1310
|
+
var KEY_WORD = "[A-Za-z_]*";
|
|
1311
|
+
var JSON_HOST_KEY = [
|
|
1312
|
+
`${KEY_WORD}${anyCase("computer")}${KEY_WORD}`,
|
|
1313
|
+
`${KEY_WORD}${anyCase("domain")}[_-]?${anyCase("name")}`,
|
|
1314
|
+
`${anyCase("host")}(?:[_-]?${anyCase("name")})?`,
|
|
1315
|
+
anyCase("fqdn"),
|
|
1316
|
+
anyCase("domain"),
|
|
1317
|
+
`${anyCase("server")}[_-]?${anyCase("name")}`,
|
|
1318
|
+
`${anyCase("node")}[_-]?${anyCase("name")}`,
|
|
1319
|
+
`${anyCase("dns")}[_-]?${anyCase("name")}`,
|
|
1320
|
+
`${anyCase("machine")}[_-]?${anyCase("name")}`,
|
|
1321
|
+
`${anyCase("target")}[_-]?${anyCase("host")}`
|
|
1322
|
+
].join("|");
|
|
1323
|
+
var HOST_JSON_CTX = `(?:"(?:${JSON_HOST_KEY})"\\s*:\\s*")(${HOST_VALUE})(?=")`;
|
|
1286
1324
|
var NETBIOS_AGGRESSIVE = "(?:\\b(?:WIN|DESKTOP)-[A-Z0-9]{7,10}\\b)";
|
|
1287
1325
|
var SYSLOG_MONTH = "(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
|
|
1288
1326
|
var SYSLOG_BSD_TS = `${SYSLOG_MONTH}\\s+\\d{1,2}\\s+\\d{2}:\\d{2}:\\d{2}`;
|
|
@@ -1295,23 +1333,35 @@ var INVENTORY_HOST = `(?:\\b${INVENTORY_PREFIX}-[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*-\
|
|
|
1295
1333
|
var hostnamesRule = {
|
|
1296
1334
|
id: "hosts",
|
|
1297
1335
|
label: "Hostnames & domains",
|
|
1298
|
-
description: "FQDNs, UNC computer names, Kerberos SPN hosts and syslog host fields become the same token everywhere within a session.",
|
|
1336
|
+
description: "FQDNs, UNC computer names, Kerberos SPN hosts, quoted JSON host fields, the domain half of a quoted DOMAIN\\account value and syslog host fields become the same token everywhere within a session.",
|
|
1299
1337
|
mode: "pseudo",
|
|
1300
1338
|
token: "HOST",
|
|
1301
|
-
patterns: [
|
|
1339
|
+
patterns: [
|
|
1340
|
+
HOST_EXACT,
|
|
1341
|
+
HOST_COLLISION,
|
|
1342
|
+
UNC_COMPUTER,
|
|
1343
|
+
UNC_COMPUTER_JSON,
|
|
1344
|
+
SPN_HOST,
|
|
1345
|
+
HOST_CTX,
|
|
1346
|
+
HOST_JSON_CTX,
|
|
1347
|
+
QUOTED_DOMAIN_ACCOUNT,
|
|
1348
|
+
SYSLOG_HOST
|
|
1349
|
+
],
|
|
1302
1350
|
aggressivePatterns: [NETBIOS_AGGRESSIVE, INVENTORY_HOST],
|
|
1303
1351
|
jsonKeys: [
|
|
1304
1352
|
"hostname",
|
|
1305
1353
|
"host",
|
|
1306
1354
|
"fqdn",
|
|
1307
1355
|
"domain",
|
|
1356
|
+
"computer",
|
|
1308
1357
|
"computerName",
|
|
1309
1358
|
"serverName",
|
|
1310
1359
|
"nodeName",
|
|
1311
1360
|
"dnsName",
|
|
1312
1361
|
"machineName",
|
|
1313
1362
|
"targetHost"
|
|
1314
|
-
]
|
|
1363
|
+
],
|
|
1364
|
+
jsonKeyContains: ["computer", "domainname"]
|
|
1315
1365
|
};
|
|
1316
1366
|
|
|
1317
1367
|
// src/rules/definitions/ipAddresses.ts
|
|
@@ -1991,15 +2041,18 @@ var EMAIL_LOCAL = "[A-Za-z0-9._%+-]+";
|
|
|
1991
2041
|
var EMAIL_DOMAIN = "[A-Za-z0-9.-]+\\.[A-Za-z]{2,}";
|
|
1992
2042
|
var EMAIL = `(?:\\b${EMAIL_LOCAL}@${EMAIL_DOMAIN})`;
|
|
1993
2043
|
var EMAIL_IP_LITERAL = `(?:\\b${EMAIL_LOCAL}@\\[[0-9a-fA-F.:]+\\])`;
|
|
1994
|
-
var
|
|
1995
|
-
var USER_SEG_SIMPLE = "[A-Za-z0-9_](?:[A-Za-z0-9_.$-]*[A-Za-z0-9$])";
|
|
1996
|
-
var FILE_EXT = "exe|dll|sys|bat|cmd|ps1|vbs|msi|tmp|hiv|log|dat|txt|ini|xml|json|lnk|cpl|ocx|drv";
|
|
1997
|
-
var NOT_FILENAME = `(?![A-Za-z0-9_$.-]*\\.(?:${FILE_EXT})(?![A-Za-z0-9]))`;
|
|
2044
|
+
var USER_SEG_SIMPLE = ACCOUNT_SEGMENT;
|
|
1998
2045
|
var NOT_GUID = "(?![0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-)";
|
|
1999
2046
|
var ACCOUNT_END = "(?![A-Za-z0-9_$\\\\/-])";
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2047
|
+
function domainUserPattern(separator) {
|
|
2048
|
+
const winDomainExclude = `${WELL_KNOWN_DOMAIN}${separator}`;
|
|
2049
|
+
const pathRoot = `(?:\\b(?:HKLM|HKCU|HKU|HKCR|HKEY_[A-Z_]+)|\\b[A-Za-z]:)${separator}`;
|
|
2050
|
+
const notUnderPathRoot = `(?<!${pathRoot}(?:(?! [-/])[^<>'"\\n])*)`;
|
|
2051
|
+
const domain = `(?:^|[^\\\\.-])\\b${NETBIOS_DOMAIN}${separator}`;
|
|
2052
|
+
return `(?:(?:${domain})(?<!${winDomainExclude})${NOT_WINDOWS_FILENAME}${NOT_GUID}(${USER_SEG_SIMPLE})${ACCOUNT_END}${notUnderPathRoot})`;
|
|
2053
|
+
}
|
|
2054
|
+
var DOMAIN_USER = domainUserPattern(BACKSLASH);
|
|
2055
|
+
var DOMAIN_USER_JSON = domainUserPattern(JSON_BACKSLASH);
|
|
2003
2056
|
var SID = "(?:\\bS-1-(?:\\d+-){1,14}\\d+\\b)";
|
|
2004
2057
|
var VALUE_WITH_LETTER = "[\\w.@+-]*[A-Za-z][\\w.@+-]*";
|
|
2005
2058
|
var LDAP_DN_SINGLE = `(?:\\b(?:uid|sAMAccountName)=)(${VALUE_WITH_LETTER})`;
|
|
@@ -2060,6 +2113,7 @@ var usersRule = {
|
|
|
2060
2113
|
EMAIL_IP_LITERAL,
|
|
2061
2114
|
EMAIL,
|
|
2062
2115
|
DOMAIN_USER,
|
|
2116
|
+
DOMAIN_USER_JSON,
|
|
2063
2117
|
SID,
|
|
2064
2118
|
LDAP_DN_SINGLE,
|
|
2065
2119
|
LDAP_DN_CN,
|
|
@@ -2100,7 +2154,8 @@ var usersRule = {
|
|
|
2100
2154
|
"surname",
|
|
2101
2155
|
"userId",
|
|
2102
2156
|
"uid"
|
|
2103
|
-
]
|
|
2157
|
+
],
|
|
2158
|
+
jsonKeyContains: ["owner", "username"]
|
|
2104
2159
|
};
|
|
2105
2160
|
|
|
2106
2161
|
// src/rules/registry.ts
|
|
@@ -2316,6 +2371,14 @@ function validateRule(rule) {
|
|
|
2316
2371
|
requireText(key, id, `jsonKeys[${index}]`);
|
|
2317
2372
|
}
|
|
2318
2373
|
}
|
|
2374
|
+
if (rule.jsonKeyContains !== void 0) {
|
|
2375
|
+
if (!Array.isArray(rule.jsonKeyContains)) {
|
|
2376
|
+
throw new InvalidRuleError(`Rule "${id}": \`jsonKeyContains\` must be an array of strings.`);
|
|
2377
|
+
}
|
|
2378
|
+
for (const [index, fragment] of rule.jsonKeyContains.entries()) {
|
|
2379
|
+
requireText(fragment, id, `jsonKeyContains[${index}]`);
|
|
2380
|
+
}
|
|
2381
|
+
}
|
|
2319
2382
|
if (rule.validate !== void 0 && typeof rule.validate !== "function") {
|
|
2320
2383
|
throw new InvalidRuleError(`Rule "${id}": \`validate\` must be a function.`);
|
|
2321
2384
|
}
|
|
@@ -2342,5 +2405,5 @@ exports.getBuiltinRule = getBuiltinRule;
|
|
|
2342
2405
|
exports.isSanitizerError = isSanitizerError;
|
|
2343
2406
|
exports.lineHasAnyChar = lineHasAnyChar;
|
|
2344
2407
|
exports.validateRule = validateRule;
|
|
2345
|
-
//# sourceMappingURL=chunk-
|
|
2346
|
-
//# sourceMappingURL=chunk-
|
|
2408
|
+
//# sourceMappingURL=chunk-EUNFMCKE.cjs.map
|
|
2409
|
+
//# sourceMappingURL=chunk-EUNFMCKE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/errors.ts","../src/rules/definitions/geoLocation.ts","../src/rules/definitions/govIdentifiers.ts","../src/rules/definitions/healthInfo.ts","../src/rules/definitions/homePaths.ts","../src/rules/shared/windowsAccounts.ts","../src/rules/definitions/hostnames.ts","../src/rules/definitions/ipAddresses.ts","../src/rules/shared/hmacSha256.ts","../src/rules/definitions/paymentInfo.ts","../src/rules/definitions/phoneNumbers.ts","../src/rules/definitions/secrets.ts","../src/rules/definitions/sessionCookies.ts","../src/rules/definitions/users.ts","../src/rules/registry.ts","../src/core/regexSource.ts","../src/rules/validateRule.ts","../src/rules/defineRule.ts"],"names":["luhnCheck"],"mappings":";;;AAAA,IAAM,WAAA,mBAAc,MAAA,CAAO,GAAA,CAAI,oCAAoC,CAAA;AAe5D,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA;AAAA,EAE/B,IAAA;AAAA,EAET,WAAA,CAAY,MAA0B,OAAA,EAAiB;AACrD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,WAAA,EAAa,EAAE,OAAO,IAAA,EAAM,UAAA,EAAY,OAAO,CAAA;AAAA,EAC7E;AACF;AAGO,IAAM,gBAAA,GAAN,cAA+B,cAAA,CAAe;AAAA,EACnD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,gBAAgB,OAAO,CAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;AAGO,IAAM,gBAAA,GAAN,cAA+B,cAAA,CAAe;AAAA,EACnD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,gBAAgB,OAAO,CAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,cAAA,CAAe;AAAA,EAClD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,eAAe,OAAO,CAAA;AAC5B,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAGO,IAAM,kBAAA,GAAN,cAAiC,cAAA,CAAe;AAAA,EACrD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,kBAAkB,OAAO,CAAA;AAC/B,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAGO,IAAM,wBAAA,GAAN,cAAuC,cAAA,CAAe;AAAA,EAC3D,WAAA,CAAY,UAAU,2BAAA,EAA6B;AACjD,IAAA,KAAA,CAAM,WAAW,OAAO,CAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,EACd;AACF;AAQO,SAAS,iBAAiB,KAAA,EAAyC;AACxE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,WAAA,IAAe,KAAA;AACvE;;;ACzEA,SAAS,gBAAgB,KAAA,EAAoD;AAC3E,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAE5C,EAAA,IAAI,CAAC,4BAAA,CAA6B,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,QAAA,CAAS,MAAM,MAAM,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AACzB,EAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AAEzB,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,GAAG,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,KAAK,GAAA,EAAI;AACpB;AAEA,SAAS,iBAAA,CAAkB,KAAa,GAAA,EAAsB;AAC5D,EAAA,IAAI,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,CAAA,EAAG;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,GAAA,IAAO,GAAA,IAAO,EAAA,IAAM,GAAA,IAAO,QAAQ,GAAA,IAAO,GAAA;AAC1D;AAEA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,MAAM,IAAA,GAAO,gBAAgB,KAAK,CAAA;AAElC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,OAAA,GAAU,kBAAA;AAChB,IAAM,OAAA,GAAU,4BAAA;AAChB,IAAM,OAAA,GAAU,qCAAA;AAChB,IAAM,QAAA,GAAW,iCAAA;AACjB,IAAM,GAAA,GAAM,oCAAA;AACZ,IAAM,OAAA,GAAU,2BAAA;AAET,IAAM,eAAA,GAAgC;AAAA,EAC3C,EAAA,EAAI,aAAA;AAAA,EACJ,KAAA,EAAO,cAAA;AAAA,EACP,WAAA,EACE,2LAAA;AAAA,EACF,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,KAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,wEAAA;AAAA,IACA,4EAAA;AAAA,IACA,SAAS,OAAO,CAAA,gCAAA,CAAA;AAAA,IAChB,SAAS,OAAO,CAAA,gCAAA,CAAA;AAAA,IAChB,8BAA8B,OAAO,CAAA,UAAA,CAAA;AAAA,IACrC,CAAA,cAAA,EAAiB,GAAG,CAAA,QAAA,EAAW,GAAG,CAAA,gBAAA,CAAA;AAAA,IAClC,CAAA,0DAAA,CAAA;AAAA,IACA,2DAAA;AAAA,IACA,SAAS,OAAO,CAAA,oCAAA;AAAA,GAClB;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,wEAAA;AAAA,IACA,4EAAA;AAAA,IACA,aAAa,QAAQ,CAAA,8BAAA;AAAA,GACvB;AAAA,EACA,QAAA,EAAU,WAAA;AAAA,EACV,QAAA,EAAU;AAAA,IACR,UAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA;AAEJ,CAAA;;;ACtFA,SAAS,UAAU,MAAA,EAAyB;AAC1C,EAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AAChD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,KAAA,IAAS,IAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EAAG;AAC9C,IAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAE5B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,KAAA,IAAS,CAAA;AAAA,MACX;AAAA,IACF;AAEA,IAAA,GAAA,IAAO,KAAA;AACP,IAAA,QAAA,GAAW,CAAC,QAAA;AAAA,EACd;AAEA,EAAA,OAAO,MAAM,EAAA,KAAO,CAAA;AACtB;AAEA,SAAS,UAAA,CAAW,IAAA,EAAc,KAAA,EAAe,MAAA,EAAyB;AACxE,EAAA,IAAI,SAAS,KAAA,IAAS,IAAA,KAAS,SAAS,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5D,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,KAAU,QAAQ,MAAA,KAAW,MAAA;AACtC;AAEA,SAAS,WAAA,CAAY,IAAA,EAAc,KAAA,EAAe,MAAA,EAAyB;AACzE,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,WAAW,MAAA,EAAQ;AAC9C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAE7B,EAAA,OACG,QAAA,IAAY,EAAA,IAAM,QAAA,IAAY,EAAA,IAC9B,QAAA,IAAY,MAAM,QAAA,IAAY,EAAA,IAC9B,QAAA,IAAY,EAAA,IAAM,QAAA,IAAY,EAAA;AAEnC;AAEA,SAAS,WAAW,MAAA,EAAyB;AAC3C,EAAA,IAAI,CAAC,WAAW,IAAA,CAAK,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACnD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,IAAA,GAAA,IAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,KAAK,EAAA,GAAK,CAAA,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,YAAY,GAAA,GAAM,EAAA;AACxB,EAAA,IAAI,QAAQ,EAAA,GAAK,SAAA;AAEjB,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,KAAA,GAAQ,CAAA;AAAA,EACV;AAEA,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,KAAU,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AACnC;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,MAAM,MAAA,GAAS,2BAAA,CAA4B,IAAA,CAAK,KAAK,CAAA;AAErD,EAAA,IAAI,MAAA,GAAS,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,EAAG;AACzC,IAAA,OACE,UAAA,CAAW,OAAO,CAAC,CAAA,EAAG,OAAO,CAAC,CAAA,EAAG,OAAO,CAAC,CAAC,KAAK,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EAE9F;AAEA,EAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA,EAAG;AACrC,IAAA,OAAO,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA,EAAG;AACrC,IAAA,OAAO,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,EAC3C;AAEA,EAAA,MAAM,WAAA,GAAc,gDAAA,CAAiD,IAAA,CAAK,KAAK,CAAA;AAC/E,EAAA,MAAM,SAAA,GAAY,cAAc,CAAC,CAAA;AAEjC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,WAAW,SAAS,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,OAAA,GACJ,6FAAA;AACF,IAAM,MAAA,GAAS,4EAAA;AAER,IAAM,kBAAA,GAAmC;AAAA,EAC9C,EAAA,EAAI,QAAA;AAAA,EACJ,KAAA,EAAO,wBAAA;AAAA,EACP,WAAA,EAAa,4EAAA;AAAA,EACb,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,gDAAA;AAAA,IACA,gCAAA;AAAA,IACA,gCAAA;AAAA,IACA,gCAAA;AAAA,IACA,0DAAA;AAAA,IACA,sFAAA;AAAA,IACA,mJAAA;AAAA,IACA,SAAS,OAAO,CAAA,yBAAA,CAAA;AAAA,IAChB,qGAAA;AAAA,IACA,SAAS,MAAM,CAAA,iCAAA;AAAA,GACjB;AAAA,EACA,kBAAA,EAAoB,CAAC,8BAAA,EAAgC,qBAAqB,CAAA;AAAA,EAC1E,QAAA,EAAU,aAAA;AAAA,EACV,QAAA,EAAU;AAAA,IACR,KAAA;AAAA,IACA,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,sBAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA;AAEJ,CAAA;;;AC1IA,SAAS,WAAW,KAAA,EAAwB;AAC1C,EAAA,IAAI,CAAC,yBAAA,CAA0B,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC5B,EAAA,MAAM,GAAA,GACJ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,GAChB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,GAChB,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA,GAChB,CAAA,IAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAE/D,EAAA,OAAO,GAAA,GAAM,EAAA,KAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AACtC;AAEA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,IAAI,yBAAA,CAA0B,IAAA,CAAK,KAAK,CAAA,EAAG;AACzC,IAAA,OAAO,WAAW,KAAK,CAAA;AAAA,EACzB;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,OAAA,GAAU,qDAAA;AAET,IAAM,cAAA,GAA+B;AAAA,EAC1C,EAAA,EAAI,YAAA;AAAA,EACJ,KAAA,EAAO,8BAAA;AAAA,EACP,WAAA,EACE,iOAAA;AAAA,EACF,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,KAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,+EAAA;AAAA,IACA,yFAAA;AAAA,IACA,sEAAA;AAAA,IACA,iDAAA;AAAA,IACA,2DAAA;AAAA,IACA,kCAAA;AAAA,IACA,+CAAA;AAAA,IACA,SAAS,OAAO,CAAA,kCAAA;AAAA,GAClB;AAAA,EACA,kBAAA,EAAoB,CAAC,oEAAoE,CAAA;AAAA,EACzF,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU;AAAA,IACR,WAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,qBAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA;AAEJ,CAAA;;;AC/DA,IAAM,QAAA,GAAW,CAAA,gBAAA,CAAA;AAEjB,SAAS,iBAAiB,KAAA,EAAwB;AAChD,EAAA,OAAO,KAAA,KAAU,OAAO,KAAA,KAAU,IAAA;AACpC;AAEO,IAAM,aAAA,GAA8B;AAAA,EACzC,EAAA,EAAI,OAAA;AAAA,EACJ,KAAA,EAAO,0BAAA;AAAA,EACP,WAAA,EACE,uJAAA;AAAA,EACF,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,oBAAoB,QAAQ,CAAA,EAAA,CAAA;AAAA,IAC5B,iBAAiB,QAAQ,CAAA,EAAA,CAAA;AAAA,IACzB,iBAAiB,QAAQ,CAAA,EAAA,CAAA;AAAA,IACzB,aAAa,QAAQ,CAAA,EAAA,CAAA;AAAA,IACrB,cAAc,QAAQ,CAAA,EAAA,CAAA;AAAA,IACtB,6BAA6B,QAAQ,CAAA,EAAA,CAAA;AAAA,IACrC,uBAAuB,QAAQ,CAAA,EAAA,CAAA;AAAA,IAC/B,4CAA4C,QAAQ,CAAA,EAAA,CAAA;AAAA,IACpD,8CAA8C,QAAQ,CAAA,EAAA,CAAA;AAAA,IACtD,qCAAqC,QAAQ,CAAA,EAAA,CAAA;AAAA,IAC7C,2BAA2B,QAAQ,CAAA,EAAA,CAAA;AAAA,IACnC,wCAAwC,QAAQ,CAAA,EAAA;AAAA,GAClD;AAAA,EACA,QAAA,EAAU;AACZ,CAAA;;;AC9BO,IAAM,SAAA,GAAY,MAAA;AAElB,IAAM,cAAA,GAAiB,UAAA;AAEvB,IAAM,gBAAA,GACX,kFAAA;AAEK,IAAM,oBAAA,GAAuB,4BAA4B,gBAAgB,CAAA,iBAAA,CAAA;AAEzE,IAAM,iBAAA,GAAoB,0DAAA;AAE1B,IAAM,cAAA,GAAiB,gDAAA;AAEvB,IAAM,eAAA,GAAkB,8CAAA;;;ACH/B,IAAM,IAAA,GAAO;AAAA,EACX,QAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA;AAAA,EACA,4CAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,gCAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,sCAAA;AAAA,EACA,wDAAA;AAAA,EACA,oBAAA;AAAA,EACA,sCAAA;AAAA,EACA,0BAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,oEAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,oBAAA;AAAA,EACA,0BAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,gCAAA;AAAA,EACA,0BAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,0BAAA;AAAA,EACA,4CAAA;AAAA,EACA,4CAAA;AAAA,EACA,cAAA;AAAA,EACA,gCAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,sCAAA;AAAA,EACA,oBAAA;AAAA,EACA,sCAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,4CAAA;AAAA,EACA,0BAAA;AAAA,EACA,gCAAA;AAAA,EACA,sCAAA;AAAA,EACA,gCAAA;AAAA,EACA,4CAAA;AAAA,EACA,sCAAA;AAAA,EACA,gCAAA;AAAA,EACA,sCAAA;AAAA,EACA,kDAAA;AAAA,EACA,gCAAA;AAAA,EACA,0BAAA;AAAA,EACA,sCAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,gCAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,oBAAA;AAAA,EACA,0BAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,qBAAA;AAAA,EACA,sBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,sCAAA;AAAA,EACA,4CAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,sCAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,iBAAA,GAAoB;AAAA,EACxB,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,0BAAA,GAA6B;AAAA,EACjC,uBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,iBAAA,GAAoB,IAAI,GAAA,CAAI,uBAAuB,CAAA;AACzD,IAAM,iBAAA,GAAoB,KAAK,MAAA,CAAO,CAAC,QAAQ,CAAC,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAC,CAAA;AAE1E,IAAM,SAAA,GAAY,CAAC,GAAG,0BAAA,EAA4B,GAAG,iBAAA,EAAmB,GAAG,iBAAiB,CAAA,CAAE,IAAA;AAAA,EAC5F;AACF,CAAA;AACA,IAAM,aAAA,GAAgB,uBAAA,CAAwB,IAAA,CAAK,GAAG,CAAA;AACtD,IAAM,KAAA,GAAQ,+CAAA;AAEd,IAAM,UAAA,GAAa,CAAA,wCAAA,EAA2C,KAAK,CAAA,QAAA,EAAW,SAAS,CAAA,aAAA,CAAA;AAEvF,IAAM,cAAA,GAAiB,CAAA,oDAAA,EAAuD,KAAK,CAAA,QAAA,EAAW,aAAa,CAAA,aAAA,CAAA;AAE3G,SAAS,mBAAmB,SAAA,EAA2B;AACrD,EAAA,OAAO,CAAA,GAAA,EAAM,SAAS,CAAA,EAAG,SAAS,mCAAmC,SAAS,CAAA,aAAA,CAAA;AAChF;AAEA,IAAM,YAAA,GAAe,mBAAmB,SAAS,CAAA;AACjD,IAAM,iBAAA,GAAoB,mBAAmB,cAAc,CAAA;AAE3D,IAAM,QAAA,GAAW,4EAAA;AAEjB,IAAM,YAAA,GAAe,4BAAA;AACrB,IAAM,UAAA,GAAa,2CAAA;AACnB,IAAM,QAAA,GAAW,CAAA,MAAA,EAAS,YAAY,CAAA,cAAA,EAAiB,UAAU,CAAA,CAAA,CAAA;AAEjE,SAAS,QAAQ,IAAA,EAAsB;AACrC,EAAA,IAAI,OAAA,GAAU,EAAA;AAEd,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,IAAA,OAAA,IAAW,UAAU,KAAA,GAAQ,IAAA,GAAO,CAAA,CAAA,EAAI,KAAK,GAAG,KAAK,CAAA,CAAA,CAAA;AAAA,EACvD;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,qBAAA,GAAwB,WAAW,iBAAiB,CAAA,WAAA,EAAc,cAAc,CAAA,aAAA,EAAgB,oBAAoB,GAAG,eAAe,CAAA,EAAA,CAAA;AAE5I,IAAM,QAAA,GAAW,YAAA;AACjB,IAAM,aAAA,GAAgB;AAAA,EACpB,GAAG,QAAQ,CAAA,EAAG,QAAQ,UAAU,CAAC,GAAG,QAAQ,CAAA,CAAA;AAAA,EAC5C,CAAA,EAAG,QAAQ,CAAA,EAAG,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAA,EAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,EACtD,GAAG,OAAA,CAAQ,MAAM,CAAC,CAAA,QAAA,EAAW,OAAA,CAAQ,MAAM,CAAC,CAAA,EAAA,CAAA;AAAA,EAC5C,QAAQ,MAAM,CAAA;AAAA,EACd,QAAQ,QAAQ,CAAA;AAAA,EAChB,GAAG,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAA,EAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,EAC3C,GAAG,OAAA,CAAQ,MAAM,CAAC,CAAA,KAAA,EAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,EACzC,GAAG,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAA,EAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,EACxC,GAAG,OAAA,CAAQ,SAAS,CAAC,CAAA,KAAA,EAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,EAC5C,GAAG,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAA,EAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7C,CAAA,CAAE,KAAK,GAAG,CAAA;AACV,IAAM,aAAA,GAAgB,CAAA,OAAA,EAAU,aAAa,CAAA,cAAA,EAAiB,UAAU,CAAA,MAAA,CAAA;AAExE,IAAM,kBAAA,GAAqB,0CAAA;AAE3B,IAAM,YAAA,GAAe,qDAAA;AACrB,IAAM,aAAA,GAAgB,GAAG,YAAY,CAAA,oCAAA,CAAA;AACrC,IAAM,aAAA,GACJ,mFAAA;AACF,IAAM,gBAAA,GAAmB,CAAA,EAAG,KAAK,CAAA,MAAA,EAAS,KAAK,CAAA,EAAA,CAAA;AAC/C,IAAM,qBAAA,GAAwB,kDAAA;AAC9B,IAAM,WAAA,GAAc,SAAS,aAAa,CAAA,CAAA,EAAI,aAAa,CAAA,OAAA,EAAU,gBAAgB,IAAI,qBAAqB,CAAA,CAAA;AAE9G,IAAM,gBAAA,GACJ,oGAAA;AACF,IAAM,cAAA,GAAiB,SAAS,gBAAgB,CAAA,wCAAA,CAAA;AAEzC,IAAM,aAAA,GAA8B;AAAA,EACzC,EAAA,EAAI,OAAA;AAAA,EACJ,KAAA,EAAO,qBAAA;AAAA,EACP,WAAA,EACE,qMAAA;AAAA,EACF,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,UAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,kBAAA,EAAoB,CAAC,kBAAA,EAAoB,cAAc,CAAA;AAAA,EACvD,QAAA,EAAU;AAAA,IACR,UAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,eAAA,EAAiB,CAAC,UAAA,EAAY,YAAY;AAC5C,CAAA;;;AC1iCA,IAAM,UAAA,GAAa,yCAAA;AACnB,IAAM,IAAA,GAAO,CAAA,iBAAA,EAAoB,UAAU,CAAA,MAAA,EAAS,UAAU,CAAA,kBAAA,CAAA;AAE9D,IAAM,QAAA,GAAW,kBAAA;AACjB,IAAM,SAAA,GAAY,CAAA,GAAA,EAAM,QAAQ,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAA;AAChD,IAAM,eAAA,GAAkB,CAAA,MAAA,EAAS,QAAQ,CAAA,YAAA,EAAe,QAAQ,CAAA,QAAA,EAAW,QAAQ,CAAA,IAAA,EAAO,QAAQ,CAAA,WAAA,EAAc,QAAQ,CAAA,UAAA,EAAa,QAAQ,CAAA,WAAA,EAAc,QAAQ,CAAA,UAAA,EAAa,QAAQ,CAAA,WAAA,EAAc,QAAQ,CAAA,UAAA,EAAa,QAAQ,CAAA,WAAA,EAAc,QAAQ,CAAA,OAAA,EAAU,QAAQ,CAAA,KAAA,EAAQ,QAAQ,CAAA,eAAA,EAAkB,QAAQ,CAAA,UAAA,CAAA;AACrT,IAAM,WAAA,GAAc,aAAa,IAAI,CAAA,CAAA,CAAA;AACrC,IAAM,OAAO,CAAA,sBAAA,EAAyB,WAAW,CAAA,CAAA,EAAI,SAAS,IAAI,eAAe,CAAA,iDAAA,CAAA;AAEjF,IAAM,MAAA,GAAS,4CAAA;AACf,IAAM,MAAA,GAAS,8CAAA;AAEf,IAAM,SAAA,GAAY,sDAAA;AAClB,IAAM,QAAA,GAAW,gDAAA;AACjB,IAAM,SAAA,GAAY,kDAAA;AAElB,SAAS,aAAa,EAAA,EAAsB;AAC1C,EAAA,OAAO,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACjC;AAEA,SAAS,eAAe,MAAA,EAA2B;AACjD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,CAAC,UAAU,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC7E,EAAA,OAAO,QAAA,CAAS,KAAK,GAAG,CAAA;AAC1B;AAEA,SAAS,eAAe,EAAA,EAAqB;AAC3C,EAAA,MAAM,MAAA,GAAS,aAAa,EAAE,CAAA;AAE9B,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG;AACtE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,EAAK;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,EAAG;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,CAAC,CAAA,KAAM,OAAO,MAAA,CAAO,CAAC,MAAM,GAAA,EAAK;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,CAAC,CAAA,IAAK,OAAO,MAAA,CAAO,CAAC,KAAK,GAAA,EAAK;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,eAAe,MAAM,CAAA;AAC9B;AAEA,SAAS,WAAW,KAAA,EAAwB;AAC1C,EAAA,IAAI,2BAAA,CAA4B,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3C,IAAA,OAAO,CAAC,eAAe,KAAK,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,cAAc,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AAE3C,EAAA,IAAI,WAAA,KAAgB,IAAA,IAAQ,WAAA,KAAgB,KAAA,EAAO;AACjD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,oCAAA,CAAqC,IAAA,CAAK,WAAW,CAAA;AAEpE,EAAA,IAAI,MAAA,GAAS,CAAC,CAAA,EAAG;AACf,IAAA,OAAO,CAAC,cAAA,CAAe,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,eAAA,GAAgC;AAAA,EAC3C,EAAA,EAAI,KAAA;AAAA,EACJ,KAAA,EAAO,mBAAA;AAAA,EACP,WAAA,EACE,mHAAA;AAAA,EACF,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,IAAA;AAAA,EACP,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,IAAA,EAAM,SAAA,EAAW,UAAU,SAAS,CAAA;AAAA,EACrE,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU;AAAA,IACR,IAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA;AAEJ,CAAA;;;AChGA,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,YAAA,GAAe,EAAA;AAErB,IAAM,CAAA,GAAI,IAAI,WAAA,CAAY;AAAA,EACxB,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EACpF,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EACpF,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,SAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EACpF,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,SAAA;AAAA,EACpF,SAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EACpF,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EACpF,SAAA;AAAA,EAAY,SAAA;AAAA,EAAY,SAAA;AAAA,EAAY,SAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EACpF,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY;AACtF,CAAC,CAAA;AAED,IAAM,aAAA,GAAgB,IAAI,WAAA,CAAY;AAAA,EACpC,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY;AACtF,CAAC,CAAA;AAED,SAAS,IAAA,CAAK,OAAe,IAAA,EAAsB;AACjD,EAAA,OAAA,CAAS,KAAA,KAAU,IAAA,GAAS,KAAA,IAAU,EAAA,GAAK,IAAA,MAAY,CAAA;AACzD;AAEA,SAAS,WAAW,OAAA,EAAiC;AACnD,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,GAAS,CAAA;AACnC,EAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAA,CAAM,QAAQ,MAAA,GAAS,CAAA,IAAK,WAAW,CAAA,GAAI,WAAA;AACrE,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,YAAY,CAAA;AAE1C,EAAA,MAAA,CAAO,IAAI,OAAO,CAAA;AAClB,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,GAAI,GAAA;AAEzB,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AACvC,EAAA,IAAA,CAAK,SAAA,CAAU,eAAe,CAAA,EAAG,IAAA,CAAK,MAAM,SAAA,GAAY,CAAA,IAAK,EAAE,CAAA,EAAG,KAAK,CAAA;AACvE,EAAA,IAAA,CAAK,SAAA,CAAU,YAAA,GAAe,CAAA,EAAG,SAAA,KAAc,GAAG,KAAK,CAAA;AAEvD,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,OAAO,OAAA,EAAiC;AACtD,EAAA,MAAM,MAAA,GAAS,WAAW,OAAO,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,aAAa,CAAA;AAC5C,EAAA,MAAM,CAAA,GAAI,IAAI,WAAA,CAAY,EAAE,CAAA;AAE5B,EAAA,KAAA,IAAS,SAAS,CAAA,EAAG,MAAA,GAAS,MAAA,CAAO,MAAA,EAAQ,UAAU,WAAA,EAAa;AAClE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAK,CAAA,EAAG;AAC9B,MAAA,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA,GAAI,GAAG,KAAK,CAAA;AAAA,IAC7C;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAA,EAAI,KAAK,CAAA,EAAG;AAC/B,MAAA,MAAM,KAAK,IAAA,CAAK,CAAA,CAAE,IAAI,EAAE,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,EAAE,IAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,KAAM,CAAA;AACrE,MAAA,MAAM,KAAK,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,IAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,KAAM,EAAA;AACnE,MAAA,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAI,EAAA,KAAQ,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA;AAE/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAK,CAAA,EAAG;AAC9B,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA;AAChD,MAAA,MAAM,EAAA,GAAM,CAAA,GAAI,CAAA,GAAM,CAAC,CAAA,GAAI,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAS,IAAI,EAAA,GAAK,EAAA,GAAK,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,KAAO,CAAA;AAC9C,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA;AAChD,MAAA,MAAM,GAAA,GAAO,CAAA,GAAI,CAAA,GAAM,CAAA,GAAI,IAAM,CAAA,GAAI,CAAA;AACrC,MAAA,MAAM,KAAA,GAAS,KAAK,GAAA,KAAS,CAAA;AAE7B,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAK,IAAI,KAAA,KAAW,CAAA;AACpB,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAK,QAAQ,KAAA,KAAW,CAAA;AAAA,IAC1B;AAEA,IAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,CAAA,KAAO,CAAA;AAC9B,IAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,CAAA,KAAO,CAAA;AAC9B,IAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,CAAA,KAAO,CAAA;AAC9B,IAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,CAAA,KAAO,CAAA;AAC9B,IAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,CAAA,KAAO,CAAA;AAC9B,IAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,CAAA,KAAO,CAAA;AAC9B,IAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,CAAA,KAAO,CAAA;AAC9B,IAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,CAAA,KAAO,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,YAAY,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,IAAI,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAE7C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,IAAA,UAAA,CAAW,UAAU,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,CAAC,GAAG,KAAK,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,MAAA;AACT;;;ACzFA,IAAM,eAAA,GAAkB,4DAAA;AAExB,SAASA,WAAU,MAAA,EAAyB;AAC1C,EAAA,IAAI,CAAC,cAAc,IAAA,CAAK,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,KAAA,IAAS,IAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EAAG;AAC9C,IAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAE5B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,KAAA,IAAS,CAAA;AAAA,MACX;AAAA,IACF;AAEA,IAAA,GAAA,IAAO,KAAA;AACP,IAAA,QAAA,GAAW,CAAC,QAAA;AAAA,EACd;AAEA,EAAA,OAAO,MAAM,EAAA,KAAO,CAAA;AACtB;AAEA,SAAS,UAAU,IAAA,EAAuB;AACxC,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,EAAE,WAAA,EAAY;AAEpD,EAAA,IAAI,CAAC,gCAAA,CAAiC,IAAA,CAAK,OAAO,CAAA,EAAG;AACnD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,QAAQ,KAAA,CAAM,CAAC,IAAI,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAC,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU,CAAC,IAAA,KAAS,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AACtF,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC1C,IAAA,SAAA,GAAA,CAAa,YAAY,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAK,EAAA;AAAA,EACtD;AAEA,EAAA,OAAO,SAAA,KAAc,CAAA;AACvB;AAEA,IAAM,kBAAA,uBAAyB,GAAA,CAAI;AAAA,EACjC,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,cAAc,OAAA,EAA0B;AAC/C,EAAA,OAAO,kBAAA,CAAmB,IAAI,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,aAAa,CAAA;AACjE;AAEA,SAAS,gBAAgB,KAAA,EAAwB;AAC/C,EAAA,OAAO,uDAAA,CAAwD,KAAK,KAAK,CAAA;AAC3E;AAEA,SAAS,sBAAsB,KAAA,EAAwB;AACrD,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAM,EAAE,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,MAAM,CAAA;AAE9D,EAAA,IAAI,OAAO,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,KAAW,CAAC,CAAA,EAAG;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IACE,OAAO,MAAA,KAAW,CAAA,IAClB,OAAO,CAAC,CAAA,KAAM,KACd,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KACb,OAAO,CAAC,CAAA,KAAM,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAA,EAClC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAErC,EAAA,OACE,OAAO,MAAA,IAAU,CAAA,IACjB,MAAA,CAAO,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,WAAW,MAAA,KAAW,CAAC,CAAA,IAClD,IAAA,IAAQ,KACR,IAAA,IAAQ,CAAA;AAEZ;AAEA,SAAS,mBAAmB,OAAA,EAA0B;AACpD,EAAA,MAAM,OAAA,GAAU,aAAa,OAAO,CAAA;AAEpC,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAClC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,OAAA,CAAQ,QAAA,CAAS,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAC,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAC,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AAErC,EAAA,OACE,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,CAAA,IACxB,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,KACxB,MAAA,CAAO,CAAC,MAAM,QAAA,CAAS,CAAC,KACxB,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,CAAA;AAE5B;AAEA,SAAS,aAAa,KAAA,EAAkC;AACtD,EAAA,MAAM,KAAA,GAAkB,CAAC,CAAC,CAAA;AAE1B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,IAAI,KAAA,GAAQ,eAAA,CAAgB,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AAE5C,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,MAAA,KAAA,IAAS,KAAA,CAAM,CAAC,CAAA,GAAI,EAAA;AACpB,MAAA,KAAA,CAAM,CAAC,IAAI,KAAA,GAAQ,GAAA;AACnB,MAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,QAAQ,CAAA,EAAG;AAChB,MAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,GAAG,CAAA;AACtB,MAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,OAAO,cAAc,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,WAAW,MAAM,GAAA,EAAK;AAC/D,IAAA,WAAA,IAAe,CAAA;AAAA,EACjB;AAEA,EAAA,IAAI,MAAM,KAAA,CAAM,MAAA;AAEhB,EAAA,OAAO,MAAM,CAAA,IAAK,KAAA,CAAM,GAAA,GAAM,CAAC,MAAM,CAAA,EAAG;AACtC,IAAA,GAAA,IAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,WAAA,GAAc,GAAG,CAAA;AAE5C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,KAAK,CAAA,EAAG;AAC/B,IAAA,GAAA,CAAI,cAAc,GAAA,GAAM,CAAA,GAAI,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAe,MAAA,EAAyB;AAC/C,EAAA,MAAM,EAAE,QAAO,GAAI,MAAA;AACnB,EAAA,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACpC,EAAA,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAEpC,EAAA,QAAQ,MAAA,CAAO,CAAC,CAAA;AAAG,IACjB,KAAK,GAAA;AACH,MAAA,OAAO,MAAA,KAAW,EAAA,IAAM,MAAA,KAAW,EAAA,IAAM,MAAA,KAAW,EAAA;AAAA,IACtD,KAAK,GAAA;AACH,MAAA,OAAO,MAAA,KAAW,EAAA,IAAM,EAAA,IAAM,EAAA,IAAM,EAAA,IAAM,EAAA;AAAA,IAC5C,KAAK,GAAA;AACH,MAAA,OAAO,MAAA,KAAW,EAAA,IAAM,EAAA,IAAM,IAAA,IAAQ,EAAA,IAAM,IAAA;AAAA,IAC9C,KAAK,GAAA;AACH,MAAA,IAAI,WAAW,EAAA,EAAI;AACjB,QAAA,OAAO,EAAA,KAAO,MAAM,EAAA,KAAO,EAAA;AAAA,MAC7B;AAEA,MAAA,IAAI,WAAW,EAAA,EAAI;AACjB,QAAA,OAAO,EAAA,KAAO,EAAA,IAAM,EAAA,KAAO,EAAA,IAAM,EAAA,KAAO,MAAO,EAAA,IAAM,GAAA,IAAQ,EAAA,IAAM,IAAA,IAAS,EAAA,KAAO,IAAA;AAAA,MACrF;AAEA,MAAA,OAAO,UAAU,EAAA,IAAM,MAAA,IAAU,EAAA,IAAM,EAAA,IAAM,QAAQ,EAAA,IAAM,IAAA;AAAA,IAC7D,KAAK,GAAA;AACH,MAAA,OACE,UAAU,EAAA,IACV,MAAA,IAAU,OACT,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,IACvB,MAAA,CAAO,UAAA,CAAW,IAAI,KACtB,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,IACtB,MAAA,CAAO,WAAW,IAAI,CAAA,CAAA;AAAA,IAE5B;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAEA,SAAS,gBAAgB,KAAA,EAAwB;AAC/C,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAE3C,EAAA,IAAI,gCAAA,CAAiC,IAAA,CAAK,WAAW,CAAA,EAAG;AACtD,IAAA,OAAO,CAAC,gBAAgB,WAAW,CAAA,IAAK,cAAc,WAAW,CAAA,IAAK,UAAU,KAAK,CAAA;AAAA,EACvF;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAE5C,EAAA,IAAI,YAAY,IAAA,CAAK,KAAK,KAAK,aAAA,CAAc,IAAA,CAAK,UAAU,CAAA,EAAG;AAC7D,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAEjC,IAAA,IAAI,CAAC,OAAA,IAAW,UAAA,CAAW,MAAA,GAAS,EAAA,EAAI;AACtC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,sBAAsB,KAAK,CAAA,IAAK,eAAe,UAAU,CAAA,IAAKA,WAAU,UAAU,CAAA;AAAA,EAC3F;AAEA,EAAA,IAAI,mCAAA,CAAoC,IAAA,CAAK,KAAK,CAAA,EAAG;AACnD,IAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,OAAA,GAAU,gDAAA;AAChB,IAAM,OAAA,GAAU,+CAAA;AAChB,IAAM,WAAA,GAAc,gDAAA;AACpB,IAAM,WAAA,GAAc,sCAAA;AAEb,IAAM,eAAA,GAAgC;AAAA,EAC3C,EAAA,EAAI,aAAA;AAAA,EACJ,KAAA,EAAO,cAAA;AAAA,EACP,WAAA,EACE,4GAAA;AAAA,EACF,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,6CAAA;AAAA,IACA,yCAAA;AAAA,IACA,kEAAA;AAAA,IACA,SAAS,OAAO,CAAA,0BAAA,CAAA;AAAA,IAChB,SAAS,OAAO,CAAA,wDAAA,CAAA;AAAA,IAChB,8BAAA;AAAA,IACA,oEAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,sEAAA;AAAA,IACA,SAAS,WAAW,CAAA,wBAAA,CAAA;AAAA,IACpB,SAAS,WAAW,CAAA,2BAAA;AAAA,GACtB;AAAA,EACA,QAAA,EAAU,eAAA;AAAA,EACV,QAAA,EAAU;AAAA,IACR,MAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA;AAEJ,CAAA;;;ACxWA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,OAAO,UAAA,CAAW,IAAI,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA;AAC7D,EAAA,OAAO,QAAA,CAAS,MAAA,IAAU,CAAA,IAAK,QAAA,CAAS,MAAA,IAAU,EAAA;AACpD;AAEA,IAAM,SAAA,GAAY,gDAAA;AAEX,IAAM,gBAAA,GAAiC;AAAA,EAC5C,EAAA,EAAI,cAAA;AAAA,EACJ,KAAA,EAAO,eAAA;AAAA,EACP,WAAA,EACE,+HAAA;AAAA,EACF,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,4DAAA;AAAA,IACA,0CAAA;AAAA,IACA,gCAAA;AAAA,IACA,kCAAA;AAAA,IACA,wCAAA;AAAA,IACA,8CAAA;AAAA,IACA,0EAAA;AAAA,IACA,8DAAA;AAAA,IACA,SAAS,SAAS,CAAA,sDAAA;AAAA,GACpB;AAAA,EACA,QAAA,EAAU,aAAA;AAAA,EACV,QAAA,EAAU;AAAA,IACR,OAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA;AAEJ,CAAA;;;ACxCA,IAAM,iBAAA,GAAoB,GAAA;AAE1B,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AAEnB,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAA+B,EAAC;AAEtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAA,CAAK,IAAI,CAAA,GAAA,CAAK,IAAA,CAAK,IAAI,KAAK,CAAA,IAAK,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,OAAO,MAAA,CAAO,IAAI,EAAE,MAAA,CAAO,CAAC,SAAS,KAAA,KAAU;AACpD,IAAA,MAAM,IAAI,KAAA,GAAQ,MAAA;AAElB,IAAA,OAAO,OAAA,GAAU,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,EAClC,GAAG,CAAC,CAAA;AACN;AAEA,SAAS,UAAU,KAAA,EAAwB;AACzC,EAAA,OAAO,KAAA,CAAM,MAAA,IAAU,EAAA,IAAM,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAC1D;AAEA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,OAAO,KAAA,CAAM,MAAA,IAAU,EAAA,IAAM,oBAAA,CAAqB,KAAK,KAAK,CAAA;AAC9D;AAEA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG;AACpB,IAAA,OAAO,cAAA,CAAe,KAAK,CAAA,GAAI,iBAAA;AAAA,EACjC;AAEA,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,IAAA,OACE,cAAA,CAAe,KAAK,CAAA,GAAI,iBAAA,IAAqB,UAAA,CAAW,KAAK,KAAK,CAAA,IAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAAA,EAE/F;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,YAAA,GACJ,iLAAA;AAEF,IAAM,aAAA,GAAgB,CAAA,eAAA,CAAA;AAEtB,IAAM,SAAA,GAAY,qEAAA;AAEX,IAAM,WAAA,GAA4B;AAAA,EACvC,EAAA,EAAI,SAAA;AAAA,EACJ,KAAA,EAAO,sBAAA;AAAA,EACP,WAAA,EACE,gGAAA;AAAA,EACF,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,2DAAA;AAAA,IACA,wDAAA;AAAA,IACA,yFAAA;AAAA,IACA,6LAAA;AAAA,IACA,+CAAA;AAAA,IACA,sFAAA;AAAA,IACA,kCAAA;AAAA,IACA,gCAAA;AAAA,IACA,kCAAA;AAAA,IACA,sDAAA;AAAA,IACA,2BAAA;AAAA,IACA,6DAAA;AAAA,IACA,gCAAA;AAAA,IACA,yBAAA;AAAA;AAAA;AAAA,IAGA,kHAAA;AAAA,IACA,kDAAA;AAAA,IACA,0BAAA;AAAA,IACA,CAAA,+BAAA,CAAA;AAAA,IACA,uDAAA;AAAA,IACA,QAAQ,SAAS,CAAA,2BAAA,CAAA;AAAA,IACjB,CAAA,MAAA,EAAS,YAAY,CAAA,kBAAA,EAAqB,aAAa,CAAA,CAAA;AAAA,GACzD;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,kEAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU;AAAA,IACR,UAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA;AAEJ,CAAA;;;AC/GA,IAAM,YAAA,GAAe,aAAA;AAEd,IAAM,kBAAA,GAAmC;AAAA,EAC9C,EAAA,EAAI,gBAAA;AAAA,EACJ,KAAA,EAAO,iBAAA;AAAA,EACP,WAAA,EAAa,oFAAA;AAAA,EACb,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,oEAAoE,YAAY,CAAA,CAAA,CAAA;AAAA,IAChF,qBAAqB,YAAY,CAAA,CAAA,CAAA;AAAA,IACjC,gBAAgB,YAAY,CAAA,CAAA,CAAA;AAAA,IAC5B,iBAAiB,YAAY,CAAA,CAAA,CAAA;AAAA,IAC7B,0BAA0B,YAAY,CAAA,CAAA,CAAA;AAAA,IACtC,+BAA+B,YAAY,CAAA,CAAA,CAAA;AAAA,IAC3C,oBAAoB,YAAY,CAAA,CAAA,CAAA;AAAA,IAChC,sBAAsB,YAAY,CAAA,CAAA,CAAA;AAAA,IAClC,kBAAkB,YAAY,CAAA,CAAA,CAAA;AAAA,IAC9B,qDAAqD,YAAY,CAAA,CAAA,CAAA;AAAA,IACjE,qBAAqB,YAAY,CAAA,CAAA,CAAA;AAAA,IACjC,oCAAoC,YAAY,CAAA,CAAA,CAAA;AAAA,IAChD,uCAAuC,YAAY,CAAA,CAAA;AAAA,GACrD;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,uCAAuC,YAAY,CAAA,CAAA,CAAA;AAAA,IACnD,8BAA8B,YAAY,CAAA,CAAA;AAAA,GAC5C;AAAA,EACA,QAAA,EAAU,CAAC,WAAA,EAAa,KAAA,EAAO,UAAU,SAAA,EAAW,WAAA,EAAa,cAAc,WAAW;AAC5F,CAAA;;;ACpBA,IAAM,WAAA,GAAc,mBAAA;AACpB,IAAM,YAAA,GAAe,+BAAA;AACrB,IAAM,KAAA,GAAQ,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAA;AAClD,IAAM,gBAAA,GAAmB,SAAS,WAAW,CAAA,sBAAA,CAAA;AAE7C,IAAM,eAAA,GAAkB,eAAA;AAExB,IAAM,QAAA,GAAW,mDAAA;AACjB,IAAM,WAAA,GAAc,yBAAA;AAEpB,SAAS,kBAAkB,SAAA,EAA2B;AACpD,EAAA,MAAM,gBAAA,GAAmB,CAAA,EAAG,iBAAiB,CAAA,EAAG,SAAS,CAAA,CAAA;AACzD,EAAA,MAAM,QAAA,GAAW,0DAA0D,SAAS,CAAA,CAAA;AACpF,EAAA,MAAM,gBAAA,GAAmB,OAAO,QAAQ,CAAA,yBAAA,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,CAAA,kBAAA,EAAqB,cAAc,CAAA,EAAG,SAAS,CAAA,CAAA;AAE9D,EAAA,OAAO,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,EAAQ,gBAAgB,CAAA,CAAA,EAAI,oBAAoB,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA,EAAI,WAAW,GAAG,gBAAgB,CAAA,CAAA,CAAA;AACxI;AAEA,IAAM,WAAA,GAAc,kBAAkB,SAAS,CAAA;AAC/C,IAAM,gBAAA,GAAmB,kBAAkB,cAAc,CAAA;AAEzD,IAAM,GAAA,GAAM,mCAAA;AAEZ,IAAM,iBAAA,GAAoB,8BAAA;AAC1B,IAAM,cAAA,GAAiB,kCAAkC,iBAAiB,CAAA,CAAA,CAAA;AAC1E,IAAM,QAAA,GAAW,8CAAA;AACjB,IAAM,UAAA,GAAa,cAAc,QAAQ,CAAA,CAAA,CAAA;AAEzC,IAAM,QAAA,GAAW,0BAAA;AACjB,IAAM,wBAAA,GAA2B,+CAAA;AAEjC,IAAM,mBAAA,GAAsB,4DAAA;AAE5B,IAAM,aAAA,GAAgB,0EAAA;AACtB,IAAM,UAAA,GAAa,gCAAA;AACnB,IAAM,YAAA,GAAe,kCAAA;AACrB,IAAM,SAAA,GAAY,4CAAA;AAElB,IAAM,WAAA,GACJ,wGAAA;AACF,IAAM,WAAA,GAAc,CAAA,MAAA,EAAS,WAAW,CAAA,cAAA,EAAiB,iBAAiB,CAAA,CAAA,CAAA;AAE1E,IAAM,wBAAA,GAA2B,2BAAA;AAEjC,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,0BAA0B,KAAA,EAAwB;AACzD,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAEhC,EAAA,IAAI,UAAU,QAAA,IAAY,KAAA,KAAU,WAAW,KAAA,KAAU,SAAA,IAAa,UAAU,WAAA,EAAa;AAC3F,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,SAAS,GAAG,CAAA;AAC3B;AAEA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,KAAK,CAAA,EAAG;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,gBAAA,CAAiB,KAAK,KAAK,CAAA;AACpC;AAEA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,IAAI,yBAAA,CAA0B,KAAK,CAAA,EAAG;AACpC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,CAAC,eAAA,CAAgB,GAAA,CAAI,KAAA,CAAM,aAAa,CAAA;AACjD;AAEO,IAAM,SAAA,GAA0B;AAAA,EACrC,EAAA,EAAI,OAAA;AAAA,EACJ,KAAA,EAAO,oBAAA;AAAA,EACP,WAAA,EACE,mJAAA;AAAA,EACF,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,gBAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,GAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,wBAAA;AAAA,IACA,mBAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,kBAAA,EAAoB,CAAC,wBAAwB,CAAA;AAAA,EAC7C,QAAA,EAAU,YAAA;AAAA,EACV,QAAA,EAAU;AAAA,IACR,OAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,eAAA,EAAiB,CAAC,OAAA,EAAS,UAAU;AACvC,CAAA;;;ACtIO,IAAM,YAAA,GAAwC;AAAA,EACnD,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF;AAGO,IAAM,iBAA2C,YAAA,CAAa,GAAA;AAAA,EACnE,CAAC,SAAS,IAAA,CAAK;AACjB;AAEA,IAAM,YAAA,GAAe,IAAI,GAAA,CAA0B,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,EAAA,EAAI,IAAI,CAAC,CAAC,CAAA;AAOvF,SAAS,eAAe,EAAA,EAAsC;AACnE,EAAA,OAAO,YAAA,CAAa,IAAI,EAAE,CAAA;AAC5B;;;AChDO,SAAS,UAAA,CAAW,QAAgB,SAAA,EAA2B;AACpE,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,IAAS,QAAQ,SAAA,EAAW,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAA,EAAG;AAC7D,IAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AAEzB,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,KAAA,IAAS,CAAA;AACT,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAEA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,KAAA,IAAS,CAAA;AAAA,IACX,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,MAAA,KAAA,IAAS,CAAA;AAET,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,qBAAqB,MAAA,EAAwB;AAC3D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAA,EAAG;AACrD,IAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AAEzB,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,KAAA,IAAS,CAAA;AACT,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAEA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAC,CAAA;AAE1C,IAAA,IACE,KAAK,UAAA,CAAW,KAAK,KACrB,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,IACrB,IAAA,CAAK,WAAW,KAAK,CAAA,IACrB,KAAK,UAAA,CAAW,MAAM,KACtB,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EACtB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,iBAAiB,MAAA,EAAwB;AACvD,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAA,EAAG;AACrD,IAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AAEzB,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAA,IAAU,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAA;AACvC,MAAA,KAAA,IAAS,CAAA;AACT,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,IAAU,IAAA;AAEV,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAEA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAA,IAAU,IAAA;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,GAAA,IAAO,MAAA,CAAO,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA,EAAG;AACpD,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA;AAEtC,MAAA,IAAI,UAAU,EAAA,EAAI;AAChB,QAAA,MAAA,IAAU,IAAA;AACV,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,IAAU,MAAM,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAC,CAAA,CAAA,CAAA;AAC9C,MAAA,KAAA,GAAQ,KAAA;AACR,MAAA;AAAA,IACF;AAEA,IAAA,IACE,SAAS,GAAA,KACR,MAAA,CAAO,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA,IAC9B,MAAA,CAAO,UAAA,CAAW,KAAA,EAAO,KAAK,CAAA,IAC9B,MAAA,CAAO,UAAA,CAAW,KAAA,EAAO,KAAK,CAAA,CAAA,EAChC;AACA,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA;AAEtC,MAAA,IAAI,UAAU,EAAA,EAAI;AAChB,QAAA,MAAA,IAAU,IAAA;AACV,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,GAAQ,KAAA;AACR,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,IAAU,IAAA;AAAA,EACZ;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,cAAA,CAAe,MAAc,KAAA,EAAwB;AACnE,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA,EAAG;AACnD,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,KAAK,CAAE,CAAA,EAAG;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;;;AC3JA,IAAM,eAAA,GAAkB,4BAAA;AACxB,IAAM,aAAA,GAAgB,kBAAA;AACtB,IAAM,mBAAA,GAAsB,YAAA;AAE5B,SAAS,WAAA,CAAY,KAAA,EAAgB,IAAA,EAAc,KAAA,EAAuB;AACxE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,MAAA,EAAS,IAAI,CAAA,KAAA,EAAQ,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAAA,EACvF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAA,CAAe,QAAA,EAAmB,MAAA,EAAgB,KAAA,EAAyB;AAClF,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,EAAQ,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAC1F;AAEA,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAkB,KAAA,KAAU;AAC/C,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,WAAW,CAAA,EAAG;AACvD,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,EAAQ,KAAK,IAAI,KAAK,CAAA,kDAAA;AAAA,OACvC;AAAA,IACF;AAEA,IAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,EAAQ,KAAK,IAAI,KAAK,CAAA,2CAAA;AAAA,OACvC;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,MAAA,CAAO,SAAS,GAAG,CAAA;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,EAAQ,KAAK,IAAI,KAAK,CAAA,+CAAA,EAAkD,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACtG;AAAA,IACF;AAEA,IAAA,IAAI,oBAAA,CAAqB,OAAO,CAAA,GAAI,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,EAAQ,KAAK,IAAI,KAAK,CAAA,+EAAA;AAAA,OACvC;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEO,SAAS,aAAa,IAAA,EAAkC;AAC7D,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,IAAA,MAAM,IAAI,iBAAiB,2BAA2B,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,EAAA,GAAK,YAAY,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,EAAE,GAAG,IAAI,CAAA;AAErD,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,EAAE,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,CAAA,MAAA,EAAS,EAAE,CAAA,oDAAA,EAAuD,eAAA,CAAgB,MAAM,CAAA,CAAA;AAAA,KAC1F;AAAA,EACF;AAEA,EAAA,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,OAAO,CAAA;AACnC,EAAA,WAAA,CAAY,IAAA,CAAK,WAAA,EAAa,EAAA,EAAI,aAAa,CAAA;AAE/C,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,EAAQ;AAClD,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,MAAA,EAAS,EAAE,CAAA,8CAAA,CAAgD,CAAA;AAAA,EACxF;AAEA,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,IAAa,CAAC,cAAc,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG;AAC/D,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,CAAA,MAAA,EAAS,EAAE,CAAA,wBAAA,EAA2B,aAAA,CAAc,MAAM,CAAA,0CAAA;AAAA,KAC5D;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,IAAI,UAAU,CAAA;AAC7D,EAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,IAAA,CAAK,kBAAA,EAAoB,IAAI,oBAAoB,CAAA;AAE3F,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,kBAAA,CAAmB,WAAW,CAAA,EAAG;AAC5D,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,MAAA,EAAS,EAAE,CAAA,oCAAA,CAAsC,CAAA;AAAA,EAC9E;AAEA,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,MAAA,EAAS,EAAE,CAAA,4CAAA,CAA8C,CAAA;AAAA,IACtF;AAEA,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,KAAK,IAAA,CAAK,QAAA,CAAS,SAAQ,EAAG;AAClD,MAAA,WAAA,CAAY,GAAA,EAAK,EAAA,EAAI,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,oBAAoB,MAAA,EAAW;AACtC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,eAAe,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,MAAA,EAAS,EAAE,CAAA,mDAAA,CAAqD,CAAA;AAAA,IAC7F;AAEA,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,QAAQ,KAAK,IAAA,CAAK,eAAA,CAAgB,SAAQ,EAAG;AAC9D,MAAA,WAAA,CAAY,QAAA,EAAU,EAAA,EAAI,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,IAAI,KAAK,QAAA,KAAa,MAAA,IAAa,OAAO,IAAA,CAAK,aAAa,UAAA,EAAY;AACtE,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,MAAA,EAAS,EAAE,CAAA,mCAAA,CAAqC,CAAA;AAAA,EAC7E;AAEA,EAAA,OAAO,IAAA;AACT;;;ACxFO,SAAS,WAAW,IAAA,EAAkC;AAC3D,EAAA,OAAO,aAAa,IAAI,CAAA;AAC1B","file":"chunk-EUNFMCKE.cjs","sourcesContent":["const ERROR_BRAND = Symbol.for('@socprime/logtotal-sanitizer/error');\n\n/**\n * Machine-readable cause of a {@link SanitizerError}.\n */\nexport type SanitizerErrorCode =\n | 'INVALID_RULE'\n | 'UNKNOWN_RULE'\n | 'INVALID_KEY'\n | 'INVALID_OPTION'\n | 'ABORTED';\n\n/**\n * Base class for every error this package throws.\n */\nexport class SanitizerError extends Error {\n /** Machine-readable cause, stable across releases. */\n readonly code: SanitizerErrorCode;\n\n constructor(code: SanitizerErrorCode, message: string) {\n super(message);\n this.name = 'SanitizerError';\n this.code = code;\n Object.defineProperty(this, ERROR_BRAND, { value: true, enumerable: false });\n }\n}\n\n/** A rule object is malformed. */\nexport class InvalidRuleError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_RULE', message);\n this.name = 'InvalidRuleError';\n }\n}\n\n/** A rule identifier does not match any built-in rule. */\nexport class UnknownRuleError extends SanitizerError {\n constructor(message: string) {\n super('UNKNOWN_RULE', message);\n this.name = 'UnknownRuleError';\n }\n}\n\n/** A key is malformed, or no secure random source is available to generate one. */\nexport class InvalidKeyError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_KEY', message);\n this.name = 'InvalidKeyError';\n }\n}\n\n/** An option value is outside its allowed range. */\nexport class InvalidOptionError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_OPTION', message);\n this.name = 'InvalidOptionError';\n }\n}\n\n/** A streaming run was stopped through its `AbortSignal`. */\nexport class SanitizationAbortedError extends SanitizerError {\n constructor(message = 'Sanitization was aborted.') {\n super('ABORTED', message);\n this.name = 'SanitizationAbortedError';\n }\n}\n\n/**\n * Whether a caught value is an error thrown by this package.\n *\n * Prefer this over `instanceof` when the value may have crossed a bundle, worker or realm\n * boundary, where class identity is not preserved.\n */\nexport function isSanitizerError(value: unknown): value is SanitizerError {\n return typeof value === 'object' && value !== null && ERROR_BRAND in value;\n}\n","import type { SanitizeRule } from '../../types';\n\nfunction parseLatLonPair(match: string): { lat: number; lon: number } | null {\n const stripped = match.replace(/[()\\s]/g, '');\n\n if (!/^-?\\d+\\.\\d+[,;]-?\\d+\\.\\d+$/.test(stripped)) {\n return null;\n }\n\n const [latStr, lonStr] = stripped.split(/[,;]/);\n const lat = Number(latStr);\n const lon = Number(lonStr);\n\n if (!Number.isFinite(lat) || !Number.isFinite(lon)) {\n return null;\n }\n\n return { lat, lon };\n}\n\nfunction isPlausibleLatLon(lat: number, lon: number): boolean {\n if (lat === 0 && lon === 0) {\n return false;\n }\n\n return lat >= -90 && lat <= 90 && lon >= -180 && lon <= 180;\n}\n\nfunction validateGeo(match: string): boolean {\n const pair = parseLatLonPair(match);\n\n if (pair) {\n return isPlausibleLatLon(pair.lat, pair.lon);\n }\n\n return true;\n}\n\nconst LAT_KEY = '(?:latitude|lat)';\nconst LON_KEY = '(?:longitude|long|lon|lng)';\nconst ZIP_KEY = '(?:zipCode|postalCode|postcode|zip)';\nconst ADDR_KEY = '(?:addressLine1|address|street)';\nconst OLC = '[23456789CFGHJMPQRVWXcfghjmpqrvwx]';\nconst GEOHASH = '[0-9b-hjkmnp-zB-HJKMNP-Z]';\n\nexport const geoLocationRule: SanitizeRule = {\n id: 'geoLocation',\n label: 'Geo location',\n description:\n 'Coordinates, geohashes, plus codes, postcodes and context-anchored addresses become a stable <GEO:…> token — the same value maps to the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'GEO',\n patterns: [\n '(?:\\\\(\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*\\\\))',\n '(?:(?<![\\\\d.])-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}(?!\\\\d))',\n `(?:\\\\b${LAT_KEY}\\\\s*[=:]\\\\s*)(-?\\\\d{1,3}\\\\.\\\\d+)`,\n `(?:\\\\b${LON_KEY}\\\\s*[=:]\\\\s*)(-?\\\\d{1,3}\\\\.\\\\d+)`,\n `(?:\\\\bgeohash\\\\s*[=:]\\\\s*)(${GEOHASH}{5,12}\\\\b)`,\n `(?:(?<![\\\\w+])${OLC}{4,8}\\\\+${OLC}{2,3}(?![\\\\w+]))`,\n '(?:\\\\b\\\\d{1,3}°\\\\d{1,2}\\'\\\\d{1,2}(?:\\\\.\\\\d+)?\"[NSEW]\\\\b)',\n '(?:\\\\b[A-Za-z]{1,2}\\\\d{1,2}[A-Za-z]?\\\\s\\\\d[A-Za-z]{2}\\\\b)',\n `(?:\\\\b${ZIP_KEY}\\\\s*[=:]\\\\s*)(\\\\d{5}(?:-\\\\d{4})?\\\\b)`,\n ],\n aggressivePatterns: [\n '(?:\\\\(\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*\\\\))',\n '(?:(?<![\\\\d.])-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}(?!\\\\d))',\n `(?:(?<=\\\\b${ADDR_KEY}\\\\s*[=:]\\\\s*)[^\\\\n\"'<>]{5,80})`,\n ],\n validate: validateGeo,\n jsonKeys: [\n 'latitude',\n 'longitude',\n 'lat',\n 'lon',\n 'lng',\n 'long',\n 'coordinates',\n 'coords',\n 'geo',\n 'streetAddress',\n 'addressLine1',\n 'addressLine2',\n 'postalCode',\n 'postcode',\n 'zip',\n 'zipCode',\n 'geohash',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction luhnCheck(digits: string): boolean {\n if (!/^\\d+$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n let doubleIt = false;\n\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let digit = Number(digits[i]);\n\n if (doubleIt) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n doubleIt = !doubleIt;\n }\n\n return sum % 10 === 0;\n}\n\nfunction isValidSsn(area: string, group: string, serial: string): boolean {\n if (area === '000' || area === '666' || area.startsWith('9')) {\n return false;\n }\n\n return group !== '00' && serial !== '0000';\n}\n\nfunction isValidItin(area: string, group: string, serial: string): boolean {\n if (!area.startsWith('9') || serial === '0000') {\n return false;\n }\n\n const groupNum = Number(group);\n\n return (\n (groupNum >= 70 && groupNum <= 88) ||\n (groupNum >= 90 && groupNum <= 92) ||\n (groupNum >= 94 && groupNum <= 99)\n );\n}\n\nfunction isValidNhs(digits: string): boolean {\n if (!/^\\d{10}$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n\n for (let i = 0; i < 9; i += 1) {\n sum += Number(digits[i]) * (10 - i);\n }\n\n const remainder = sum % 11;\n let check = 11 - remainder;\n\n if (check === 11) {\n check = 0;\n }\n\n if (check === 10) {\n return false;\n }\n\n return check === Number(digits[9]);\n}\n\nfunction validateGovId(match: string): boolean {\n const dashed = /^(\\d{3})-(\\d{2})-(\\d{4})$/.exec(match);\n\n if (dashed?.[1] && dashed[2] && dashed[3]) {\n return (\n isValidSsn(dashed[1], dashed[2], dashed[3]) || isValidItin(dashed[1], dashed[2], dashed[3])\n );\n }\n\n if (/^\\d{3}-\\d{3}-\\d{3}$/.test(match)) {\n return luhnCheck(match.replace(/-/g, ''));\n }\n\n if (/^\\d{3} \\d{3} \\d{4}$/.test(match)) {\n return isValidNhs(match.replace(/ /g, ''));\n }\n\n const nhsPrefixed = /(?:NHS|nhs)(?:[_-]?number)?\\s*[=:]\\s*(\\d{10})$/.exec(match);\n const nhsDigits = nhsPrefixed?.[1];\n\n if (nhsDigits) {\n return isValidNhs(nhsDigits);\n }\n\n return true;\n}\n\nconst SSN_CTX =\n '(?:[Ss][Ss][Nn]|[Ee][Ii][Nn]|[Ss][Ii][Nn]|tax[_-]?id|social[_ -]?security(?:[_ -]?number)?)';\nconst ID_CTX = '(?:passport(?:_no|_number)?|driver[_-]?license|national[_-]?id|tax[_-]?id)';\n\nexport const govIdentifiersRule: SanitizeRule = {\n id: 'govIds',\n label: 'Government identifiers',\n description: 'Passport numbers, tax numbers, SSNs and similar IDs are redacted outright.',\n mode: 'mask',\n token: 'GOV_ID',\n patterns: [\n '(?:(?<![A-Z0-9<])P<[A-Z0-9<]{42}(?![A-Z0-9<]))',\n '(?:\\\\b\\\\d{3}-\\\\d{2}-\\\\d{4}\\\\b)',\n '(?:\\\\b\\\\d{3}-\\\\d{3}-\\\\d{3}\\\\b)',\n '(?:\\\\b\\\\d{3} \\\\d{3} \\\\d{4}\\\\b)',\n '(?:\\\\b(?:NHS|nhs)(?:[_-]?number)?\\\\s*[=:]\\\\s*\\\\d{10}\\\\b)',\n '(?:\\\\b(?!BG|GB|NK|KN|TN|NT|ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\\\\d{6}\\\\s?[A-D]\\\\b)',\n '(?:(?<![A-Za-z0-9А-ЯІЇЄҐа-яіїєґ])[А-ЯІЇЄҐ]{2}\\\\d{6}\\\\b)',\n `(?:\\\\b${SSN_CTX}\\\\s*[=:]?\\\\s*)(\\\\d{9})\\\\b`,\n '(?:(?:ІПН|РНОКПП|tax[_-]?id)\\\\s*[=:]?\\\\s*)(\\\\d{10})\\\\b',\n `(?:\\\\b${ID_CTX}\\\\s*[=:]\\\\s*)([A-Za-z0-9<]{5,32})`,\n ],\n aggressivePatterns: ['(?:\\\\b[A-Z]{1,2}\\\\d{6,9}\\\\b)', '(?:\\\\b\\\\d{9,11}\\\\b)'],\n validate: validateGovId,\n jsonKeys: [\n 'ssn',\n 'passportNumber',\n 'taxId',\n 'nationalId',\n 'socialSecurityNumber',\n 'passport',\n 'nino',\n 'nhsNumber',\n 'driverLicense',\n 'licenseNumber',\n 'personalId',\n 'dob',\n 'dateOfBirth',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction isValidDea(match: string): boolean {\n if (!/^[ABFGMPRX][A-Z9]\\d{7}$/.test(match)) {\n return false;\n }\n\n const digits = match.slice(2);\n const sum =\n Number(digits[0]) +\n Number(digits[2]) +\n Number(digits[4]) +\n 2 * (Number(digits[1]) + Number(digits[3]) + Number(digits[5]));\n\n return sum % 10 === Number(digits[6]);\n}\n\nfunction validateHealth(match: string): boolean {\n if (/^[ABFGMPRX][A-Z9]\\d{7}$/.test(match)) {\n return isValidDea(match);\n }\n\n return true;\n}\n\nconst MRN_KEY = '(?:[Mm][Rr][Nn]|medical[_-]?record(?:[_-]?number)?)';\n\nexport const healthInfoRule: SanitizeRule = {\n id: 'healthInfo',\n label: 'Protected health information',\n description:\n 'PHI in SOC logs is almost always structured: JSON field names (diagnosis, medication, MRN, …) carry most of the coverage. Freeform patterns only match context-anchored medical codes (ICD, SNOMED, LOINC, NDC, DEA, MRN).',\n mode: 'mask',\n token: 'PHI',\n patterns: [\n '(?:\\\\b(?:[Ii][Cc][Dd]-10|[Ii][Cc][Dd]10):?\\\\s*[A-Z]\\\\d{2}(?:\\\\.\\\\d{1,4})?\\\\b)',\n '(?:\\\\b(?:[Ii][Cc][Dd]-9|[Ii][Cc][Dd]9):?\\\\s*(?:[VE]\\\\d{2,3}|\\\\d{3})(?:\\\\.\\\\d{1,2})?\\\\b)',\n '(?:\\\\b(?:SNOMED(?:\\\\s*CT)?|[Ss]nomed(?:\\\\s*CT)?)[:\\\\s]+\\\\d{6,18}\\\\b)',\n '(?:\\\\b(?:LOINC|[Ll]oinc)[:\\\\s]+\\\\d{1,5}-\\\\d\\\\b)',\n '(?:\\\\b(?:NDC|[Nn]dc)[:\\\\s]+\\\\d{4,5}-\\\\d{3,4}-\\\\d{1,2}\\\\b)',\n '(?:\\\\b[ABFGMPRX][A-Z9]\\\\d{7}\\\\b)',\n '(?:\\\\b(?:[Nn][Pp][Ii])\\\\s*[=:]\\\\s*\\\\d{10}\\\\b)',\n `(?:\\\\b${MRN_KEY}\\\\s*[=:]\\\\s*)([A-Za-z0-9-]{4,})\\\\b`,\n ],\n aggressivePatterns: ['(?:(?<![A-Za-z0-9])[A-TV-Z]\\\\d{2}(?:\\\\.\\\\w{1,4})?(?![A-Za-z0-9:]))'],\n validate: validateHealth,\n jsonKeys: [\n 'diagnosis',\n 'prescription',\n 'medication',\n 'icd10',\n 'icd9',\n 'snomed',\n 'condition',\n 'allergy',\n 'allergies',\n 'bloodType',\n 'patientId',\n 'mrn',\n 'medicalRecordNumber',\n 'insuranceNumber',\n 'labResult',\n 'observation',\n 'vitalSigns',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst USER_SEG = '[^/\\\\\\\\\\\\s\"\\'<>]+';\n\nfunction validateHomeUser(match: string): boolean {\n return match !== '.' && match !== '..';\n}\n\nexport const homePathsRule: SanitizeRule = {\n id: 'paths',\n label: 'Home-directory usernames',\n description:\n 'Only the username segment of a home-directory path is redacted (e.g. /home/jdoe/app → /home/<R:…>/app); the rest of the path stays visible.',\n mode: 'mask',\n token: 'PATH',\n patterns: [\n `(?:/export/home/(${USER_SEG}))`,\n `(?:/usr/home/(${USER_SEG}))`,\n `(?:/var/home/(${USER_SEG}))`,\n `(?:/home/(${USER_SEG}))`,\n `(?:/Users/(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\Users\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:/Users/(${USER_SEG}))`,\n `(?:\\\\\\\\\\\\\\\\\\\\?\\\\\\\\[A-Za-z]:\\\\\\\\Users\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\Documents and Settings\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\(${USER_SEG}))`,\n `(?:/mnt/[A-Za-z]/Users/(${USER_SEG}))`,\n `(?://wsl\\\\$/(?:[A-Za-z0-9_-]+)/home/(${USER_SEG}))`,\n ],\n validate: validateHomeUser,\n};\n","export const BACKSLASH = '\\\\\\\\';\n\nexport const JSON_BACKSLASH = '\\\\\\\\\\\\\\\\';\n\nexport const WINDOWS_FILE_EXT =\n 'exe|dll|sys|bat|cmd|ps1|vbs|msi|tmp|hiv|log|dat|txt|ini|xml|json|lnk|cpl|ocx|drv';\n\nexport const NOT_WINDOWS_FILENAME = `(?![A-Za-z0-9_$.-]*\\\\.(?:${WINDOWS_FILE_EXT})(?![A-Za-z0-9]))`;\n\nexport const WELL_KNOWN_DOMAIN = '(?:BUILTIN|NT SERVICE|NT AUTHORITY|Users|Settings|Files)';\n\nexport const NETBIOS_DOMAIN = '[A-Za-z0-9](?:[A-Za-z0-9.-]{0,13}[A-Za-z0-9])?';\n\nexport const ACCOUNT_SEGMENT = '[A-Za-z0-9_](?:[A-Za-z0-9_.$-]*[A-Za-z0-9$])';\n","import type { SanitizeRule } from '../../types';\nimport {\n ACCOUNT_SEGMENT,\n BACKSLASH,\n JSON_BACKSLASH,\n NETBIOS_DOMAIN,\n NOT_WINDOWS_FILENAME,\n WELL_KNOWN_DOMAIN,\n} from '../shared/windowsAccounts';\n\nconst GTLD = [\n 'abbott',\n 'abogado',\n 'ac',\n 'academy',\n 'accountant',\n 'accountants',\n 'active',\n 'actor',\n 'ad',\n 'ads',\n 'adult',\n 'ae',\n 'aero',\n 'af',\n 'afl',\n 'ag',\n 'agency',\n 'ai',\n 'airforce',\n 'al',\n 'allfinanz',\n 'alsace',\n 'am',\n 'amsterdam',\n 'an',\n 'android',\n 'ao',\n 'apartments',\n 'aq',\n 'aquarelle',\n 'ar',\n 'archi',\n 'army',\n 'arpa',\n 'as',\n 'asia',\n 'associates',\n 'at',\n 'attorney',\n 'au',\n 'auction',\n 'audio',\n 'autos',\n 'aw',\n 'ax',\n 'axa',\n 'az',\n 'ba',\n 'band',\n 'bank',\n 'bar',\n 'barclaycard',\n 'barclays',\n 'bargains',\n 'bauhaus',\n 'bayern',\n 'bb',\n 'bbc',\n 'bd',\n 'be',\n 'beer',\n 'berlin',\n 'best',\n 'bf',\n 'bg',\n 'bh',\n 'bi',\n 'bid',\n 'bike',\n 'bingo',\n 'bio',\n 'biz',\n 'bj',\n 'bl',\n 'black',\n 'blackfriday',\n 'bloomberg',\n 'blue',\n 'bm',\n 'bmw',\n 'bn',\n 'bnpparibas',\n 'bo',\n 'boats',\n 'bond',\n 'boo',\n 'boutique',\n 'bq',\n 'br',\n 'brussels',\n 'bs',\n 'bt',\n 'budapest',\n 'build',\n 'builders',\n 'business',\n 'buzz',\n 'bv',\n 'bw',\n 'by',\n 'bz',\n 'bzh',\n 'ca',\n 'cab',\n 'cafe',\n 'cal',\n 'camera',\n 'camp',\n 'cancerresearch',\n 'canon',\n 'capetown',\n 'capital',\n 'caravan',\n 'cards',\n 'care',\n 'career',\n 'careers',\n 'cartier',\n 'casa',\n 'cash',\n 'casino',\n 'cat',\n 'catering',\n 'cbn',\n 'cc',\n 'cd',\n 'center',\n 'ceo',\n 'cern',\n 'cf',\n 'cfd',\n 'cg',\n 'ch',\n 'channel',\n 'chat',\n 'cheap',\n 'chloe',\n 'christmas',\n 'chrome',\n 'church',\n 'ci',\n 'citic',\n 'city',\n 'ck',\n 'cl',\n 'claims',\n 'cleaning',\n 'click',\n 'clinic',\n 'clothing',\n 'club',\n 'cm',\n 'cn',\n 'co',\n 'coach',\n 'codes',\n 'coffee',\n 'college',\n 'cologne',\n 'com',\n 'community',\n 'company',\n 'computer',\n 'condos',\n 'construction',\n 'consulting',\n 'contractors',\n 'cooking',\n 'cool',\n 'coop',\n 'country',\n 'courses',\n 'cr',\n 'credit',\n 'creditcard',\n 'cricket',\n 'crs',\n 'cruises',\n 'cu',\n 'cuisinella',\n 'cv',\n 'cw',\n 'cx',\n 'cy',\n 'cymru',\n 'cyou',\n 'cz',\n 'dabur',\n 'dad',\n 'dance',\n 'date',\n 'dating',\n 'datsun',\n 'day',\n 'dclk',\n 'de',\n 'deals',\n 'degree',\n 'delivery',\n 'democrat',\n 'dental',\n 'dentist',\n 'desi',\n 'design',\n 'dev',\n 'diamonds',\n 'diet',\n 'digital',\n 'direct',\n 'directory',\n 'discount',\n 'dj',\n 'dk',\n 'dm',\n 'dnp',\n 'do',\n 'docs',\n 'doha',\n 'domains',\n 'doosan',\n 'download',\n 'durban',\n 'dvag',\n 'dz',\n 'eat',\n 'ec',\n 'edu',\n 'education',\n 'ee',\n 'eg',\n 'eh',\n 'email',\n 'emerck',\n 'energy',\n 'engineer',\n 'engineering',\n 'enterprises',\n 'epson',\n 'equipment',\n 'er',\n 'erni',\n 'es',\n 'esq',\n 'estate',\n 'et',\n 'eu',\n 'eurovision',\n 'eus',\n 'events',\n 'everbank',\n 'exchange',\n 'expert',\n 'exposed',\n 'express',\n 'fail',\n 'faith',\n 'fan',\n 'fans',\n 'farm',\n 'fashion',\n 'feedback',\n 'fi',\n 'film',\n 'finance',\n 'financial',\n 'firmdale',\n 'fish',\n 'fishing',\n 'fit',\n 'fitness',\n 'fj',\n 'fk',\n 'flights',\n 'florist',\n 'flowers',\n 'flsmidth',\n 'fly',\n 'fm',\n 'fo',\n 'foo',\n 'football',\n 'forex',\n 'forsale',\n 'foundation',\n 'fr',\n 'frl',\n 'frogans',\n 'fund',\n 'furniture',\n 'futbol',\n 'ga',\n 'gal',\n 'gallery',\n 'garden',\n 'gb',\n 'gbiz',\n 'gd',\n 'gdn',\n 'ge',\n 'gent',\n 'gf',\n 'gg',\n 'ggee',\n 'gh',\n 'gi',\n 'gift',\n 'gifts',\n 'gives',\n 'gl',\n 'glass',\n 'gle',\n 'global',\n 'globo',\n 'gm',\n 'gmail',\n 'gmo',\n 'gmx',\n 'gn',\n 'gold',\n 'goldpoint',\n 'golf',\n 'goo',\n 'goog',\n 'google',\n 'gop',\n 'gov',\n 'gp',\n 'gq',\n 'gr',\n 'graphics',\n 'gratis',\n 'green',\n 'gripe',\n 'gs',\n 'gt',\n 'gu',\n 'guge',\n 'guide',\n 'guitars',\n 'guru',\n 'gw',\n 'gy',\n 'hamburg',\n 'hangout',\n 'haus',\n 'healthcare',\n 'help',\n 'here',\n 'hermes',\n 'hiphop',\n 'hiv',\n 'hk',\n 'hm',\n 'hn',\n 'holdings',\n 'holiday',\n 'homes',\n 'horse',\n 'host',\n 'hosting',\n 'house',\n 'how',\n 'hr',\n 'ht',\n 'hu',\n 'ibm',\n 'id',\n 'ie',\n 'ifm',\n 'il',\n 'im',\n 'immo',\n 'immobilien',\n 'in',\n 'industries',\n 'infiniti',\n 'info',\n 'ing',\n 'ink',\n 'institute',\n 'insure',\n 'int',\n 'international',\n 'investments',\n 'io',\n 'iq',\n 'ir',\n 'irish',\n 'is',\n 'it',\n 'iwc',\n 'java',\n 'jcb',\n 'je',\n 'jetzt',\n 'jm',\n 'jo',\n 'jobs',\n 'joburg',\n 'jp',\n 'juegos',\n 'kaufen',\n 'kddi',\n 'ke',\n 'kg',\n 'kh',\n 'ki',\n 'kim',\n 'kitchen',\n 'kiwi',\n 'km',\n 'kn',\n 'koeln',\n 'komatsu',\n 'kp',\n 'kr',\n 'krd',\n 'kred',\n 'kw',\n 'ky',\n 'kyoto',\n 'kz',\n 'la',\n 'lacaixa',\n 'land',\n 'lat',\n 'latrobe',\n 'lawyer',\n 'lb',\n 'lc',\n 'lds',\n 'lease',\n 'leclerc',\n 'legal',\n 'lgbt',\n 'li',\n 'lidl',\n 'life',\n 'lighting',\n 'limited',\n 'limo',\n 'link',\n 'lk',\n 'loan',\n 'loans',\n 'london',\n 'lotte',\n 'lotto',\n 'love',\n 'lr',\n 'ls',\n 'lt',\n 'ltda',\n 'lu',\n 'luxe',\n 'luxury',\n 'lv',\n 'ly',\n 'ma',\n 'madrid',\n 'maif',\n 'maison',\n 'management',\n 'mango',\n 'market',\n 'marketing',\n 'markets',\n 'marriott',\n 'mc',\n 'md',\n 'me',\n 'media',\n 'meet',\n 'melbourne',\n 'meme',\n 'memorial',\n 'menu',\n 'mf',\n 'mg',\n 'mh',\n 'miami',\n 'mil',\n 'mini',\n 'mk',\n 'ml',\n 'mm',\n 'mma',\n 'mn',\n 'mo',\n 'mobi',\n 'moda',\n 'moe',\n 'monash',\n 'money',\n 'mormon',\n 'mortgage',\n 'moscow',\n 'motorcycles',\n 'mov',\n 'movie',\n 'mp',\n 'mq',\n 'mr',\n 'ms',\n 'mt',\n 'mtn',\n 'mtpc',\n 'mu',\n 'museum',\n 'mv',\n 'mw',\n 'mx',\n 'my',\n 'mz',\n 'na',\n 'nagoya',\n 'name',\n 'navy',\n 'nc',\n 'ne',\n 'net',\n 'network',\n 'neustar',\n 'new',\n 'news',\n 'nexus',\n 'nf',\n 'ng',\n 'ngo',\n 'nhk',\n 'ni',\n 'nico',\n 'ninja',\n 'nissan',\n 'nl',\n 'no',\n 'np',\n 'nr',\n 'nra',\n 'nrw',\n 'ntt',\n 'nu',\n 'nyc',\n 'nz',\n 'okinawa',\n 'om',\n 'one',\n 'ong',\n 'onl',\n 'online',\n 'ooo',\n 'org',\n 'organic',\n 'osaka',\n 'otsuka',\n 'ovh',\n 'pa',\n 'page',\n 'panerai',\n 'paris',\n 'partners',\n 'parts',\n 'party',\n 'pe',\n 'pf',\n 'pg',\n 'ph',\n 'pharmacy',\n 'photo',\n 'photography',\n 'photos',\n 'physio',\n 'piaget',\n 'pics',\n 'pictet',\n 'pictures',\n 'pink',\n 'pizza',\n 'pk',\n 'pl',\n 'place',\n 'plumbing',\n 'plus',\n 'pm',\n 'pn',\n 'pohl',\n 'poker',\n 'porn',\n 'post',\n 'pr',\n 'praxi',\n 'press',\n 'pro',\n 'prod',\n 'productions',\n 'prof',\n 'properties',\n 'property',\n 'ps',\n 'pt',\n 'pub',\n 'pw',\n 'py',\n 'qa',\n 'qpon',\n 'quebec',\n 'racing',\n 're',\n 'realtor',\n 'recipes',\n 'red',\n 'redstone',\n 'rehab',\n 'reise',\n 'reisen',\n 'reit',\n 'ren',\n 'rentals',\n 'repair',\n 'report',\n 'republican',\n 'rest',\n 'restaurant',\n 'review',\n 'reviews',\n 'rich',\n 'rio',\n 'rip',\n 'ro',\n 'rocks',\n 'rodeo',\n 'rs',\n 'rsvp',\n 'ru',\n 'ruhr',\n 'rw',\n 'ryukyu',\n 'sa',\n 'saarland',\n 'sale',\n 'samsung',\n 'sap',\n 'sarl',\n 'saxo',\n 'sb',\n 'sc',\n 'sca',\n 'scb',\n 'schmidt',\n 'scholarships',\n 'school',\n 'schule',\n 'schwarz',\n 'science',\n 'scot',\n 'sd',\n 'se',\n 'services',\n 'sew',\n 'sexy',\n 'sg',\n 'sh',\n 'shiksha',\n 'shoes',\n 'shriram',\n 'si',\n 'singles',\n 'site',\n 'sj',\n 'sk',\n 'sky',\n 'sl',\n 'sm',\n 'sn',\n 'so',\n 'social',\n 'software',\n 'sohu',\n 'solar',\n 'solutions',\n 'soy',\n 'space',\n 'spiegel',\n 'spreadbetting',\n 'sr',\n 'ss',\n 'st',\n 'study',\n 'style',\n 'su',\n 'sucks',\n 'supplies',\n 'supply',\n 'support',\n 'surf',\n 'surgery',\n 'suzuki',\n 'sv',\n 'sx',\n 'sy',\n 'sydney',\n 'systems',\n 'sz',\n 'taipei',\n 'tatar',\n 'tattoo',\n 'tax',\n 'tc',\n 'td',\n 'tech',\n 'technology',\n 'tel',\n 'temasek',\n 'tennis',\n 'tf',\n 'tg',\n 'th',\n 'tickets',\n 'tienda',\n 'tips',\n 'tires',\n 'tirol',\n 'tj',\n 'tk',\n 'tl',\n 'tm',\n 'tn',\n 'to',\n 'today',\n 'tokyo',\n 'tools',\n 'top',\n 'toshiba',\n 'tours',\n 'town',\n 'toys',\n 'tp',\n 'tr',\n 'trade',\n 'trading',\n 'training',\n 'travel',\n 'trust',\n 'tt',\n 'tui',\n 'tv',\n 'tw',\n 'tz',\n 'ua',\n 'ug',\n 'uk',\n 'um',\n 'university',\n 'uno',\n 'uol',\n 'us',\n 'uy',\n 'uz',\n 'va',\n 'vacations',\n 'vc',\n 've',\n 'vegas',\n 'ventures',\n 'versicherung',\n 'vet',\n 'vg',\n 'vi',\n 'viajes',\n 'video',\n 'villas',\n 'vision',\n 'vlaanderen',\n 'vn',\n 'vodka',\n 'vote',\n 'voting',\n 'voto',\n 'voyage',\n 'vu',\n 'wales',\n 'wang',\n 'watch',\n 'webcam',\n 'website',\n 'wed',\n 'wedding',\n 'wf',\n 'whoswho',\n 'wien',\n 'wiki',\n 'williamhill',\n 'win',\n 'wme',\n 'work',\n 'works',\n 'world',\n 'ws',\n 'wtc',\n 'wtf',\n 'xin',\n '测试',\n 'परीक्षा',\n '佛山',\n '慈善',\n '集团',\n '在线',\n '한국',\n 'ভারত',\n '八卦',\n 'موقع',\n 'বাংলা',\n '公益',\n '公司',\n '移动',\n '我爱你',\n 'москва',\n 'испытание',\n 'қаз',\n 'онлайн',\n 'сайт',\n 'срб',\n 'бел',\n '时尚',\n '테스트',\n '淡马锡',\n 'орг',\n '삼성',\n 'சிங்கப்பூர்',\n '商标',\n '商店',\n '商城',\n 'дети',\n 'мкд',\n 'טעסט',\n '中文网',\n '中信',\n '中国',\n '中國',\n '谷歌',\n 'భారత్',\n 'ලංකා',\n '測試',\n 'ભારત',\n 'भारत',\n 'آزمایشی',\n 'பரிட்சை',\n '网店',\n 'संगठन',\n '网络',\n 'укр',\n '香港',\n 'δοκιμή',\n '飞利浦',\n 'إختبار',\n '台湾',\n '台灣',\n '手机',\n 'мон',\n 'الجزائر',\n 'عمان',\n 'ایران',\n 'امارات',\n 'بازار',\n 'پاکستان',\n 'الاردن',\n 'بھارت',\n 'المغرب',\n 'السعودية',\n 'سودان',\n 'عراق',\n 'مليسيا',\n '政府',\n 'شبكة',\n 'გე',\n '机构',\n '组织机构',\n '健康',\n 'ไทย',\n 'سورية',\n 'рус',\n 'рф',\n 'تونس',\n 'みんな',\n 'グーグル',\n '世界',\n 'ਭਾਰਤ',\n '网址',\n '游戏',\n 'vermögensberater',\n 'vermögensberatung',\n '企业',\n '信息',\n 'مصر',\n 'قطر',\n '广东',\n 'இலங்கை',\n 'இந்தியா',\n 'հայ',\n '新加坡',\n 'فلسطين',\n 'テスト',\n '政务',\n 'xxx',\n 'xyz',\n 'yachts',\n 'yandex',\n 'ye',\n 'yodobashi',\n 'yoga',\n 'yokohama',\n 'youtube',\n 'yt',\n 'za',\n 'zm',\n 'zone',\n 'zuerich',\n 'zw',\n];\nconst INTERNAL_SUFFIXES = [\n 'local',\n 'internal',\n 'intranet',\n 'corp',\n 'lan',\n 'home',\n 'localdomain',\n 'arpa',\n];\nconst INTERNAL_COMPOUND_SUFFIXES = [\n 'svc\\\\.cluster\\\\.local',\n 'ec2\\\\.internal',\n 'compute\\\\.internal',\n];\n\nconst FILE_EXT_COLLISION_TLDS = [\n 'ac',\n 'am',\n 'cc',\n 'gs',\n 'hiv',\n 'in',\n 'is',\n 'it',\n 'java',\n 'la',\n 'md',\n 'ml',\n 'pl',\n 'py',\n 'rs',\n 'sh',\n 'so',\n 'tf',\n];\nconst COLLISION_TLD_SET = new Set(FILE_EXT_COLLISION_TLDS);\nconst GTLD_UNRESTRICTED = GTLD.filter((tld) => !COLLISION_TLD_SET.has(tld));\n\nconst TLD_EXACT = [...INTERNAL_COMPOUND_SUFFIXES, ...GTLD_UNRESTRICTED, ...INTERNAL_SUFFIXES].join(\n '|',\n);\nconst TLD_COLLISION = FILE_EXT_COLLISION_TLDS.join('|');\nconst LABEL = '[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?';\n\nconst HOST_EXACT = `(?:(?<![\\\\w.$-])(?<![^:/\\\\\\\\][/\\\\\\\\])(?:${LABEL}\\\\.)+(?:${TLD_EXACT})(?!\\\\.?\\\\w))`;\n\nconst HOST_COLLISION = `(?:(?:https?|sftp|ftps?|wss?)://(?:[^/@\\\\s]+@)?)((?:${LABEL}\\\\.)+(?:${TLD_COLLISION}))(?!\\\\.?\\\\w)`;\n\nfunction uncComputerPattern(separator: string): string {\n return `(?:${separator}${separator})([A-Za-z][A-Za-z0-9-]{0,14})(?=${separator}[A-Za-z0-9$])`;\n}\n\nconst UNC_COMPUTER = uncComputerPattern(BACKSLASH);\nconst UNC_COMPUTER_JSON = uncComputerPattern(JSON_BACKSLASH);\n\nconst SPN_HOST = '(?:\\\\b[A-Za-z][A-Za-z0-9]*/)([A-Za-z0-9][A-Za-z0-9.-]*)(?=@[A-Z0-9.-]+\\\\b)';\n\nconst HOST_CTX_KEY = '(?:host|hostname|computer)';\nconst HOST_VALUE = '[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?';\nconst HOST_CTX = `(?:\\\\b${HOST_CTX_KEY}\\\\s*[=:]\\\\s*)(${HOST_VALUE})`;\n\nfunction anyCase(word: string): string {\n let pattern = '';\n\n for (const char of word) {\n const lower = char.toLowerCase();\n const upper = char.toUpperCase();\n pattern += lower === upper ? char : `[${lower}${upper}]`;\n }\n\n return pattern;\n}\n\nconst QUOTED_DOMAIN_ACCOUNT = `(?:\")(?!${WELL_KNOWN_DOMAIN}\\\\\\\\{1,2})(${NETBIOS_DOMAIN})(?=\\\\\\\\{1,2}${NOT_WINDOWS_FILENAME}${ACCOUNT_SEGMENT}\")`;\n\nconst KEY_WORD = '[A-Za-z_]*';\nconst JSON_HOST_KEY = [\n `${KEY_WORD}${anyCase('computer')}${KEY_WORD}`,\n `${KEY_WORD}${anyCase('domain')}[_-]?${anyCase('name')}`,\n `${anyCase('host')}(?:[_-]?${anyCase('name')})?`,\n anyCase('fqdn'),\n anyCase('domain'),\n `${anyCase('server')}[_-]?${anyCase('name')}`,\n `${anyCase('node')}[_-]?${anyCase('name')}`,\n `${anyCase('dns')}[_-]?${anyCase('name')}`,\n `${anyCase('machine')}[_-]?${anyCase('name')}`,\n `${anyCase('target')}[_-]?${anyCase('host')}`,\n].join('|');\nconst HOST_JSON_CTX = `(?:\"(?:${JSON_HOST_KEY})\"\\\\s*:\\\\s*\")(${HOST_VALUE})(?=\")`;\n\nconst NETBIOS_AGGRESSIVE = '(?:\\\\b(?:WIN|DESKTOP)-[A-Z0-9]{7,10}\\\\b)';\n\nconst SYSLOG_MONTH = '(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)';\nconst SYSLOG_BSD_TS = `${SYSLOG_MONTH}\\\\s+\\\\d{1,2}\\\\s+\\\\d{2}:\\\\d{2}:\\\\d{2}`;\nconst SYSLOG_ISO_TS =\n '\\\\d{4}-\\\\d{2}-\\\\d{2}[T ]\\\\d{2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d+)?(?:Z|[+-]\\\\d{2}:?\\\\d{2})?';\nconst SYSLOG_HOST_NAME = `${LABEL}(?:\\\\.${LABEL})*`;\nconst SYSLOG_HOST_LOOKAHEAD = '(?=\\\\s+[A-Za-z][A-Za-z0-9_.@-]*(?:\\\\[\\\\d+\\\\])?:)';\nconst SYSLOG_HOST = `(?:(?:${SYSLOG_BSD_TS}|${SYSLOG_ISO_TS})\\\\s+)(${SYSLOG_HOST_NAME})${SYSLOG_HOST_LOOKAHEAD}`;\n\nconst INVENTORY_PREFIX =\n '(?:[Ss][Rr][Vv]|[Ww][Ee][Bb]|[Dd][Bb]|[Aa][Pp][Pp]|[Hh][Oo][Ss][Tt]|[Nn][Oo][Dd][Ee]|[Pp][Oo][Dd])';\nconst INVENTORY_HOST = `(?:\\\\b${INVENTORY_PREFIX}-[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*-\\\\d+\\\\b)`;\n\nexport const hostnamesRule: SanitizeRule = {\n id: 'hosts',\n label: 'Hostnames & domains',\n description:\n 'FQDNs, UNC computer names, Kerberos SPN hosts, quoted JSON host fields, the domain half of a quoted DOMAIN\\\\account value and syslog host fields become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'HOST',\n patterns: [\n HOST_EXACT,\n HOST_COLLISION,\n UNC_COMPUTER,\n UNC_COMPUTER_JSON,\n SPN_HOST,\n HOST_CTX,\n HOST_JSON_CTX,\n QUOTED_DOMAIN_ACCOUNT,\n SYSLOG_HOST,\n ],\n aggressivePatterns: [NETBIOS_AGGRESSIVE, INVENTORY_HOST],\n jsonKeys: [\n 'hostname',\n 'host',\n 'fqdn',\n 'domain',\n 'computer',\n 'computerName',\n 'serverName',\n 'nodeName',\n 'dnsName',\n 'machineName',\n 'targetHost',\n ],\n jsonKeyContains: ['computer', 'domainname'],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst IPV4_OCTET = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)';\nconst IPV4 = `(?:(?<![\\\\d.])\\\\b${IPV4_OCTET}(?:\\\\.${IPV4_OCTET}){3}\\\\b(?!\\\\.\\\\d))`;\n\nconst IPV6_SEG = '[0-9a-fA-F]{1,4}';\nconst IPV6_FULL = `(?:${IPV6_SEG}:){7}${IPV6_SEG}`;\nconst IPV6_COMPRESSED = `(?:(?:${IPV6_SEG}:){1,7}:|(?:${IPV6_SEG}:){1,6}:${IPV6_SEG}|(?:${IPV6_SEG}:){1,5}(?::${IPV6_SEG}){1,2}|(?:${IPV6_SEG}:){1,4}(?::${IPV6_SEG}){1,3}|(?:${IPV6_SEG}:){1,3}(?::${IPV6_SEG}){1,4}|(?:${IPV6_SEG}:){1,2}(?::${IPV6_SEG}){1,5}|${IPV6_SEG}:(?::${IPV6_SEG}){1,6}|:(?:(?::${IPV6_SEG}){1,7}|:))`;\nconst IPV4_MAPPED = `(?:::ffff:${IPV4})`;\nconst IPV6 = `(?:(?<![A-Za-z0-9])(?:${IPV4_MAPPED}|${IPV6_FULL}|${IPV6_COMPRESSED})(?![A-Za-z0-9:])(?!\\\\.\\\\d)(?:%[A-Za-z0-9_.-]+)?)`;\n\nconst PTR_V4 = '(?:\\\\b(?:\\\\d{1,3}\\\\.){4}in-addr\\\\.arpa\\\\b)';\nconst PTR_V6 = '(?:\\\\b(?:[0-9a-fA-F]\\\\.){4,32}ip6\\\\.arpa\\\\b)';\n\nconst MAC_COLON = '(?:(?<!&)\\\\b[0-9A-Fa-f]{2}(?::[0-9A-Fa-f]{2}){5}\\\\b)';\nconst MAC_DASH = '(?:\\\\b[0-9A-Fa-f]{2}(?:-[0-9A-Fa-f]{2}){5}\\\\b)';\nconst MAC_CISCO = '(?:\\\\b[0-9A-Fa-f]{4}(?:\\\\.[0-9A-Fa-f]{4}){2}\\\\b)';\n\nfunction ipv4ToOctets(ip: string): number[] {\n return ip.split('.').map(Number);\n}\n\nfunction isNetmaskShape(octets: number[]): boolean {\n const bin = octets.map((octet) => octet.toString(2).padStart(8, '0')).join('');\n return /^1*0*$/.test(bin);\n}\n\nfunction isReservedIpv4(ip: string): boolean {\n const octets = ipv4ToOctets(ip);\n\n if (octets.length !== 4 || octets.some((octet) => Number.isNaN(octet))) {\n return false;\n }\n\n if (octets[0] === 127) {\n return true;\n }\n\n if (octets[0] === 0) {\n return true;\n }\n\n if (octets[0] === 169 && octets[1] === 254) {\n return true;\n }\n\n if (octets[0] >= 224 && octets[0] <= 239) {\n return true;\n }\n\n return isNetmaskShape(octets);\n}\n\nfunction validateIp(match: string): boolean {\n if (/^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(match)) {\n return !isReservedIpv4(match);\n }\n\n const withoutZone = match.split('%')[0] ?? match;\n\n if (withoutZone === '::' || withoutZone === '::1') {\n return false;\n }\n\n const mapped = /^::ffff:(\\d{1,3}(?:\\.\\d{1,3}){3})$/.exec(withoutZone);\n\n if (mapped?.[1]) {\n return !isReservedIpv4(mapped[1]);\n }\n\n return true;\n}\n\nexport const ipAddressesRule: SanitizeRule = {\n id: 'ips',\n label: 'Network addresses',\n description:\n 'IPv4/IPv6 addresses, MAC addresses and reverse-DNS (PTR) names become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'IP',\n patterns: [PTR_V4, PTR_V6, IPV6, IPV4, MAC_COLON, MAC_DASH, MAC_CISCO],\n validate: validateIp,\n jsonKeys: [\n 'ip',\n 'ipAddress',\n 'ip_address',\n 'clientIp',\n 'remoteAddr',\n 'srcIp',\n 'dstIp',\n 'sourceIp',\n 'destinationIp',\n 'xForwardedFor',\n 'mac',\n 'macAddress',\n ],\n};\n","const BLOCK_BYTES = 64;\nconst DIGEST_BYTES = 32;\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nconst INITIAL_STATE = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\nfunction rotr(value: number, bits: number): number {\n return ((value >>> bits) | (value << (32 - bits))) >>> 0;\n}\n\nfunction padMessage(message: Uint8Array): Uint8Array {\n const bitLength = message.length * 8;\n const paddedLength = Math.ceil((message.length + 9) / BLOCK_BYTES) * BLOCK_BYTES;\n const padded = new Uint8Array(paddedLength);\n\n padded.set(message);\n padded[message.length] = 0x80;\n\n const view = new DataView(padded.buffer);\n view.setUint32(paddedLength - 8, Math.floor(bitLength / 2 ** 32), false);\n view.setUint32(paddedLength - 4, bitLength >>> 0, false);\n\n return padded;\n}\n\nexport function sha256(message: Uint8Array): Uint8Array {\n const padded = padMessage(message);\n const view = new DataView(padded.buffer);\n const state = Uint32Array.from(INITIAL_STATE);\n const w = new Uint32Array(64);\n\n for (let offset = 0; offset < padded.length; offset += BLOCK_BYTES) {\n for (let i = 0; i < 16; i += 1) {\n w[i] = view.getUint32(offset + i * 4, false);\n }\n\n for (let i = 16; i < 64; i += 1) {\n const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >>> 3);\n const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >>> 10);\n w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;\n }\n\n let [a, b, c, d, e, f, g, h] = state;\n\n for (let i = 0; i < 64; i += 1) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + K[i] + w[i]) >>> 0;\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n state[0] = (state[0] + a) >>> 0;\n state[1] = (state[1] + b) >>> 0;\n state[2] = (state[2] + c) >>> 0;\n state[3] = (state[3] + d) >>> 0;\n state[4] = (state[4] + e) >>> 0;\n state[5] = (state[5] + f) >>> 0;\n state[6] = (state[6] + g) >>> 0;\n state[7] = (state[7] + h) >>> 0;\n }\n\n const digest = new Uint8Array(DIGEST_BYTES);\n const digestView = new DataView(digest.buffer);\n\n for (let i = 0; i < 8; i += 1) {\n digestView.setUint32(i * 4, state[i], false);\n }\n\n return digest;\n}\n","import { sha256 } from '../shared/hmacSha256';\nimport type { SanitizeRule } from '../../types';\n\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\nfunction luhnCheck(digits: string): boolean {\n if (!/^\\d{13,19}$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n let doubleIt = false;\n\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let digit = Number(digits[i]);\n\n if (doubleIt) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n doubleIt = !doubleIt;\n }\n\n return sum % 10 === 0;\n}\n\nfunction ibanMod97(iban: string): boolean {\n const compact = iban.replace(/\\s/g, '').toUpperCase();\n\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]{10,30}$/.test(compact)) {\n return false;\n }\n\n const rearranged = compact.slice(4) + compact.slice(0, 4);\n const numeric = rearranged.replace(/[A-Z]/g, (char) => String(char.charCodeAt(0) - 55));\n let remainder = 0;\n\n for (let i = 0; i < numeric.length; i += 1) {\n remainder = (remainder * 10 + Number(numeric[i])) % 97;\n }\n\n return remainder === 1;\n}\n\nconst IBAN_COUNTRY_CODES = new Set([\n 'AD',\n 'AE',\n 'AL',\n 'AO',\n 'AT',\n 'AZ',\n 'BA',\n 'BE',\n 'BF',\n 'BG',\n 'BH',\n 'BI',\n 'BJ',\n 'BR',\n 'BY',\n 'CF',\n 'CG',\n 'CH',\n 'CI',\n 'CM',\n 'CR',\n 'CV',\n 'CY',\n 'CZ',\n 'DE',\n 'DJ',\n 'DK',\n 'DO',\n 'DZ',\n 'EE',\n 'EG',\n 'ES',\n 'FI',\n 'FO',\n 'FR',\n 'GA',\n 'GB',\n 'GE',\n 'GI',\n 'GL',\n 'GQ',\n 'GR',\n 'GT',\n 'GW',\n 'HN',\n 'HR',\n 'HU',\n 'IE',\n 'IL',\n 'IQ',\n 'IR',\n 'IS',\n 'IT',\n 'JO',\n 'KM',\n 'KW',\n 'KZ',\n 'LB',\n 'LC',\n 'LI',\n 'LT',\n 'LU',\n 'LV',\n 'LY',\n 'MA',\n 'MC',\n 'MD',\n 'ME',\n 'MG',\n 'MK',\n 'ML',\n 'MR',\n 'MT',\n 'MU',\n 'MZ',\n 'NE',\n 'NI',\n 'NL',\n 'NO',\n 'PK',\n 'PL',\n 'PS',\n 'PT',\n 'QA',\n 'RO',\n 'RS',\n 'RU',\n 'SA',\n 'SC',\n 'SD',\n 'SE',\n 'SI',\n 'SK',\n 'SM',\n 'SN',\n 'ST',\n 'SV',\n 'TD',\n 'TG',\n 'TL',\n 'TN',\n 'TR',\n 'UA',\n 'VA',\n 'VG',\n 'XK',\n]);\n\nfunction isIbanCountry(compact: string): boolean {\n return IBAN_COUNTRY_CODES.has(compact.slice(0, 2).toUpperCase());\n}\n\nfunction isHexHashLength(value: string): boolean {\n return /^(?:[A-Fa-f0-9]{32}|[A-Fa-f0-9]{40}|[A-Fa-f0-9]{64})$/.test(value);\n}\n\nfunction isCardSeparatorLayout(match: string): boolean {\n if (!/[ -]/.test(match)) {\n return true;\n }\n\n const groups = match.split(/[ -]/).map((group) => group.length);\n\n if (groups.some((length) => length === 0)) {\n return false;\n }\n\n if (\n groups.length === 3 &&\n groups[0] === 4 &&\n groups[1] === 6 &&\n (groups[2] === 4 || groups[2] === 5)\n ) {\n return true;\n }\n\n const last = groups[groups.length - 1];\n\n return (\n groups.length >= 2 &&\n groups.slice(0, -1).every((length) => length === 4) &&\n last >= 1 &&\n last <= 7\n );\n}\n\nfunction bitcoinBase58Check(address: string): boolean {\n const decoded = decodeBase58(address);\n\n if (!decoded || decoded.length < 5) {\n return false;\n }\n\n const payload = decoded.subarray(0, decoded.length - 4);\n const checksum = decoded.subarray(decoded.length - 4);\n const digest = sha256(sha256(payload));\n\n return (\n digest[0] === checksum[0] &&\n digest[1] === checksum[1] &&\n digest[2] === checksum[2] &&\n digest[3] === checksum[3]\n );\n}\n\nfunction decodeBase58(input: string): Uint8Array | null {\n const bytes: number[] = [0];\n\n for (let i = 0; i < input.length; i += 1) {\n let carry = BASE58_ALPHABET.indexOf(input[i]);\n\n if (carry === -1) {\n return null;\n }\n\n for (let j = 0; j < bytes.length; j += 1) {\n carry += bytes[j] * 58;\n bytes[j] = carry % 256;\n carry = Math.floor(carry / 256);\n }\n\n while (carry > 0) {\n bytes.push(carry % 256);\n carry = Math.floor(carry / 256);\n }\n }\n\n let leadingOnes = 0;\n\n while (leadingOnes < input.length && input[leadingOnes] === '1') {\n leadingOnes += 1;\n }\n\n let end = bytes.length;\n\n while (end > 0 && bytes[end - 1] === 0) {\n end -= 1;\n }\n\n const out = new Uint8Array(leadingOnes + end);\n\n for (let i = 0; i < end; i += 1) {\n out[leadingOnes + end - 1 - i] = bytes[i];\n }\n\n return out;\n}\n\nfunction isKnownCardIin(digits: string): boolean {\n const { length } = digits;\n const d2 = Number(digits.slice(0, 2));\n const d4 = Number(digits.slice(0, 4));\n\n switch (digits[0]) {\n case '4':\n return length === 13 || length === 16 || length === 19;\n case '5':\n return length === 16 && d2 >= 51 && d2 <= 55;\n case '2':\n return length === 16 && d4 >= 2221 && d4 <= 2720;\n case '3':\n if (length === 15) {\n return d2 === 34 || d2 === 37;\n }\n\n if (length === 14) {\n return d2 === 36 || d2 === 38 || d2 === 39 || (d4 >= 3000 && d4 <= 3059) || d4 === 3095;\n }\n\n return length >= 16 && length <= 19 && d4 >= 3528 && d4 <= 3589;\n case '6':\n return (\n length >= 16 &&\n length <= 19 &&\n (digits.startsWith('6011') ||\n digits.startsWith('62') ||\n digits.startsWith('64') ||\n digits.startsWith('65'))\n );\n default:\n return false;\n }\n}\n\nfunction validatePayment(match: string): boolean {\n const compactIban = match.replace(/\\s/g, '');\n\n if (/^[A-Za-z]{2}\\d{2}[A-Za-z0-9]+$/.test(compactIban)) {\n return !isHexHashLength(compactIban) && isIbanCountry(compactIban) && ibanMod97(match);\n }\n\n const compactPan = match.replace(/[ -]/g, '');\n\n if (/^[\\d -]+$/.test(match) && /^\\d{13,19}$/.test(compactPan)) {\n const grouped = /[ -]/.test(match);\n\n if (!grouped && compactPan.length > 16) {\n return false;\n }\n\n return isCardSeparatorLayout(match) && isKnownCardIin(compactPan) && luhnCheck(compactPan);\n }\n\n if (/^[13][A-HJ-NP-Za-km-z1-9]{25,34}$/.test(match)) {\n return bitcoinBase58Check(match);\n }\n\n return true;\n}\n\nconst CVV_KEY = '(?:[Cc][Vv][Vv]2?|[Cc][Vv][Cc]2?|[Cc][Ii][Dd])';\nconst EXP_KEY = '(?:[Ee]xp(?:iry|iration)?|[Ee]xp[_-]?[Dd]ate)';\nconst ROUTING_KEY = '(?:[Rr]outing(?:[_-]?[Nn]umber)?|[Aa][Bb][Aa])';\nconst ACCOUNT_KEY = '(?:[Aa]ccount[_-]?[Nn]umber|[Aa]cct)';\n\nexport const paymentInfoRule: SanitizeRule = {\n id: 'paymentInfo',\n label: 'Payment info',\n description:\n 'IBANs, card numbers (PAN, Luhn-checked), CVV/CVC, expiry dates and crypto addresses are redacted outright.',\n mode: 'mask',\n token: 'PAYMENT',\n patterns: [\n '(?:(?<![.\\\\d])\\\\b\\\\d(?:[ -]?\\\\d){12,18}\\\\b)',\n '(?:\\\\b[A-Z]{2}\\\\d{2}[A-Z0-9]{10,30}\\\\b)',\n '(?:\\\\b[A-Z]{2}\\\\d{2}(?: [A-Z0-9]{4}){2,7}(?: [A-Z0-9]{1,4})?\\\\b)',\n `(?:\\\\b${CVV_KEY}\\\\s*[=:]\\\\s*)(\\\\d{3,4}\\\\b)`,\n `(?:\\\\b${EXP_KEY}\\\\s*[=:]\\\\s*)((?:0[1-9]|1[0-2])[/-](?:\\\\d{2}|\\\\d{4})\\\\b)`,\n '(?:\\\\bbc1[a-z0-9]{25,39}\\\\b)',\n '(?:(?<![A-Za-z0-9])[13][A-HJ-NP-Za-km-z1-9]{25,34}(?![A-Za-z0-9]))',\n '(?:\\\\b0x[A-Fa-f0-9]{40}\\\\b)',\n ],\n aggressivePatterns: [\n '(?:(?<![\\\\\\\\/])\\\\b[A-Z]{6}[A-Z0-9]{2}(?:[A-Z0-9]{3})?\\\\b(?![\\\\\\\\/]))',\n `(?:\\\\b${ROUTING_KEY}\\\\s*[=:]\\\\s*)(\\\\d{9}\\\\b)`,\n `(?:\\\\b${ACCOUNT_KEY}\\\\s*[=:]\\\\s*)(\\\\d{8,12}\\\\b)`,\n ],\n validate: validatePayment,\n jsonKeys: [\n 'iban',\n 'cardNumber',\n 'pan',\n 'cvv',\n 'cvc',\n 'card_number',\n 'creditCard',\n 'cvv2',\n 'accountNumber',\n 'routingNumber',\n 'bic',\n 'swift',\n 'expiryDate',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction validatePhone(match: string): boolean {\n const digits = match.replace(/\\D/g, '');\n const national = digits.startsWith('00') ? digits.slice(2) : digits;\n return national.length >= 7 && national.length <= 15;\n}\n\nconst PHONE_KEY = '(?:telephone|phone|mobile|msisdn|cell|fax|tel)';\n\nexport const phoneNumbersRule: SanitizeRule = {\n id: 'phoneNumbers',\n label: 'Phone numbers',\n description:\n 'Phone numbers become a stable <PHONE:…> token — the same number maps to the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'PHONE',\n patterns: [\n '(?:(?<![A-Za-z0-9])\\\\+[1-9](?:[\\\\s().-]*\\\\d){6,14}(?!\\\\d))',\n '(?:\\\\(\\\\d{3}\\\\)\\\\s?\\\\d{3}-\\\\d{4}(?!\\\\d))',\n '(?:\\\\b\\\\d{3}-\\\\d{3}-\\\\d{4}\\\\b)',\n '(?:\\\\b1-\\\\d{3}-\\\\d{3}-\\\\d{4}\\\\b)',\n '(?:\\\\b0\\\\d{2}-\\\\d{3}-\\\\d{2}-\\\\d{2}\\\\b)',\n '(?:\\\\b0\\\\d{2}\\\\s\\\\d{3}\\\\s\\\\d{2}\\\\s\\\\d{2}\\\\b)',\n '(?:(?<![.\\\\d-])\\\\b00[1-9](?:[\\\\s().-]*\\\\d){7,13}(?!\\\\w)(?!-[\\\\dA-Fa-f]))',\n '(?:\\\\b(?:tel|sms):)(\\\\+?[1-9](?:[\\\\s().-]*\\\\d){6,14})(?!\\\\d)',\n `(?:\\\\b${PHONE_KEY}\\\\s*[=:]\\\\s*)(\\\\+?[0-9](?:[\\\\s().-]*\\\\d){6,14})(?!\\\\d)`,\n ],\n validate: validatePhone,\n jsonKeys: [\n 'phone',\n 'phoneNumber',\n 'phone_number',\n 'mobile',\n 'mobileNumber',\n 'cell',\n 'telephone',\n 'tel',\n 'fax',\n 'msisdn',\n 'contactNumber',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst ENTROPY_THRESHOLD = 3.5;\n\nfunction shannonEntropy(value: string): number {\n const { length } = value;\n\n if (length === 0) {\n return 0;\n }\n\n const freq: Record<string, number> = {};\n\n for (let i = 0; i < length; i += 1) {\n const char = value[i];\n freq[char] = (freq[char] ?? 0) + 1;\n }\n\n return Object.values(freq).reduce((entropy, count) => {\n const p = count / length;\n\n return entropy - p * Math.log2(p);\n }, 0);\n}\n\nfunction isHexBlob(match: string): boolean {\n return match.length >= 32 && /^[A-Fa-f0-9]+$/.test(match);\n}\n\nfunction isBase64Blob(match: string): boolean {\n return match.length >= 40 && /^[A-Za-z0-9+/]+=*$/.test(match);\n}\n\nfunction validateSecret(match: string): boolean {\n if (isHexBlob(match)) {\n return shannonEntropy(match) > ENTROPY_THRESHOLD;\n }\n\n if (isBase64Blob(match)) {\n return (\n shannonEntropy(match) > ENTROPY_THRESHOLD && /[A-Za-z]/.test(match) && /[0-9+/]/.test(match)\n );\n }\n\n return true;\n}\n\nconst CONTEXT_KEYS =\n '(?:api[_-]?key|apikey|access[_-]?token|refresh[_-]?token|id[_-]?token|client[_-]?secret|secret[_-]?key|private[_-]?key|password|passwd|pwd|pass|auth[_-]?token|signing[_-]?key)';\n\nconst CONTEXT_VALUE = '[^\\\\s,;}\"\\']{4,}';\n\nconst CLI_FLAGS = '(?:password|secret|token|api-key|apikey|access-token|client-secret)';\n\nexport const secretsRule: SanitizeRule = {\n id: 'secrets',\n label: 'Tokens & credentials',\n description:\n 'Bearer tokens, JWTs and API keys are redacted outright — they are not meant to be traced.',\n mode: 'mask',\n token: 'SECRET',\n patterns: [\n '(?:(?:Bearer|bearer|BEARER)\\\\s+)([A-Za-z0-9._\\\\-+/=]{8,})',\n '(?:(?:Basic|basic|BASIC)\\\\s+)([A-Za-z0-9+/]{8,}={0,2})',\n '(?:(?<![A-Za-z0-9_-])eyJ[A-Za-z0-9_-]{8,}\\\\.[A-Za-z0-9_-]{8,}(?:\\\\.[A-Za-z0-9_-]{8,})?)',\n '(?:-----BEGIN (?:(?:RSA |EC |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY|CERTIFICATE)-----[A-Za-z0-9+/=\\\\s\\\\\\\\]+?-----END (?:(?:RSA |EC |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY|CERTIFICATE)-----)',\n '(?:\\\\b(?:AKIA|ASIA|ABIA|ACCA)[A-Z0-9]{16}\\\\b)',\n '(?:(?:aws_secret_access_key|AWS_SECRET_ACCESS_KEY)\\\\s*[=:]\\\\s*)([A-Za-z0-9/+=]{30,})',\n '(?:github_pat_[A-Za-z0-9_]{22,})',\n '(?:gh[pousr]_[A-Za-z0-9]{36,})',\n '(?:xox[abprs]-[A-Za-z0-9-]{10,})',\n '(?:hooks\\\\.slack\\\\.com/services/[A-Za-z0-9/_-]{16,})',\n '(?:AIza[A-Za-z0-9_-]{35})',\n '(?:(?:sk_live_|sk_test_|rk_live_|rk_test_)[A-Za-z0-9]{16,})',\n '(?:sk-proj-[A-Za-z0-9_-]{16,})',\n '(?:sk-[A-Za-z0-9]{20,})',\n // Kept as a lookbehind: `.{0,60}` asserts a nearby keyword rather than an adjacent prefix, so\n // one `Twilio` has to stay reusable by every identifier that follows it.\n '(?:(?<=(?:[Tt]wilio.{0,60}|\\\\b(?:[Aa]ccount[Ss]id|[Aa]uth[Tt]oken|[Ss]id)\\\\s*[=:]\\\\s*))(?:AC|SK)[0-9A-Fa-f]{32})',\n '(?:SG\\\\.[A-Za-z0-9_-]{10,}\\\\.[A-Za-z0-9_-]{10,})',\n '(?:npm_[A-Za-z0-9]{36,})',\n '(?:[?&][Ss]ig=)([^&\\\\s\"\\']{16,})',\n '(?:[a-zA-Z][a-zA-Z0-9+.-]*://)([^/@\\\\s:]+:[^/@\\\\s]+@)',\n `(?:--${CLI_FLAGS}(?:\\\\s+|=)\"?)([^\\\\s\"']{4,})`,\n `(?:\\\\b${CONTEXT_KEYS}\"?\\\\s*[=:]\\\\s*\"?)(${CONTEXT_VALUE})`,\n ],\n aggressivePatterns: [\n '(?:(?<![A-Za-z0-9+/])[A-Za-z0-9+/]{40,}={0,2}(?![A-Za-z0-9+/=]))',\n '(?:\\\\b[A-Fa-f0-9]{32,}\\\\b)',\n ],\n validate: validateSecret,\n jsonKeys: [\n 'password',\n 'token',\n 'authorization',\n 'apiKey',\n 'secret',\n 'accessToken',\n 'refreshToken',\n 'passwd',\n 'pwd',\n 'pass',\n 'clientSecret',\n 'privateKey',\n 'secretKey',\n 'apiSecret',\n 'credentials',\n 'auth',\n 'xApiKey',\n 'idToken',\n 'awsSecretAccessKey',\n 'signature',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst COOKIE_VALUE = '[^;\\\\s]{8,}';\n\nexport const sessionCookiesRule: SanitizeRule = {\n id: 'sessionCookies',\n label: 'Session cookies',\n description: 'Session identifiers (sessionid, sid, JSESSIONID, PHPSESSID) are redacted outright.',\n mode: 'mask',\n token: 'SESSION',\n patterns: [\n `(?:(?<![\\\\w-])(?:[Ss]essionid|[Ss]ession_id|sessionId|SESSIONID)=${COOKIE_VALUE})`,\n `(?:(?<![\\\\w-])sid=${COOKIE_VALUE})`,\n `(?:PHPSESSID=${COOKIE_VALUE})`,\n `(?:JSESSIONID=${COOKIE_VALUE})`,\n `(?:ASP\\\\.NET_SessionId=${COOKIE_VALUE})`,\n `(?:ASPSESSIONID[A-Za-z0-9]*=${COOKIE_VALUE})`,\n `(?:connect\\\\.sid=${COOKIE_VALUE})`,\n `(?:laravel_session=${COOKIE_VALUE})`,\n `(?:_session_id=${COOKIE_VALUE})`,\n `(?:(?:csrftoken|csrf_token|XSRF-TOKEN|xsrf-token)=${COOKIE_VALUE})`,\n `(?:remember_token=${COOKIE_VALUE})`,\n `(?:(?:SSESS|SESS)[A-Fa-f0-9]{32}=${COOKIE_VALUE})`,\n `(?:[Ss]et-[Cc]ookie:\\\\s*)([^;=\\\\s]+=${COOKIE_VALUE})`,\n ],\n aggressivePatterns: [\n `(?:(?<![\\\\w-])[\\\\w-]*session[\\\\w-]*=${COOKIE_VALUE})`,\n `(?:(?<![\\\\w-])[\\\\w-]*token=${COOKIE_VALUE})`,\n ],\n jsonKeys: ['sessionId', 'sid', 'cookie', 'cookies', 'setCookie', 'jsessionid', 'csrfToken'],\n};\n","import type { SanitizeRule } from '../../types';\nimport {\n ACCOUNT_SEGMENT,\n BACKSLASH,\n JSON_BACKSLASH,\n NETBIOS_DOMAIN,\n NOT_WINDOWS_FILENAME,\n WELL_KNOWN_DOMAIN,\n} from '../shared/windowsAccounts';\n\nconst EMAIL_LOCAL = '[A-Za-z0-9._%+-]+';\nconst EMAIL_DOMAIN = '[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}';\nconst EMAIL = `(?:\\\\b${EMAIL_LOCAL}@${EMAIL_DOMAIN})`;\nconst EMAIL_IP_LITERAL = `(?:\\\\b${EMAIL_LOCAL}@\\\\[[0-9a-fA-F.:]+\\\\])`;\n\nconst USER_SEG_SIMPLE = ACCOUNT_SEGMENT;\n\nconst NOT_GUID = '(?![0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-)';\nconst ACCOUNT_END = '(?![A-Za-z0-9_$\\\\\\\\/-])';\n\nfunction domainUserPattern(separator: string): string {\n const winDomainExclude = `${WELL_KNOWN_DOMAIN}${separator}`;\n const pathRoot = `(?:\\\\b(?:HKLM|HKCU|HKU|HKCR|HKEY_[A-Z_]+)|\\\\b[A-Za-z]:)${separator}`;\n const notUnderPathRoot = `(?<!${pathRoot}(?:(?! [-/])[^<>'\"\\\\n])*)`;\n const domain = `(?:^|[^\\\\\\\\.-])\\\\b${NETBIOS_DOMAIN}${separator}`;\n\n return `(?:(?:${domain})(?<!${winDomainExclude})${NOT_WINDOWS_FILENAME}${NOT_GUID}(${USER_SEG_SIMPLE})${ACCOUNT_END}${notUnderPathRoot})`;\n}\n\nconst DOMAIN_USER = domainUserPattern(BACKSLASH);\nconst DOMAIN_USER_JSON = domainUserPattern(JSON_BACKSLASH);\n\nconst SID = '(?:\\\\bS-1-(?:\\\\d+-){1,14}\\\\d+\\\\b)';\n\nconst VALUE_WITH_LETTER = '[\\\\w.@+-]*[A-Za-z][\\\\w.@+-]*';\nconst LDAP_DN_SINGLE = `(?:\\\\b(?:uid|sAMAccountName)=)(${VALUE_WITH_LETTER})`;\nconst CN_VALUE = \"(?:[A-Za-z0-9.'-]+(?: [A-Za-z0-9.'-]+){0,3})\";\nconst LDAP_DN_CN = `(?:\\\\bcn=)(${CN_VALUE})`;\n\nconst ARN_USER = '(?::user/)([\\\\w.@+=,-]+)';\nconst ARN_ASSUMED_ROLE_SESSION = '(?::assumed-role/[\\\\w+=,.@-]+/)([\\\\w.@+=,-]+)';\n\nconst K8S_SERVICE_ACCOUNT = '(?:\\\\bsystem:serviceaccount:[A-Za-z0-9-]+:)([A-Za-z0-9-]+)';\n\nconst SSHD_FOR_USER = '(?:(?:\\\\bfor (?:invalid )?user|\\\\b[Ii]nvalid user)\\\\s+)([A-Za-z0-9._-]+)';\nconst SSHD_RUSER = '(?:\\\\bruser=)([A-Za-z0-9._-]+)';\nconst SSHD_LOGNAME = '(?:\\\\blogname=)([A-Za-z0-9._-]+)';\nconst SUDO_USER = '(?:\\\\bsudo:\\\\s+)([A-Za-z0-9._-]+)(?=\\\\s+:)';\n\nconst GENERIC_KEY =\n '(?:user|username|login|account|owner|actor|principal|requester|createdBy|modifiedBy|assignee|operator)';\nconst GENERIC_CTX = `(?:\\\\b${GENERIC_KEY}\\\\s*[=:]\\\\s*)(${VALUE_WITH_LETTER})`;\n\nconst SLACK_USER_ID_AGGRESSIVE = '(?:\\\\bU[A-Z0-9]{8,10}\\\\b)';\n\nconst SYSTEM_ACCOUNTS = new Set([\n 'root',\n 'system',\n 'daemon',\n 'nobody',\n 'www-data',\n 'nginx',\n 'sshd',\n 'syslog',\n]);\n\nfunction isWellKnownWindowsAccount(match: string): boolean {\n const upper = match.toUpperCase();\n\n if (upper === 'SYSTEM' || upper === 'LOCAL' || upper === 'NETWORK' || upper === 'ANONYMOUS') {\n return true;\n }\n\n return match.endsWith('$');\n}\n\nfunction isWellKnownSid(match: string): boolean {\n if (match === 'S-1-1-0') {\n return true;\n }\n\n if (/^S-1-5-(?:18|19|20)$/.test(match)) {\n return true;\n }\n\n return /^S-1-5-32-\\d+$/.test(match);\n}\n\nfunction validateUser(match: string): boolean {\n if (isWellKnownWindowsAccount(match)) {\n return false;\n }\n\n if (isWellKnownSid(match)) {\n return false;\n }\n\n return !SYSTEM_ACCOUNTS.has(match.toLowerCase());\n}\n\nexport const usersRule: SanitizeRule = {\n id: 'users',\n label: 'Usernames & emails',\n description:\n 'Email addresses and account identifiers (DOMAIN\\\\user, SIDs, ARNs, LDAP DNs, sshd/PAM context) become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'USER',\n patterns: [\n EMAIL_IP_LITERAL,\n EMAIL,\n DOMAIN_USER,\n DOMAIN_USER_JSON,\n SID,\n LDAP_DN_SINGLE,\n LDAP_DN_CN,\n ARN_USER,\n ARN_ASSUMED_ROLE_SESSION,\n K8S_SERVICE_ACCOUNT,\n SSHD_FOR_USER,\n SSHD_RUSER,\n SSHD_LOGNAME,\n SUDO_USER,\n GENERIC_CTX,\n ],\n aggressivePatterns: [SLACK_USER_ID_AGGRESSIVE],\n validate: validateUser,\n jsonKeys: [\n 'email',\n 'username',\n 'user',\n 'emailAddress',\n 'mail',\n 'userEmail',\n 'user_name',\n 'login',\n 'account',\n 'samAccountName',\n 'userPrincipalName',\n 'upn',\n 'actor',\n 'principal',\n 'owner',\n 'createdBy',\n 'modifiedBy',\n 'firstName',\n 'lastName',\n 'fullName',\n 'displayName',\n 'givenName',\n 'surname',\n 'userId',\n 'uid',\n ],\n jsonKeyContains: ['owner', 'username'],\n};\n","import type { BuiltinRuleId, SanitizeRule } from '../types';\nimport { geoLocationRule } from './definitions/geoLocation';\nimport { govIdentifiersRule } from './definitions/govIdentifiers';\nimport { healthInfoRule } from './definitions/healthInfo';\nimport { homePathsRule } from './definitions/homePaths';\nimport { hostnamesRule } from './definitions/hostnames';\nimport { ipAddressesRule } from './definitions/ipAddresses';\nimport { paymentInfoRule } from './definitions/paymentInfo';\nimport { phoneNumbersRule } from './definitions/phoneNumbers';\nimport { secretsRule } from './definitions/secrets';\nimport { sessionCookiesRule } from './definitions/sessionCookies';\nimport { usersRule } from './definitions/users';\n\n/**\n * Every rule shipped with this package, in default priority order.\n *\n * Order matters: when two rules could match at the same position, the one listed first wins.\n * Credential-shaped rules come first so a token is not partially consumed by a broader\n * identifier rule.\n */\nexport const builtinRules: readonly SanitizeRule[] = [\n secretsRule,\n sessionCookiesRule,\n paymentInfoRule,\n govIdentifiersRule,\n healthInfoRule,\n phoneNumbersRule,\n ipAddressesRule,\n hostnamesRule,\n usersRule,\n geoLocationRule,\n homePathsRule,\n];\n\n/** Identifiers of {@link builtinRules}, in the same order. */\nexport const builtinRuleIds: readonly BuiltinRuleId[] = builtinRules.map(\n (rule) => rule.id as BuiltinRuleId,\n);\n\nconst builtinsById = new Map<string, SanitizeRule>(builtinRules.map((rule) => [rule.id, rule]));\n\n/**\n * Looks up a built-in rule by identifier.\n *\n * @returns The rule, or `undefined` when the identifier is not built in.\n */\nexport function getBuiltinRule(id: string): SanitizeRule | undefined {\n return builtinsById.get(id);\n}\n","export function matchParen(source: string, openIndex: number): number {\n let depth = 0;\n let inClass = false;\n\n for (let index = openIndex; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n\n if (inClass) {\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n continue;\n }\n\n if (char === '(') {\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n\n if (depth === 0) {\n return index;\n }\n }\n }\n\n return -1;\n}\n\nexport function countCapturingGroups(source: string): number {\n let count = 0;\n let inClass = false;\n\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n\n if (inClass) {\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n continue;\n }\n\n if (char !== '(') {\n continue;\n }\n\n const next = source.slice(index, index + 4);\n\n if (\n next.startsWith('(?:') ||\n next.startsWith('(?=') ||\n next.startsWith('(?!') ||\n next.startsWith('(?<=') ||\n next.startsWith('(?<!')\n ) {\n continue;\n }\n\n count += 1;\n }\n\n return count;\n}\n\nexport function deriveGateSource(source: string): string {\n let output = '';\n let inClass = false;\n\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n output += source.slice(index, index + 2);\n index += 1;\n continue;\n }\n\n if (inClass) {\n output += char;\n\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n output += char;\n continue;\n }\n\n if (char === '(' && source.startsWith('(?<=', index)) {\n const close = matchParen(source, index);\n\n if (close === -1) {\n output += char;\n continue;\n }\n\n output += `(?:${source.slice(index + 4, close)})`;\n index = close;\n continue;\n }\n\n if (\n char === '(' &&\n (source.startsWith('(?<!', index) ||\n source.startsWith('(?=', index) ||\n source.startsWith('(?!', index))\n ) {\n const close = matchParen(source, index);\n\n if (close === -1) {\n output += char;\n continue;\n }\n\n index = close;\n continue;\n }\n\n output += char;\n }\n\n return output;\n}\n\nexport function lineHasAnyChar(line: string, chars: string): boolean {\n for (let index = 0; index < line.length; index += 1) {\n if (chars.includes(line[index]!)) {\n return true;\n }\n }\n\n return false;\n}\n","import { InvalidRuleError } from '../core/errors';\nimport { countCapturingGroups } from '../core/regexSource';\nimport type { SanitizeRule } from '../types';\n\nconst RULE_ID_PATTERN = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\nconst TOKEN_PATTERN = /^[A-Z][A-Z0-9]*$/;\nconst NAMED_GROUP_PATTERN = /\\(\\?<[^=!]/;\n\nfunction requireText(value: unknown, rule: string, field: string): string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new InvalidRuleError(`Rule \"${rule}\": \\`${field}\\` must be a non-empty string.`);\n }\n\n return value;\n}\n\nfunction assertPatterns(patterns: unknown, ruleId: string, field: string): string[] {\n if (patterns === undefined) {\n return [];\n }\n\n if (!Array.isArray(patterns)) {\n throw new InvalidRuleError(`Rule \"${ruleId}\": \\`${field}\\` must be an array of strings.`);\n }\n\n return patterns.map((pattern: unknown, index) => {\n if (typeof pattern !== 'string' || pattern.length === 0) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must be a non-empty regular expression source.`,\n );\n }\n\n if (NAMED_GROUP_PATTERN.test(pattern)) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must not declare a named capture group.`,\n );\n }\n\n try {\n new RegExp(pattern, 'u');\n } catch (cause) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` is not a valid Unicode regular expression: ${String(cause)}`,\n );\n }\n\n if (countCapturingGroups(pattern) > 1) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must contain at most one capturing group, which marks the value to replace.`,\n );\n }\n\n return pattern;\n });\n}\n\nexport function validateRule(rule: SanitizeRule): SanitizeRule {\n if (typeof rule !== 'object' || rule === null) {\n throw new InvalidRuleError('A rule must be an object.');\n }\n\n const id = requireText(rule.id, String(rule.id), 'id');\n\n if (!RULE_ID_PATTERN.test(id)) {\n throw new InvalidRuleError(\n `Rule \"${id}\": \\`id\\` must be a valid ASCII identifier matching ${RULE_ID_PATTERN.source}.`,\n );\n }\n\n requireText(rule.label, id, 'label');\n requireText(rule.description, id, 'description');\n\n if (rule.mode !== 'pseudo' && rule.mode !== 'mask') {\n throw new InvalidRuleError(`Rule \"${id}\": \\`mode\\` must be either \"pseudo\" or \"mask\".`);\n }\n\n if (rule.token !== undefined && !TOKEN_PATTERN.test(rule.token)) {\n throw new InvalidRuleError(\n `Rule \"${id}\": \\`token\\` must match ${TOKEN_PATTERN.source}, so replacement tokens stay recognizable.`,\n );\n }\n\n const patterns = assertPatterns(rule.patterns, id, 'patterns');\n const aggressivePatterns = assertPatterns(rule.aggressivePatterns, id, 'aggressivePatterns');\n\n if (patterns.length === 0 && aggressivePatterns.length === 0) {\n throw new InvalidRuleError(`Rule \"${id}\": at least one pattern is required.`);\n }\n\n if (rule.jsonKeys !== undefined) {\n if (!Array.isArray(rule.jsonKeys)) {\n throw new InvalidRuleError(`Rule \"${id}\": \\`jsonKeys\\` must be an array of strings.`);\n }\n\n for (const [index, key] of rule.jsonKeys.entries()) {\n requireText(key, id, `jsonKeys[${index}]`);\n }\n }\n\n if (rule.jsonKeyContains !== undefined) {\n if (!Array.isArray(rule.jsonKeyContains)) {\n throw new InvalidRuleError(`Rule \"${id}\": \\`jsonKeyContains\\` must be an array of strings.`);\n }\n\n for (const [index, fragment] of rule.jsonKeyContains.entries()) {\n requireText(fragment, id, `jsonKeyContains[${index}]`);\n }\n }\n\n if (rule.validate !== undefined && typeof rule.validate !== 'function') {\n throw new InvalidRuleError(`Rule \"${id}\": \\`validate\\` must be a function.`);\n }\n\n return rule;\n}\n","import type { SanitizeRule } from '../types';\nimport { validateRule } from './validateRule';\n\n/**\n * Validates a rule and returns it unchanged.\n *\n * Use it instead of a plain object literal: the shape is checked once, at module load, so a typo in\n * a pattern surfaces immediately rather than as a silent miss during a run.\n *\n * @throws {InvalidRuleError} When the rule is malformed.\n *\n * @example\n * ```ts\n * const ticketRule = defineRule({\n * id: 'acme_ticket',\n * label: 'Support ticket IDs',\n * description: 'Internal ticket references such as ACME-123456.',\n * mode: 'pseudo',\n * token: 'TICKET',\n * patterns: ['(?:\\\\bACME-\\\\d{6}\\\\b)'],\n * jsonKeys: ['ticketId'],\n * });\n *\n * const sanitizer = createSanitizer({ extraRules: [ticketRule] });\n * ```\n */\nexport function defineRule(rule: SanitizeRule): SanitizeRule {\n return validateRule(rule);\n}\n"]}
|