@mnaoumov/obsidian-lib 10.0.0 → 10.1.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/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/link.cjs +27 -4
- package/dist/lib/cjs/link.d.cts +60 -0
- package/dist/lib/cjs/parse-link.cjs +21 -6
- package/dist/lib/cjs/parse-link.d.cts +4 -0
- package/dist/lib/cjs/resource-lock.cjs +20 -2
- package/dist/lib/cjs/resource-lock.d.cts +13 -0
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/link.d.mts +60 -0
- package/dist/lib/esm/link.mjs +27 -4
- package/dist/lib/esm/parse-link.d.mts +4 -0
- package/dist/lib/esm/parse-link.mjs +21 -6
- package/dist/lib/esm/resource-lock.d.mts +13 -0
- package/dist/lib/esm/resource-lock.mjs +20 -2
- package/package.json +1 -1
|
@@ -266,6 +266,10 @@ export declare function parseLink($string: string, options?: ParseLinkOptions):
|
|
|
266
266
|
* `[alias](www.example.com)` is an internal link in Obsidian. A literal wrapped in `<...>` reports the
|
|
267
267
|
* brackets as part of `raw`, so replacing `raw` leaves no stray bracket behind.
|
|
268
268
|
*
|
|
269
|
+
* Code is never scanned: fenced and indented code blocks, a fence's info string and inline code hold no
|
|
270
|
+
* link in Obsidian. A bare `file:` URL is reported only when a slash or a backslash follows the scheme, so a
|
|
271
|
+
* word such as `file:python3.py` stays text.
|
|
272
|
+
*
|
|
269
273
|
* @param $string - The string to parse the links in.
|
|
270
274
|
* @param options - The parse options.
|
|
271
275
|
* @returns The parsed links.
|
|
@@ -44,6 +44,7 @@ import { remark } from "remark";
|
|
|
44
44
|
import remarkParse from "remark-parse";
|
|
45
45
|
import { wikiLinkPlugin } from "remark-wiki-link";
|
|
46
46
|
import { visit } from "unist-util-visit";
|
|
47
|
+
const BARE_FILE_URL_REG_EXP = /^file:[/\\]/i;
|
|
47
48
|
const SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX = /[\\[\]<>_*~=`$]/g;
|
|
48
49
|
const WIKILINK_DIVIDER = "|";
|
|
49
50
|
const WWW_AUTOLINK_LITERAL_CANDIDATE_REG_EXP = /(?:^|[\s(*<_~])(?<Literal>www\.[^\s<>]*)/g;
|
|
@@ -158,9 +159,20 @@ function parseLinks($string, options) {
|
|
|
158
159
|
const root = processor.parse(noEmbedString);
|
|
159
160
|
const links = [];
|
|
160
161
|
const textLinks = [];
|
|
162
|
+
const skippedRanges = [];
|
|
161
163
|
visit(root, (node) => {
|
|
162
164
|
let link;
|
|
163
165
|
switch (node.type) {
|
|
166
|
+
// Obsidian never links anything inside code, so its text, a fence's info string included, is not scanned for bare URLs.
|
|
167
|
+
case "code":
|
|
168
|
+
case "inlineCode": {
|
|
169
|
+
const position = ensureNonNullable(node.position);
|
|
170
|
+
skippedRanges.push({
|
|
171
|
+
endOffset: ensureNonNullable(position.end.offset),
|
|
172
|
+
startOffset: ensureNonNullable(position.start.offset)
|
|
173
|
+
});
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
164
176
|
case "link": {
|
|
165
177
|
link = parseLinkNode(node, $string);
|
|
166
178
|
break;
|
|
@@ -183,17 +195,20 @@ function parseLinks($string, options) {
|
|
|
183
195
|
}
|
|
184
196
|
links.push(link);
|
|
185
197
|
});
|
|
186
|
-
links.sort((a, b) => a.startOffset - b.startOffset);
|
|
187
|
-
let textStartOffset = 0;
|
|
188
198
|
for (const link of links) {
|
|
199
|
+
skippedRanges.push({ endOffset: link.endOffset + 1, startOffset: link.startOffset });
|
|
200
|
+
}
|
|
201
|
+
skippedRanges.sort((a, b) => a.startOffset - b.startOffset);
|
|
202
|
+
let textStartOffset = 0;
|
|
203
|
+
for (const skippedRange of skippedRanges) {
|
|
189
204
|
extractTextLinks({
|
|
190
205
|
$string,
|
|
191
|
-
endOffset:
|
|
206
|
+
endOffset: skippedRange.startOffset - 1,
|
|
192
207
|
shouldRecognizeWwwAutolinkLiterals,
|
|
193
208
|
startOffset: textStartOffset,
|
|
194
209
|
textLinks
|
|
195
210
|
});
|
|
196
|
-
textStartOffset =
|
|
211
|
+
textStartOffset = Math.max(textStartOffset, skippedRange.endOffset);
|
|
197
212
|
}
|
|
198
213
|
extractTextLinks({
|
|
199
214
|
$string,
|
|
@@ -260,7 +275,7 @@ function extractTextLinks(params) {
|
|
|
260
275
|
replaceAll({
|
|
261
276
|
$string: textPart,
|
|
262
277
|
replacer: ({ capturedGroupArguments: [rawUrl = ""], offset }) => {
|
|
263
|
-
if (!isUrl(rawUrl)) {
|
|
278
|
+
if (!isUrl(rawUrl) || isFileUrl(rawUrl) && !BARE_FILE_URL_REG_EXP.test(rawUrl)) {
|
|
264
279
|
return;
|
|
265
280
|
}
|
|
266
281
|
const url = decodeUrlSafely({
|
|
@@ -460,4 +475,4 @@ export {
|
|
|
460
475
|
toParseLinkReference,
|
|
461
476
|
unescapeAlias
|
|
462
477
|
};
|
|
463
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYXJzZS1saW5rLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIHBhcnNpbmcgbWFya2Rvd24gYW5kIHdpa2kgbGlua3MgaW50byBzdHJ1Y3R1cmVkIGRhdGEsIGFuZCBmb3JcbiAqIGVzY2FwaW5nLCB1bmVzY2FwaW5nLCBhbmQgZW5jb2RpbmcgbGluayBjb21wb25lbnRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgdHlwZSB7IExpbmsgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEZyb250bWF0dGVyTGlua0NhY2hlLFxuICBMb2MsXG4gIFJlZmVyZW5jZSxcbiAgUmVmZXJlbmNlQ2FjaGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSAndW5pc3QnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyByZXBsYWNlQWxsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQge1xuICBlbmNvZGVVcmwsXG4gIGlzRmlsZVVybCxcbiAgaXNVcmxcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3VybCc7XG5pbXBvcnQgeyBpc0Zyb250bWF0dGVyTGlua0NhY2hlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHsgcmVtYXJrIH0gZnJvbSAncmVtYXJrJztcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tICdyZW1hcmstcGFyc2UnO1xuaW1wb3J0IHsgd2lraUxpbmtQbHVnaW4gfSBmcm9tICdyZW1hcmstd2lraS1saW5rJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdCc7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIG1hcmtkb3duIGxpbmsgc3ltYm9scy5cbiAqL1xuY29uc3QgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVggPSAvW1xcXFxbXFxdPD5fKn49YCRdL2c7XG5cbmNvbnN0IFdJS0lMSU5LX0RJVklERVIgPSAnfCc7XG5cbi8qKlxuICogTWF0Y2hlcyBhIGNhbmRpZGF0ZSBHRk0gZXh0ZW5kZWQgYHd3dy5gIGF1dG9saW5rIGxpdGVyYWw6IGB3d3cuYCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgb3IgYWZ0ZXJcbiAqIHdoaXRlc3BhY2UsIGAqYCwgYF9gLCBgfmAsIGAoYCBvciBgPGAsIHJ1bm5pbmcgdXAgdG8gdGhlIG5leHQgd2hpdGVzcGFjZSwgYDxgIG9yIGA+YC4gR0ZNIGl0c2VsZlxuICoga2VlcHMgYSBjbG9zaW5nIGA+YCBpbiB0aGUgbGl0ZXJhbCAoT2JzaWRpYW4gcmVuZGVycyBgPHd3dy5leGFtcGxlLmNvbT5gIHdpdGggYW4gaHJlZiBlbmRpbmcgaW5cbiAqIGAlM0VgKTsgc3RvcHBpbmcgYmVmb3JlIGl0IGlzIGRlbGliZXJhdGUsIHNvIHRoZSBicmFja2V0cyBjYW4gYmUgcmVwb3J0ZWQgYXJvdW5kIHRoZSBsaXRlcmFsIGluc3RlYWQuXG4gKlxuICogVGhlIHByZWNlZGluZyBjaGFyYWN0ZXIgaXMgY29uc3VtZWQgYW5kIHRoZSBsaXRlcmFsIGNhcHR1cmVkIGFzIGBMaXRlcmFsYCwgYmVjYXVzZSBhIGxvb2tiZWhpbmQgaXMgYVxuICogc3ludGF4IGVycm9yIG9uIGlPUyBiZWZvcmUgMTYuNCwgYmVsb3cgdGhlIGlPUyAxNSBPYnNpZGlhbiBtb2JpbGUgc3RpbGwgc3VwcG9ydHMuIENvbnN1bWluZyBpdCBsb3NlcyBub1xuICogY2FuZGlkYXRlOiBhIG1hdGNoIGVuZHMgYmVmb3JlIHdoaXRlc3BhY2UsIGA8YCwgYD5gIG9yIHRoZSBlbmQsIHNvIHRoZSBjaGFyYWN0ZXIgYSBmb2xsb3dpbmcgY2FuZGlkYXRlXG4gKiBuZWVkcyBpcyBuZXZlciBwYXJ0IG9mIHRoZSBwcmV2aW91cyBtYXRjaC5cbiAqL1xuY29uc3QgV1dXX0FVVE9MSU5LX0xJVEVSQUxfQ0FORElEQVRFX1JFR19FWFAgPSAvKD86XnxbXFxzKCo8X35dKSg/PExpdGVyYWw+d3d3XFwuW15cXHM8Pl0qKS9nO1xuXG4vKipcbiAqIE1hdGNoZXMgdGhlIGRvbWFpbiBvZiBhIEdGTSBleHRlbmRlZCBgd3d3LmAgYXV0b2xpbmsgbGl0ZXJhbDogc2VnbWVudHMgb2YgbGV0dGVycywgZGlnaXRzLFxuICogdW5kZXJzY29yZXMgYW5kIGh5cGhlbnMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMuXG4gKi9cbmNvbnN0IFdXV19BVVRPTElOS19MSVRFUkFMX0RPTUFJTl9SRUdfRVhQID0gL153d3coPzpcXC5bXFxwe0x9XFxwe059Xy1dKykrL3U7XG5cbi8qKlxuICogVGhlIGNoYXJhY3RlcnMgR0ZNIGRyb3BzIGZyb20gdGhlIGVuZCBvZiBhbiBleHRlbmRlZCBhdXRvbGluay5cbiAqL1xuY29uc3QgV1dXX0FVVE9MSU5LX0xJVEVSQUxfVFJBSUxJTkdfUFVOQ1RVQVRJT04gPSBuZXcgU2V0KFsnXycsICcsJywgJzonLCAnIScsICc/JywgJy4nLCAnKicsICd+J10pO1xuXG4vKipcbiAqIE1hdGNoZXMgYW4gZW50aXR5IHJlZmVyZW5jZSBhdCB0aGUgZW5kIG9mIGFuIGV4dGVuZGVkIGF1dG9saW5rLCB3aGljaCBHRk0gZHJvcHMuXG4gKi9cbmNvbnN0IFRSQUlMSU5HX0VOVElUWV9SRUZFUkVOQ0VfUkVHX0VYUCA9IC8mW1xcZEEtWmEtel0rOyQvO1xuXG4vKipcbiAqIFRoZSBzY2hlbWUgT2JzaWRpYW4gb3BlbnMgYSBHRk0gZXh0ZW5kZWQgYHd3dy5gIGF1dG9saW5rIGxpdGVyYWwgd2l0aC5cbiAqL1xuY29uc3QgV1dXX0FVVE9MSU5LX0xJVEVSQUxfU0NIRU1FID0gJ2h0dHA6Ly8nO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgcGFyc2luZyB0aGUgbGlua3MgZnJvbSBhIG5vdGUncyBmcm9udG1hdHRlciB2aWEge0BsaW5rIHBhcnNlRnJvbnRtYXR0ZXJMaW5rc30uIEludGVybmFsXG4gKiBzaW5nbGUtbGluayBmcm9udG1hdHRlciB2YWx1ZXMgYXJlIG9taXR0ZWQsIGFzIE9ic2lkaWFuIG5hdGl2ZWx5IGNhY2hlcyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlRnJvbnRtYXR0ZXJMaW5rc1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIGZyb250bWF0dGVyIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rczogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0c1tdO1xufVxuXG4vKipcbiAqIEEge0BsaW5rIEZyb250bWF0dGVyTGlua0NhY2hlfSBmb3IgYSBsaW5rIHBhcnNlZCBmcm9tIGEgc2luZ2xlLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWUgdmlhXG4gKiB7QGxpbmsgcGFyc2VMaW5rc30uIEl0IGNhcnJpZXMgdGhlIGZ1bGwge0BsaW5rIFBhcnNlTGlua1Jlc3VsdH0gc28gY29uc3VtZXJzIGNhbiBpbnNwZWN0IHRoZSBwYXJzZVxuICogZGV0YWlscyB3aXRob3V0IHJlLXBhcnNpbmcgdGhlIGxpbmsuIFVzZSB0aGlzIHdoZW4gdGhlIHdob2xlIGZyb250bWF0dGVyIHZhbHVlIGlzIGEgc2luZ2xlIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2UgZXh0ZW5kcyBGcm9udG1hdHRlckxpbmtDYWNoZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBwYXJzZUxpbmtSZXN1bHQ6IFBhcnNlTGlua1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZX0gZm9yIGEgbGluayBwYXJzZWQgZnJvbSBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWUgdmlhXG4gKiB7QGxpbmsgcGFyc2VMaW5rc30sIGFkZGl0aW9uYWxseSBjYXJyeWluZyB0aGUgb2Zmc2V0cyBvZiB0aGUgbGluayB3aXRoaW4gdGhlIGZyb250bWF0dGVyIHZhbHVlLiBVc2VcbiAqIHRoaXMgd2hlbiB0aGUgZnJvbnRtYXR0ZXIgdmFsdWUgaG9sZHMgbXVsdGlwbGUgbGlua3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0cyBleHRlbmRzIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIEFuIGVuZCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIGZyb250bWF0dGVyIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBmcm9udG1hdHRlciB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHBhcnNlTGlua30uIFRoZSBzYW1lIGFzIHtAbGluayBQYXJzZUxpbmtzT3B0aW9uc30uXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlTGlua09wdGlvbnMgPSBQYXJzZUxpbmtzT3B0aW9ucztcblxuLyoqXG4gKiBBIHtAbGluayBSZWZlcmVuY2VDYWNoZX0gZm9yIGEgbGluayBwYXJzZWQgZnJvbSBjb250ZW50IHZpYSB7QGxpbmsgcGFyc2VMaW5rc30uIEl0IGNhcnJpZXMgdGhlIGZ1bGxcbiAqIHtAbGluayBQYXJzZUxpbmtSZXN1bHR9IHNvIGNvbnN1bWVycyBjYW4gaW5zcGVjdCB0aGUgcGFyc2UgZGV0YWlscyB3aXRob3V0IHJlLXBhcnNpbmcgdGhlIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVmZXJlbmNlIGV4dGVuZHMgUmVmZXJlbmNlQ2FjaGUge1xuICAvKipcbiAgICogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VMaW5rUmVzdWx0OiBQYXJzZUxpbmtSZXN1bHQ7XG59XG5cbi8qKlxuICogQSByZXN1bHQgb2YgcGFyc2luZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVzdWx0IHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiBcXCphbGlhc1xcKlxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmNvZGVkIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsgd2l0aCBzcGFjZS5tZD4pIC0+IGxpbmslMjB3aXRoJTIwc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBlbmNvZGVkVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKDxsaW5rLm1kPikgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaGFzQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogIVtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFtbYWxpYXNdXSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBleHRlcm5hbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oaHR0cHM6Ly9leGFtcGxlLmNvbSkgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGZpbGUubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgYGZpbGU6Ly9gIFVSTC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oZmlsZTovLy9DOi94LnR4dCkgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGh0dHBzOi8vZXhhbXBsZS5jb20pIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNGaWxlVXJsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFthbGlhc10obGluay5tZCkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHJhdyBsaW5rIHRleHQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IFthbGlhc10obGluay5tZClcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSByYXc6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdGFydCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIG9yaWdpbmFsIHRleHQuXG4gICAqL1xuICByZWFkb25seSBzdGFydE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHRpdGxlIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rLm1kIFwidGl0bGVcIikgLT4gdGl0bGVcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gdW5lc2NhcGVkIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiAqYWxpYXMqXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgdW5lc2NhcGVkQWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluayUyMHdpdGglMjBzcGFjZS5tZCkgLT4gbGluayB3aXRoIHNwYWNlLm1kXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHBhcnNlTGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlTGlua3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVjb2duaXplIEdGTSBleHRlbmRlZCBgd3d3LmAgYXV0b2xpbmsgbGl0ZXJhbHMgKGB3d3cuZXhhbXBsZS5jb21gLCBhbHNvIGluc2lkZVxuICAgKiBgPC4uLj5gKSBhcyBleHRlcm5hbCBsaW5rcywgYXMgT2JzaWRpYW4gZG9lcyBpbiBhIG5vdGUncyBib2R5LiBPYnNpZGlhbiBkb2VzIG5vdCBsaW5rIHRoZW0gaW5cbiAgICogZnJvbnRtYXR0ZXIgdmFsdWVzLCBzbyB7QGxpbmsgcGFyc2VGcm9udG1hdHRlckxpbmtzfSB0dXJucyB0aGlzIG9mZi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVjb2duaXplV3d3QXV0b2xpbmtMaXRlcmFscz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdG9QYXJzZUxpbmtSZWZlcmVuY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvUGFyc2VMaW5rUmVmZXJlbmNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRoZSBwYXJzZWQgbGluaydzIG9mZnNldHMgaW5kZXggaW50by4gVXNlZCB0byBjb21wdXRlIHRoZSBsaW5lIGFuZCBjb2x1bW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJzZWQgbGluayB0byB3cmFwLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VMaW5rUmVzdWx0OiBQYXJzZUxpbmtSZXN1bHQ7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgRnJvbnRtYXR0ZXJMaW5rc1BhcnNlci5jYXRlZ29yaXplfS5cbiAqL1xuaW50ZXJmYWNlIENhdGVnb3JpemVGcm9udG1hdHRlckxpbmtQYXJhbXMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgd2hvbGUgZnJvbnRtYXR0ZXIgdmFsdWUgaXMgYSBzaW5nbGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzU2luZ2xlTGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGtleSBwYXRoIG9mIHRoZSBmcm9udG1hdHRlciB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyc2VkIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBwYXJzZUxpbmtSZXN1bHQ6IFBhcnNlTGlua1Jlc3VsdDtcblxuICAvKipcbiAgICogVGhlIGZyb250bWF0dGVyIHZhbHVlIHRoZSBsaW5rIHdhcyBwYXJzZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZGVjb2RlVXJsU2FmZWx5fS5cbiAqL1xuaW50ZXJmYWNlIERlY29kZVVybFNhZmVseVBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMuXG4gICAqL1xuICByZWFkb25seSBoYXNBbmdsZUJyYWNrZXRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIGlzIGV4dGVybmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBVUkwgdG8gZGVjb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZXh0cmFjdEFsaWFzfS5cbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RBbGlhc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIHN0cmluZyB0byBleHRyYWN0IHRoZSBhbGlhcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgJHN0cmluZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBhbGlhcyBpbiB0aGUgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNFbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdGFydCBvZmZzZXQgb2YgdGhlIGFsaWFzIGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBhbGlhc1N0YXJ0T2Zmc2V0OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZXh0cmFjdFRleHRMaW5rc30uXG4gKi9cbmludGVyZmFjZSBFeHRyYWN0VGV4dExpbmtzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIHRleHQgbGlua3MgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5ICRzdHJpbmc6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBwYXJ0IGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZWNvZ25pemUgR0ZNIGV4dGVuZGVkIGB3d3cuYCBhdXRvbGluayBsaXRlcmFscy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlY29nbml6ZVd3d0F1dG9saW5rTGl0ZXJhbHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSB0ZXh0IHBhcnQgaW4gdGhlIHN0cmluZy5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBwYXJzZWQgbGlua3MgdG8gYXBwZW5kIHRoZSBleHRyYWN0ZWQgdGV4dCBsaW5rcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W107XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2V0V2hvbGVWYWx1ZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2V0V2hvbGVWYWx1ZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGxpbmtzIHtAbGluayBwYXJzZUxpbmtzfSBmb3VuZCBpbiB0aGUgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSBsaW5rczogcmVhZG9ubHkgUGFyc2VMaW5rUmVzdWx0W107XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJzZSBvcHRpb25zIHRoZSBsaW5rcyB3ZXJlIGZvdW5kIHdpdGguXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBQYXJzZUxpbmtzT3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRvIHJlYWQgYXMgb25lIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGhhc0FuZ2xlQnJhY2tldHNJbkxpbmt9LlxuICovXG5pbnRlcmZhY2UgSGFzQW5nbGVCcmFja2V0c0luTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIHJhdyBsaW5rIHRleHQuXG4gICAqL1xuICByZWFkb25seSByYXc6IHN0cmluZztcblxuICAvKipcbiAgICogQSByYXcgVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3VXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgd2lkZW5Ub1dob2xlVmFsdWV9LlxuICovXG5pbnRlcmZhY2UgV2lkZW5Ub1dob2xlVmFsdWVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG9mZnNldCBvZiB0aGUgYF0oYCB0aGF0IGVuZHMgdGhlIGNhcHRpb24uXG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uRW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5rIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUGFyc2VMaW5rUmVzdWx0O1xuXG4gIC8qKlxuICAgKiBUaGUgd2hvbGUgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlIGV4dGVuZHMgTm9kZSB7XG4gIHJlYWRvbmx5IGRhdGE6IFdpa2lMaW5rTm9kZURhdGE7XG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBXaWtpTGlua05vZGVEYXRhIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZWFkb25seSBhbGlhczogc3RyaW5nO1xufVxuXG5jbGFzcyBGcm9udG1hdHRlckxpbmtzUGFyc2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmcm9udG1hdHRlckV4dGVybmFsTGlua3M6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rczogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0c1tdID0gW107XG5cbiAgcHVibGljIHBhcnNlKGZyb250bWF0dGVyOiB1bmtub3duKTogUGFyc2VGcm9udG1hdHRlckxpbmtzUmVzdWx0IHtcbiAgICB0aGlzLnBhcnNlVmFsdWUoZnJvbnRtYXR0ZXIsICcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0aGlzLmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRoaXMubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIG11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzOiB0aGlzLm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2F0ZWdvcml6ZShwYXJhbXM6IENhdGVnb3JpemVGcm9udG1hdHRlckxpbmtQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGlzU2luZ2xlTGluaywga2V5LCBwYXJzZUxpbmtSZXN1bHQsIHZhbHVlIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCAmJiBpc1NpbmdsZUxpbmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWZlcmVuY2U6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlID0ge1xuICAgICAgZGlzcGxheVRleHQ6IHBhcnNlTGlua1Jlc3VsdC5hbGlhcyA/PyBwYXJzZUxpbmtSZXN1bHQudXJsLFxuICAgICAga2V5LFxuICAgICAgbGluazogcGFyc2VMaW5rUmVzdWx0LnVybCxcbiAgICAgIG9yaWdpbmFsOiB2YWx1ZSxcbiAgICAgIHBhcnNlTGlua1Jlc3VsdFxuICAgIH07XG5cbiAgICBpZiAoaXNTaW5nbGVMaW5rKSB7XG4gICAgICB0aGlzLmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcy5wdXNoKHJlZmVyZW5jZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVmZXJlbmNlV2l0aE9mZnNldHM6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHMgPSB7XG4gICAgICAuLi5yZWZlcmVuY2UsXG4gICAgICBlbmRPZmZzZXQ6IHBhcnNlTGlua1Jlc3VsdC5lbmRPZmZzZXQsXG4gICAgICBzdGFydE9mZnNldDogcGFyc2VMaW5rUmVzdWx0LnN0YXJ0T2Zmc2V0XG4gICAgfTtcblxuICAgIGlmIChwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCkge1xuICAgICAgdGhpcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLnB1c2gocmVmZXJlbmNlV2l0aE9mZnNldHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzLnB1c2gocmVmZXJlbmNlV2l0aE9mZnNldHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VWYWx1ZSh2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gT2JzaWRpYW4gbGlua3MgYSBzY2hlbWUtbGVzcyBgd3d3LmAgbGl0ZXJhbCBpbiB0aGUgYm9keSBvbmx5LCBuZXZlciBpbiBhIGZyb250bWF0dGVyIHZhbHVlLlxuICAgICAgY29uc3Qgb3B0aW9uczogUGFyc2VMaW5rc09wdGlvbnMgPSB7IHNob3VsZFJlY29nbml6ZVd3d0F1dG9saW5rTGl0ZXJhbHM6IGZhbHNlIH07XG4gICAgICBjb25zdCBwYXJzZUxpbmtSZXN1bHRzID0gcGFyc2VMaW5rcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICBjb25zdCB3aG9sZVZhbHVlTGluayA9IGdldFdob2xlVmFsdWVMaW5rKHsgbGlua3M6IHBhcnNlTGlua1Jlc3VsdHMsIG9wdGlvbnMsIHZhbHVlIH0pO1xuICAgICAgaWYgKHdob2xlVmFsdWVMaW5rKSB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcml6ZSh7IGlzU2luZ2xlTGluazogdHJ1ZSwga2V5LCBwYXJzZUxpbmtSZXN1bHQ6IHdob2xlVmFsdWVMaW5rLCB2YWx1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHBhcnNlTGlua1Jlc3VsdCBvZiBwYXJzZUxpbmtSZXN1bHRzKSB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcml6ZSh7IGlzU2luZ2xlTGluazogZmFsc2UsIGtleSwgcGFyc2VMaW5rUmVzdWx0LCB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBHZW5lcmljT2JqZWN0KSkge1xuICAgICAgdGhpcy5wYXJzZVZhbHVlKGNoaWxkVmFsdWUsIGtleSA/IGAke2tleX0uJHtjaGlsZEtleX1gIDogY2hpbGRLZXkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGhlIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqXG4gKiBAcGFyYW0gYWxpYXMgLSBBbiBhbGlhcyBvZiBhIG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBBbiBlc2NhcGVkIGFsaWFzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZXNjYXBlQWxpYXMoJyoqYWxpYXMqKicpIC8vICdcXFxcKlxcXFwqYWxpYXNcXFxcKlxcXFwqJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVBbGlhcyhhbGlhczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGFsaWFzLFxuICAgIHJlcGxhY2VyOiBTdHJpbmcucmF3YFxcJCZgLFxuICAgIHNlYXJjaFZhbHVlOiBTUEVDSUFMX01BUktET1dOX0xJTktfU1lNQk9MU19SRUdFWFxuICB9KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSByZWZlcmVuY2UgaXMgYSB7QGxpbmsgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2V9LlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByZWZlcmVuY2UgaXMgYSB7QGxpbmsgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2V9LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2UocmVmZXJlbmNlOiBSZWZlcmVuY2UpOiByZWZlcmVuY2UgaXMgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2Uge1xuICByZXR1cm4gaXNGcm9udG1hdHRlckxpbmtDYWNoZShyZWZlcmVuY2UpICYmICdwYXJzZUxpbmtSZXN1bHQnIGluIHJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSByZWZlcmVuY2UgaXMgYSB7QGxpbmsgUGFyc2VMaW5rUmVmZXJlbmNlfS5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmVmZXJlbmNlIGlzIGEge0BsaW5rIFBhcnNlTGlua1JlZmVyZW5jZX0sIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzZUxpbmtSZWZlcmVuY2UocmVmZXJlbmNlOiBSZWZlcmVuY2UpOiByZWZlcmVuY2UgaXMgUGFyc2VMaW5rUmVmZXJlbmNlIHtcbiAgcmV0dXJuICdwYXJzZUxpbmtSZXN1bHQnIGluIHJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGxpbmtzIGZyb20gYSBub3RlJ3MgZnJvbnRtYXR0ZXIuIEVhY2ggc3RyaW5nIHZhbHVlIGlzIHBhcnNlZCB2aWEge0BsaW5rIHBhcnNlTGlua3N9OiBhIHZhbHVlXG4gKiB0aGF0IGlzIGEgc2luZ2xlIGxpbmsgeWllbGRzIGFuIGVudHJ5IHdpdGhvdXQgb2Zmc2V0cywgYW5kIGEgdmFsdWUgdGhhdCBob2xkcyBtdWx0aXBsZSBsaW5rcyB5aWVsZHNcbiAqIG9mZnNldC1jYXJyeWluZyBlbnRyaWVzLiBBIHZhbHVlIGlzIGEgc2luZ2xlIGxpbmsgdGhlIHdheSBPYnNpZGlhbiByZWFkcyBpdCwgc28gYFtBIFsgQl0odC5tZClgIGlzIG9uZVxuICogbGluayBjYXB0aW9uZWQgYEEgWyBCYCAoc2VlIHtAbGluayBwYXJzZUxpbmt9KS4gSW50ZXJuYWwgc2luZ2xlLWxpbmsgdmFsdWVzIGFyZSBvbWl0dGVkLCBhcyBPYnNpZGlhbiBuYXRpdmVseSBjYWNoZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gZnJvbnRtYXR0ZXIgLSBUaGUgZnJvbnRtYXR0ZXIgdG8gcGFyc2UgKGEgdmFsdWUsIG9iamVjdCwgb3IgYXJyYXkpLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBmcm9udG1hdHRlciBsaW5rcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnJvbnRtYXR0ZXJMaW5rcyhmcm9udG1hdHRlcjogdW5rbm93bik6IFBhcnNlRnJvbnRtYXR0ZXJMaW5rc1Jlc3VsdCB7XG4gIHJldHVybiBuZXcgRnJvbnRtYXR0ZXJMaW5rc1BhcnNlcigpLnBhcnNlKGZyb250bWF0dGVyKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBsaW5rIGludG8gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogQSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCBgW2AgYW5kIGVuZHMgd2l0aCBhIG1hcmtkb3duIGxpbmsgaXMgcmVhZCBhcyBPTkUgbGluayB3aG9zZSBjYXB0aW9uIHJ1bnNcbiAqIGZyb20gdGhlIGxlYWRpbmcgYFtgIHRvIHRoYXQgbGluaydzIGBdKGAsIHRoZSB3YXkgT2JzaWRpYW4gcmVhZHMgYSBmcm9udG1hdHRlciB2YWx1ZTogYFtBIFsgQl0odC5tZClgXG4gKiBoYXMgdGhlIGFsaWFzIGBBIFsgQmAsIHdoZXJlIENvbW1vbk1hcmsgZmluZHMgb25seSBgWyBCXSh0Lm1kKWAuXG4gKlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgbGluayB0byBwYXJzZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcnNlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmsoJHN0cmluZzogc3RyaW5nLCBvcHRpb25zPzogUGFyc2VMaW5rT3B0aW9ucyk6IG51bGwgfCBQYXJzZUxpbmtSZXN1bHQge1xuICByZXR1cm4gZ2V0V2hvbGVWYWx1ZUxpbmsoeyBsaW5rczogcGFyc2VMaW5rcygkc3RyaW5nLCBvcHRpb25zKSwgb3B0aW9ucywgdmFsdWU6ICRzdHJpbmcgfSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGFsbCBsaW5rcyBpbiBhIHN0cmluZy5cbiAqXG4gKiBCZXNpZGVzIG1hcmtkb3duIGxpbmtzLCB3aWtpbGlua3MgYW5kIGF1dG9saW5rcywgdGhlIHBsYWluIHRleHQgYmV0d2VlbiB0aGVtIGlzIHNjYW5uZWQgZm9yIGJhcmVcbiAqIFVSTHMgd2l0aCBhIHNjaGVtZSAoYGh0dHBzOi8vZXhhbXBsZS5jb21gKSBhbmQsIHVubGVzcyB0dXJuZWQgb2ZmIHRocm91Z2hcbiAqIHtAbGluayBQYXJzZUxpbmtzT3B0aW9ucy5zaG91bGRSZWNvZ25pemVXd3dBdXRvbGlua0xpdGVyYWxzfSwgZm9yIEdGTSBleHRlbmRlZCBgd3d3LmAgYXV0b2xpbmtcbiAqIGxpdGVyYWxzIChgd3d3LmV4YW1wbGUuY29tYCkuIFN1Y2ggYSBsaXRlcmFsIGlzIHJlcG9ydGVkIGFzIGFuIGV4dGVybmFsIGxpbmsgd2hvc2UgYHVybGAgY2FycmllcyB0aGVcbiAqIGBodHRwOi8vYCBzY2hlbWUgT2JzaWRpYW4gb3BlbnMgaXQgd2l0aCwgc28gYSBsaW5rIHJlYnVpbHQgZnJvbSBpdCBzdGF5cyBleHRlcm5hbDogYSBzY2hlbWUtbGVzc1xuICogYFthbGlhc10od3d3LmV4YW1wbGUuY29tKWAgaXMgYW4gaW50ZXJuYWwgbGluayBpbiBPYnNpZGlhbi4gQSBsaXRlcmFsIHdyYXBwZWQgaW4gYDwuLi4+YCByZXBvcnRzIHRoZVxuICogYnJhY2tldHMgYXMgcGFydCBvZiBgcmF3YCwgc28gcmVwbGFjaW5nIGByYXdgIGxlYXZlcyBubyBzdHJheSBicmFja2V0IGJlaGluZC5cbiAqXG4gKiBAcGFyYW0gJHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gcGFyc2UgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyc2Ugb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmtzKCRzdHJpbmc6IHN0cmluZywgb3B0aW9ucz86IFBhcnNlTGlua3NPcHRpb25zKTogUGFyc2VMaW5rUmVzdWx0W10ge1xuICBjb25zdCBzaG91bGRSZWNvZ25pemVXd3dBdXRvbGlua0xpdGVyYWxzID0gb3B0aW9ucz8uc2hvdWxkUmVjb2duaXplV3d3QXV0b2xpbmtMaXRlcmFscyA/PyB0cnVlO1xuICBjb25zdCBlbWJlZFN5bWJvbE9mZnNldHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdCBFTUJFRF9MSU5LX1BSRUZJWCA9ICchWyc7XG4gIGNvbnN0IE5PX0VNQkVEX0xJTktfUFJFRklYID0gJ0BbJztcbiAgY29uc3QgRFVNTVlfQ0hBUkFDVEVSID0gJ0AnO1xuXG4gIGNvbnN0IEVNQkVEX0lOU0lERV9MSU5LX1JFR19FWFAgPSAvXFxbKD88TGlua0FsaWFzPiFcXFsuKj9cXF1cXCguKz9cXCkpXFxdXFwoKD88TGluaz4uKz8pXFwpL2c7XG4gIGNvbnN0IG5vSW5zaWRlRW1iZWRzTGlua3NTdHJpbmcgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nLFxuICAgIHJlcGxhY2VyOiAoeyBjYXB0dXJlZEdyb3VwQXJndW1lbnRzOiBbbGlua0FsaWFzID0gJycsIGxpbmsgPSAnJ10gfSkgPT4ge1xuICAgICAgY29uc3QgZHVtbXlBbGlhcyA9IERVTU1ZX0NIQVJBQ1RFUi5yZXBlYXQobGlua0FsaWFzLmxlbmd0aCk7XG4gICAgICByZXR1cm4gYFske2R1bW15QWxpYXN9XSgke2xpbmt9KWA7XG4gICAgfSxcbiAgICBzZWFyY2hWYWx1ZTogRU1CRURfSU5TSURFX0xJTktfUkVHX0VYUFxuICB9KTtcblxuICBjb25zdCBub0VtYmVkU3RyaW5nID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbm9JbnNpZGVFbWJlZHNMaW5rc1N0cmluZyxcbiAgICByZXBsYWNlcjogKCRhcmd1bWVudHMpID0+IHtcbiAgICAgIGVtYmVkU3ltYm9sT2Zmc2V0cy5hZGQoJGFyZ3VtZW50cy5vZmZzZXQpO1xuICAgICAgcmV0dXJuIE5PX0VNQkVEX0xJTktfUFJFRklYO1xuICAgIH0sXG4gICAgc2VhcmNoVmFsdWU6IEVNQkVEX0xJTktfUFJFRklYXG4gIH0pO1xuXG4gIGNvbnN0IHByb2Nlc3NvciA9IHJlbWFyaygpLnVzZShyZW1hcmtQYXJzZSkudXNlKHdpa2lMaW5rUGx1Z2luLCB7IGFsaWFzRGl2aWRlcjogV0lLSUxJTktfRElWSURFUiB9KTtcbiAgY29uc3Qgcm9vdCA9IHByb2Nlc3Nvci5wYXJzZShub0VtYmVkU3RyaW5nKTtcblxuICBjb25zdCBsaW5rczogUGFyc2VMaW5rUmVzdWx0W10gPSBbXTtcbiAgY29uc3QgdGV4dExpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSA9IFtdO1xuXG4gIHZpc2l0KHJvb3QsIChub2RlOiBOb2RlKSA9PiB7XG4gICAgbGV0IGxpbms6IFBhcnNlTGlua1Jlc3VsdDtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnbGluayc6IHtcbiAgICAgICAgbGluayA9IHBhcnNlTGlua05vZGUobm9kZSBhcyBMaW5rLCAkc3RyaW5nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd3aWtpTGluayc6IHtcbiAgICAgICAgbGluayA9IHBhcnNlV2lraWxpbmtOb2RlKG5vZGUgYXMgV2lraUxpbmtOb2RlLCAkc3RyaW5nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW1iZWRTeW1ib2xPZmZzZXRzLmhhcyhsaW5rLnN0YXJ0T2Zmc2V0IC0gMSkpIHtcbiAgICAgIGxpbmsgPSB7XG4gICAgICAgIC4uLmxpbmssXG4gICAgICAgIGlzRW1iZWQ6IHRydWUsXG4gICAgICAgIHJhdzogYCEke2xpbmsucmF3fWAsXG4gICAgICAgIHN0YXJ0T2Zmc2V0OiBsaW5rLnN0YXJ0T2Zmc2V0IC0gMVxuICAgICAgfTtcbiAgICB9XG4gICAgbGlua3MucHVzaChsaW5rKTtcbiAgfSk7XG5cbiAgbGlua3Muc29ydCgoYSwgYikgPT4gYS5zdGFydE9mZnNldCAtIGIuc3RhcnRPZmZzZXQpO1xuXG4gIGxldCB0ZXh0U3RhcnRPZmZzZXQgPSAwO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgIGV4dHJhY3RUZXh0TGlua3Moe1xuICAgICAgJHN0cmluZyxcbiAgICAgIGVuZE9mZnNldDogbGluay5zdGFydE9mZnNldCAtIDEsXG4gICAgICBzaG91bGRSZWNvZ25pemVXd3dBdXRvbGlua0xpdGVyYWxzLFxuICAgICAgc3RhcnRPZmZzZXQ6IHRleHRTdGFydE9mZnNldCxcbiAgICAgIHRleHRMaW5rc1xuICAgIH0pO1xuICAgIHRleHRTdGFydE9mZnNldCA9IGxpbmsuZW5kT2Zmc2V0ICsgMTtcbiAgfVxuXG4gIGV4dHJhY3RUZXh0TGlua3Moe1xuICAgICRzdHJpbmcsXG4gICAgZW5kT2Zmc2V0OiAkc3RyaW5nLmxlbmd0aCAtIDEsXG4gICAgc2hvdWxkUmVjb2duaXplV3d3QXV0b2xpbmtMaXRlcmFscyxcbiAgICBzdGFydE9mZnNldDogdGV4dFN0YXJ0T2Zmc2V0LFxuICAgIHRleHRMaW5rc1xuICB9KTtcblxuICBsaW5rcy5wdXNoKC4uLnRleHRMaW5rcyk7XG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogV3JhcHMgYSB7QGxpbmsgUGFyc2VMaW5rUmVzdWx0fSBpbnRvIGEge0BsaW5rIFBhcnNlTGlua1JlZmVyZW5jZX0gc28gaXQgY2FuIGZsb3cgdGhyb3VnaCB0aGVcbiAqIHJlZmVyZW5jZS1iYXNlZCBmaWxlLWNoYW5nZSBwaXBlbGluZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHdyYXBwaW5nIHRoZSBwYXJzZWQgbGluay5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGFyc2VMaW5rUmVmZXJlbmNlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUGFyc2VMaW5rUmVmZXJlbmNlKHBhcmFtczogVG9QYXJzZUxpbmtSZWZlcmVuY2VQYXJhbXMpOiBQYXJzZUxpbmtSZWZlcmVuY2Uge1xuICBjb25zdCB7IGNvbnRlbnQsIHBhcnNlTGlua1Jlc3VsdCB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIC4uLihwYXJzZUxpbmtSZXN1bHQuYWxpYXMgIT09IHVuZGVmaW5lZCAmJiB7IGRpc3BsYXlUZXh0OiBwYXJzZUxpbmtSZXN1bHQuYWxpYXMgfSksXG4gICAgbGluazogcGFyc2VMaW5rUmVzdWx0LnVybCxcbiAgICBvcmlnaW5hbDogcGFyc2VMaW5rUmVzdWx0LnJhdyxcbiAgICBwYXJzZUxpbmtSZXN1bHQsXG4gICAgcG9zaXRpb246IHtcbiAgICAgIGVuZDogb2Zmc2V0VG9Mb2MoY29udGVudCwgcGFyc2VMaW5rUmVzdWx0LmVuZE9mZnNldCksXG4gICAgICBzdGFydDogb2Zmc2V0VG9Mb2MoY29udGVudCwgcGFyc2VMaW5rUmVzdWx0LnN0YXJ0T2Zmc2V0KVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVbmVzY2FwZXMgdGhlIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqXG4gKiBAcGFyYW0gZXNjYXBlZEFsaWFzIC0gQW4gZXNjYXBlZCBhbGlhcy5cbiAqIEByZXR1cm5zIEFuIHVuZXNjYXBlZCBhbGlhcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIHVuZXNjYXBlQWxpYXMoJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConKSAvLyAnKiphbGlhcyoqJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmVzY2FwZUFsaWFzKGVzY2FwZWRBbGlhczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGVzY2FwZWRBbGlhcyxcbiAgICByZXBsYWNlcjogKHsgY2FwdHVyZWRHcm91cEFyZ3VtZW50czogW2JhY2tzbGFzaGVzID0gJycsIHNwZWNpYWxDaGFyID0gJyddIH0pID0+IHtcbiAgICAgIGNvbnN0IEVTQ0FQRURfQkFDS1NMQVNIX0xFTkdUSCA9IDI7XG4gICAgICBjb25zdCBiYWNrc2xhc2hDb3VudCA9IGJhY2tzbGFzaGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGtlZXBDb3VudCA9IE1hdGguZmxvb3IoYmFja3NsYXNoQ291bnQgLyBFU0NBUEVEX0JBQ0tTTEFTSF9MRU5HVEgpO1xuICAgICAgcmV0dXJuICdcXFxcJy5yZXBlYXQoa2VlcENvdW50KSArIHNwZWNpYWxDaGFyO1xuICAgIH0sXG4gICAgc2VhcmNoVmFsdWU6IC8oPzxCYWNrc2xhc2hlcz5cXFxcKykoPzxTcGVjaWFsQ2hhcmFjdGVyPlshXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXFxcXFxdXl9ge3x9fl0pL2dcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvdW50T2NjdXJyZW5jZXMoJHN0cmluZzogc3RyaW5nLCBjaGFyYWN0ZXI6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiAkc3RyaW5nLnNwbGl0KGNoYXJhY3RlcikubGVuZ3RoIC0gMTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlVXJsU2FmZWx5KHBhcmFtczogRGVjb2RlVXJsU2FmZWx5UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBoYXNBbmdsZUJyYWNrZXRzLCBpc0V4dGVybmFsLCB1cmwgfSA9IHBhcmFtcztcbiAgLy8gYGZpbGU6Ly9gIFVSTHMgYXJlIGV4dGVybmFsLCBidXQgdGhlaXIgcGVyY2VudC1lbmNvZGluZyBpcyBwdXJlbHkgY29zbWV0aWMsIHNvIGRlY29kZSB0aGVtIGxpa2VcbiAgLy8gaW50ZXJuYWwgbGlua3MuIEV2ZXJ5IG90aGVyIGV4dGVybmFsIFVSTCBpcyBsZWZ0IHVudG91Y2hlZCAoaXRzIGVuY29kaW5nIG1heSBiZSBzaWduaWZpY2FudCkuXG4gIGlmICgoaXNFeHRlcm5hbCB8fCBoYXNBbmdsZUJyYWNrZXRzKSAmJiAhaXNGaWxlVXJsKHVybCkpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGRlY29kZSBVUkwgJHt1cmx9YCwgZXJyb3IpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFsaWFzKHBhcmFtczogRXh0cmFjdEFsaWFzUGFyYW1zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyAkc3RyaW5nLCBhbGlhc0VuZE9mZnNldCwgYWxpYXNTdGFydE9mZnNldCB9ID0gcGFyYW1zO1xuICByZXR1cm4gYWxpYXNTdGFydE9mZnNldCA8IGFsaWFzRW5kT2Zmc2V0XG4gICAgPyAkc3RyaW5nLnNsaWNlKGFsaWFzU3RhcnRPZmZzZXQsIGFsaWFzRW5kT2Zmc2V0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VGV4dExpbmtzKHBhcmFtczogRXh0cmFjdFRleHRMaW5rc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7ICRzdHJpbmcsIGVuZE9mZnNldCwgc2hvdWxkUmVjb2duaXplV3d3QXV0b2xpbmtMaXRlcmFscywgc3RhcnRPZmZzZXQsIHRleHRMaW5rcyB9ID0gcGFyYW1zO1xuICBpZiAoc3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0ZXh0UGFydCA9ICRzdHJpbmcuc2xpY2Uoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCArIDEpO1xuICBjb25zdCBzY2hlbWVMaW5rczogUGFyc2VMaW5rUmVzdWx0W10gPSBbXTtcbiAgcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogdGV4dFBhcnQsXG4gICAgcmVwbGFjZXI6ICh7IGNhcHR1cmVkR3JvdXBBcmd1bWVudHM6IFtyYXdVcmwgPSAnJ10sIG9mZnNldCB9KSA9PiB7XG4gICAgICBpZiAoIWlzVXJsKHJhd1VybCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWNvZGUgYmFyZSBgZmlsZTovL2AgVVJMcyBsaWtlIHRoZSBicmFja2V0ZWQgcGF0aCAoYHBhcnNlTGlua05vZGVgKSBkb2VzLlxuICAgICAgLy8gT2Zmc2V0cyBhbmQgYHJhd2Agc3RheSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgKHBvc3NpYmx5IHBlcmNlbnQtZW5jb2RlZCkgdGV4dC5cbiAgICAgIGNvbnN0IHVybCA9IGRlY29kZVVybFNhZmVseSh7XG4gICAgICAgIGhhc0FuZ2xlQnJhY2tldHM6IGZhbHNlLFxuICAgICAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgICAgICB1cmw6IHJhd1VybFxuICAgICAgfSk7XG4gICAgICBzY2hlbWVMaW5rcy5wdXNoKHtcbiAgICAgICAgZW5jb2RlZFVybDogZW5jb2RlVXJsKHVybCksXG4gICAgICAgIGVuZE9mZnNldDogc3RhcnRPZmZzZXQgKyBvZmZzZXQgKyByYXdVcmwubGVuZ3RoLFxuICAgICAgICBoYXNBbmdsZUJyYWNrZXRzOiBmYWxzZSxcbiAgICAgICAgaXNFbWJlZDogZmFsc2UsXG4gICAgICAgIGlzRXh0ZXJuYWw6IHRydWUsXG4gICAgICAgIGlzRmlsZVVybDogaXNGaWxlVXJsKHVybCksXG4gICAgICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgICAgICByYXc6IHJhd1VybCxcbiAgICAgICAgc3RhcnRPZmZzZXQ6IHN0YXJ0T2Zmc2V0ICsgb2Zmc2V0LFxuICAgICAgICB1cmxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2VhcmNoVmFsdWU6IC8oPzxVcmw+XFxTKykvZ1xuICB9KTtcbiAgdGV4dExpbmtzLnB1c2goLi4uc2NoZW1lTGlua3MpO1xuXG4gIGlmICghc2hvdWxkUmVjb2duaXplV3d3QXV0b2xpbmtMaXRlcmFscykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgdGV4dFBhcnQubWF0Y2hBbGwoV1dXX0FVVE9MSU5LX0xJVEVSQUxfQ0FORElEQVRFX1JFR19FWFApKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ0xpdGVyYWwnKTtcbiAgICBjb25zdCBsaXRlcmFsID0gdHJpbVd3d0F1dG9saW5rTGl0ZXJhbChjYW5kaWRhdGUpO1xuICAgIGlmICghaXNWYWxpZFd3d0F1dG9saW5rTGl0ZXJhbChsaXRlcmFsKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbGl0ZXJhbFN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCAtIGNhbmRpZGF0ZS5sZW5ndGg7XG4gICAgY29uc3QgbGl0ZXJhbEVuZE9mZnNldCA9IGxpdGVyYWxTdGFydE9mZnNldCArIGxpdGVyYWwubGVuZ3RoO1xuICAgIGlmIChzY2hlbWVMaW5rcy5zb21lKChsaW5rKSA9PiBsaW5rLnN0YXJ0T2Zmc2V0IDwgbGl0ZXJhbEVuZE9mZnNldCAmJiBsaXRlcmFsU3RhcnRPZmZzZXQgPCBsaW5rLmVuZE9mZnNldCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0FuZ2xlQnJhY2tldHMgPSAkc3RyaW5nW2xpdGVyYWxTdGFydE9mZnNldCAtIDFdID09PSAnPCcgJiYgJHN0cmluZ1tsaXRlcmFsRW5kT2Zmc2V0XSA9PT0gJz4nO1xuICAgIGNvbnN0IGxpbmtTdGFydE9mZnNldCA9IGhhc0FuZ2xlQnJhY2tldHMgPyBsaXRlcmFsU3RhcnRPZmZzZXQgLSAxIDogbGl0ZXJhbFN0YXJ0T2Zmc2V0O1xuICAgIGNvbnN0IGxpbmtFbmRPZmZzZXQgPSBoYXNBbmdsZUJyYWNrZXRzID8gbGl0ZXJhbEVuZE9mZnNldCArIDEgOiBsaXRlcmFsRW5kT2Zmc2V0O1xuICAgIGNvbnN0IHVybCA9IFdXV19BVVRPTElOS19MSVRFUkFMX1NDSEVNRSArIGxpdGVyYWw7XG4gICAgdGV4dExpbmtzLnB1c2goe1xuICAgICAgZW5jb2RlZFVybDogZW5jb2RlVXJsKHVybCksXG4gICAgICBlbmRPZmZzZXQ6IGxpbmtFbmRPZmZzZXQsXG4gICAgICBoYXNBbmdsZUJyYWNrZXRzLFxuICAgICAgaXNFbWJlZDogZmFsc2UsXG4gICAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgICAgaXNGaWxlVXJsOiBmYWxzZSxcbiAgICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgICAgcmF3OiAkc3RyaW5nLnNsaWNlKGxpbmtTdGFydE9mZnNldCwgbGlua0VuZE9mZnNldCksXG4gICAgICBzdGFydE9mZnNldDogbGlua1N0YXJ0T2Zmc2V0LFxuICAgICAgdXJsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmF3TGluayhub2RlOiBOb2RlLCAkc3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwb3MgPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgcmV0dXJuICRzdHJpbmcuc2xpY2UocG9zLnN0YXJ0Lm9mZnNldCwgcG9zLmVuZC5vZmZzZXQpO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgd2hvbGUgdmFsdWUgYXMgb25lIGxpbmssIGFzIE9ic2lkaWFuIHJlYWRzIGEgZnJvbnRtYXR0ZXIgdmFsdWUuIE9ic2lkaWFuIHRha2VzIGEgdmFsdWUgdGhhdFxuICogc3RhcnRzIHdpdGggYFtgIGFuZCBlbmRzIHdpdGggYF0odXJsKWAgYXMgYSBzaW5nbGUgbGluayBjYXB0aW9uZWQgYnkgZXZlcnl0aGluZyBpbiBiZXR3ZWVuLCBzbyBhIGNhcHRpb25cbiAqIGhvbGRpbmcgYW4gdW5iYWxhbmNlZCBicmFja2V0IChgW0EgWyBCXSh0Lm1kKWAsIGBbYV0gW2JdKGMubWQpYCwgYFthXWJdKGMubWQpYCkgaXMgc3RpbGwgb25lIGxpbmtcbiAqIHRoZXJlLCB3aGVyZSBDb21tb25NYXJrIGZpbmRzIGEgc2hvcnRlciBsaW5rIGF0IHRoZSBpbm5lciBgW2AsIG9yIG5vbmUgYXQgYWxsLiBBIHZhbHVlIENvbW1vbk1hcmsgcmVhZHNcbiAqIGFzIHR3byBvciBtb3JlIGxpbmtzIHN0YXlzIG11bHRpLWxpbmssIGJlY2F1c2Ugd2hhdCBPYnNpZGlhbiBtYWtlcyBvZiB0aG9zZSBpcyBnYXJiYWdlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgdmFsdWUgYW5kIGl0cyBsaW5rcy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rIHNwYW5uaW5nIHRoZSB3aG9sZSB2YWx1ZSwgb3IgYG51bGxgIGlmIHRoZSB2YWx1ZSBpcyBub3QgYSBzaW5nbGUgbGluay5cbiAqL1xuZnVuY3Rpb24gZ2V0V2hvbGVWYWx1ZUxpbmsocGFyYW1zOiBHZXRXaG9sZVZhbHVlTGlua1BhcmFtcyk6IG51bGwgfCBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCB7IGxpbmtzLCBvcHRpb25zLCB2YWx1ZSB9ID0gcGFyYW1zO1xuICBjb25zdCBbZmlyc3RMaW5rXSA9IGxpbmtzO1xuICBpZiAobGlua3MubGVuZ3RoID09PSAxICYmIGZpcnN0TGluaz8ucmF3ID09PSB2YWx1ZSkge1xuICAgIHJldHVybiBmaXJzdExpbms7XG4gIH1cblxuICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoJ1snKSB8fCBsaW5rcy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoZmlyc3RMaW5rKSB7XG4gICAgLy8gT25seSBhIG1hcmtkb3duIGxpbmsgd2lkZW5zOiBhIHdpa2lsaW5rLCBhbiBlbWJlZCwgYSBiYXJlIFVSTCBvciBhbiBhdXRvbGluayBkb2VzIG5vdC5cbiAgICBpZiAoZmlyc3RMaW5rLmlzV2lraWxpbmsgfHwgIWZpcnN0TGluay5yYXcuc3RhcnRzV2l0aCgnWycpIHx8IGZpcnN0TGluay5lbmRPZmZzZXQgIT09IHZhbHVlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdpZGVuVG9XaG9sZVZhbHVlKHtcbiAgICAgIGNhcHRpb25FbmRPZmZzZXQ6IGZpcnN0TGluay5zdGFydE9mZnNldCArIDEgKyAoZmlyc3RMaW5rLmFsaWFzPy5sZW5ndGggPz8gMCksXG4gICAgICBsaW5rOiBmaXJzdExpbmssXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICB9XG5cbiAgLy8gTm8gbGluayBhdCBhbGwsIGFzIGluIGBbYV1iXShjLm1kKWA6IGhpZGUgdGhlIGNhcHRpb24ncyBicmFja2V0cyBzbyBDb21tb25NYXJrIHNlZXMgb25lIGxpbmsuXG4gIGNvbnN0IGNhcHRpb25FbmRPZmZzZXQgPSB2YWx1ZS5sYXN0SW5kZXhPZignXSgnKTtcbiAgaWYgKGNhcHRpb25FbmRPZmZzZXQgPT09IC0xKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtYXNrZWRWYWx1ZSA9IGBbJHt2YWx1ZS5zbGljZSgxLCBjYXB0aW9uRW5kT2Zmc2V0KS5yZXBsYWNlQWxsKC9bW1xcXV0vZywgJ0AnKX0ke3ZhbHVlLnNsaWNlKGNhcHRpb25FbmRPZmZzZXQpfWA7XG4gIGNvbnN0IG1hc2tlZExpbmtzID0gcGFyc2VMaW5rcyhtYXNrZWRWYWx1ZSwgb3B0aW9ucyk7XG4gIGNvbnN0IFttYXNrZWRMaW5rXSA9IG1hc2tlZExpbmtzO1xuICByZXR1cm4gbWFza2VkTGlua3MubGVuZ3RoID09PSAxICYmIG1hc2tlZExpbms/LnJhdyA9PT0gbWFza2VkVmFsdWVcbiAgICA/IHdpZGVuVG9XaG9sZVZhbHVlKHsgY2FwdGlvbkVuZE9mZnNldCwgbGluazogbWFza2VkTGluaywgdmFsdWUgfSlcbiAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGhhc0FuZ2xlQnJhY2tldHNJbkxpbmsocGFyYW1zOiBIYXNBbmdsZUJyYWNrZXRzSW5MaW5rUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgcmF3LCByYXdVcmwgfSA9IHBhcmFtcztcbiAgY29uc3QgT1BFTl9BTkdMRV9CUkFDS0VUID0gJzwnO1xuICByZXR1cm4gcmF3LnN0YXJ0c1dpdGgoT1BFTl9BTkdMRV9CUkFDS0VUKSB8fCByYXdVcmwuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkV3d3QXV0b2xpbmtMaXRlcmFsKGxpdGVyYWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBkb21haW4gPSBXV1dfQVVUT0xJTktfTElURVJBTF9ET01BSU5fUkVHX0VYUC5leGVjKGxpdGVyYWwpPy5bMF07XG4gIGlmIChkb21haW4gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEdGTTogbm8gdW5kZXJzY29yZSBpbiB0aGUgbGFzdCB0d28gc2VnbWVudHMgb2YgdGhlIGRvbWFpbi5cbiAgY29uc3QgTEFTVF9TRUdNRU5UU19DT1VOVCA9IDI7XG4gIHJldHVybiBkb21haW4uc3BsaXQoJy4nKS5zbGljZSgtTEFTVF9TRUdNRU5UU19DT1VOVCkuZXZlcnkoKHNlZ21lbnQpID0+ICFzZWdtZW50LmluY2x1ZGVzKCdfJykpO1xufVxuXG5mdW5jdGlvbiBvZmZzZXRUb0xvYyhjb250ZW50OiBzdHJpbmcsIG9mZnNldDogbnVtYmVyKTogTG9jIHtcbiAgY29uc3QgcHJlY2VkaW5nQ29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgb2Zmc2V0KTtcbiAgY29uc3QgbGluZSA9IChwcmVjZWRpbmdDb250ZW50Lm1hdGNoKC9cXG4vZykgPz8gW10pLmxlbmd0aDtcbiAgY29uc3QgbGFzdE5ld2xpbmVPZmZzZXQgPSBwcmVjZWRpbmdDb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nKTtcbiAgcmV0dXJuIHtcbiAgICBjb2w6IG9mZnNldCAtIChsYXN0TmV3bGluZU9mZnNldCArIDEpLFxuICAgIGxpbmUsXG4gICAgb2Zmc2V0XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlTGlua05vZGUobm9kZTogTGluaywgJHN0cmluZzogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgTElOS19BTElBU19TVUZGSVggPSAnXSgnO1xuICBjb25zdCBMSU5LX1NVRkZJWCA9ICcpJztcbiAgY29uc3QgcmF3ID0gZ2V0UmF3TGluayhub2RlLCAkc3RyaW5nKTtcbiAgY29uc3QgcG9zaXRpb24gPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgY29uc3Qgbm9kZUVuZE9mZnNldCA9IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICBjb25zdCBub2RlU3RhcnRPZmZzZXQgPSBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5zdGFydC5vZmZzZXQpO1xuICAvLyBBbiBlbXB0eSBsYWJlbCAoYFtdKC4uLilgKSBoYXMgbm8gY2hpbGRyZW4sIHNvIGl0IHN0YXJ0cyBhbmQgZW5kcyBqdXN0IGFmdGVyIHRoZSBub2RlJ3Mgb3duIGBbYC4gQW4gZW1iZWQncyBgIWAgaXMgb3V0c2lkZSB0aGUgbm9kZSwgc2luY2UgYHBhcnNlTGlua3NgIG1hc2tzIGl0IGJlZm9yZSBwYXJzaW5nLlxuICBjb25zdCBlbXB0eUFsaWFzT2Zmc2V0ID0gbm9kZVN0YXJ0T2Zmc2V0ICsgMTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vYmV0dGVyLWRvbS10cmF2ZXJzaW5nIC0tIGBub2RlYCBpcyBhbiBtZGFzdCBub2RlLCBub3QgYSBET00gbm9kZS4gSXQgaGFzIG5vIGBmaXJzdEVsZW1lbnRDaGlsZGA7IHRoZSBydWxlIG1hdGNoZXMgdGhlIGAuY2hpbGRyZW5bMF1gIHNoYXBlIHdpdGhvdXQgY2hlY2tpbmcgd2hhdCBpdCBpcyBvbi5cbiAgY29uc3QgYWxpYXNOb2RlU3RhcnRPZmZzZXQgPSBub2RlLmNoaWxkcmVuWzBdPy5wb3NpdGlvbj8uc3RhcnQub2Zmc2V0ID8/IGVtcHR5QWxpYXNPZmZzZXQ7XG4gIGNvbnN0IGFsaWFzTm9kZUVuZE9mZnNldCA9IG5vZGUuY2hpbGRyZW4uYXQoLTEpPy5wb3NpdGlvbj8uZW5kLm9mZnNldCA/PyBlbXB0eUFsaWFzT2Zmc2V0O1xuICBjb25zdCByYXdVcmwgPSAkc3RyaW5nLnNsaWNlKGFsaWFzTm9kZUVuZE9mZnNldCArIExJTktfQUxJQVNfU1VGRklYLmxlbmd0aCwgbm9kZUVuZE9mZnNldCAtIExJTktfU1VGRklYLmxlbmd0aCk7XG4gIGNvbnN0IGhhc0FuZ2xlQnJhY2tldHMgPSBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rKHtcbiAgICByYXcsXG4gICAgcmF3VXJsXG4gIH0pO1xuICBjb25zdCBpc0V4dGVybmFsID0gaXNVcmwobm9kZS51cmwpO1xuICBjb25zdCB1cmwgPSBkZWNvZGVVcmxTYWZlbHkoe1xuICAgIGhhc0FuZ2xlQnJhY2tldHMsXG4gICAgaXNFeHRlcm5hbCxcbiAgICB1cmw6IG5vZGUudXJsXG4gIH0pO1xuICBjb25zdCBhbGlhcyA9IGV4dHJhY3RBbGlhcyh7XG4gICAgJHN0cmluZyxcbiAgICBhbGlhc0VuZE9mZnNldDogYWxpYXNOb2RlRW5kT2Zmc2V0LFxuICAgIGFsaWFzU3RhcnRPZmZzZXQ6IGFsaWFzTm9kZVN0YXJ0T2Zmc2V0XG4gIH0pO1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzLFxuICAgIGVuY29kZWRVcmw6IGlzRXh0ZXJuYWwgPyBlbmNvZGVVcmwodXJsKSA6IHVuZGVmaW5lZCxcbiAgICBlbmRPZmZzZXQ6IG5vZGVFbmRPZmZzZXQsXG4gICAgaGFzQW5nbGVCcmFja2V0cyxcbiAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICBpc0V4dGVybmFsLFxuICAgIGlzRmlsZVVybDogaXNGaWxlVXJsKHVybCksXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgcmF3LFxuICAgIHN0YXJ0T2Zmc2V0OiBub2RlU3RhcnRPZmZzZXQsXG4gICAgdGl0bGU6IG5vZGUudGl0bGUgPz8gdW5kZWZpbmVkLFxuICAgIHVuZXNjYXBlZEFsaWFzOiBhbGlhcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdW5lc2NhcGVBbGlhcyhhbGlhcyksXG4gICAgdXJsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZVdpa2lsaW5rTm9kZShub2RlOiBXaWtpTGlua05vZGUsICRzdHJpbmc6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXM6ICRzdHJpbmcuaW5jbHVkZXMoV0lLSUxJTktfRElWSURFUikgPyBub2RlLmRhdGEuYWxpYXMgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5lbmQub2Zmc2V0KSxcbiAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICBpc0V4dGVybmFsOiBmYWxzZSxcbiAgICBpc0ZpbGVVcmw6IGZhbHNlLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgcmF3OiBnZXRSYXdMaW5rKG5vZGUsICRzdHJpbmcpLFxuICAgIHN0YXJ0T2Zmc2V0OiBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5zdGFydC5vZmZzZXQpLFxuICAgIHVybDogbm9kZS52YWx1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJpbVd3d0F1dG9saW5rTGl0ZXJhbChsaXRlcmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gdHJpbVd3d0F1dG9saW5rTGl0ZXJhbEVuZChsaXRlcmFsKTtcbiAgcmV0dXJuIHRyaW1tZWQgPT09IGxpdGVyYWwgPyBsaXRlcmFsIDogdHJpbVd3d0F1dG9saW5rTGl0ZXJhbCh0cmltbWVkKTtcbn1cblxuZnVuY3Rpb24gdHJpbVd3d0F1dG9saW5rTGl0ZXJhbEVuZChsaXRlcmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsYXN0Q2hhcmFjdGVyID0gbGl0ZXJhbC5zbGljZSgtMSk7XG4gIGlmIChXV1dfQVVUT0xJTktfTElURVJBTF9UUkFJTElOR19QVU5DVFVBVElPTi5oYXMobGFzdENoYXJhY3RlcikpIHtcbiAgICByZXR1cm4gbGl0ZXJhbC5zbGljZSgwLCAtMSk7XG4gIH1cblxuICAvLyBHRk06IGEgY2xvc2luZyBwYXJlbnRoZXNpcyB3aXRoIG5vIG9wZW5pbmcgb25lIHRvIG1hdGNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBsaXRlcmFsLlxuICByZXR1cm4gbGFzdENoYXJhY3RlciA9PT0gJyknICYmIGNvdW50T2NjdXJyZW5jZXMobGl0ZXJhbCwgJyknKSA+IGNvdW50T2NjdXJyZW5jZXMobGl0ZXJhbCwgJygnKVxuICAgID8gbGl0ZXJhbC5zbGljZSgwLCAtMSlcbiAgICA6IGxpdGVyYWwucmVwbGFjZShUUkFJTElOR19FTlRJVFlfUkVGRVJFTkNFX1JFR19FWFAsICcnKTtcbn1cblxuZnVuY3Rpb24gd2lkZW5Ub1dob2xlVmFsdWUocGFyYW1zOiBXaWRlblRvV2hvbGVWYWx1ZVBhcmFtcyk6IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IHsgY2FwdGlvbkVuZE9mZnNldCwgbGluaywgdmFsdWUgfSA9IHBhcmFtcztcbiAgLy8gTmV2ZXIgZW1wdHk6IGEgdmFsdWUgd2hvc2UgY2FwdGlvbiBpcyBlbXB0eSwgYFtdKHVybClgLCBpcyBhIGxpbmsgQ29tbW9uTWFyayBhbHJlYWR5IHNwYW5zIHdob2xlLlxuICBjb25zdCBhbGlhcyA9IHZhbHVlLnNsaWNlKDEsIGNhcHRpb25FbmRPZmZzZXQpO1xuICByZXR1cm4ge1xuICAgIC4uLmxpbmssXG4gICAgYWxpYXMsXG4gICAgZW5kT2Zmc2V0OiB2YWx1ZS5sZW5ndGgsXG4gICAgcmF3OiB2YWx1ZSxcbiAgICBzdGFydE9mZnNldDogMCxcbiAgICB1bmVzY2FwZWRBbGlhczogdW5lc2NhcGVBbGlhcyhhbGlhcylcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkEsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxjQUFjO0FBQ3ZCLE9BQU8saUJBQWlCO0FBQ3hCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsYUFBYTtBQUt0QixNQUFNLHNDQUFzQztBQUU1QyxNQUFNLG1CQUFtQjtBQWF6QixNQUFNLHlDQUF5QztBQU0vQyxNQUFNLHNDQUFzQztBQUs1QyxNQUFNLDRDQUE0QyxvQkFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLENBQUM7QUFLbEcsTUFBTSxvQ0FBb0M7QUFLMUMsTUFBTSw4QkFBOEI7QUFrWXBDLE1BQU0sdUJBQXVCO0FBQUEsRUFDViwyQkFBNEQsQ0FBQztBQUFBLEVBQzdELHFD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
|
|
478
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYXJzZS1saW5rLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIHBhcnNpbmcgbWFya2Rvd24gYW5kIHdpa2kgbGlua3MgaW50byBzdHJ1Y3R1cmVkIGRhdGEsIGFuZCBmb3JcbiAqIGVzY2FwaW5nLCB1bmVzY2FwaW5nLCBhbmQgZW5jb2RpbmcgbGluayBjb21wb25lbnRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgdHlwZSB7IExpbmsgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEZyb250bWF0dGVyTGlua0NhY2hlLFxuICBMb2MsXG4gIFJlZmVyZW5jZSxcbiAgUmVmZXJlbmNlQ2FjaGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSAndW5pc3QnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyByZXBsYWNlQWxsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQge1xuICBlbmNvZGVVcmwsXG4gIGlzRmlsZVVybCxcbiAgaXNVcmxcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3VybCc7XG5pbXBvcnQgeyBpc0Zyb250bWF0dGVyTGlua0NhY2hlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHsgcmVtYXJrIH0gZnJvbSAncmVtYXJrJztcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tICdyZW1hcmstcGFyc2UnO1xuaW1wb3J0IHsgd2lraUxpbmtQbHVnaW4gfSBmcm9tICdyZW1hcmstd2lraS1saW5rJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdCc7XG5cbi8qKlxuICogTWF0Y2hlcyBhIGJhcmUgYGZpbGU6YCBVUkwgd29ydGggcmVwb3J0aW5nOiBvbmUgd2hvc2UgcGF0aCBzdGFydHMgd2l0aCBhIHNsYXNoLCBvciB3aXRoIHRoZSBiYWNrc2xhc2hcbiAqIGEgV2luZG93cyBwYXRoIHdyaXR0ZW4gaW50byBpdCBjYXJyaWVzLiBBIHdvcmQgc3VjaCBhcyBgZmlsZTpweXRob24zLnB5YCBpcyB0ZXh0LCBub3QgYSBVUkwuXG4gKi9cbmNvbnN0IEJBUkVfRklMRV9VUkxfUkVHX0VYUCA9IC9eZmlsZTpbL1xcXFxdL2k7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIG1hcmtkb3duIGxpbmsgc3ltYm9scy5cbiAqL1xuY29uc3QgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVggPSAvW1xcXFxbXFxdPD5fKn49YCRdL2c7XG5cbmNvbnN0IFdJS0lMSU5LX0RJVklERVIgPSAnfCc7XG5cbi8qKlxuICogTWF0Y2hlcyBhIGNhbmRpZGF0ZSBHRk0gZXh0ZW5kZWQgYHd3dy5gIGF1dG9saW5rIGxpdGVyYWw6IGB3d3cuYCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgb3IgYWZ0ZXJcbiAqIHdoaXRlc3BhY2UsIGAqYCwgYF9gLCBgfmAsIGAoYCBvciBgPGAsIHJ1bm5pbmcgdXAgdG8gdGhlIG5leHQgd2hpdGVzcGFjZSwgYDxgIG9yIGA+YC4gR0ZNIGl0c2VsZlxuICoga2VlcHMgYSBjbG9zaW5nIGA+YCBpbiB0aGUgbGl0ZXJhbCAoT2JzaWRpYW4gcmVuZGVycyBgPHd3dy5leGFtcGxlLmNvbT5gIHdpdGggYW4gaHJlZiBlbmRpbmcgaW5cbiAqIGAlM0VgKTsgc3RvcHBpbmcgYmVmb3JlIGl0IGlzIGRlbGliZXJhdGUsIHNvIHRoZSBicmFja2V0cyBjYW4gYmUgcmVwb3J0ZWQgYXJvdW5kIHRoZSBsaXRlcmFsIGluc3RlYWQuXG4gKlxuICogVGhlIHByZWNlZGluZyBjaGFyYWN0ZXIgaXMgY29uc3VtZWQgYW5kIHRoZSBsaXRlcmFsIGNhcHR1cmVkIGFzIGBMaXRlcmFsYCwgYmVjYXVzZSBhIGxvb2tiZWhpbmQgaXMgYVxuICogc3ludGF4IGVycm9yIG9uIGlPUyBiZWZvcmUgMTYuNCwgYmVsb3cgdGhlIGlPUyAxNSBPYnNpZGlhbiBtb2JpbGUgc3RpbGwgc3VwcG9ydHMuIENvbnN1bWluZyBpdCBsb3NlcyBub1xuICogY2FuZGlkYXRlOiBhIG1hdGNoIGVuZHMgYmVmb3JlIHdoaXRlc3BhY2UsIGA8YCwgYD5gIG9yIHRoZSBlbmQsIHNvIHRoZSBjaGFyYWN0ZXIgYSBmb2xsb3dpbmcgY2FuZGlkYXRlXG4gKiBuZWVkcyBpcyBuZXZlciBwYXJ0IG9mIHRoZSBwcmV2aW91cyBtYXRjaC5cbiAqL1xuY29uc3QgV1dXX0FVVE9MSU5LX0xJVEVSQUxfQ0FORElEQVRFX1JFR19FWFAgPSAvKD86XnxbXFxzKCo8X35dKSg/PExpdGVyYWw+d3d3XFwuW15cXHM8Pl0qKS9nO1xuXG4vKipcbiAqIE1hdGNoZXMgdGhlIGRvbWFpbiBvZiBhIEdGTSBleHRlbmRlZCBgd3d3LmAgYXV0b2xpbmsgbGl0ZXJhbDogc2VnbWVudHMgb2YgbGV0dGVycywgZGlnaXRzLFxuICogdW5kZXJzY29yZXMgYW5kIGh5cGhlbnMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMuXG4gKi9cbmNvbnN0IFdXV19BVVRPTElOS19MSVRFUkFMX0RPTUFJTl9SRUdfRVhQID0gL153d3coPzpcXC5bXFxwe0x9XFxwe059Xy1dKykrL3U7XG5cbi8qKlxuICogVGhlIGNoYXJhY3RlcnMgR0ZNIGRyb3BzIGZyb20gdGhlIGVuZCBvZiBhbiBleHRlbmRlZCBhdXRvbGluay5cbiAqL1xuY29uc3QgV1dXX0FVVE9MSU5LX0xJVEVSQUxfVFJBSUxJTkdfUFVOQ1RVQVRJT04gPSBuZXcgU2V0KFsnXycsICcsJywgJzonLCAnIScsICc/JywgJy4nLCAnKicsICd+J10pO1xuXG4vKipcbiAqIE1hdGNoZXMgYW4gZW50aXR5IHJlZmVyZW5jZSBhdCB0aGUgZW5kIG9mIGFuIGV4dGVuZGVkIGF1dG9saW5rLCB3aGljaCBHRk0gZHJvcHMuXG4gKi9cbmNvbnN0IFRSQUlMSU5HX0VOVElUWV9SRUZFUkVOQ0VfUkVHX0VYUCA9IC8mW1xcZEEtWmEtel0rOyQvO1xuXG4vKipcbiAqIFRoZSBzY2hlbWUgT2JzaWRpYW4gb3BlbnMgYSBHRk0gZXh0ZW5kZWQgYHd3dy5gIGF1dG9saW5rIGxpdGVyYWwgd2l0aC5cbiAqL1xuY29uc3QgV1dXX0FVVE9MSU5LX0xJVEVSQUxfU0NIRU1FID0gJ2h0dHA6Ly8nO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgcGFyc2luZyB0aGUgbGlua3MgZnJvbSBhIG5vdGUncyBmcm9udG1hdHRlciB2aWEge0BsaW5rIHBhcnNlRnJvbnRtYXR0ZXJMaW5rc30uIEludGVybmFsXG4gKiBzaW5nbGUtbGluayBmcm9udG1hdHRlciB2YWx1ZXMgYXJlIG9taXR0ZWQsIGFzIE9ic2lkaWFuIG5hdGl2ZWx5IGNhY2hlcyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlRnJvbnRtYXR0ZXJMaW5rc1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIGZyb250bWF0dGVyIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rczogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0c1tdO1xufVxuXG4vKipcbiAqIEEge0BsaW5rIEZyb250bWF0dGVyTGlua0NhY2hlfSBmb3IgYSBsaW5rIHBhcnNlZCBmcm9tIGEgc2luZ2xlLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWUgdmlhXG4gKiB7QGxpbmsgcGFyc2VMaW5rc30uIEl0IGNhcnJpZXMgdGhlIGZ1bGwge0BsaW5rIFBhcnNlTGlua1Jlc3VsdH0gc28gY29uc3VtZXJzIGNhbiBpbnNwZWN0IHRoZSBwYXJzZVxuICogZGV0YWlscyB3aXRob3V0IHJlLXBhcnNpbmcgdGhlIGxpbmsuIFVzZSB0aGlzIHdoZW4gdGhlIHdob2xlIGZyb250bWF0dGVyIHZhbHVlIGlzIGEgc2luZ2xlIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2UgZXh0ZW5kcyBGcm9udG1hdHRlckxpbmtDYWNoZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBwYXJzZUxpbmtSZXN1bHQ6IFBhcnNlTGlua1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZX0gZm9yIGEgbGluayBwYXJzZWQgZnJvbSBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWUgdmlhXG4gKiB7QGxpbmsgcGFyc2VMaW5rc30sIGFkZGl0aW9uYWxseSBjYXJyeWluZyB0aGUgb2Zmc2V0cyBvZiB0aGUgbGluayB3aXRoaW4gdGhlIGZyb250bWF0dGVyIHZhbHVlLiBVc2VcbiAqIHRoaXMgd2hlbiB0aGUgZnJvbnRtYXR0ZXIgdmFsdWUgaG9sZHMgbXVsdGlwbGUgbGlua3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0cyBleHRlbmRzIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIEFuIGVuZCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIGZyb250bWF0dGVyIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBmcm9udG1hdHRlciB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHBhcnNlTGlua30uIFRoZSBzYW1lIGFzIHtAbGluayBQYXJzZUxpbmtzT3B0aW9uc30uXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlTGlua09wdGlvbnMgPSBQYXJzZUxpbmtzT3B0aW9ucztcblxuLyoqXG4gKiBBIHtAbGluayBSZWZlcmVuY2VDYWNoZX0gZm9yIGEgbGluayBwYXJzZWQgZnJvbSBjb250ZW50IHZpYSB7QGxpbmsgcGFyc2VMaW5rc30uIEl0IGNhcnJpZXMgdGhlIGZ1bGxcbiAqIHtAbGluayBQYXJzZUxpbmtSZXN1bHR9IHNvIGNvbnN1bWVycyBjYW4gaW5zcGVjdCB0aGUgcGFyc2UgZGV0YWlscyB3aXRob3V0IHJlLXBhcnNpbmcgdGhlIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVmZXJlbmNlIGV4dGVuZHMgUmVmZXJlbmNlQ2FjaGUge1xuICAvKipcbiAgICogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VMaW5rUmVzdWx0OiBQYXJzZUxpbmtSZXN1bHQ7XG59XG5cbi8qKlxuICogQSByZXN1bHQgb2YgcGFyc2luZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVzdWx0IHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiBcXCphbGlhc1xcKlxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmNvZGVkIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsgd2l0aCBzcGFjZS5tZD4pIC0+IGxpbmslMjB3aXRoJTIwc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBlbmNvZGVkVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKDxsaW5rLm1kPikgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaGFzQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogIVtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFtbYWxpYXNdXSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBleHRlcm5hbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oaHR0cHM6Ly9leGFtcGxlLmNvbSkgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGZpbGUubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgYGZpbGU6Ly9gIFVSTC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oZmlsZTovLy9DOi94LnR4dCkgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGh0dHBzOi8vZXhhbXBsZS5jb20pIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNGaWxlVXJsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFthbGlhc10obGluay5tZCkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHJhdyBsaW5rIHRleHQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IFthbGlhc10obGluay5tZClcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSByYXc6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdGFydCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIG9yaWdpbmFsIHRleHQuXG4gICAqL1xuICByZWFkb25seSBzdGFydE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHRpdGxlIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rLm1kIFwidGl0bGVcIikgLT4gdGl0bGVcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gdW5lc2NhcGVkIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiAqYWxpYXMqXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgdW5lc2NhcGVkQWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluayUyMHdpdGglMjBzcGFjZS5tZCkgLT4gbGluayB3aXRoIHNwYWNlLm1kXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHBhcnNlTGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlTGlua3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVjb2duaXplIEdGTSBleHRlbmRlZCBgd3d3LmAgYXV0b2xpbmsgbGl0ZXJhbHMgKGB3d3cuZXhhbXBsZS5jb21gLCBhbHNvIGluc2lkZVxuICAgKiBgPC4uLj5gKSBhcyBleHRlcm5hbCBsaW5rcywgYXMgT2JzaWRpYW4gZG9lcyBpbiBhIG5vdGUncyBib2R5LiBPYnNpZGlhbiBkb2VzIG5vdCBsaW5rIHRoZW0gaW5cbiAgICogZnJvbnRtYXR0ZXIgdmFsdWVzLCBzbyB7QGxpbmsgcGFyc2VGcm9udG1hdHRlckxpbmtzfSB0dXJucyB0aGlzIG9mZi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVjb2duaXplV3d3QXV0b2xpbmtMaXRlcmFscz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdG9QYXJzZUxpbmtSZWZlcmVuY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvUGFyc2VMaW5rUmVmZXJlbmNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRoZSBwYXJzZWQgbGluaydzIG9mZnNldHMgaW5kZXggaW50by4gVXNlZCB0byBjb21wdXRlIHRoZSBsaW5lIGFuZCBjb2x1bW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJzZWQgbGluayB0byB3cmFwLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VMaW5rUmVzdWx0OiBQYXJzZUxpbmtSZXN1bHQ7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgRnJvbnRtYXR0ZXJMaW5rc1BhcnNlci5jYXRlZ29yaXplfS5cbiAqL1xuaW50ZXJmYWNlIENhdGVnb3JpemVGcm9udG1hdHRlckxpbmtQYXJhbXMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgd2hvbGUgZnJvbnRtYXR0ZXIgdmFsdWUgaXMgYSBzaW5nbGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzU2luZ2xlTGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGtleSBwYXRoIG9mIHRoZSBmcm9udG1hdHRlciB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyc2VkIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBwYXJzZUxpbmtSZXN1bHQ6IFBhcnNlTGlua1Jlc3VsdDtcblxuICAvKipcbiAgICogVGhlIGZyb250bWF0dGVyIHZhbHVlIHRoZSBsaW5rIHdhcyBwYXJzZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZGVjb2RlVXJsU2FmZWx5fS5cbiAqL1xuaW50ZXJmYWNlIERlY29kZVVybFNhZmVseVBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMuXG4gICAqL1xuICByZWFkb25seSBoYXNBbmdsZUJyYWNrZXRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIGlzIGV4dGVybmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBVUkwgdG8gZGVjb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZXh0cmFjdEFsaWFzfS5cbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RBbGlhc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIHN0cmluZyB0byBleHRyYWN0IHRoZSBhbGlhcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgJHN0cmluZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBhbGlhcyBpbiB0aGUgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNFbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdGFydCBvZmZzZXQgb2YgdGhlIGFsaWFzIGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBhbGlhc1N0YXJ0T2Zmc2V0OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZXh0cmFjdFRleHRMaW5rc30uXG4gKi9cbmludGVyZmFjZSBFeHRyYWN0VGV4dExpbmtzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIHRleHQgbGlua3MgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5ICRzdHJpbmc6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBwYXJ0IGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZWNvZ25pemUgR0ZNIGV4dGVuZGVkIGB3d3cuYCBhdXRvbGluayBsaXRlcmFscy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlY29nbml6ZVd3d0F1dG9saW5rTGl0ZXJhbHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSB0ZXh0IHBhcnQgaW4gdGhlIHN0cmluZy5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBwYXJzZWQgbGlua3MgdG8gYXBwZW5kIHRoZSBleHRyYWN0ZWQgdGV4dCBsaW5rcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W107XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2V0V2hvbGVWYWx1ZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2V0V2hvbGVWYWx1ZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGxpbmtzIHtAbGluayBwYXJzZUxpbmtzfSBmb3VuZCBpbiB0aGUgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSBsaW5rczogcmVhZG9ubHkgUGFyc2VMaW5rUmVzdWx0W107XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJzZSBvcHRpb25zIHRoZSBsaW5rcyB3ZXJlIGZvdW5kIHdpdGguXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBQYXJzZUxpbmtzT3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRvIHJlYWQgYXMgb25lIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGhhc0FuZ2xlQnJhY2tldHNJbkxpbmt9LlxuICovXG5pbnRlcmZhY2UgSGFzQW5nbGVCcmFja2V0c0luTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIHJhdyBsaW5rIHRleHQuXG4gICAqL1xuICByZWFkb25seSByYXc6IHN0cmluZztcblxuICAvKipcbiAgICogQSByYXcgVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3VXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzdHJldGNoIG9mIHRoZSBwYXJzZWQgc3RyaW5nIHtAbGluayBwYXJzZUxpbmtzfSBkb2VzIG5vdCBzY2FuIGZvciBiYXJlIFVSTHM6IGEgbGluaywgb3IgY29kZS5cbiAqL1xuaW50ZXJmYWNlIFNraXBwZWRUZXh0UmFuZ2Uge1xuICAvKipcbiAgICogVGhlIG9mZnNldCBqdXN0IHBhc3QgdGhlIHN0cmV0Y2guXG4gICAqL1xuICByZWFkb25seSBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG9mZnNldCB0aGUgc3RyZXRjaCBzdGFydHMgYXQuXG4gICAqL1xuICByZWFkb25seSBzdGFydE9mZnNldDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHdpZGVuVG9XaG9sZVZhbHVlfS5cbiAqL1xuaW50ZXJmYWNlIFdpZGVuVG9XaG9sZVZhbHVlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBvZmZzZXQgb2YgdGhlIGBdKGAgdGhhdCBlbmRzIHRoZSBjYXB0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FwdGlvbkVuZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluayBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFBhcnNlTGlua1Jlc3VsdDtcblxuICAvKipcbiAgICogVGhlIHdob2xlIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFdpa2lMaW5rTm9kZSBleHRlbmRzIE5vZGUge1xuICByZWFkb25seSBkYXRhOiBXaWtpTGlua05vZGVEYXRhO1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlRGF0YSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmVhZG9ubHkgYWxpYXM6IHN0cmluZztcbn1cblxuY2xhc3MgRnJvbnRtYXR0ZXJMaW5rc1BhcnNlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgbXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0c1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgbXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHNbXSA9IFtdO1xuXG4gIHB1YmxpYyBwYXJzZShmcm9udG1hdHRlcjogdW5rbm93bik6IFBhcnNlRnJvbnRtYXR0ZXJMaW5rc1Jlc3VsdCB7XG4gICAgdGhpcy5wYXJzZVZhbHVlKGZyb250bWF0dGVyLCAnJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdGhpcy5mcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0aGlzLm11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rczogdGhpcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rc1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNhdGVnb3JpemUocGFyYW1zOiBDYXRlZ29yaXplRnJvbnRtYXR0ZXJMaW5rUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgeyBpc1NpbmdsZUxpbmssIGtleSwgcGFyc2VMaW5rUmVzdWx0LCB2YWx1ZSB9ID0gcGFyYW1zO1xuICAgIGlmICghcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwgJiYgaXNTaW5nbGVMaW5rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVmZXJlbmNlOiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSA9IHtcbiAgICAgIGRpc3BsYXlUZXh0OiBwYXJzZUxpbmtSZXN1bHQuYWxpYXMgPz8gcGFyc2VMaW5rUmVzdWx0LnVybCxcbiAgICAgIGtleSxcbiAgICAgIGxpbms6IHBhcnNlTGlua1Jlc3VsdC51cmwsXG4gICAgICBvcmlnaW5hbDogdmFsdWUsXG4gICAgICBwYXJzZUxpbmtSZXN1bHRcbiAgICB9O1xuXG4gICAgaWYgKGlzU2luZ2xlTGluaykge1xuICAgICAgdGhpcy5mcm9udG1hdHRlckV4dGVybmFsTGlua3MucHVzaChyZWZlcmVuY2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZmVyZW5jZVdpdGhPZmZzZXRzOiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzID0ge1xuICAgICAgLi4ucmVmZXJlbmNlLFxuICAgICAgZW5kT2Zmc2V0OiBwYXJzZUxpbmtSZXN1bHQuZW5kT2Zmc2V0LFxuICAgICAgc3RhcnRPZmZzZXQ6IHBhcnNlTGlua1Jlc3VsdC5zdGFydE9mZnNldFxuICAgIH07XG5cbiAgICBpZiAocGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwpIHtcbiAgICAgIHRoaXMubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcy5wdXNoKHJlZmVyZW5jZVdpdGhPZmZzZXRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcy5wdXNoKHJlZmVyZW5jZVdpdGhPZmZzZXRzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVmFsdWUodmFsdWU6IHVua25vd24sIGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIE9ic2lkaWFuIGxpbmtzIGEgc2NoZW1lLWxlc3MgYHd3dy5gIGxpdGVyYWwgaW4gdGhlIGJvZHkgb25seSwgbmV2ZXIgaW4gYSBmcm9udG1hdHRlciB2YWx1ZS5cbiAgICAgIGNvbnN0IG9wdGlvbnM6IFBhcnNlTGlua3NPcHRpb25zID0geyBzaG91bGRSZWNvZ25pemVXd3dBdXRvbGlua0xpdGVyYWxzOiBmYWxzZSB9O1xuICAgICAgY29uc3QgcGFyc2VMaW5rUmVzdWx0cyA9IHBhcnNlTGlua3ModmFsdWUsIG9wdGlvbnMpO1xuICAgICAgY29uc3Qgd2hvbGVWYWx1ZUxpbmsgPSBnZXRXaG9sZVZhbHVlTGluayh7IGxpbmtzOiBwYXJzZUxpbmtSZXN1bHRzLCBvcHRpb25zLCB2YWx1ZSB9KTtcbiAgICAgIGlmICh3aG9sZVZhbHVlTGluaykge1xuICAgICAgICB0aGlzLmNhdGVnb3JpemUoeyBpc1NpbmdsZUxpbms6IHRydWUsIGtleSwgcGFyc2VMaW5rUmVzdWx0OiB3aG9sZVZhbHVlTGluaywgdmFsdWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBwYXJzZUxpbmtSZXN1bHQgb2YgcGFyc2VMaW5rUmVzdWx0cykge1xuICAgICAgICB0aGlzLmNhdGVnb3JpemUoeyBpc1NpbmdsZUxpbms6IGZhbHNlLCBrZXksIHBhcnNlTGlua1Jlc3VsdCwgdmFsdWUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjaGlsZEtleSwgY2hpbGRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgR2VuZXJpY09iamVjdCkpIHtcbiAgICAgIHRoaXMucGFyc2VWYWx1ZShjaGlsZFZhbHVlLCBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBFc2NhcGVzIHRoZSBhbGlhcyBvZiBhIG1hcmtkb3duIGxpbmsuXG4gKlxuICogQHBhcmFtIGFsaWFzIC0gQW4gYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgQW4gZXNjYXBlZCBhbGlhcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGVzY2FwZUFsaWFzKCcqKmFsaWFzKionKSAvLyAnXFxcXCpcXFxcKmFsaWFzXFxcXCpcXFxcKidcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlQWxpYXMoYWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBhbGlhcyxcbiAgICByZXBsYWNlcjogU3RyaW5nLnJhd2BcXCQmYCxcbiAgICBzZWFyY2hWYWx1ZTogU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVhcbiAgfSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcmVmZXJlbmNlIGlzIGEge0BsaW5rIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlfS5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmVmZXJlbmNlIGlzIGEge0BsaW5rIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlfSwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlKHJlZmVyZW5jZTogUmVmZXJlbmNlKTogcmVmZXJlbmNlIGlzIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlIHtcbiAgcmV0dXJuIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUocmVmZXJlbmNlKSAmJiAncGFyc2VMaW5rUmVzdWx0JyBpbiByZWZlcmVuY2U7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcmVmZXJlbmNlIGlzIGEge0BsaW5rIFBhcnNlTGlua1JlZmVyZW5jZX0uXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJlZmVyZW5jZSBpcyBhIHtAbGluayBQYXJzZUxpbmtSZWZlcmVuY2V9LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFyc2VMaW5rUmVmZXJlbmNlKHJlZmVyZW5jZTogUmVmZXJlbmNlKTogcmVmZXJlbmNlIGlzIFBhcnNlTGlua1JlZmVyZW5jZSB7XG4gIHJldHVybiAncGFyc2VMaW5rUmVzdWx0JyBpbiByZWZlcmVuY2U7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBsaW5rcyBmcm9tIGEgbm90ZSdzIGZyb250bWF0dGVyLiBFYWNoIHN0cmluZyB2YWx1ZSBpcyBwYXJzZWQgdmlhIHtAbGluayBwYXJzZUxpbmtzfTogYSB2YWx1ZVxuICogdGhhdCBpcyBhIHNpbmdsZSBsaW5rIHlpZWxkcyBhbiBlbnRyeSB3aXRob3V0IG9mZnNldHMsIGFuZCBhIHZhbHVlIHRoYXQgaG9sZHMgbXVsdGlwbGUgbGlua3MgeWllbGRzXG4gKiBvZmZzZXQtY2FycnlpbmcgZW50cmllcy4gQSB2YWx1ZSBpcyBhIHNpbmdsZSBsaW5rIHRoZSB3YXkgT2JzaWRpYW4gcmVhZHMgaXQsIHNvIGBbQSBbIEJdKHQubWQpYCBpcyBvbmVcbiAqIGxpbmsgY2FwdGlvbmVkIGBBIFsgQmAgKHNlZSB7QGxpbmsgcGFyc2VMaW5rfSkuIEludGVybmFsIHNpbmdsZS1saW5rIHZhbHVlcyBhcmUgb21pdHRlZCwgYXMgT2JzaWRpYW4gbmF0aXZlbHkgY2FjaGVzIHRoZW0uXG4gKlxuICogQHBhcmFtIGZyb250bWF0dGVyIC0gVGhlIGZyb250bWF0dGVyIHRvIHBhcnNlIChhIHZhbHVlLCBvYmplY3QsIG9yIGFycmF5KS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZnJvbnRtYXR0ZXIgbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZyb250bWF0dGVyTGlua3MoZnJvbnRtYXR0ZXI6IHVua25vd24pOiBQYXJzZUZyb250bWF0dGVyTGlua3NSZXN1bHQge1xuICByZXR1cm4gbmV3IEZyb250bWF0dGVyTGlua3NQYXJzZXIoKS5wYXJzZShmcm9udG1hdHRlcik7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgbGluayBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIEEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggYFtgIGFuZCBlbmRzIHdpdGggYSBtYXJrZG93biBsaW5rIGlzIHJlYWQgYXMgT05FIGxpbmsgd2hvc2UgY2FwdGlvbiBydW5zXG4gKiBmcm9tIHRoZSBsZWFkaW5nIGBbYCB0byB0aGF0IGxpbmsncyBgXShgLCB0aGUgd2F5IE9ic2lkaWFuIHJlYWRzIGEgZnJvbnRtYXR0ZXIgdmFsdWU6IGBbQSBbIEJdKHQubWQpYFxuICogaGFzIHRoZSBhbGlhcyBgQSBbIEJgLCB3aGVyZSBDb21tb25NYXJrIGZpbmRzIG9ubHkgYFsgQl0odC5tZClgLlxuICpcbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIGxpbmsgdG8gcGFyc2UuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaW5rKCRzdHJpbmc6IHN0cmluZywgb3B0aW9ucz86IFBhcnNlTGlua09wdGlvbnMpOiBudWxsIHwgUGFyc2VMaW5rUmVzdWx0IHtcbiAgcmV0dXJuIGdldFdob2xlVmFsdWVMaW5rKHsgbGlua3M6IHBhcnNlTGlua3MoJHN0cmluZywgb3B0aW9ucyksIG9wdGlvbnMsIHZhbHVlOiAkc3RyaW5nIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhbGwgbGlua3MgaW4gYSBzdHJpbmcuXG4gKlxuICogQmVzaWRlcyBtYXJrZG93biBsaW5rcywgd2lraWxpbmtzIGFuZCBhdXRvbGlua3MsIHRoZSBwbGFpbiB0ZXh0IGJldHdlZW4gdGhlbSBpcyBzY2FubmVkIGZvciBiYXJlXG4gKiBVUkxzIHdpdGggYSBzY2hlbWUgKGBodHRwczovL2V4YW1wbGUuY29tYCkgYW5kLCB1bmxlc3MgdHVybmVkIG9mZiB0aHJvdWdoXG4gKiB7QGxpbmsgUGFyc2VMaW5rc09wdGlvbnMuc2hvdWxkUmVjb2duaXplV3d3QXV0b2xpbmtMaXRlcmFsc30sIGZvciBHRk0gZXh0ZW5kZWQgYHd3dy5gIGF1dG9saW5rXG4gKiBsaXRlcmFscyAoYHd3dy5leGFtcGxlLmNvbWApLiBTdWNoIGEgbGl0ZXJhbCBpcyByZXBvcnRlZCBhcyBhbiBleHRlcm5hbCBsaW5rIHdob3NlIGB1cmxgIGNhcnJpZXMgdGhlXG4gKiBgaHR0cDovL2Agc2NoZW1lIE9ic2lkaWFuIG9wZW5zIGl0IHdpdGgsIHNvIGEgbGluayByZWJ1aWx0IGZyb20gaXQgc3RheXMgZXh0ZXJuYWw6IGEgc2NoZW1lLWxlc3NcbiAqIGBbYWxpYXNdKHd3dy5leGFtcGxlLmNvbSlgIGlzIGFuIGludGVybmFsIGxpbmsgaW4gT2JzaWRpYW4uIEEgbGl0ZXJhbCB3cmFwcGVkIGluIGA8Li4uPmAgcmVwb3J0cyB0aGVcbiAqIGJyYWNrZXRzIGFzIHBhcnQgb2YgYHJhd2AsIHNvIHJlcGxhY2luZyBgcmF3YCBsZWF2ZXMgbm8gc3RyYXkgYnJhY2tldCBiZWhpbmQuXG4gKlxuICogQ29kZSBpcyBuZXZlciBzY2FubmVkOiBmZW5jZWQgYW5kIGluZGVudGVkIGNvZGUgYmxvY2tzLCBhIGZlbmNlJ3MgaW5mbyBzdHJpbmcgYW5kIGlubGluZSBjb2RlIGhvbGQgbm9cbiAqIGxpbmsgaW4gT2JzaWRpYW4uIEEgYmFyZSBgZmlsZTpgIFVSTCBpcyByZXBvcnRlZCBvbmx5IHdoZW4gYSBzbGFzaCBvciBhIGJhY2tzbGFzaCBmb2xsb3dzIHRoZSBzY2hlbWUsIHNvIGFcbiAqIHdvcmQgc3VjaCBhcyBgZmlsZTpweXRob24zLnB5YCBzdGF5cyB0ZXh0LlxuICpcbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIHN0cmluZyB0byBwYXJzZSB0aGUgbGlua3MgaW4uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlua3MoJHN0cmluZzogc3RyaW5nLCBvcHRpb25zPzogUGFyc2VMaW5rc09wdGlvbnMpOiBQYXJzZUxpbmtSZXN1bHRbXSB7XG4gIGNvbnN0IHNob3VsZFJlY29nbml6ZVd3d0F1dG9saW5rTGl0ZXJhbHMgPSBvcHRpb25zPy5zaG91bGRSZWNvZ25pemVXd3dBdXRvbGlua0xpdGVyYWxzID8/IHRydWU7XG4gIGNvbnN0IGVtYmVkU3ltYm9sT2Zmc2V0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIGNvbnN0IEVNQkVEX0xJTktfUFJFRklYID0gJyFbJztcbiAgY29uc3QgTk9fRU1CRURfTElOS19QUkVGSVggPSAnQFsnO1xuICBjb25zdCBEVU1NWV9DSEFSQUNURVIgPSAnQCc7XG5cbiAgY29uc3QgRU1CRURfSU5TSURFX0xJTktfUkVHX0VYUCA9IC9cXFsoPzxMaW5rQWxpYXM+IVxcWy4qP1xcXVxcKC4rP1xcKSlcXF1cXCgoPzxMaW5rPi4rPylcXCkvZztcbiAgY29uc3Qgbm9JbnNpZGVFbWJlZHNMaW5rc1N0cmluZyA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmcsXG4gICAgcmVwbGFjZXI6ICh7IGNhcHR1cmVkR3JvdXBBcmd1bWVudHM6IFtsaW5rQWxpYXMgPSAnJywgbGluayA9ICcnXSB9KSA9PiB7XG4gICAgICBjb25zdCBkdW1teUFsaWFzID0gRFVNTVlfQ0hBUkFDVEVSLnJlcGVhdChsaW5rQWxpYXMubGVuZ3RoKTtcbiAgICAgIHJldHVybiBgWyR7ZHVtbXlBbGlhc31dKCR7bGlua30pYDtcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlOiBFTUJFRF9JTlNJREVfTElOS19SRUdfRVhQXG4gIH0pO1xuXG4gIGNvbnN0IG5vRW1iZWRTdHJpbmcgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBub0luc2lkZUVtYmVkc0xpbmtzU3RyaW5nLFxuICAgIHJlcGxhY2VyOiAoJGFyZ3VtZW50cykgPT4ge1xuICAgICAgZW1iZWRTeW1ib2xPZmZzZXRzLmFkZCgkYXJndW1lbnRzLm9mZnNldCk7XG4gICAgICByZXR1cm4gTk9fRU1CRURfTElOS19QUkVGSVg7XG4gICAgfSxcbiAgICBzZWFyY2hWYWx1ZTogRU1CRURfTElOS19QUkVGSVhcbiAgfSk7XG5cbiAgY29uc3QgcHJvY2Vzc29yID0gcmVtYXJrKCkudXNlKHJlbWFya1BhcnNlKS51c2Uod2lraUxpbmtQbHVnaW4sIHsgYWxpYXNEaXZpZGVyOiBXSUtJTElOS19ESVZJREVSIH0pO1xuICBjb25zdCByb290ID0gcHJvY2Vzc29yLnBhcnNlKG5vRW1iZWRTdHJpbmcpO1xuXG4gIGNvbnN0IGxpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSA9IFtdO1xuICBjb25zdCB0ZXh0TGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG4gIGNvbnN0IHNraXBwZWRSYW5nZXM6IFNraXBwZWRUZXh0UmFuZ2VbXSA9IFtdO1xuXG4gIHZpc2l0KHJvb3QsIChub2RlOiBOb2RlKSA9PiB7XG4gICAgbGV0IGxpbms6IFBhcnNlTGlua1Jlc3VsdDtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgLy8gT2JzaWRpYW4gbmV2ZXIgbGlua3MgYW55dGhpbmcgaW5zaWRlIGNvZGUsIHNvIGl0cyB0ZXh0LCBhIGZlbmNlJ3MgaW5mbyBzdHJpbmcgaW5jbHVkZWQsIGlzIG5vdCBzY2FubmVkIGZvciBiYXJlIFVSTHMuXG4gICAgICBjYXNlICdjb2RlJzpcbiAgICAgIGNhc2UgJ2lubGluZUNvZGUnOiB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gICAgICAgIHNraXBwZWRSYW5nZXMucHVzaCh7XG4gICAgICAgICAgZW5kT2Zmc2V0OiBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5lbmQub2Zmc2V0KSxcbiAgICAgICAgICBzdGFydE9mZnNldDogZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uc3RhcnQub2Zmc2V0KVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGluayc6IHtcbiAgICAgICAgbGluayA9IHBhcnNlTGlua05vZGUobm9kZSBhcyBMaW5rLCAkc3RyaW5nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd3aWtpTGluayc6IHtcbiAgICAgICAgbGluayA9IHBhcnNlV2lraWxpbmtOb2RlKG5vZGUgYXMgV2lraUxpbmtOb2RlLCAkc3RyaW5nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW1iZWRTeW1ib2xPZmZzZXRzLmhhcyhsaW5rLnN0YXJ0T2Zmc2V0IC0gMSkpIHtcbiAgICAgIGxpbmsgPSB7XG4gICAgICAgIC4uLmxpbmssXG4gICAgICAgIGlzRW1iZWQ6IHRydWUsXG4gICAgICAgIHJhdzogYCEke2xpbmsucmF3fWAsXG4gICAgICAgIHN0YXJ0T2Zmc2V0OiBsaW5rLnN0YXJ0T2Zmc2V0IC0gMVxuICAgICAgfTtcbiAgICB9XG4gICAgbGlua3MucHVzaChsaW5rKTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgc2tpcHBlZFJhbmdlcy5wdXNoKHsgZW5kT2Zmc2V0OiBsaW5rLmVuZE9mZnNldCArIDEsIHN0YXJ0T2Zmc2V0OiBsaW5rLnN0YXJ0T2Zmc2V0IH0pO1xuICB9XG5cbiAgc2tpcHBlZFJhbmdlcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0T2Zmc2V0IC0gYi5zdGFydE9mZnNldCk7XG5cbiAgbGV0IHRleHRTdGFydE9mZnNldCA9IDA7XG5cbiAgZm9yIChjb25zdCBza2lwcGVkUmFuZ2Ugb2Ygc2tpcHBlZFJhbmdlcykge1xuICAgIGV4dHJhY3RUZXh0TGlua3Moe1xuICAgICAgJHN0cmluZyxcbiAgICAgIGVuZE9mZnNldDogc2tpcHBlZFJhbmdlLnN0YXJ0T2Zmc2V0IC0gMSxcbiAgICAgIHNob3VsZFJlY29nbml6ZVd3d0F1dG9saW5rTGl0ZXJhbHMsXG4gICAgICBzdGFydE9mZnNldDogdGV4dFN0YXJ0T2Zmc2V0LFxuICAgICAgdGV4dExpbmtzXG4gICAgfSk7XG4gICAgLy8gQSByYW5nZSBuZXN0ZWQgaW4gYW4gZWFybGllciBvbmUsIHN1Y2ggYXMgaW5saW5lIGNvZGUgaW4gYSBsaW5rJ3MgYWxpYXMsIG11c3Qgbm90IG1vdmUgdGhlIHN0YXJ0IGJhY2suXG4gICAgdGV4dFN0YXJ0T2Zmc2V0ID0gTWF0aC5tYXgodGV4dFN0YXJ0T2Zmc2V0LCBza2lwcGVkUmFuZ2UuZW5kT2Zmc2V0KTtcbiAgfVxuXG4gIGV4dHJhY3RUZXh0TGlua3Moe1xuICAgICRzdHJpbmcsXG4gICAgZW5kT2Zmc2V0OiAkc3RyaW5nLmxlbmd0aCAtIDEsXG4gICAgc2hvdWxkUmVjb2duaXplV3d3QXV0b2xpbmtMaXRlcmFscyxcbiAgICBzdGFydE9mZnNldDogdGV4dFN0YXJ0T2Zmc2V0LFxuICAgIHRleHRMaW5rc1xuICB9KTtcblxuICBsaW5rcy5wdXNoKC4uLnRleHRMaW5rcyk7XG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogV3JhcHMgYSB7QGxpbmsgUGFyc2VMaW5rUmVzdWx0fSBpbnRvIGEge0BsaW5rIFBhcnNlTGlua1JlZmVyZW5jZX0gc28gaXQgY2FuIGZsb3cgdGhyb3VnaCB0aGVcbiAqIHJlZmVyZW5jZS1iYXNlZCBmaWxlLWNoYW5nZSBwaXBlbGluZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHdyYXBwaW5nIHRoZSBwYXJzZWQgbGluay5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGFyc2VMaW5rUmVmZXJlbmNlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUGFyc2VMaW5rUmVmZXJlbmNlKHBhcmFtczogVG9QYXJzZUxpbmtSZWZlcmVuY2VQYXJhbXMpOiBQYXJzZUxpbmtSZWZlcmVuY2Uge1xuICBjb25zdCB7IGNvbnRlbnQsIHBhcnNlTGlua1Jlc3VsdCB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIC4uLihwYXJzZUxpbmtSZXN1bHQuYWxpYXMgIT09IHVuZGVmaW5lZCAmJiB7IGRpc3BsYXlUZXh0OiBwYXJzZUxpbmtSZXN1bHQuYWxpYXMgfSksXG4gICAgbGluazogcGFyc2VMaW5rUmVzdWx0LnVybCxcbiAgICBvcmlnaW5hbDogcGFyc2VMaW5rUmVzdWx0LnJhdyxcbiAgICBwYXJzZUxpbmtSZXN1bHQsXG4gICAgcG9zaXRpb246IHtcbiAgICAgIGVuZDogb2Zmc2V0VG9Mb2MoY29udGVudCwgcGFyc2VMaW5rUmVzdWx0LmVuZE9mZnNldCksXG4gICAgICBzdGFydDogb2Zmc2V0VG9Mb2MoY29udGVudCwgcGFyc2VMaW5rUmVzdWx0LnN0YXJ0T2Zmc2V0KVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVbmVzY2FwZXMgdGhlIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqXG4gKiBAcGFyYW0gZXNjYXBlZEFsaWFzIC0gQW4gZXNjYXBlZCBhbGlhcy5cbiAqIEByZXR1cm5zIEFuIHVuZXNjYXBlZCBhbGlhcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIHVuZXNjYXBlQWxpYXMoJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConKSAvLyAnKiphbGlhcyoqJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmVzY2FwZUFsaWFzKGVzY2FwZWRBbGlhczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGVzY2FwZWRBbGlhcyxcbiAgICByZXBsYWNlcjogKHsgY2FwdHVyZWRHcm91cEFyZ3VtZW50czogW2JhY2tzbGFzaGVzID0gJycsIHNwZWNpYWxDaGFyID0gJyddIH0pID0+IHtcbiAgICAgIGNvbnN0IEVTQ0FQRURfQkFDS1NMQVNIX0xFTkdUSCA9IDI7XG4gICAgICBjb25zdCBiYWNrc2xhc2hDb3VudCA9IGJhY2tzbGFzaGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGtlZXBDb3VudCA9IE1hdGguZmxvb3IoYmFja3NsYXNoQ291bnQgLyBFU0NBUEVEX0JBQ0tTTEFTSF9MRU5HVEgpO1xuICAgICAgcmV0dXJuICdcXFxcJy5yZXBlYXQoa2VlcENvdW50KSArIHNwZWNpYWxDaGFyO1xuICAgIH0sXG4gICAgc2VhcmNoVmFsdWU6IC8oPzxCYWNrc2xhc2hlcz5cXFxcKykoPzxTcGVjaWFsQ2hhcmFjdGVyPlshXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXFxcXFxdXl9ge3x9fl0pL2dcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvdW50T2NjdXJyZW5jZXMoJHN0cmluZzogc3RyaW5nLCBjaGFyYWN0ZXI6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiAkc3RyaW5nLnNwbGl0KGNoYXJhY3RlcikubGVuZ3RoIC0gMTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlVXJsU2FmZWx5KHBhcmFtczogRGVjb2RlVXJsU2FmZWx5UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBoYXNBbmdsZUJyYWNrZXRzLCBpc0V4dGVybmFsLCB1cmwgfSA9IHBhcmFtcztcbiAgLy8gYGZpbGU6Ly9gIFVSTHMgYXJlIGV4dGVybmFsLCBidXQgdGhlaXIgcGVyY2VudC1lbmNvZGluZyBpcyBwdXJlbHkgY29zbWV0aWMsIHNvIGRlY29kZSB0aGVtIGxpa2VcbiAgLy8gaW50ZXJuYWwgbGlua3MuIEV2ZXJ5IG90aGVyIGV4dGVybmFsIFVSTCBpcyBsZWZ0IHVudG91Y2hlZCAoaXRzIGVuY29kaW5nIG1heSBiZSBzaWduaWZpY2FudCkuXG4gIGlmICgoaXNFeHRlcm5hbCB8fCBoYXNBbmdsZUJyYWNrZXRzKSAmJiAhaXNGaWxlVXJsKHVybCkpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGRlY29kZSBVUkwgJHt1cmx9YCwgZXJyb3IpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFsaWFzKHBhcmFtczogRXh0cmFjdEFsaWFzUGFyYW1zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyAkc3RyaW5nLCBhbGlhc0VuZE9mZnNldCwgYWxpYXNTdGFydE9mZnNldCB9ID0gcGFyYW1zO1xuICByZXR1cm4gYWxpYXNTdGFydE9mZnNldCA8IGFsaWFzRW5kT2Zmc2V0XG4gICAgPyAkc3RyaW5nLnNsaWNlKGFsaWFzU3RhcnRPZmZzZXQsIGFsaWFzRW5kT2Zmc2V0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VGV4dExpbmtzKHBhcmFtczogRXh0cmFjdFRleHRMaW5rc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7ICRzdHJpbmcsIGVuZE9mZnNldCwgc2hvdWxkUmVjb2duaXplV3d3QXV0b2xpbmtMaXRlcmFscywgc3RhcnRPZmZzZXQsIHRleHRMaW5rcyB9ID0gcGFyYW1zO1xuICBpZiAoc3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0ZXh0UGFydCA9ICRzdHJpbmcuc2xpY2Uoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCArIDEpO1xuICBjb25zdCBzY2hlbWVMaW5rczogUGFyc2VMaW5rUmVzdWx0W10gPSBbXTtcbiAgcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogdGV4dFBhcnQsXG4gICAgcmVwbGFjZXI6ICh7IGNhcHR1cmVkR3JvdXBBcmd1bWVudHM6IFtyYXdVcmwgPSAnJ10sIG9mZnNldCB9KSA9PiB7XG4gICAgICBpZiAoIWlzVXJsKHJhd1VybCkgfHwgKGlzRmlsZVVybChyYXdVcmwpICYmICFCQVJFX0ZJTEVfVVJMX1JFR19FWFAudGVzdChyYXdVcmwpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIERlY29kZSBiYXJlIGBmaWxlOi8vYCBVUkxzIGxpa2UgdGhlIGJyYWNrZXRlZCBwYXRoIChgcGFyc2VMaW5rTm9kZWApIGRvZXMuXG4gICAgICAvLyBPZmZzZXRzIGFuZCBgcmF3YCBzdGF5IGJhc2VkIG9uIHRoZSBvcmlnaW5hbCAocG9zc2libHkgcGVyY2VudC1lbmNvZGVkKSB0ZXh0LlxuICAgICAgY29uc3QgdXJsID0gZGVjb2RlVXJsU2FmZWx5KHtcbiAgICAgICAgaGFzQW5nbGVCcmFja2V0czogZmFsc2UsXG4gICAgICAgIGlzRXh0ZXJuYWw6IHRydWUsXG4gICAgICAgIHVybDogcmF3VXJsXG4gICAgICB9KTtcbiAgICAgIHNjaGVtZUxpbmtzLnB1c2goe1xuICAgICAgICBlbmNvZGVkVXJsOiBlbmNvZGVVcmwodXJsKSxcbiAgICAgICAgZW5kT2Zmc2V0OiBzdGFydE9mZnNldCArIG9mZnNldCArIHJhd1VybC5sZW5ndGgsXG4gICAgICAgIGhhc0FuZ2xlQnJhY2tldHM6IGZhbHNlLFxuICAgICAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgaXNGaWxlVXJsOiBpc0ZpbGVVcmwodXJsKSxcbiAgICAgICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgICAgIHJhdzogcmF3VXJsLFxuICAgICAgICBzdGFydE9mZnNldDogc3RhcnRPZmZzZXQgKyBvZmZzZXQsXG4gICAgICAgIHVybFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBzZWFyY2hWYWx1ZTogLyg/PFVybD5cXFMrKS9nXG4gIH0pO1xuICB0ZXh0TGlua3MucHVzaCguLi5zY2hlbWVMaW5rcyk7XG5cbiAgaWYgKCFzaG91bGRSZWNvZ25pemVXd3dBdXRvbGlua0xpdGVyYWxzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0ZXh0UGFydC5tYXRjaEFsbChXV1dfQVVUT0xJTktfTElURVJBTF9DQU5ESURBVEVfUkVHX0VYUCkpIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnTGl0ZXJhbCcpO1xuICAgIGNvbnN0IGxpdGVyYWwgPSB0cmltV3d3QXV0b2xpbmtMaXRlcmFsKGNhbmRpZGF0ZSk7XG4gICAgaWYgKCFpc1ZhbGlkV3d3QXV0b2xpbmtMaXRlcmFsKGxpdGVyYWwpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXRlcmFsU3RhcnRPZmZzZXQgPSBzdGFydE9mZnNldCArIG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIC0gY2FuZGlkYXRlLmxlbmd0aDtcbiAgICBjb25zdCBsaXRlcmFsRW5kT2Zmc2V0ID0gbGl0ZXJhbFN0YXJ0T2Zmc2V0ICsgbGl0ZXJhbC5sZW5ndGg7XG4gICAgaWYgKHNjaGVtZUxpbmtzLnNvbWUoKGxpbmspID0+IGxpbmsuc3RhcnRPZmZzZXQgPCBsaXRlcmFsRW5kT2Zmc2V0ICYmIGxpdGVyYWxTdGFydE9mZnNldCA8IGxpbmsuZW5kT2Zmc2V0KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQW5nbGVCcmFja2V0cyA9ICRzdHJpbmdbbGl0ZXJhbFN0YXJ0T2Zmc2V0IC0gMV0gPT09ICc8JyAmJiAkc3RyaW5nW2xpdGVyYWxFbmRPZmZzZXRdID09PSAnPic7XG4gICAgY29uc3QgbGlua1N0YXJ0T2Zmc2V0ID0gaGFzQW5nbGVCcmFja2V0cyA/IGxpdGVyYWxTdGFydE9mZnNldCAtIDEgOiBsaXRlcmFsU3RhcnRPZmZzZXQ7XG4gICAgY29uc3QgbGlua0VuZE9mZnNldCA9IGhhc0FuZ2xlQnJhY2tldHMgPyBsaXRlcmFsRW5kT2Zmc2V0ICsgMSA6IGxpdGVyYWxFbmRPZmZzZXQ7XG4gICAgY29uc3QgdXJsID0gV1dXX0FVVE9MSU5LX0xJVEVSQUxfU0NIRU1FICsgbGl0ZXJhbDtcbiAgICB0ZXh0TGlua3MucHVzaCh7XG4gICAgICBlbmNvZGVkVXJsOiBlbmNvZGVVcmwodXJsKSxcbiAgICAgIGVuZE9mZnNldDogbGlua0VuZE9mZnNldCxcbiAgICAgIGhhc0FuZ2xlQnJhY2tldHMsXG4gICAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICAgIGlzRXh0ZXJuYWw6IHRydWUsXG4gICAgICBpc0ZpbGVVcmw6IGZhbHNlLFxuICAgICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgICByYXc6ICRzdHJpbmcuc2xpY2UobGlua1N0YXJ0T2Zmc2V0LCBsaW5rRW5kT2Zmc2V0KSxcbiAgICAgIHN0YXJ0T2Zmc2V0OiBsaW5rU3RhcnRPZmZzZXQsXG4gICAgICB1cmxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSYXdMaW5rKG5vZGU6IE5vZGUsICRzdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBvcyA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUucG9zaXRpb24pO1xuICByZXR1cm4gJHN0cmluZy5zbGljZShwb3Muc3RhcnQub2Zmc2V0LCBwb3MuZW5kLm9mZnNldCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSB3aG9sZSB2YWx1ZSBhcyBvbmUgbGluaywgYXMgT2JzaWRpYW4gcmVhZHMgYSBmcm9udG1hdHRlciB2YWx1ZS4gT2JzaWRpYW4gdGFrZXMgYSB2YWx1ZSB0aGF0XG4gKiBzdGFydHMgd2l0aCBgW2AgYW5kIGVuZHMgd2l0aCBgXSh1cmwpYCBhcyBhIHNpbmdsZSBsaW5rIGNhcHRpb25lZCBieSBldmVyeXRoaW5nIGluIGJldHdlZW4sIHNvIGEgY2FwdGlvblxuICogaG9sZGluZyBhbiB1bmJhbGFuY2VkIGJyYWNrZXQgKGBbQSBbIEJdKHQubWQpYCwgYFthXSBbYl0oYy5tZClgLCBgW2FdYl0oYy5tZClgKSBpcyBzdGlsbCBvbmUgbGlua1xuICogdGhlcmUsIHdoZXJlIENvbW1vbk1hcmsgZmluZHMgYSBzaG9ydGVyIGxpbmsgYXQgdGhlIGlubmVyIGBbYCwgb3Igbm9uZSBhdCBhbGwuIEEgdmFsdWUgQ29tbW9uTWFyayByZWFkc1xuICogYXMgdHdvIG9yIG1vcmUgbGlua3Mgc3RheXMgbXVsdGktbGluaywgYmVjYXVzZSB3aGF0IE9ic2lkaWFuIG1ha2VzIG9mIHRob3NlIGlzIGdhcmJhZ2UuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB2YWx1ZSBhbmQgaXRzIGxpbmtzLlxuICogQHJldHVybnMgVGhlIGxpbmsgc3Bhbm5pbmcgdGhlIHdob2xlIHZhbHVlLCBvciBgbnVsbGAgaWYgdGhlIHZhbHVlIGlzIG5vdCBhIHNpbmdsZSBsaW5rLlxuICovXG5mdW5jdGlvbiBnZXRXaG9sZVZhbHVlTGluayhwYXJhbXM6IEdldFdob2xlVmFsdWVMaW5rUGFyYW1zKTogbnVsbCB8IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IHsgbGlua3MsIG9wdGlvbnMsIHZhbHVlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IFtmaXJzdExpbmtdID0gbGlua3M7XG4gIGlmIChsaW5rcy5sZW5ndGggPT09IDEgJiYgZmlyc3RMaW5rPy5yYXcgPT09IHZhbHVlKSB7XG4gICAgcmV0dXJuIGZpcnN0TGluaztcbiAgfVxuXG4gIGlmICghdmFsdWUuc3RhcnRzV2l0aCgnWycpIHx8IGxpbmtzLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChmaXJzdExpbmspIHtcbiAgICAvLyBPbmx5IGEgbWFya2Rvd24gbGluayB3aWRlbnM6IGEgd2lraWxpbmssIGFuIGVtYmVkLCBhIGJhcmUgVVJMIG9yIGFuIGF1dG9saW5rIGRvZXMgbm90LlxuICAgIGlmIChmaXJzdExpbmsuaXNXaWtpbGluayB8fCAhZmlyc3RMaW5rLnJhdy5zdGFydHNXaXRoKCdbJykgfHwgZmlyc3RMaW5rLmVuZE9mZnNldCAhPT0gdmFsdWUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkZW5Ub1dob2xlVmFsdWUoe1xuICAgICAgY2FwdGlvbkVuZE9mZnNldDogZmlyc3RMaW5rLnN0YXJ0T2Zmc2V0ICsgMSArIChmaXJzdExpbmsuYWxpYXM/Lmxlbmd0aCA/PyAwKSxcbiAgICAgIGxpbms6IGZpcnN0TGluayxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gIH1cblxuICAvLyBObyBsaW5rIGF0IGFsbCwgYXMgaW4gYFthXWJdKGMubWQpYDogaGlkZSB0aGUgY2FwdGlvbidzIGJyYWNrZXRzIHNvIENvbW1vbk1hcmsgc2VlcyBvbmUgbGluay5cbiAgY29uc3QgY2FwdGlvbkVuZE9mZnNldCA9IHZhbHVlLmxhc3RJbmRleE9mKCddKCcpO1xuICBpZiAoY2FwdGlvbkVuZE9mZnNldCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG1hc2tlZFZhbHVlID0gYFske3ZhbHVlLnNsaWNlKDEsIGNhcHRpb25FbmRPZmZzZXQpLnJlcGxhY2VBbGwoL1tbXFxdXS9nLCAnQCcpfSR7dmFsdWUuc2xpY2UoY2FwdGlvbkVuZE9mZnNldCl9YDtcbiAgY29uc3QgbWFza2VkTGlua3MgPSBwYXJzZUxpbmtzKG1hc2tlZFZhbHVlLCBvcHRpb25zKTtcbiAgY29uc3QgW21hc2tlZExpbmtdID0gbWFza2VkTGlua3M7XG4gIHJldHVybiBtYXNrZWRMaW5rcy5sZW5ndGggPT09IDEgJiYgbWFza2VkTGluaz8ucmF3ID09PSBtYXNrZWRWYWx1ZVxuICAgID8gd2lkZW5Ub1dob2xlVmFsdWUoeyBjYXB0aW9uRW5kT2Zmc2V0LCBsaW5rOiBtYXNrZWRMaW5rLCB2YWx1ZSB9KVxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaGFzQW5nbGVCcmFja2V0c0luTGluayhwYXJhbXM6IEhhc0FuZ2xlQnJhY2tldHNJbkxpbmtQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3QgeyByYXcsIHJhd1VybCB9ID0gcGFyYW1zO1xuICBjb25zdCBPUEVOX0FOR0xFX0JSQUNLRVQgPSAnPCc7XG4gIHJldHVybiByYXcuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpIHx8IHJhd1VybC5zdGFydHNXaXRoKE9QRU5fQU5HTEVfQlJBQ0tFVCk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRXd3dBdXRvbGlua0xpdGVyYWwobGl0ZXJhbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRvbWFpbiA9IFdXV19BVVRPTElOS19MSVRFUkFMX0RPTUFJTl9SRUdfRVhQLmV4ZWMobGl0ZXJhbCk/LlswXTtcbiAgaWYgKGRvbWFpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gR0ZNOiBubyB1bmRlcnNjb3JlIGluIHRoZSBsYXN0IHR3byBzZWdtZW50cyBvZiB0aGUgZG9tYWluLlxuICBjb25zdCBMQVNUX1NFR01FTlRTX0NPVU5UID0gMjtcbiAgcmV0dXJuIGRvbWFpbi5zcGxpdCgnLicpLnNsaWNlKC1MQVNUX1NFR01FTlRTX0NPVU5UKS5ldmVyeSgoc2VnbWVudCkgPT4gIXNlZ21lbnQuaW5jbHVkZXMoJ18nKSk7XG59XG5cbmZ1bmN0aW9uIG9mZnNldFRvTG9jKGNvbnRlbnQ6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIpOiBMb2Mge1xuICBjb25zdCBwcmVjZWRpbmdDb250ZW50ID0gY29udGVudC5zbGljZSgwLCBvZmZzZXQpO1xuICBjb25zdCBsaW5lID0gKHByZWNlZGluZ0NvbnRlbnQubWF0Y2goL1xcbi9nKSA/PyBbXSkubGVuZ3RoO1xuICBjb25zdCBsYXN0TmV3bGluZU9mZnNldCA9IHByZWNlZGluZ0NvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicpO1xuICByZXR1cm4ge1xuICAgIGNvbDogb2Zmc2V0IC0gKGxhc3ROZXdsaW5lT2Zmc2V0ICsgMSksXG4gICAgbGluZSxcbiAgICBvZmZzZXRcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaW5rTm9kZShub2RlOiBMaW5rLCAkc3RyaW5nOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBMSU5LX0FMSUFTX1NVRkZJWCA9ICddKCc7XG4gIGNvbnN0IExJTktfU1VGRklYID0gJyknO1xuICBjb25zdCByYXcgPSBnZXRSYXdMaW5rKG5vZGUsICRzdHJpbmcpO1xuICBjb25zdCBwb3NpdGlvbiA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUucG9zaXRpb24pO1xuICBjb25zdCBub2RlRW5kT2Zmc2V0ID0gZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uZW5kLm9mZnNldCk7XG4gIGNvbnN0IG5vZGVTdGFydE9mZnNldCA9IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLnN0YXJ0Lm9mZnNldCk7XG4gIC8vIEFuIGVtcHR5IGxhYmVsIChgW10oLi4uKWApIGhhcyBubyBjaGlsZHJlbiwgc28gaXQgc3RhcnRzIGFuZCBlbmRzIGp1c3QgYWZ0ZXIgdGhlIG5vZGUncyBvd24gYFtgLiBBbiBlbWJlZCdzIGAhYCBpcyBvdXRzaWRlIHRoZSBub2RlLCBzaW5jZSBgcGFyc2VMaW5rc2AgbWFza3MgaXQgYmVmb3JlIHBhcnNpbmcuXG4gIGNvbnN0IGVtcHR5QWxpYXNPZmZzZXQgPSBub2RlU3RhcnRPZmZzZXQgKyAxO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9iZXR0ZXItZG9tLXRyYXZlcnNpbmcgLS0gYG5vZGVgIGlzIGFuIG1kYXN0IG5vZGUsIG5vdCBhIERPTSBub2RlLiBJdCBoYXMgbm8gYGZpcnN0RWxlbWVudENoaWxkYDsgdGhlIHJ1bGUgbWF0Y2hlcyB0aGUgYC5jaGlsZHJlblswXWAgc2hhcGUgd2l0aG91dCBjaGVja2luZyB3aGF0IGl0IGlzIG9uLlxuICBjb25zdCBhbGlhc05vZGVTdGFydE9mZnNldCA9IG5vZGUuY2hpbGRyZW5bMF0/LnBvc2l0aW9uPy5zdGFydC5vZmZzZXQgPz8gZW1wdHlBbGlhc09mZnNldDtcbiAgY29uc3QgYWxpYXNOb2RlRW5kT2Zmc2V0ID0gbm9kZS5jaGlsZHJlbi5hdCgtMSk/LnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IGVtcHR5QWxpYXNPZmZzZXQ7XG4gIGNvbnN0IHJhd1VybCA9ICRzdHJpbmcuc2xpY2UoYWxpYXNOb2RlRW5kT2Zmc2V0ICsgTElOS19BTElBU19TVUZGSVgubGVuZ3RoLCBub2RlRW5kT2Zmc2V0IC0gTElOS19TVUZGSVgubGVuZ3RoKTtcbiAgY29uc3QgaGFzQW5nbGVCcmFja2V0cyA9IGhhc0FuZ2xlQnJhY2tldHNJbkxpbmsoe1xuICAgIHJhdyxcbiAgICByYXdVcmxcbiAgfSk7XG4gIGNvbnN0IGlzRXh0ZXJuYWwgPSBpc1VybChub2RlLnVybCk7XG4gIGNvbnN0IHVybCA9IGRlY29kZVVybFNhZmVseSh7XG4gICAgaGFzQW5nbGVCcmFja2V0cyxcbiAgICBpc0V4dGVybmFsLFxuICAgIHVybDogbm9kZS51cmxcbiAgfSk7XG4gIGNvbnN0IGFsaWFzID0gZXh0cmFjdEFsaWFzKHtcbiAgICAkc3RyaW5nLFxuICAgIGFsaWFzRW5kT2Zmc2V0OiBhbGlhc05vZGVFbmRPZmZzZXQsXG4gICAgYWxpYXNTdGFydE9mZnNldDogYWxpYXNOb2RlU3RhcnRPZmZzZXRcbiAgfSk7XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXMsXG4gICAgZW5jb2RlZFVybDogaXNFeHRlcm5hbCA/IGVuY29kZVVybCh1cmwpIDogdW5kZWZpbmVkLFxuICAgIGVuZE9mZnNldDogbm9kZUVuZE9mZnNldCxcbiAgICBoYXNBbmdsZUJyYWNrZXRzLFxuICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgIGlzRXh0ZXJuYWwsXG4gICAgaXNGaWxlVXJsOiBpc0ZpbGVVcmwodXJsKSxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICByYXcsXG4gICAgc3RhcnRPZmZzZXQ6IG5vZGVTdGFydE9mZnNldCxcbiAgICB0aXRsZTogbm9kZS50aXRsZSA/PyB1bmRlZmluZWQsXG4gICAgdW5lc2NhcGVkQWxpYXM6IGFsaWFzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB1bmVzY2FwZUFsaWFzKGFsaWFzKSxcbiAgICB1cmxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2lraWxpbmtOb2RlKG5vZGU6IFdpa2lMaW5rTm9kZSwgJHN0cmluZzogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgcG9zaXRpb24gPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQYXJzZUxpbmtSZXN1bHQ+KHtcbiAgICBhbGlhczogJHN0cmluZy5pbmNsdWRlcyhXSUtJTElOS19ESVZJREVSKSA/IG5vZGUuZGF0YS5hbGlhcyA6IHVuZGVmaW5lZCxcbiAgICBlbmRPZmZzZXQ6IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpLFxuICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgIGlzRXh0ZXJuYWw6IGZhbHNlLFxuICAgIGlzRmlsZVVybDogZmFsc2UsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICByYXc6IGdldFJhd0xpbmsobm9kZSwgJHN0cmluZyksXG4gICAgc3RhcnRPZmZzZXQ6IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLnN0YXJ0Lm9mZnNldCksXG4gICAgdXJsOiBub2RlLnZhbHVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0cmltV3d3QXV0b2xpbmtMaXRlcmFsKGxpdGVyYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWQgPSB0cmltV3d3QXV0b2xpbmtMaXRlcmFsRW5kKGxpdGVyYWwpO1xuICByZXR1cm4gdHJpbW1lZCA9PT0gbGl0ZXJhbCA/IGxpdGVyYWwgOiB0cmltV3d3QXV0b2xpbmtMaXRlcmFsKHRyaW1tZWQpO1xufVxuXG5mdW5jdGlvbiB0cmltV3d3QXV0b2xpbmtMaXRlcmFsRW5kKGxpdGVyYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxhc3RDaGFyYWN0ZXIgPSBsaXRlcmFsLnNsaWNlKC0xKTtcbiAgaWYgKFdXV19BVVRPTElOS19MSVRFUkFMX1RSQUlMSU5HX1BVTkNUVUFUSU9OLmhhcyhsYXN0Q2hhcmFjdGVyKSkge1xuICAgIHJldHVybiBsaXRlcmFsLnNsaWNlKDAsIC0xKTtcbiAgfVxuXG4gIC8vIEdGTTogYSBjbG9zaW5nIHBhcmVudGhlc2lzIHdpdGggbm8gb3BlbmluZyBvbmUgdG8gbWF0Y2ggaXMgbm90IHBhcnQgb2YgdGhlIGxpdGVyYWwuXG4gIHJldHVybiBsYXN0Q2hhcmFjdGVyID09PSAnKScgJiYgY291bnRPY2N1cnJlbmNlcyhsaXRlcmFsLCAnKScpID4gY291bnRPY2N1cnJlbmNlcyhsaXRlcmFsLCAnKCcpXG4gICAgPyBsaXRlcmFsLnNsaWNlKDAsIC0xKVxuICAgIDogbGl0ZXJhbC5yZXBsYWNlKFRSQUlMSU5HX0VOVElUWV9SRUZFUkVOQ0VfUkVHX0VYUCwgJycpO1xufVxuXG5mdW5jdGlvbiB3aWRlblRvV2hvbGVWYWx1ZShwYXJhbXM6IFdpZGVuVG9XaG9sZVZhbHVlUGFyYW1zKTogUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgeyBjYXB0aW9uRW5kT2Zmc2V0LCBsaW5rLCB2YWx1ZSB9ID0gcGFyYW1zO1xuICAvLyBOZXZlciBlbXB0eTogYSB2YWx1ZSB3aG9zZSBjYXB0aW9uIGlzIGVtcHR5LCBgW10odXJsKWAsIGlzIGEgbGluayBDb21tb25NYXJrIGFscmVhZHkgc3BhbnMgd2hvbGUuXG4gIGNvbnN0IGFsaWFzID0gdmFsdWUuc2xpY2UoMSwgY2FwdGlvbkVuZE9mZnNldCk7XG4gIHJldHVybiB7XG4gICAgLi4ubGluayxcbiAgICBhbGlhcyxcbiAgICBlbmRPZmZzZXQ6IHZhbHVlLmxlbmd0aCxcbiAgICByYXc6IHZhbHVlLFxuICAgIHN0YXJ0T2Zmc2V0OiAwLFxuICAgIHVuZXNjYXBlZEFsaWFzOiB1bmVzY2FwZUFsaWFzKGFsaWFzKVxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQSxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLGNBQWM7QUFDdkIsT0FBTyxpQkFBaUI7QUFDeEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxhQUFhO0FBTXRCLE1BQU0sd0JBQXdCO0FBSzlCLE1BQU0sc0NBQXNDO0FBRTVDLE1BQU0sbUJBQW1CO0FBYXpCLE1BQU0seUNBQXlDO0FBTS9DLE1BQU0sc0NBQXNDO0FBSzVDLE1BQU0sNENBQTRDLG9CQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsQ0FBQztBQUtsRyxNQUFNLG9DQUFvQztBQUsxQyxNQUFNLDhCQUE4QjtBQWlacEMsTUFBTSx1QkFBdUI7QUFBQSxFQUNWLDJCQUE0RCxDQUFDO0FBQUEsRUFDN0QscUNBQWlGLENBQUM7QUFBQSxFQUNsRiw2QkFBeUUsQ0FBQztBQUFBLEVBRXBGLE1BQU0sYUFBbUQ7QUFDOUQsU0FBSyxXQUFXLGFBQWEsRUFBRTtBQUMv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
|
|
@@ -241,6 +241,11 @@ export declare class ResourceLockComponent extends ComponentEx {
|
|
|
241
241
|
* Thrown by the vault-mutation blocker when a plugin tries to edit, delete, rename, move, or create a
|
|
242
242
|
* resource whose path is covered by a lock taken with
|
|
243
243
|
* {@link ResourceLockComponentLockForPathParams.shouldBlockMutations}.
|
|
244
|
+
*
|
|
245
|
+
* `instanceof ResourceLockedError` is structural: it matches any error named `ResourceLockedError` that carries a
|
|
246
|
+
* string `path`, whichever copy of this library threw it. The blocker belongs to the realm-wide lock manager in the
|
|
247
|
+
* shared-state bag, and that manager is built by whichever copy of the library touched it first, so the error a
|
|
248
|
+
* plugin catches is often another plugin's class.
|
|
244
249
|
*/
|
|
245
250
|
export declare class ResourceLockedError extends Error {
|
|
246
251
|
/**
|
|
@@ -253,6 +258,14 @@ export declare class ResourceLockedError extends Error {
|
|
|
253
258
|
* @param path - The vault path whose mutation was blocked.
|
|
254
259
|
*/
|
|
255
260
|
constructor(path: string);
|
|
261
|
+
/**
|
|
262
|
+
* Matches a {@link ResourceLockedError} thrown by any copy of this library, by its `name` and `path`.
|
|
263
|
+
* A subclass keeps the ordinary prototype check.
|
|
264
|
+
*
|
|
265
|
+
* @param instance - The value on the left of `instanceof`.
|
|
266
|
+
* @returns `true` if the value is a resource-locked error.
|
|
267
|
+
*/
|
|
268
|
+
static [Symbol.hasInstance](instance: unknown): boolean;
|
|
256
269
|
}
|
|
257
270
|
/**
|
|
258
271
|
* Checks whether the note at the given path is currently locked.
|