@dbx-tools/appkit-mastra 0.6.10 → 0.6.11

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.
@@ -1,19 +1,24 @@
1
1
  /**
2
2
  * Startup provisioning of remote Agent-Skill sources for a Mastra workspace.
3
3
  *
4
- * A {@link RemoteSkillSource} names WHERE a `SKILL.md` tree comes from - a
5
- * GitHub `owner/repo`, any git / GitLab URL, or a direct download URL - and
6
- * optional per-source policy. {@link provisionRemoteSkills} materializes every
7
- * source into a local `SKILL.md` tree at app boot and returns the directories
8
- * to hand Mastra as extra skill scan paths.
4
+ * A {@link RemoteSkillSource} names WHERE a `SKILL.md` tree comes from - the
5
+ * {@link AITOOLS_SOURCE} constant, a GitHub `owner/repo`, any git / GitLab URL,
6
+ * or a direct download URL - and optional per-source policy.
7
+ * {@link provisionRemoteSkills} materializes every source into a local
8
+ * `SKILL.md` tree at app boot and returns the directories to hand Mastra as
9
+ * extra skill scan paths.
9
10
  *
10
11
  * Resolution per source, in order:
11
12
  *
12
- * 1. the OPTIONAL `skills` npm CLI (peer dep): if installed, each source is
13
+ * 1. the {@link AITOOLS_SOURCE} constant (`"aitools"`): Databricks' own skill
14
+ * set, read straight from the public repo the `databricks aitools` CLI
15
+ * sources from. No CLI, no Databricks auth - which is what makes it usable
16
+ * inside a Databricks App container, where the CLI is not installed;
17
+ * 2. the OPTIONAL `skills` npm CLI (peer dep): if installed, each source is
13
18
  * copied into a staging dir with `skills add <source> --agent <dir> --copy`,
14
19
  * which understands every source format the ecosystem does (GitHub
15
20
  * shorthand, git URLs, archive/download URLs);
16
- * 2. otherwise a plain {@link fetch} of the source URL (built with
21
+ * 3. otherwise a plain {@link fetch} of the source URL (built with
17
22
  * {@link net.urlBuilder}), writing the downloaded `SKILL.md` to a staging
18
23
  * dir.
19
24
  *
@@ -34,13 +39,13 @@
34
39
  */
35
40
  import { mkdir, readdir, readFile, rm, stat, writeFile } from "node:fs/promises";
36
41
  import { createRequire } from "node:module";
37
- import { join, posix } from "node:path";
42
+ import { dirname, join, posix } from "node:path";
38
43
  import { appkit } from "@dbx-tools/appkit";
39
44
  import { exec } from "@dbx-tools/core";
40
45
  import { DatabricksFileSystem } from "@dbx-tools/databricks";
41
46
  import { localFS } from "@dbx-tools/fs";
42
47
  import { find } from "@dbx-tools/path";
43
- import { error, hash, log, net, string } from "@dbx-tools/shared-core";
48
+ import { error, hash, json, log, net, object, string } from "@dbx-tools/shared-core";
44
49
  const logger = log.logger("mastra/remote-skills");
45
50
  /** Shared Assistant skills tree in the Databricks workspace (default target). */
46
51
  const ASSISTANT_SHARED_SKILLS_PATH = "/Workspace/.assistant/skills";
@@ -56,29 +61,63 @@ const SKILLS_CLI_LAYOUT = [".agents", "skills"];
56
61
  const DEFAULT_MAX_DOWNLOAD_BYTES = 10 * 1024 * 1024;
57
62
  /** Stable temp directory holding one rebuilt skill tree per remote source. */
58
63
  const LOCAL_SKILLS_DIR = "mastra-local-skills";
64
+ /* ------------------------------ AI Tools ------------------------------ */
65
+ /**
66
+ * Source constant selecting Databricks' own AI Tools skill set.
67
+ *
68
+ * @example
69
+ * mastra({ remoteSkills: "aitools" });
70
+ */
71
+ export const AITOOLS_SOURCE = "aitools";
72
+ /**
73
+ * The PUBLIC repo `databricks aitools install` sources from. Reading it
74
+ * directly is what lets an app get the same skills the CLI installs without
75
+ * the CLI - which a Databricks App container does not ship.
76
+ */
77
+ const AITOOLS_REPO = "databricks/databricks-agent-skills";
78
+ /** Repo ref the skills are read from. Override per source with `ref`. */
79
+ const AITOOLS_REF = "main";
80
+ /** Skill files downloaded at once; the set is ~30 skills of a few files each. */
81
+ const AITOOLS_CONCURRENCY = 8;
59
82
  /* ------------------------------- helpers ------------------------------- */
60
83
  /** Normalize the `remoteSkills` option into a flat options bag. */
61
84
  export function normalizeRemoteSkillsOption(option) {
62
85
  if (option === undefined)
63
86
  return undefined;
64
- if (typeof option === "string")
65
- return { sources: [option] };
66
- if (Array.isArray(option))
67
- return option.length > 0 ? { sources: option } : undefined;
68
- if (isProvisionOptions(option)) {
69
- const sources = Array.isArray(option.sources) ? option.sources : [option.sources];
70
- return sources.length > 0 ? { ...option, sources } : undefined;
71
- }
72
- // A lone RemoteSkillSourceOptions object.
73
- return { sources: [option] };
87
+ const bag = isProvisionOptions(option) ? option : undefined;
88
+ const sources = toSourceList(bag ? bag.sources : option);
89
+ // An empty list is the same as no configuration at all.
90
+ if (!object.isOneOrMany(sources))
91
+ return undefined;
92
+ return { ...bag, sources };
74
93
  }
75
94
  /** A `sources`-bearing bag is the top-level options shape, not a single source. */
76
95
  function isProvisionOptions(value) {
77
- return "sources" in value;
96
+ return object.isRecord(value) && "sources" in value;
78
97
  }
79
- /** Coerce a source entry to its normalized {@link RemoteSkillSourceOptions}. */
98
+ /** One source or many, as a plain array. A source is never itself an array. */
99
+ function toSourceList(input) {
100
+ return Array.isArray(input) ? [...input] : [input];
101
+ }
102
+ /** Flatten a source entry - string, `URL`, `{ url }`, or options bag - to a {@link NormalizedSource}. */
80
103
  function toSourceOptions(source) {
81
- return typeof source === "string" ? { source } : source;
104
+ if (typeof source === "string")
105
+ return { source };
106
+ if (source instanceof URL)
107
+ return { source: source.toString() };
108
+ if ("source" in source)
109
+ return { ...source, source: toSourceString(source.source) };
110
+ return { source: source.url };
111
+ }
112
+ /** A {@link net.UrlLike} as the plain string the staging paths work with. */
113
+ function toSourceString(source) {
114
+ if (typeof source === "string")
115
+ return source;
116
+ return source instanceof URL ? source.toString() : source.url;
117
+ }
118
+ /** True when a source selects the built-in Databricks AI Tools skill set. */
119
+ function isAiToolsSource(source) {
120
+ return source.trim().toLowerCase() === AITOOLS_SOURCE;
82
121
  }
83
122
  /**
84
123
  * Materialize every configured remote skill source at app startup.
@@ -170,11 +209,59 @@ function resolveDatabricksBasePath(options, client) {
170
209
  async function stageSource(sourceOptions, stagingRoot, options) {
171
210
  const target = join(stagingRoot, `src-${hash.id()}`);
172
211
  await mkdir(target, { recursive: true });
212
+ // AI Tools resolves from a known repo layout, so it never needs the CLI.
213
+ if (isAiToolsSource(sourceOptions.source))
214
+ return stageAiTools(sourceOptions, target, options);
173
215
  const viaCli = await stageViaSkillsCli(sourceOptions, target);
174
216
  if (viaCli)
175
217
  return viaCli;
176
218
  return stageViaFetch(sourceOptions, target, options);
177
219
  }
220
+ /**
221
+ * Materialize the Databricks AI Tools skills into `target`.
222
+ *
223
+ * Reads the repo's own generated `manifest.json` (which names each skill's
224
+ * files and whether it lives under `skills/` or `experimental/`) and downloads
225
+ * them - the same thing `databricks aitools install` does, minus the CLI and
226
+ * minus any Databricks auth, since the repo is public.
227
+ */
228
+ async function stageAiTools(sourceOptions, target, options) {
229
+ const maxBytes = resolveMaxBytes(sourceOptions, options);
230
+ const ref = string.trimToNull(sourceOptions.ref) ?? AITOOLS_REF;
231
+ const manifest = json.parse((await download(aiToolsRawUrl(ref, "manifest.json"), maxBytes)).toString("utf8"), undefined);
232
+ const wanted = new Set(string.parseList(sourceOptions.skills));
233
+ const selected = Object.entries(manifest?.skills ?? {}).filter(([name, entry]) => wanted.size > 0
234
+ ? wanted.has(name)
235
+ : entry.repo_dir !== "experimental" || sourceOptions.experimental === true);
236
+ if (selected.length === 0) {
237
+ throw new Error(`no matching skills in ${AITOOLS_REPO}@${ref}`);
238
+ }
239
+ const files = selected.flatMap(([name, entry]) => (entry.files ?? []).map((file) => ({
240
+ url: aiToolsRawUrl(ref, `${entry.repo_dir ?? "skills"}/${name}/${file}`),
241
+ path: join(target, name, ...file.split("/")),
242
+ })));
243
+ await mapConcurrent(files, AITOOLS_CONCURRENCY, async (item) => {
244
+ const body = await download(item.url, maxBytes);
245
+ await mkdir(dirname(item.path), { recursive: true });
246
+ await writeFile(item.path, body);
247
+ });
248
+ logger.debug("aitools:staged", { ref, skills: selected.length, files: files.length });
249
+ return target;
250
+ }
251
+ /** Raw-content URL for a path in the AI Tools repo at `ref`. */
252
+ function aiToolsRawUrl(ref, path) {
253
+ return `https://raw.githubusercontent.com/${AITOOLS_REPO}/${ref}/${path}`;
254
+ }
255
+ /** Run `worker` over `items`, at most `limit` in flight. */
256
+ async function mapConcurrent(items, limit, worker) {
257
+ let cursor = 0;
258
+ const runners = Array.from({ length: Math.min(limit, items.length) }, async () => {
259
+ while (cursor < items.length) {
260
+ await worker(items[cursor++]);
261
+ }
262
+ });
263
+ await Promise.all(runners);
264
+ }
178
265
  /**
179
266
  * Copy a source into `target` with the `skills` CLI when it is installed.
180
267
  * Returns the dir holding the copied `SKILL.md` trees, or `undefined` when the
@@ -236,21 +323,29 @@ async function stageViaFetch(sourceOptions, target, options) {
236
323
  if (!url) {
237
324
  throw new Error(`source "${sourceOptions.source}" is not a URL and the optional "skills" package is not installed`);
238
325
  }
239
- const maxBytes = sourceOptions.maxDownloadBytes ?? options.maxDownloadBytes ?? DEFAULT_MAX_DOWNLOAD_BYTES;
240
- const response = await fetch(url.toString());
241
- if (!response.ok) {
242
- throw new Error(`download failed: ${response.status} ${response.statusText} (${url.toString()})`);
243
- }
244
- const buffer = Buffer.from(await response.arrayBuffer());
245
- if (buffer.byteLength > maxBytes) {
246
- throw new Error(`download exceeds ${maxBytes} bytes (${url.toString()})`);
247
- }
326
+ const buffer = await download(url.toString(), resolveMaxBytes(sourceOptions, options));
248
327
  const name = string.toSlug(deriveSkillName(url.toString())) || "remote-skill";
249
328
  const skillDir = join(target, name);
250
329
  await mkdir(skillDir, { recursive: true });
251
330
  await writeFile(join(skillDir, "SKILL.md"), buffer);
252
331
  return target;
253
332
  }
333
+ /** The effective download ceiling: per-source, then top-level, then the default. */
334
+ function resolveMaxBytes(sourceOptions, options) {
335
+ return sourceOptions.maxDownloadBytes ?? options.maxDownloadBytes ?? DEFAULT_MAX_DOWNLOAD_BYTES;
336
+ }
337
+ /** GET a URL, failing loudly on a non-2xx status or an oversized body. */
338
+ async function download(url, maxBytes) {
339
+ const response = await fetch(url);
340
+ if (!response.ok) {
341
+ throw new Error(`download failed: ${response.status} ${response.statusText} (${url})`);
342
+ }
343
+ const buffer = Buffer.from(await response.arrayBuffer());
344
+ if (buffer.byteLength > maxBytes) {
345
+ throw new Error(`download exceeds ${maxBytes} bytes (${url})`);
346
+ }
347
+ return buffer;
348
+ }
254
349
  /** Derive a skill directory name from a download URL's last path segment. */
255
350
  function deriveSkillName(urlString) {
256
351
  const url = net.urlBuilder(urlString);
@@ -327,4 +422,4 @@ async function pathExists(path) {
327
422
  return false;
328
423
  }
329
424
  }
