@ktuban/safe-json-loader 1.1.2 → 1.1.3
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/README.md +217 -181
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.js +1 -2
- package/dist/cjs/safeJsonError.d.ts +6 -0
- package/dist/cjs/safeJsonError.js +16 -0
- package/dist/cjs/safeJsonLoader.d.ts +55 -0
- package/dist/cjs/safeJsonLoader.js +50 -15
- package/dist/cjs/types.d.ts +113 -0
- package/dist/cjs/types.js +0 -1
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +1 -2
- package/dist/esm/safeJsonError.d.ts +6 -0
- package/dist/esm/safeJsonError.js +12 -0
- package/dist/esm/safeJsonLoader.d.ts +55 -0
- package/dist/esm/safeJsonLoader.js +40 -7
- package/dist/esm/types.d.ts +113 -0
- package/dist/esm/types.js +0 -1
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/tsconfig.types.tsbuildinfo +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/safeJsonError.d.ts +6 -0
- package/dist/types/safeJsonLoader.d.ts +6 -4
- package/dist/types/types.d.ts +8 -2
- package/package.json +17 -8
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/logger.js +0 -68
- package/dist/cjs/logger.js.map +0 -1
- package/dist/cjs/safeJsonLoader.js.map +0 -1
- package/dist/cjs/types.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/logger.js +0 -64
- package/dist/esm/logger.js.map +0 -1
- package/dist/esm/safeJsonLoader.js.map +0 -1
- package/dist/esm/types.js.map +0 -1
- package/dist/types/logger.d.ts +0 -16
|
@@ -5,6 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
};
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.JsonLoaderError = void 0;
|
|
8
|
+
exports.mergeOptions = mergeOptions;
|
|
9
|
+
exports.log = log;
|
|
8
10
|
exports.sanitizePrototypePollution = sanitizePrototypePollution;
|
|
9
11
|
exports.loadSafeJsonResources = loadSafeJsonResources;
|
|
10
12
|
exports.parseSafeJsonString = parseSafeJsonString;
|
|
@@ -12,16 +14,50 @@ exports.sanitizeParsedJsonObject = sanitizeParsedJsonObject;
|
|
|
12
14
|
const promises_1 = __importDefault(require("fs/promises"));
|
|
13
15
|
const path_1 = __importDefault(require("path"));
|
|
14
16
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
15
|
-
|
|
17
|
+
// Inline minimal defaults and helpers so this package does not require an
|
|
18
|
+
// external structured logger. Callers may pass an optional `logger` in
|
|
19
|
+
// `SafeJsonLoaderOptions`; otherwise we fall back to the console.
|
|
20
|
+
const CONSOLE_LOGGER = {
|
|
21
|
+
debug: (m, meta) => console.debug(m, meta),
|
|
22
|
+
info: (m, meta) => console.info(m, meta),
|
|
23
|
+
warn: (m, meta) => console.warn(m, meta),
|
|
24
|
+
error: (m, meta) => console.error(m, meta),
|
|
25
|
+
};
|
|
26
|
+
const DEFAULT_OPTIONS = {
|
|
27
|
+
maxFiles: 100,
|
|
28
|
+
maxTotalBytes: 10 * 1024 * 1024, // 10 MB
|
|
29
|
+
maxFileBytes: 2 * 1024 * 1024, // 2 MB
|
|
30
|
+
httpTimeoutMs: 8000,
|
|
31
|
+
maxConcurrency: 5,
|
|
32
|
+
looseJsonContentType: true,
|
|
33
|
+
maxJsonDepth: 50,
|
|
34
|
+
logger: CONSOLE_LOGGER,
|
|
35
|
+
onFileLoaded: () => { },
|
|
36
|
+
onFileSkipped: () => { },
|
|
37
|
+
};
|
|
38
|
+
function mergeOptions(opts) {
|
|
39
|
+
const logger = opts?.logger ?? DEFAULT_OPTIONS.logger;
|
|
40
|
+
return {
|
|
41
|
+
...DEFAULT_OPTIONS,
|
|
42
|
+
...(opts ?? {}),
|
|
43
|
+
logger,
|
|
44
|
+
onFileLoaded: opts?.onFileLoaded ?? DEFAULT_OPTIONS.onFileLoaded,
|
|
45
|
+
onFileSkipped: opts?.onFileSkipped ?? DEFAULT_OPTIONS.onFileSkipped,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function log(options, level, message, meta) {
|
|
49
|
+
const fn = options.logger[level];
|
|
50
|
+
if (fn)
|
|
51
|
+
fn(message, meta);
|
|
52
|
+
}
|
|
53
|
+
const safeJsonError_js_1 = require("./safeJsonError.js");
|
|
16
54
|
/* -------------------------------------------------------------------------- */
|
|
17
55
|
/* ERROR TYPE */
|
|
18
56
|
/* -------------------------------------------------------------------------- */
|
|
19
|
-
class JsonLoaderError extends
|
|
20
|
-
code
|
|
21
|
-
|
|
22
|
-
super(message);
|
|
57
|
+
class JsonLoaderError extends safeJsonError_js_1.SafeJsonError {
|
|
58
|
+
constructor(message, code, statusCode) {
|
|
59
|
+
super(message, code, statusCode);
|
|
23
60
|
this.name = "JsonLoaderError";
|
|
24
|
-
this.code = code;
|
|
25
61
|
}
|
|
26
62
|
}
|
|
27
63
|
exports.JsonLoaderError = JsonLoaderError;
|
|
@@ -195,7 +231,7 @@ async function loadRemoteIndex(indexUrl, indexJson, opts, limitRun) {
|
|
|
195
231
|
if (urls.length > opts.maxFiles) {
|
|
196
232
|
throw new JsonLoaderError(`Remote directory index at ${indexUrl} lists ${urls.length} files, exceeding maxFiles=${opts.maxFiles}.`, "REMOTE_INDEX_LIMIT_ERROR");
|
|
197
233
|
}
|
|
198
|
-
|
|
234
|
+
log(opts, "debug", "Loading remote index", {
|
|
199
235
|
indexUrl,
|
|
200
236
|
fileCount: urls.length,
|
|
201
237
|
});
|
|
@@ -210,7 +246,7 @@ async function loadRemoteIndex(indexUrl, indexJson, opts, limitRun) {
|
|
|
210
246
|
__source: fileUrl,
|
|
211
247
|
});
|
|
212
248
|
opts.onFileLoaded(file);
|
|
213
|
-
|
|
249
|
+
log(opts, "info", "Remote JSON file loaded", { url: fileUrl });
|
|
214
250
|
return file;
|
|
215
251
|
}));
|
|
216
252
|
return Promise.all(tasks);
|
|
@@ -225,7 +261,7 @@ async function loadLocalJsonFile(filePath, opts) {
|
|
|
225
261
|
source: filePath,
|
|
226
262
|
reason: `File exceeds maxFileBytes=${opts.maxFileBytes}`,
|
|
227
263
|
});
|
|
228
|
-
|
|
264
|
+
log(opts, "warn", "Skipping local file due to size limit", {
|
|
229
265
|
filePath,
|
|
230
266
|
size: stats.size,
|
|
231
267
|
maxFileBytes: opts.maxFileBytes,
|
|
@@ -249,14 +285,14 @@ async function loadLocalJsonFile(filePath, opts) {
|
|
|
249
285
|
__source: filePath,
|
|
250
286
|
});
|
|
251
287
|
opts.onFileLoaded(file);
|
|
252
|
-
|
|
288
|
+
log(opts, "info", "Local JSON file loaded", { filePath });
|
|
253
289
|
return file;
|
|
254
290
|
}
|
|
255
291
|
async function loadLocalDirectory(dirPath, opts, limitRun) {
|
|
256
292
|
const files = await promises_1.default.readdir(dirPath);
|
|
257
293
|
const jsonFiles = files.filter(isJsonFile);
|
|
258
294
|
if (jsonFiles.length === 0) {
|
|
259
|
-
|
|
295
|
+
log(opts, "debug", "No JSON files found in directory", { dirPath });
|
|
260
296
|
return [];
|
|
261
297
|
}
|
|
262
298
|
if (jsonFiles.length > opts.maxFiles) {
|
|
@@ -274,7 +310,7 @@ async function loadLocalDirectory(dirPath, opts, limitRun) {
|
|
|
274
310
|
}
|
|
275
311
|
filePaths.push(full);
|
|
276
312
|
}
|
|
277
|
-
|
|
313
|
+
log(opts, "debug", "Loading local directory", {
|
|
278
314
|
dirPath,
|
|
279
315
|
fileCount: filePaths.length,
|
|
280
316
|
totalSize,
|
|
@@ -307,7 +343,7 @@ async function loadSafeJsonResources(input, options) {
|
|
|
307
343
|
if (!inputStr) {
|
|
308
344
|
throw new JsonLoaderError("Input path/URL must be a non-empty string.", "INPUT_VALIDATION_ERROR");
|
|
309
345
|
}
|
|
310
|
-
const opts =
|
|
346
|
+
const opts = mergeOptions(options);
|
|
311
347
|
const limitRun = createLimiter(opts.maxConcurrency);
|
|
312
348
|
/* ---------------------------------- REMOTE --------------------------------- */
|
|
313
349
|
if (isHttpUrl(inputStr)) {
|
|
@@ -324,7 +360,7 @@ async function loadSafeJsonResources(input, options) {
|
|
|
324
360
|
__source: inputStr,
|
|
325
361
|
});
|
|
326
362
|
opts.onFileLoaded(file);
|
|
327
|
-
|
|
363
|
+
log(opts, "info", "Remote JSON file loaded", { url: inputStr });
|
|
328
364
|
return [file];
|
|
329
365
|
}
|
|
330
366
|
/* ----------------------------------- LOCAL ---------------------------------- */
|
|
@@ -387,4 +423,3 @@ function sanitizeParsedJsonObject(input, opts) {
|
|
|
387
423
|
});
|
|
388
424
|
return sanitized;
|
|
389
425
|
}
|
|
390
|
-
//# sourceMappingURL=safeJsonLoader.js.map
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { PathLike } from "fs";
|
|
2
|
+
import type { URL } from "url";
|
|
3
|
+
/** Minimal logger contract used by this package. */
|
|
4
|
+
export interface LoggerContract {
|
|
5
|
+
debug: (message: string, meta?: unknown) => void;
|
|
6
|
+
info: (message: string, meta?: unknown) => void;
|
|
7
|
+
warn: (message: string, meta?: unknown) => void;
|
|
8
|
+
error: (message: string, meta?: unknown) => void;
|
|
9
|
+
}
|
|
10
|
+
/** JSON primitive types. */
|
|
11
|
+
export type JsonPrimitive = string | number | boolean | null;
|
|
12
|
+
/** JSON object type. */
|
|
13
|
+
export interface JsonObject {
|
|
14
|
+
[key: string]: JsonValue;
|
|
15
|
+
}
|
|
16
|
+
/** JSON array type. */
|
|
17
|
+
export interface JsonArray extends Array<JsonValue> {
|
|
18
|
+
}
|
|
19
|
+
/** Any valid JSON value. */
|
|
20
|
+
export type JsonValue = JsonPrimitive | JsonObject | JsonArray;
|
|
21
|
+
/**
|
|
22
|
+
* A single loaded JSON file, with metadata.
|
|
23
|
+
*/
|
|
24
|
+
export interface LoadedJsonFile {
|
|
25
|
+
/** Logical name (basename of path or URL). */
|
|
26
|
+
name: string;
|
|
27
|
+
/** Parsed and security‑sanitized JSON data. */
|
|
28
|
+
data: JsonValue;
|
|
29
|
+
/** Original source (absolute path or URL). */
|
|
30
|
+
__source: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Options for safe JSON loading.
|
|
34
|
+
*/
|
|
35
|
+
export interface SafeJsonLoaderOptions {
|
|
36
|
+
/**
|
|
37
|
+
* Maximum number of JSON files to load per call
|
|
38
|
+
* (applies to local directories and remote indexes).
|
|
39
|
+
* Default: 100
|
|
40
|
+
*/
|
|
41
|
+
maxFiles?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Maximum total bytes for all local JSON files combined.
|
|
44
|
+
* Default: 10 MB
|
|
45
|
+
*/
|
|
46
|
+
maxTotalBytes?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Maximum bytes per local JSON file.
|
|
49
|
+
* Default: 2 MB
|
|
50
|
+
*/
|
|
51
|
+
maxFileBytes?: number;
|
|
52
|
+
/**
|
|
53
|
+
* HTTP timeout per remote request in milliseconds.
|
|
54
|
+
* Default: 8000
|
|
55
|
+
*/
|
|
56
|
+
httpTimeoutMs?: number;
|
|
57
|
+
/**
|
|
58
|
+
* Maximum number of concurrent I/O operations (local reads + remote fetches).
|
|
59
|
+
* Default: 5
|
|
60
|
+
*/
|
|
61
|
+
maxConcurrency?: number;
|
|
62
|
+
/**
|
|
63
|
+
* If true, accept any content‑type containing "json".
|
|
64
|
+
* If false, require "application/json".
|
|
65
|
+
* Default: true
|
|
66
|
+
*/
|
|
67
|
+
looseJsonContentType?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Maximum allowed depth of parsed JSON structures.
|
|
70
|
+
* Helps mitigate very deep payloads used for DoS.
|
|
71
|
+
* Default: 50
|
|
72
|
+
*/
|
|
73
|
+
maxJsonDepth?: number;
|
|
74
|
+
/**
|
|
75
|
+
* Optional logger implementation.
|
|
76
|
+
* If omitted, the loader falls back to a console-based logger.
|
|
77
|
+
*/
|
|
78
|
+
logger?: LoggerContract;
|
|
79
|
+
/**
|
|
80
|
+
* Optional hook invoked after each file is successfully loaded and sanitized.
|
|
81
|
+
*/
|
|
82
|
+
onFileLoaded?: (file: LoadedJsonFile) => void;
|
|
83
|
+
/**
|
|
84
|
+
* Optional hook invoked when a file is skipped due to limits.
|
|
85
|
+
*/
|
|
86
|
+
onFileSkipped?: (info: {
|
|
87
|
+
source: string;
|
|
88
|
+
reason: string;
|
|
89
|
+
}) => void;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Internal fully‑resolved options shape (after merging defaults).
|
|
93
|
+
*/
|
|
94
|
+
export interface ResolvedSafeJsonLoaderOptions extends SafeJsonLoaderOptions {
|
|
95
|
+
maxFiles: number;
|
|
96
|
+
maxTotalBytes: number;
|
|
97
|
+
maxFileBytes: number;
|
|
98
|
+
httpTimeoutMs: number;
|
|
99
|
+
maxConcurrency: number;
|
|
100
|
+
looseJsonContentType: boolean;
|
|
101
|
+
maxJsonDepth: number;
|
|
102
|
+
logger: LoggerContract;
|
|
103
|
+
onFileLoaded: (file: LoadedJsonFile) => void;
|
|
104
|
+
onFileSkipped: (info: {
|
|
105
|
+
source: string;
|
|
106
|
+
reason: string;
|
|
107
|
+
}) => void;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Input accepted by the loader: either a path‑like or a URL string.
|
|
111
|
+
* We keep it simple: callers pass a string; we decide if it’s local or remote.
|
|
112
|
+
*/
|
|
113
|
+
export type JsonLoadInput = string | PathLike | URL;
|
package/dist/cjs/types.js
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export class SafeJsonError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
statusCode;
|
|
4
|
+
isOperational;
|
|
5
|
+
constructor(message, code = "SAFE_JSON_ERROR", statusCode = 400) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.statusCode = statusCode;
|
|
9
|
+
this.isOperational = true;
|
|
10
|
+
Error.captureStackTrace(this, this.constructor);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { JsonValue, LoadedJsonFile, ResolvedSafeJsonLoaderOptions, SafeJsonLoaderOptions, JsonLoadInput, LoggerContract } from "./types.js";
|
|
2
|
+
export declare function mergeOptions(opts?: SafeJsonLoaderOptions): ResolvedSafeJsonLoaderOptions;
|
|
3
|
+
export declare function log(options: ResolvedSafeJsonLoaderOptions, level: keyof LoggerContract, message: string, meta?: unknown): void;
|
|
4
|
+
import { SafeJsonError } from "./safeJsonError.js";
|
|
5
|
+
export declare class JsonLoaderError extends SafeJsonError {
|
|
6
|
+
constructor(message: string, code: string, statusCode?: number);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Deeply clones and strips dangerous keys to mitigate prototype pollution.
|
|
10
|
+
* Uses Object.create(null) to avoid inheriting from Object.prototype.
|
|
11
|
+
*/
|
|
12
|
+
export declare function sanitizePrototypePollution<T extends JsonValue>(input: T, options?: {
|
|
13
|
+
maxDepth?: number;
|
|
14
|
+
}): T;
|
|
15
|
+
/**
|
|
16
|
+
* Load one or more JSON resources from:
|
|
17
|
+
* - Local file (.json)
|
|
18
|
+
* - Local directory (all .json files)
|
|
19
|
+
* - Remote URL returning JSON (object/array)
|
|
20
|
+
* - Remote URL acting as an index of JSON URLs (array or { files: [] })
|
|
21
|
+
*
|
|
22
|
+
* Security features:
|
|
23
|
+
* - Prototype‑pollution‑safe deep clone (strips __proto__, constructor, prototype)
|
|
24
|
+
* - Max depth for parsed JSON structures
|
|
25
|
+
* - Max file size and total directory size
|
|
26
|
+
* - Concurrency limit for I/O (local and remote)
|
|
27
|
+
* - HTTP timeout and content‑type checks
|
|
28
|
+
*
|
|
29
|
+
* This function does not enforce any domain/schema validation — callers
|
|
30
|
+
* should layer their own validation on top of the loaded `data`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadSafeJsonResources(input: JsonLoadInput, options?: SafeJsonLoaderOptions): Promise<LoadedJsonFile[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Safely parse and sanitize a JSON string.
|
|
35
|
+
*
|
|
36
|
+
* - Parses JSON with error handling
|
|
37
|
+
* - Strips prototype pollution keys (__proto__, constructor, prototype)
|
|
38
|
+
* - Enforces max depth
|
|
39
|
+
*
|
|
40
|
+
* @param input Raw JSON string
|
|
41
|
+
* @param opts Loader options (maxJsonDepth, etc.)
|
|
42
|
+
* @returns Safe, sanitized JSON object
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseSafeJsonString(input: string, opts?: Pick<SafeJsonLoaderOptions, "maxJsonDepth">): JsonValue;
|
|
45
|
+
/**
|
|
46
|
+
* Sanitize an already-parsed JSON object.
|
|
47
|
+
*
|
|
48
|
+
* - Strips prototype pollution keys (__proto__, constructor, prototype)
|
|
49
|
+
* - Enforces max depth
|
|
50
|
+
*
|
|
51
|
+
* @param input Parsed JSON object (e.g. req.body in Express)
|
|
52
|
+
* @param opts Loader options (maxJsonDepth, etc.)
|
|
53
|
+
* @returns Safe, sanitized JSON object
|
|
54
|
+
*/
|
|
55
|
+
export declare function sanitizeParsedJsonObject(input: JsonValue, opts?: Pick<SafeJsonLoaderOptions, "maxJsonDepth">): JsonValue;
|
|
@@ -2,16 +2,50 @@
|
|
|
2
2
|
import fs from "fs/promises";
|
|
3
3
|
import path from "path";
|
|
4
4
|
import fetch from "node-fetch";
|
|
5
|
-
|
|
5
|
+
// Inline minimal defaults and helpers so this package does not require an
|
|
6
|
+
// external structured logger. Callers may pass an optional `logger` in
|
|
7
|
+
// `SafeJsonLoaderOptions`; otherwise we fall back to the console.
|
|
8
|
+
const CONSOLE_LOGGER = {
|
|
9
|
+
debug: (m, meta) => console.debug(m, meta),
|
|
10
|
+
info: (m, meta) => console.info(m, meta),
|
|
11
|
+
warn: (m, meta) => console.warn(m, meta),
|
|
12
|
+
error: (m, meta) => console.error(m, meta),
|
|
13
|
+
};
|
|
14
|
+
const DEFAULT_OPTIONS = {
|
|
15
|
+
maxFiles: 100,
|
|
16
|
+
maxTotalBytes: 10 * 1024 * 1024, // 10 MB
|
|
17
|
+
maxFileBytes: 2 * 1024 * 1024, // 2 MB
|
|
18
|
+
httpTimeoutMs: 8000,
|
|
19
|
+
maxConcurrency: 5,
|
|
20
|
+
looseJsonContentType: true,
|
|
21
|
+
maxJsonDepth: 50,
|
|
22
|
+
logger: CONSOLE_LOGGER,
|
|
23
|
+
onFileLoaded: () => { },
|
|
24
|
+
onFileSkipped: () => { },
|
|
25
|
+
};
|
|
26
|
+
export function mergeOptions(opts) {
|
|
27
|
+
const logger = opts?.logger ?? DEFAULT_OPTIONS.logger;
|
|
28
|
+
return {
|
|
29
|
+
...DEFAULT_OPTIONS,
|
|
30
|
+
...(opts ?? {}),
|
|
31
|
+
logger,
|
|
32
|
+
onFileLoaded: opts?.onFileLoaded ?? DEFAULT_OPTIONS.onFileLoaded,
|
|
33
|
+
onFileSkipped: opts?.onFileSkipped ?? DEFAULT_OPTIONS.onFileSkipped,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function log(options, level, message, meta) {
|
|
37
|
+
const fn = options.logger[level];
|
|
38
|
+
if (fn)
|
|
39
|
+
fn(message, meta);
|
|
40
|
+
}
|
|
41
|
+
import { SafeJsonError } from "./safeJsonError.js";
|
|
6
42
|
/* -------------------------------------------------------------------------- */
|
|
7
43
|
/* ERROR TYPE */
|
|
8
44
|
/* -------------------------------------------------------------------------- */
|
|
9
|
-
export class JsonLoaderError extends
|
|
10
|
-
code
|
|
11
|
-
|
|
12
|
-
super(message);
|
|
45
|
+
export class JsonLoaderError extends SafeJsonError {
|
|
46
|
+
constructor(message, code, statusCode) {
|
|
47
|
+
super(message, code, statusCode);
|
|
13
48
|
this.name = "JsonLoaderError";
|
|
14
|
-
this.code = code;
|
|
15
49
|
}
|
|
16
50
|
}
|
|
17
51
|
/* -------------------------------------------------------------------------- */
|
|
@@ -376,4 +410,3 @@ export function sanitizeParsedJsonObject(input, opts) {
|
|
|
376
410
|
});
|
|
377
411
|
return sanitized;
|
|
378
412
|
}
|
|
379
|
-
//# sourceMappingURL=safeJsonLoader.js.map
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { PathLike } from "fs";
|
|
2
|
+
import type { URL } from "url";
|
|
3
|
+
/** Minimal logger contract used by this package. */
|
|
4
|
+
export interface LoggerContract {
|
|
5
|
+
debug: (message: string, meta?: unknown) => void;
|
|
6
|
+
info: (message: string, meta?: unknown) => void;
|
|
7
|
+
warn: (message: string, meta?: unknown) => void;
|
|
8
|
+
error: (message: string, meta?: unknown) => void;
|
|
9
|
+
}
|
|
10
|
+
/** JSON primitive types. */
|
|
11
|
+
export type JsonPrimitive = string | number | boolean | null;
|
|
12
|
+
/** JSON object type. */
|
|
13
|
+
export interface JsonObject {
|
|
14
|
+
[key: string]: JsonValue;
|
|
15
|
+
}
|
|
16
|
+
/** JSON array type. */
|
|
17
|
+
export interface JsonArray extends Array<JsonValue> {
|
|
18
|
+
}
|
|
19
|
+
/** Any valid JSON value. */
|
|
20
|
+
export type JsonValue = JsonPrimitive | JsonObject | JsonArray;
|
|
21
|
+
/**
|
|
22
|
+
* A single loaded JSON file, with metadata.
|
|
23
|
+
*/
|
|
24
|
+
export interface LoadedJsonFile {
|
|
25
|
+
/** Logical name (basename of path or URL). */
|
|
26
|
+
name: string;
|
|
27
|
+
/** Parsed and security‑sanitized JSON data. */
|
|
28
|
+
data: JsonValue;
|
|
29
|
+
/** Original source (absolute path or URL). */
|
|
30
|
+
__source: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Options for safe JSON loading.
|
|
34
|
+
*/
|
|
35
|
+
export interface SafeJsonLoaderOptions {
|
|
36
|
+
/**
|
|
37
|
+
* Maximum number of JSON files to load per call
|
|
38
|
+
* (applies to local directories and remote indexes).
|
|
39
|
+
* Default: 100
|
|
40
|
+
*/
|
|
41
|
+
maxFiles?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Maximum total bytes for all local JSON files combined.
|
|
44
|
+
* Default: 10 MB
|
|
45
|
+
*/
|
|
46
|
+
maxTotalBytes?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Maximum bytes per local JSON file.
|
|
49
|
+
* Default: 2 MB
|
|
50
|
+
*/
|
|
51
|
+
maxFileBytes?: number;
|
|
52
|
+
/**
|
|
53
|
+
* HTTP timeout per remote request in milliseconds.
|
|
54
|
+
* Default: 8000
|
|
55
|
+
*/
|
|
56
|
+
httpTimeoutMs?: number;
|
|
57
|
+
/**
|
|
58
|
+
* Maximum number of concurrent I/O operations (local reads + remote fetches).
|
|
59
|
+
* Default: 5
|
|
60
|
+
*/
|
|
61
|
+
maxConcurrency?: number;
|
|
62
|
+
/**
|
|
63
|
+
* If true, accept any content‑type containing "json".
|
|
64
|
+
* If false, require "application/json".
|
|
65
|
+
* Default: true
|
|
66
|
+
*/
|
|
67
|
+
looseJsonContentType?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Maximum allowed depth of parsed JSON structures.
|
|
70
|
+
* Helps mitigate very deep payloads used for DoS.
|
|
71
|
+
* Default: 50
|
|
72
|
+
*/
|
|
73
|
+
maxJsonDepth?: number;
|
|
74
|
+
/**
|
|
75
|
+
* Optional logger implementation.
|
|
76
|
+
* If omitted, the loader falls back to a console-based logger.
|
|
77
|
+
*/
|
|
78
|
+
logger?: LoggerContract;
|
|
79
|
+
/**
|
|
80
|
+
* Optional hook invoked after each file is successfully loaded and sanitized.
|
|
81
|
+
*/
|
|
82
|
+
onFileLoaded?: (file: LoadedJsonFile) => void;
|
|
83
|
+
/**
|
|
84
|
+
* Optional hook invoked when a file is skipped due to limits.
|
|
85
|
+
*/
|
|
86
|
+
onFileSkipped?: (info: {
|
|
87
|
+
source: string;
|
|
88
|
+
reason: string;
|
|
89
|
+
}) => void;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Internal fully‑resolved options shape (after merging defaults).
|
|
93
|
+
*/
|
|
94
|
+
export interface ResolvedSafeJsonLoaderOptions extends SafeJsonLoaderOptions {
|
|
95
|
+
maxFiles: number;
|
|
96
|
+
maxTotalBytes: number;
|
|
97
|
+
maxFileBytes: number;
|
|
98
|
+
httpTimeoutMs: number;
|
|
99
|
+
maxConcurrency: number;
|
|
100
|
+
looseJsonContentType: boolean;
|
|
101
|
+
maxJsonDepth: number;
|
|
102
|
+
logger: LoggerContract;
|
|
103
|
+
onFileLoaded: (file: LoadedJsonFile) => void;
|
|
104
|
+
onFileSkipped: (info: {
|
|
105
|
+
source: string;
|
|
106
|
+
reason: string;
|
|
107
|
+
}) => void;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Input accepted by the loader: either a path‑like or a URL string.
|
|
111
|
+
* We keep it simple: callers pass a string; we decide if it’s local or remote.
|
|
112
|
+
*/
|
|
113
|
+
export type JsonLoadInput = string | PathLike | URL;
|
package/dist/esm/types.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.es2021.d.ts","../node_modules/typescript/lib/lib.es2022.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.es2021.promise.d.ts","../node_modules/typescript/lib/lib.es2021.string.d.ts","../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../node_modules/typescript/lib/lib.es2021.intl.d.ts","../node_modules/typescript/lib/lib.es2022.array.d.ts","../node_modules/typescript/lib/lib.es2022.error.d.ts","../node_modules/typescript/lib/lib.es2022.intl.d.ts","../node_modules/typescript/lib/lib.es2022.object.d.ts","../node_modules/typescript/lib/lib.es2022.string.d.ts","../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../node_modules/typescript/lib/lib.esnext.float16.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/types.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/@types/node/web-globals/blob.d.ts","../node_modules/@types/node/web-globals/console.d.ts","../node_modules/@types/node/web-globals/crypto.d.ts","../node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/@types/node/web-globals/encoding.d.ts","../node_modules/@types/node/web-globals/events.d.ts","../node_modules/undici-types/utility.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client-stats.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/h2c-client.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-call-history.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/snapshot-agent.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/cache-interceptor.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/@types/node/web-globals/importmeta.d.ts","../node_modules/@types/node/web-globals/messaging.d.ts","../node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/@types/node/web-globals/performance.d.ts","../node_modules/@types/node/web-globals/storage.d.ts","../node_modules/@types/node/web-globals/streams.d.ts","../node_modules/@types/node/web-globals/timers.d.ts","../node_modules/@types/node/web-globals/url.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/inspector.generated.d.ts","../node_modules/@types/node/inspector/promises.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/path/posix.d.ts","../node_modules/@types/node/path/win32.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/quic.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/test/reporters.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/util/types.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/formdata-polyfill/esm.min.d.ts","../node_modules/fetch-blob/file.d.ts","../node_modules/fetch-blob/index.d.ts","../node_modules/fetch-blob/from.d.ts","../node_modules/node-fetch/@types/index.d.ts","../src/safeJsonError.ts","../src/safeJsonLoader.ts","../src/index.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/safe-json-stringify/index.d.ts"],"fileIdsList":[[63,125,133,137,140,142,143,144,156],[63,122,123,125,133,137,140,142,143,144,156],[63,124,125,133,137,140,142,143,144,156],[125,133,137,140,142,143,144,156],[63,125,133,137,140,142,143,144,156,164],[63,125,126,131,133,136,137,140,142,143,144,146,156,161,173],[63,125,126,127,133,136,137,140,142,143,144,156],[63,125,128,133,137,140,142,143,144,156,174],[63,125,129,130,133,137,140,142,143,144,147,156],[63,125,130,133,137,140,142,143,144,156,161,170],[63,125,131,133,136,137,140,142,143,144,146,156],[63,124,125,132,133,137,140,142,143,144,156],[63,125,133,134,137,140,142,143,144,156],[63,125,133,135,136,137,140,142,143,144,156],[63,124,125,133,136,137,140,142,143,144,156],[63,125,133,136,137,138,140,142,143,144,156,161,173],[63,125,133,136,137,138,140,142,143,144,156,161,164],[63,112,125,133,136,137,139,140,142,143,144,146,156,161,173],[63,125,133,136,137,139,140,142,143,144,146,156,161,170,173],[63,125,133,137,139,140,141,142,143,144,156,161,170,173],[61,62,63,64,65,66,67,68,69,70,71,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180],[63,125,133,136,137,140,142,143,144,156],[63,125,133,137,140,142,144,156],[63,125,133,137,140,142,143,144,145,156,173],[63,125,133,136,137,140,142,143,144,146,156,161],[63,125,133,137,140,142,143,144,147,156],[63,125,133,137,140,142,143,144,148,156],[63,125,133,136,137,140,142,143,144,151,156],[63,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180],[63,125,133,137,140,142,143,144,153,156],[63,125,133,137,140,142,143,144,154,156],[63,125,130,133,137,140,142,143,144,146,156,164],[63,125,133,136,137,140,142,143,144,156,157],[63,125,133,137,140,142,143,144,156,158,174,177],[63,125,133,136,137,140,142,143,144,156,161,163,164],[63,125,133,137,140,142,143,144,156,162,164],[63,125,133,137,140,142,143,144,156,164,174],[63,125,133,137,140,142,143,144,156,165],[63,122,125,133,137,140,142,143,144,156,161,167,173],[63,125,133,137,140,142,143,144,156,161,166],[63,125,133,136,137,140,142,143,144,156,168,169],[63,125,133,137,140,142,143,144,156,168,169],[63,125,130,133,137,140,142,143,144,146,156,161,170],[63,125,133,137,140,142,143,144,156,171],[63,125,133,137,140,142,143,144,146,156,172],[63,125,133,137,139,140,142,143,144,154,156,173],[63,125,133,137,140,142,143,144,156,174,175],[63,125,130,133,137,140,142,143,144,156,175],[63,125,133,137,140,142,143,144,156,161,176],[63,125,133,137,140,142,143,144,145,156,177],[63,125,133,137,140,142,143,144,156,178],[63,125,128,133,137,140,142,143,144,156],[63,125,130,133,137,140,142,143,144,156],[63,125,133,137,140,142,143,144,156,174],[63,112,125,133,137,140,142,143,144,156],[63,125,133,137,140,142,143,144,156,173],[63,125,133,137,140,142,143,144,156,179],[63,125,133,137,140,142,143,144,151,156],[63,125,133,137,140,142,143,144,156,169],[63,112,125,133,136,137,138,140,142,143,144,151,156,161,164,173,176,177,179],[63,125,133,137,140,142,143,144,156,161,180],[63,125,133,137,140,142,143,144,156,183,184],[63,125,133,137,139,140,142,143,144,156,181,182,185],[63,78,81,84,85,125,133,137,140,142,143,144,156,173],[63,81,125,133,137,140,142,143,144,156,161,173],[63,81,85,125,133,137,140,142,143,144,156,173],[63,125,133,137,140,142,143,144,156,161],[63,75,125,133,137,140,142,143,144,156],[63,79,125,133,137,140,142,143,144,156],[63,77,78,81,125,133,137,140,142,143,144,156,173],[63,125,133,137,140,142,143,144,146,156,170],[63,125,133,137,140,142,143,144,156,181],[63,75,125,133,137,140,142,143,144,156,181],[63,77,81,125,133,137,140,142,143,144,146,156,173],[63,72,73,74,76,80,125,133,136,137,140,142,143,144,156,161,173],[63,81,89,97,125,133,137,140,142,143,144,156],[63,73,79,125,133,137,140,142,143,144,156],[63,81,106,107,125,133,137,140,142,143,144,156],[63,73,76,81,125,133,137,140,142,143,144,156,164,173,181],[63,81,125,133,137,140,142,143,144,156],[63,77,81,125,133,137,140,142,143,144,156,173],[63,72,125,133,137,140,142,143,144,156],[63,75,76,77,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,107,108,109,110,111,125,133,137,140,142,143,144,156],[63,81,99,102,125,133,137,140,142,143,144,156],[63,81,89,90,91,125,133,137,140,142,143,144,156],[63,79,81,90,92,125,133,137,140,142,143,144,156],[63,80,125,133,137,140,142,143,144,156],[63,73,75,81,125,133,137,140,142,143,144,156],[63,81,85,90,92,125,133,137,140,142,143,144,156],[63,85,125,133,137,140,142,143,144,156],[63,79,81,84,125,133,137,140,142,143,144,156,173],[63,73,77,81,89,125,133,137,140,142,143,144,156],[63,81,99,125,133,137,140,142,143,144,156],[63,92,125,133,137,140,142,143,144,156],[63,75,81,106,125,133,137,140,142,143,144,156,164,179,181],[60,63,125,133,137,140,142,143,144,156,187,188],[60,63,125,133,137,138,140,142,143,144,148,156,186,187]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7364f6e52f13bd8d5c9656c3ae1f735efd0f2d6210d9954ce5ebd1c7895fbf15","signature":"9e108d5cde0db63471aae44db56e05e8cec94226cfa1d415474b152e18058b76"},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"237ba5ac2a95702a114a309e39c53a5bddff5f6333b325db9764df9b34f3502b","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"1d024184fb57c58c5c91823f9d10b4915a4867b7934e89115fd0d861a9df27c8","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f96a48183254c00d24575401f1a761b4ce4927d927407e7862a83e06ce5d6964","impliedFormat":1},{"version":"cc25940cfb27aa538e60d465f98bb5068d4d7d33131861ace43f04fe6947d68f","impliedFormat":1},{"version":"f83fb2b1338afbb3f9d733c7d6e8b135826c41b0518867df0c0ace18ae1aa270","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"757227c8b345c57d76f7f0e3bbad7a91ffca23f1b2547cbed9e10025816c9cb7","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"9451a46a89ed209e2e08329e6cac59f89356eae79a7230f916d8cc38725407c7","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"e236b5eba291f51bdf32c231673e6cab81b5410850e61f51a7a524dddadc0f95","impliedFormat":1},{"version":"f7ba0e839daa0702e3ff1a1a871c0d8ea2d586ce684dd8a72c786c36a680b1d9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"f64deb26664af64dc274637343bde8d82f930c77af05a412c7d310b77207a448","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"bce309f4d9b67c18d4eeff5bba6cf3e67b2b0aead9f03f75d6060c553974d7ba","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"c3877fef8a43cd434f9728f25a97575b0eb73d92f38b5c87c840daccc3e21d97","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"1dbd83860e7634f9c236647f45dbc5d3c4f9eba8827d87209d6e9826fdf4dbd5","impliedFormat":1},{"version":"41ef7992c555671a8fe54db302788adefa191ded810a50329b79d20a6772d14c","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"b37f83e7deea729aa9ce5593f78905afb45b7532fdff63041d374f60059e7852","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"d782e571cb7d6ec0f0645957ed843d00e3f8577e08cc2940f400c931bc47a8df","impliedFormat":99},{"version":"9167246623f181441e6116605221268d94e33a1ebd88075e2dc80133c928ae7e","impliedFormat":99},{"version":"dc1a838d8a514b6de9fbce3bd5e6feb9ccfe56311e9338bb908eb4d0d966ecaf","impliedFormat":99},{"version":"186f09ed4b1bc1d5a5af5b1d9f42e2d798f776418e82599b3de16423a349d184","impliedFormat":99},{"version":"d692ae73951775d2448df535ce8bc8abf162dc343911fedda2c37b8de3b20d8e","impliedFormat":99},{"version":"5c7e8b473ce1691e311368337a105ab7a4d9a9a217a8f27327e0f783fc41e15e","signature":"204b665c51b1eb5cbb792db5214ec6ac97d0632b03fb740917c029c6f9b687ff"},{"version":"7a88f1a7da9a6178c82530b9b845333815e24c5c31d581132393dc9ebde30a48","signature":"66351603efab5835856f1fa17a3ea7e2e7dfb0cce73c60d33e351bda66a57bff"},{"version":"c4ca5069ac6e53e3225d4731ae6bf3fb8bcdec8f3a400eaff754452a2699fec6","signature":"577ec7a90ad7996a7071b0f1ced4f01f031e75f935e7c8c55d3b4d814c4e6703"},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"8b076c7b65919fa90c2fb0f15828ef53e395a1d393a40abbc96b537f7afa8ec0","impliedFormat":1}],"root":[60,[187,189]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUncheckedIndexedAccess":true,"outDir":"./cjs","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[190,1],[191,1],[122,2],[123,2],[124,3],[63,4],[125,5],[126,6],[127,7],[61,1],[128,8],[129,9],[130,10],[131,11],[132,12],[133,13],[134,13],[135,14],[136,15],[137,16],[138,17],[64,1],[62,1],[139,18],[140,19],[141,20],[181,21],[142,22],[143,23],[144,22],[145,24],[146,25],[147,26],[148,27],[149,27],[150,27],[151,28],[152,29],[153,30],[154,31],[155,32],[156,33],[157,33],[158,34],[159,1],[160,1],[161,35],[162,36],[163,35],[164,37],[165,38],[166,39],[167,40],[168,41],[169,42],[170,43],[171,44],[172,45],[173,46],[174,47],[175,48],[176,49],[177,50],[178,51],[65,22],[66,1],[67,52],[68,53],[69,1],[70,54],[71,1],[113,55],[114,56],[115,57],[116,57],[117,58],[118,1],[119,5],[120,59],[121,56],[179,60],[180,61],[192,1],[183,1],[185,62],[184,1],[182,1],[186,63],[58,1],[59,1],[11,1],[10,1],[2,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[3,1],[20,1],[21,1],[4,1],[22,1],[26,1],[23,1],[24,1],[25,1],[27,1],[28,1],[29,1],[5,1],[30,1],[31,1],[32,1],[33,1],[6,1],[37,1],[34,1],[35,1],[36,1],[38,1],[7,1],[39,1],[44,1],[45,1],[40,1],[41,1],[42,1],[43,1],[8,1],[49,1],[46,1],[47,1],[48,1],[50,1],[9,1],[51,1],[52,1],[53,1],[55,1],[54,1],[1,1],[56,1],[57,1],[89,64],[101,65],[87,66],[102,67],[111,68],[78,69],[79,70],[77,71],[110,72],[105,73],[109,74],[81,75],[98,76],[80,77],[108,78],[75,79],[76,73],[82,80],[83,1],[88,81],[86,80],[73,82],[112,83],[103,84],[92,85],[91,80],[93,86],[96,87],[90,88],[94,89],[106,72],[84,90],[85,91],[97,92],[74,67],[100,93],[99,80],[95,94],[104,1],[72,1],[107,95],[189,96],[187,1],[188,97],[60,56]],"latestChangedDtsFile":"./cjs/index.d.ts","version":"5.9.3"}
|