obsidian-dev-utils 46.4.0 → 46.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/dist/lib/cjs/Library.cjs +1 -1
- package/dist/lib/cjs/obsidian/FileChange.cjs +55 -14
- package/dist/lib/cjs/obsidian/FileChange.d.cts +29 -2
- package/dist/lib/cjs/obsidian/Link.cjs +9 -4
- package/dist/lib/cjs/obsidian/Reference.cjs +1 -1
- package/dist/lib/cjs/obsidian/Reference.d.cts +14 -0
- package/dist/lib/esm/Library.mjs +1 -1
- package/dist/lib/esm/obsidian/FileChange.d.mts +29 -2
- package/dist/lib/esm/obsidian/FileChange.mjs +55 -14
- package/dist/lib/esm/obsidian/Link.mjs +12 -5
- package/dist/lib/esm/obsidian/Reference.d.mts +14 -0
- package/dist/lib/esm/obsidian/Reference.mjs +1 -1
- package/package.json +3 -3
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Contains utility types and functions for handling file changes in Obsidian.
|
|
5
5
|
*/
|
|
6
|
-
import type { App, FrontmatterLinkCache, Reference, ReferenceCache } from 'obsidian';
|
|
6
|
+
import type { App, FrontmatterLinkCache, Reference, ReferenceCache, TFile } from 'obsidian';
|
|
7
|
+
import type { CanvasData } from 'obsidian/Canvas.d.mjs';
|
|
7
8
|
import type { ValueProvider } from '../ValueProvider.mjs';
|
|
8
9
|
import type { PathOrFile } from './FileSystem.mjs';
|
|
9
10
|
import type { FrontmatterLinkCacheWithOffsets } from './FrontmatterLinkCacheWithOffsets.mjs';
|
|
10
|
-
import type { CanvasFileNodeReference, CanvasReference, CanvasTextNodeReference } from './Reference.mjs';
|
|
11
|
+
import type { AdvancedCanvasReference, CanvasFileNodeReference, CanvasReference, CanvasTextNodeReference } from './Reference.mjs';
|
|
11
12
|
import type { ProcessOptions } from './Vault.mjs';
|
|
12
13
|
/**
|
|
13
14
|
* A file change in the vault.
|
|
@@ -26,6 +27,9 @@ export interface FileChange {
|
|
|
26
27
|
*/
|
|
27
28
|
reference: Reference;
|
|
28
29
|
}
|
|
30
|
+
type AdvancedCanvasChange = {
|
|
31
|
+
reference: AdvancedCanvasReference;
|
|
32
|
+
} & FileChange;
|
|
29
33
|
type CanvasChange = {
|
|
30
34
|
reference: CanvasReference;
|
|
31
35
|
} & FileChange;
|
|
@@ -67,6 +71,13 @@ export declare function applyContentChanges(abortSignal: AbortSignal, content: s
|
|
|
67
71
|
* @returns A {@link Promise} that resolves when the file changes have been successfully applied.
|
|
68
72
|
*/
|
|
69
73
|
export declare function applyFileChanges(app: App, pathOrFile: PathOrFile, changesProvider: ValueProvider<FileChange[] | null, [content: string]>, processOptions?: ProcessOptions, shouldRetryOnInvalidChanges?: boolean): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Checks if a file change is a change from `Advanced Canvas` plugin.
|
|
76
|
+
*
|
|
77
|
+
* @param change - The file change to check.
|
|
78
|
+
* @returns Whether the file change is a change from `Advanced Canvas` plugin.
|
|
79
|
+
*/
|
|
80
|
+
export declare function isAdvancedCanvasChange(change: FileChange): change is AdvancedCanvasChange;
|
|
70
81
|
/**
|
|
71
82
|
* Checks if a file change is a canvas change.
|
|
72
83
|
*
|
|
@@ -109,6 +120,22 @@ export declare function isFrontmatterChange(fileChange: FileChange): fileChange
|
|
|
109
120
|
* @returns A boolean indicating whether the file change is a frontmatter change with offsets.
|
|
110
121
|
*/
|
|
111
122
|
export declare function isFrontmatterChangeWithOffsets(fileChange: FileChange): fileChange is FrontmatterChangeWithOffsets;
|
|
123
|
+
/**
|
|
124
|
+
* Parses the canvas data from the content.
|
|
125
|
+
*
|
|
126
|
+
* @param content - The content to parse the canvas data from.
|
|
127
|
+
* @returns The parsed canvas data.
|
|
128
|
+
*/
|
|
129
|
+
export declare function parseCanvasData(content: string): CanvasData;
|
|
130
|
+
/**
|
|
131
|
+
* Converts a change from `Advanced Canvas` plugin to a canvas change.
|
|
132
|
+
*
|
|
133
|
+
* @param app - The Obsidian app instance.
|
|
134
|
+
* @param file - The file to convert the change from.
|
|
135
|
+
* @param change - The change from `Advanced Canvas` plugin to convert.
|
|
136
|
+
* @returns The converted change.
|
|
137
|
+
*/
|
|
138
|
+
export declare function toCanvasChange(app: App, file: TFile, change: AdvancedCanvasChange): Promise<CanvasChange>;
|
|
112
139
|
/**
|
|
113
140
|
* Converts a frontmatter change to a frontmatter change with offsets.
|
|
114
141
|
*
|
|
@@ -43,6 +43,10 @@ import {
|
|
|
43
43
|
isFrontmatterLinkCacheWithOffsets,
|
|
44
44
|
toFrontmatterLinkCacheWithOffsets
|
|
45
45
|
} from "./FrontmatterLinkCacheWithOffsets.mjs";
|
|
46
|
+
import {
|
|
47
|
+
getAllLinks,
|
|
48
|
+
parseMetadata
|
|
49
|
+
} from "./MetadataCache.mjs";
|
|
46
50
|
import {
|
|
47
51
|
isCanvasReference,
|
|
48
52
|
referenceToFileChange
|
|
@@ -73,6 +77,9 @@ async function applyFileChanges(app, pathOrFile, changesProvider, processOptions
|
|
|
73
77
|
return await applyContentChanges(abortSignal, content, getPath(app, pathOrFile), changesProvider, shouldRetryOnInvalidChanges);
|
|
74
78
|
}, processOptions);
|
|
75
79
|
}
|
|
80
|
+
function isAdvancedCanvasChange(change) {
|
|
81
|
+
return isReferenceCache(change.reference) && "nodeId" in change.reference.position;
|
|
82
|
+
}
|
|
76
83
|
function isCanvasChange(change) {
|
|
77
84
|
return isCanvasReference(change.reference);
|
|
78
85
|
}
|
|
@@ -91,6 +98,49 @@ function isFrontmatterChange(fileChange) {
|
|
|
91
98
|
function isFrontmatterChangeWithOffsets(fileChange) {
|
|
92
99
|
return isFrontmatterLinkCacheWithOffsets(fileChange.reference);
|
|
93
100
|
}
|
|
101
|
+
function parseCanvasData(content) {
|
|
102
|
+
let parsed;
|
|
103
|
+
try {
|
|
104
|
+
parsed = JSON.parse(content);
|
|
105
|
+
} catch {
|
|
106
|
+
parsed = null;
|
|
107
|
+
}
|
|
108
|
+
if (parsed === null || typeof parsed !== "object") {
|
|
109
|
+
parsed = {};
|
|
110
|
+
}
|
|
111
|
+
return parsed;
|
|
112
|
+
}
|
|
113
|
+
async function toCanvasChange(app, file, change) {
|
|
114
|
+
const content = await app.vault.cachedRead(file);
|
|
115
|
+
const canvasData = parseCanvasData(content);
|
|
116
|
+
const nodeIndex = canvasData.nodes.findIndex((node2) => node2.id === change.reference.position.nodeId);
|
|
117
|
+
if (nodeIndex === -1) {
|
|
118
|
+
throw new Error(`Node ${change.reference.position.nodeId} not found`);
|
|
119
|
+
}
|
|
120
|
+
const node = canvasData.nodes[nodeIndex];
|
|
121
|
+
if (!node) {
|
|
122
|
+
throw new Error(`Node ${change.reference.position.nodeId} not found`);
|
|
123
|
+
}
|
|
124
|
+
if (typeof node.text !== "string") {
|
|
125
|
+
throw new Error(`Node ${change.reference.position.nodeId} is not a text node`);
|
|
126
|
+
}
|
|
127
|
+
const metadata = await parseMetadata(app, node.text);
|
|
128
|
+
const links = getAllLinks(metadata);
|
|
129
|
+
const linkIndex = links.findIndex((link) => link.original === change.reference.original);
|
|
130
|
+
if (linkIndex === -1) {
|
|
131
|
+
throw new Error(`Link ${change.reference.link} not found`);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
...change,
|
|
135
|
+
reference: {
|
|
136
|
+
...change.reference,
|
|
137
|
+
isCanvas: true,
|
|
138
|
+
key: `nodes.${String(nodeIndex)}.text.${String(linkIndex)}`,
|
|
139
|
+
nodeIndex,
|
|
140
|
+
type: "file"
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
94
144
|
function toFrontmatterChangeWithOffsets(fileChange) {
|
|
95
145
|
if (isFrontmatterChangeWithOffsets(fileChange)) {
|
|
96
146
|
return fileChange;
|
|
@@ -106,7 +156,7 @@ async function applyCanvasChanges(abortSignal, content, path, changesProvider, s
|
|
|
106
156
|
if (changes === null) {
|
|
107
157
|
return null;
|
|
108
158
|
}
|
|
109
|
-
const canvasData =
|
|
159
|
+
const canvasData = parseCanvasData(content);
|
|
110
160
|
const canvasTextChanges = /* @__PURE__ */ new Map();
|
|
111
161
|
for (const change of changes) {
|
|
112
162
|
if (!isCanvasChange(change)) {
|
|
@@ -276,18 +326,6 @@ function parseFrontmatterSafely(content, path) {
|
|
|
276
326
|
}
|
|
277
327
|
return { frontmatter, hasFrontmatterError };
|
|
278
328
|
}
|
|
279
|
-
function parseJsonSafe(content) {
|
|
280
|
-
let parsed;
|
|
281
|
-
try {
|
|
282
|
-
parsed = JSON.parse(content);
|
|
283
|
-
} catch {
|
|
284
|
-
parsed = null;
|
|
285
|
-
}
|
|
286
|
-
if (parsed === null || typeof parsed !== "object") {
|
|
287
|
-
parsed = {};
|
|
288
|
-
}
|
|
289
|
-
return parsed;
|
|
290
|
-
}
|
|
291
329
|
function sortAndFilterChanges(changes) {
|
|
292
330
|
changes.sort((a, b) => {
|
|
293
331
|
if (isContentChange(a) && isContentChange(b)) {
|
|
@@ -367,12 +405,15 @@ function validateChanges(changes, content, frontmatter, path) {
|
|
|
367
405
|
export {
|
|
368
406
|
applyContentChanges,
|
|
369
407
|
applyFileChanges,
|
|
408
|
+
isAdvancedCanvasChange,
|
|
370
409
|
isCanvasChange,
|
|
371
410
|
isCanvasFileNodeChange,
|
|
372
411
|
isCanvasTextNodeChange,
|
|
373
412
|
isContentChange,
|
|
374
413
|
isFrontmatterChange,
|
|
375
414
|
isFrontmatterChangeWithOffsets,
|
|
415
|
+
parseCanvasData,
|
|
416
|
+
toCanvasChange,
|
|
376
417
|
toFrontmatterChangeWithOffsets
|
|
377
418
|
};
|
|
378
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0ZpbGVDaGFuZ2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSB0eXBlcyBhbmQgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBmaWxlIGNoYW5nZXMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEZyb250bWF0dGVyTGlua0NhY2hlLFxuICBSZWZlcmVuY2UsXG4gIFJlZmVyZW5jZUNhY2hlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgQ2FudmFzRGF0YSB9IGZyb20gJ29ic2lkaWFuL0NhbnZhcy5kLnRzJztcblxuaW1wb3J0IHtcbiAgaXNGcm9udG1hdHRlckxpbmtDYWNoZSxcbiAgaXNSZWZlcmVuY2VDYWNoZVxufSBmcm9tICdvYnNpZGlhbi10eXBpbmdzL2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL09iamVjdFV0aWxzLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVQcm92aWRlciB9IGZyb20gJy4uL1ZhbHVlUHJvdmlkZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRGcm9udG1hdHRlciB9IGZyb20gJy4vRnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzIH0gZnJvbSAnLi9Gcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UsXG4gIENhbnZhc1JlZmVyZW5jZSxcbiAgQ2FudmFzVGV4dE5vZGVSZWZlcmVuY2Vcbn0gZnJvbSAnLi9SZWZlcmVuY2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzT3B0aW9ucyB9IGZyb20gJy4vVmF1bHQudHMnO1xuXG5pbXBvcnQgeyBnZXRMaWJEZWJ1Z2dlciB9IGZyb20gJy4uL0RlYnVnLnRzJztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICcuLi9FcnJvci50cyc7XG5pbXBvcnQge1xuICBkZWVwRXF1YWwsXG4gIGdldE5lc3RlZFByb3BlcnR5VmFsdWUsXG4gIHNldE5lc3RlZFByb3BlcnR5VmFsdWVcbn0gZnJvbSAnLi4vT2JqZWN0VXRpbHMudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5pbXBvcnQge1xuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGVcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIHBhcnNlRnJvbnRtYXR0ZXIsXG4gIHNldEZyb250bWF0dGVyXG59IGZyb20gJy4vRnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHtcbiAgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzLFxuICB0b0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHNcbn0gZnJvbSAnLi9Gcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzLnRzJztcbmltcG9ydCB7XG4gIGlzQ2FudmFzUmVmZXJlbmNlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9SZWZlcmVuY2UudHMnO1xuaW1wb3J0IHsgcHJvY2VzcyB9IGZyb20gJy4vVmF1bHQudHMnO1xuXG4vKipcbiAqIEEgZmlsZSBjaGFuZ2UgaW4gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaGFuZ2Uge1xuICAvKipcbiAgICogQSBuZXcgY29udGVudCB0byByZXBsYWNlIHRoZSBvbGQgY29udGVudC5cbiAgICovXG4gIG5ld0NvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb2xkIGNvbnRlbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkLlxuICAgKi9cbiAgb2xkQ29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhdXNlZCB0aGUgY2hhbmdlLlxuICAgKi9cbiAgcmVmZXJlbmNlOiBSZWZlcmVuY2U7XG59XG50eXBlIENhbnZhc0NoYW5nZSA9IHsgcmVmZXJlbmNlOiBDYW52YXNSZWZlcmVuY2UgfSAmIEZpbGVDaGFuZ2U7XG50eXBlIENhbnZhc0ZpbGVOb2RlQ2hhbmdlID0geyByZWZlcmVuY2U6IENhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlIH0gJiBGaWxlQ2hhbmdlO1xudHlwZSBDYW52YXNUZXh0Tm9kZUNoYW5nZSA9IHsgcmVmZXJlbmNlOiBDYW52YXNUZXh0Tm9kZVJlZmVyZW5jZSB9ICYgRmlsZUNoYW5nZTtcbnR5cGUgQ29udGVudENoYW5nZSA9IHsgcmVmZXJlbmNlOiBSZWZlcmVuY2VDYWNoZSB9ICYgRmlsZUNoYW5nZTtcbnR5cGUgRnJvbnRtYXR0ZXJDaGFuZ2UgPSB7IHJlZmVyZW5jZTogRnJvbnRtYXR0ZXJMaW5rQ2FjaGUgfSAmIEZpbGVDaGFuZ2U7XG50eXBlIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMgPSB7IHJlZmVyZW5jZTogRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyB9ICYgRmlsZUNoYW5nZTtcblxuLyoqXG4gKiBBcHBsaWVzIGEgc2VyaWVzIG9mIGNvbnRlbnQgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICogQHBhcmFtIGNvbnRlbnQgLSBUaGUgY29udGVudCB0byB3aGljaCB0aGUgY2hhbmdlcyBzaG91bGQgYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gd2hpY2ggdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gY2hhbmdlc1Byb3ZpZGVyIC0gQSBwcm92aWRlciB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgY29udGVudCBjaGFuZ2VzIHRvIGFwcGx5LlxuICogQHBhcmFtIHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcyAtIFdoZXRoZXIgdG8gcmV0cnkgdGhlIG9wZXJhdGlvbiBpZiB0aGUgY2hhbmdlcyBhcmUgaW52YWxpZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgY29udGVudCBvciB0byBgbnVsbGAgaWYgdXBkYXRlIGRpZG4ndCBzdWNjZWVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlDb250ZW50Q2hhbmdlcyhcbiAgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbiAgY2hhbmdlc1Byb3ZpZGVyOiBWYWx1ZVByb3ZpZGVyPEZpbGVDaGFuZ2VbXSB8IG51bGwsIFtjb250ZW50OiBzdHJpbmddPixcbiAgc2hvdWxkUmV0cnlPbkludmFsaWRDaGFuZ2VzID0gdHJ1ZVxuKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGxldCBjaGFuZ2VzID0gYXdhaXQgcmVzb2x2ZVZhbHVlKGNoYW5nZXNQcm92aWRlciwgYWJvcnRTaWduYWwsIGNvbnRlbnQpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBpZiAoY2hhbmdlcyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBmcm9udG1hdHRlciwgaGFzRnJvbnRtYXR0ZXJFcnJvciB9ID0gcGFyc2VGcm9udG1hdHRlclNhZmVseShjb250ZW50LCBwYXRoKTtcblxuICBpZiAoIXZhbGlkYXRlQ2hhbmdlcyhjaGFuZ2VzLCBjb250ZW50LCBmcm9udG1hdHRlciwgcGF0aCkpIHtcbiAgICByZXR1cm4gc2hvdWxkUmV0cnlPbkludmFsaWRDaGFuZ2VzID8gbnVsbCA6IGNvbnRlbnQ7XG4gIH1cblxuICBjaGFuZ2VzID0gc29ydEFuZEZpbHRlckNoYW5nZXMoY2hhbmdlcyk7XG5cbiAgY29uc3QgeyBmcm9udG1hdHRlckNoYW5nZWQsIG5ld0NvbnRlbnQgfSA9IGFwcGx5Q29udGVudENoYW5nZXNUb1RleHQoY2hhbmdlcywgY29udGVudCwgaGFzRnJvbnRtYXR0ZXJFcnJvciwgcGF0aCk7XG5cbiAgYXdhaXQgYXBwbHlGcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cyhhYm9ydFNpZ25hbCwgZnJvbnRtYXR0ZXIsIGZyb250bWF0dGVyQ2hhbmdlZCwgcGF0aCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgcmV0dXJuIGJ1aWxkRmluYWxDb250ZW50KG5ld0NvbnRlbnQsIGZyb250bWF0dGVyLCBmcm9udG1hdHRlckNoYW5nZWQpO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzZXJpZXMgb2YgZmlsZSBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBwYXRoIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZSB3aGVyZSB0aGUgZmlsZSBjaGFuZ2VzIHdpbGwgYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byB3aGljaCB0aGUgY2hhbmdlcyBzaG91bGQgYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBjaGFuZ2VzUHJvdmlkZXIgLSBBIHByb3ZpZGVyIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBmaWxlIGNoYW5nZXMgdG8gYXBwbHkuXG4gKiBAcGFyYW0gcHJvY2Vzc09wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciBwcm9jZXNzaW5nL3JldHJ5aW5nIHRoZSBvcGVyYXRpb24uXG4gKiBAcGFyYW0gc2hvdWxkUmV0cnlPbkludmFsaWRDaGFuZ2VzIC0gV2hldGhlciB0byByZXRyeSB0aGUgb3BlcmF0aW9uIGlmIHRoZSBjaGFuZ2VzIGFyZSBpbnZhbGlkLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZSBjaGFuZ2VzIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgYXBwbGllZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5RmlsZUNoYW5nZXMoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBjaGFuZ2VzUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8RmlsZUNoYW5nZVtdIHwgbnVsbCwgW2NvbnRlbnQ6IHN0cmluZ10+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fSxcbiAgc2hvdWxkUmV0cnlPbkludmFsaWRDaGFuZ2VzID0gdHJ1ZVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHByb2Nlc3MoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoYWJvcnRTaWduYWwsIGNvbnRlbnQpID0+IHtcbiAgICBpZiAoaXNDYW52YXNGaWxlKGFwcCwgcGF0aE9yRmlsZSkpIHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBseUNhbnZhc0NoYW5nZXMoYWJvcnRTaWduYWwsIGNvbnRlbnQsIGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSwgY2hhbmdlc1Byb3ZpZGVyLCBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKGFib3J0U2lnbmFsLCBjb250ZW50LCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSksIGNoYW5nZXNQcm92aWRlciwgc2hvdWxkUmV0cnlPbkludmFsaWRDaGFuZ2VzKTtcbiAgfSwgcHJvY2Vzc09wdGlvbnMpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpbGUgY2hhbmdlIGlzIGEgY2FudmFzIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBjYW52YXMgY2hhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW52YXNDaGFuZ2UoY2hhbmdlOiBGaWxlQ2hhbmdlKTogY2hhbmdlIGlzIENhbnZhc0NoYW5nZSB7XG4gIHJldHVybiBpc0NhbnZhc1JlZmVyZW5jZShjaGFuZ2UucmVmZXJlbmNlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGNoYW5nZSBpcyBhIGNhbnZhcyBmaWxlIG5vZGUgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2UgLSBUaGUgZmlsZSBjaGFuZ2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWxlIGNoYW5nZSBpcyBhIGNhbnZhcyBmaWxlIG5vZGUgY2hhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW52YXNGaWxlTm9kZUNoYW5nZShjaGFuZ2U6IEZpbGVDaGFuZ2UpOiBjaGFuZ2UgaXMgQ2FudmFzRmlsZU5vZGVDaGFuZ2Uge1xuICByZXR1cm4gaXNDYW52YXNDaGFuZ2UoY2hhbmdlKSAmJiBjaGFuZ2UucmVmZXJlbmNlLnR5cGUgPT09ICdmaWxlJztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGNoYW5nZSBpcyBhIGNhbnZhcyB0ZXh0IG5vZGUgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2UgLSBUaGUgZmlsZSBjaGFuZ2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWxlIGNoYW5nZSBpcyBhIGNhbnZhcyB0ZXh0IG5vZGUgY2hhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW52YXNUZXh0Tm9kZUNoYW5nZShjaGFuZ2U6IEZpbGVDaGFuZ2UpOiBjaGFuZ2UgaXMgQ2FudmFzVGV4dE5vZGVDaGFuZ2Uge1xuICByZXR1cm4gaXNDYW52YXNDaGFuZ2UoY2hhbmdlKSAmJiBjaGFuZ2UucmVmZXJlbmNlLnR5cGUgPT09ICd0ZXh0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGNoYW5nZSBpcyBhIGNvbnRlbnQgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBmaWxlQ2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBjb250ZW50IGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGVudENoYW5nZShmaWxlQ2hhbmdlOiBGaWxlQ2hhbmdlKTogZmlsZUNoYW5nZSBpcyBDb250ZW50Q2hhbmdlIHtcbiAgcmV0dXJuIGlzUmVmZXJlbmNlQ2FjaGUoZmlsZUNoYW5nZS5yZWZlcmVuY2UpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpbGUgY2hhbmdlIGlzIGEgZnJvbnRtYXR0ZXIgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBmaWxlQ2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBmcm9udG1hdHRlciBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zyb250bWF0dGVyQ2hhbmdlKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UpOiBmaWxlQ2hhbmdlIGlzIEZyb250bWF0dGVyQ2hhbmdlIHtcbiAgcmV0dXJuIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUoZmlsZUNoYW5nZS5yZWZlcmVuY2UpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpbGUgY2hhbmdlIGlzIGEgZnJvbnRtYXR0ZXIgY2hhbmdlIHdpdGggb2Zmc2V0cy5cbiAqXG4gKiBAcGFyYW0gZmlsZUNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgY2hhbmdlIGlzIGEgZnJvbnRtYXR0ZXIgY2hhbmdlIHdpdGggb2Zmc2V0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyhmaWxlQ2hhbmdlOiBGaWxlQ2hhbmdlKTogZmlsZUNoYW5nZSBpcyBGcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzIHtcbiAgcmV0dXJuIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhmaWxlQ2hhbmdlLnJlZmVyZW5jZSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBmcm9udG1hdHRlciBjaGFuZ2UgdG8gYSBmcm9udG1hdHRlciBjaGFuZ2Ugd2l0aCBvZmZzZXRzLlxuICpcbiAqIEBwYXJhbSBmaWxlQ2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGZpbGUgY2hhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Gcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzKGZpbGVDaGFuZ2U6IEZyb250bWF0dGVyQ2hhbmdlKTogRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyB7XG4gIGlmIChpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoZmlsZUNoYW5nZSkpIHtcbiAgICByZXR1cm4gZmlsZUNoYW5nZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZmlsZUNoYW5nZSxcbiAgICByZWZlcmVuY2U6IHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhmaWxlQ2hhbmdlLnJlZmVyZW5jZSlcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDYW52YXNDaGFuZ2VzKFxuICBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwsXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuICBjaGFuZ2VzUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8RmlsZUNoYW5nZVtdIHwgbnVsbCwgW2NvbnRlbnQ6IHN0cmluZ10+LFxuICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXMgPSB0cnVlXG4pOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlcyA9IGF3YWl0IHJlc29sdmVWYWx1ZShjaGFuZ2VzUHJvdmlkZXIsIGFib3J0U2lnbmFsLCBjb250ZW50KTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgaWYgKGNoYW5nZXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNhbnZhc0RhdGEgPSBwYXJzZUpzb25TYWZlKGNvbnRlbnQpIGFzIENhbnZhc0RhdGE7XG5cbiAgY29uc3QgY2FudmFzVGV4dENoYW5nZXMgPSBuZXcgTWFwPG51bWJlciwgQ2FudmFzVGV4dE5vZGVDaGFuZ2VbXT4oKTtcblxuICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgaWYgKCFpc0NhbnZhc0NoYW5nZShjaGFuZ2UpKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ09ubHkgY2FudmFzIGNoYW5nZXMgYXJlIHN1cHBvcnRlZCBmb3IgY2FudmFzIGZpbGVzJztcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwge1xuICAgICAgICBjaGFuZ2UsXG4gICAgICAgIHBhdGhcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBjYW52YXNEYXRhLm5vZGVzW2NoYW5nZS5yZWZlcmVuY2Uubm9kZUluZGV4XTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnTm9kZSBub3QgZm91bmQnO1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIG5vZGVJbmRleDogY2hhbmdlLnJlZmVyZW5jZS5ub2RlSW5kZXgsXG4gICAgICAgIHBhdGhcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGlmIChpc0NhbnZhc0ZpbGVOb2RlQ2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIGlmIChub2RlLmZpbGUgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgIGdldExpYkRlYnVnZ2VyKCdGaWxlQ2hhbmdlOmFwcGx5Q2FudmFzQ2hhbmdlcycpKCdDb250ZW50IG1pc21hdGNoJywge1xuICAgICAgICAgIGFjdHVhbENvbnRlbnQ6IG5vZGUuZmlsZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZXhwZWN0ZWRDb250ZW50OiBjaGFuZ2Uub2xkQ29udGVudCxcbiAgICAgICAgICBub2RlSW5kZXg6IGNoYW5nZS5yZWZlcmVuY2Uubm9kZUluZGV4LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdHlwZTogJ2ZpbGUnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbm9kZS5maWxlID0gY2hhbmdlLm5ld0NvbnRlbnQ7XG4gICAgfSBlbHNlIGlmIChpc0NhbnZhc1RleHROb2RlQ2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIGxldCBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUgPSBjYW52YXNUZXh0Q2hhbmdlcy5nZXQoY2hhbmdlLnJlZmVyZW5jZS5ub2RlSW5kZXgpO1xuICAgICAgaWYgKCFjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUpIHtcbiAgICAgICAgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlID0gW107XG4gICAgICAgIGNhbnZhc1RleHRDaGFuZ2VzLnNldChjaGFuZ2UucmVmZXJlbmNlLm5vZGVJbmRleCwgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlKTtcbiAgICAgIH1cblxuICAgICAgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlLnB1c2goY2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtub2RlSW5kZXgsIGNhbnZhc1RleHRDaGFuZ2VzRm9yTm9kZV0gb2YgY2FudmFzVGV4dENoYW5nZXMuZW50cmllcygpKSB7XG4gICAgY29uc3Qgbm9kZSA9IGNhbnZhc0RhdGEubm9kZXNbbm9kZUluZGV4XTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnTm9kZSBub3QgZm91bmQnO1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIG5vZGVJbmRleCxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5vZGUudGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnTm9kZSB0ZXh0IGlzIG5vdCBhIHN0cmluZyc7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIHtcbiAgICAgICAgbm9kZUluZGV4LFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRDaGFuZ2VzID0gY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlLm1hcCgoY2hhbmdlKSA9PiByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UoY2hhbmdlLnJlZmVyZW5jZS5vcmlnaW5hbFJlZmVyZW5jZSwgY2hhbmdlLm5ld0NvbnRlbnQpKTtcbiAgICBub2RlLnRleHQgPSBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKFxuICAgICAgYWJvcnRTaWduYWwsXG4gICAgICBub2RlLnRleHQsXG4gICAgICBgJHtwYXRofS5ub2RlJHtTdHJpbmcobm9kZUluZGV4KX0uVklSVFVBTF9GSUxFLm1kYCxcbiAgICAgIGNvbnRlbnRDaGFuZ2VzLFxuICAgICAgc2hvdWxkUmV0cnlPbkludmFsaWRDaGFuZ2VzXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShjYW52YXNEYXRhLCBudWxsLCAnXFx0Jyk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5Q29udGVudENoYW5nZXNUb1RleHQoXG4gIGNoYW5nZXM6IEZpbGVDaGFuZ2VbXSxcbiAgY29udGVudDogc3RyaW5nLFxuICBoYXNGcm9udG1hdHRlckVycm9yOiBib29sZWFuLFxuICBwYXRoOiBzdHJpbmdcbik6IHsgZnJvbnRtYXR0ZXJDaGFuZ2VkOiBNYXA8c3RyaW5nLCBGcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzW10+OyBuZXdDb250ZW50OiBzdHJpbmcgfSB7XG4gIGxldCBuZXdDb250ZW50ID0gJyc7XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBsZXQgbGFzdENvbnRlbnRDaGFuZ2U6IENvbnRlbnRDaGFuZ2UgPSB7XG4gICAgbmV3Q29udGVudDogJycsXG4gICAgb2xkQ29udGVudDogJycsXG4gICAgcmVmZXJlbmNlOiB7XG4gICAgICBsaW5rOiAnJyxcbiAgICAgIG9yaWdpbmFsOiAnJyxcbiAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIGVuZDogeyBjb2w6IDAsIGxpbmU6IDAsIG9mZnNldDogMCB9LFxuICAgICAgICBzdGFydDogeyBjb2w6IDAsIGxpbmU6IDAsIG9mZnNldDogMCB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0TWFwID0gbmV3IE1hcDxzdHJpbmcsIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHNbXT4oKTtcblxuICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgaWYgKGlzQ29udGVudENoYW5nZShjaGFuZ2UpKSB7XG4gICAgICBpZiAobGFzdEluZGV4IDw9IGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0KSB7XG4gICAgICAgIG5ld0NvbnRlbnQgKz0gY29udGVudC5zbGljZShsYXN0SW5kZXgsIGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0KTtcbiAgICAgICAgbmV3Q29udGVudCArPSBjaGFuZ2UubmV3Q29udGVudDtcbiAgICAgICAgbGFzdEluZGV4ID0gY2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5lbmQub2Zmc2V0O1xuICAgICAgICBsYXN0Q29udGVudENoYW5nZSA9IGNoYW5nZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nU3RhcnRPZmZzZXQgPSBjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAtIGxhc3RDb250ZW50Q2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nRW5kT2Zmc2V0ID0gY2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5lbmQub2Zmc2V0IC0gbGFzdENvbnRlbnRDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdDb250ZW50ID0gbGFzdENvbnRlbnRDaGFuZ2UubmV3Q29udGVudC5zbGljZShvdmVybGFwcGluZ1N0YXJ0T2Zmc2V0LCBvdmVybGFwcGluZ0VuZE9mZnNldCk7XG4gICAgICAgIGlmIChvdmVybGFwcGluZ0NvbnRlbnQgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdPdmVybGFwcGluZyBjaGFuZ2VzJztcbiAgICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIHsgY2hhbmdlLCBsYXN0Q29udGVudENoYW5nZSB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQuc2xpY2UoMCwgbmV3Q29udGVudC5sZW5ndGggLSBsYXN0Q29udGVudENoYW5nZS5uZXdDb250ZW50Lmxlbmd0aClcbiAgICAgICAgICArIGxhc3RDb250ZW50Q2hhbmdlLm5ld0NvbnRlbnQuc2xpY2UoMCwgb3ZlcmxhcHBpbmdTdGFydE9mZnNldClcbiAgICAgICAgICArIGNoYW5nZS5uZXdDb250ZW50XG4gICAgICAgICAgKyBsYXN0Q29udGVudENoYW5nZS5uZXdDb250ZW50LnNsaWNlKG92ZXJsYXBwaW5nRW5kT2Zmc2V0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgaWYgKGhhc0Zyb250bWF0dGVyRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGFwcGx5IGZyb250bWF0dGVyIGNoYW5nZSBpbiAke3BhdGh9LCBiZWNhdXNlIGZyb250bWF0dGVyIHBhcnNpbmcgZmFpbGVkYCwgeyBjaGFuZ2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMgPSBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0TWFwLmdldChjaGFuZ2UucmVmZXJlbmNlLmtleSk7XG4gICAgICAgIGlmICghZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMpIHtcbiAgICAgICAgICBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cyA9IFtdO1xuICAgICAgICAgIGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXAuc2V0KGNoYW5nZS5yZWZlcmVuY2Uua2V5LCBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMucHVzaCh0b0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoY2hhbmdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmV3Q29udGVudCArPSBjb250ZW50LnNsaWNlKGxhc3RJbmRleCk7XG5cbiAgcmV0dXJuIHsgZnJvbnRtYXR0ZXJDaGFuZ2VkOiBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0TWFwLCBuZXdDb250ZW50IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5RnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMoXG4gIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgZnJvbnRtYXR0ZXI6IENvbWJpbmVkRnJvbnRtYXR0ZXI8dW5rbm93bj4sXG4gIGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXA6IE1hcDxzdHJpbmcsIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHNbXT4sXG4gIHBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgW2tleSwgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHNdIG9mIGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXAuZW50cmllcygpKSB7XG4gICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGdldE5lc3RlZFByb3BlcnR5VmFsdWUoZnJvbnRtYXR0ZXIsIGtleSk7XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRDaGFuZ2VzOiBDb250ZW50Q2hhbmdlW10gPSBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cy5tYXAoKGNoYW5nZSkgPT4gKHtcbiAgICAgIG5ld0NvbnRlbnQ6IGNoYW5nZS5uZXdDb250ZW50LFxuICAgICAgb2xkQ29udGVudDogY2hhbmdlLm9sZENvbnRlbnQsXG4gICAgICByZWZlcmVuY2U6IHtcbiAgICAgICAgbGluazogJycsXG4gICAgICAgIG9yaWdpbmFsOiAnJyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgIGNvbDogY2hhbmdlLnJlZmVyZW5jZS5lbmRPZmZzZXQsXG4gICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgb2Zmc2V0OiBjaGFuZ2UucmVmZXJlbmNlLmVuZE9mZnNldFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgIGNvbDogY2hhbmdlLnJlZmVyZW5jZS5zdGFydE9mZnNldCxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICBvZmZzZXQ6IGNoYW5nZS5yZWZlcmVuY2Uuc3RhcnRPZmZzZXRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGFzIENvbnRlbnRDaGFuZ2UpKTtcblxuICAgIGNvbnN0IG5ld1Byb3BlcnR5VmFsdWUgPSBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKGFib3J0U2lnbmFsLCBwcm9wZXJ0eVZhbHVlLCBgJHtwYXRofS5mcm9udG1hdHRlci4ke2tleX0uVklSVFVBTF9GSUxFLm1kYCwgY29udGVudENoYW5nZXMpO1xuICAgIGlmIChuZXdQcm9wZXJ0eVZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0TmVzdGVkUHJvcGVydHlWYWx1ZShmcm9udG1hdHRlciwga2V5LCBuZXdQcm9wZXJ0eVZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEZpbmFsQ29udGVudChcbiAgbmV3Q29udGVudDogc3RyaW5nLFxuICBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPixcbiAgZnJvbnRtYXR0ZXJDaGFuZ2VkOiBNYXA8c3RyaW5nLCBGcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzW10+XG4pOiBzdHJpbmcge1xuICBpZiAoZnJvbnRtYXR0ZXJDaGFuZ2VkLnNpemUgPiAwKSB7XG4gICAgcmV0dXJuIHNldEZyb250bWF0dGVyKG5ld0NvbnRlbnQsIGZyb250bWF0dGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cblxuZnVuY3Rpb24gcGFyc2VGcm9udG1hdHRlclNhZmVseShjb250ZW50OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHsgZnJvbnRtYXR0ZXI6IENvbWJpbmVkRnJvbnRtYXR0ZXI8dW5rbm93bj47IGhhc0Zyb250bWF0dGVyRXJyb3I6IGJvb2xlYW4gfSB7XG4gIGxldCBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPiA9IHt9O1xuICBsZXQgaGFzRnJvbnRtYXR0ZXJFcnJvciA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgZnJvbnRtYXR0ZXIgPSBwYXJzZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50RXJyb3IobmV3IEVycm9yKGBGcm9udG1hdHRlciBwYXJzaW5nIGZhaWxlZCBpbiAke3BhdGh9YCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgIGhhc0Zyb250bWF0dGVyRXJyb3IgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHsgZnJvbnRtYXR0ZXIsIGhhc0Zyb250bWF0dGVyRXJyb3IgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VKc29uU2FmZShjb250ZW50OiBzdHJpbmcpOiBHZW5lcmljT2JqZWN0IHtcbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICB9IGNhdGNoIHtcbiAgICBwYXJzZWQgPSBudWxsO1xuICB9XG5cbiAgaWYgKHBhcnNlZCA9PT0gbnVsbCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0Jykge1xuICAgIHBhcnNlZCA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZCBhcyBHZW5lcmljT2JqZWN0O1xufVxuXG5mdW5jdGlvbiBzb3J0QW5kRmlsdGVyQ2hhbmdlcyhjaGFuZ2VzOiBGaWxlQ2hhbmdlW10pOiBGaWxlQ2hhbmdlW10ge1xuICAvLyBTb3J0IGNoYW5nZXMgYnkgdHlwZSBhbmQgcG9zaXRpb25cbiAgY2hhbmdlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGlzQ29udGVudENoYW5nZShhKSAmJiBpc0NvbnRlbnRDaGFuZ2UoYikpIHtcbiAgICAgIHJldHVybiBhLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgLSBiLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyhhKSAmJiBpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoYikpIHtcbiAgICAgIHJldHVybiBhLnJlZmVyZW5jZS5rZXkubG9jYWxlQ29tcGFyZShiLnJlZmVyZW5jZS5rZXkpIHx8IGEucmVmZXJlbmNlLnN0YXJ0T2Zmc2V0IC0gYi5yZWZlcmVuY2Uuc3RhcnRPZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2UoYSkgJiYgaXNGcm9udG1hdHRlckNoYW5nZShiKSkge1xuICAgICAgcmV0dXJuIGEucmVmZXJlbmNlLmtleS5sb2NhbGVDb21wYXJlKGIucmVmZXJlbmNlLmtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzQ29udGVudENoYW5nZShhKSA/IC0xIDogMTtcbiAgfSk7XG5cbiAgLy8gRmlsdGVyIG91dCBkdXBsaWNhdGUgYW5kIG5vLW9wIGNoYW5nZXNcbiAgcmV0dXJuIGNoYW5nZXMuZmlsdGVyKChjaGFuZ2UsIGluZGV4KSA9PiB7XG4gICAgaWYgKGNoYW5nZS5vbGRDb250ZW50ID09PSBjaGFuZ2UubmV3Q29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIWRlZXBFcXVhbChjaGFuZ2UsIGNoYW5nZXNbaW5kZXggLSAxXSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoYW5nZXMoY2hhbmdlczogRmlsZUNoYW5nZVtdLCBjb250ZW50OiBzdHJpbmcsIGZyb250bWF0dGVyOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+LCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWRhdGVDaGFuZ2VzRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignRmlsZUNoYW5nZTp2YWxpZGF0ZUNoYW5nZXMnKTtcbiAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgY2hhbmdlcykge1xuICAgIGlmIChpc0NvbnRlbnRDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgY29uc3Qgc3RhcnRPZmZzZXQgPSBjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICAgIGNvbnN0IGVuZE9mZnNldCA9IGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldDtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpO1xuICAgICAgaWYgKGFjdHVhbENvbnRlbnQgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgIHZhbGlkYXRlQ2hhbmdlc0RlYnVnZ2VyKCdDb250ZW50IG1pc21hdGNoJywge1xuICAgICAgICAgIGFjdHVhbENvbnRlbnQsXG4gICAgICAgICAgZW5kT2Zmc2V0LFxuICAgICAgICAgIGV4cGVjdGVkQ29udGVudDogY2hhbmdlLm9sZENvbnRlbnQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBzdGFydE9mZnNldFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoY2hhbmdlKSkge1xuICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGdldE5lc3RlZFByb3BlcnR5VmFsdWUoZnJvbnRtYXR0ZXIsIGNoYW5nZS5yZWZlcmVuY2Uua2V5KTtcbiAgICAgIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsaWRhdGVDaGFuZ2VzRGVidWdnZXIoJ1Byb3BlcnR5IHZhbHVlIGlzIG5vdCBhIHN0cmluZycsIHtcbiAgICAgICAgICBmcm9udG1hdHRlcktleTogY2hhbmdlLnJlZmVyZW5jZS5rZXksXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBwcm9wZXJ0eVZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBwcm9wZXJ0eVZhbHVlLnNsaWNlKGNoYW5nZS5yZWZlcmVuY2Uuc3RhcnRPZmZzZXQsIGNoYW5nZS5yZWZlcmVuY2UuZW5kT2Zmc2V0KTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ICE9PSBjaGFuZ2Uub2xkQ29udGVudCkge1xuICAgICAgICB2YWxpZGF0ZUNoYW5nZXNEZWJ1Z2dlcignQ29udGVudCBtaXNtYXRjaCcsIHtcbiAgICAgICAgICBhY3R1YWxDb250ZW50LFxuICAgICAgICAgIGV4cGVjdGVkQ29udGVudDogY2hhbmdlLm9sZENvbnRlbnQsXG4gICAgICAgICAgZnJvbnRtYXR0ZXJLZXk6IGNoYW5nZS5yZWZlcmVuY2Uua2V5LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgc3RhcnRPZmZzZXQ6IGNoYW5nZS5yZWZlcmVuY2Uuc3RhcnRPZmZzZXRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckNoYW5nZShjaGFuZ2UpKSB7XG4gICAgICBjb25zdCBhY3R1YWxDb250ZW50ID0gZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZShmcm9udG1hdHRlciwgY2hhbmdlLnJlZmVyZW5jZS5rZXkpO1xuICAgICAgaWYgKGFjdHVhbENvbnRlbnQgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgIHZhbGlkYXRlQ2hhbmdlc0RlYnVnZ2VyKCdDb250ZW50IG1pc21hdGNoJywge1xuICAgICAgICAgIGFjdHVhbENvbnRlbnQsXG4gICAgICAgICAgZXhwZWN0ZWRDb250ZW50OiBjaGFuZ2Uub2xkQ29udGVudCxcbiAgICAgICAgICBmcm9udG1hdHRlcktleTogY2hhbmdlLnJlZmVyZW5jZS5rZXksXG4gICAgICAgICAgcGF0aFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWNQLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsb0JBQW9CO0FBQzdCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxlQUFlO0FBc0N4QixlQUFzQixvQkFDcEIsYUFDQSxTQUNBLE1BQ0EsaUJBQ0EsOEJBQThCLE1BQ047QUFDeEIsY0FBWSxlQUFlO0FBQzNCLE1BQUksVUFBVSxNQUFNLGFBQWEsaUJBQWlCLGFBQWEsT0FBTztBQUN0RSxjQUFZLGVBQWU7QUFDM0IsTUFBSSxZQUFZLE1BQU07QUFDcEIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLEVBQUUsYUFBYSxvQkFBb0IsSUFBSSx1QkFBdUIsU0FBUyxJQUFJO0FBRWpGLE1BQUksQ0FBQyxnQkFBZ0IsU0FBUyxTQUFTLGFBQWEsSUFBSSxHQUFHO0FBQ3pELFdBQU8sOEJBQThCLE9BQU87QUFBQSxFQUM5QztBQUVBLFlBQVUscUJBQXFCLE9BQU87QUFFdEMsUUFBTSxFQUFFLG9CQUFvQixXQUFXLElBQUksMEJBQTBCLFNBQVMsU0FBUyxxQkFBcUIsSUFBSTtBQUVoSCxRQUFNLG1DQUFtQyxhQUFhLGFBQWEsb0JBQW9CLElBQUk7QUFDM0YsY0FBWSxlQUFlO0FBRTNCLFNBQU8sa0JBQWtCLFlBQVksYUFBYSxrQkFBa0I7QUFDdEU7QUFhQSxl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
|
|
419
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0ZpbGVDaGFuZ2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSB0eXBlcyBhbmQgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBmaWxlIGNoYW5nZXMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEZyb250bWF0dGVyTGlua0NhY2hlLFxuICBSZWZlcmVuY2UsXG4gIFJlZmVyZW5jZUNhY2hlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IENhbnZhc0RhdGEgfSBmcm9tICdvYnNpZGlhbi9DYW52YXMuZC50cyc7XG5cbmltcG9ydCB7XG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIGlzUmVmZXJlbmNlQ2FjaGVcbn0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICcuLi9WYWx1ZVByb3ZpZGVyLnRzJztcbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkRnJvbnRtYXR0ZXIgfSBmcm9tICcuL0Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB0eXBlIHsgRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyB9IGZyb20gJy4vRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFkdmFuY2VkQ2FudmFzUmVmZXJlbmNlLFxuICBDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSxcbiAgQ2FudmFzUmVmZXJlbmNlLFxuICBDYW52YXNUZXh0Tm9kZVJlZmVyZW5jZVxufSBmcm9tICcuL1JlZmVyZW5jZS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vRGVidWcudHMnO1xuaW1wb3J0IHsgcHJpbnRFcnJvciB9IGZyb20gJy4uL0Vycm9yLnRzJztcbmltcG9ydCB7XG4gIGRlZXBFcXVhbCxcbiAgZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZSxcbiAgc2V0TmVzdGVkUHJvcGVydHlWYWx1ZVxufSBmcm9tICcuLi9PYmplY3RVdGlscy50cyc7XG5pbXBvcnQgeyByZXNvbHZlVmFsdWUgfSBmcm9tICcuLi9WYWx1ZVByb3ZpZGVyLnRzJztcbmltcG9ydCB7XG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZVxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VGcm9udG1hdHRlcixcbiAgc2V0RnJvbnRtYXR0ZXJcbn0gZnJvbSAnLi9Gcm9udG1hdHRlci50cyc7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMsXG4gIHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c1xufSBmcm9tICcuL0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIHBhcnNlTWV0YWRhdGFcbn0gZnJvbSAnLi9NZXRhZGF0YUNhY2hlLnRzJztcbmltcG9ydCB7XG4gIGlzQ2FudmFzUmVmZXJlbmNlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9SZWZlcmVuY2UudHMnO1xuaW1wb3J0IHsgcHJvY2VzcyB9IGZyb20gJy4vVmF1bHQudHMnO1xuXG4vKipcbiAqIEEgZmlsZSBjaGFuZ2UgaW4gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaGFuZ2Uge1xuICAvKipcbiAgICogQSBuZXcgY29udGVudCB0byByZXBsYWNlIHRoZSBvbGQgY29udGVudC5cbiAgICovXG4gIG5ld0NvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb2xkIGNvbnRlbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkLlxuICAgKi9cbiAgb2xkQ29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhdXNlZCB0aGUgY2hhbmdlLlxuICAgKi9cbiAgcmVmZXJlbmNlOiBSZWZlcmVuY2U7XG59XG50eXBlIEFkdmFuY2VkQ2FudmFzQ2hhbmdlID0geyByZWZlcmVuY2U6IEFkdmFuY2VkQ2FudmFzUmVmZXJlbmNlIH0gJiBGaWxlQ2hhbmdlO1xudHlwZSBDYW52YXNDaGFuZ2UgPSB7IHJlZmVyZW5jZTogQ2FudmFzUmVmZXJlbmNlIH0gJiBGaWxlQ2hhbmdlO1xudHlwZSBDYW52YXNGaWxlTm9kZUNoYW5nZSA9IHsgcmVmZXJlbmNlOiBDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSB9ICYgRmlsZUNoYW5nZTtcbnR5cGUgQ2FudmFzVGV4dE5vZGVDaGFuZ2UgPSB7IHJlZmVyZW5jZTogQ2FudmFzVGV4dE5vZGVSZWZlcmVuY2UgfSAmIEZpbGVDaGFuZ2U7XG50eXBlIENvbnRlbnRDaGFuZ2UgPSB7IHJlZmVyZW5jZTogUmVmZXJlbmNlQ2FjaGUgfSAmIEZpbGVDaGFuZ2U7XG50eXBlIEZyb250bWF0dGVyQ2hhbmdlID0geyByZWZlcmVuY2U6IEZyb250bWF0dGVyTGlua0NhY2hlIH0gJiBGaWxlQ2hhbmdlO1xudHlwZSBGcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzID0geyByZWZlcmVuY2U6IEZyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMgfSAmIEZpbGVDaGFuZ2U7XG5cbi8qKlxuICogQXBwbGllcyBhIHNlcmllcyBvZiBjb250ZW50IGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGNvbnRlbnQgdG8gd2hpY2ggdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRvIHdoaWNoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkLlxuICogQHBhcmFtIGNoYW5nZXNQcm92aWRlciAtIEEgcHJvdmlkZXIgdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIGNvbnRlbnQgY2hhbmdlcyB0byBhcHBseS5cbiAqIEBwYXJhbSBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXMgLSBXaGV0aGVyIHRvIHJldHJ5IHRoZSBvcGVyYXRpb24gaWYgdGhlIGNoYW5nZXMgYXJlIGludmFsaWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQgb3IgdG8gYG51bGxgIGlmIHVwZGF0ZSBkaWRuJ3Qgc3VjY2VlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5Q29udGVudENoYW5nZXMoXG4gIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgY29udGVudDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIGNoYW5nZXNQcm92aWRlcjogVmFsdWVQcm92aWRlcjxGaWxlQ2hhbmdlW10gfCBudWxsLCBbY29udGVudDogc3RyaW5nXT4sXG4gIHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcyA9IHRydWVcbik6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBsZXQgY2hhbmdlcyA9IGF3YWl0IHJlc29sdmVWYWx1ZShjaGFuZ2VzUHJvdmlkZXIsIGFib3J0U2lnbmFsLCBjb250ZW50KTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgaWYgKGNoYW5nZXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGhhc0Zyb250bWF0dGVyRXJyb3IgfSA9IHBhcnNlRnJvbnRtYXR0ZXJTYWZlbHkoY29udGVudCwgcGF0aCk7XG5cbiAgaWYgKCF2YWxpZGF0ZUNoYW5nZXMoY2hhbmdlcywgY29udGVudCwgZnJvbnRtYXR0ZXIsIHBhdGgpKSB7XG4gICAgcmV0dXJuIHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcyA/IG51bGwgOiBjb250ZW50O1xuICB9XG5cbiAgY2hhbmdlcyA9IHNvcnRBbmRGaWx0ZXJDaGFuZ2VzKGNoYW5nZXMpO1xuXG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXJDaGFuZ2VkLCBuZXdDb250ZW50IH0gPSBhcHBseUNvbnRlbnRDaGFuZ2VzVG9UZXh0KGNoYW5nZXMsIGNvbnRlbnQsIGhhc0Zyb250bWF0dGVyRXJyb3IsIHBhdGgpO1xuXG4gIGF3YWl0IGFwcGx5RnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMoYWJvcnRTaWduYWwsIGZyb250bWF0dGVyLCBmcm9udG1hdHRlckNoYW5nZWQsIHBhdGgpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIHJldHVybiBidWlsZEZpbmFsQ29udGVudChuZXdDb250ZW50LCBmcm9udG1hdHRlciwgZnJvbnRtYXR0ZXJDaGFuZ2VkKTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgc2VyaWVzIG9mIGZpbGUgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGZpbGUgb3IgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2Ugd2hlcmUgdGhlIGZpbGUgY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gd2hpY2ggdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gY2hhbmdlc1Byb3ZpZGVyIC0gQSBwcm92aWRlciB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgZmlsZSBjaGFuZ2VzIHRvIGFwcGx5LlxuICogQHBhcmFtIHByb2Nlc3NPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcHJvY2Vzc2luZy9yZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICogQHBhcmFtIHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcyAtIFdoZXRoZXIgdG8gcmV0cnkgdGhlIG9wZXJhdGlvbiBpZiB0aGUgY2hhbmdlcyBhcmUgaW52YWxpZC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGUgY2hhbmdlcyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseUZpbGVDaGFuZ2VzKFxuICBhcHA6IEFwcCxcbiAgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSxcbiAgY2hhbmdlc1Byb3ZpZGVyOiBWYWx1ZVByb3ZpZGVyPEZpbGVDaGFuZ2VbXSB8IG51bGwsIFtjb250ZW50OiBzdHJpbmddPixcbiAgcHJvY2Vzc09wdGlvbnM6IFByb2Nlc3NPcHRpb25zID0ge30sXG4gIHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcyA9IHRydWVcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBwcm9jZXNzKGFwcCwgcGF0aE9yRmlsZSwgYXN5bmMgKGFib3J0U2lnbmFsLCBjb250ZW50KSA9PiB7XG4gICAgaWYgKGlzQ2FudmFzRmlsZShhcHAsIHBhdGhPckZpbGUpKSB7XG4gICAgICByZXR1cm4gYXdhaXQgYXBwbHlDYW52YXNDaGFuZ2VzKGFib3J0U2lnbmFsLCBjb250ZW50LCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSksIGNoYW5nZXNQcm92aWRlciwgc2hvdWxkUmV0cnlPbkludmFsaWRDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgYXBwbHlDb250ZW50Q2hhbmdlcyhhYm9ydFNpZ25hbCwgY29udGVudCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpLCBjaGFuZ2VzUHJvdmlkZXIsIHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcyk7XG4gIH0sIHByb2Nlc3NPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGNoYW5nZSBpcyBhIGNoYW5nZSBmcm9tIGBBZHZhbmNlZCBDYW52YXNgIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBjaGFuZ2UgZnJvbSBgQWR2YW5jZWQgQ2FudmFzYCBwbHVnaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FkdmFuY2VkQ2FudmFzQ2hhbmdlKGNoYW5nZTogRmlsZUNoYW5nZSk6IGNoYW5nZSBpcyBBZHZhbmNlZENhbnZhc0NoYW5nZSB7XG4gIHJldHVybiBpc1JlZmVyZW5jZUNhY2hlKGNoYW5nZS5yZWZlcmVuY2UpICYmICdub2RlSWQnIGluIGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb247XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBjaGFuZ2UgaXMgYSBjYW52YXMgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2UgLSBUaGUgZmlsZSBjaGFuZ2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWxlIGNoYW5nZSBpcyBhIGNhbnZhcyBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbnZhc0NoYW5nZShjaGFuZ2U6IEZpbGVDaGFuZ2UpOiBjaGFuZ2UgaXMgQ2FudmFzQ2hhbmdlIHtcbiAgcmV0dXJuIGlzQ2FudmFzUmVmZXJlbmNlKGNoYW5nZS5yZWZlcmVuY2UpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpbGUgY2hhbmdlIGlzIGEgY2FudmFzIGZpbGUgbm9kZSBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIGNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZpbGUgY2hhbmdlIGlzIGEgY2FudmFzIGZpbGUgbm9kZSBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbnZhc0ZpbGVOb2RlQ2hhbmdlKGNoYW5nZTogRmlsZUNoYW5nZSk6IGNoYW5nZSBpcyBDYW52YXNGaWxlTm9kZUNoYW5nZSB7XG4gIHJldHVybiBpc0NhbnZhc0NoYW5nZShjaGFuZ2UpICYmIGNoYW5nZS5yZWZlcmVuY2UudHlwZSA9PT0gJ2ZpbGUnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpbGUgY2hhbmdlIGlzIGEgY2FudmFzIHRleHQgbm9kZSBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIGNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZpbGUgY2hhbmdlIGlzIGEgY2FudmFzIHRleHQgbm9kZSBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbnZhc1RleHROb2RlQ2hhbmdlKGNoYW5nZTogRmlsZUNoYW5nZSk6IGNoYW5nZSBpcyBDYW52YXNUZXh0Tm9kZUNoYW5nZSB7XG4gIHJldHVybiBpc0NhbnZhc0NoYW5nZShjaGFuZ2UpICYmIGNoYW5nZS5yZWZlcmVuY2UudHlwZSA9PT0gJ3RleHQnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpbGUgY2hhbmdlIGlzIGEgY29udGVudCBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIGZpbGVDaGFuZ2UgLSBUaGUgZmlsZSBjaGFuZ2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGNoYW5nZSBpcyBhIGNvbnRlbnQgY2hhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UpOiBmaWxlQ2hhbmdlIGlzIENvbnRlbnRDaGFuZ2Uge1xuICByZXR1cm4gaXNSZWZlcmVuY2VDYWNoZShmaWxlQ2hhbmdlLnJlZmVyZW5jZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBjaGFuZ2UgaXMgYSBmcm9udG1hdHRlciBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIGZpbGVDaGFuZ2UgLSBUaGUgZmlsZSBjaGFuZ2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGNoYW5nZSBpcyBhIGZyb250bWF0dGVyIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRnJvbnRtYXR0ZXJDaGFuZ2UoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSk6IGZpbGVDaGFuZ2UgaXMgRnJvbnRtYXR0ZXJDaGFuZ2Uge1xuICByZXR1cm4gaXNGcm9udG1hdHRlckxpbmtDYWNoZShmaWxlQ2hhbmdlLnJlZmVyZW5jZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBjaGFuZ2UgaXMgYSBmcm9udG1hdHRlciBjaGFuZ2Ugd2l0aCBvZmZzZXRzLlxuICpcbiAqIEBwYXJhbSBmaWxlQ2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBmcm9udG1hdHRlciBjaGFuZ2Ugd2l0aCBvZmZzZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UpOiBmaWxlQ2hhbmdlIGlzIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMge1xuICByZXR1cm4gaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGZpbGVDaGFuZ2UucmVmZXJlbmNlKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGNhbnZhcyBkYXRhIGZyb20gdGhlIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIGNvbnRlbnQgLSBUaGUgY29udGVudCB0byBwYXJzZSB0aGUgY2FudmFzIGRhdGEgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgY2FudmFzIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNhbnZhc0RhdGEoY29udGVudDogc3RyaW5nKTogQ2FudmFzRGF0YSB7XG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgfSBjYXRjaCB7XG4gICAgcGFyc2VkID0gbnVsbDtcbiAgfVxuXG4gIGlmIChwYXJzZWQgPT09IG51bGwgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcpIHtcbiAgICBwYXJzZWQgPSB7fTtcbiAgfVxuXG4gIHJldHVybiBwYXJzZWQgYXMgQ2FudmFzRGF0YTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNoYW5nZSBmcm9tIGBBZHZhbmNlZCBDYW52YXNgIHBsdWdpbiB0byBhIGNhbnZhcyBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIGNvbnZlcnQgdGhlIGNoYW5nZSBmcm9tLlxuICogQHBhcmFtIGNoYW5nZSAtIFRoZSBjaGFuZ2UgZnJvbSBgQWR2YW5jZWQgQ2FudmFzYCBwbHVnaW4gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgY2hhbmdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9DYW52YXNDaGFuZ2UoYXBwOiBBcHAsIGZpbGU6IFRGaWxlLCBjaGFuZ2U6IEFkdmFuY2VkQ2FudmFzQ2hhbmdlKTogUHJvbWlzZTxDYW52YXNDaGFuZ2U+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICBjb25zdCBjYW52YXNEYXRhID0gcGFyc2VDYW52YXNEYXRhKGNvbnRlbnQpO1xuICBjb25zdCBub2RlSW5kZXggPSBjYW52YXNEYXRhLm5vZGVzLmZpbmRJbmRleCgobm9kZSkgPT4gbm9kZS5pZCA9PT0gY2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5ub2RlSWQpO1xuICBpZiAobm9kZUluZGV4ID09PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSAke2NoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24ubm9kZUlkfSBub3QgZm91bmRgKTtcbiAgfVxuICBjb25zdCBub2RlID0gY2FudmFzRGF0YS5ub2Rlc1tub2RlSW5kZXhdO1xuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgJHtjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLm5vZGVJZH0gbm90IGZvdW5kYCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBub2RlLnRleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlICR7Y2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5ub2RlSWR9IGlzIG5vdCBhIHRleHQgbm9kZWApO1xuICB9XG4gIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgcGFyc2VNZXRhZGF0YShhcHAsIG5vZGUudGV4dCk7XG4gIGNvbnN0IGxpbmtzID0gZ2V0QWxsTGlua3MobWV0YWRhdGEpO1xuICBjb25zdCBsaW5rSW5kZXggPSBsaW5rcy5maW5kSW5kZXgoKGxpbmspID0+IGxpbmsub3JpZ2luYWwgPT09IGNoYW5nZS5yZWZlcmVuY2Uub3JpZ2luYWwpO1xuICBpZiAobGlua0luZGV4ID09PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTGluayAke2NoYW5nZS5yZWZlcmVuY2UubGlua30gbm90IGZvdW5kYCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5jaGFuZ2UsXG4gICAgcmVmZXJlbmNlOiB7XG4gICAgICAuLi5jaGFuZ2UucmVmZXJlbmNlLFxuICAgICAgaXNDYW52YXM6IHRydWUsXG4gICAgICBrZXk6IGBub2Rlcy4ke1N0cmluZyhub2RlSW5kZXgpfS50ZXh0LiR7U3RyaW5nKGxpbmtJbmRleCl9YCxcbiAgICAgIG5vZGVJbmRleCxcbiAgICAgIHR5cGU6ICdmaWxlJ1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGZyb250bWF0dGVyIGNoYW5nZSB0byBhIGZyb250bWF0dGVyIGNoYW5nZSB3aXRoIG9mZnNldHMuXG4gKlxuICogQHBhcmFtIGZpbGVDaGFuZ2UgLSBUaGUgZmlsZSBjaGFuZ2UgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgZmlsZSBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoZmlsZUNoYW5nZTogRnJvbnRtYXR0ZXJDaGFuZ2UpOiBGcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzIHtcbiAgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyhmaWxlQ2hhbmdlKSkge1xuICAgIHJldHVybiBmaWxlQ2hhbmdlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5maWxlQ2hhbmdlLFxuICAgIHJlZmVyZW5jZTogdG9Gcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGZpbGVDaGFuZ2UucmVmZXJlbmNlKVxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUNhbnZhc0NoYW5nZXMoXG4gIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgY29udGVudDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIGNoYW5nZXNQcm92aWRlcjogVmFsdWVQcm92aWRlcjxGaWxlQ2hhbmdlW10gfCBudWxsLCBbY29udGVudDogc3RyaW5nXT4sXG4gIHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcyA9IHRydWVcbik6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgcmVzb2x2ZVZhbHVlKGNoYW5nZXNQcm92aWRlciwgYWJvcnRTaWduYWwsIGNvbnRlbnQpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBpZiAoY2hhbmdlcyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY2FudmFzRGF0YSA9IHBhcnNlQ2FudmFzRGF0YShjb250ZW50KTtcblxuICBjb25zdCBjYW52YXNUZXh0Q2hhbmdlcyA9IG5ldyBNYXA8bnVtYmVyLCBDYW52YXNUZXh0Tm9kZUNoYW5nZVtdPigpO1xuXG4gIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHtcbiAgICBpZiAoIWlzQ2FudmFzQ2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnT25seSBjYW52YXMgY2hhbmdlcyBhcmUgc3VwcG9ydGVkIGZvciBjYW52YXMgZmlsZXMnO1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIGNoYW5nZSxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IGNhbnZhc0RhdGEubm9kZXNbY2hhbmdlLnJlZmVyZW5jZS5ub2RlSW5kZXhdO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdOb2RlIG5vdCBmb3VuZCc7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIHtcbiAgICAgICAgbm9kZUluZGV4OiBjaGFuZ2UucmVmZXJlbmNlLm5vZGVJbmRleCxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2FudmFzRmlsZU5vZGVDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgaWYgKG5vZGUuZmlsZSAhPT0gY2hhbmdlLm9sZENvbnRlbnQpIHtcbiAgICAgICAgZ2V0TGliRGVidWdnZXIoJ0ZpbGVDaGFuZ2U6YXBwbHlDYW52YXNDaGFuZ2VzJykoJ0NvbnRlbnQgbWlzbWF0Y2gnLCB7XG4gICAgICAgICAgYWN0dWFsQ29udGVudDogbm9kZS5maWxlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBleHBlY3RlZENvbnRlbnQ6IGNoYW5nZS5vbGRDb250ZW50LFxuICAgICAgICAgIG5vZGVJbmRleDogY2hhbmdlLnJlZmVyZW5jZS5ub2RlSW5kZXgsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB0eXBlOiAnZmlsZSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBub2RlLmZpbGUgPSBjaGFuZ2UubmV3Q29udGVudDtcbiAgICB9IGVsc2UgaWYgKGlzQ2FudmFzVGV4dE5vZGVDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgbGV0IGNhbnZhc1RleHRDaGFuZ2VzRm9yTm9kZSA9IGNhbnZhc1RleHRDaGFuZ2VzLmdldChjaGFuZ2UucmVmZXJlbmNlLm5vZGVJbmRleCk7XG4gICAgICBpZiAoIWNhbnZhc1RleHRDaGFuZ2VzRm9yTm9kZSkge1xuICAgICAgICBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUgPSBbXTtcbiAgICAgICAgY2FudmFzVGV4dENoYW5nZXMuc2V0KGNoYW5nZS5yZWZlcmVuY2Uubm9kZUluZGV4LCBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUpO1xuICAgICAgfVxuXG4gICAgICBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUucHVzaChjaGFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgW25vZGVJbmRleCwgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlXSBvZiBjYW52YXNUZXh0Q2hhbmdlcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBub2RlID0gY2FudmFzRGF0YS5ub2Rlc1tub2RlSW5kZXhdO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdOb2RlIG5vdCBmb3VuZCc7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIHtcbiAgICAgICAgbm9kZUluZGV4LFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygbm9kZS50ZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdOb2RlIHRleHQgaXMgbm90IGEgc3RyaW5nJztcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwge1xuICAgICAgICBub2RlSW5kZXgsXG4gICAgICAgIHBhdGhcbiAgICAgIH0pO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudENoYW5nZXMgPSBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUubWFwKChjaGFuZ2UpID0+IHJlZmVyZW5jZVRvRmlsZUNoYW5nZShjaGFuZ2UucmVmZXJlbmNlLm9yaWdpbmFsUmVmZXJlbmNlLCBjaGFuZ2UubmV3Q29udGVudCkpO1xuICAgIG5vZGUudGV4dCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoXG4gICAgICBhYm9ydFNpZ25hbCxcbiAgICAgIG5vZGUudGV4dCxcbiAgICAgIGAke3BhdGh9Lm5vZGUke1N0cmluZyhub2RlSW5kZXgpfS5WSVJUVUFMX0ZJTEUubWRgLFxuICAgICAgY29udGVudENoYW5nZXMsXG4gICAgICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXNcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNhbnZhc0RhdGEsIG51bGwsICdcXHQnKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlDb250ZW50Q2hhbmdlc1RvVGV4dChcbiAgY2hhbmdlczogRmlsZUNoYW5nZVtdLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGhhc0Zyb250bWF0dGVyRXJyb3I6IGJvb2xlYW4sXG4gIHBhdGg6IHN0cmluZ1xuKTogeyBmcm9udG1hdHRlckNoYW5nZWQ6IE1hcDxzdHJpbmcsIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHNbXT47IG5ld0NvbnRlbnQ6IHN0cmluZyB9IHtcbiAgbGV0IG5ld0NvbnRlbnQgPSAnJztcbiAgbGV0IGxhc3RJbmRleCA9IDA7XG4gIGxldCBsYXN0Q29udGVudENoYW5nZTogQ29udGVudENoYW5nZSA9IHtcbiAgICBuZXdDb250ZW50OiAnJyxcbiAgICBvbGRDb250ZW50OiAnJyxcbiAgICByZWZlcmVuY2U6IHtcbiAgICAgIGxpbms6ICcnLFxuICAgICAgb3JpZ2luYWw6ICcnLFxuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgZW5kOiB7IGNvbDogMCwgbGluZTogMCwgb2Zmc2V0OiAwIH0sXG4gICAgICAgIHN0YXJ0OiB7IGNvbDogMCwgbGluZTogMCwgb2Zmc2V0OiAwIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXAgPSBuZXcgTWFwPHN0cmluZywgRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0c1tdPigpO1xuXG4gIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHtcbiAgICBpZiAoaXNDb250ZW50Q2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIGlmIChsYXN0SW5kZXggPD0gY2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQpIHtcbiAgICAgICAgbmV3Q29udGVudCArPSBjb250ZW50LnNsaWNlKGxhc3RJbmRleCwgY2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQpO1xuICAgICAgICBuZXdDb250ZW50ICs9IGNoYW5nZS5uZXdDb250ZW50O1xuICAgICAgICBsYXN0SW5kZXggPSBjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQ7XG4gICAgICAgIGxhc3RDb250ZW50Q2hhbmdlID0gY2hhbmdlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdTdGFydE9mZnNldCA9IGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0IC0gbGFzdENvbnRlbnRDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdFbmRPZmZzZXQgPSBjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQgLSBsYXN0Q29udGVudENoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0O1xuICAgICAgICBjb25zdCBvdmVybGFwcGluZ0NvbnRlbnQgPSBsYXN0Q29udGVudENoYW5nZS5uZXdDb250ZW50LnNsaWNlKG92ZXJsYXBwaW5nU3RhcnRPZmZzZXQsIG92ZXJsYXBwaW5nRW5kT2Zmc2V0KTtcbiAgICAgICAgaWYgKG92ZXJsYXBwaW5nQ29udGVudCAhPT0gY2hhbmdlLm9sZENvbnRlbnQpIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ092ZXJsYXBwaW5nIGNoYW5nZXMnO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgeyBjaGFuZ2UsIGxhc3RDb250ZW50Q2hhbmdlIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5zbGljZSgwLCBuZXdDb250ZW50Lmxlbmd0aCAtIGxhc3RDb250ZW50Q2hhbmdlLm5ld0NvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICsgbGFzdENvbnRlbnRDaGFuZ2UubmV3Q29udGVudC5zbGljZSgwLCBvdmVybGFwcGluZ1N0YXJ0T2Zmc2V0KVxuICAgICAgICAgICsgY2hhbmdlLm5ld0NvbnRlbnRcbiAgICAgICAgICArIGxhc3RDb250ZW50Q2hhbmdlLm5ld0NvbnRlbnQuc2xpY2Uob3ZlcmxhcHBpbmdFbmRPZmZzZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckNoYW5nZShjaGFuZ2UpKSB7XG4gICAgICBpZiAoaGFzRnJvbnRtYXR0ZXJFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgYXBwbHkgZnJvbnRtYXR0ZXIgY2hhbmdlIGluICR7cGF0aH0sIGJlY2F1c2UgZnJvbnRtYXR0ZXIgcGFyc2luZyBmYWlsZWRgLCB7IGNoYW5nZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cyA9IGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXAuZ2V0KGNoYW5nZS5yZWZlcmVuY2Uua2V5KTtcbiAgICAgICAgaWYgKCFmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cykge1xuICAgICAgICAgIGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzID0gW107XG4gICAgICAgICAgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldE1hcC5zZXQoY2hhbmdlLnJlZmVyZW5jZS5rZXksIGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzKTtcbiAgICAgICAgfVxuICAgICAgICBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cy5wdXNoKHRvRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyhjaGFuZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZXdDb250ZW50ICs9IGNvbnRlbnQuc2xpY2UobGFzdEluZGV4KTtcblxuICByZXR1cm4geyBmcm9udG1hdHRlckNoYW5nZWQ6IGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXAsIG5ld0NvbnRlbnQgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlGcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cyhcbiAgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsLFxuICBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPixcbiAgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldE1hcDogTWFwPHN0cmluZywgRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0c1tdPixcbiAgcGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBba2V5LCBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0c10gb2YgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldE1hcC5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZShmcm9udG1hdHRlciwga2V5KTtcbiAgICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudENoYW5nZXM6IENvbnRlbnRDaGFuZ2VbXSA9IGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzLm1hcCgoY2hhbmdlKSA9PiAoe1xuICAgICAgbmV3Q29udGVudDogY2hhbmdlLm5ld0NvbnRlbnQsXG4gICAgICBvbGRDb250ZW50OiBjaGFuZ2Uub2xkQ29udGVudCxcbiAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICBsaW5rOiAnJyxcbiAgICAgICAgb3JpZ2luYWw6ICcnLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgY29sOiBjaGFuZ2UucmVmZXJlbmNlLmVuZE9mZnNldCxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICBvZmZzZXQ6IGNoYW5nZS5yZWZlcmVuY2UuZW5kT2Zmc2V0XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgY29sOiBjaGFuZ2UucmVmZXJlbmNlLnN0YXJ0T2Zmc2V0LFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgIG9mZnNldDogY2hhbmdlLnJlZmVyZW5jZS5zdGFydE9mZnNldFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gYXMgQ29udGVudENoYW5nZSkpO1xuXG4gICAgY29uc3QgbmV3UHJvcGVydHlWYWx1ZSA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoYWJvcnRTaWduYWwsIHByb3BlcnR5VmFsdWUsIGAke3BhdGh9LmZyb250bWF0dGVyLiR7a2V5fS5WSVJUVUFMX0ZJTEUubWRgLCBjb250ZW50Q2hhbmdlcyk7XG4gICAgaWYgKG5ld1Byb3BlcnR5VmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBrZXksIG5ld1Byb3BlcnR5VmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRmluYWxDb250ZW50KFxuICBuZXdDb250ZW50OiBzdHJpbmcsXG4gIGZyb250bWF0dGVyOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+LFxuICBmcm9udG1hdHRlckNoYW5nZWQ6IE1hcDxzdHJpbmcsIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHNbXT5cbik6IHN0cmluZyB7XG4gIGlmIChmcm9udG1hdHRlckNoYW5nZWQuc2l6ZSA+IDApIHtcbiAgICByZXR1cm4gc2V0RnJvbnRtYXR0ZXIobmV3Q29udGVudCwgZnJvbnRtYXR0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuXG5mdW5jdGlvbiBwYXJzZUZyb250bWF0dGVyU2FmZWx5KGNvbnRlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nKTogeyBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPjsgaGFzRnJvbnRtYXR0ZXJFcnJvcjogYm9vbGVhbiB9IHtcbiAgbGV0IGZyb250bWF0dGVyOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+ID0ge307XG4gIGxldCBoYXNGcm9udG1hdHRlckVycm9yID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBmcm9udG1hdHRlciA9IHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZyb250bWF0dGVyIHBhcnNpbmcgZmFpbGVkIGluICR7cGF0aH1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgaGFzRnJvbnRtYXR0ZXJFcnJvciA9IHRydWU7XG4gIH1cblxuICByZXR1cm4geyBmcm9udG1hdHRlciwgaGFzRnJvbnRtYXR0ZXJFcnJvciB9O1xufVxuXG5mdW5jdGlvbiBzb3J0QW5kRmlsdGVyQ2hhbmdlcyhjaGFuZ2VzOiBGaWxlQ2hhbmdlW10pOiBGaWxlQ2hhbmdlW10ge1xuICAvLyBTb3J0IGNoYW5nZXMgYnkgdHlwZSBhbmQgcG9zaXRpb25cbiAgY2hhbmdlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGlzQ29udGVudENoYW5nZShhKSAmJiBpc0NvbnRlbnRDaGFuZ2UoYikpIHtcbiAgICAgIHJldHVybiBhLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgLSBiLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyhhKSAmJiBpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoYikpIHtcbiAgICAgIHJldHVybiBhLnJlZmVyZW5jZS5rZXkubG9jYWxlQ29tcGFyZShiLnJlZmVyZW5jZS5rZXkpIHx8IGEucmVmZXJlbmNlLnN0YXJ0T2Zmc2V0IC0gYi5yZWZlcmVuY2Uuc3RhcnRPZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2UoYSkgJiYgaXNGcm9udG1hdHRlckNoYW5nZShiKSkge1xuICAgICAgcmV0dXJuIGEucmVmZXJlbmNlLmtleS5sb2NhbGVDb21wYXJlKGIucmVmZXJlbmNlLmtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzQ29udGVudENoYW5nZShhKSA/IC0xIDogMTtcbiAgfSk7XG5cbiAgLy8gRmlsdGVyIG91dCBkdXBsaWNhdGUgYW5kIG5vLW9wIGNoYW5nZXNcbiAgcmV0dXJuIGNoYW5nZXMuZmlsdGVyKChjaGFuZ2UsIGluZGV4KSA9PiB7XG4gICAgaWYgKGNoYW5nZS5vbGRDb250ZW50ID09PSBjaGFuZ2UubmV3Q29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIWRlZXBFcXVhbChjaGFuZ2UsIGNoYW5nZXNbaW5kZXggLSAxXSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoYW5nZXMoY2hhbmdlczogRmlsZUNoYW5nZVtdLCBjb250ZW50OiBzdHJpbmcsIGZyb250bWF0dGVyOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+LCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWRhdGVDaGFuZ2VzRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignRmlsZUNoYW5nZTp2YWxpZGF0ZUNoYW5nZXMnKTtcbiAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgY2hhbmdlcykge1xuICAgIGlmIChpc0NvbnRlbnRDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgY29uc3Qgc3RhcnRPZmZzZXQgPSBjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICAgIGNvbnN0IGVuZE9mZnNldCA9IGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldDtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpO1xuICAgICAgaWYgKGFjdHVhbENvbnRlbnQgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgIHZhbGlkYXRlQ2hhbmdlc0RlYnVnZ2VyKCdDb250ZW50IG1pc21hdGNoJywge1xuICAgICAgICAgIGFjdHVhbENvbnRlbnQsXG4gICAgICAgICAgZW5kT2Zmc2V0LFxuICAgICAgICAgIGV4cGVjdGVkQ29udGVudDogY2hhbmdlLm9sZENvbnRlbnQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBzdGFydE9mZnNldFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoY2hhbmdlKSkge1xuICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGdldE5lc3RlZFByb3BlcnR5VmFsdWUoZnJvbnRtYXR0ZXIsIGNoYW5nZS5yZWZlcmVuY2Uua2V5KTtcbiAgICAgIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsaWRhdGVDaGFuZ2VzRGVidWdnZXIoJ1Byb3BlcnR5IHZhbHVlIGlzIG5vdCBhIHN0cmluZycsIHtcbiAgICAgICAgICBmcm9udG1hdHRlcktleTogY2hhbmdlLnJlZmVyZW5jZS5rZXksXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBwcm9wZXJ0eVZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBwcm9wZXJ0eVZhbHVlLnNsaWNlKGNoYW5nZS5yZWZlcmVuY2Uuc3RhcnRPZmZzZXQsIGNoYW5nZS5yZWZlcmVuY2UuZW5kT2Zmc2V0KTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ICE9PSBjaGFuZ2Uub2xkQ29udGVudCkge1xuICAgICAgICB2YWxpZGF0ZUNoYW5nZXNEZWJ1Z2dlcignQ29udGVudCBtaXNtYXRjaCcsIHtcbiAgICAgICAgICBhY3R1YWxDb250ZW50LFxuICAgICAgICAgIGV4cGVjdGVkQ29udGVudDogY2hhbmdlLm9sZENvbnRlbnQsXG4gICAgICAgICAgZnJvbnRtYXR0ZXJLZXk6IGNoYW5nZS5yZWZlcmVuY2Uua2V5LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgc3RhcnRPZmZzZXQ6IGNoYW5nZS5yZWZlcmVuY2Uuc3RhcnRPZmZzZXRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckNoYW5nZShjaGFuZ2UpKSB7XG4gICAgICBjb25zdCBhY3R1YWxDb250ZW50ID0gZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZShmcm9udG1hdHRlciwgY2hhbmdlLnJlZmVyZW5jZS5rZXkpO1xuICAgICAgaWYgKGFjdHVhbENvbnRlbnQgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgIHZhbGlkYXRlQ2hhbmdlc0RlYnVnZ2VyKCdDb250ZW50IG1pc21hdGNoJywge1xuICAgICAgICAgIGFjdHVhbENvbnRlbnQsXG4gICAgICAgICAgZXhwZWN0ZWRDb250ZW50OiBjaGFuZ2Uub2xkQ29udGVudCxcbiAgICAgICAgICBmcm9udG1hdHRlcktleTogY2hhbmdlLnJlZmVyZW5jZS5rZXksXG4gICAgICAgICAgcGF0aFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWNQLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsb0JBQW9CO0FBQzdCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGVBQWU7QUF1Q3hCLGVBQXNCLG9CQUNwQixhQUNBLFNBQ0EsTUFDQSxpQkFDQSw4QkFBOEIsTUFDTjtBQUN4QixjQUFZLGVB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
|