330
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXhDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHdkUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRWxELGlGQUFpRjtBQUNqRixNQUFNLDRCQUE0QixHQUFHLDhCQUE4QixDQUFDO0FBRXBFLGlFQUFpRTtBQUNqRSxTQUFTLHVCQUF1QixDQUFDLFNBQWlCO0lBQ2hELE9BQU8sVUFBVSxTQUFTLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDO0FBQ3hELENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7QUFF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QUFtQztBQUNuQyxLQUFLLFVBQVUsVUFBVSxDQUFDLElBQVk7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhcnR1cCBwcm92aXNpb25pbmcgb2YgcmVtb3RlIEFnZW50LVNraWxsIHNvdXJjZXMgZm9yIGEgTWFzdHJhIHdvcmtzcGFjZS5cbiAqXG4gKiBBIHtAbGluayBSZW1vdGVTa2lsbFNvdXJjZX0gbmFtZXMgV0hFUkUgYSBgU0tJTEwubWRgIHRyZWUgY29tZXMgZnJvbSAtIGFcbiAqIEdpdEh1YiBgb3duZXIvcmVwb2AsIGFueSBnaXQgLyBHaXRMYWIgVVJMLCBvciBhIGRpcmVjdCBkb3dubG9hZCBVUkwgLSBhbmRcbiAqIG9wdGlvbmFsIHBlci1zb3VyY2UgcG9saWN5LiB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSBtYXRlcmlhbGl6ZXMgZXZlcnlcbiAqIHNvdXJjZSBpbnRvIGEgbG9jYWwgYFNLSUxMLm1kYCB0cmVlIGF0IGFwcCBib290IGFuZCByZXR1cm5zIHRoZSBkaXJlY3Rvcmllc1xuICogdG8gaGFuZCBNYXN0cmEgYXMgZXh0cmEgc2tpbGwgc2NhbiBwYXRocy5cbiAqXG4gKiBSZXNvbHV0aW9uIHBlciBzb3VyY2UsIGluIG9yZGVyOlxuICpcbiAqIDEuIHRoZSBPUFRJT05BTCBgc2tpbGxzYCBucG0gQ0xJIChwZWVyIGRlcCk6IGlmIGluc3RhbGxlZCwgZWFjaCBzb3VyY2UgaXNcbiAqICAgIGNvcGllZCBpbnRvIGEgc3RhZ2luZyBkaXIgd2l0aCBgc2tpbGxzIGFkZCA8c291cmNlPiAtLWFnZW50IDxkaXI+IC0tY29weWAsXG4gKiAgICB3aGljaCB1bmRlcnN0YW5kcyBldmVyeSBzb3VyY2UgZm9ybWF0IHRoZSBlY29zeXN0ZW0gZG9lcyAoR2l0SHViXG4gKiAgICBzaG9ydGhhbmQsIGdpdCBVUkxzLCBhcmNoaXZlL2Rvd25sb2FkIFVSTHMpO1xuICogMi4gb3RoZXJ3aXNlIGEgcGxhaW4ge0BsaW5rIGZldGNofSBvZiB0aGUgc291cmNlIFVSTCAoYnVpbHQgd2l0aFxuICogICAge0BsaW5rIG5ldC51cmxCdWlsZGVyfSksIHdyaXRpbmcgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB0byBhIHN0YWdpbmdcbiAqICAgIGRpci5cbiAqXG4gKiBBIHNvdXJjZSB0aGF0IHJlc29sdmVzIHRocm91Z2ggbmVpdGhlciBwYXRoIGZhaWxzIGFwcCBzdGFydHVwLCB1bmxlc3MgdGhlXG4gKiBzb3VyY2UgKG9yIHRoZSB0b3AtbGV2ZWwgY2FsbCkgc2V0cyBgZmFpbE9uRXJyb3I6IGZhbHNlYCwgaW4gd2hpY2ggY2FzZSBpdCBpc1xuICogbG9nZ2VkIGFuZCBza2lwcGVkIHNvIG9uZSBiYWQgc291cmNlIG5ldmVyIHRha2VzIHRoZSBhcHAgZG93bi5cbiAqXG4gKiBUaGUgZGVmYXVsdCBkZXN0aW5hdGlvbiBpcyB0aGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgQXNzaXN0YW50IHNraWxscyB0cmVlXG4gKiAoYC9Xb3Jrc3BhY2UvLmFzc2lzdGFudC9za2lsbHNgLCB0aGUgc2FtZSB0cmVlIGEgXCJzYXZlIHRoaXMgYXMgYSBza2lsbFwiXG4gKiBhY3Rpb24gd3JpdGVzIHRvKSwgc28gcHJvdmlzaW9uZWQgc2tpbGxzIHBlcnNpc3QgYWNyb3NzIHJlc3RhcnRzIGFuZCBhcmVcbiAqIGRpc2NvdmVyZWQgYnkgdGhlIGJ1aWx0LWluIEFzc2lzdGFudC1za2lsbHMgbW91bnQuIFBhc3MgYHVzZXJFbWFpbGAgKG9yIGFuXG4gKiBleHBsaWNpdCBgZGF0YWJyaWNrc0Jhc2VQYXRoYCkgdG8gdGFyZ2V0IGAvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2BcbiAqIGluc3RlYWQuIFdoZW4gbm8gRGF0YWJyaWNrcyBjbGllbnQgaXMgcmVzb2x2YWJsZSBhdCBzdGFydHVwLCB0aGUgdHJlZSBpc1xuICogd3JpdHRlbiB1bmRlciB7QGxpbmsgbG9jYWxGUy50bXBGU30gYW5kIHJldHVybmVkIGFzIGFuIGV4dHJhIGxvY2FsIHNraWxsIHBhdGhcbiAqIGZvciB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzdGF0LCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgam9pbiwgcG9zaXggfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsXCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50TGlrZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IERhdGFicmlja3NGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgbG9jYWxGUywgdHlwZSBMb2NhbEZpbGVTeXN0ZW0gfSBmcm9tIFwiQGRieC10b29scy9mc1wiO1xuaW1wb3J0IHsgZmluZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3BhdGhcIjtcbmltcG9ydCB7IGVycm9yLCBoYXNoLCBsb2csIG5ldCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRmlsZVN5c3RlbSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3JlbW90ZS1za2lsbHNcIik7XG5cbi8qKiBTaGFyZWQgQXNzaXN0YW50IHNraWxscyB0cmVlIGluIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSAoZGVmYXVsdCB0YXJnZXQpLiAqL1xuY29uc3QgQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSCA9IFwiL1dvcmtzcGFjZS8uYXNzaXN0YW50L3NraWxsc1wiO1xuXG4vKiogQXNzaXN0YW50IHNraWxscyBkaXJlY3RvcnkgZm9yIGEgc3BlY2lmaWMgRGF0YWJyaWNrcyB1c2VyLiAqL1xuZnVuY3Rpb24gdXNlckFzc2lzdGFudFNraWxsc1BhdGgodXNlckVtYWlsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYC9Vc2Vycy8ke3VzZXJFbWFpbC50cmltKCl9Ly5hc3Npc3RhbnQvc2tpbGxzYDtcbn1cblxuLyoqIG5wbSBhZ2VudCBpZCB0aGUgYHNraWxsc2AgQ0xJIGluc3RhbGxzIGEgYmFyZSBgU0tJTEwubWRgIHRyZWUgdW5kZXIuICovXG5jb25zdCBTS0lMTFNfQ0xJX0FHRU5UID0gXCJhZ2VudHNcIjtcblxuLyoqIFdoZXJlIHRoZSBgc2tpbGxzYCBDTEkgZHJvcHMgYSBwbGFpbiBgU0tJTEwubWRgIHRyZWUgdW5kZXIgYSB0YXJnZXQgZGlyLiAqL1xuY29uc3QgU0tJTExTX0NMSV9MQVlPVVQgPSBbXCIuYWdlbnRzXCIsIFwic2tpbGxzXCJdIGFzIGNvbnN0O1xuXG4vKiogQ2FwIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkIGJvZHksIG1hdGNoaW5nIHRoZSBgc2tpbGxzYCBDTEkgZGVmYXVsdC4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX0RPV05MT0FEX0JZVEVTID0gMTAgKiAxMDI0ICogMTAyNDtcblxuLyoqIFN0YWJsZSB0ZW1wIGRpcmVjdG9yeSBob2xkaW5nIG9uZSByZWJ1aWx0IHNraWxsIHRyZWUgcGVyIHJlbW90ZSBzb3VyY2UuICovXG5jb25zdCBMT0NBTF9TS0lMTFNfRElSID0gXCJtYXN0cmEtbG9jYWwtc2tpbGxzXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHJlbW90ZSBza2lsbCBzb3VyY2UgYW5kIGl0cyBwZXItc291cmNlIHBvbGljeS5cbiAqXG4gKiBgc291cmNlYCBpcyBhbnl0aGluZyB0aGUgYHNraWxsc2AgZWNvc3lzdGVtIHVuZGVyc3RhbmRzOiBhIEdpdEh1YlxuICogYG93bmVyL3JlcG9gIHNob3J0aGFuZCwgYSBmdWxsIEdpdEh1YiAvIEdpdExhYiAvIGdpdCBVUkwsIG9yIGEgZGlyZWN0XG4gKiBkb3dubG9hZCBVUkwgdG8gYSBgU0tJTEwubWRgIG9yIGFyY2hpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zIHtcbiAgLyoqIEdpdEh1YiBzaG9ydGhhbmQsIGdpdCAvIEdpdExhYiBVUkwsIG9yIGEgZGlyZWN0IGRvd25sb2FkIFVSTC4gKi9cbiAgc291cmNlOiBzdHJpbmc7XG4gIC8qKiBJbnN0YWxsIG9ubHkgdGhlc2Ugc2tpbGwgbmFtZXMgZnJvbSB0aGUgc291cmNlIChDTEkgcGF0aCBvbmx5KS4gKi9cbiAgc2tpbGxzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKiBPdmVycmlkZSB0aGUgYnl0ZSBjZWlsaW5nIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkIGZvciB0aGlzIHNvdXJjZS4gKi9cbiAgbWF4RG93bmxvYWRCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gYGZhbHNlYCwgYSBzb3VyY2UgdGhhdCBmYWlscyB0byByZXNvbHZlIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZCBpbnN0ZWFkXG4gICAqIG9mIGZhaWxpbmcgYXBwIHN0YXJ0dXAuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLmZhaWxPbkVycm9yfS5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJlbW90ZSBza2lsbCBzb3VyY2U6IGEgYmFyZSBzb3VyY2Ugc3RyaW5nIChHaXRIdWIgc2hvcnRoYW5kIC8gVVJMKSBvciBhXG4gKiB7QGxpbmsgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zfSB3aXRoIHBlci1zb3VyY2UgcG9saWN5LlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbFNvdXJjZSA9IHN0cmluZyB8IFJlbW90ZVNraWxsU291cmNlT3B0aW9ucztcblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlIGByZW1vdGVTa2lsbHNgIG9wdGlvbi4gQSBzaW5nbGUgc291cmNlLCBhIGxpc3QsIG9yIGFcbiAqIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zfSBiYWcgd2hlbiB0b3AtbGV2ZWwgcG9saWN5IGlzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVtb3RlU2tpbGxzT3B0aW9uID1cbiAgUmVtb3RlU2tpbGxTb3VyY2UgfCBSZW1vdGVTa2lsbFNvdXJjZVtdIHwgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucztcblxuLyoqIFRvcC1sZXZlbCByZW1vdGUtc2tpbGxzIHByb3Zpc2lvbmluZyBvcHRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHtcbiAgLyoqIFNvdXJjZXMgdG8gbWF0ZXJpYWxpemUgYXQgc3RhcnR1cC4gKi9cbiAgc291cmNlczogUmVtb3RlU2tpbGxTb3VyY2UgfCBSZW1vdGVTa2lsbFNvdXJjZVtdO1xuICAvKipcbiAgICogRmFpbCBhcHAgc3RhcnR1cCB3aGVuIGEgc291cmNlIGNhbid0IGJlIHJlc29sdmVkLiBEZWZhdWx0cyB0byBgdHJ1ZWAuIEFcbiAgICogcGVyLXNvdXJjZSBgZmFpbE9uRXJyb3JgIHdpbnMgb3ZlciB0aGlzLlxuICAgKi9cbiAgZmFpbE9uRXJyb3I/OiBib29sZWFuO1xuICAvKipcbiAgICogQWJzb2x1dGUgRGF0YWJyaWNrcyBwYXRoIHRoYXQgcm9vdHMgdGhlIGRlc3RpbmF0aW9uIEFzc2lzdGFudCBza2lsbHMgdHJlZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIE9CTyB1c2VyJ3MgYC9Vc2Vycy88ZW1haWw+Ly5hc3Npc3RhbnQvc2tpbGxzYC5cbiAgICovXG4gIGRhdGFicmlja3NCYXNlUGF0aD86IHN0cmluZztcbiAgLyoqIEF1dGgtc2NvcGVkIERhdGFicmlja3MgY2xpZW50LiBEZWZhdWx0cyB0byB0aGUgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xuICBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnRMaWtlO1xuICAvKiogVXNlciBlbWFpbCB1c2VkIHRvIGRlcml2ZSB0aGUgZGVmYXVsdCBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uLiAqL1xuICB1c2VyRW1haWw/OiBzdHJpbmc7XG4gIC8qKiBCeXRlIGNlaWxpbmcgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQuIERlZmF1bHRzIHRvIDEwIE1pQi4gKi9cbiAgbWF4RG93bmxvYWRCeXRlcz86IG51bWJlcjtcbn1cblxuLyoqIFdoYXQge0BsaW5rIHByb3Zpc2lvblJlbW90ZVNraWxsc30gcmVzb2x2ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzIHtcbiAgLyoqXG4gICAqIEV4dHJhIExPQ0FMIHNraWxsIHNjYW4gcGF0aHMgdG8gaGFuZCBNYXN0cmEgKGEgdGVtcCBkaXIgcGVyIHNvdXJjZSB0aGF0XG4gICAqIGNvdWxkbid0IGJlIHdyaXR0ZW4gdG8gRGF0YWJyaWNrcykuIEVtcHR5IHdoZW4gZXZlcnl0aGluZyBsYW5kZWQgaW4gdGhlXG4gICAqIERhdGFicmlja3MgQXNzaXN0YW50IHRyZWUsIHdoaWNoIHRoZSBidWlsdC1pbiBtb3VudCBhbHJlYWR5IHNjYW5zLlxuICAgKi9cbiAgbG9jYWxTa2lsbFBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIEFic29sdXRlIERhdGFicmlja3MgZGVzdGluYXRpb24gZWFjaCBzb3VyY2Ugd2FzIHdyaXR0ZW4gdG8sIGlmIGFueS4gKi9cbiAgZGF0YWJyaWNrc0Jhc2VQYXRoPzogc3RyaW5nO1xuICAvKiogTmFtZXMgb2YgZXZlcnkgc2tpbGwgZGlyZWN0b3J5IHRoYXQgd2FzIHByb3Zpc2lvbmVkLiAqL1xuICBza2lsbE5hbWVzOiBzdHJpbmdbXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIE5vcm1hbGl6ZSB0aGUgYHJlbW90ZVNraWxsc2Agb3B0aW9uIGludG8gYSBmbGF0IG9wdGlvbnMgYmFnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlbW90ZVNraWxsc09wdGlvbihcbiAgb3B0aW9uOiBSZW1vdGVTa2lsbHNPcHRpb24gfCB1bmRlZmluZWQsXG4pOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHsgc291cmNlczogW29wdGlvbl0gfTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uKSkgcmV0dXJuIG9wdGlvbi5sZW5ndGggPiAwID8geyBzb3VyY2VzOiBvcHRpb24gfSA6IHVuZGVmaW5lZDtcbiAgaWYgKGlzUHJvdmlzaW9uT3B0aW9ucyhvcHRpb24pKSB7XG4gICAgY29uc3Qgc291cmNlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9uLnNvdXJjZXMpID8gb3B0aW9uLnNvdXJjZXMgOiBbb3B0aW9uLnNvdXJjZXNdO1xuICAgIHJldHVybiBzb3VyY2VzLmxlbmd0aCA+IDAgPyB7IC4uLm9wdGlvbiwgc291cmNlcyB9IDogdW5kZWZpbmVkO1xuICB9XG4gIC8vIEEgbG9uZSBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMgb2JqZWN0LlxuICByZXR1cm4geyBzb3VyY2VzOiBbb3B0aW9uXSB9O1xufVxuXG4vKiogQSBgc291cmNlc2AtYmVhcmluZyBiYWcgaXMgdGhlIHRvcC1sZXZlbCBvcHRpb25zIHNoYXBlLCBub3QgYSBzaW5nbGUgc291cmNlLiAqL1xuZnVuY3Rpb24gaXNQcm92aXNpb25PcHRpb25zKFxuICB2YWx1ZTogUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zIHwgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IHZhbHVlIGlzIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICByZXR1cm4gXCJzb3VyY2VzXCIgaW4gdmFsdWU7XG59XG5cbi8qKiBDb2VyY2UgYSBzb3VyY2UgZW50cnkgdG8gaXRzIG5vcm1hbGl6ZWQge0BsaW5rIFJlbW90ZVNraWxsU291cmNlT3B0aW9uc30uICovXG5mdW5jdGlvbiB0b1NvdXJjZU9wdGlvbnMoc291cmNlOiBSZW1vdGVTa2lsbFNvdXJjZSk6IFJlbW90ZVNraWxsU291cmNlT3B0aW9ucyB7XG4gIHJldHVybiB0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiID8geyBzb3VyY2UgfSA6IHNvdXJjZTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZSBldmVyeSBjb25maWd1cmVkIHJlbW90ZSBza2lsbCBzb3VyY2UgYXQgYXBwIHN0YXJ0dXAuXG4gKlxuICogV3JpdGVzIGVhY2ggcmVzb2x2ZWQgYFNLSUxMLm1kYCB0cmVlIHRvIHRoZSBEYXRhYnJpY2tzIHVzZXIgQXNzaXN0YW50IHNraWxsc1xuICogZm9sZGVyIHdoZW4gYSB3cml0YWJsZSB3b3Jrc3BhY2UgaXMgYXZhaWxhYmxlLCBlbHNlIHVuZGVyXG4gKiB7QGxpbmsgbG9jYWxGUy50bXBGU30gcmV0dXJuZWQgaW4ge0BsaW5rIFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzLmxvY2FsU2tpbGxQYXRoc30uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aXNpb25SZW1vdGVTa2lsbHMoXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxQcm92aXNpb25lZFJlbW90ZVNraWxscz4ge1xuICBjb25zdCBvcHRpb25zID0gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKG9wdGlvbik7XG4gIGNvbnN0IGVtcHR5OiBQcm92aXNpb25lZFJlbW90ZVNraWxscyA9IHsgbG9jYWxTa2lsbFBhdGhzOiBbXSwgc2tpbGxOYW1lczogW10gfTtcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gZW1wdHk7XG5cbiAgY29uc3QgZmFpbERlZmF1bHQgPSBvcHRpb25zLmZhaWxPbkVycm9yICE9PSBmYWxzZTtcbiAgY29uc3QgY2xpZW50ID0gb3B0aW9ucy5jbGllbnQgPz8gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50O1xuICBjb25zdCBkYXRhYnJpY2tzQmFzZVBhdGggPSByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKG9wdGlvbnMsIGNsaWVudCk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gZGF0YWJyaWNrc0Jhc2VQYXRoXG4gICAgPyBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgICAgICBjbGllbnQ6IGNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQsXG4gICAgICAgIHJvb3Q6IGRhdGFicmlja3NCYXNlUGF0aCxcbiAgICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgICBjcmVhdGVSb290OiB0cnVlLFxuICAgICAgfSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBsb2NhbFNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNraWxsTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBzdGFnaW5nOiBMb2NhbEZpbGVTeXN0ZW0gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnNvdXJjZXMpID8gb3B0aW9ucy5zb3VyY2VzIDogW29wdGlvbnMuc291cmNlc107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBzb3VyY2VzKSB7XG4gICAgICBjb25zdCBzb3VyY2VPcHRpb25zID0gdG9Tb3VyY2VPcHRpb25zKGVudHJ5KTtcbiAgICAgIGNvbnN0IGZhaWxPbkVycm9yID0gc291cmNlT3B0aW9ucy5mYWlsT25FcnJvciA/PyBmYWlsRGVmYXVsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0YWdpbmcgPz89IGF3YWl0IGluaXRpYWxpemVkU2NyYXRjaChcIm1hc3RyYS1yZW1vdGUtc2tpbGxzXCIpO1xuICAgICAgICBjb25zdCBzdGFnZWREaXIgPSBhd2FpdCBzdGFnZVNvdXJjZShzb3VyY2VPcHRpb25zLCBzdGFnaW5nLnJvb3QsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFnZWQgPSBhd2FpdCBjb2xsZWN0U2tpbGxEaXJzKHN0YWdlZERpcik7XG4gICAgICAgIGlmIChzdGFnZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBTS0lMTC5tZCBmb3VuZCBmb3Igc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiAmJiBkYXRhYnJpY2tzQmFzZVBhdGgpIHtcbiAgICAgICAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uLCBzdGFnZWQpO1xuICAgICAgICAgIHNraWxsTmFtZXMucHVzaCguLi5zdGFnZWQubWFwKChkaXIpID0+IGRpci5uYW1lKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbG9jYWxEaXIgPSBhd2FpdCBwZXJzaXN0TG9jYWxseShzb3VyY2VPcHRpb25zLnNvdXJjZSwgc3RhZ2VkKTtcbiAgICAgICAgICBsb2NhbFNraWxsUGF0aHMucHVzaChsb2NhbERpcik7XG4gICAgICAgICAgc2tpbGxOYW1lcy5wdXNoKC4uLnN0YWdlZC5tYXAoKGRpcikgPT4gZGlyLm5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZGVidWcoXCJzb3VyY2U6cHJvdmlzaW9uZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZGVzdGluYXRpb246IGRhdGFicmlja3NCYXNlUGF0aCA/PyBcImxvY2FsLXRlbXBcIixcbiAgICAgICAgICBza2lsbHM6IHN0YWdlZC5tYXAoKGRpcikgPT4gZGlyLm5hbWUpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgZmFpbGVkIHRvIHByb3Zpc2lvbiByZW1vdGUgc2tpbGwgc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cIjogJHtlcnJvci5lcnJvck1lc3NhZ2UoZXJyKX1gLFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IudG9FcnJvcihlcnIpIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIud2FybihcInNvdXJjZTpza2lwcGVkXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChzdGFnaW5nKSB7XG4gICAgICBhd2FpdCBybShzdGFnaW5nLnJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGxvY2FsU2tpbGxQYXRocywgZGF0YWJyaWNrc0Jhc2VQYXRoLCBza2lsbE5hbWVzIH07XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBEYXRhYnJpY2tzIEFzc2lzdGFudCBza2lsbHMgZGVzdGluYXRpb24sIG9yIGB1bmRlZmluZWRgIGZvciBsb2NhbCB0ZW1wLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NCYXNlUGF0aChcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjbGllbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvcHRpb25zLmRhdGFicmlja3NCYXNlUGF0aCkgcmV0dXJuIG9wdGlvbnMuZGF0YWJyaWNrc0Jhc2VQYXRoLnRyaW0oKSB8fCB1bmRlZmluZWQ7XG4gIGNvbnN0IGVtYWlsID0gc3RyaW5nLnRyaW1Ub051bGwob3B0aW9ucy51c2VyRW1haWwpO1xuICAvLyBBIG5hbWVkIHVzZXIgdGFyZ2V0cyB0aGVpciBwZXJzb25hbCBBc3Npc3RhbnQgdHJlZSAodGhlIFwic2F2ZSBhIHNraWxsXCJcbiAgLy8gdGFyZ2V0KTsgb3RoZXJ3aXNlIHRoZSBzaGFyZWQgd29ya3NwYWNlIEFzc2lzdGFudCB0cmVlLCB3aGljaCB0aGUgYnVpbHQtaW5cbiAgLy8gQXNzaXN0YW50LXNraWxscyBtb3VudCBhbHJlYWR5IHNjYW5zLlxuICByZXR1cm4gZW1haWwgPyB1c2VyQXNzaXN0YW50U2tpbGxzUGF0aChlbWFpbCkgOiBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRIO1xufVxuXG4vKipcbiAqIFN0YWdlIG9uZSBzb3VyY2UgaW50byBhIGZyZXNoIGRpciB1bmRlciBgc3RhZ2luZ1Jvb3RgLCBwcmVmZXJyaW5nIHRoZSBvcHRpb25hbFxuICogYHNraWxsc2AgQ0xJIGFuZCBmYWxsaW5nIGJhY2sgdG8gYSBkaXJlY3QgZmV0Y2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlU291cmNlKFxuICBzb3VyY2VPcHRpb25zOiBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsXG4gIHN0YWdpbmdSb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB0YXJnZXQgPSBqb2luKHN0YWdpbmdSb290LCBgc3JjLSR7aGFzaC5pZCgpfWApO1xuICBhd2FpdCBta2Rpcih0YXJnZXQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCB2aWFDbGkgPSBhd2FpdCBzdGFnZVZpYVNraWxsc0NsaShzb3VyY2VPcHRpb25zLCB0YXJnZXQpO1xuICBpZiAodmlhQ2xpKSByZXR1cm4gdmlhQ2xpO1xuICByZXR1cm4gc3RhZ2VWaWFGZXRjaChzb3VyY2VPcHRpb25zLCB0YXJnZXQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIENvcHkgYSBzb3VyY2UgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBgc2tpbGxzYCBDTEkgd2hlbiBpdCBpcyBpbnN0YWxsZWQuXG4gKiBSZXR1cm5zIHRoZSBkaXIgaG9sZGluZyB0aGUgY29waWVkIGBTS0lMTC5tZGAgdHJlZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlXG4gKiBDTEkgaXMgYWJzZW50IChzbyB0aGUgY2FsbGVyIGNhbiBmYWxsIGJhY2sgdG8gYSBmZXRjaCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhU2tpbGxzQ2xpKFxuICBzb3VyY2VPcHRpb25zOiBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsXG4gIHRhcmdldDogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY2xpID0gYXdhaXQgcmVzb2x2ZVNraWxsc0NsaSgpO1xuICBpZiAoIWNsaSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBhcmdzID0gW1xuICAgIC4uLmNsaS5hcmdzLFxuICAgIFwiYWRkXCIsXG4gICAgc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgXCItLWFnZW50XCIsXG4gICAgU0tJTExTX0NMSV9BR0VOVCxcbiAgICBcIi0tY29weVwiLFxuICAgIFwiLXlcIixcbiAgXTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKSkge1xuICAgIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgc2tpbGwpO1xuICB9XG4gIGlmIChzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKS5sZW5ndGggPT09IDApIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgXCIqXCIpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMuc3Bhd24oY2xpLmNvbW1hbmQsIGFyZ3MsIHtcbiAgICBjd2Q6IHRhcmdldCxcbiAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgY2hlY2s6IGZhbHNlLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBza2lsbHMgQ0xJIGZhaWxlZCAoZXhpdCAke3Jlc3VsdC5leGl0Q29kZX0pOiAke3Jlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4odGFyZ2V0LCAuLi5TS0lMTFNfQ0xJX0xBWU9VVCk7XG59XG5cbi8qKlxuICogTG9jYXRlIHRoZSBvcHRpb25hbCBgc2tpbGxzYCBDTEkgYmluLCByZXNvbHZlZCBmcm9tIFRISVMgcGFja2FnZSdzIG1vZHVsZVxuICogZ3JhcGguIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGVlciBkZXAgaXNuJ3QgaW5zdGFsbGVkLCBzbyB0aGUgY2FsbGVyXG4gKiBmYWxscyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxzQ2xpKCk6IFByb21pc2U8eyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgIGNvbnN0IHBrZ1BhdGggPSByZXF1aXJlLnJlc29sdmUoXCJza2lsbHMvcGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IGJpbiA9IGpvaW4ocGtnUGF0aCwgXCIuLlwiLCBcImJpblwiLCBcImNsaS5tanNcIik7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoYmluKSkgcmV0dXJuIHsgY29tbWFuZDogcHJvY2Vzcy5leGVjUGF0aCwgYXJnczogW2Jpbl0gfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gcGVlciBkZXAgYWJzZW50IG9yIHVucmVzb2x2YWJsZSAtIGZldGNoIGZhbGxiYWNrIGhhbmRsZXMgaXRcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZldGNoIGEgc291cmNlIFVSTCBhbmQgd3JpdGUgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB1bmRlciBgdGFyZ2V0YC5cbiAqIFVzZWQgd2hlbiB0aGUgYHNraWxsc2AgQ0xJIGlzbid0IGluc3RhbGxlZDsgc3VwcG9ydHMgYSBkaXJlY3QgYFNLSUxMLm1kYCBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhRmV0Y2goXG4gIHNvdXJjZU9wdGlvbnM6IFJlbW90ZVNraWxsU291cmNlT3B0aW9ucyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB1cmwgPSBuZXQudXJsQnVpbGRlcihzb3VyY2VPcHRpb25zLnNvdXJjZSk7XG4gIGlmICghdXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCIgaXMgbm90IGEgVVJMIGFuZCB0aGUgb3B0aW9uYWwgXCJza2lsbHNcIiBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWRgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgbWF4Qnl0ZXMgPVxuICAgIHNvdXJjZU9wdGlvbnMubWF4RG93bmxvYWRCeXRlcyA/PyBvcHRpb25zLm1heERvd25sb2FkQnl0ZXMgPz8gREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVM7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLnRvU3RyaW5nKCkpO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGRvd25sb2FkIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7dXJsLnRvU3RyaW5nKCl9KWAsXG4gICAgKTtcbiAgfVxuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoID4gbWF4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGV4Y2VlZHMgJHttYXhCeXRlc30gYnl0ZXMgKCR7dXJsLnRvU3RyaW5nKCl9KWApO1xuICB9XG4gIGNvbnN0IG5hbWUgPSBzdHJpbmcudG9TbHVnKGRlcml2ZVNraWxsTmFtZSh1cmwudG9TdHJpbmcoKSkpIHx8IFwicmVtb3RlLXNraWxsXCI7XG4gIGNvbnN0IHNraWxsRGlyID0gam9pbih0YXJnZXQsIG5hbWUpO1xuICBhd2FpdCBta2Rpcihza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKHNraWxsRGlyLCBcIlNLSUxMLm1kXCIpLCBidWZmZXIpO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiogRGVyaXZlIGEgc2tpbGwgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGRvd25sb2FkIFVSTCdzIGxhc3QgcGF0aCBzZWdtZW50LiAqL1xuZnVuY3Rpb24gZGVyaXZlU2tpbGxOYW1lKHVybFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIodXJsU3RyaW5nKTtcbiAgY29uc3QgbGFzdCA9IHVybD8ucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA/PyBcIlwiO1xuICByZXR1cm4gbGFzdC5yZXBsYWNlKC9cXC4obWR8emlwfHRhcnx0Z3p8Z3opJC9pLCBcIlwiKTtcbn1cblxuLyoqIEEgc2tpbGwgZGlyZWN0b3J5IChob2xkaW5nIGEgYFNLSUxMLm1kYCkgc3RhZ2VkIG9uIGxvY2FsIGRpc2suICovXG5pbnRlcmZhY2UgU3RhZ2VkU2tpbGxEaXIge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFic29sdXRlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgc2tpbGwgZGlyZWN0b3J5IHVuZGVyIGByb290YDogYSBgcm9vdC9TS0lMTC5tZGAgKHJvb3QgSVMgdGhlXG4gKiBza2lsbCkgb3IgZWFjaCBpbW1lZGlhdGUgY2hpbGQgZGlyIHRoYXQgY29udGFpbnMgYSBgU0tJTEwubWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0U2tpbGxEaXJzKHJvb3Q6IHN0cmluZyk6IFByb21pc2U8U3RhZ2VkU2tpbGxEaXJbXT4ge1xuICBpZiAoIShhd2FpdCBwYXRoRXhpc3RzKHJvb3QpKSkgcmV0dXJuIFtdO1xuICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhqb2luKHJvb3QsIFwiU0tJTEwubWRcIikpKSB7XG4gICAgY29uc3QgbmFtZSA9IHBvc2l4LmJhc2VuYW1lKHJvb3Quc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgcmV0dXJuIFt7IG5hbWUsIGFic29sdXRlUGF0aDogcm9vdCB9XTtcbiAgfVxuICBjb25zdCBkaXJzOiBTdGFnZWRTa2lsbERpcltdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYXdhaXQgcmVhZGRpcihyb290LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRpciA9IGpvaW4ocm9vdCwgZW50cnkubmFtZSk7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihkaXIsIFwiU0tJTEwubWRcIikpKSB7XG4gICAgICBkaXJzLnB1c2goeyBuYW1lOiBlbnRyeS5uYW1lLCBhYnNvbHV0ZVBhdGg6IGRpciB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpcnM7XG59XG5cbi8qKlxuICogQ29weSBldmVyeSBzdGFnZWQgc2tpbGwgZGlyZWN0b3J5IGludG8ge0BsaW5rIGRlc3RpbmF0aW9ufSwgcHJlc2VydmluZyB0aGVcbiAqIGA8c2tpbGw+LzxyZWxhdGl2ZT5gIGxheW91dC4gVGhlIGRlc3RpbmF0aW9uIGlzIGp1c3QgYSB7QGxpbmsgRmlsZVN5c3RlbX0sXG4gKiBzbyB0aGUgRGF0YWJyaWNrcyBBc3Npc3RhbnQgdHJlZSBhbmQgdGhlIGxvY2FsIGZhbGxiYWNrIHNoYXJlIG9uZSBjb3BpZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlTa2lsbERpcnMoZGVzdGluYXRpb246IEZpbGVTeXN0ZW0sIGRpcnM6IFN0YWdlZFNraWxsRGlyW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZGVzdGluYXRpb24uaW5pdCgpO1xuICBmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XG4gICAgZm9yIChjb25zdCByZWxhdGl2ZSBvZiBmaW5kLmZpbmRGaWxlcyhcIioqLypcIiwgeyBjd2Q6IGRpci5hYnNvbHV0ZVBhdGgsIG5vZGlyOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCByZWFkRmlsZShqb2luKGRpci5hYnNvbHV0ZVBhdGgsIHJlbGF0aXZlKSk7XG4gICAgICBjb25zdCBza2lsbFBhdGggPSBwb3NpeC5qb2luKGRpci5uYW1lLCByZWxhdGl2ZS5zcGxpdCgvW1xcXFwvXS8pLmpvaW4oXCIvXCIpKTtcbiAgICAgIGF3YWl0IGRlc3RpbmF0aW9uLndyaXRlRmlsZShza2lsbFBhdGgsIGJ1ZmZlciwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29weSBzdGFnZWQgc2tpbGwgZGlycyBpbnRvIGEgU1RBQkxFIGxvY2FsIHRyZWUga2V5ZWQgYnkgdGhlIHNvdXJjZSwgYW5kXG4gKiByZXR1cm4gaXRzIHJvb3QgcGF0aC5cbiAqXG4gKiBBIGdpdmVuIHNvdXJjZSByZXNvbHZlcyB0byB0aGUgc2FtZSBjb250ZW50IG9uIGFsbW9zdCBldmVyeSBib290LCBzbyBlYWNoXG4gKiBvbmUgb3ducyBhIGRpcmVjdG9yeSBuYW1lZCBmb3IgaXRzIHtAbGluayBoYXNoLmZudkhhc2h9IHJhdGhlciB0aGFuIGxlYXZpbmdcbiAqIGEgZnJlc2ggc2NyYXRjaCBkaXIgYmVoaW5kIHBlciByZXN0YXJ0LiBLZXlpbmcgb24gdGhlIHNvdXJjZSAobm90IHRoZVxuICogY29udGVudCkgaXMgd2hhdCBrZWVwcyB0d28gZGlmZmVyZW50IHNvdXJjZXMgZnJvbSBvdmVyd3JpdGluZyBlYWNoIG90aGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0TG9jYWxseShzb3VyY2U6IHN0cmluZywgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHN0YWJsZSA9IGF3YWl0IGxvY2FsRlMucmVidWlsZEZTKGAke0xPQ0FMX1NLSUxMU19ESVJ9LyR7aGFzaC5mbnZIYXNoKHNvdXJjZSl9YCwgKHNjcmF0Y2gpID0+XG4gICAgY29weVNraWxsRGlycyhzY3JhdGNoLCBkaXJzKSxcbiAgKTtcbiAgcmV0dXJuIHN0YWJsZS5yb290O1xufVxuXG4vKipcbiAqIEEgc2NyYXRjaCBmaWxlc3lzdGVtIHdob3NlIHJvb3QgZXhpc3RzIG9uIGRpc2ssIGZvciB0aGUgcGF0aHMgdGhhdCBoYW5kIGFcbiAqIHJlYWwgZGlyZWN0b3J5IHRvIGBub2RlOmZzYCBvciBhIGNoaWxkIHByb2Nlc3MgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICogdGhlIHtAbGluayBGaWxlU3lzdGVtfSBBUEkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVkU2NyYXRjaChwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8TG9jYWxGaWxlU3lzdGVtPiB7XG4gIGNvbnN0IHNjcmF0Y2ggPSBsb2NhbEZTLnNjcmF0Y2hGUyhwcmVmaXgpO1xuICBhd2FpdCBzY3JhdGNoLmluaXQoKTtcbiAgcmV0dXJuIHNjcmF0Y2g7XG59XG5cbi8qKiBCZXN0LWVmZm9ydCBleGlzdGVuY2UgY2hlY2suICovXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IHN0YXQocGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUlyRixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFbEQsaUZBQWlGO0FBQ2pGLE1BQU0sNEJBQTRCLEdBQUcsOEJBQThCLENBQUM7QUFFcEUsaUVBQWlFO0FBQ2pFLFNBQVMsdUJBQXVCLENBQUMsU0FBaUI7SUFDaEQsT0FBTyxVQUFVLFNBQVMsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUM7QUFDeEQsQ0FBQztBQUVELDJFQUEyRTtB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QUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxLQUFLLFVBQVUsY0FBYyxDQUFDLE1BQWMsRUFBRSxJQUFzQjtJQUNsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNoRyxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUM3QixDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDOUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsbUNBQW1DO0FBQ25DLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBWTtJQUNwQyxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFydHVwIHByb3Zpc2lvbmluZyBvZiByZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBmb3IgYSBNYXN0cmEgd29ya3NwYWNlLlxuICpcbiAqIEEge0BsaW5rIFJlbW90ZVNraWxsU291cmNlfSBuYW1lcyBXSEVSRSBhIGBTS0lMTC5tZGAgdHJlZSBjb21lcyBmcm9tIC0gdGhlXG4gKiB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIEdpdEh1YiBgb3duZXIvcmVwb2AsIGFueSBnaXQgLyBHaXRMYWIgVVJMLFxuICogb3IgYSBkaXJlY3QgZG93bmxvYWQgVVJMIC0gYW5kIG9wdGlvbmFsIHBlci1zb3VyY2UgcG9saWN5LlxuICoge0BsaW5rIHByb3Zpc2lvblJlbW90ZVNraWxsc30gbWF0ZXJpYWxpemVzIGV2ZXJ5IHNvdXJjZSBpbnRvIGEgbG9jYWxcbiAqIGBTS0lMTC5tZGAgdHJlZSBhdCBhcHAgYm9vdCBhbmQgcmV0dXJucyB0aGUgZGlyZWN0b3JpZXMgdG8gaGFuZCBNYXN0cmEgYXNcbiAqIGV4dHJhIHNraWxsIHNjYW4gcGF0aHMuXG4gKlxuICogUmVzb2x1dGlvbiBwZXIgc291cmNlLCBpbiBvcmRlcjpcbiAqXG4gKiAxLiB0aGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBjb25zdGFudCAoYFwiYWl0b29sc1wiYCk6IERhdGFicmlja3MnIG93biBza2lsbFxuICogICAgc2V0LCByZWFkIHN0cmFpZ2h0IGZyb20gdGhlIHB1YmxpYyByZXBvIHRoZSBgZGF0YWJyaWNrcyBhaXRvb2xzYCBDTElcbiAqICAgIHNvdXJjZXMgZnJvbS4gTm8gQ0xJLCBubyBEYXRhYnJpY2tzIGF1dGggLSB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHVzYWJsZVxuICogICAgaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHAgY29udGFpbmVyLCB3aGVyZSB0aGUgQ0xJIGlzIG5vdCBpbnN0YWxsZWQ7XG4gKiAyLiB0aGUgT1BUSU9OQUwgYHNraWxsc2AgbnBtIENMSSAocGVlciBkZXApOiBpZiBpbnN0YWxsZWQsIGVhY2ggc291cmNlIGlzXG4gKiAgICBjb3BpZWQgaW50byBhIHN0YWdpbmcgZGlyIHdpdGggYHNraWxscyBhZGQgPHNvdXJjZT4gLS1hZ2VudCA8ZGlyPiAtLWNvcHlgLFxuICogICAgd2hpY2ggdW5kZXJzdGFuZHMgZXZlcnkgc291cmNlIGZvcm1hdCB0aGUgZWNvc3lzdGVtIGRvZXMgKEdpdEh1YlxuICogICAgc2hvcnRoYW5kLCBnaXQgVVJMcywgYXJjaGl2ZS9kb3dubG9hZCBVUkxzKTtcbiAqIDMuIG90aGVyd2lzZSBhIHBsYWluIHtAbGluayBmZXRjaH0gb2YgdGhlIHNvdXJjZSBVUkwgKGJ1aWx0IHdpdGhcbiAqICAgIHtAbGluayBuZXQudXJsQnVpbGRlcn0pLCB3cml0aW5nIHRoZSBkb3dubG9hZGVkIGBTS0lMTC5tZGAgdG8gYSBzdGFnaW5nXG4gKiAgICBkaXIuXG4gKlxuICogQSBzb3VyY2UgdGhhdCByZXNvbHZlcyB0aHJvdWdoIG5laXRoZXIgcGF0aCBmYWlscyBhcHAgc3RhcnR1cCwgdW5sZXNzIHRoZVxuICogc291cmNlIChvciB0aGUgdG9wLWxldmVsIGNhbGwpIHNldHMgYGZhaWxPbkVycm9yOiBmYWxzZWAsIGluIHdoaWNoIGNhc2UgaXQgaXNcbiAqIGxvZ2dlZCBhbmQgc2tpcHBlZCBzbyBvbmUgYmFkIHNvdXJjZSBuZXZlciB0YWtlcyB0aGUgYXBwIGRvd24uXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gaXMgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIEFzc2lzdGFudCBza2lsbHMgdHJlZVxuICogKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCwgdGhlIHNhbWUgdHJlZSBhIFwic2F2ZSB0aGlzIGFzIGEgc2tpbGxcIlxuICogYWN0aW9uIHdyaXRlcyB0byksIHNvIHByb3Zpc2lvbmVkIHNraWxscyBwZXJzaXN0IGFjcm9zcyByZXN0YXJ0cyBhbmQgYXJlXG4gKiBkaXNjb3ZlcmVkIGJ5IHRoZSBidWlsdC1pbiBBc3Npc3RhbnQtc2tpbGxzIG1vdW50LiBQYXNzIGB1c2VyRW1haWxgIChvciBhblxuICogZXhwbGljaXQgYGRhdGFicmlja3NCYXNlUGF0aGApIHRvIHRhcmdldCBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgXG4gKiBpbnN0ZWFkLiBXaGVuIG5vIERhdGFicmlja3MgY2xpZW50IGlzIHJlc29sdmFibGUgYXQgc3RhcnR1cCwgdGhlIHRyZWUgaXNcbiAqIHdyaXR0ZW4gdW5kZXIge0BsaW5rIGxvY2FsRlMudG1wRlN9IGFuZCByZXR1cm5lZCBhcyBhbiBleHRyYSBsb2NhbCBza2lsbCBwYXRoXG4gKiBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWtkaXIsIHJlYWRkaXIsIHJlYWRGaWxlLCBybSwgc3RhdCwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHBvc2l4IH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSB9IGZyb20gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmltcG9ydCB7IGxvY2FsRlMsIHR5cGUgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGZpbmQgfSBmcm9tIFwiQGRieC10b29scy9wYXRoXCI7XG5pbXBvcnQgeyBlcnJvciwgaGFzaCwganNvbiwgbG9nLCBuZXQsIG9iamVjdCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgT25lT3JNYW55IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRmlsZVN5c3RlbSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3JlbW90ZS1za2lsbHNcIik7XG5cbi8qKiBTaGFyZWQgQXNzaXN0YW50IHNraWxscyB0cmVlIGluIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSAoZGVmYXVsdCB0YXJnZXQpLiAqL1xuY29uc3QgQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSCA9IFwiL1dvcmtzcGFjZS8uYXNzaXN0YW50L3NraWxsc1wiO1xuXG4vKiogQXNzaXN0YW50IHNraWxscyBkaXJlY3RvcnkgZm9yIGEgc3BlY2lmaWMgRGF0YWJyaWNrcyB1c2VyLiAqL1xuZnVuY3Rpb24gdXNlckFzc2lzdGFudFNraWxsc1BhdGgodXNlckVtYWlsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYC9Vc2Vycy8ke3VzZXJFbWFpbC50cmltKCl9Ly5hc3Npc3RhbnQvc2tpbGxzYDtcbn1cblxuLyoqIG5wbSBhZ2VudCBpZCB0aGUgYHNraWxsc2AgQ0xJIGluc3RhbGxzIGEgYmFyZSBgU0tJTEwubWRgIHRyZWUgdW5kZXIuICovXG5jb25zdCBTS0lMTFNfQ0xJX0FHRU5UID0gXCJhZ2VudHNcIjtcblxuLyoqIFdoZXJlIHRoZSBgc2tpbGxzYCBDTEkgZHJvcHMgYSBwbGFpbiBgU0tJTEwubWRgIHRyZWUgdW5kZXIgYSB0YXJnZXQgZGlyLiAqL1xuY29uc3QgU0tJTExTX0NMSV9MQVlPVVQgPSBbXCIuYWdlbnRzXCIsIFwic2tpbGxzXCJdIGFzIGNvbnN0O1xuXG4vKiogQ2FwIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkIGJvZHksIG1hdGNoaW5nIHRoZSBgc2tpbGxzYCBDTEkgZGVmYXVsdC4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX0RPV05MT0FEX0JZVEVTID0gMTAgKiAxMDI0ICogMTAyNDtcblxuLyoqIFN0YWJsZSB0ZW1wIGRpcmVjdG9yeSBob2xkaW5nIG9uZSByZWJ1aWx0IHNraWxsIHRyZWUgcGVyIHJlbW90ZSBzb3VyY2UuICovXG5jb25zdCBMT0NBTF9TS0lMTFNfRElSID0gXCJtYXN0cmEtbG9jYWwtc2tpbGxzXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBSSBUb29scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTb3VyY2UgY29uc3RhbnQgc2VsZWN0aW5nIERhdGFicmlja3MnIG93biBBSSBUb29scyBza2lsbCBzZXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIG1hc3RyYSh7IHJlbW90ZVNraWxsczogXCJhaXRvb2xzXCIgfSk7XG4gKi9cbmV4cG9ydCBjb25zdCBBSVRPT0xTX1NPVVJDRSA9IFwiYWl0b29sc1wiO1xuXG4vKiogVGhlIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gbGl0ZXJhbCwgZm9yIGNhbGxlcnMgc3BlbGxpbmcgdGhlIHVuaW9uIG91dC4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbHNTb3VyY2UgPSB0eXBlb2YgQUlUT09MU19TT1VSQ0U7XG5cbi8qKlxuICogVGhlIFBVQkxJQyByZXBvIGBkYXRhYnJpY2tzIGFpdG9vbHMgaW5zdGFsbGAgc291cmNlcyBmcm9tLiBSZWFkaW5nIGl0XG4gKiBkaXJlY3RseSBpcyB3aGF0IGxldHMgYW4gYXBwIGdldCB0aGUgc2FtZSBza2lsbHMgdGhlIENMSSBpbnN0YWxscyB3aXRob3V0XG4gKiB0aGUgQ0xJIC0gd2hpY2ggYSBEYXRhYnJpY2tzIEFwcCBjb250YWluZXIgZG9lcyBub3Qgc2hpcC5cbiAqL1xuY29uc3QgQUlUT09MU19SRVBPID0gXCJkYXRhYnJpY2tzL2RhdGFicmlja3MtYWdlbnQtc2tpbGxzXCI7XG5cbi8qKiBSZXBvIHJlZiB0aGUgc2tpbGxzIGFyZSByZWFkIGZyb20uIE92ZXJyaWRlIHBlciBzb3VyY2Ugd2l0aCBgcmVmYC4gKi9cbmNvbnN0IEFJVE9PTFNfUkVGID0gXCJtYWluXCI7XG5cbi8qKiBTa2lsbCBmaWxlcyBkb3dubG9hZGVkIGF0IG9uY2U7IHRoZSBzZXQgaXMgfjMwIHNraWxscyBvZiBhIGZldyBmaWxlcyBlYWNoLiAqL1xuY29uc3QgQUlUT09MU19DT05DVVJSRU5DWSA9IDg7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIHRoZSByZXBvJ3MgZ2VuZXJhdGVkIGBtYW5pZmVzdC5qc29uYCB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBBaVRvb2xzTWFuaWZlc3Qge1xuICBza2lsbHM/OiBSZWNvcmQ8c3RyaW5nLCB7IGZpbGVzPzogc3RyaW5nW107IHJlcG9fZGlyPzogc3RyaW5nIH0+O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSByZW1vdGUgc2tpbGwgc291cmNlIGFuZCBpdHMgcGVyLXNvdXJjZSBwb2xpY3kuXG4gKlxuICogYHNvdXJjZWAgaXMge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBvciBhbnl0aGluZyB0aGUgYHNraWxsc2AgZWNvc3lzdGVtXG4gKiB1bmRlcnN0YW5kczogYSBHaXRIdWIgYG93bmVyL3JlcG9gIHNob3J0aGFuZCwgYSBmdWxsIEdpdEh1YiAvIEdpdExhYiAvIGdpdFxuICogVVJMLCBvciBhIGRpcmVjdCBkb3dubG9hZCBVUkwgdG8gYSBgU0tJTEwubWRgIG9yIGFyY2hpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zIHtcbiAgLyoqIGBcImFpdG9vbHNcImAsIGEgR2l0SHViIHNob3J0aGFuZCwgYSBnaXQgLyBHaXRMYWIgVVJMLCBvciBhIGRvd25sb2FkIFVSTC4gKi9cbiAgc291cmNlOiBuZXQuVXJsTGlrZSB8IEFpVG9vbHNTb3VyY2U7XG4gIC8qKiBJbnN0YWxsIG9ubHkgdGhlc2Ugc2tpbGwgbmFtZXMgZnJvbSB0aGUgc291cmNlLiAqL1xuICBza2lsbHM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqIEluY2x1ZGUgZXhwZXJpbWVudGFsIHNraWxscy4gYFwiYWl0b29sc1wiYCBvbmx5LiAqL1xuICBleHBlcmltZW50YWw/OiBib29sZWFuO1xuICAvKiogUGluIHRoZSByZXBvIHJlZiAodGFnIC8gYnJhbmNoIC8gc2hhKS4gYFwiYWl0b29sc1wiYCBvbmx5OyBkZWZhdWx0cyB0byBgbWFpbmAuICovXG4gIHJlZj86IHN0cmluZztcbiAgLyoqIE92ZXJyaWRlIHRoZSBieXRlIGNlaWxpbmcgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQgZm9yIHRoaXMgc291cmNlLiAqL1xuICBtYXhEb3dubG9hZEJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hlbiBgZmFsc2VgLCBhIHNvdXJjZSB0aGF0IGZhaWxzIHRvIHJlc29sdmUgaXMgbG9nZ2VkIGFuZCBza2lwcGVkIGluc3RlYWRcbiAgICogb2YgZmFpbGluZyBhcHAgc3RhcnR1cC4gT3ZlcnJpZGVzIHRoZSB0b3AtbGV2ZWwge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMuZmFpbE9uRXJyb3J9LlxuICAgKi9cbiAgZmFpbE9uRXJyb3I/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgcmVtb3RlIHNraWxsIHNvdXJjZTogdGhlIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gY29uc3RhbnQsIGEgVVJMLWxpa2VcbiAqIChzdHJpbmcgLyBgVVJMYCAvIGB7IHVybCB9YCksIG9yIGEge0BsaW5rIFJlbW90ZVNraWxsU291cmNlT3B0aW9uc30gYmFnIHdpdGhcbiAqIHBlci1zb3VyY2UgcG9saWN5LlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbFNvdXJjZSA9IG5ldC5VcmxMaWtlIHwgQWlUb29sc1NvdXJjZSB8IFJlbW90ZVNraWxsU291cmNlT3B0aW9ucztcblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlIGByZW1vdGVTa2lsbHNgIG9wdGlvbjogb25lIHNvdXJjZSwgYSBub24tZW1wdHkgbGlzdCBvZiB0aGVtLCBvclxuICogYSB7QGxpbmsgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9uc30gYmFnIHdoZW4gdG9wLWxldmVsIHBvbGljeSBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJlbW90ZVNraWxsc09wdGlvbiA9XG4gIFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPiB8IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnM7XG5cbi8qKiBBIHNvdXJjZSBlbnRyeSB3aXRoIGl0cyBgc291cmNlYCBmbGF0dGVuZWQgdG8gYSBwbGFpbiBzdHJpbmcuICovXG50eXBlIE5vcm1hbGl6ZWRTb3VyY2UgPSBPbWl0PFJlbW90ZVNraWxsU291cmNlT3B0aW9ucywgXCJzb3VyY2VcIj4gJiB7IHNvdXJjZTogc3RyaW5nIH07XG5cbi8qKiBUb3AtbGV2ZWwgcmVtb3RlLXNraWxscyBwcm92aXNpb25pbmcgb3B0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyB7XG4gIC8qKiBTb3VyY2VzIHRvIG1hdGVyaWFsaXplIGF0IHN0YXJ0dXAuICovXG4gIHNvdXJjZXM6IFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPjtcbiAgLyoqXG4gICAqIEZhaWwgYXBwIHN0YXJ0dXAgd2hlbiBhIHNvdXJjZSBjYW4ndCBiZSByZXNvbHZlZC4gRGVmYXVsdHMgdG8gYHRydWVgLiBBXG4gICAqIHBlci1zb3VyY2UgYGZhaWxPbkVycm9yYCB3aW5zIG92ZXIgdGhpcy5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFic29sdXRlIERhdGFicmlja3MgcGF0aCB0aGF0IHJvb3RzIHRoZSBkZXN0aW5hdGlvbiBBc3Npc3RhbnQgc2tpbGxzIHRyZWUuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBPQk8gdXNlcidzIGAvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2AuXG4gICAqL1xuICBkYXRhYnJpY2tzQmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiBBdXRoLXNjb3BlZCBEYXRhYnJpY2tzIGNsaWVudC4gRGVmYXVsdHMgdG8gdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbiAgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50TGlrZTtcbiAgLyoqIFVzZXIgZW1haWwgdXNlZCB0byBkZXJpdmUgdGhlIGRlZmF1bHQgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbi4gKi9cbiAgdXNlckVtYWlsPzogc3RyaW5nO1xuICAvKiogQnl0ZSBjZWlsaW5nIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkLiBEZWZhdWx0cyB0byAxMCBNaUIuICovXG4gIG1heERvd25sb2FkQnl0ZXM/OiBudW1iZXI7XG59XG5cbi8qKiBXaGF0IHtAbGluayBwcm92aXNpb25SZW1vdGVTa2lsbHN9IHJlc29sdmVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25lZFJlbW90ZVNraWxscyB7XG4gIC8qKlxuICAgKiBFeHRyYSBMT0NBTCBza2lsbCBzY2FuIHBhdGhzIHRvIGhhbmQgTWFzdHJhIChhIHRlbXAgZGlyIHBlciBzb3VyY2UgdGhhdFxuICAgKiBjb3VsZG4ndCBiZSB3cml0dGVuIHRvIERhdGFicmlja3MpLiBFbXB0eSB3aGVuIGV2ZXJ5dGhpbmcgbGFuZGVkIGluIHRoZVxuICAgKiBEYXRhYnJpY2tzIEFzc2lzdGFudCB0cmVlLCB3aGljaCB0aGUgYnVpbHQtaW4gbW91bnQgYWxyZWFkeSBzY2Fucy5cbiAgICovXG4gIGxvY2FsU2tpbGxQYXRoczogc3RyaW5nW107XG4gIC8qKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uIGVhY2ggc291cmNlIHdhcyB3cml0dGVuIHRvLCBpZiBhbnkuICovXG4gIGRhdGFicmlja3NCYXNlUGF0aD86IHN0cmluZztcbiAgLyoqIE5hbWVzIG9mIGV2ZXJ5IHNraWxsIGRpcmVjdG9yeSB0aGF0IHdhcyBwcm92aXNpb25lZC4gKi9cbiAgc2tpbGxOYW1lczogc3RyaW5nW107XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBOb3JtYWxpemUgdGhlIGByZW1vdGVTa2lsbHNgIG9wdGlvbiBpbnRvIGEgZmxhdCBvcHRpb25zIGJhZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZW1vdGVTa2lsbHNPcHRpb24oXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgYmFnID0gaXNQcm92aXNpb25PcHRpb25zKG9wdGlvbikgPyBvcHRpb24gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNvdXJjZXMgPSB0b1NvdXJjZUxpc3QoYmFnID8gYmFnLnNvdXJjZXMgOiAob3B0aW9uIGFzIFJlbW90ZVNraWxsU291cmNlKSk7XG4gIC8vIEFuIGVtcHR5IGxpc3QgaXMgdGhlIHNhbWUgYXMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwuXG4gIGlmICghb2JqZWN0LmlzT25lT3JNYW55KHNvdXJjZXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4geyAuLi5iYWcsIHNvdXJjZXMgfTtcbn1cblxuLyoqIEEgYHNvdXJjZXNgLWJlYXJpbmcgYmFnIGlzIHRoZSB0b3AtbGV2ZWwgb3B0aW9ucyBzaGFwZSwgbm90IGEgc2luZ2xlIHNvdXJjZS4gKi9cbmZ1bmN0aW9uIGlzUHJvdmlzaW9uT3B0aW9ucyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSAmJiBcInNvdXJjZXNcIiBpbiB2YWx1ZTtcbn1cblxuLyoqIE9uZSBzb3VyY2Ugb3IgbWFueSwgYXMgYSBwbGFpbiBhcnJheS4gQSBzb3VyY2UgaXMgbmV2ZXIgaXRzZWxmIGFuIGFycmF5LiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2VMaXN0KFxuICBpbnB1dDogUmVtb3RlU2tpbGxTb3VyY2UgfCBPbmVPck1hbnk8UmVtb3RlU2tpbGxTb3VyY2U+LFxuKTogUmVtb3RlU2tpbGxTb3VyY2VbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IFsuLi5pbnB1dF0gOiBbaW5wdXRdO1xufVxuXG4vKiogRmxhdHRlbiBhIHNvdXJjZSBlbnRyeSAtIHN0cmluZywgYFVSTGAsIGB7IHVybCB9YCwgb3Igb3B0aW9ucyBiYWcgLSB0byBhIHtAbGluayBOb3JtYWxpemVkU291cmNlfS4gKi9cbmZ1bmN0aW9uIHRvU291cmNlT3B0aW9ucyhzb3VyY2U6IFJlbW90ZVNraWxsU291cmNlKTogTm9ybWFsaXplZFNvdXJjZSB7XG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSByZXR1cm4geyBzb3VyY2UgfTtcbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFVSTCkgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UudG9TdHJpbmcoKSB9O1xuICBpZiAoXCJzb3VyY2VcIiBpbiBzb3VyY2UpIHJldHVybiB7IC4uLnNvdXJjZSwgc291cmNlOiB0b1NvdXJjZVN0cmluZyhzb3VyY2Uuc291cmNlKSB9O1xuICByZXR1cm4geyBzb3VyY2U6IHNvdXJjZS51cmwgfTtcbn1cblxuLyoqIEEge0BsaW5rIG5ldC5VcmxMaWtlfSBhcyB0aGUgcGxhaW4gc3RyaW5nIHRoZSBzdGFnaW5nIHBhdGhzIHdvcmsgd2l0aC4gKi9cbmZ1bmN0aW9uIHRvU291cmNlU3RyaW5nKHNvdXJjZTogbmV0LlVybExpa2UpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHNvdXJjZTtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIFVSTCA/IHNvdXJjZS50b1N0cmluZygpIDogc291cmNlLnVybDtcbn1cblxuLyoqIFRydWUgd2hlbiBhIHNvdXJjZSBzZWxlY3RzIHRoZSBidWlsdC1pbiBEYXRhYnJpY2tzIEFJIFRvb2xzIHNraWxsIHNldC4gKi9cbmZ1bmN0aW9uIGlzQWlUb29sc1NvdXJjZShzb3VyY2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc291cmNlLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBBSVRPT0xTX1NPVVJDRTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZSBldmVyeSBjb25maWd1cmVkIHJlbW90ZSBza2lsbCBzb3VyY2UgYXQgYXBwIHN0YXJ0dXAuXG4gKlxuICogV3JpdGVzIGVhY2ggcmVzb2x2ZWQgYFNLSUxMLm1kYCB0cmVlIHRvIHRoZSBEYXRhYnJpY2tzIHVzZXIgQXNzaXN0YW50IHNraWxsc1xuICogZm9sZGVyIHdoZW4gYSB3cml0YWJsZSB3b3Jrc3BhY2UgaXMgYXZhaWxhYmxlLCBlbHNlIHVuZGVyXG4gKiB7QGxpbmsgbG9jYWxGUy50bXBGU30gcmV0dXJuZWQgaW4ge0BsaW5rIFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzLmxvY2FsU2tpbGxQYXRoc30uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aXNpb25SZW1vdGVTa2lsbHMoXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxQcm92aXNpb25lZFJlbW90ZVNraWxscz4ge1xuICBjb25zdCBvcHRpb25zID0gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKG9wdGlvbik7XG4gIGNvbnN0IGVtcHR5OiBQcm92aXNpb25lZFJlbW90ZVNraWxscyA9IHsgbG9jYWxTa2lsbFBhdGhzOiBbXSwgc2tpbGxOYW1lczogW10gfTtcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gZW1wdHk7XG5cbiAgY29uc3QgZmFpbERlZmF1bHQgPSBvcHRpb25zLmZhaWxPbkVycm9yICE9PSBmYWxzZTtcbiAgY29uc3QgY2xpZW50ID0gb3B0aW9ucy5jbGllbnQgPz8gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50O1xuICBjb25zdCBkYXRhYnJpY2tzQmFzZVBhdGggPSByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKG9wdGlvbnMsIGNsaWVudCk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gZGF0YWJyaWNrc0Jhc2VQYXRoXG4gICAgPyBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgICAgICBjbGllbnQ6IGNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQsXG4gICAgICAgIHJvb3Q6IGRhdGFicmlja3NCYXNlUGF0aCxcbiAgICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgICBjcmVhdGVSb290OiB0cnVlLFxuICAgICAgfSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBsb2NhbFNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNraWxsTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBzdGFnaW5nOiBMb2NhbEZpbGVTeXN0ZW0gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnNvdXJjZXMpID8gb3B0aW9ucy5zb3VyY2VzIDogW29wdGlvbnMuc291cmNlc107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBzb3VyY2VzKSB7XG4gICAgICBjb25zdCBzb3VyY2VPcHRpb25zID0gdG9Tb3VyY2VPcHRpb25zKGVudHJ5KTtcbiAgICAgIGNvbnN0IGZhaWxPbkVycm9yID0gc291cmNlT3B0aW9ucy5mYWlsT25FcnJvciA/PyBmYWlsRGVmYXVsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0YWdpbmcgPz89IGF3YWl0IGluaXRpYWxpemVkU2NyYXRjaChcIm1hc3RyYS1yZW1vdGUtc2tpbGxzXCIpO1xuICAgICAgICBjb25zdCBzdGFnZWREaXIgPSBhd2FpdCBzdGFnZVNvdXJjZShzb3VyY2VPcHRpb25zLCBzdGFnaW5nLnJvb3QsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFnZWQgPSBhd2FpdCBjb2xsZWN0U2tpbGxEaXJzKHN0YWdlZERpcik7XG4gICAgICAgIGlmIChzdGFnZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBTS0lMTC5tZCBmb3VuZCBmb3Igc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiAmJiBkYXRhYnJpY2tzQmFzZVBhdGgpIHtcbiAgICAgICAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uLCBzdGFnZWQpO1xuICAgICAgICAgIHNraWxsTmFtZXMucHVzaCguLi5zdGFnZWQubWFwKChkaXIpID0+IGRpci5uYW1lKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbG9jYWxEaXIgPSBhd2FpdCBwZXJzaXN0TG9jYWxseShzb3VyY2VPcHRpb25zLnNvdXJjZSwgc3RhZ2VkKTtcbiAgICAgICAgICBsb2NhbFNraWxsUGF0aHMucHVzaChsb2NhbERpcik7XG4gICAgICAgICAgc2tpbGxOYW1lcy5wdXNoKC4uLnN0YWdlZC5tYXAoKGRpcikgPT4gZGlyLm5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZGVidWcoXCJzb3VyY2U6cHJvdmlzaW9uZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZGVzdGluYXRpb246IGRhdGFicmlja3NCYXNlUGF0aCA/PyBcImxvY2FsLXRlbXBcIixcbiAgICAgICAgICBza2lsbHM6IHN0YWdlZC5tYXAoKGRpcikgPT4gZGlyLm5hbWUpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgZmFpbGVkIHRvIHByb3Zpc2lvbiByZW1vdGUgc2tpbGwgc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cIjogJHtlcnJvci5lcnJvck1lc3NhZ2UoZXJyKX1gLFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IudG9FcnJvcihlcnIpIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIud2FybihcInNvdXJjZTpza2lwcGVkXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChzdGFnaW5nKSB7XG4gICAgICBhd2FpdCBybShzdGFnaW5nLnJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGxvY2FsU2tpbGxQYXRocywgZGF0YWJyaWNrc0Jhc2VQYXRoLCBza2lsbE5hbWVzIH07XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBEYXRhYnJpY2tzIEFzc2lzdGFudCBza2lsbHMgZGVzdGluYXRpb24sIG9yIGB1bmRlZmluZWRgIGZvciBsb2NhbCB0ZW1wLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NCYXNlUGF0aChcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjbGllbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvcHRpb25zLmRhdGFicmlja3NCYXNlUGF0aCkgcmV0dXJuIG9wdGlvbnMuZGF0YWJyaWNrc0Jhc2VQYXRoLnRyaW0oKSB8fCB1bmRlZmluZWQ7XG4gIGNvbnN0IGVtYWlsID0gc3RyaW5nLnRyaW1Ub051bGwob3B0aW9ucy51c2VyRW1haWwpO1xuICAvLyBBIG5hbWVkIHVzZXIgdGFyZ2V0cyB0aGVpciBwZXJzb25hbCBBc3Npc3RhbnQgdHJlZSAodGhlIFwic2F2ZSBhIHNraWxsXCJcbiAgLy8gdGFyZ2V0KTsgb3RoZXJ3aXNlIHRoZSBzaGFyZWQgd29ya3NwYWNlIEFzc2lzdGFudCB0cmVlLCB3aGljaCB0aGUgYnVpbHQtaW5cbiAgLy8gQXNzaXN0YW50LXNraWxscyBtb3VudCBhbHJlYWR5IHNjYW5zLlxuICByZXR1cm4gZW1haWwgPyB1c2VyQXNzaXN0YW50U2tpbGxzUGF0aChlbWFpbCkgOiBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRIO1xufVxuXG4vKipcbiAqIFN0YWdlIG9uZSBzb3VyY2UgaW50byBhIGZyZXNoIGRpciB1bmRlciBgc3RhZ2luZ1Jvb3RgLCBwcmVmZXJyaW5nIHRoZSBvcHRpb25hbFxuICogYHNraWxsc2AgQ0xJIGFuZCBmYWxsaW5nIGJhY2sgdG8gYSBkaXJlY3QgZmV0Y2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlU291cmNlKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICBzdGFnaW5nUm9vdDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdGFyZ2V0ID0gam9pbihzdGFnaW5nUm9vdCwgYHNyYy0ke2hhc2guaWQoKX1gKTtcbiAgYXdhaXQgbWtkaXIodGFyZ2V0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgLy8gQUkgVG9vbHMgcmVzb2x2ZXMgZnJvbSBhIGtub3duIHJlcG8gbGF5b3V0LCBzbyBpdCBuZXZlciBuZWVkcyB0aGUgQ0xJLlxuICBpZiAoaXNBaVRvb2xzU291cmNlKHNvdXJjZU9wdGlvbnMuc291cmNlKSkgcmV0dXJuIHN0YWdlQWlUb29scyhzb3VyY2VPcHRpb25zLCB0YXJnZXQsIG9wdGlvbnMpO1xuICBjb25zdCB2aWFDbGkgPSBhd2FpdCBzdGFnZVZpYVNraWxsc0NsaShzb3VyY2VPcHRpb25zLCB0YXJnZXQpO1xuICBpZiAodmlhQ2xpKSByZXR1cm4gdmlhQ2xpO1xuICByZXR1cm4gc3RhZ2VWaWFGZXRjaChzb3VyY2VPcHRpb25zLCB0YXJnZXQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIE1hdGVyaWFsaXplIHRoZSBEYXRhYnJpY2tzIEFJIFRvb2xzIHNraWxscyBpbnRvIGB0YXJnZXRgLlxuICpcbiAqIFJlYWRzIHRoZSByZXBvJ3Mgb3duIGdlbmVyYXRlZCBgbWFuaWZlc3QuanNvbmAgKHdoaWNoIG5hbWVzIGVhY2ggc2tpbGwnc1xuICogZmlsZXMgYW5kIHdoZXRoZXIgaXQgbGl2ZXMgdW5kZXIgYHNraWxscy9gIG9yIGBleHBlcmltZW50YWwvYCkgYW5kIGRvd25sb2Fkc1xuICogdGhlbSAtIHRoZSBzYW1lIHRoaW5nIGBkYXRhYnJpY2tzIGFpdG9vbHMgaW5zdGFsbGAgZG9lcywgbWludXMgdGhlIENMSSBhbmRcbiAqIG1pbnVzIGFueSBEYXRhYnJpY2tzIGF1dGgsIHNpbmNlIHRoZSByZXBvIGlzIHB1YmxpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VBaVRvb2xzKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG1heEJ5dGVzID0gcmVzb2x2ZU1heEJ5dGVzKHNvdXJjZU9wdGlvbnMsIG9wdGlvbnMpO1xuICBjb25zdCByZWYgPSBzdHJpbmcudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLnJlZikgPz8gQUlUT09MU19SRUY7XG4gIGNvbnN0IG1hbmlmZXN0ID0ganNvbi5wYXJzZShcbiAgICAoYXdhaXQgZG93bmxvYWQoYWlUb29sc1Jhd1VybChyZWYsIFwibWFuaWZlc3QuanNvblwiKSwgbWF4Qnl0ZXMpKS50b1N0cmluZyhcInV0ZjhcIiksXG4gICAgdW5kZWZpbmVkLFxuICApIGFzIEFpVG9vbHNNYW5pZmVzdCB8IHVuZGVmaW5lZDtcblxuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0KHN0cmluZy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpKTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBPYmplY3QuZW50cmllcyhtYW5pZmVzdD8uc2tpbGxzID8/IHt9KS5maWx0ZXIoKFtuYW1lLCBlbnRyeV0pID0+XG4gICAgd2FudGVkLnNpemUgPiAwXG4gICAgICA/IHdhbnRlZC5oYXMobmFtZSlcbiAgICAgIDogZW50cnkucmVwb19kaXIgIT09IFwiZXhwZXJpbWVudGFsXCIgfHwgc291cmNlT3B0aW9ucy5leHBlcmltZW50YWwgPT09IHRydWUsXG4gICk7XG4gIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIG1hdGNoaW5nIHNraWxscyBpbiAke0FJVE9PTFNfUkVQT31AJHtyZWZ9YCk7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IHNlbGVjdGVkLmZsYXRNYXAoKFtuYW1lLCBlbnRyeV0pID0+XG4gICAgKGVudHJ5LmZpbGVzID8/IFtdKS5tYXAoKGZpbGUpID0+ICh7XG4gICAgICB1cmw6IGFpVG9vbHNSYXdVcmwocmVmLCBgJHtlbnRyeS5yZXBvX2RpciA/PyBcInNraWxsc1wifS8ke25hbWV9LyR7ZmlsZX1gKSxcbiAgICAgIHBhdGg6IGpvaW4odGFyZ2V0LCBuYW1lLCAuLi5maWxlLnNwbGl0KFwiL1wiKSksXG4gICAgfSkpLFxuICApO1xuICBhd2FpdCBtYXBDb25jdXJyZW50KGZpbGVzLCBBSVRPT0xTX0NPTkNVUlJFTkNZLCBhc3luYyAoaXRlbSkgPT4ge1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBkb3dubG9hZChpdGVtLnVybCwgbWF4Qnl0ZXMpO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoaXRlbS5wYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGl0ZW0ucGF0aCwgYm9keSk7XG4gIH0pO1xuXG4gIGxvZ2dlci5kZWJ1ZyhcImFpdG9vbHM6c3RhZ2VkXCIsIHsgcmVmLCBza2lsbHM6IHNlbGVjdGVkLmxlbmd0aCwgZmlsZXM6IGZpbGVzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqIFJhdy1jb250ZW50IFVSTCBmb3IgYSBwYXRoIGluIHRoZSBBSSBUb29scyByZXBvIGF0IGByZWZgLiAqL1xuZnVuY3Rpb24gYWlUb29sc1Jhd1VybChyZWY6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHtBSVRPT0xTX1JFUE99LyR7cmVmfS8ke3BhdGh9YDtcbn1cblxuLyoqIFJ1biBgd29ya2VyYCBvdmVyIGBpdGVtc2AsIGF0IG1vc3QgYGxpbWl0YCBpbiBmbGlnaHQuICovXG5hc3luYyBmdW5jdGlvbiBtYXBDb25jdXJyZW50PFQ+KFxuICBpdGVtczogcmVhZG9ubHkgVFtdLFxuICBsaW1pdDogbnVtYmVyLFxuICB3b3JrZXI6IChpdGVtOiBUKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBjdXJzb3IgPSAwO1xuICBjb25zdCBydW5uZXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5taW4obGltaXQsIGl0ZW1zLmxlbmd0aCkgfSwgYXN5bmMgKCkgPT4ge1xuICAgIHdoaWxlIChjdXJzb3IgPCBpdGVtcy5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IHdvcmtlcihpdGVtc1tjdXJzb3IrK10hKTtcbiAgICB9XG4gIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChydW5uZXJzKTtcbn1cblxuLyoqXG4gKiBDb3B5IGEgc291cmNlIGludG8gYHRhcmdldGAgd2l0aCB0aGUgYHNraWxsc2AgQ0xJIHdoZW4gaXQgaXMgaW5zdGFsbGVkLlxuICogUmV0dXJucyB0aGUgZGlyIGhvbGRpbmcgdGhlIGNvcGllZCBgU0tJTEwubWRgIHRyZWVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICogQ0xJIGlzIGFic2VudCAoc28gdGhlIGNhbGxlciBjYW4gZmFsbCBiYWNrIHRvIGEgZmV0Y2gpLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVZpYVNraWxsc0NsaShcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjbGkgPSBhd2FpdCByZXNvbHZlU2tpbGxzQ2xpKCk7XG4gIGlmICghY2xpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgLi4uY2xpLmFyZ3MsXG4gICAgXCJhZGRcIixcbiAgICBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICBcIi0tYWdlbnRcIixcbiAgICBTS0lMTFNfQ0xJX0FHRU5ULFxuICAgIFwiLS1jb3B5XCIsXG4gICAgXCIteVwiLFxuICBdO1xuICBmb3IgKGNvbnN0IHNraWxsIG9mIHN0cmluZy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpKSB7XG4gICAgYXJncy5wdXNoKFwiLS1za2lsbFwiLCBza2lsbCk7XG4gIH1cbiAgaWYgKHN0cmluZy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpLmxlbmd0aCA9PT0gMCkgYXJncy5wdXNoKFwiLS1za2lsbFwiLCBcIipcIik7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYy5zcGF3bihjbGkuY29tbWFuZCwgYXJncywge1xuICAgIGN3ZDogdGFyZ2V0LFxuICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICBjaGVjazogZmFsc2UsXG4gIH0pO1xuICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHNraWxscyBDTEkgZmFpbGVkIChleGl0ICR7cmVzdWx0LmV4aXRDb2RlfSk6ICR7cmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0fWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gam9pbih0YXJnZXQsIC4uLlNLSUxMU19DTElfTEFZT1VUKTtcbn1cblxuLyoqXG4gKiBMb2NhdGUgdGhlIG9wdGlvbmFsIGBza2lsbHNgIENMSSBiaW4sIHJlc29sdmVkIGZyb20gVEhJUyBwYWNrYWdlJ3MgbW9kdWxlXG4gKiBncmFwaC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwZWVyIGRlcCBpc24ndCBpbnN0YWxsZWQsIHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gYSBkaXJlY3QgZmV0Y2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbHNDbGkoKTogUHJvbWlzZTx7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgcGtnUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShcInNraWxscy9wYWNrYWdlLmpzb25cIik7XG4gICAgY29uc3QgYmluID0gam9pbihwa2dQYXRoLCBcIi4uXCIsIFwiYmluXCIsIFwiY2xpLm1qc1wiKTtcbiAgICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhiaW4pKSByZXR1cm4geyBjb21tYW5kOiBwcm9jZXNzLmV4ZWNQYXRoLCBhcmdzOiBbYmluXSB9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBwZWVyIGRlcCBhYnNlbnQgb3IgdW5yZXNvbHZhYmxlIC0gZmV0Y2ggZmFsbGJhY2sgaGFuZGxlcyBpdFxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmV0Y2ggYSBzb3VyY2UgVVJMIGFuZCB3cml0ZSB0aGUgZG93bmxvYWRlZCBgU0tJTEwubWRgIHVuZGVyIGB0YXJnZXRgLlxuICogVXNlZCB3aGVuIHRoZSBgc2tpbGxzYCBDTEkgaXNuJ3QgaW5zdGFsbGVkOyBzdXBwb3J0cyBhIGRpcmVjdCBgU0tJTEwubWRgIFVSTC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VWaWFGZXRjaChcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB1cmwgPSBuZXQudXJsQnVpbGRlcihzb3VyY2VPcHRpb25zLnNvdXJjZSk7XG4gIGlmICghdXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCIgaXMgbm90IGEgVVJMIGFuZCB0aGUgb3B0aW9uYWwgXCJza2lsbHNcIiBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWRgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gYXdhaXQgZG93bmxvYWQodXJsLnRvU3RyaW5nKCksIHJlc29sdmVNYXhCeXRlcyhzb3VyY2VPcHRpb25zLCBvcHRpb25zKSk7XG4gIGNvbnN0IG5hbWUgPSBzdHJpbmcudG9TbHVnKGRlcml2ZVNraWxsTmFtZSh1cmwudG9TdHJpbmcoKSkpIHx8IFwicmVtb3RlLXNraWxsXCI7XG4gIGNvbnN0IHNraWxsRGlyID0gam9pbih0YXJnZXQsIG5hbWUpO1xuICBhd2FpdCBta2Rpcihza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKHNraWxsRGlyLCBcIlNLSUxMLm1kXCIpLCBidWZmZXIpO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiogVGhlIGVmZmVjdGl2ZSBkb3dubG9hZCBjZWlsaW5nOiBwZXItc291cmNlLCB0aGVuIHRvcC1sZXZlbCwgdGhlbiB0aGUgZGVmYXVsdC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNYXhCeXRlcyhcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IG51bWJlciB7XG4gIHJldHVybiBzb3VyY2VPcHRpb25zLm1heERvd25sb2FkQnl0ZXMgPz8gb3B0aW9ucy5tYXhEb3dubG9hZEJ5dGVzID8/IERFRkFVTFRfTUFYX0RPV05MT0FEX0JZVEVTO1xufVxuXG4vKiogR0VUIGEgVVJMLCBmYWlsaW5nIGxvdWRseSBvbiBhIG5vbi0yeHggc3RhdHVzIG9yIGFuIG92ZXJzaXplZCBib2R5LiAqL1xuYXN5bmMgZnVuY3Rpb24gZG93bmxvYWQodXJsOiBzdHJpbmcsIG1heEJ5dGVzOiBudW1iZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7dXJsfSlgKTtcbiAgfVxuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoID4gbWF4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGV4Y2VlZHMgJHttYXhCeXRlc30gYnl0ZXMgKCR7dXJsfSlgKTtcbiAgfVxuICByZXR1cm4gYnVmZmVyO1xufVxuXG4vKiogRGVyaXZlIGEgc2tpbGwgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGRvd25sb2FkIFVSTCdzIGxhc3QgcGF0aCBzZWdtZW50LiAqL1xuZnVuY3Rpb24gZGVyaXZlU2tpbGxOYW1lKHVybFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIodXJsU3RyaW5nKTtcbiAgY29uc3QgbGFzdCA9IHVybD8ucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA/PyBcIlwiO1xuICByZXR1cm4gbGFzdC5yZXBsYWNlKC9cXC4obWR8emlwfHRhcnx0Z3p8Z3opJC9pLCBcIlwiKTtcbn1cblxuLyoqIEEgc2tpbGwgZGlyZWN0b3J5IChob2xkaW5nIGEgYFNLSUxMLm1kYCkgc3RhZ2VkIG9uIGxvY2FsIGRpc2suICovXG5pbnRlcmZhY2UgU3RhZ2VkU2tpbGxEaXIge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFic29sdXRlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgc2tpbGwgZGlyZWN0b3J5IHVuZGVyIGByb290YDogYSBgcm9vdC9TS0lMTC5tZGAgKHJvb3QgSVMgdGhlXG4gKiBza2lsbCkgb3IgZWFjaCBpbW1lZGlhdGUgY2hpbGQgZGlyIHRoYXQgY29udGFpbnMgYSBgU0tJTEwubWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0U2tpbGxEaXJzKHJvb3Q6IHN0cmluZyk6IFByb21pc2U8U3RhZ2VkU2tpbGxEaXJbXT4ge1xuICBpZiAoIShhd2FpdCBwYXRoRXhpc3RzKHJvb3QpKSkgcmV0dXJuIFtdO1xuICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhqb2luKHJvb3QsIFwiU0tJTEwubWRcIikpKSB7XG4gICAgY29uc3QgbmFtZSA9IHBvc2l4LmJhc2VuYW1lKHJvb3Quc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgcmV0dXJuIFt7IG5hbWUsIGFic29sdXRlUGF0aDogcm9vdCB9XTtcbiAgfVxuICBjb25zdCBkaXJzOiBTdGFnZWRTa2lsbERpcltdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYXdhaXQgcmVhZGRpcihyb290LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRpciA9IGpvaW4ocm9vdCwgZW50cnkubmFtZSk7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihkaXIsIFwiU0tJTEwubWRcIikpKSB7XG4gICAgICBkaXJzLnB1c2goeyBuYW1lOiBlbnRyeS5uYW1lLCBhYnNvbHV0ZVBhdGg6IGRpciB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpcnM7XG59XG5cbi8qKlxuICogQ29weSBldmVyeSBzdGFnZWQgc2tpbGwgZGlyZWN0b3J5IGludG8ge0BsaW5rIGRlc3RpbmF0aW9ufSwgcHJlc2VydmluZyB0aGVcbiAqIGA8c2tpbGw+LzxyZWxhdGl2ZT5gIGxheW91dC4gVGhlIGRlc3RpbmF0aW9uIGlzIGp1c3QgYSB7QGxpbmsgRmlsZVN5c3RlbX0sXG4gKiBzbyB0aGUgRGF0YWJyaWNrcyBBc3Npc3RhbnQgdHJlZSBhbmQgdGhlIGxvY2FsIGZhbGxiYWNrIHNoYXJlIG9uZSBjb3BpZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlTa2lsbERpcnMoZGVzdGluYXRpb246IEZpbGVTeXN0ZW0sIGRpcnM6IFN0YWdlZFNraWxsRGlyW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZGVzdGluYXRpb24uaW5pdCgpO1xuICBmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XG4gICAgZm9yIChjb25zdCByZWxhdGl2ZSBvZiBmaW5kLmZpbmRGaWxlcyhcIioqLypcIiwgeyBjd2Q6IGRpci5hYnNvbHV0ZVBhdGgsIG5vZGlyOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCByZWFkRmlsZShqb2luKGRpci5hYnNvbHV0ZVBhdGgsIHJlbGF0aXZlKSk7XG4gICAgICBjb25zdCBza2lsbFBhdGggPSBwb3NpeC5qb2luKGRpci5uYW1lLCByZWxhdGl2ZS5zcGxpdCgvW1xcXFwvXS8pLmpvaW4oXCIvXCIpKTtcbiAgICAgIGF3YWl0IGRlc3RpbmF0aW9uLndyaXRlRmlsZShza2lsbFBhdGgsIGJ1ZmZlciwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29weSBzdGFnZWQgc2tpbGwgZGlycyBpbnRvIGEgU1RBQkxFIGxvY2FsIHRyZWUga2V5ZWQgYnkgdGhlIHNvdXJjZSwgYW5kXG4gKiByZXR1cm4gaXRzIHJvb3QgcGF0aC5cbiAqXG4gKiBBIGdpdmVuIHNvdXJjZSByZXNvbHZlcyB0byB0aGUgc2FtZSBjb250ZW50IG9uIGFsbW9zdCBldmVyeSBib290LCBzbyBlYWNoXG4gKiBvbmUgb3ducyBhIGRpcmVjdG9yeSBuYW1lZCBmb3IgaXRzIHtAbGluayBoYXNoLmZudkhhc2h9IHJhdGhlciB0aGFuIGxlYXZpbmdcbiAqIGEgZnJlc2ggc2NyYXRjaCBkaXIgYmVoaW5kIHBlciByZXN0YXJ0LiBLZXlpbmcgb24gdGhlIHNvdXJjZSAobm90IHRoZVxuICogY29udGVudCkgaXMgd2hhdCBrZWVwcyB0d28gZGlmZmVyZW50IHNvdXJjZXMgZnJvbSBvdmVyd3JpdGluZyBlYWNoIG90aGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0TG9jYWxseShzb3VyY2U6IHN0cmluZywgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHN0YWJsZSA9IGF3YWl0IGxvY2FsRlMucmVidWlsZEZTKGAke0xPQ0FMX1NLSUxMU19ESVJ9LyR7aGFzaC5mbnZIYXNoKHNvdXJjZSl9YCwgKHNjcmF0Y2gpID0+XG4gICAgY29weVNraWxsRGlycyhzY3JhdGNoLCBkaXJzKSxcbiAgKTtcbiAgcmV0dXJuIHN0YWJsZS5yb290O1xufVxuXG4vKipcbiAqIEEgc2NyYXRjaCBmaWxlc3lzdGVtIHdob3NlIHJvb3QgZXhpc3RzIG9uIGRpc2ssIGZvciB0aGUgcGF0aHMgdGhhdCBoYW5kIGFcbiAqIHJlYWwgZGlyZWN0b3J5IHRvIGBub2RlOmZzYCBvciBhIGNoaWxkIHByb2Nlc3MgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICogdGhlIHtAbGluayBGaWxlU3lzdGVtfSBBUEkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVkU2NyYXRjaChwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8TG9jYWxGaWxlU3lzdGVtPiB7XG4gIGNvbnN0IHNjcmF0Y2ggPSBsb2NhbEZTLnNjcmF0Y2hGUyhwcmVmaXgpO1xuICBhd2FpdCBzY3JhdGNoLmluaXQoKTtcbiAgcmV0dXJuIHNjcmF0Y2g7XG59XG5cbi8qKiBCZXN0LWVmZm9ydCBleGlzdGVuY2UgY2hlY2suICovXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IHN0YXQocGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"root":["../src/agents.ts","../src/chart.ts","../src/config.ts","../src/databricks-aitools.ts","../src/defaults.ts","../src/filesystems.ts","../src/genie.ts","../src/history.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/observability.ts","../src/pagination.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/statement.ts","../src/storage-schema.ts","../src/summarize.ts","../src/threads.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/agents.ts","../src/chart.ts","../src/config.ts","../src/defaults.ts","../src/filesystems.ts","../src/genie.ts","../src/history.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/observability.ts","../src/pagination.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/statement.ts","../src/storage-schema.ts","../src/summarize.ts","../src/threads.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -32,25 +32,25 @@
32
32
  "express": "^5.1.0",
33
33
  "pg": "^8.22.0",
34
34
  "zod": "4.3.6",
35
- "@dbx-tools/appkit": "0.6.10",
36
- "@dbx-tools/databricks": "0.6.10",
37
- "@dbx-tools/genie": "0.6.10",
38
- "@dbx-tools/fs": "0.6.10",
39
- "@dbx-tools/model": "0.6.10",
40
- "@dbx-tools/core": "0.6.10",
41
- "@dbx-tools/path": "0.6.10",
42
- "@dbx-tools/shared-core": "0.6.10",
43
- "@dbx-tools/shared-fs": "0.6.10",
44
- "@dbx-tools/shared-model": "0.6.10",
45
- "@dbx-tools/shared-genie": "0.6.10",
46
- "@dbx-tools/shared-mastra": "0.6.10"
35
+ "@dbx-tools/core": "0.6.11",
36
+ "@dbx-tools/fs": "0.6.11",
37
+ "@dbx-tools/databricks": "0.6.11",
38
+ "@dbx-tools/model": "0.6.11",
39
+ "@dbx-tools/genie": "0.6.11",
40
+ "@dbx-tools/shared-core": "0.6.11",
41
+ "@dbx-tools/appkit": "0.6.11",
42
+ "@dbx-tools/path": "0.6.11",
43
+ "@dbx-tools/shared-genie": "0.6.11",
44
+ "@dbx-tools/shared-mastra": "0.6.11",
45
+ "@dbx-tools/shared-fs": "0.6.11",
46
+ "@dbx-tools/shared-model": "0.6.11"
47
47
  },
