@veryfront/ext-content-mdx 0.1.1186 → 0.1.1189
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/esm/_dnt.polyfills.d.ts +6 -6
- package/esm/_dnt.polyfills.d.ts.map +1 -1
- package/esm/deno.d.ts +18 -0
- package/esm/deno.js +30 -9
- package/esm/src/config/defaults.d.ts +31 -24
- package/esm/src/config/defaults.d.ts.map +1 -1
- package/esm/src/config/defaults.js +25 -18
- package/esm/src/errors/diagnostic-policy.d.ts +35 -0
- package/esm/src/errors/diagnostic-policy.d.ts.map +1 -0
- package/esm/src/errors/diagnostic-policy.js +100 -0
- package/esm/src/errors/error-registry/boundary.d.ts +2 -0
- package/esm/src/errors/error-registry/boundary.d.ts.map +1 -1
- package/esm/src/errors/error-registry/boundary.js +8 -0
- package/esm/src/errors/error-registry/config.d.ts.map +1 -1
- package/esm/src/errors/error-registry/config.js +3 -3
- package/esm/src/errors/error-registry/deploy.js +1 -1
- package/esm/src/errors/error-registry/server.d.ts +2 -0
- package/esm/src/errors/error-registry/server.d.ts.map +1 -1
- package/esm/src/errors/error-registry/server.js +8 -0
- package/esm/src/errors/error-registry-helpers.d.ts +11 -2
- package/esm/src/errors/error-registry-helpers.d.ts.map +1 -1
- package/esm/src/errors/error-registry-helpers.js +70 -1
- package/esm/src/errors/error-registry.d.ts +85 -73
- package/esm/src/errors/error-registry.d.ts.map +1 -1
- package/esm/src/errors/error-registry.js +2 -14
- package/esm/src/errors/types.d.ts +44 -5
- package/esm/src/errors/types.d.ts.map +1 -1
- package/esm/src/errors/types.js +148 -24
- package/esm/src/errors/veryfront-error.d.ts +25 -2
- package/esm/src/errors/veryfront-error.d.ts.map +1 -1
- package/esm/src/errors/veryfront-error.js +638 -28
- package/esm/src/observability/limits.d.ts +20 -0
- package/esm/src/observability/limits.d.ts.map +1 -0
- package/esm/src/observability/limits.js +19 -0
- package/esm/src/observability/telemetry-error.d.ts +22 -0
- package/esm/src/observability/telemetry-error.d.ts.map +1 -0
- package/esm/src/observability/telemetry-error.js +377 -0
- package/esm/src/observability/tracing/api-shim.d.ts +39 -0
- package/esm/src/observability/tracing/api-shim.d.ts.map +1 -1
- package/esm/src/observability/tracing/api-shim.js +196 -69
- package/esm/src/observability/tracing/context-callback.d.ts +14 -0
- package/esm/src/observability/tracing/context-callback.d.ts.map +1 -0
- package/esm/src/observability/tracing/context-callback.js +111 -0
- package/esm/src/observability/tracing/otlp-setup.d.ts.map +1 -1
- package/esm/src/observability/tracing/otlp-setup.js +190 -46
- package/esm/src/platform/adapters/base.d.ts +51 -7
- package/esm/src/platform/adapters/base.d.ts.map +1 -1
- package/esm/src/platform/adapters/base.js +4 -2
- package/esm/src/platform/adapters/bounded-file-read.d.ts +9 -0
- package/esm/src/platform/adapters/bounded-file-read.d.ts.map +1 -1
- package/esm/src/platform/adapters/bounded-file-read.js +11 -5
- package/esm/src/platform/adapters/file-snapshot-error.d.ts +2 -0
- package/esm/src/platform/adapters/file-snapshot-error.d.ts.map +1 -1
- package/esm/src/platform/adapters/file-snapshot-error.js +2 -0
- package/esm/src/platform/adapters/file-system-capabilities.d.ts +74 -0
- package/esm/src/platform/adapters/file-system-capabilities.d.ts.map +1 -0
- package/esm/src/platform/adapters/file-system-capabilities.js +508 -0
- package/esm/src/platform/adapters/native-file-system-provenance.d.ts +6 -0
- package/esm/src/platform/adapters/native-file-system-provenance.d.ts.map +1 -0
- package/esm/src/platform/adapters/native-file-system-provenance.js +15 -0
- package/esm/src/platform/adapters/runtime/deno/filesystem-adapter.d.ts +45 -0
- package/esm/src/platform/adapters/runtime/deno/filesystem-adapter.d.ts.map +1 -0
- package/esm/src/platform/adapters/runtime/deno/filesystem-adapter.js +291 -0
- package/esm/src/platform/adapters/runtime/shared/node-filesystem-adapter.d.ts +71 -0
- package/esm/src/platform/adapters/runtime/shared/node-filesystem-adapter.d.ts.map +1 -0
- package/esm/src/platform/adapters/runtime/shared/node-filesystem-adapter.js +471 -0
- package/esm/src/platform/adapters/runtime/shared/shared-watcher.d.ts +16 -0
- package/esm/src/platform/adapters/runtime/shared/shared-watcher.d.ts.map +1 -0
- package/esm/src/platform/adapters/runtime/shared/shared-watcher.js +140 -0
- package/esm/src/platform/adapters/runtime/shared/temp-dir.d.ts +2 -0
- package/esm/src/platform/adapters/runtime/shared/temp-dir.d.ts.map +1 -0
- package/esm/src/platform/adapters/runtime/shared/temp-dir.js +10 -0
- package/esm/src/platform/adapters/runtime/shared/watcher-queue.d.ts +5 -0
- package/esm/src/platform/adapters/runtime/shared/watcher-queue.d.ts.map +1 -0
- package/esm/src/platform/adapters/runtime/shared/watcher-queue.js +75 -0
- package/esm/src/platform/compat/abort-signal.d.ts +20 -0
- package/esm/src/platform/compat/abort-signal.d.ts.map +1 -0
- package/esm/src/platform/compat/abort-signal.js +64 -0
- package/esm/src/platform/compat/constants.d.ts +2 -2
- package/esm/src/platform/compat/constants.d.ts.map +1 -1
- package/esm/src/platform/compat/constants.js +2 -2
- package/esm/src/platform/compat/error-introspection.d.ts +37 -0
- package/esm/src/platform/compat/error-introspection.d.ts.map +1 -0
- package/esm/src/platform/compat/error-introspection.js +258 -0
- package/esm/src/platform/compat/fs.d.ts +29 -8
- package/esm/src/platform/compat/fs.d.ts.map +1 -1
- package/esm/src/platform/compat/fs.js +123 -57
- package/esm/src/platform/compat/native-brand-checks.d.ts +14 -0
- package/esm/src/platform/compat/native-brand-checks.d.ts.map +1 -0
- package/esm/src/platform/compat/native-brand-checks.js +68 -0
- package/esm/src/platform/compat/not-found-error.d.ts +8 -3
- package/esm/src/platform/compat/not-found-error.d.ts.map +1 -1
- package/esm/src/platform/compat/not-found-error.js +164 -31
- package/esm/src/platform/compat/path/security.d.ts.map +1 -1
- package/esm/src/platform/compat/path/security.js +3 -5
- package/esm/src/platform/compat/process/command.d.ts +24 -1
- package/esm/src/platform/compat/process/command.d.ts.map +1 -1
- package/esm/src/platform/compat/process/command.js +393 -78
- package/esm/src/platform/compat/process/env.d.ts +11 -0
- package/esm/src/platform/compat/process/env.d.ts.map +1 -1
- package/esm/src/platform/compat/process/env.js +28 -38
- package/esm/src/platform/compat/process/global-error.d.ts +19 -0
- package/esm/src/platform/compat/process/global-error.d.ts.map +1 -0
- package/esm/src/platform/compat/process/global-error.js +57 -0
- package/esm/src/platform/compat/process/lifecycle.d.ts +10 -3
- package/esm/src/platform/compat/process/lifecycle.d.ts.map +1 -1
- package/esm/src/platform/compat/process/lifecycle.js +74 -23
- package/esm/src/platform/compat/process/project-env-contract.d.ts +19 -0
- package/esm/src/platform/compat/process/project-env-contract.d.ts.map +1 -0
- package/esm/src/platform/compat/process/project-env-contract.js +19 -0
- package/esm/src/platform/compat/runtime.d.ts +14 -5
- package/esm/src/platform/compat/runtime.d.ts.map +1 -1
- package/esm/src/platform/compat/runtime.js +34 -9
- package/esm/src/platform/compat/std/front-matter-yaml.d.ts +12 -0
- package/esm/src/platform/compat/std/front-matter-yaml.d.ts.map +1 -1
- package/esm/src/platform/compat/std/front-matter-yaml.js +35 -3
- package/esm/src/platform/compat/temp-directory-prefix.d.ts +8 -0
- package/esm/src/platform/compat/temp-directory-prefix.d.ts.map +1 -0
- package/esm/src/platform/compat/temp-directory-prefix.js +15 -0
- package/esm/src/utils/abort.d.ts +10 -0
- package/esm/src/utils/abort.d.ts.map +1 -0
- package/esm/src/utils/abort.js +35 -0
- package/esm/src/utils/constants/build.d.ts +3 -0
- package/esm/src/utils/constants/build.d.ts.map +1 -1
- package/esm/src/utils/constants/build.js +5 -1
- package/esm/src/utils/constants/cache.d.ts +21 -0
- package/esm/src/utils/constants/cache.d.ts.map +1 -1
- package/esm/src/utils/constants/cache.js +101 -39
- package/esm/src/utils/constants/css.d.ts +20 -0
- package/esm/src/utils/constants/css.d.ts.map +1 -0
- package/esm/src/utils/constants/css.js +19 -0
- package/esm/src/utils/constants/limits.d.ts +4 -0
- package/esm/src/utils/constants/limits.d.ts.map +1 -1
- package/esm/src/utils/constants/limits.js +4 -0
- package/esm/src/utils/constants/project-identity.d.ts +5 -0
- package/esm/src/utils/constants/project-identity.d.ts.map +1 -0
- package/esm/src/utils/constants/project-identity.js +4 -0
- package/esm/src/utils/constants/retry.d.ts +18 -0
- package/esm/src/utils/constants/retry.d.ts.map +1 -1
- package/esm/src/utils/constants/retry.js +18 -0
- package/esm/src/utils/constants/security.d.ts +4 -0
- package/esm/src/utils/constants/security.d.ts.map +1 -1
- package/esm/src/utils/constants/security.js +4 -0
- package/esm/src/utils/index.d.ts +3 -1
- package/esm/src/utils/index.d.ts.map +1 -1
- package/esm/src/utils/index.js +3 -1
- package/esm/src/utils/logger/core.d.ts +5 -0
- package/esm/src/utils/logger/core.d.ts.map +1 -1
- package/esm/src/utils/logger/core.js +67 -2
- package/esm/src/utils/logger/redact.d.ts +36 -13
- package/esm/src/utils/logger/redact.d.ts.map +1 -1
- package/esm/src/utils/logger/redact.js +573 -83
- package/esm/src/utils/parallel.d.ts.map +1 -1
- package/esm/src/utils/parallel.js +11 -1
- package/esm/src/utils/project-identity.d.ts +11 -0
- package/esm/src/utils/project-identity.d.ts.map +1 -0
- package/esm/src/utils/project-identity.js +69 -0
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +3 -3
- package/esm/src/platform/adapters/runtime/shared/native-file-capabilities.d.ts +0 -33
- package/esm/src/platform/adapters/runtime/shared/native-file-capabilities.d.ts.map +0 -1
- package/esm/src/platform/adapters/runtime/shared/native-file-capabilities.js +0 -205
|
@@ -36,6 +36,71 @@ export const LEVEL_COLORS = {
|
|
|
36
36
|
// ============================================================================
|
|
37
37
|
// Pure Formatting Functions (no dependencies)
|
|
38
38
|
// ============================================================================
|
|
39
|
+
function consumeControlSequence(value, start, kind) {
|
|
40
|
+
if (kind === "csi") {
|
|
41
|
+
for (let index = start; index < value.length; index++) {
|
|
42
|
+
const code = value.charCodeAt(index);
|
|
43
|
+
if (code >= 0x40 && code <= 0x7e)
|
|
44
|
+
return index + 1;
|
|
45
|
+
}
|
|
46
|
+
return value.length;
|
|
47
|
+
}
|
|
48
|
+
for (let index = start; index < value.length; index++) {
|
|
49
|
+
const code = value.charCodeAt(index);
|
|
50
|
+
if (code === 0x07 || code === 0x9c)
|
|
51
|
+
return index + 1;
|
|
52
|
+
if (code === 0x1b && value.charCodeAt(index + 1) === 0x5c)
|
|
53
|
+
return index + 2;
|
|
54
|
+
}
|
|
55
|
+
return value.length;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Neutralize terminal control sequences and line-breaking control characters
|
|
59
|
+
* in untrusted log text before framework-owned ANSI styling is applied.
|
|
60
|
+
*/
|
|
61
|
+
export function sanitizeLogText(value) {
|
|
62
|
+
let sanitized = "";
|
|
63
|
+
for (let index = 0; index < value.length;) {
|
|
64
|
+
const code = value.charCodeAt(index);
|
|
65
|
+
if (code === 0x1b) {
|
|
66
|
+
const next = value.charCodeAt(index + 1);
|
|
67
|
+
if (next === 0x5b) {
|
|
68
|
+
index = consumeControlSequence(value, index + 2, "csi");
|
|
69
|
+
}
|
|
70
|
+
else if (next === 0x5d) {
|
|
71
|
+
index = consumeControlSequence(value, index + 2, "osc");
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
index += Number.isNaN(next) ? 1 : 2;
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (code === 0x9b) {
|
|
79
|
+
index = consumeControlSequence(value, index + 1, "csi");
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (code === 0x9d) {
|
|
83
|
+
index = consumeControlSequence(value, index + 1, "osc");
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if ((code >= 0x09 && code <= 0x0d) ||
|
|
87
|
+
code === 0x85 ||
|
|
88
|
+
code === 0x2028 ||
|
|
89
|
+
code === 0x2029) {
|
|
90
|
+
if (!sanitized.endsWith(" "))
|
|
91
|
+
sanitized += " ";
|
|
92
|
+
index++;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) {
|
|
96
|
+
index++;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
sanitized += value[index];
|
|
100
|
+
index++;
|
|
101
|
+
}
|
|
102
|
+
return sanitized;
|
|
103
|
+
}
|
|
39
104
|
/**
|
|
40
105
|
* Pad or truncate a tag to fixed width for aligned output.
|
|
41
106
|
*/
|
|
@@ -63,7 +128,7 @@ export function colorize(text, color, enable) {
|
|
|
63
128
|
* Normalize whitespace in text (collapse multiple spaces to single space).
|
|
64
129
|
*/
|
|
65
130
|
export function normalizeText(value) {
|
|
66
|
-
return value.replace(/\s+/g, " ");
|
|
131
|
+
return sanitizeLogText(value).replace(/\s+/g, " ");
|
|
67
132
|
}
|
|
68
133
|
/**
|
|
69
134
|
* Truncate text to maxLength, adding ellipsis if truncated.
|
|
@@ -127,7 +192,7 @@ export function serializeError(error) {
|
|
|
127
192
|
export function formatContextText(context, error, enableColor) {
|
|
128
193
|
const entries = Object.entries(context)
|
|
129
194
|
.filter(([_, value]) => value !== undefined)
|
|
130
|
-
.map(([key, value]) => `${key}=${formatValue(value)}`);
|
|
195
|
+
.map(([key, value]) => `${normalizeText(key)}=${formatValue(value)}`);
|
|
131
196
|
if (error)
|
|
132
197
|
entries.push(`err=${formatErrorText(error)}`);
|
|
133
198
|
if (entries.length === 0)
|
|
@@ -9,15 +9,24 @@
|
|
|
9
9
|
* credential before serialization, so an accidental
|
|
10
10
|
* `logger.info("...", { authorization: token })` cannot leak the secret.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
* in
|
|
14
|
-
* over-redaction — masking a benign `tokenCount` is
|
|
15
|
-
* token is not. The traversal fails *closed*: on a
|
|
16
|
-
* throwing getter it returns {@link REDACTED}
|
|
17
|
-
* unredacted object.
|
|
12
|
+
* Sensitive keys are masked and every string value is scrubbed for credentials
|
|
13
|
+
* embedded in URL userinfo, query parameters, or fragment parameters. The
|
|
14
|
+
* deny-list errs toward over-redaction — masking a benign `tokenCount` is
|
|
15
|
+
* acceptable; leaking a real token is not. The traversal fails *closed*: on a
|
|
16
|
+
* cycle, depth overflow, or a throwing getter it returns {@link REDACTED}
|
|
17
|
+
* rather than risk emitting an unredacted object.
|
|
18
18
|
*/
|
|
19
19
|
/** Replacement value substituted for any sensitive field. */
|
|
20
20
|
export declare const REDACTED = "[REDACTED]";
|
|
21
|
+
/**
|
|
22
|
+
* Replace every non-overlapping occurrence of a trusted path in untrusted text.
|
|
23
|
+
*
|
|
24
|
+
* Comparison treats slash and backslash as equivalent. Windows drive and UNC
|
|
25
|
+
* paths additionally use ASCII-only case folding, matching Windows path
|
|
26
|
+
* identity without locale-sensitive conversion. The linear-time matcher keeps
|
|
27
|
+
* the path literal: regex syntax in either input cannot change what matches.
|
|
28
|
+
*/
|
|
29
|
+
export declare function redactPathFromText(input: string, path: string, replacement: string): string;
|
|
21
30
|
/**
|
|
22
31
|
* Whether a context key names a credential and should have its value masked.
|
|
23
32
|
*
|
|
@@ -27,14 +36,27 @@ export declare const REDACTED = "[REDACTED]";
|
|
|
27
36
|
* normalizes to `author`, which contains none of the patterns.
|
|
28
37
|
*/
|
|
29
38
|
export declare function isSensitiveKey(key: string): boolean;
|
|
39
|
+
export type RedactedValue = string | number | boolean | null | RedactedValue[] | {
|
|
40
|
+
[key: string]: RedactedValue;
|
|
41
|
+
};
|
|
30
42
|
/**
|
|
31
|
-
* Returns a redacted
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
43
|
+
* Returns a redacted copy of `context` while preserving the established source
|
|
44
|
+
* and runtime value shapes. Any property whose key is {@link isSensitiveKey}
|
|
45
|
+
* is replaced with {@link REDACTED}; nested records and arrays are traversed,
|
|
46
|
+
* while primitives and scalar-serializing objects retain their original types.
|
|
47
|
+
* The input is never mutated.
|
|
48
|
+
*
|
|
49
|
+
* Use {@link redactForSerialization} at JSON/logging boundaries where BigInt,
|
|
50
|
+
* functions, symbols, and custom `toJSON` implementations must be normalized.
|
|
36
51
|
*/
|
|
37
52
|
export declare function redactSensitive<T>(context: T): T;
|
|
53
|
+
/**
|
|
54
|
+
* Returns a JSON-safe redacted snapshot of `context`. Sensitive keys are
|
|
55
|
+
* masked, nested values are traversed, BigInts become decimal strings,
|
|
56
|
+
* non-finite numbers become `null`, and unsupported or unreadable values fail
|
|
57
|
+
* closed. Objects with `toJSON` are snapshotted exactly once before redaction.
|
|
58
|
+
*/
|
|
59
|
+
export declare function redactForSerialization(context: unknown): RedactedValue;
|
|
38
60
|
/**
|
|
39
61
|
* Strip credentials from URL-shaped strings so they can be safely emitted in
|
|
40
62
|
* free-form text (error messages, stacks, lifted `request_url` fields). Unlike
|
|
@@ -47,7 +69,7 @@ export declare function redactSensitive<T>(context: T): T;
|
|
|
47
69
|
* It is intentionally tolerant: it operates on any string (a DSN, a Mongo URI,
|
|
48
70
|
* an axios error message containing a URL) via regex rather than requiring a
|
|
49
71
|
* parseable URL, so malformed or partial URLs in error text are still scrubbed.
|
|
50
|
-
*
|
|
72
|
+
* Strings without credential-shaped content pass through unchanged.
|
|
51
73
|
*/
|
|
52
74
|
export declare function sanitizeUrlCredentials(input: string): string;
|
|
53
75
|
/**
|
|
@@ -61,13 +83,14 @@ export declare function sanitizeUrlCredentials(input: string): string;
|
|
|
61
83
|
*/
|
|
62
84
|
export declare function sanitizeUrlForSpan(input: string): string;
|
|
63
85
|
/**
|
|
64
|
-
* Apply {@link sanitizeUrlCredentials} to the `message
|
|
86
|
+
* Apply {@link sanitizeUrlCredentials} to the `name`, `message`, and `stack` of a
|
|
65
87
|
* serialized-error-shaped object, returning a new object. Used by the logger's
|
|
66
88
|
* JSON and text paths so errors carrying DSNs, Mongo URIs, or
|
|
67
89
|
* `?access_token=`-bearing URLs do not leak credentials (the serialized error
|
|
68
90
|
* bypasses the key-based redactor). Returns the input unchanged when falsy.
|
|
69
91
|
*/
|
|
70
92
|
export declare function sanitizeSerializedError<T extends {
|
|
93
|
+
name?: unknown;
|
|
71
94
|
message?: unknown;
|
|
72
95
|
stack?: unknown;
|
|
73
96
|
} | undefined>(error: T): T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../../src/src/utils/logger/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../../src/src/utils/logger/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,eAAe,CAAC;AAmErC;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,MAAM,CAiDR;AAoDD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAmBnD;AAED,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,aAAa,EAAE,GACf;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,CAAC;AAsKrC;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAKhD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAKtE;AAiSD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA8F5D;AAqBD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA2BxD;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,EAC5E,KAAK,EAAE,CAAC,GAAG,CAAC,CAOb"}
|