@mnaoumov/typescript-lib 0.0.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/@types/debug/package.json +4 -0
- package/LICENSE +21 -0
- package/README.md +7 -1
- package/dist/lib/cjs/@types/debug.d.cts +21 -0
- package/dist/lib/cjs/abort-controller.cjs +202 -0
- package/dist/lib/cjs/abort-controller.d.cts +135 -0
- package/dist/lib/cjs/aggregate-error.cjs +98 -0
- package/dist/lib/cjs/aggregate-error.d.cts +24 -0
- package/dist/lib/cjs/array-buffer.cjs +96 -0
- package/dist/lib/cjs/array-buffer.d.cts +16 -0
- package/dist/lib/cjs/array.cjs +134 -0
- package/dist/lib/cjs/array.d.cts +46 -0
- package/dist/lib/cjs/async-events.cjs +466 -0
- package/dist/lib/cjs/async-events.d.cts +456 -0
- package/dist/lib/cjs/async-operation-hook.cjs +113 -0
- package/dist/lib/cjs/async-operation-hook.d.cts +59 -0
- package/dist/lib/cjs/async.cjs +521 -0
- package/dist/lib/cjs/async.d.cts +414 -0
- package/dist/lib/cjs/beeper.cjs +126 -0
- package/dist/lib/cjs/beeper.d.cts +21 -0
- package/dist/lib/cjs/blob.cjs +160 -0
- package/dist/lib/cjs/blob.d.cts +59 -0
- package/dist/lib/cjs/bytes.cjs +114 -0
- package/dist/lib/cjs/bytes.d.cts +17 -0
- package/dist/lib/cjs/debug-controller.cjs +80 -0
- package/dist/lib/cjs/debug-controller.d.cts +87 -0
- package/dist/lib/cjs/debug.cjs +235 -0
- package/dist/lib/cjs/debug.d.cts +66 -0
- package/dist/lib/cjs/desktop-zip-extractor.cjs +215 -0
- package/dist/lib/cjs/desktop-zip-extractor.d.cts +95 -0
- package/dist/lib/cjs/disposable.cjs +414 -0
- package/dist/lib/cjs/disposable.d.cts +387 -0
- package/dist/lib/cjs/enum.cjs +100 -0
- package/dist/lib/cjs/enum.d.cts +24 -0
- package/dist/lib/cjs/error.cjs +297 -0
- package/dist/lib/cjs/error.d.cts +181 -0
- package/dist/lib/cjs/function.cjs +141 -0
- package/dist/lib/cjs/function.d.cts +128 -0
- package/dist/lib/cjs/html-element.cjs +341 -0
- package/dist/lib/cjs/html-element.d.cts +199 -0
- package/dist/lib/cjs/index.cjs +195 -0
- package/dist/lib/cjs/index.d.cts +33 -0
- package/dist/lib/cjs/jpeg-metadata.cjs +228 -0
- package/dist/lib/cjs/jpeg-metadata.d.cts +42 -0
- package/dist/lib/cjs/library.cjs +158 -0
- package/dist/lib/cjs/library.d.cts +96 -0
- package/dist/lib/cjs/object-utils.cjs +617 -0
- package/dist/lib/cjs/object-utils.d.cts +298 -0
- package/dist/lib/cjs/path.cjs +202 -0
- package/dist/lib/cjs/path.d.cts +154 -0
- package/dist/lib/cjs/reg-exp.cjs +254 -0
- package/dist/lib/cjs/reg-exp.d.cts +87 -0
- package/dist/lib/cjs/string.cjs +326 -0
- package/dist/lib/cjs/string.d.cts +361 -0
- package/dist/lib/cjs/transformers/date-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/date-transformer.d.cts +39 -0
- package/dist/lib/cjs/transformers/group-transformer.cjs +173 -0
- package/dist/lib/cjs/transformers/group-transformer.d.cts +70 -0
- package/dist/lib/cjs/transformers/index.cjs +123 -0
- package/dist/lib/cjs/transformers/index.d.cts +9 -0
- package/dist/lib/cjs/transformers/map-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/map-transformer.d.cts +41 -0
- package/dist/lib/cjs/transformers/set-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/set-transformer.d.cts +39 -0
- package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +127 -0
- package/dist/lib/cjs/transformers/skip-private-property-transformer.d.cts +36 -0
- package/dist/lib/cjs/transformers/transformer.cjs +170 -0
- package/dist/lib/cjs/transformers/transformer.d.cts +70 -0
- package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +130 -0
- package/dist/lib/cjs/transformers/two-way-map-transformer.d.cts +42 -0
- package/dist/lib/cjs/transformers/typed-transformer.cjs +94 -0
- package/dist/lib/cjs/transformers/typed-transformer.d.cts +39 -0
- package/dist/lib/cjs/two-way-map.cjs +208 -0
- package/dist/lib/cjs/two-way-map.d.cts +101 -0
- package/dist/lib/cjs/type-guards.cjs +128 -0
- package/dist/lib/cjs/type-guards.d.cts +84 -0
- package/dist/lib/cjs/type.cjs +121 -0
- package/dist/lib/cjs/type.d.cts +122 -0
- package/dist/lib/cjs/typescript-lib-state.cjs +126 -0
- package/dist/lib/cjs/typescript-lib-state.d.cts +56 -0
- package/dist/lib/cjs/url.cjs +136 -0
- package/dist/lib/cjs/url.d.cts +74 -0
- package/dist/lib/cjs/value-provider.cjs +100 -0
- package/dist/lib/cjs/value-provider.d.cts +28 -0
- package/dist/lib/cjs/value-wrapper.cjs +144 -0
- package/dist/lib/cjs/value-wrapper.d.cts +47 -0
- package/dist/lib/esm/@types/debug.d.mts +21 -0
- package/dist/lib/esm/abort-controller.d.mts +135 -0
- package/dist/lib/esm/abort-controller.mjs +159 -0
- package/dist/lib/esm/aggregate-error.d.mts +24 -0
- package/dist/lib/esm/aggregate-error.mjs +60 -0
- package/dist/lib/esm/array-buffer.d.mts +16 -0
- package/dist/lib/esm/array-buffer.mjs +58 -0
- package/dist/lib/esm/array.d.mts +46 -0
- package/dist/lib/esm/array.mjs +93 -0
- package/dist/lib/esm/async-events.d.mts +456 -0
- package/dist/lib/esm/async-events.mjs +427 -0
- package/dist/lib/esm/async-operation-hook.d.mts +59 -0
- package/dist/lib/esm/async-operation-hook.mjs +71 -0
- package/dist/lib/esm/async.d.mts +414 -0
- package/dist/lib/esm/async.mjs +479 -0
- package/dist/lib/esm/beeper.d.mts +21 -0
- package/dist/lib/esm/beeper.mjs +88 -0
- package/dist/lib/esm/blob.d.mts +59 -0
- package/dist/lib/esm/blob.mjs +121 -0
- package/dist/lib/esm/bytes.d.mts +17 -0
- package/dist/lib/esm/bytes.mjs +76 -0
- package/dist/lib/esm/debug-controller.d.mts +87 -0
- package/dist/lib/esm/debug-controller.mjs +50 -0
- package/dist/lib/esm/debug.d.mts +66 -0
- package/dist/lib/esm/debug.mjs +185 -0
- package/dist/lib/esm/desktop-zip-extractor.d.mts +95 -0
- package/dist/lib/esm/desktop-zip-extractor.mjs +180 -0
- package/dist/lib/esm/disposable.d.mts +387 -0
- package/dist/lib/esm/disposable.mjs +360 -0
- package/dist/lib/esm/enum.d.mts +24 -0
- package/dist/lib/esm/enum.mjs +61 -0
- package/dist/lib/esm/error.d.mts +181 -0
- package/dist/lib/esm/error.mjs +248 -0
- package/dist/lib/esm/function.d.mts +128 -0
- package/dist/lib/esm/function.mjs +96 -0
- package/dist/lib/esm/html-element.d.mts +199 -0
- package/dist/lib/esm/html-element.mjs +291 -0
- package/dist/lib/esm/index.d.mts +33 -0
- package/dist/lib/esm/index.mjs +116 -0
- package/dist/lib/esm/jpeg-metadata.d.mts +42 -0
- package/dist/lib/esm/jpeg-metadata.mjs +189 -0
- package/dist/lib/esm/library.d.mts +96 -0
- package/dist/lib/esm/library.mjs +118 -0
- package/dist/lib/esm/object-utils.d.mts +298 -0
- package/dist/lib/esm/object-utils.mjs +567 -0
- package/dist/lib/esm/path.d.mts +154 -0
- package/dist/lib/esm/path.mjs +139 -0
- package/dist/lib/esm/reg-exp.d.mts +87 -0
- package/dist/lib/esm/reg-exp.mjs +213 -0
- package/dist/lib/esm/string.d.mts +361 -0
- package/dist/lib/esm/string.mjs +274 -0
- package/dist/lib/esm/transformers/date-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/date-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/group-transformer.d.mts +70 -0
- package/dist/lib/esm/transformers/group-transformer.mjs +138 -0
- package/dist/lib/esm/transformers/index.d.mts +9 -0
- package/dist/lib/esm/transformers/index.mjs +68 -0
- package/dist/lib/esm/transformers/map-transformer.d.mts +41 -0
- package/dist/lib/esm/transformers/map-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/set-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/set-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/skip-private-property-transformer.d.mts +36 -0
- package/dist/lib/esm/transformers/skip-private-property-transformer.mjs +89 -0
- package/dist/lib/esm/transformers/transformer.d.mts +70 -0
- package/dist/lib/esm/transformers/transformer.mjs +132 -0
- package/dist/lib/esm/transformers/two-way-map-transformer.d.mts +42 -0
- package/dist/lib/esm/transformers/two-way-map-transformer.mjs +92 -0
- package/dist/lib/esm/transformers/typed-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/typed-transformer.mjs +56 -0
- package/dist/lib/esm/two-way-map.d.mts +101 -0
- package/dist/lib/esm/two-way-map.mjs +170 -0
- package/dist/lib/esm/type-guards.d.mts +84 -0
- package/dist/lib/esm/type-guards.mjs +85 -0
- package/dist/lib/esm/type.d.mts +122 -0
- package/dist/lib/esm/type.mjs +83 -0
- package/dist/lib/esm/typescript-lib-state.d.mts +56 -0
- package/dist/lib/esm/typescript-lib-state.mjs +84 -0
- package/dist/lib/esm/url.d.mts +74 -0
- package/dist/lib/esm/url.mjs +94 -0
- package/dist/lib/esm/value-provider.d.mts +28 -0
- package/dist/lib/esm/value-provider.mjs +62 -0
- package/dist/lib/esm/value-wrapper.d.mts +47 -0
- package/dist/lib/esm/value-wrapper.mjs +106 -0
- package/package.json +111 -13
- package/transformers/date-transformer/package.json +6 -0
- package/transformers/group-transformer/package.json +6 -0
- package/transformers/index/package.json +6 -0
- package/transformers/map-transformer/package.json +6 -0
- package/transformers/package.json +6 -0
- package/transformers/set-transformer/package.json +6 -0
- package/transformers/skip-private-property-transformer/package.json +6 -0
- package/transformers/transformer/package.json +6 -0
- package/transformers/two-way-map-transformer/package.json +6 -0
- package/transformers/typed-transformer/package.json +6 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/// <reference path="./library.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Extracts a ZIP archive to disk using only Node's `zlib` — with no third-party unzip dependency.
|
|
6
|
+
*
|
|
7
|
+
* It exists for one measured reason. The dependency it replaced on this path, `adm-zip`, bundled
|
|
8
|
+
* roughly 34 KB of minified JavaScript into EVERY Obsidian plugin built with this library: a plugin
|
|
9
|
+
* ships a single CJS `main.js`, esbuild has no code splitting to put a dependency behind, and a
|
|
10
|
+
* `await import()` only defers evaluation — the module body is inlined either way. `node:zlib` is
|
|
11
|
+
* already an esbuild external, so the same work now costs a plugin bundle nothing at all. Archives are
|
|
12
|
+
* WRITTEN with `fflate` at release time (`script-utils/demo-vault.ts`), which is Node-side tooling and
|
|
13
|
+
* never reaches a plugin bundle — a third-party writer there is also what keeps this reader checked
|
|
14
|
+
* against an implementation that is not its own.
|
|
15
|
+
*
|
|
16
|
+
* Deliberately narrow: it reads exactly what that writer produces — stored and deflated entries in an
|
|
17
|
+
* unencrypted archive below the 4 GB / 65535-entry ZIP64 threshold — and raises a named error for
|
|
18
|
+
* anything else rather than guessing at it. Sizes and offsets are taken from the central directory,
|
|
19
|
+
* which is authoritative even for archives written with data descriptors.
|
|
20
|
+
*
|
|
21
|
+
* The `node:` imports below are safe to merely EVALUATE on mobile — `require` hands back `undefined`
|
|
22
|
+
* there and nothing reads it at load time — so this module can sit in the generated barrels without
|
|
23
|
+
* breaking the library's load on Android. Only the calls are desktop-only.
|
|
24
|
+
*/
|
|
25
|
+
import type { Buffer } from 'node:buffer' with { 'resolution-mode': 'import' };
|
|
26
|
+
/**
|
|
27
|
+
* Parameters for {@link extractZipArchive}.
|
|
28
|
+
*/
|
|
29
|
+
export interface ExtractZipArchiveParams {
|
|
30
|
+
/**
|
|
31
|
+
* The raw ZIP archive bytes.
|
|
32
|
+
*/
|
|
33
|
+
readonly archive: Buffer;
|
|
34
|
+
/**
|
|
35
|
+
* The file-system implementation the extracted entries are written with.
|
|
36
|
+
*
|
|
37
|
+
* Injected rather than imported so the caller chooses which `fs` writes the files. The demo-vault
|
|
38
|
+
* opener hands over Electron's `original-fs` (see {@link ZipExtractionFileSystem}).
|
|
39
|
+
*/
|
|
40
|
+
readonly fileSystem: ZipExtractionFileSystem;
|
|
41
|
+
/**
|
|
42
|
+
* The directory to extract into. Created if it does not exist.
|
|
43
|
+
*/
|
|
44
|
+
readonly targetDirectory: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The slice of `node:fs` extraction needs.
|
|
48
|
+
*
|
|
49
|
+
* Only the two WRITING calls are required, and that is deliberate: Electron's asar layer intercepts
|
|
50
|
+
* `fs` READS (and `existsSync`) on any path containing `.asar`, which a demo vault may legitimately
|
|
51
|
+
* ship as a plain file. Never probing the target with a read keeps that interception out of the
|
|
52
|
+
* picture entirely, and a caller that hands over Electron's `original-fs` is safe even from the
|
|
53
|
+
* write side.
|
|
54
|
+
*/
|
|
55
|
+
export interface ZipExtractionFileSystem {
|
|
56
|
+
/**
|
|
57
|
+
* Creates a directory, including any missing parents.
|
|
58
|
+
*
|
|
59
|
+
* @param path - The directory to create.
|
|
60
|
+
* @param options - The {@link ZipExtractionMkdirOptions}.
|
|
61
|
+
* @returns The first directory created, if any.
|
|
62
|
+
*/
|
|
63
|
+
mkdirSync: (path: string, options: ZipExtractionMkdirOptions) => string | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Writes a file, overwriting it if it exists.
|
|
66
|
+
*
|
|
67
|
+
* @param path - The file to write.
|
|
68
|
+
* @param data - The bytes to write.
|
|
69
|
+
*/
|
|
70
|
+
writeFileSync: (path: string, data: Buffer) => void;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The options {@link ZipExtractionFileSystem.mkdirSync} is always called with.
|
|
74
|
+
*
|
|
75
|
+
* Extraction never probes for an existing directory, so every call has to create the missing parents
|
|
76
|
+
* itself and tolerate a directory that is already there.
|
|
77
|
+
*/
|
|
78
|
+
export interface ZipExtractionMkdirOptions {
|
|
79
|
+
/**
|
|
80
|
+
* Always `true`.
|
|
81
|
+
*/
|
|
82
|
+
readonly recursive: true;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Extracts every entry of a ZIP archive into a directory.
|
|
86
|
+
*
|
|
87
|
+
* Directory entries become directories; a file entry's parents are created whether or not the archive
|
|
88
|
+
* declared them. An entry whose name would escape {@link ExtractZipArchiveParams.targetDirectory} is
|
|
89
|
+
* refused rather than written (the "zip slip" traversal), as is an encrypted, ZIP64, or
|
|
90
|
+
* unknown-compression archive.
|
|
91
|
+
*
|
|
92
|
+
* @param params - The {@link ExtractZipArchiveParams}.
|
|
93
|
+
* @throws An {@link Error} naming the reason when the archive cannot be read as written.
|
|
94
|
+
*/
|
|
95
|
+
export declare function extractZipArchive(params: ExtractZipArchiveParams): void;
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
|
|
9
|
+
symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function ensureBrowserProcess() {
|
|
13
|
+
const browserProcess = {
|
|
14
|
+
browser: true,
|
|
15
|
+
cwd() {
|
|
16
|
+
return '/';
|
|
17
|
+
},
|
|
18
|
+
env: {},
|
|
19
|
+
platform: 'android'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
23
|
+
const existingProcess = globalThis.process;
|
|
24
|
+
|
|
25
|
+
if (!existingProcess) {
|
|
26
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
27
|
+
globalThis.process = browserProcess;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (existingProcess.versions?.node) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const existingProcessRecord = existingProcess;
|
|
36
|
+
|
|
37
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
38
|
+
existingProcessRecord[key] ??= value;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
existingProcessRecord['browser'] = true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function keepName($unknown) {
|
|
45
|
+
return $unknown;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
(function initCjs() {
|
|
49
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
50
|
+
const globalThisRecord = globalThis;
|
|
51
|
+
ensureDisposeSymbols();
|
|
52
|
+
globalThisRecord['__name'] ??= keepName;
|
|
53
|
+
globalThisRecord['__extractDefault'] ??= extractDefault;
|
|
54
|
+
|
|
55
|
+
ensureBrowserProcess();
|
|
56
|
+
|
|
57
|
+
// eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
|
|
58
|
+
function extractDefault(module) {
|
|
59
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
60
|
+
}
|
|
61
|
+
})();
|
|
62
|
+
})();
|
|
63
|
+
|
|
64
|
+
"use strict";
|
|
65
|
+
var __defProp = Object.defineProperty;
|
|
66
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
67
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
68
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
69
|
+
var __export = (target, all) => {
|
|
70
|
+
for (var name in all)
|
|
71
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
72
|
+
};
|
|
73
|
+
var __copyProps = (to, from, except, desc) => {
|
|
74
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
75
|
+
for (let key of __getOwnPropNames(from))
|
|
76
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
77
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
78
|
+
}
|
|
79
|
+
return to;
|
|
80
|
+
};
|
|
81
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
82
|
+
var disposable_exports = {};
|
|
83
|
+
__export(disposable_exports, {
|
|
84
|
+
AsyncCallbackDisposable: () => AsyncCallbackDisposable,
|
|
85
|
+
AsyncDisposableBase: () => AsyncDisposableBase,
|
|
86
|
+
CallbackDisposable: () => CallbackDisposable,
|
|
87
|
+
CombineAsyncDisposable: () => CombineAsyncDisposable,
|
|
88
|
+
CombineDisposable: () => CombineDisposable,
|
|
89
|
+
DisposableBase: () => DisposableBase,
|
|
90
|
+
DisposeErrorBehavior: () => DisposeErrorBehavior,
|
|
91
|
+
DisposeOrder: () => DisposeOrder,
|
|
92
|
+
MultipleDisposeBehavior: () => MultipleDisposeBehavior,
|
|
93
|
+
dispose: () => dispose,
|
|
94
|
+
disposeAsync: () => disposeAsync,
|
|
95
|
+
isAsyncDisposable: () => isAsyncDisposable,
|
|
96
|
+
isAsyncDisposableEx: () => isAsyncDisposableEx,
|
|
97
|
+
isDisposable: () => isDisposable,
|
|
98
|
+
isDisposableEx: () => isDisposableEx,
|
|
99
|
+
toAsyncDisposableEx: () => toAsyncDisposableEx,
|
|
100
|
+
toDisposableEx: () => toDisposableEx
|
|
101
|
+
});
|
|
102
|
+
module.exports = __toCommonJS(disposable_exports);
|
|
103
|
+
var import_aggregate_error = require('./aggregate-error.cjs');
|
|
104
|
+
var import_type_guards = require('./type-guards.cjs');
|
|
105
|
+
var DisposeErrorBehavior = /* @__PURE__ */ ((DisposeErrorBehavior2) => {
|
|
106
|
+
DisposeErrorBehavior2[DisposeErrorBehavior2["Aggregate"] = 0] = "Aggregate";
|
|
107
|
+
DisposeErrorBehavior2[DisposeErrorBehavior2["FailFast"] = 1] = "FailFast";
|
|
108
|
+
return DisposeErrorBehavior2;
|
|
109
|
+
})(DisposeErrorBehavior || {});
|
|
110
|
+
var DisposeOrder = /* @__PURE__ */ ((DisposeOrder2) => {
|
|
111
|
+
DisposeOrder2[DisposeOrder2["Lifo"] = 0] = "Lifo";
|
|
112
|
+
DisposeOrder2[DisposeOrder2["Fifo"] = 1] = "Fifo";
|
|
113
|
+
return DisposeOrder2;
|
|
114
|
+
})(DisposeOrder || {});
|
|
115
|
+
var MultipleDisposeBehavior = /* @__PURE__ */ ((MultipleDisposeBehavior2) => {
|
|
116
|
+
MultipleDisposeBehavior2[MultipleDisposeBehavior2["Invoke"] = 0] = "Invoke";
|
|
117
|
+
MultipleDisposeBehavior2[MultipleDisposeBehavior2["Ignore"] = 1] = "Ignore";
|
|
118
|
+
MultipleDisposeBehavior2[MultipleDisposeBehavior2["Throw"] = 2] = "Throw";
|
|
119
|
+
return MultipleDisposeBehavior2;
|
|
120
|
+
})(MultipleDisposeBehavior || {});
|
|
121
|
+
class AsyncDisposableBase {
|
|
122
|
+
/**
|
|
123
|
+
* How the disposable behaves when disposed more than once.
|
|
124
|
+
*
|
|
125
|
+
* @default {@link MultipleDisposeBehavior.Ignore}
|
|
126
|
+
*/
|
|
127
|
+
multipleDisposeBehavior = 1 /* Ignore */;
|
|
128
|
+
/**
|
|
129
|
+
* Whether this disposable has been disposed (its teardown has run at least once).
|
|
130
|
+
*
|
|
131
|
+
* @returns `true` once disposal has started.
|
|
132
|
+
*/
|
|
133
|
+
get isDisposed() {
|
|
134
|
+
return this._isDisposed;
|
|
135
|
+
}
|
|
136
|
+
_isDisposed = false;
|
|
137
|
+
/**
|
|
138
|
+
* Disposes the object. Convenience alias that delegates to `this[Symbol.asyncDispose]()`.
|
|
139
|
+
*
|
|
140
|
+
* @returns A {@link Promise} that resolves once teardown completes.
|
|
141
|
+
*/
|
|
142
|
+
asyncDispose() {
|
|
143
|
+
return this[Symbol.asyncDispose]();
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Disposes the object by running {@link AsyncDisposableBase.performDisposeAsync}, honoring the configured
|
|
147
|
+
* {@link MultipleDisposeBehavior} on a repeat dispose.
|
|
148
|
+
*
|
|
149
|
+
* @returns A {@link Promise} that resolves once teardown completes.
|
|
150
|
+
*/
|
|
151
|
+
async [Symbol.asyncDispose]() {
|
|
152
|
+
if (!shouldPerformDispose(this._isDisposed, this.multipleDisposeBehavior)) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
this._isDisposed = true;
|
|
156
|
+
await this.performDisposeAsync();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
class AsyncCallbackDisposable extends AsyncDisposableBase {
|
|
160
|
+
callback;
|
|
161
|
+
/**
|
|
162
|
+
* Creates a new instance of {@link AsyncCallbackDisposable}.
|
|
163
|
+
*
|
|
164
|
+
* @param params - The parameters.
|
|
165
|
+
*/
|
|
166
|
+
constructor(params) {
|
|
167
|
+
super();
|
|
168
|
+
this.callback = params.callback;
|
|
169
|
+
this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 1 /* Ignore */;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Runs the dispose callback.
|
|
173
|
+
*
|
|
174
|
+
* @returns A {@link Promise} that resolves once the callback completes.
|
|
175
|
+
*/
|
|
176
|
+
async performDisposeAsync() {
|
|
177
|
+
await this.callback();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function dispose(disposable) {
|
|
181
|
+
disposable[Symbol.dispose]();
|
|
182
|
+
}
|
|
183
|
+
class DisposableBase {
|
|
184
|
+
/**
|
|
185
|
+
* How the disposable behaves when disposed more than once.
|
|
186
|
+
*
|
|
187
|
+
* @default {@link MultipleDisposeBehavior.Ignore}
|
|
188
|
+
*/
|
|
189
|
+
multipleDisposeBehavior = 1 /* Ignore */;
|
|
190
|
+
/**
|
|
191
|
+
* Whether this disposable has been disposed (its teardown has run at least once).
|
|
192
|
+
*
|
|
193
|
+
* @returns `true` once disposal has started.
|
|
194
|
+
*/
|
|
195
|
+
get isDisposed() {
|
|
196
|
+
return this._isDisposed;
|
|
197
|
+
}
|
|
198
|
+
_isDisposed = false;
|
|
199
|
+
/**
|
|
200
|
+
* Disposes the object. Convenience alias that delegates to `this[Symbol.dispose]()`.
|
|
201
|
+
*/
|
|
202
|
+
dispose() {
|
|
203
|
+
this[Symbol.dispose]();
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Disposes the object by running {@link DisposableBase.performDispose}, honoring the configured
|
|
207
|
+
* {@link MultipleDisposeBehavior} on a repeat dispose.
|
|
208
|
+
*/
|
|
209
|
+
[Symbol.dispose]() {
|
|
210
|
+
if (!shouldPerformDispose(this._isDisposed, this.multipleDisposeBehavior)) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this._isDisposed = true;
|
|
214
|
+
this.performDispose();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
class CallbackDisposable extends DisposableBase {
|
|
218
|
+
callback;
|
|
219
|
+
/**
|
|
220
|
+
* Creates a new instance of {@link CallbackDisposable}.
|
|
221
|
+
*
|
|
222
|
+
* @param params - The parameters.
|
|
223
|
+
*/
|
|
224
|
+
constructor(params) {
|
|
225
|
+
super();
|
|
226
|
+
this.callback = params.callback;
|
|
227
|
+
this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 1 /* Ignore */;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Runs the dispose callback.
|
|
231
|
+
*/
|
|
232
|
+
performDispose() {
|
|
233
|
+
this.callback();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
class CombineAsyncDisposable extends AsyncDisposableBase {
|
|
237
|
+
children;
|
|
238
|
+
disposeOrder;
|
|
239
|
+
errorBehavior;
|
|
240
|
+
/**
|
|
241
|
+
* Creates a new instance of {@link CombineAsyncDisposable}.
|
|
242
|
+
*
|
|
243
|
+
* @param params - The parameters.
|
|
244
|
+
*/
|
|
245
|
+
constructor(params) {
|
|
246
|
+
super();
|
|
247
|
+
this.children = [...params.asyncDisposables];
|
|
248
|
+
this.disposeOrder = params.disposeOrder ?? 0 /* Lifo */;
|
|
249
|
+
this.errorBehavior = params.errorBehavior ?? 0 /* Aggregate */;
|
|
250
|
+
this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 1 /* Ignore */;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
|
|
254
|
+
* {@link DisposeErrorBehavior} when a child throws.
|
|
255
|
+
*
|
|
256
|
+
* @returns A {@link Promise} that resolves once all children have been disposed.
|
|
257
|
+
*/
|
|
258
|
+
async performDisposeAsync() {
|
|
259
|
+
const errors = [];
|
|
260
|
+
for (const child of this.getOrderedChildren()) {
|
|
261
|
+
try {
|
|
262
|
+
await child[Symbol.asyncDispose]();
|
|
263
|
+
} catch (error) {
|
|
264
|
+
if (this.errorBehavior === 1 /* FailFast */) {
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
errors.push(error);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (errors.length > 0) {
|
|
271
|
+
throw (0, import_aggregate_error.createAggregateError)(errors);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
getOrderedChildren() {
|
|
275
|
+
switch (this.disposeOrder) {
|
|
276
|
+
case 1 /* Fifo */: {
|
|
277
|
+
return this.children;
|
|
278
|
+
}
|
|
279
|
+
case 0 /* Lifo */: {
|
|
280
|
+
return [...this.children].reverse();
|
|
281
|
+
}
|
|
282
|
+
default: {
|
|
283
|
+
(0, import_type_guards.assertNever)(this.disposeOrder);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
class CombineDisposable extends DisposableBase {
|
|
289
|
+
children;
|
|
290
|
+
disposeOrder;
|
|
291
|
+
errorBehavior;
|
|
292
|
+
/**
|
|
293
|
+
* Creates a new instance of {@link CombineDisposable}.
|
|
294
|
+
*
|
|
295
|
+
* @param params - The parameters.
|
|
296
|
+
*/
|
|
297
|
+
constructor(params) {
|
|
298
|
+
super();
|
|
299
|
+
this.children = [...params.disposables];
|
|
300
|
+
this.disposeOrder = params.disposeOrder ?? 0 /* Lifo */;
|
|
301
|
+
this.errorBehavior = params.errorBehavior ?? 0 /* Aggregate */;
|
|
302
|
+
this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 1 /* Ignore */;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
|
|
306
|
+
* {@link DisposeErrorBehavior} when a child throws.
|
|
307
|
+
*/
|
|
308
|
+
performDispose() {
|
|
309
|
+
const errors = [];
|
|
310
|
+
for (const child of this.getOrderedChildren()) {
|
|
311
|
+
try {
|
|
312
|
+
child[Symbol.dispose]();
|
|
313
|
+
} catch (error) {
|
|
314
|
+
if (this.errorBehavior === 1 /* FailFast */) {
|
|
315
|
+
throw error;
|
|
316
|
+
}
|
|
317
|
+
errors.push(error);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (errors.length > 0) {
|
|
321
|
+
throw (0, import_aggregate_error.createAggregateError)(errors);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
getOrderedChildren() {
|
|
325
|
+
switch (this.disposeOrder) {
|
|
326
|
+
case 1 /* Fifo */: {
|
|
327
|
+
return this.children;
|
|
328
|
+
}
|
|
329
|
+
case 0 /* Lifo */: {
|
|
330
|
+
return [...this.children].reverse();
|
|
331
|
+
}
|
|
332
|
+
default: {
|
|
333
|
+
(0, import_type_guards.assertNever)(this.disposeOrder);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
async function disposeAsync(asyncDisposable) {
|
|
339
|
+
await asyncDisposable[Symbol.asyncDispose]();
|
|
340
|
+
}
|
|
341
|
+
function isAsyncDisposable($unknown) {
|
|
342
|
+
const asyncDisposable = $unknown;
|
|
343
|
+
return !!asyncDisposable[Symbol.asyncDispose];
|
|
344
|
+
}
|
|
345
|
+
function isAsyncDisposableEx($unknown) {
|
|
346
|
+
const asyncDisposableEx = $unknown;
|
|
347
|
+
return isAsyncDisposable($unknown) && typeof asyncDisposableEx.asyncDispose === "function";
|
|
348
|
+
}
|
|
349
|
+
function isDisposable($unknown) {
|
|
350
|
+
const disposable = $unknown;
|
|
351
|
+
return !!disposable[Symbol.dispose];
|
|
352
|
+
}
|
|
353
|
+
function isDisposableEx($unknown) {
|
|
354
|
+
const disposableEx = $unknown;
|
|
355
|
+
return isDisposable($unknown) && typeof disposableEx.dispose === "function";
|
|
356
|
+
}
|
|
357
|
+
function toAsyncDisposableEx(asyncDisposable) {
|
|
358
|
+
return isAsyncDisposableEx(asyncDisposable) ? asyncDisposable : {
|
|
359
|
+
asyncDispose: asyncDisposeAdapted,
|
|
360
|
+
[Symbol.asyncDispose]: asyncDisposeAdapted
|
|
361
|
+
};
|
|
362
|
+
function asyncDisposeAdapted() {
|
|
363
|
+
return disposeAsync(asyncDisposable);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
function toDisposableEx(disposable) {
|
|
367
|
+
return isDisposableEx(disposable) ? disposable : {
|
|
368
|
+
dispose: disposeAdapted,
|
|
369
|
+
[Symbol.dispose]: disposeAdapted
|
|
370
|
+
};
|
|
371
|
+
function disposeAdapted() {
|
|
372
|
+
dispose(disposable);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
function shouldPerformDispose(isDisposed, multipleDisposeBehavior) {
|
|
376
|
+
if (!isDisposed) {
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
switch (multipleDisposeBehavior) {
|
|
380
|
+
case 1 /* Ignore */: {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
case 0 /* Invoke */: {
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
case 2 /* Throw */: {
|
|
387
|
+
throw new Error("This disposable has already been disposed.");
|
|
388
|
+
}
|
|
389
|
+
default: {
|
|
390
|
+
(0, import_type_guards.assertNever)(multipleDisposeBehavior);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
395
|
+
0 && (module.exports = {
|
|
396
|
+
AsyncCallbackDisposable,
|
|
397
|
+
AsyncDisposableBase,
|
|
398
|
+
CallbackDisposable,
|
|
399
|
+
CombineAsyncDisposable,
|
|
400
|
+
CombineDisposable,
|
|
401
|
+
DisposableBase,
|
|
402
|
+
DisposeErrorBehavior,
|
|
403
|
+
DisposeOrder,
|
|
404
|
+
MultipleDisposeBehavior,
|
|
405
|
+
dispose,
|
|
406
|
+
disposeAsync,
|
|
407
|
+
isAsyncDisposable,
|
|
408
|
+
isAsyncDisposableEx,
|
|
409
|
+
isDisposable,
|
|
410
|
+
isDisposableEx,
|
|
411
|
+
toAsyncDisposableEx,
|
|
412
|
+
toDisposableEx
|
|
413
|
+
});
|
|
414
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rpc3Bvc2FibGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEaXNwb3NhYmxlIHV0aWxpdGllcyBmb3IgYHVzaW5nYCAvIGBhd2FpdCB1c2luZ2AgZGVjbGFyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGNyZWF0ZUFnZ3JlZ2F0ZUVycm9yIH0gZnJvbSAnLi9hZ2dyZWdhdGUtZXJyb3IudHMnO1xuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBlcnJvciBzZW1hbnRpY3Mgb2YgYSB7QGxpbmsgQ29tYmluZURpc3Bvc2FibGV9IG9yIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlfSB3aGVuXG4gKiBvbmUgb2YgaXRzIGNoaWxkcmVuIHRocm93cyB3aGlsZSBiZWluZyBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGVudW0gRGlzcG9zZUVycm9yQmVoYXZpb3Ige1xuICAvKipcbiAgICogRGlzcG9zZSBldmVyeSBjaGlsZCBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdywgY29sbGVjdGluZyB0aGUgdGhyb3duIGVycm9ycyBhbmQgcmUtdGhyb3dpbmcgdGhlbVxuICAgKiBhcyBhIHNpbmdsZSB7QGxpbmsgQWdncmVnYXRlRXJyb3J9IG9uY2UgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiBkaXNwb3NlZC5cbiAgICovXG4gIEFnZ3JlZ2F0ZSxcblxuICAvKipcbiAgICogUmUtdGhyb3cgdGhlIGZpcnN0IGVycm9yIGEgY2hpbGQgdGhyb3dzIGltbWVkaWF0ZWx5LCBsZWF2aW5nIHRoZSByZW1haW5pbmcgY2hpbGRyZW4gdW5kaXNwb3NlZC5cbiAgICovXG4gIEZhaWxGYXN0XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggYSB7QGxpbmsgQ29tYmluZURpc3Bvc2FibGV9IG9yIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlfSBkaXNwb3Nlc1xuICogaXRzIGNoaWxkcmVuLlxuICovXG5leHBvcnQgZW51bSBEaXNwb3NlT3JkZXIge1xuICAvKipcbiAgICogRGlzcG9zZSB0aGUgbGFzdC1yZWdpc3RlcmVkIGNoaWxkIGZpcnN0IChsYXN0LWluLCBmaXJzdC1vdXQpLCBsaWtlIG5lc3RlZCBgdXNpbmdgIGRlY2xhcmF0aW9uc1xuICAgKiB1bndpbmRpbmcgaW4gcmV2ZXJzZS5cbiAgICovXG4gIExpZm8sXG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgdGhlIGZpcnN0LXJlZ2lzdGVyZWQgY2hpbGQgZmlyc3QgKGZpcnN0LWluLCBmaXJzdC1vdXQpLlxuICAgKi9cbiAgRmlmb1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaG93IGEge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZX0gb3Ige0BsaW5rIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlfSBiZWhhdmVzIHdoZW4gaXQgaXNcbiAqIGRpc3Bvc2VkIG1vcmUgdGhhbiBvbmNlLlxuICovXG5leHBvcnQgZW51bSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvciB7XG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIGNhbGxiYWNrIG9uIGV2ZXJ5IGRpc3Bvc2UuXG4gICAqL1xuICBJbnZva2UsXG5cbiAgLyoqXG4gICAqIEludm9rZSB0aGUgY2FsbGJhY2sgb24gdGhlIGZpcnN0IGRpc3Bvc2Ugb25seTsgc3Vic2VxdWVudCBkaXNwb3NlcyBhcmUgbm8tb3BzLlxuICAgKi9cbiAgSWdub3JlLFxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIGNhbGxiYWNrIG9uIHRoZSBmaXJzdCBkaXNwb3NlIG9ubHk7IHN1YnNlcXVlbnQgZGlzcG9zZXMgdGhyb3cuXG4gICAqL1xuICBUaHJvd1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYW4ge0BsaW5rIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gZGlzcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBjYWxsYmFjazogQXN5bmNEaXNwb3NlQ2FsbGJhY2s7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgZGlzcG9zYWJsZSBiZWhhdmVzIHdoZW4gZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmV9XG4gICAqL1xuICByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcj86IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yO1xufVxuXG4vKipcbiAqIEFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IHRoYXQgYWRkaXRpb25hbGx5IGV4cG9zZXMgYSBjb252ZW5pZW5jZSB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXguYXN5bmNEaXNwb3NlfVxuICogbWV0aG9kLCBzbyBhIHN0b3JlZCBoYW5kbGUgY2FuIGJlIGRpc3Bvc2VkIGFzIGBoYW5kbGUuYXN5bmNEaXNwb3NlKClgIGluc3RlYWQgb2YgdGhlIGNsdW5raWVyXG4gKiBgaGFuZGxlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRGlzcG9zYWJsZUV4IGV4dGVuZHMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QuIERlbGVnYXRlcyB0byBgdGhpc1tTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIGRpc3Bvc2FsIGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jRGlzcG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhbiB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9IGlzIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgdHlwZSBBc3luY0Rpc3Bvc2VDYWxsYmFjayA9ICgpID0+IFByb21pc2FibGU8dm9pZD47XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBDYWxsYmFja0Rpc3Bvc2FibGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbGxiYWNrRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gZGlzcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBjYWxsYmFjazogRGlzcG9zZUNhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGRpc3Bvc2FibGUgYmVoYXZlcyB3aGVuIGRpc3Bvc2VkIG1vcmUgdGhhbiBvbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlfVxuICAgKi9cbiAgcmVhZG9ubHkgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I/OiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgY29uc3RydWN0aW5nIGEge0BsaW5rIENvbWJpbmVBc3luY0Rpc3Bvc2FibGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVBc3luY0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXN5bmMgZGlzcG9zYWJsZXMgdG8gZGlzcG9zZSB3aGVuIHRoZSBjb21iaW5lciBpcyBkaXNwb3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFzeW5jRGlzcG9zYWJsZXM6IEl0ZXJhYmxlPEFzeW5jRGlzcG9zYWJsZT47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2hpbGRyZW4gYXJlIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRGlzcG9zZU9yZGVyLkxpZm99XG4gICAqL1xuICByZWFkb25seSBkaXNwb3NlT3JkZXI/OiBEaXNwb3NlT3JkZXI7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgY29tYmluZXIgYmVoYXZlcyB3aGVuIG9uZSBvZiBpdHMgY2hpbGRyZW4gdGhyb3dzIHdoaWxlIGJlaW5nIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlfVxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JCZWhhdmlvcj86IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGNvbWJpbmVyIGJlaGF2ZXMgd2hlbiBpdCBpcyBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBDb21iaW5lRGlzcG9zYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tYmluZURpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZGlzcG9zYWJsZXMgdG8gZGlzcG9zZSB3aGVuIHRoZSBjb21iaW5lciBpcyBkaXNwb3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3Bvc2FibGVzOiBJdGVyYWJsZTxEaXNwb3NhYmxlPjtcblxuICAvKipcbiAgICogVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjaGlsZHJlbiBhcmUgZGlzcG9zZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBEaXNwb3NlT3JkZXIuTGlmb31cbiAgICovXG4gIHJlYWRvbmx5IGRpc3Bvc2VPcmRlcj86IERpc3Bvc2VPcmRlcjtcblxuICAvKipcbiAgICogSG93IHRoZSBjb21iaW5lciBiZWhhdmVzIHdoZW4gb25lIG9mIGl0cyBjaGlsZHJlbiB0aHJvd3Mgd2hpbGUgYmVpbmcgZGlzcG9zZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBEaXNwb3NlRXJyb3JCZWhhdmlvci5BZ2dyZWdhdGV9XG4gICAqL1xuICByZWFkb25seSBlcnJvckJlaGF2aW9yPzogRGlzcG9zZUVycm9yQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgY29tYmluZXIgYmVoYXZlcyB3aGVuIGl0IGlzIGRpc3Bvc2VkIG1vcmUgdGhhbiBvbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlfVxuICAgKi9cbiAgcmVhZG9ubHkgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I/OiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IGFkZGl0aW9uYWxseSBleHBvc2VzIGEgY29udmVuaWVuY2Uge0BsaW5rIERpc3Bvc2FibGVFeC5kaXNwb3NlfSBtZXRob2QsIHNvIGFcbiAqIHN0b3JlZCBoYW5kbGUgY2FuIGJlIGRpc3Bvc2VkIGFzIGBoYW5kbGUuZGlzcG9zZSgpYCBpbnN0ZWFkIG9mIHRoZSBjbHVua2llciBgaGFuZGxlW1N5bWJvbC5kaXNwb3NlXSgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNwb3NhYmxlRXggZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QuIERlbGVnYXRlcyB0byBgdGhpc1tTeW1ib2wuZGlzcG9zZV0oKWAuXG4gICAqL1xuICBkaXNwb3NlOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIGEge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZX0gaXMgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERpc3Bvc2VDYWxsYmFjayA9ICgpID0+IHZvaWQ7XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBmb3IgYW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fTogaXQgY2FycmllcyB0aGUgcmUtZGlzcG9zZSBndWFyZCAodmlhXG4gKiB7QGxpbmsgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9KSBhbmQgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeC5hc3luY0Rpc3Bvc2V9IGFsaWFzOyBhIHN1YmNsYXNzIG9ubHlcbiAqIGltcGxlbWVudHMge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUJhc2UucGVyZm9ybURpc3Bvc2VBc3luY30uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBc3luY0Rpc3Bvc2FibGVCYXNlIGltcGxlbWVudHMgQXN5bmNEaXNwb3NhYmxlRXgge1xuICAvKipcbiAgICogSG93IHRoZSBkaXNwb3NhYmxlIGJlaGF2ZXMgd2hlbiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZX1cbiAgICovXG4gIHByb3RlY3RlZCBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBkaXNwb3NhYmxlIGhhcyBiZWVuIGRpc3Bvc2VkIChpdHMgdGVhcmRvd24gaGFzIHJ1biBhdCBsZWFzdCBvbmNlKS5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIG9uY2UgZGlzcG9zYWwgaGFzIHN0YXJ0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzRGlzcG9zZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQ7XG4gIH1cblxuICBwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QuIENvbnZlbmllbmNlIGFsaWFzIHRoYXQgZGVsZWdhdGVzIHRvIGB0aGlzW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKClgLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGVhcmRvd24gY29tcGxldGVzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jRGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpc1tTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QgYnkgcnVubmluZyB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlQmFzZS5wZXJmb3JtRGlzcG9zZUFzeW5jfSwgaG9ub3JpbmcgdGhlIGNvbmZpZ3VyZWRcbiAgICoge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfSBvbiBhIHJlcGVhdCBkaXNwb3NlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGVhcmRvd24gY29tcGxldGVzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXNob3VsZFBlcmZvcm1EaXNwb3NlKHRoaXMuX2lzRGlzcG9zZWQsIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5wZXJmb3JtRGlzcG9zZUFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgdGhlIGFjdHVhbCB0ZWFyZG93bi4gQ2FsbGVkIGF0IG1vc3Qgb25jZSB1bmxlc3Mge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZX0gaXMgc2V0LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNhYmxlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGVhcmRvd24gY29tcGxldGVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBlcmZvcm1EaXNwb3NlQXN5bmMoKTogUHJvbWlzYWJsZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBbiBhc3luYyBkaXNwb3NhYmxlIHRoYXQgZXhlY3V0ZXMgYSBjYWxsYmFjayB3aGVuIGRpc3Bvc2VkIHZpYSBgYXdhaXQgdXNpbmdgIChvciBhIG1hbnVhbFxuICogYGF3YWl0IGRpc3Bvc2FibGVbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKWApLlxuICovXG5leHBvcnQgY2xhc3MgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGUgZXh0ZW5kcyBBc3luY0Rpc3Bvc2FibGVCYXNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxsYmFjazogQXN5bmNEaXNwb3NlQ2FsbGJhY2s7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jYWxsYmFjayA9IHBhcmFtcy5jYWxsYmFjaztcbiAgICB0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID0gcGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID8/IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBkaXNwb3NlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNhbGxiYWNrIGNvbXBsZXRlcy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwZXJmb3JtRGlzcG9zZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2FsbGJhY2soKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3Bvc2VzIGEge0BsaW5rIERpc3Bvc2FibGV9LlxuICpcbiAqIFByZWZlciB0aGlzIG92ZXIgY2FsbGluZyBgZGlzcG9zYWJsZVtTeW1ib2wuZGlzcG9zZV0oKWAgYXQgdGhlIGNhbGwgc2l0ZTogaXQgcmVhZHMgYmV0dGVyIGFuZCBrZWVwcyB0aGVcbiAqIHdlbGwta25vd24gc3ltYm9sIHJlZmVyZW5jZWQgaW4gYSBzaW5nbGUgcGxhY2UuXG4gKlxuICogQHBhcmFtIGRpc3Bvc2FibGUgLSB0aGUgZGlzcG9zYWJsZSB0byBkaXNwb3NlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlKGRpc3Bvc2FibGU6IERpc3Bvc2FibGUpOiB2b2lkIHtcbiAgZGlzcG9zYWJsZVtTeW1ib2wuZGlzcG9zZV0oKTtcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGZvciBhIHtAbGluayBEaXNwb3NhYmxlRXh9OiBpdCBjYXJyaWVzIHRoZSByZS1kaXNwb3NlIGd1YXJkICh2aWEge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfSlcbiAqIGFuZCB0aGUge0BsaW5rIERpc3Bvc2FibGVFeC5kaXNwb3NlfSBhbGlhczsgYSBzdWJjbGFzcyBvbmx5IGltcGxlbWVudHMge0BsaW5rIERpc3Bvc2FibGVCYXNlLnBlcmZvcm1EaXNwb3NlfS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGVCYXNlIGltcGxlbWVudHMgRGlzcG9zYWJsZUV4IHtcbiAgLyoqXG4gICAqIEhvdyB0aGUgZGlzcG9zYWJsZSBiZWhhdmVzIHdoZW4gZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmV9XG4gICAqL1xuICBwcm90ZWN0ZWQgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID0gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZGlzcG9zYWJsZSBoYXMgYmVlbiBkaXNwb3NlZCAoaXRzIHRlYXJkb3duIGhhcyBydW4gYXQgbGVhc3Qgb25jZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBvbmNlIGRpc3Bvc2FsIGhhcyBzdGFydGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBpc0Rpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0Rpc3Bvc2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNEaXNwb3NlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBDb252ZW5pZW5jZSBhbGlhcyB0aGF0IGRlbGVnYXRlcyB0byBgdGhpc1tTeW1ib2wuZGlzcG9zZV0oKWAuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzW1N5bWJvbC5kaXNwb3NlXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QgYnkgcnVubmluZyB7QGxpbmsgRGlzcG9zYWJsZUJhc2UucGVyZm9ybURpc3Bvc2V9LCBob25vcmluZyB0aGUgY29uZmlndXJlZFxuICAgKiB7QGxpbmsgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9IG9uIGEgcmVwZWF0IGRpc3Bvc2UuXG4gICAqL1xuICBwdWJsaWMgW1N5bWJvbC5kaXNwb3NlXSgpOiB2b2lkIHtcbiAgICBpZiAoIXNob3VsZFBlcmZvcm1EaXNwb3NlKHRoaXMuX2lzRGlzcG9zZWQsIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5wZXJmb3JtRGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgdGVhcmRvd24uIENhbGxlZCBhdCBtb3N0IG9uY2UgdW5sZXNzIHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2V9IGlzIHNldC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwZXJmb3JtRGlzcG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgZGlzcG9zYWJsZSB0aGF0IGV4ZWN1dGVzIGEgY2FsbGJhY2sgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxiYWNrRGlzcG9zYWJsZSBleHRlbmRzIERpc3Bvc2FibGVCYXNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxsYmFjazogRGlzcG9zZUNhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBDYWxsYmFja0Rpc3Bvc2FibGV9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jYWxsYmFjayA9IHBhcmFtcy5jYWxsYmFjaztcbiAgICB0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID0gcGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID8/IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBkaXNwb3NlIGNhbGxiYWNrLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHBlcmZvcm1EaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FsbGJhY2soKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gdGhhdCBjb21iaW5lcyBtdWx0aXBsZSBhc3luYyBkaXNwb3NhYmxlcyBhbmQgZGlzcG9zZXMgYWxsIG9mIHRoZW0gd2hlbiBpdFxuICogaXMgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21iaW5lQXN5bmNEaXNwb3NhYmxlIGV4dGVuZHMgQXN5bmNEaXNwb3NhYmxlQmFzZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IHJlYWRvbmx5IEFzeW5jRGlzcG9zYWJsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2VPcmRlcjogRGlzcG9zZU9yZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I6IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ29tYmluZUFzeW5jRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNoaWxkcmVuID0gWy4uLnBhcmFtcy5hc3luY0Rpc3Bvc2FibGVzXTtcbiAgICB0aGlzLmRpc3Bvc2VPcmRlciA9IHBhcmFtcy5kaXNwb3NlT3JkZXIgPz8gRGlzcG9zZU9yZGVyLkxpZm87XG4gICAgdGhpcy5lcnJvckJlaGF2aW9yID0gcGFyYW1zLmVycm9yQmVoYXZpb3IgPz8gRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbiBpbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgRGlzcG9zZU9yZGVyfSwgYXBwbHlpbmcgdGhlIGNvbmZpZ3VyZWRcbiAgICoge0BsaW5rIERpc3Bvc2VFcnJvckJlaGF2aW9yfSB3aGVuIGEgY2hpbGQgdGhyb3dzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiBkaXNwb3NlZC5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwZXJmb3JtRGlzcG9zZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW107XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmdldE9yZGVyZWRDaGlsZHJlbigpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjaGlsZFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JCZWhhdmlvciA9PT0gRGlzcG9zZUVycm9yQmVoYXZpb3IuRmFpbEZhc3QpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IGNyZWF0ZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcmRlcmVkQ2hpbGRyZW4oKTogcmVhZG9ubHkgQXN5bmNEaXNwb3NhYmxlW10ge1xuICAgIHN3aXRjaCAodGhpcy5kaXNwb3NlT3JkZXIpIHtcbiAgICAgIGNhc2UgRGlzcG9zZU9yZGVyLkZpZm86IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW47XG4gICAgICB9XG4gICAgICBjYXNlIERpc3Bvc2VPcmRlci5MaWZvOiB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5jaGlsZHJlbl0ucmV2ZXJzZSgpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBhc3NlcnROZXZlcih0aGlzLmRpc3Bvc2VPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGlzcG9zYWJsZUV4fSB0aGF0IGNvbWJpbmVzIG11bHRpcGxlIGRpc3Bvc2FibGVzIGFuZCBkaXNwb3NlcyBhbGwgb2YgdGhlbSB3aGVuIGl0IGlzXG4gKiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbWJpbmVEaXNwb3NhYmxlIGV4dGVuZHMgRGlzcG9zYWJsZUJhc2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGNoaWxkcmVuOiByZWFkb25seSBEaXNwb3NhYmxlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcG9zZU9yZGVyOiBEaXNwb3NlT3JkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JCZWhhdmlvcjogRGlzcG9zZUVycm9yQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ29tYmluZURpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IFsuLi5wYXJhbXMuZGlzcG9zYWJsZXNdO1xuICAgIHRoaXMuZGlzcG9zZU9yZGVyID0gcGFyYW1zLmRpc3Bvc2VPcmRlciA/PyBEaXNwb3NlT3JkZXIuTGlmbztcbiAgICB0aGlzLmVycm9yQmVoYXZpb3IgPSBwYXJhbXMuZXJyb3JCZWhhdmlvciA/PyBEaXNwb3NlRXJyb3JCZWhhdmlvci5BZ2dyZWdhdGU7XG4gICAgdGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA9IHBhcmFtcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA/PyBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmU7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgYWxsIGNvbWJpbmVkIGNoaWxkcmVuIGluIHRoZSBjb25maWd1cmVkIHtAbGluayBEaXNwb3NlT3JkZXJ9LCBhcHBseWluZyB0aGUgY29uZmlndXJlZFxuICAgKiB7QGxpbmsgRGlzcG9zZUVycm9yQmVoYXZpb3J9IHdoZW4gYSBjaGlsZCB0aHJvd3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGVyZm9ybURpc3Bvc2UoKTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuZ2V0T3JkZXJlZENoaWxkcmVuKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNoaWxkW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JCZWhhdmlvciA9PT0gRGlzcG9zZUVycm9yQmVoYXZpb3IuRmFpbEZhc3QpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IGNyZWF0ZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcmRlcmVkQ2hpbGRyZW4oKTogcmVhZG9ubHkgRGlzcG9zYWJsZVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMuZGlzcG9zZU9yZGVyKSB7XG4gICAgICBjYXNlIERpc3Bvc2VPcmRlci5GaWZvOiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuO1xuICAgICAgfVxuICAgICAgY2FzZSBEaXNwb3NlT3JkZXIuTGlmbzoge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuY2hpbGRyZW5dLnJldmVyc2UoKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy5kaXNwb3NlT3JkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERpc3Bvc2VzIGFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9LlxuICpcbiAqIFByZWZlciB0aGlzIG92ZXIgY2FsbGluZyBgYXN5bmNEaXNwb3NhYmxlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKClgIGF0IHRoZSBjYWxsIHNpdGU6IGl0IHJlYWRzIGJldHRlciBhbmRcbiAqIGtlZXBzIHRoZSB3ZWxsLWtub3duIHN5bWJvbCByZWZlcmVuY2VkIGluIGEgc2luZ2xlIHBsYWNlLlxuICpcbiAqIEBwYXJhbSBhc3luY0Rpc3Bvc2FibGUgLSB0aGUgYXN5bmMgZGlzcG9zYWJsZSB0byBkaXNwb3NlXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGRpc3Bvc2FsIGNvbXBsZXRlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2VBc3luYyhhc3luY0Rpc3Bvc2FibGU6IEFzeW5jRGlzcG9zYWJsZSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhc3luY0Rpc3Bvc2FibGVbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlfSBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtICR1bmtub3duIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBc3luY0Rpc3Bvc2FibGUoJHVua25vd246IHVua25vd24pOiAkdW5rbm93biBpcyBBc3luY0Rpc3Bvc2FibGUge1xuICBjb25zdCBhc3luY0Rpc3Bvc2FibGUgPSAkdW5rbm93biBhcyBQYXJ0aWFsPEFzeW5jRGlzcG9zYWJsZT47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLWNvbXB1dGVkLXByb3BlcnR5LWV4aXN0ZW5jZS1jaGVjayAtLSBgT2JqZWN0Lmhhc093bmAgaXMgb3duLXByb3BlcnR5LW9ubHksIGFuZCBgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdYCBpcyBhIHByb3RvdHlwZSBtZXRob2Qgb24gZXZlcnkgY2xhc3MtYmFzZWQgZGlzcG9zYWJsZSBoZXJlLlxuICByZXR1cm4gISFhc3luY0Rpc3Bvc2FibGVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtICR1bmtub3duIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXN5bmNEaXNwb3NhYmxlRXgoJHVua25vd246IHVua25vd24pOiAkdW5rbm93biBpcyBBc3luY0Rpc3Bvc2FibGVFeCB7XG4gIGNvbnN0IGFzeW5jRGlzcG9zYWJsZUV4ID0gJHVua25vd24gYXMgUGFydGlhbDxBc3luY0Rpc3Bvc2FibGVFeD47XG4gIHJldHVybiBpc0FzeW5jRGlzcG9zYWJsZSgkdW5rbm93bikgJiYgdHlwZW9mIGFzeW5jRGlzcG9zYWJsZUV4LmFzeW5jRGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgRGlzcG9zYWJsZX0gaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSAkdW5rbm93biAtIHRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIHRoZSB7QGxpbmsgRGlzcG9zYWJsZX0gaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIERpc3Bvc2FibGV9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEaXNwb3NhYmxlKCR1bmtub3duOiB1bmtub3duKTogJHVua25vd24gaXMgRGlzcG9zYWJsZSB7XG4gIGNvbnN0IGRpc3Bvc2FibGUgPSAkdW5rbm93biBhcyBQYXJ0aWFsPERpc3Bvc2FibGU+O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1jb21wdXRlZC1wcm9wZXJ0eS1leGlzdGVuY2UtY2hlY2sgLS0gYE9iamVjdC5oYXNPd25gIGlzIG93bi1wcm9wZXJ0eS1vbmx5LCBhbmQgYFtTeW1ib2wuZGlzcG9zZV1gIGlzIGEgcHJvdG90eXBlIG1ldGhvZCBvbiBldmVyeSBjbGFzcy1iYXNlZCBkaXNwb3NhYmxlIGhlcmUuXG4gIHJldHVybiAhIWRpc3Bvc2FibGVbU3ltYm9sLmRpc3Bvc2VdO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBEaXNwb3NhYmxlRXh9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gJHVua25vd24gLSB0aGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUge0BsaW5rIERpc3Bvc2FibGVFeH0gaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIERpc3Bvc2FibGVFeH0gaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc3Bvc2FibGVFeCgkdW5rbm93bjogdW5rbm93bik6ICR1bmtub3duIGlzIERpc3Bvc2FibGVFeCB7XG4gIGNvbnN0IGRpc3Bvc2FibGVFeCA9ICR1bmtub3duIGFzIFBhcnRpYWw8RGlzcG9zYWJsZUV4PjtcbiAgcmV0dXJuIGlzRGlzcG9zYWJsZSgkdW5rbm93bikgJiYgdHlwZW9mIGRpc3Bvc2FibGVFeC5kaXNwb3NlID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIEFkYXB0cyBhIHBsYWluIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludG8gYW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSBieSBhZGRpbmcgYSBjb252ZW5pZW5jZVxuICoge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4LmFzeW5jRGlzcG9zZX0gbWV0aG9kIHRoYXQgZGVsZWdhdGVzIHRvIGBTeW1ib2wuYXN5bmNEaXNwb3NlYC5cbiAqXG4gKiBJZiB0aGUgb2JqZWN0IGFscmVhZHkgaW1wbGVtZW50cyB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9LCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIGFzeW5jRGlzcG9zYWJsZSAtIHRoZSBhc3luYyBkaXNwb3NhYmxlIHRvIGFkYXB0XG4gKiBAcmV0dXJucyBBbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IHdyYXBwaW5nIHRoZSBhc3luYyBkaXNwb3NhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Bc3luY0Rpc3Bvc2FibGVFeChhc3luY0Rpc3Bvc2FibGU6IEFzeW5jRGlzcG9zYWJsZSk6IEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgcmV0dXJuIGlzQXN5bmNEaXNwb3NhYmxlRXgoYXN5bmNEaXNwb3NhYmxlKVxuICAgID8gYXN5bmNEaXNwb3NhYmxlXG4gICAgOiB7XG4gICAgICBhc3luY0Rpc3Bvc2U6IGFzeW5jRGlzcG9zZUFkYXB0ZWQsXG4gICAgICBbU3ltYm9sLmFzeW5jRGlzcG9zZV06IGFzeW5jRGlzcG9zZUFkYXB0ZWRcbiAgICB9O1xuXG4gIGZ1bmN0aW9uIGFzeW5jRGlzcG9zZUFkYXB0ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGRpc3Bvc2VBc3luYyhhc3luY0Rpc3Bvc2FibGUpO1xuICB9XG59XG5cbi8qKlxuICogQWRhcHRzIGEgcGxhaW4ge0BsaW5rIERpc3Bvc2FibGV9IGludG8gYSB7QGxpbmsgRGlzcG9zYWJsZUV4fSBieSBhZGRpbmcgYSBjb252ZW5pZW5jZVxuICoge0BsaW5rIERpc3Bvc2FibGVFeC5kaXNwb3NlfSBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gYFN5bWJvbC5kaXNwb3NlYC5cbiAqXG4gKiBJZiB0aGUgb2JqZWN0IGFscmVhZHkgaW1wbGVtZW50cyB7QGxpbmsgRGlzcG9zYWJsZUV4fSwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBkaXNwb3NhYmxlIC0gdGhlIGRpc3Bvc2FibGUgdG8gYWRhcHRcbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGVFeH0gd3JhcHBpbmcgdGhlIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGVFeChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZUV4IHtcbiAgcmV0dXJuIGlzRGlzcG9zYWJsZUV4KGRpc3Bvc2FibGUpXG4gICAgPyBkaXNwb3NhYmxlXG4gICAgOiB7XG4gICAgICBkaXNwb3NlOiBkaXNwb3NlQWRhcHRlZCxcbiAgICAgIFtTeW1ib2wuZGlzcG9zZV06IGRpc3Bvc2VBZGFwdGVkXG4gICAgfTtcblxuICBmdW5jdGlvbiBkaXNwb3NlQWRhcHRlZCgpOiB2b2lkIHtcbiAgICBkaXNwb3NlKGRpc3Bvc2FibGUpO1xuICB9XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgZGlzcG9zYWJsZSdzIHRlYXJkb3duIHNob3VsZCBydW4gb24gdGhlIGN1cnJlbnQgZGlzcG9zZSBjYWxsLCBhcHBseWluZyB0aGVcbiAqIHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcn0gcmUtZGlzcG9zZSBwb2xpY3kuIFNpbmdsZSBzb3VyY2Ugb2YgdGhlIGd1YXJkIHNoYXJlZCBieVxuICoge0BsaW5rIERpc3Bvc2FibGVCYXNlfSBhbmQge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUJhc2V9LlxuICpcbiAqIEBwYXJhbSBpc0Rpc3Bvc2VkIC0gV2hldGhlciB0aGUgZGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIG9uY2UuXG4gKiBAcGFyYW0gbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgLSBUaGUgcmUtZGlzcG9zZSBiZWhhdmlvci5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB0ZWFyZG93biBzaG91bGQgcnVuLCBgZmFsc2VgIHdoZW4gaXQgc2hvdWxkIGJlIHNraXBwZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFBlcmZvcm1EaXNwb3NlKGlzRGlzcG9zZWQ6IGJvb2xlYW4sIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcik6IGJvb2xlYW4ge1xuICBpZiAoIWlzRGlzcG9zZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN3aXRjaCAobXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpIHtcbiAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZToge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZToge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBkaXNwb3NhYmxlIGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuJyk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKTtcbiAgICB9XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLDZCQUFxQztBQUNyQyx5QkFBNEI7QUFNckIsSUFBSyx1QkFBTCxrQkFBS0EsMEJBQUw7QUFLTCxFQUFBQSw0Q0FBQTtBQUtBLEVBQUFBLDRDQUFBO0FBVlUsU0FBQUE7QUFBQSxHQUFBO0FBaUJMLElBQUssZUFBTCxrQkFBS0Msa0JBQUw7QUFLTCxFQUFBQSw0QkFBQTtBQUtBLEVBQUFBLDRCQUFBO0FBVlUsU0FBQUE7QUFBQSxHQUFBO0FBaUJMLElBQUssMEJBQUwsa0JBQUtDLDZCQUFMO0FBSUwsRUFBQUEsa0RBQUE7QUFLQSxFQUFBQSxrREFBQTtBQUtBLEVBQUFBLGtEQUFBO0FBZFUsU0FBQUE7QUFBQSxHQUFBO0FBeUpMLE1BQWUsb0JBQWlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTTNELDBCQUFtRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU83RCxJQUFjLGFBQXNCO0FBQ2xDLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQUVRLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPZixlQUE4QjtBQUNuQyxXQUFPLEtBQUssT0FBTyxZQUFZLEVBQUU7QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsT0FBYyxPQUFPLFlBQVksSUFBbUI7QUFDbEQsUUFBSSxDQUFDLHFCQUFxQixLQUFLLGFBQWEsS0FBSyx1QkFBdUIsR0FBRztBQUN6RTtBQUFBLElBQ0Y7QUFFQSxTQUFLLGNBQWM7QUFDbkIsVUFBTSxLQUFLLG9CQUFvQjtBQUFBLEVBQ2pDO0FBUUY7QUFNTyxNQUFNLGdDQUFnQyxvQkFBb0I7QUFBQSxFQUM5QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBa0Q7QUFDbkUsVUFBTTtBQUNOLFNBQUssV0FBVyxPQUFPO0FBQ3ZCLFNBQUssMEJBQTBCLE9BQU8sMkJBQTJCO0FBQUEsRUFDbkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUF5QixzQkFBcUM7QUFDNUQsVUFBTSxLQUFLLFNBQVM7QUFBQSxFQUN0QjtBQUNGO0FBVU8sU0FBUyxRQUFRLFlBQThCO0FBQ3BELGFBQVcsT0FBTyxPQUFPLEVBQUU7QUFDN0I7QUFNTyxNQUFlLGVBQXVDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTWpELDBCQUFtRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU83RCxJQUFjLGFBQXNCO0FBQ2xDLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQUVRLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtmLFVBQWdCO0FBQ3JCLFNBQUssT0FBTyxPQUFPLEVBQUU7QUFBQSxFQUN2QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxDQUFRLE9BQU8sT0FBTyxJQUFVO0FBQzlCLFFBQUksQ0FBQyxxQkFBcUIsS0FBSyxhQUFhLEtBQUssdUJBQXVCLEdBQUc7QUFDekU7QUFBQSxJQUNGO0FBRUEsU0FBSyxjQUFjO0FBQ25CLFNBQUssZUFBZTtBQUFBLEVBQ3RCO0FBTUY7QUFLTyxNQUFNLDJCQUEyQixlQUFlO0FBQUEsRUFDcEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQTZDO0FBQzlELFVBQU07QUFDTixTQUFLLFdBQVcsT0FBTztBQUN2QixTQUFLLDBCQUEwQixPQUFPLDJCQUEyQjtBQUFBLEVBQ25FO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbUIsaUJBQXVCO0FBQ3hDLFNBQUssU0FBUztBQUFBLEVBQ2hCO0FBQ0Y7QUFNTyxNQUFNLCtCQUErQixvQkFBb0I7QUFBQSxFQUM3QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1YsWUFBWSxRQUFpRDtBQUNsRSxVQUFNO0FBQ04sU0FBSyxXQUFXLENBQUMsR0FBRyxPQUFPLGdCQUFnQjtBQUMzQyxTQUFLLGVBQWUsT0FBTyxnQkFBZ0I7QUFDM0MsU0FBSyxnQkFBZ0IsT0FBTyxpQkFBaUI7QUFDN0MsU0FBSywwQkFBMEIsT0FBTywyQkFBMkI7QUFBQSxFQUNuRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBeUIsc0JBQXFDO0FBQzVELFVBQU0sU0FBb0IsQ0FBQztBQUMzQixlQUFXLFNBQVMsS0FBSyxtQkFBbUIsR0FBRztBQUM3QyxVQUFJO0FBQ0YsY0FBTSxNQUFNLE9BQU8sWUFBWSxFQUFFO0FBQUEsTUFDbkMsU0FBUyxPQUFPO0FBQ2QsWUFBSSxLQUFLLGtCQUFrQixrQkFBK0I7QUFDeEQsZ0JBQU07QUFBQSxRQUNSO0FBRUEsZUFBTyxLQUFLLEtBQUs7QUFBQSxNQUNuQjtBQUFBLElBQ0Y7QUFFQSxRQUFJLE9BQU8sU0FBUyxHQUFHO0FBQ3JCLGdCQUFNLDZDQUFxQixNQUFNO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBQUEsRUFFUSxxQkFBaUQ7QUFDdkQsWUFBUSxLQUFLLGNBQWM7QUFBQSxNQUN6QixLQUFLLGNBQW1CO0FBQ3RCLGVBQU8sS0FBSztBQUFBLE1BQ2Q7QUFBQSxNQUNBLEtBQUssY0FBbUI7QUFDdEIsZUFBTyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsUUFBUTtBQUFBLE1BQ3BDO0FBQUEsTUFDQSxTQUFTO0FBQ1AsNENBQVksS0FBSyxZQUFZO0FBQUEsTUFDL0I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBTU8sTUFBTSwwQkFBMEIsZUFBZTtBQUFBLEVBQ25DO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQTRDO0FBQzdELFVBQU07QUFDTixTQUFLLFdBQVcsQ0FBQyxHQUFHLE9BQU8sV0FBVztBQUN0QyxTQUFLLGVBQWUsT0FBTyxnQkFBZ0I7QUFDM0MsU0FBSyxnQkFBZ0IsT0FBTyxpQkFBaUI7QUFDN0MsU0FBSywwQkFBMEIsT0FBTywyQkFBMkI7QUFBQSxFQUNuRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNbUIsaUJBQXVCO0FBQ3hDLFVBQU0sU0FBb0IsQ0FBQztBQUMzQixlQUFXLFNBQVMsS0FBSyxtQkFBbUIsR0FBRztBQUM3QyxVQUFJO0FBQ0YsY0FBTSxPQUFPLE9BQU8sRUFBRTtBQUFBLE1BQ3hCLFNBQVMsT0FBTztBQUNkLFlBQUksS0FBSyxrQkFBa0Isa0JBQStCO0FBQ3hELGdCQUFNO0FBQUEsUUFDUjtBQUVBLGVBQU8sS0FBSyxLQUFLO0FBQUEsTUFDbkI7QUFBQSxJQUNGO0FBRUEsUUFBSSxPQUFPLFNBQVMsR0FBRztBQUNyQixnQkFBTSw2Q0FBcUIsTUFBTTtBQUFBLElBQ25DO0FBQUEsRUFDRjtBQUFBLEVBRVEscUJBQTRDO0FBQ2xELFlBQVEsS0FBSyxjQUFjO0FBQUEsTUFDekIsS0FBSyxjQUFtQjtBQUN0QixlQUFPLEtBQUs7QUFBQSxNQUNkO0FBQUEsTUFDQSxLQUFLLGNBQW1CO0FBQ3RCLGVBQU8sQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLFFBQVE7QUFBQSxNQUNwQztBQUFBLE1BQ0EsU0FBUztBQUNQLDRDQUFZLEtBQUssWUFBWTtBQUFBLE1BQy9CO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQVdBLGVBQXNCLGFBQWEsaUJBQWlEO0FBQ2xGLFFBQU0sZ0JBQWdCLE9BQU8sWUFBWSxFQUFFO0FBQzdDO0FBUU8sU0FBUyxrQkFBa0IsVUFBZ0Q7QUFDaEYsUUFBTSxrQkFBa0I7QUFFeEIsU0FBTyxDQUFDLENBQUMsZ0JBQWdCLE9BQU8sWUFBWTtBQUM5QztBQVFPLFNBQVMsb0JBQW9CLFVBQWtEO0FBQ3BGLFFBQU0sb0JBQW9CO0FBQzFCLFNBQU8sa0JBQWtCLFFBQVEsS0FBSyxPQUFPLGtCQUFrQixpQkFBaUI7QUFDbEY7QUFRTyxTQUFTLGFBQWEsVUFBMkM7QUFDdEUsUUFBTSxhQUFhO0FBRW5CLFNBQU8sQ0FBQyxDQUFDLFdBQVcsT0FBTyxPQUFPO0FBQ3BDO0FBUU8sU0FBUyxlQUFlLFVBQTZDO0FBQzFFLFFBQU0sZUFBZTtBQUNyQixTQUFPLGFBQWEsUUFBUSxLQUFLLE9BQU8sYUFBYSxZQUFZO0FBQ25FO0FBV08sU0FBUyxvQkFBb0IsaUJBQXFEO0FBQ3ZGLFNBQU8sb0JBQW9CLGVBQWUsSUFDdEMsa0JBQ0E7QUFBQSxJQUNBLGNBQWM7QUFBQSxJQUNkLENBQUMsT0FBTyxZQUFZLEdBQUc7QUFBQSxFQUN6QjtBQUVGLFdBQVMsc0JBQXFDO0FBQzVDLFdBQU8sYUFBYSxlQUFlO0FBQUEsRUFDckM7QUFDRjtBQVdPLFNBQVMsZUFBZSxZQUFzQztBQUNuRSxTQUFPLGVBQWUsVUFBVSxJQUM1QixhQUNBO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxDQUFDLE9BQU8sT0FBTyxHQUFHO0FBQUEsRUFDcEI7QUFFRixXQUFTLGlCQUF1QjtBQUM5QixZQUFRLFVBQVU7QUFBQSxFQUNwQjtBQUNGO0FBV0EsU0FBUyxxQkFBcUIsWUFBcUIseUJBQTJEO0FBQzVHLE1BQUksQ0FBQyxZQUFZO0FBQ2YsV0FBTztBQUFBLEVBQ1Q7QUFFQSxVQUFRLHlCQUF5QjtBQUFBLElBQy9CLEtBQUssZ0JBQWdDO0FBQ25DLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxLQUFLLGdCQUFnQztBQUNuQyxhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsS0FBSyxlQUErQjtBQUNsQyxZQUFNLElBQUksTUFBTSw0Q0FBNEM7QUFBQSxJQUM5RDtBQUFBLElBQ0EsU0FBUztBQUNQLDBDQUFZLHVCQUF1QjtBQUFBLElBQ3JDO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogWyJEaXNwb3NlRXJyb3JCZWhhdmlvciIsICJEaXNwb3NlT3JkZXIiLCAiTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IiXQp9Cg==
|