48
48
  "main": "./lib/index.js",
49
49
  "license": "UNLICENSED",
50
50
  "publishConfig": {
51
51
  "access": "public"
52
52
  },
53
- "version": "0.6.10",
53
+ "version": "0.6.11",
54
54
  "types": "./lib/index.d.ts",
55
55
  "type": "module",
56
56
  "exports": {
package/src/config.ts CHANGED
@@ -23,7 +23,6 @@ import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY } from "@mastra/core/reque
23
23
  import type { PgVectorConfig, PostgresStoreConfig } from "@mastra/pg";
24
24
 
25
25
  import type { MastraAgentDefinition, MastraTools } from "./agents.ts";
26
- import type { DatabricksAIToolsOption } from "./databricks-aitools.ts";
27
26
  import type { GenieSpacesConfig } from "./genie.ts";
28
27
  import type { MastraIdentityMode } from "./identity.ts";
29
28
  import type { RemoteSkillsOption } from "./remote-skills.ts";
@@ -581,27 +580,6 @@ export interface MastraPluginConfig extends BasePluginConfig {
581
580
  * ```
582
581
  */
583
582
  remoteSkills?: RemoteSkillsOption;
584
-
585
- /**
586
- * Fold Databricks AI Tools skills (`databricks aitools`) into every
587
- * default-workspace agent as extra local skill scan paths.
588
- *
589
- * `false` (default) off; `"auto"` runs the `databricks` CLI when it's
590
- * installed and logs-and-continues when it isn't (never fails startup);
591
- * `true` requires the CLI and fails startup otherwise. Pass an options bag to
592
- * select `skills`, include `experimental` skills, or set an explicit `path`.
593
- *
594
- * Runs `databricks aitools install --path <dir>` to materialize a resolved,
595
- * agent-agnostic set (`<name>/SKILL.md` trees) into a temp dir the agents
596
- * then scan. The CLI is the source of truth.
597
- *
598
- * @example
599
- * ```ts
600
- * mastra({ databricksAITools: "auto" });
601
- * mastra({ databricksAITools: { skills: ["databricks-core", "databricks-jobs"] } });
602
- * ```
603
- */
604
- databricksAITools?: DatabricksAIToolsOption;
605
583
  }
606
584
 
607
585
  /**
@@ -623,12 +601,7 @@ export const MASTRA_CONFIG_SCHEMA: ConfigSchema = {
623
601
  remoteSkills: {
624
602
  type: ["string", "array", "object"],
625
603
  description:
626
- "Remote Agent-Skill sources provisioned at startup (GitHub owner/repo, git/GitLab URL, or a direct SKILL.md/archive URL). Prefers the optional `skills` npm CLI, else a direct fetch; fails startup on error unless failOnError:false. Written to the Databricks user Assistant skills folder, or a local temp dir when no workspace is writable.",
627
- },
628
- databricksAITools: {
629
- type: ["boolean", "string", "object"],
630
- description:
631
- 'Fold Databricks AI Tools skills (databricks aitools) into agents as extra local skill paths. false (default) off; "auto" runs the databricks CLI when installed and logs-and-continues otherwise; true requires the CLI and fails startup otherwise. An object selects skills, experimental, or path.',
604
+ 'Remote Agent-Skill sources provisioned at startup: "aitools" for Databricks\' own skill set (read from the public databricks/databricks-agent-skills repo, no CLI needed), a GitHub owner/repo, a git/GitLab URL, or a direct SKILL.md/archive URL. Non-aitools sources prefer the optional `skills` npm CLI, else a direct fetch; fails startup on error unless failOnError:false. Written to the Databricks user Assistant skills folder, or a local temp dir when no workspace is writable.',
632
605
  },
633
606
  storage: {
634
607
  type: ["boolean", "object"],
package/src/plugin.ts CHANGED
@@ -77,7 +77,6 @@ import type { Pool } from "pg";
77
77
  import { buildAgents, FALLBACK_AGENT_ID, type BuiltAgents } from "./agents.ts";
78
78
  import { fetchChart } from "./chart.ts";
79
79
  import { attributedUserId, MASTRA_CONFIG_SCHEMA, type MastraPluginConfig } from "./config.ts";
80
- import { provisionDatabricksAITools } from "./databricks-aitools.ts";
81
80
  import {
82
81
  chartFetchDefaults,
83
82
  feedbackWriteDefaults,
@@ -1012,24 +1011,12 @@ export class MastraPlugin extends Plugin<MastraPluginConfig> {
1012
1011
  });
1013
1012
  }
1014
1013
 
1015
- // Fold Databricks AI Tools skills (`databricks aitools`) in as extra local
1016
- // skill scan paths: reuse the CLI's installed tree when present, else shell
1017
- // out to the CLI to materialize a curated set.
1018
- const aiTools = await provisionDatabricksAITools(this.config.databricksAITools);
1019
- if (aiTools.localSkillPaths.length > 0) {
1020
- this.logger.info("databricks ai tools provisioned", {
1021
- source: aiTools.source,
1022
- localSkillPaths: aiTools.localSkillPaths.length,
1023
- });
1024
- }
1025
- const extraSkillPaths = [...provisioned.localSkillPaths, ...aiTools.localSkillPaths];
1026
-
1027
1014
  this.built = await buildAgents({
1028
1015
  config: this.config,
1029
1016
  context: this.context,
1030
1017
  memoryBuilder,
1031
1018
  log: this.logger,
1032
- extraSkillPaths,
1019
+ extraSkillPaths: provisioned.localSkillPaths,
1033
1020
  });
1034
1021
 
1035
1022
  // `mastra.server.apiRoutes` is only honored by Mastra's standalone