@dbx-tools/appkit-mastra 0.9.93 → 0.9.95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -40
- package/index.ts +4 -10
- package/lib/index.d.ts +4 -10
- package/lib/index.js +4 -8
- package/lib/src/agents.js +11 -23
- package/lib/src/chat.js +20 -1
- package/lib/src/config.d.ts +9 -11
- package/lib/src/config.js +7 -7
- package/lib/src/filesystems.d.ts +20 -2
- package/lib/src/filesystems.js +29 -2
- package/lib/src/plugin.js +3 -2
- package/lib/src/remote-skills.d.ts +3 -4
- package/lib/src/remote-skills.js +5 -14
- package/lib/src/server.d.ts +7 -0
- package/lib/src/server.js +33 -2
- package/lib/src/skill-paths.d.ts +8 -4
- package/lib/src/skill-paths.js +12 -6
- package/lib/src/workspaces.d.ts +39 -33
- package/lib/src/workspaces.js +208 -168
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -30
- package/src/agents.ts +11 -24
- package/src/chat.ts +24 -0
- package/src/config.ts +15 -17
- package/src/filesystems.ts +43 -0
- package/src/plugin.ts +2 -0
- package/src/remote-skills.ts +5 -15
- package/src/server.ts +33 -1
- package/src/skill-paths.ts +13 -5
- package/src/workspaces.ts +285 -210
- package/lib/src/skill-cache.d.ts +0 -94
- package/lib/src/skill-cache.js +0 -251
- package/lib/src/skill-search.d.ts +0 -30
- package/lib/src/skill-search.js +0 -171
- package/src/skill-cache.ts +0 -347
- package/src/skill-search.ts +0 -203
package/lib/src/workspaces.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Mastra workspace factory for Databricks Apps.
|
|
3
3
|
*
|
|
4
|
-
* Builds a
|
|
5
|
-
*
|
|
4
|
+
* Builds a {@link Workspace} with Databricks Sandbox command execution, an
|
|
5
|
+
* isolated `/tmp` scratch mount, and a {@link CompositeFilesystem} over the
|
|
6
|
+
* named skill folders
|
|
6
7
|
* resolved for that request. A skill folder maps a name to a location plus its
|
|
7
8
|
* readable / writable policy: a Databricks path mounted through the OBO client
|
|
8
9
|
* on {@link MASTRA_USER_KEY}, or any {@link WorkspaceFilesystem} a consuming
|
|
@@ -12,56 +13,59 @@
|
|
|
12
13
|
* filesystems and skill scan roots on top.
|
|
13
14
|
*
|
|
14
15
|
* Databricks mounts use `@dbx-tools/databricks` {@link DatabricksFileSystem}
|
|
15
|
-
* wrapped by {@link filesystems};
|
|
16
|
-
* {@link scratchFilesystem}.
|
|
16
|
+
* wrapped by {@link filesystems}; inaccessible roots are skipped independently.
|
|
17
17
|
*
|
|
18
18
|
* @module
|
|
19
19
|
*/
|
|
20
20
|
import { createHash } from "node:crypto";
|
|
21
|
-
import { ConfigurationError, createWorkspaceClient } from "@databricks/appkit";
|
|
21
|
+
import { ConfigurationError, createWorkspaceClient, getExecutionContext } from "@databricks/appkit";
|
|
22
|
+
import { pluginRegistry } from "@dbx-tools/appkit";
|
|
23
|
+
import { filesCache as filesCachePlugin, } from "@dbx-tools/appkit/files-cache";
|
|
22
24
|
import { DatabricksFileSystem, workspaceClient } from "@dbx-tools/databricks";
|
|
23
25
|
import { LocalFileSystem } from "@dbx-tools/fs";
|
|
24
26
|
import { errorUtils, log, object, stringUtils, token } from "@dbx-tools/shared-core";
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
+
import { fs as sharedFS, posixPath } from "@dbx-tools/shared-fs";
|
|
28
|
+
import { WORKSPACE_TOOLS, Workspace, } from "@mastra/core/workspace";
|
|
27
29
|
import { MASTRA_SCOPES_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_KEY, resolveUserKey, } from "./config.js";
|
|
28
|
-
import { filesystems, scratchFilesystem } from "./filesystems.js";
|
|
30
|
+
import { filesystems, MountedCompositeFilesystem, scratchFilesystem, } from "./filesystems.js";
|
|
29
31
|
import { MontySandbox } from "./monty-sandbox.js";
|
|
30
32
|
import { DatabricksSandbox } from "./sandbox.js";
|
|
31
|
-
import {
|
|
32
|
-
import { ASSISTANT_SHARED_SKILLS_PATH, userAssistantSkillsPath } from "./skill-paths.js";
|
|
33
|
+
import { ORGANIZATION_ASSISTANT_PATH, personalWorkspacePath } from "./skill-paths.js";
|
|
33
34
|
/* ------------------------------ constants ------------------------------ */
|
|
34
35
|
/** OAuth scopes that gate Databricks workspace file mounts. */
|
|
35
36
|
const WORKSPACE_FILE_SCOPES = ["workspace", "workspace.workspace", "all-apis"];
|
|
37
|
+
const SCRATCH_MOUNT = "/tmp";
|
|
36
38
|
const logger = log.logger("mastra/workspaces");
|
|
37
|
-
const MAX_SCOPED_WORKSPACE_FILESYSTEMS = 16;
|
|
38
|
-
const scopedWorkspaceFilesystems = new LRUCache({
|
|
39
|
-
max: MAX_SCOPED_WORKSPACE_FILESYSTEMS,
|
|
40
|
-
});
|
|
41
|
-
const workspaceCatalogueResolvers = new WeakMap();
|
|
42
39
|
/* ------------------------------- defaults ------------------------------- */
|
|
43
40
|
/**
|
|
44
41
|
* The skill folders every workspace starts with.
|
|
45
42
|
*
|
|
46
|
-
* - `
|
|
47
|
-
*
|
|
48
|
-
* - `
|
|
49
|
-
*
|
|
50
|
-
* user email.
|
|
43
|
+
* - `organization-skills` - `/Workspace/.assistant` with `skills`; write
|
|
44
|
+
* attempts require approval and remain subject to Databricks permissions.
|
|
45
|
+
* - `personal-skills` - the requesting user's `/Workspace/Users/<email>` root
|
|
46
|
+
* with `.assistant/skills`, writable and skipped without an email.
|
|
51
47
|
*/
|
|
52
48
|
export const DEFAULT_SKILL_FOLDERS = {
|
|
53
|
-
"
|
|
54
|
-
|
|
49
|
+
"organization-skills": {
|
|
50
|
+
description: "Organization skills shared with everyone in this Databricks workspace.",
|
|
51
|
+
displayName: "Organization Skills",
|
|
52
|
+
path: ORGANIZATION_ASSISTANT_PATH,
|
|
55
53
|
readable: true,
|
|
56
|
-
|
|
54
|
+
skills: ["skills"],
|
|
55
|
+
writable: true,
|
|
56
|
+
createRoot: false,
|
|
57
57
|
},
|
|
58
|
-
"
|
|
58
|
+
"personal-skills": {
|
|
59
|
+
description: "Your Databricks workspace home directory for personal files and skills.",
|
|
60
|
+
displayName: "Home",
|
|
59
61
|
path: ({ requestContext }) => {
|
|
60
62
|
const email = resolveScopedEmail(requestContext);
|
|
61
|
-
return email ?
|
|
63
|
+
return email ? personalWorkspacePath(email) : undefined;
|
|
62
64
|
},
|
|
63
65
|
readable: true,
|
|
66
|
+
skills: [".assistant/skills"],
|
|
64
67
|
writable: true,
|
|
68
|
+
createRoot: false,
|
|
65
69
|
},
|
|
66
70
|
};
|
|
67
71
|
/**
|
|
@@ -76,8 +80,11 @@ export const DEFAULT_SKILL_FOLDERS = {
|
|
|
76
80
|
* ```ts
|
|
77
81
|
* createWorkspace({
|
|
78
82
|
* skillFolders: {
|
|
79
|
-
* "
|
|
80
|
-
*
|
|
83
|
+
* "organization-skills": {
|
|
84
|
+
* path: "/Workspace/Shared/.assistant",
|
|
85
|
+
* skills: ["skills"],
|
|
86
|
+
* },
|
|
87
|
+
* "personal-skills": false,
|
|
81
88
|
* runbooks: { path: "/Workspace/Shared/runbooks/skills", writable: true },
|
|
82
89
|
* volume: { filesystem: myVolumeFilesystem },
|
|
83
90
|
* },
|
|
@@ -101,12 +108,24 @@ export function createWorkspace(options = {}) {
|
|
|
101
108
|
const skillFolders = resolveSkillFolders(options);
|
|
102
109
|
const folderNames = Object.keys(skillFolders);
|
|
103
110
|
const extraSkillPaths = options.extraSkillPaths ?? [];
|
|
104
|
-
const
|
|
111
|
+
const filesCache = pluginRegistry.instance(options.pluginContext, filesCachePlugin)?.exports();
|
|
112
|
+
const retainFilesystemSource = filesCache !== undefined &&
|
|
113
|
+
(options.mounts?.length ?? 0) === 0 &&
|
|
114
|
+
Object.values(skillFolders).every((folder) => typeof folder.filesystem !== "function" &&
|
|
115
|
+
!(typeof folder.path === "function" && folder.mount !== undefined));
|
|
116
|
+
const resolvers = buildMountResolvers(skillFolders, [...(options.mounts ?? []), ...localSkillMountResolvers(extraSkillPaths)], filesCache);
|
|
105
117
|
const resolveContribution = contributionResolver(resolvers);
|
|
106
|
-
const
|
|
118
|
+
const resolveFilesystem = (context) => resolveWorkspaceFilesystem(resolveContribution, context, retainFilesystemSource ? filesCache : undefined);
|
|
119
|
+
const skills = options.skills ??
|
|
120
|
+
(async ({ requestContext }) => {
|
|
121
|
+
const context = { requestContext };
|
|
122
|
+
const contribution = await resolveContribution(context);
|
|
123
|
+
return resolveDistinctSkillPaths(await resolveFilesystem(context), contribution.skillPaths ?? []);
|
|
124
|
+
});
|
|
107
125
|
const checkSkillFileMtime = options.checkSkillFileMtime ?? false;
|
|
108
126
|
const bm25 = options.bm25 !== false;
|
|
109
127
|
const sandbox = resolveWorkspaceSandbox(options.sandbox, id, name);
|
|
128
|
+
const tools = workspaceTools(options.tools);
|
|
110
129
|
logger.debug("workspace:create", {
|
|
111
130
|
id,
|
|
112
131
|
name,
|
|
@@ -115,7 +134,6 @@ export function createWorkspace(options = {}) {
|
|
|
115
134
|
customMountResolvers: options.mounts?.length ?? 0,
|
|
116
135
|
customSkillsResolver: Boolean(options.skills),
|
|
117
136
|
checkSkillFileMtime,
|
|
118
|
-
workspaceSkillRefreshTtlMs: options.workspaceSkillRefreshTtlMs ?? DEFAULT_WORKSPACE_SKILL_CACHE_TTL_MS,
|
|
119
137
|
bm25,
|
|
120
138
|
extraSkillPaths: extraSkillPaths.length,
|
|
121
139
|
sandbox: sandbox ? sandboxName(options.sandbox) : "disabled",
|
|
@@ -123,8 +141,8 @@ export function createWorkspace(options = {}) {
|
|
|
123
141
|
const workspace = new Workspace({
|
|
124
142
|
id,
|
|
125
143
|
name,
|
|
126
|
-
filesystem:
|
|
127
|
-
...(skills
|
|
144
|
+
filesystem: resolveFilesystem,
|
|
145
|
+
...(resolvers.length > 0 || options.skills
|
|
128
146
|
? {
|
|
129
147
|
skills,
|
|
130
148
|
checkSkillFileMtime,
|
|
@@ -137,16 +155,10 @@ export function createWorkspace(options = {}) {
|
|
|
137
155
|
}
|
|
138
156
|
: {}),
|
|
139
157
|
bm25,
|
|
158
|
+
tools,
|
|
140
159
|
});
|
|
141
|
-
if (!options.skills && resolvers.length > 0) {
|
|
142
|
-
workspaceCatalogueResolvers.set(workspace, buildSkillCatalogueResolver(resolveContribution, options.workspaceSkillRefreshTtlMs));
|
|
143
|
-
}
|
|
144
160
|
return workspace;
|
|
145
161
|
}
|
|
146
|
-
/** Return the dbx-tools catalogue resolver attached to one workspace. */
|
|
147
|
-
export function workspaceSkillCatalogueResolver(workspace) {
|
|
148
|
-
return workspace ? workspaceCatalogueResolvers.get(workspace) : undefined;
|
|
149
|
-
}
|
|
150
162
|
/**
|
|
151
163
|
* Merge the configured skill folders over {@link DEFAULT_SKILL_FOLDERS}.
|
|
152
164
|
*
|
|
@@ -166,6 +178,44 @@ export function resolveSkillFolders(options = {}) {
|
|
|
166
178
|
return merged;
|
|
167
179
|
}
|
|
168
180
|
/* ---------------------------- private helpers ---------------------------- */
|
|
181
|
+
/** Require approval unless a filesystem mutation stays inside a user-owned writable root. */
|
|
182
|
+
function requireApprovalOutsideWritableRoots({ args, requestContext, }) {
|
|
183
|
+
const inputPath = args.path;
|
|
184
|
+
if (typeof inputPath !== "string" || !posixPath.isAbsolute(inputPath))
|
|
185
|
+
return true;
|
|
186
|
+
const normalized = posixPath.normalize(inputPath);
|
|
187
|
+
if (!normalized.ok)
|
|
188
|
+
return true;
|
|
189
|
+
if (posixPath.isWithinRoot(SCRATCH_MOUNT, normalized.path))
|
|
190
|
+
return false;
|
|
191
|
+
const emailValue = requestContext[MASTRA_USER_EMAIL_KEY];
|
|
192
|
+
const email = typeof emailValue === "string" ? stringUtils.trimToNull(emailValue) : undefined;
|
|
193
|
+
if (!email)
|
|
194
|
+
return true;
|
|
195
|
+
return !posixPath.isWithinRoot(personalWorkspacePath(email), normalized.path);
|
|
196
|
+
}
|
|
197
|
+
function workspaceTools(configured) {
|
|
198
|
+
const requireApproval = configured?.requireApproval === undefined
|
|
199
|
+
? { requireApproval: requireApprovalOutsideWritableRoots }
|
|
200
|
+
: {};
|
|
201
|
+
const defaults = {
|
|
202
|
+
[WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE]: requireApproval,
|
|
203
|
+
[WORKSPACE_TOOLS.FILESYSTEM.EDIT_FILE]: requireApproval,
|
|
204
|
+
[WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT]: requireApproval,
|
|
205
|
+
[WORKSPACE_TOOLS.FILESYSTEM.DELETE]: requireApproval,
|
|
206
|
+
[WORKSPACE_TOOLS.FILESYSTEM.MKDIR]: requireApproval,
|
|
207
|
+
};
|
|
208
|
+
const configuredTools = configured;
|
|
209
|
+
const mergedTools = Object.fromEntries(Object.entries(defaults).map(([name, defaultConfig]) => [
|
|
210
|
+
name,
|
|
211
|
+
{ ...defaultConfig, ...configuredTools?.[name] },
|
|
212
|
+
]));
|
|
213
|
+
return {
|
|
214
|
+
...defaults,
|
|
215
|
+
...configured,
|
|
216
|
+
...mergedTools,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
169
219
|
function resolveWorkspaceSandbox(selection, workspaceId, workspaceName) {
|
|
170
220
|
const configured = selection ?? "monty";
|
|
171
221
|
if (configured === false)
|
|
@@ -224,17 +274,49 @@ function sandboxName(selection) {
|
|
|
224
274
|
function hasWorkspaceFileScope(requestContext) {
|
|
225
275
|
return token.includesAccessTokenScope(requestContext?.get(MASTRA_SCOPES_KEY), WORKSPACE_FILE_SCOPES);
|
|
226
276
|
}
|
|
277
|
+
/** Resolve the request client and authorization-safe files-cache scope. */
|
|
278
|
+
async function resolveFilesCacheScope(context) {
|
|
279
|
+
const requestContext = context.requestContext;
|
|
280
|
+
const user = requestContext?.get(MASTRA_USER_KEY);
|
|
281
|
+
const client = user?.executionContext.client;
|
|
282
|
+
if (!requestContext || !user || !client)
|
|
283
|
+
return undefined;
|
|
284
|
+
return {
|
|
285
|
+
client,
|
|
286
|
+
scope: {
|
|
287
|
+
host: (await client.config.getHost()).toString(),
|
|
288
|
+
userKey: resolveUserKey(requestContext),
|
|
289
|
+
...(process.env.DATABRICKS_WORKSPACE_ID?.trim()
|
|
290
|
+
? { workspaceId: process.env.DATABRICKS_WORKSPACE_ID.trim() }
|
|
291
|
+
: {}),
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/** Join one relative skill root to its actual composite mount path. */
|
|
296
|
+
function mountedSkillPath(mount, skillRoot) {
|
|
297
|
+
if (posixPath.isAbsolute(skillRoot)) {
|
|
298
|
+
throw new TypeError(`Skill path must be relative to its mount: ${skillRoot}`);
|
|
299
|
+
}
|
|
300
|
+
const normalized = posixPath.normalize(skillRoot);
|
|
301
|
+
if (!normalized.ok) {
|
|
302
|
+
throw new TypeError(`Skill path escapes its mount: ${skillRoot}`);
|
|
303
|
+
}
|
|
304
|
+
return posixPath.join(posixPath.normalizeRoot(mount), normalized.path.slice(1));
|
|
305
|
+
}
|
|
306
|
+
/** Return whether a Databricks path belongs to the writable Workspace namespace. */
|
|
307
|
+
function isWorkspaceRoot(root) {
|
|
308
|
+
const normalized = posixPath.normalizeRoot(root);
|
|
309
|
+
return normalized === "/Workspace" || normalized.startsWith("/Workspace/");
|
|
310
|
+
}
|
|
227
311
|
/**
|
|
228
312
|
* Mount resolver for the named skill folders.
|
|
229
313
|
*
|
|
230
314
|
* Gates on workspace file scope (or development mode), then mounts every
|
|
231
315
|
* folder whose location resolves for this request.
|
|
232
316
|
*/
|
|
233
|
-
async function resolveSkillFolderMounts(skillFolders, context) {
|
|
317
|
+
async function resolveSkillFolderMounts(skillFolders, context, filesCache) {
|
|
234
318
|
const mounts = {};
|
|
235
|
-
const skillSources = [];
|
|
236
319
|
const skillPaths = [];
|
|
237
|
-
const cacheKeys = [];
|
|
238
320
|
const requestContext = context.requestContext;
|
|
239
321
|
if (!requestContext || !shouldMountSkillFolders(requestContext)) {
|
|
240
322
|
logger.debug("skill-folders:skipped", {
|
|
@@ -244,25 +326,20 @@ async function resolveSkillFolderMounts(skillFolders, context) {
|
|
|
244
326
|
});
|
|
245
327
|
return { mounts, skillPaths };
|
|
246
328
|
}
|
|
247
|
-
const
|
|
248
|
-
const client =
|
|
249
|
-
const
|
|
250
|
-
const host = client ? (await client.config.getHost()).toString() : undefined;
|
|
329
|
+
const scoped = await resolveFilesCacheScope(context);
|
|
330
|
+
const client = scoped?.client;
|
|
331
|
+
const fileSystemCache = filesCache && scoped ? await filesCache.forScope(scoped.scope) : undefined;
|
|
251
332
|
for (const [name, folder] of Object.entries(skillFolders)) {
|
|
252
333
|
const resolved = await resolveSkillFolderFilesystem(name, folder, context, {
|
|
253
334
|
client,
|
|
254
|
-
|
|
255
|
-
userKey,
|
|
335
|
+
fileSystemCache,
|
|
256
336
|
});
|
|
257
337
|
if (!resolved)
|
|
258
338
|
continue;
|
|
259
|
-
const mount = folder.mount ?? `/${name}`;
|
|
339
|
+
const mount = folder.mount ?? resolved.root ?? `/${name}`;
|
|
260
340
|
mounts[mount] = resolved.filesystem;
|
|
261
|
-
if (resolved.cacheKey)
|
|
262
|
-
cacheKeys.push(resolved.cacheKey);
|
|
263
341
|
if (folder.readable !== false) {
|
|
264
|
-
skillPaths.push(mount);
|
|
265
|
-
skillSources.push({ ...resolved.skillSource, id: object.toStableKey({ mount, source: resolved.skillSource.id }) });
|
|
342
|
+
skillPaths.push(...(folder.skills ?? ["."]).map((path) => mountedSkillPath(mount, path)));
|
|
266
343
|
}
|
|
267
344
|
}
|
|
268
345
|
logger.debug("skill-folders:mounted", {
|
|
@@ -271,11 +348,7 @@ async function resolveSkillFolderMounts(skillFolders, context) {
|
|
|
271
348
|
});
|
|
272
349
|
return {
|
|
273
350
|
mounts,
|
|
274
|
-
skillSources,
|
|
275
351
|
skillPaths,
|
|
276
|
-
...(cacheKeys.length === Object.keys(mounts).length && cacheKeys.length > 0
|
|
277
|
-
? { cacheKey: object.toStableKey(cacheKeys.sort()) }
|
|
278
|
-
: {}),
|
|
279
352
|
};
|
|
280
353
|
}
|
|
281
354
|
/**
|
|
@@ -288,16 +361,11 @@ async function resolveSkillFolderFilesystem(name, folder, context, cache) {
|
|
|
288
361
|
return filesystem
|
|
289
362
|
? {
|
|
290
363
|
filesystem,
|
|
291
|
-
skillSource: mastraSkillSource(object.toStableKey({
|
|
292
|
-
id: filesystem.id,
|
|
293
|
-
name,
|
|
294
|
-
provider: filesystem.provider,
|
|
295
|
-
}), filesystem),
|
|
296
364
|
}
|
|
297
365
|
: undefined;
|
|
298
366
|
}
|
|
299
367
|
// A path mount needs the request's OBO client to reach the workspace.
|
|
300
|
-
if (folder.path === undefined || !cache.client
|
|
368
|
+
if (folder.path === undefined || !cache.client) {
|
|
301
369
|
logger.debug("skill-folder:skipped", {
|
|
302
370
|
name,
|
|
303
371
|
reason: folder.path === undefined ? "no-location" : "missing-obo-client",
|
|
@@ -307,10 +375,12 @@ async function resolveSkillFolderFilesystem(name, folder, context, cache) {
|
|
|
307
375
|
const root = stringUtils.trimToNull(await resolveSkillFolderValue(folder.path, context));
|
|
308
376
|
if (!root)
|
|
309
377
|
return undefined;
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
378
|
+
const writable = folder.writable ?? isWorkspaceRoot(root);
|
|
379
|
+
const resolved = await databricksFilesystem(cache.client, root, !writable, folder.createRoot ?? folder.writable === true, cache.fileSystemCache, folder.readable === false ? [] : (folder.skills ?? ["."]), {
|
|
380
|
+
...(folder.description ? { description: folder.description } : {}),
|
|
381
|
+
...(folder.displayName ? { displayName: folder.displayName } : {}),
|
|
313
382
|
});
|
|
383
|
+
return resolved ? { ...resolved, root } : undefined;
|
|
314
384
|
}
|
|
315
385
|
/** Read a {@link SkillFolderValue}, calling it when it is a per-request resolver. */
|
|
316
386
|
function resolveSkillFolderValue(value, context) {
|
|
@@ -334,11 +404,11 @@ function resolveWorkspaceIdentity(options) {
|
|
|
334
404
|
return { id, name };
|
|
335
405
|
}
|
|
336
406
|
/** Collect the skill-folder resolver and any caller-supplied ones. */
|
|
337
|
-
function buildMountResolvers(skillFolders, mounts) {
|
|
338
|
-
const resolvers = [];
|
|
407
|
+
function buildMountResolvers(skillFolders, mounts, filesCache) {
|
|
408
|
+
const resolvers = [scratchMountResolver()];
|
|
339
409
|
const folderCount = Object.keys(skillFolders).length;
|
|
340
410
|
if (folderCount > 0) {
|
|
341
|
-
resolvers.push((context) => resolveSkillFolderMounts(skillFolders, context));
|
|
411
|
+
resolvers.push((context) => resolveSkillFolderMounts(skillFolders, context, filesCache));
|
|
342
412
|
}
|
|
343
413
|
if (mounts?.length) {
|
|
344
414
|
resolvers.push(...mounts);
|
|
@@ -350,10 +420,16 @@ function buildMountResolvers(skillFolders, mounts) {
|
|
|
350
420
|
});
|
|
351
421
|
return resolvers;
|
|
352
422
|
}
|
|
423
|
+
/** Contribute one isolated local scratch filesystem at `/tmp`. */
|
|
424
|
+
function scratchMountResolver() {
|
|
425
|
+
return () => ({
|
|
426
|
+
mounts: { [SCRATCH_MOUNT]: scratchFilesystem() },
|
|
427
|
+
});
|
|
428
|
+
}
|
|
353
429
|
/** Mount startup-provisioned local skill roots into Mastra's workspace filesystem. */
|
|
354
430
|
function localSkillMountResolvers(paths) {
|
|
355
|
-
return [...new Set(paths.map((path) => path.trim()).filter(Boolean))].map((root
|
|
356
|
-
const mount =
|
|
431
|
+
return [...new Set(paths.map((path) => path.trim()).filter(Boolean))].map((root) => {
|
|
432
|
+
const mount = posixPath.normalizeRoot(root);
|
|
357
433
|
const source = new LocalFileSystem({
|
|
358
434
|
root,
|
|
359
435
|
readOnly: true,
|
|
@@ -362,46 +438,10 @@ function localSkillMountResolvers(paths) {
|
|
|
362
438
|
const filesystem = filesystems(source, { readOnly: true });
|
|
363
439
|
return () => ({
|
|
364
440
|
mounts: { [mount]: filesystem },
|
|
365
|
-
skillSources: [sharedSkillSource(object.toStableKey({ mount, root }), source)],
|
|
366
441
|
skillPaths: [mount],
|
|
367
|
-
cacheKey: object.toStableKey({ mount, root }),
|
|
368
442
|
});
|
|
369
443
|
});
|
|
370
444
|
}
|
|
371
|
-
/** Adapt a portable dbx-tools filesystem to catalogue discovery callbacks. */
|
|
372
|
-
function sharedSkillSource(id, filesystem) {
|
|
373
|
-
return {
|
|
374
|
-
id,
|
|
375
|
-
async list(path) {
|
|
376
|
-
await filesystem.init();
|
|
377
|
-
return (await filesystem.readdir(path)).flatMap((entry) => entry.type === "file" || entry.type === "directory"
|
|
378
|
-
? [
|
|
379
|
-
{
|
|
380
|
-
name: entry.name,
|
|
381
|
-
type: entry.type,
|
|
382
|
-
...(entry.size !== undefined ? { size: entry.size } : {}),
|
|
383
|
-
...(entry.metadata ? { metadata: entry.metadata } : {}),
|
|
384
|
-
},
|
|
385
|
-
]
|
|
386
|
-
: []);
|
|
387
|
-
},
|
|
388
|
-
async read(path) {
|
|
389
|
-
await filesystem.init();
|
|
390
|
-
return filesystem.readFile(path, { encoding: "utf8" });
|
|
391
|
-
},
|
|
392
|
-
};
|
|
393
|
-
}
|
|
394
|
-
/** Adapt an arbitrary Mastra filesystem when no portable source is available. */
|
|
395
|
-
function mastraSkillSource(id, filesystem) {
|
|
396
|
-
return {
|
|
397
|
-
id,
|
|
398
|
-
list: (path) => filesystem.readdir(path),
|
|
399
|
-
async read(path) {
|
|
400
|
-
const value = await filesystem.readFile(path, { encoding: "utf8" });
|
|
401
|
-
return typeof value === "string" ? value : value.toString("utf8");
|
|
402
|
-
},
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
445
|
/**
|
|
406
446
|
* Gate skill-folder mounts on the request's token.
|
|
407
447
|
*
|
|
@@ -418,36 +458,37 @@ function resolveScopedEmail(requestContext) {
|
|
|
418
458
|
return stringUtils.trimToNull(requestContext?.get(MASTRA_USER_EMAIL_KEY)) ?? undefined;
|
|
419
459
|
}
|
|
420
460
|
/**
|
|
421
|
-
* Wrap a {@link DatabricksFileSystem} as a Mastra filesystem.
|
|
422
|
-
*
|
|
423
|
-
*
|
|
461
|
+
* Wrap a {@link DatabricksFileSystem} as a Mastra filesystem. Missing or
|
|
462
|
+
* inaccessible roots return `undefined` so the independent `/tmp` mount and
|
|
463
|
+
* any other accessible roots remain usable.
|
|
424
464
|
*/
|
|
425
|
-
async function databricksFilesystem(client, root, readOnly = true,
|
|
465
|
+
async function databricksFilesystem(client, root, readOnly = true, createRoot = !readOnly, fileSystemCache, skillPaths = [], adapterOptions = {}) {
|
|
466
|
+
const initialClient = workspaceClient.toLegacyWorkspaceClient(client);
|
|
426
467
|
const fs = new DatabricksFileSystem({
|
|
427
|
-
client:
|
|
468
|
+
client: () => {
|
|
469
|
+
try {
|
|
470
|
+
return workspaceClient.toLegacyWorkspaceClient(getExecutionContext().client);
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
return initialClient;
|
|
474
|
+
}
|
|
475
|
+
},
|
|
428
476
|
root,
|
|
429
477
|
readOnly,
|
|
430
|
-
createRoot
|
|
431
|
-
});
|
|
432
|
-
const cacheKey = object.toStableKey({
|
|
433
|
-
host: cache.host,
|
|
434
|
-
readOnly,
|
|
435
|
-
root,
|
|
436
|
-
userKey: cache.userKey,
|
|
478
|
+
createRoot,
|
|
437
479
|
});
|
|
438
|
-
const
|
|
480
|
+
const source = fileSystemCache
|
|
481
|
+
? sharedFS.cache(fs, fileSystemCache, { readFilePaths: skillPaths })
|
|
482
|
+
: fs;
|
|
483
|
+
const filesystem = filesystems(source, { ...adapterOptions, readOnly });
|
|
439
484
|
try {
|
|
440
485
|
await filesystem.init();
|
|
441
486
|
if (await filesystem.exists(".")) {
|
|
442
|
-
return {
|
|
443
|
-
cacheKey,
|
|
444
|
-
filesystem,
|
|
445
|
-
skillSource: sharedSkillSource(cacheKey, fs),
|
|
446
|
-
};
|
|
487
|
+
return { filesystem };
|
|
447
488
|
}
|
|
448
489
|
}
|
|
449
490
|
catch (err) {
|
|
450
|
-
logger.debug("databricks-mount:
|
|
491
|
+
logger.debug("databricks-mount:skipped", {
|
|
451
492
|
root,
|
|
452
493
|
readOnly,
|
|
453
494
|
error: errorUtils.errorMessage(err),
|
|
@@ -461,10 +502,7 @@ async function databricksFilesystem(client, root, readOnly = true, cache) {
|
|
|
461
502
|
*/
|
|
462
503
|
async function resolveWorkspaceContribution(resolvers, context) {
|
|
463
504
|
const mounts = {};
|
|
464
|
-
const skillSources = [];
|
|
465
505
|
const skillPaths = [];
|
|
466
|
-
const cacheKeys = [];
|
|
467
|
-
let cacheable = true;
|
|
468
506
|
for (const [index, resolver] of resolvers.entries()) {
|
|
469
507
|
const contribution = await resolver(context);
|
|
470
508
|
logger.debug("mounts:resolver", {
|
|
@@ -473,18 +511,9 @@ async function resolveWorkspaceContribution(resolvers, context) {
|
|
|
473
511
|
skillPaths: contribution.skillPaths ?? [],
|
|
474
512
|
});
|
|
475
513
|
Object.assign(mounts, contribution.mounts);
|
|
476
|
-
if (Object.keys(contribution.mounts).length > 0) {
|
|
477
|
-
if (contribution.cacheKey)
|
|
478
|
-
cacheKeys.push(contribution.cacheKey);
|
|
479
|
-
else
|
|
480
|
-
cacheable = false;
|
|
481
|
-
}
|
|
482
514
|
if (contribution.skillPaths?.length) {
|
|
483
515
|
skillPaths.push(...contribution.skillPaths);
|
|
484
516
|
}
|
|
485
|
-
if (contribution.skillSources?.length) {
|
|
486
|
-
skillSources.push(...contribution.skillSources);
|
|
487
|
-
}
|
|
488
517
|
}
|
|
489
518
|
logger.debug("mounts:merged", {
|
|
490
519
|
mountKeys: Object.keys(mounts),
|
|
@@ -492,11 +521,7 @@ async function resolveWorkspaceContribution(resolvers, context) {
|
|
|
492
521
|
});
|
|
493
522
|
return {
|
|
494
523
|
mounts,
|
|
495
|
-
skillSources,
|
|
496
524
|
skillPaths,
|
|
497
|
-
...(cacheable && cacheKeys.length > 0
|
|
498
|
-
? { cacheKey: object.toStableKey({ mounts: Object.keys(mounts), sources: cacheKeys }) }
|
|
499
|
-
: {}),
|
|
500
525
|
};
|
|
501
526
|
}
|
|
502
527
|
/**
|
|
@@ -505,8 +530,8 @@ async function resolveWorkspaceContribution(resolvers, context) {
|
|
|
505
530
|
* Returns a {@link CompositeFilesystem} when any mount resolved; otherwise a
|
|
506
531
|
* fresh {@link scratchFilesystem} so Mastra always has a writable local root.
|
|
507
532
|
*/
|
|
508
|
-
async function resolveWorkspaceFilesystem(resolveContribution, context) {
|
|
509
|
-
const {
|
|
533
|
+
async function resolveWorkspaceFilesystem(resolveContribution, context, filesCache) {
|
|
534
|
+
const { mounts } = await resolveContribution(context);
|
|
510
535
|
const mountKeys = Object.keys(mounts);
|
|
511
536
|
if (mountKeys.length === 0) {
|
|
512
537
|
logger.debug("filesystem:scratch", {
|
|
@@ -515,14 +540,44 @@ async function resolveWorkspaceFilesystem(resolveContribution, context) {
|
|
|
515
540
|
return scratchFilesystem();
|
|
516
541
|
}
|
|
517
542
|
logger.debug("filesystem:composite", { mountKeys });
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
543
|
+
const load = () => new MountedCompositeFilesystem({ mounts });
|
|
544
|
+
if (!filesCache)
|
|
545
|
+
return load();
|
|
546
|
+
const scoped = await resolveFilesCacheScope(context);
|
|
547
|
+
if (!scoped)
|
|
548
|
+
return load();
|
|
549
|
+
return filesCache.forFileSystem(scoped.scope, { paths: mountKeys }, load);
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Expand skill roots into concrete skill directories and keep the first
|
|
553
|
+
* same-named directory. Mastra still owns parsing, indexing, and refreshes,
|
|
554
|
+
* while organization roots retain precedence over personal roots.
|
|
555
|
+
*/
|
|
556
|
+
async function resolveDistinctSkillPaths(filesystem, roots) {
|
|
557
|
+
const selected = new Map();
|
|
558
|
+
for (const root of roots) {
|
|
559
|
+
try {
|
|
560
|
+
const entries = await filesystem.readdir(root);
|
|
561
|
+
if (entries.some((entry) => entry.type === "file" && entry.name === "SKILL.md")) {
|
|
562
|
+
const name = posixPath.basename(root);
|
|
563
|
+
if (!selected.has(name))
|
|
564
|
+
selected.set(name, root);
|
|
565
|
+
continue;
|
|
566
|
+
}
|
|
567
|
+
for (const entry of entries) {
|
|
568
|
+
if (entry.type !== "directory" || selected.has(entry.name))
|
|
569
|
+
continue;
|
|
570
|
+
selected.set(entry.name, posixPath.join(root, entry.name));
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
catch (error) {
|
|
574
|
+
logger.debug("skill-root:skipped", {
|
|
575
|
+
root,
|
|
576
|
+
error: errorUtils.errorMessage(error),
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
return [...selected.values()];
|
|
526
581
|
}
|
|
527
582
|
/** Memoize one complete mount contribution for each request context. */
|
|
528
583
|
function contributionResolver(resolvers) {
|
|
@@ -541,19 +596,4 @@ function contributionResolver(resolvers) {
|
|
|
541
596
|
return pending;
|
|
542
597
|
};
|
|
543
598
|
}
|
|
544
|
-
/** Resolve one semantic catalogue owner from a request's ordered skill roots. */
|
|
545
|
-
function buildSkillCatalogueResolver(resolveContribution, ttlMs) {
|
|
546
|
-
return async ({ requestContext }) => {
|
|
547
|
-
const contribution = await resolveContribution({ requestContext });
|
|
548
|
-
const user = requestContext?.get(MASTRA_USER_KEY);
|
|
549
|
-
const client = user?.executionContext.client;
|
|
550
|
-
const host = client ? (await client.config.getHost()).toString() : "local";
|
|
551
|
-
return workspaceSkillCatalogue({
|
|
552
|
-
host,
|
|
553
|
-
sources: contribution.skillSources ?? [],
|
|
554
|
-
ttlMs,
|
|
555
|
-
userKey: user?.id ?? "service",
|
|
556
|
-
});
|
|
557
|
-
};
|
|
558
|
-
}
|
|
559
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFckYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFNBQVMsR0FLVixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixjQUFjLEdBRWYsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsaUJBQWlCLEVBQTBDLE1BQU0sY0FBYyxDQUFDO0FBQ3pGLE9BQU8sRUFDTCxvQ0FBb0MsRUFDcEMsdUJBQXVCLEdBR3hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekYsNkVBQTZFO0FBRTdFLCtEQUErRDtBQUMvRCxNQUFNLHFCQUFxQixHQUFHLENB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LEdBQUcsSUFBSSxFQUFFLGdCQUFnQixDQUFDLE1BQXFDLENBQUM7UUFDNUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDM0UsT0FBTyx1QkFBdUIsQ0FBQztZQUM3QixJQUFJO1lBQ0osT0FBTyxFQUFFLFlBQVksQ0FBQyxZQUFZLElBQUksRUFBRTtZQUN4QyxLQUFLO1lBQ0wsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksU0FBUztTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXN0cmEgd29ya3NwYWNlIGZhY3RvcnkgZm9yIERhdGFicmlja3MgQXBwcy5cbiAqXG4gKiBCdWlsZHMgYSBwZXItcmVxdWVzdCB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIERhdGFicmlja3MgU2FuZGJveCBjb21tYW5kXG4gKiBleGVjdXRpb24gcGx1cyBhIHtAbGluayBDb21wb3NpdGVGaWxlc3lzdGVtfSBvdmVyIHRoZSBOQU1FRCBza2lsbCBmb2xkZXJzXG4gKiByZXNvbHZlZCBmb3IgdGhhdCByZXF1ZXN0LiBBIHNraWxsIGZvbGRlciBtYXBzIGEgbmFtZSB0byBhIGxvY2F0aW9uIHBsdXMgaXRzXG4gKiByZWFkYWJsZSAvIHdyaXRhYmxlIHBvbGljeTogYSBEYXRhYnJpY2tzIHBhdGggbW91bnRlZCB0aHJvdWdoIHRoZSBPQk8gY2xpZW50XG4gKiBvbiB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSwgb3IgYW55IHtAbGluayBXb3Jrc3BhY2VGaWxlc3lzdGVtfSBhIGNvbnN1bWluZ1xuICogbGlicmFyeSBhbHJlYWR5IG93bnMuIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9IHN1cHBsaWVzIHRoZSBBc3Npc3RhbnRcbiAqIHRyZWVzLCBhbmQgYHNraWxsRm9sZGVyc2AgbWVyZ2VzIG92ZXIgaXQgLSBzYW1lIG5hbWUgb3ZlcnJpZGVzLCBgZmFsc2VgXG4gKiBkaXNhYmxlcywgYSBuZXcgbmFtZSBhZGRzLiBPcHRpb25hbCBtb3VudCByZXNvbHZlcnMgY29udHJpYnV0ZSBmdXJ0aGVyXG4gKiBmaWxlc3lzdGVtcyBhbmQgc2tpbGwgc2NhbiByb290cyBvbiB0b3AuXG4gKlxuICogRGF0YWJyaWNrcyBtb3VudHMgdXNlIGBAZGJ4LXRvb2xzL2RhdGFicmlja3NgIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX1cbiAqIHdyYXBwZWQgYnkge0BsaW5rIGZpbGVzeXN0ZW1zfTsgbWlzc2luZyByb290cyBmYWxsIGJhY2sgdG9cbiAqIHtAbGluayBzY3JhdGNoRmlsZXN5c3RlbX0uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgY3JlYXRlV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSwgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gXCJscnUtY2FjaGVcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQ29tcG9zaXRlRmlsZXN5c3RlbSxcbiAgV29ya3NwYWNlLFxuICB0eXBlIFNraWxsc1Jlc29sdmVyLFxuICB0eXBlIFdvcmtzcGFjZUZpbGVzeXN0ZW0sXG4gIHR5cGUgV29ya3NwYWNlU2FuZGJveCxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXIsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvd29ya3NwYWNlXCI7XG5cbmltcG9ydCB7XG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgcmVzb2x2ZVVzZXJLZXksXG4gIHR5cGUgVXNlcixcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBmaWxlc3lzdGVtcywgc2NyYXRjaEZpbGVzeXN0ZW0gfSBmcm9tIFwiLi9maWxlc3lzdGVtcy50c1wiO1xuaW1wb3J0IHsgTW9udHlTYW5kYm94IH0gZnJvbSBcIi4vbW9udHktc2FuZGJveC50c1wiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc1NhbmRib3gsIHR5cGUgRGF0YWJyaWNrc1dvcmtzcGFjZVNhbmRib3hPcHRpb25zIH0gZnJvbSBcIi4vc2FuZGJveC50c1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9XT1JLU1BBQ0VfU0tJTExfQ0FDSEVfVFRMX01TLFxuICB3b3Jrc3BhY2VTa2lsbENhdGFsb2d1ZSxcbiAgdHlwZSBTa2lsbENhdGFsb2d1ZVJlc29sdmVyLFxuICB0eXBlIFNraWxsQ2F0YWxvZ3VlU291cmNlLFxufSBmcm9tIFwiLi9za2lsbC1jYWNoZS50c1wiO1xuaW1wb3J0IHsgQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSCwgdXNlckFzc2lzdGFudFNraWxsc1BhdGggfSBmcm9tIFwiLi9za2lsbC1wYXRocy50c1wiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogT0F1dGggc2NvcGVzIHRoYXQgZ2F0ZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlIG1vdW50cy4gKi9cbmNvbnN0IFdPUktTUEFDRV9GSUxFX1NDT1BFUyA9IFtcIndvcmtzcGFjZVwiLCBcIndvcmtzcGFjZS53b3Jrc3BhY2VcIiwgXCJhbGwtYXBpc1wiXSBhcyBjb25zdDtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS93b3Jrc3BhY2VzXCIpO1xuY29uc3QgTUFYX1NDT1BFRF9XT1JLU1BBQ0VfRklMRVNZU1RFTVMgPSAxNjtcbmNvbnN0IHNjb3BlZFdvcmtzcGFjZUZpbGVzeXN0ZW1zID0gbmV3IExSVUNhY2hlPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4oe1xuICBtYXg6IE1BWF9TQ09QRURfV09SS1NQQUNFX0ZJTEVTWVNURU1TLFxufSk7XG5jb25zdCB3b3Jrc3BhY2VDYXRhbG9ndWVSZXNvbHZlcnMgPSBuZXcgV2Vha01hcDxXb3Jrc3BhY2UsIFNraWxsQ2F0YWxvZ3VlUmVzb2x2ZXI+KCk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItcmVxdWVzdCBjb250ZXh0IGZvciBtb3VudCBhbmQgc2tpbGwtZm9sZGVyIHJlc29sdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250ZXh0IHtcbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBBIHNraWxsLWZvbGRlciBmaWVsZCBnaXZlbiBlaXRoZXIgZGlyZWN0bHkgb3IgYXMgYSBwZXItcmVxdWVzdCByZXNvbHZlci5cbiAqIEEgcmVzb2x2ZXIgcmV0dXJuaW5nIGB1bmRlZmluZWRgIHNraXBzIHRoZSBmb2xkZXIgZm9yIHRoYXQgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IHR5cGUgU2tpbGxGb2xkZXJWYWx1ZTxUPiA9XG4gIFQgfCAoKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4pO1xuXG4vKipcbiAqIE9uZSBuYW1lZCBza2lsbC1mb2xkZXIgbG9jYXRpb24gYW5kIGl0cyByZWFkIC8gd3JpdGUgcG9saWN5LlxuICpcbiAqIEdpdmUge0BsaW5rIHBhdGh9IGZvciBhIERhdGFicmlja3Mgd29ya3NwYWNlIHRyZWUgKG1vdW50ZWQgdGhyb3VnaCB0aGVcbiAqIHJlcXVlc3QncyBPQk8gY2xpZW50KSwgb3Ige0BsaW5rIGZpbGVzeXN0ZW19IGZvciBhIG1vdW50IHRoZSBjb25zdW1lciBidWlsZHNcbiAqIGl0c2VsZi4ge0BsaW5rIGZpbGVzeXN0ZW19IHdpbnMgd2hlbiBib3RoIGFyZSBzZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tpbGxGb2xkZXJPcHRpb25zIHtcbiAgLyoqIEFic29sdXRlIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGggZm9yIHRoaXMgZm9sZGVyLiAqL1xuICBwYXRoPzogU2tpbGxGb2xkZXJWYWx1ZTxzdHJpbmc+O1xuICAvKiogUmVhZHktbWFkZSBtb3VudCwgZm9yIGxvY2F0aW9ucyB0aGUgT0JPIGNsaWVudCBjYW5ub3QgcmVhY2guICovXG4gIGZpbGVzeXN0ZW0/OiBTa2lsbEZvbGRlclZhbHVlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKipcbiAgICogU2NhbiB0aGlzIG1vdW50IGZvciBgU0tJTEwubWRgIGZpbGVzLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGBmYWxzZWAgbW91bnRzXG4gICAqIHRoZSBsb2NhdGlvbiBmb3IgZmlsZSB0b29scyB3aXRob3V0IGFkZGluZyBpdCB0byBza2lsbCBkaXNjb3ZlcnkuXG4gICAqL1xuICByZWFkYWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvdyB3cml0ZXMgdG8gYSB7QGxpbmsgcGF0aH0gbW91bnQgKGFuZCBjcmVhdGUgdGhlIHJvb3Qgd2hlbiBtaXNzaW5nKS5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC4gQSBzdXBwbGllZCB7QGxpbmsgZmlsZXN5c3RlbX0gY2FycmllcyBpdHMgb3duXG4gICAqIHJlYWQtb25seSBmbGFnIGluc3RlYWQuXG4gICAqL1xuICB3cml0YWJsZT86IGJvb2xlYW47XG4gIC8qKiBNb3VudCBwb2ludCBpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZS4gRGVmYXVsdHMgdG8gYC88bmFtZT5gLiAqL1xuICBtb3VudD86IHN0cmluZztcbn1cblxuLyoqIE1vdW50IG1hcCBwbHVzIG9wdGlvbmFsIE1hc3RyYSBza2lsbCBzY2FuIHJvb3RzIGZvciBvbmUgcmVzb2x2ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIE9yZGVyZWQgc291cmNlIHJvb3RzIGluY2x1ZGVkIGluIGNhdGFsb2d1ZSBkaXNjb3ZlcnkuICovXG4gIHNraWxsU291cmNlcz86IFNraWxsQ2F0YWxvZ3VlU291cmNlW107XG4gIC8qKiBQYXRocyB3aXRoaW4gdGhlIGNvbXBvc2l0ZSBuYW1lc3BhY2Ugd2hlcmUgYFNLSUxMLm1kYCBmaWxlcyBhcmUgc2Nhbm5lZC4gKi9cbiAgc2tpbGxQYXRocz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogU3RhYmxlIGlkZW50aXR5IGZvciB0aGlzIGNvbnRyaWJ1dGlvbi4gV2hlbiBldmVyeSBub24tZW1wdHkgY29udHJpYnV0aW9uXG4gICAqIHN1cHBsaWVzIG9uZSwgTWFzdHJhIHJldXNlcyB0aGUgcmVzb2x2ZWQgc291cmNlIGFjcm9zcyByZXF1ZXN0cy5cbiAgICovXG4gIGNhY2hlS2V5Pzogc3RyaW5nO1xufVxuXG4vKiogQ29udHJpYnV0ZXMgZmlsZXN5c3RlbSBtb3VudHMgKGFuZCBvcHRpb25hbCBza2lsbCBwYXRocykgZm9yIG9uZSByZXF1ZXN0LiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlTW91bnRSZXNvbHZlciA9IChcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKSA9PiBXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbiB8IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+O1xuXG4vKiogTmFtZXMgY2FycmllZCBieSB7QGxpbmsgREVGQVVMVF9TS0lMTF9GT0xERVJTfS4gKi9cbmV4cG9ydCB0eXBlIERlZmF1bHRTa2lsbEZvbGRlck5hbWUgPSBcIndvcmtzcGFjZS10ZWFtXCIgfCBcIndvcmtzcGFjZS10ZWFtLWFwcFwiO1xuXG4vKipcbiAqIFNhbmRib3ggc2VsZWN0aW9uIGZvciB7QGxpbmsgY3JlYXRlV29ya3NwYWNlfS4gRGF0YWJyaWNrcyBpcyB0aGUgZGVmYXVsdDtcbiAqIGBmYWxzZWAgZGlzYWJsZXMgY29tbWFuZCBleGVjdXRpb24sIGFuZCBhIE1hc3RyYSBwcm92aWRlciBvciByZXNvbHZlciBpcyBhblxuICogZXhwbGljaXQgcmVwbGFjZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gPVxuICB8IGZhbHNlXG4gIHwgXCJkYXRhYnJpY2tzXCJcbiAgfCBcIm1vbnR5XCJcbiAgfCBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnNcbiAgfCBXb3Jrc3BhY2VTYW5kYm94XG4gIHwgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZVdvcmtzcGFjZX0uICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMge1xuICAvKiogV29ya3NwYWNlIGlkOyBkZXJpdmVkIGZyb20gYG5hbWVgIG9yIGBcIndvcmtzcGFjZVwiYCB3aGVuIG9taXR0ZWQuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogRGlzcGxheSBuYW1lOyBkZXJpdmVkIGZyb20gYGlkYCB3aGVuIG9taXR0ZWQuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdGFydCBmcm9tIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGBmYWxzZWBcbiAgICogc3RhcnRzIGZyb20gYW4gZW1wdHkgbWFwLCBsZWF2aW5nIG9ubHkgdGhlIHtAbGluayBza2lsbEZvbGRlcnN9IGdpdmVuIGhlcmUuXG4gICAqL1xuICBhc3Npc3RhbnRTa2lsbHM/OiBib29sZWFuO1xuICAvKipcbiAgICogTmFtZWQgc2tpbGwgZm9sZGVycyBtZXJnZWQgb3ZlciB7QGxpbmsgREVGQVVMVF9TS0lMTF9GT0xERVJTfTogYSBtYXRjaGluZ1xuICAgKiBuYW1lIG92ZXJyaWRlcyB0aGF0IGRlZmF1bHQsIGBmYWxzZWAgZGlzYWJsZXMgaXQsIGFuZCBhbnkgb3RoZXIgbmFtZSBhZGRzXG4gICAqIGEgZm9sZGVyLlxuICAgKi9cbiAgc2tpbGxGb2xkZXJzPzogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zIHwgZmFsc2U+O1xuICAvKiogRXh0cmEgcGVyLXJlcXVlc3QgbW91bnQgcmVzb2x2ZXJzIChydW4gYWZ0ZXIgdGhlIHNraWxsLWZvbGRlciBtb3VudHMpLiAqL1xuICBtb3VudHM/OiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW107XG4gIC8qKiBSZXBsYWNlIHRoZSBhdXRvLWJ1aWx0IGR5bmFtaWMgc2tpbGxzIHJlc29sdmVyLiAqL1xuICBza2lsbHM/OiBTa2lsbHNSZXNvbHZlcjtcbiAgLyoqIEZvcndhcmRlZCB0byBNYXN0cmEgd2hlbiBza2lsbCBkaXNjb3ZlcnkgaXMgZW5hYmxlZC4gKi9cbiAgY2hlY2tTa2lsbEZpbGVNdGltZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZWZyZXNoIFRUTCBmb3IgdGhlIGNvbXBsZXRlIHBhcnNlZCBza2lsbCBjYXRhbG9ndWUuIEF1eGlsaWFyeSByZWFkcyBhcmVcbiAgICogYWx3YXlzIGZyZXNoLiBEZWZhdWx0cyB0byBmaXZlIG1pbnV0ZXMuXG4gICAqL1xuICB3b3Jrc3BhY2VTa2lsbFJlZnJlc2hUdGxNcz86IG51bWJlcjtcbiAgLyoqIEVuYWJsZSBCTTI1IGtleXdvcmQgc2VhcmNoIG92ZXIgaW5kZXhlZCB3b3Jrc3BhY2UgY29udGVudC4gKi9cbiAgYm0yNT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb21tYW5kIHNhbmRib3guIERlZmF1bHRzIHRvIE1vbnR5LiBQYXNzIGBcImRhdGFicmlja3NcImAgb3IgYW4gb3B0aW9uc1xuICAgKiBvYmplY3QgZm9yIERhdGFicmlja3MgU2FuZGJveCwgYGZhbHNlYCB0byBkaXNhYmxlIGNvbW1hbmQgZXhlY3V0aW9uLCBvciBhblxuICAgKiBleHBsaWNpdCBNYXN0cmEgc2FuZGJveC9wcm92aWRlciByZXNvbHZlci5cbiAgICovXG4gIHNhbmRib3g/OiBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uO1xuICAvKipcbiAgICogRXh0cmEgTE9DQUwgc2tpbGwgcm9vdHMgbW91bnRlZCByZWFkLW9ubHkgZm9yIGV2ZXJ5IHJlcXVlc3QncyBza2lsbCBkaXNjb3ZlcnkuXG4gICAqIFVzZWQgYnkgdGhlIHBsdWdpbiB0byBzdXJmYWNlIHJlbW90ZSBza2lsbHMgcHJvdmlzaW9uZWQgdG8gYSBsb2NhbCB0ZW1wXG4gICAqIGRpciBhdCBzdGFydHVwIChzZWUgYHJlbW90ZS1za2lsbHMudHNgKS4gRGF0YWJyaWNrcy1ob3N0ZWQgcmVtb3RlIHNraWxsc1xuICAgKiBuZWVkIG5vIGVudHJ5IGhlcmUgLSB0aGV5IGxhbmQgaW4gdGhlIEFzc2lzdGFudCB0cmVlIHRoZSBidWlsdC1pbiBtb3VudFxuICAgKiBhbHJlYWR5IHNjYW5zLlxuICAgKi9cbiAgZXh0cmFTa2lsbFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVmYXVsdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRoZSBza2lsbCBmb2xkZXJzIGV2ZXJ5IHdvcmtzcGFjZSBzdGFydHMgd2l0aC5cbiAqXG4gKiAtIGB3b3Jrc3BhY2UtdGVhbWAgLSB0aGUgc2hhcmVkIHdvcmtzcGFjZSBBc3Npc3RhbnQgdHJlZSwgcmVhZC1vbmx5IGJlY2F1c2VcbiAqICAgd3JpdGluZyBpdCBpcyBhIHdvcmtzcGFjZS1hZG1pbiBhY3Rpb24uXG4gKiAtIGB3b3Jrc3BhY2UtdGVhbS1hcHBgIC0gdGhlIHJlcXVlc3RpbmcgdXNlcidzIG93biBBc3Npc3RhbnQgdHJlZSwgd3JpdGFibGVcbiAqICAgc28gdGhlIGFwcCBjYW4gc2F2ZSBza2lsbHMgYmFjayB0byBpdC4gU2tpcHBlZCB3aGVuIHRoZSByZXF1ZXN0IGNhcnJpZXMgbm9cbiAqICAgdXNlciBlbWFpbC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0tJTExfRk9MREVSUzogUmVhZG9ubHk8UmVjb3JkPERlZmF1bHRTa2lsbEZvbGRlck5hbWUsIFNraWxsRm9sZGVyT3B0aW9ucz4+ID0ge1xuICBcIndvcmtzcGFjZS10ZWFtXCI6IHtcbiAgICBwYXRoOiBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRILFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgfSxcbiAgXCJ3b3Jrc3BhY2UtdGVhbS1hcHBcIjoge1xuICAgIHBhdGg6ICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICAgIGNvbnN0IGVtYWlsID0gcmVzb2x2ZVNjb3BlZEVtYWlsKHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHJldHVybiBlbWFpbCA/IHVzZXJBc3Npc3RhbnRTa2lsbHNQYXRoKGVtYWlsKSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICB9LFxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gd2l0aCBwZXItcmVxdWVzdCBEYXRhYnJpY2tzIG1vdW50cy5cbiAqXG4gKiBAZXhhbXBsZSBEZWZhdWx0IHNraWxsIGZvbGRlcnMgb25seVxuICogYGBgdHNcbiAqIGNyZWF0ZVdvcmtzcGFjZSgpXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBPdmVycmlkZSBhIGRlZmF1bHQsIGRyb3AgYW5vdGhlciwgYW5kIGFkZCBhIGxvY2F0aW9uIG9mIHlvdXIgb3duXG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKHtcbiAqICAgc2tpbGxGb2xkZXJzOiB7XG4gKiAgICAgXCJ3b3Jrc3BhY2UtdGVhbVwiOiB7IHBhdGg6IFwiL1dvcmtzcGFjZS9TaGFyZWQvdGVhbS1za2lsbHNcIiB9LFxuICogICAgIFwid29ya3NwYWNlLXRlYW0tYXBwXCI6IGZhbHNlLFxuICogICAgIHJ1bmJvb2tzOiB7IHBhdGg6IFwiL1dvcmtzcGFjZS9TaGFyZWQvcnVuYm9va3Mvc2tpbGxzXCIsIHdyaXRhYmxlOiB0cnVlIH0sXG4gKiAgICAgdm9sdW1lOiB7IGZpbGVzeXN0ZW06IG15Vm9sdW1lRmlsZXN5c3RlbSB9LFxuICogICB9LFxuICogfSlcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFNraWxsIGZvbGRlcnMgcGx1cyBhIGN1c3RvbSBtb3VudCByZXNvbHZlclxuICogYGBgdHNcbiAqIGNyZWF0ZVdvcmtzcGFjZSh7XG4gKiAgIG1vdW50czogW1xuICogICAgIGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+ICh7XG4gKiAgICAgICBtb3VudHM6IHsgXCIvZGF0YVwiOiBteUZpbGVzeXN0ZW0gfSxcbiAqICAgICAgIHNraWxsUGF0aHM6IFtdLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV29ya3NwYWNlKG9wdGlvbnM6IENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMgPSB7fSk6IFdvcmtzcGFjZSB7XG4gIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zKTtcbiAgY29uc3Qgc2tpbGxGb2xkZXJzID0gcmVzb2x2ZVNraWxsRm9sZGVycyhvcHRpb25zKTtcbiAgY29uc3QgZm9sZGVyTmFtZXMgPSBPYmplY3Qua2V5cyhza2lsbEZvbGRlcnMpO1xuICBjb25zdCBleHRyYVNraWxsUGF0aHMgPSBvcHRpb25zLmV4dHJhU2tpbGxQYXRocyA/PyBbXTtcbiAgY29uc3QgcmVzb2x2ZXJzID0gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgICBza2lsbEZvbGRlcnMsXG4gICAgWy4uLihvcHRpb25zLm1vdW50cyA/PyBbXSksIC4uLmxvY2FsU2tpbGxNb3VudFJlc29sdmVycyhleHRyYVNraWxsUGF0aHMpXSxcbiAgKTtcbiAgY29uc3QgcmVzb2x2ZUNvbnRyaWJ1dGlvbiA9IGNvbnRyaWJ1dGlvblJlc29sdmVyKHJlc29sdmVycyk7XG4gIGNvbnN0IHNraWxscyA9IG9wdGlvbnMuc2tpbGxzO1xuICBjb25zdCBjaGVja1NraWxsRmlsZU10aW1lID0gb3B0aW9ucy5jaGVja1NraWxsRmlsZU10aW1lID8/IGZhbHNlO1xuICBjb25zdCBibTI1ID0gb3B0aW9ucy5ibTI1ICE9PSBmYWxzZTtcbiAgY29uc3Qgc2FuZGJveCA9IHJlc29sdmVXb3Jrc3BhY2VTYW5kYm94KG9wdGlvbnMuc2FuZGJveCwgaWQsIG5hbWUpO1xuICBsb2dnZXIuZGVidWcoXCJ3b3Jrc3BhY2U6Y3JlYXRlXCIsIHtcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIHJlc29sdmVyQ291bnQ6IHJlc29sdmVycy5sZW5ndGgsXG4gICAgc2tpbGxGb2xkZXJzOiBmb2xkZXJOYW1lcyxcbiAgICBjdXN0b21Nb3VudFJlc29sdmVyczogb3B0aW9ucy5tb3VudHM/Lmxlbmd0aCA/PyAwLFxuICAgIGN1c3RvbVNraWxsc1Jlc29sdmVyOiBCb29sZWFuKG9wdGlvbnMuc2tpbGxzKSxcbiAgICBjaGVja1NraWxsRmlsZU10aW1lLFxuICAgIHdvcmtzcGFjZVNraWxsUmVmcmVzaFR0bE1zOlxuICAgICAgb3B0aW9ucy53b3Jrc3BhY2VTa2lsbFJlZnJlc2hUdGxNcyA/PyBERUZBVUxUX1dPUktTUEFDRV9TS0lMTF9DQUNIRV9UVExfTVMsXG4gICAgYm0yNSxcbiAgICBleHRyYVNraWxsUGF0aHM6IGV4dHJhU2tpbGxQYXRocy5sZW5ndGgsXG4gICAgc2FuZGJveDogc2FuZGJveCA/IHNhbmRib3hOYW1lKG9wdGlvbnMuc2FuZGJveCkgOiBcImRpc2FibGVkXCIsXG4gIH0pO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IG5ldyBXb3Jrc3BhY2Uoe1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogKGNvbnRleHQpID0+IHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKHJlc29sdmVDb250cmlidXRpb24sIGNvbnRleHQpLFxuICAgIC4uLihza2lsbHNcbiAgICAgID8ge1xuICAgICAgICAgIHNraWxscyxcbiAgICAgICAgICBjaGVja1NraWxsRmlsZU10aW1lLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4oc2FuZGJveFxuICAgICAgPyB7XG4gICAgICAgICAgc2FuZGJveCxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IHsgZHluYW1pY1NhbmRib3g6IFwicmVzb2x2ZVwiIGFzIGNvbnN0IH0sXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIGJtMjUsXG4gIH0pO1xuICBpZiAoIW9wdGlvbnMuc2tpbGxzICYmIHJlc29sdmVycy5sZW5ndGggPiAwKSB7XG4gICAgd29ya3NwYWNlQ2F0YWxvZ3VlUmVzb2x2ZXJzLnNldChcbiAgICAgIHdvcmtzcGFjZSxcbiAgICAgIGJ1aWxkU2tpbGxDYXRhbG9ndWVSZXNvbHZlcihyZXNvbHZlQ29udHJpYnV0aW9uLCBvcHRpb25zLndvcmtzcGFjZVNraWxsUmVmcmVzaFR0bE1zKSxcbiAgICApO1xuICB9XG4gIHJldHVybiB3b3Jrc3BhY2U7XG59XG5cbi8qKiBSZXR1cm4gdGhlIGRieC10b29scyBjYXRhbG9ndWUgcmVzb2x2ZXIgYXR0YWNoZWQgdG8gb25lIHdvcmtzcGFjZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3Jrc3BhY2VTa2lsbENhdGFsb2d1ZVJlc29sdmVyKFxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCxcbik6IFNraWxsQ2F0YWxvZ3VlUmVzb2x2ZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gd29ya3NwYWNlID8gd29ya3NwYWNlQ2F0YWxvZ3VlUmVzb2x2ZXJzLmdldCh3b3Jrc3BhY2UpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE1lcmdlIHRoZSBjb25maWd1cmVkIHNraWxsIGZvbGRlcnMgb3ZlciB7QGxpbmsgREVGQVVMVF9TS0lMTF9GT0xERVJTfS5cbiAqXG4gKiBgYXNzaXN0YW50U2tpbGxzOiBmYWxzZWAgZHJvcHMgdGhlIGRlZmF1bHRzLCBhbmQgYSBgZmFsc2VgIHZhbHVlIHJlbW92ZXMgb25lXG4gKiBlbnRyeSBieSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVycyhcbiAgb3B0aW9uczogUGljazxDcmVhdGVXb3Jrc3BhY2VPcHRpb25zLCBcImFzc2lzdGFudFNraWxsc1wiIHwgXCJza2lsbEZvbGRlcnNcIj4gPSB7fSxcbik6IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucz4ge1xuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucz4gPVxuICAgIG9wdGlvbnMuYXNzaXN0YW50U2tpbGxzID09PSBmYWxzZSA/IHt9IDogeyAuLi5ERUZBVUxUX1NLSUxMX0ZPTERFUlMgfTtcbiAgZm9yIChjb25zdCBbbmFtZSwgZm9sZGVyXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zLnNraWxsRm9sZGVycyA/PyB7fSkpIHtcbiAgICBpZiAoZm9sZGVyID09PSBmYWxzZSkge1xuICAgICAgZGVsZXRlIG1lcmdlZFtuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVyZ2VkW25hbWVdID0gZm9sZGVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByaXZhdGUgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VTYW5kYm94KFxuICBzZWxlY3Rpb246IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gfCB1bmRlZmluZWQsXG4gIHdvcmtzcGFjZUlkOiBzdHJpbmcsXG4gIHdvcmtzcGFjZU5hbWU6IHN0cmluZyxcbik6IFdvcmtzcGFjZVNhbmRib3ggfCBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWd1cmVkID0gc2VsZWN0aW9uID8/IFwibW9udHlcIjtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoY29uZmlndXJlZCA9PT0gXCJtb250eVwiKSByZXR1cm4gbmV3IE1vbnR5U2FuZGJveCgpO1xuICBpZiAodHlwZW9mIGNvbmZpZ3VyZWQgPT09IFwiZnVuY3Rpb25cIiB8fCBpc1NhbmRib3goY29uZmlndXJlZCkpIHJldHVybiBjb25maWd1cmVkO1xuXG4gIGNvbnN0IG9wdGlvbnM6IERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyA9XG4gICAgY29uZmlndXJlZCA9PT0gXCJkYXRhYnJpY2tzXCIgPyB7IHByb3ZpZGVyOiBcImRhdGFicmlja3NcIiB9IDogY29uZmlndXJlZDtcbiAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgICBcIkRhdGFicmlja3Mgc2FuZGJveCB1c2VyIGNvbnRleHRcIixcbiAgICAgICAgXCJJbnZva2UgY29tbWFuZCB0b29scyBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBNYXN0cmEgcGx1Z2luLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlndXJlZElkID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLnNhbmRib3hJZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gb3B0aW9ucy5zYW5kYm94SWQoeyByZXF1ZXN0Q29udGV4dCB9KVxuICAgICAgICA6IG9wdGlvbnMuc2FuZGJveElkO1xuICAgIGNvbnN0IHNhbmRib3hJZCA9IGNvbmZpZ3VyZWRJZCA/PyBkZWZhdWx0U2FuZGJveElkKHdvcmtzcGFjZUlkLCB1c2VyLmlkKTtcbiAgICBjb25zdCBjbGllbnQgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMuY2xpZW50ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBvcHRpb25zLmNsaWVudCh7IHJlcXVlc3RDb250ZXh0IH0pXG4gICAgICAgIDogKG9wdGlvbnMuY2xpZW50ID8/IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpKTtcbiAgICBjb25zdCB7XG4gICAgICBwcm92aWRlcjogX3Byb3ZpZGVyLFxuICAgICAgc2FuZGJveElkOiBfc2FuZGJveElkLFxuICAgICAgY2xpZW50OiBfY2xpZW50LFxuICAgICAgLi4uc2FuZGJveE9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcbiAgICByZXR1cm4gbmV3IERhdGFicmlja3NTYW5kYm94KHtcbiAgICAgIC4uLnNhbmRib3hPcHRpb25zLFxuICAgICAgY2xpZW50LFxuICAgICAgc2FuZGJveElkLFxuICAgICAgZGlzcGxheU5hbWU6IG9wdGlvbnMuZGlzcGxheU5hbWUgPz8gYE1hc3RyYSAke3dvcmtzcGFjZU5hbWV9YCxcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFNhbmRib3hJZCh3b3Jrc3BhY2VJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKG9iamVjdC50b1N0YWJsZUtleSh7IHdvcmtzcGFjZUlkLCB1c2VySWQgfSkpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAzMik7XG4gIHJldHVybiBgbWFzdHJhLSR7ZGlnZXN0fWA7XG59XG5cbmZ1bmN0aW9uIGlzU2FuZGJveCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZVNhbmRib3gge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJpZFwiIGluIHZhbHVlICYmIFwicHJvdmlkZXJcIiBpbiB2YWx1ZSAmJiBcInN0YXR1c1wiIGluIHZhbHVlLFxuICApO1xufVxuXG5mdW5jdGlvbiBzYW5kYm94TmFtZShzZWxlY3Rpb246IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoc2VsZWN0aW9uID09PSB1bmRlZmluZWQgfHwgc2VsZWN0aW9uID09PSBcIm1vbnR5XCIpIHJldHVybiBcIm1vbnR5XCI7XG4gIGlmIChzZWxlY3Rpb24gPT09IFwiZGF0YWJyaWNrc1wiKSByZXR1cm4gXCJkYXRhYnJpY2tzXCI7XG4gIGlmIChzZWxlY3Rpb24gPT09IGZhbHNlKSByZXR1cm4gXCJkaXNhYmxlZFwiO1xuICBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gXCJyZXNvbHZlclwiO1xuICByZXR1cm4gaXNTYW5kYm94KHNlbGVjdGlvbikgPyBzZWxlY3Rpb24ucHJvdmlkZXIgOiAoc2VsZWN0aW9uLnByb3ZpZGVyID8/IFwiZGF0YWJyaWNrc1wiKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciB0aGUgcmVxdWVzdCB0b2tlbiBjYXJyaWVzIGEgc2NvcGUgdGhhdCBhbGxvd3Mgd29ya3NwYWNlXG4gKiBmaWxlIEFQSSBhY2Nlc3MgKGB3b3Jrc3BhY2VgIG9yIGBhbGwtYXBpc2Agb24ge0BsaW5rIE1BU1RSQV9TQ09QRVNfS0VZfSkuXG4gKi9cbmZ1bmN0aW9uIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuLmluY2x1ZGVzQWNjZXNzVG9rZW5TY29wZShcbiAgICByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9TQ09QRVNfS0VZKSxcbiAgICBXT1JLU1BBQ0VfRklMRV9TQ09QRVMsXG4gICk7XG59XG5cbi8qKlxuICogTW91bnQgcmVzb2x2ZXIgZm9yIHRoZSBuYW1lZCBza2lsbCBmb2xkZXJzLlxuICpcbiAqIEdhdGVzIG9uIHdvcmtzcGFjZSBmaWxlIHNjb3BlIChvciBkZXZlbG9wbWVudCBtb2RlKSwgdGhlbiBtb3VudHMgZXZlcnlcbiAqIGZvbGRlciB3aG9zZSBsb2NhdGlvbiByZXNvbHZlcyBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJNb3VudHMoXG4gIHNraWxsRm9sZGVyczogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPixcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsU291cmNlczogU2tpbGxDYXRhbG9ndWVTb3VyY2VbXSA9IFtdO1xuICBjb25zdCBza2lsbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBjYWNoZUtleXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY29udGV4dC5yZXF1ZXN0Q29udGV4dDtcblxuICBpZiAoIXJlcXVlc3RDb250ZXh0IHx8ICFzaG91bGRNb3VudFNraWxsRm9sZGVycyhyZXF1ZXN0Q29udGV4dCkpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJza2lsbC1mb2xkZXJzOnNraXBwZWRcIiwge1xuICAgICAgcmVhc29uOiAhcmVxdWVzdENvbnRleHQgPyBcIm5vLXJlcXVlc3QtY29udGV4dFwiIDogXCJtaXNzaW5nLXdvcmtzcGFjZS1zY29wZVwiLFxuICAgICAgbm9kZUVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG4gICAgICBzY29wZXM6IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1NDT1BFU19LRVkpLFxuICAgIH0pO1xuICAgIHJldHVybiB7IG1vdW50cywgc2tpbGxQYXRocyB9O1xuICB9XG5cbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHVzZXI/LmV4ZWN1dGlvbkNvbnRleHQuY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdXNlcktleSA9IHVzZXIgPyByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhvc3QgPSBjbGllbnQgPyAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZm9sZGVyXSBvZiBPYmplY3QuZW50cmllcyhza2lsbEZvbGRlcnMpKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlU2tpbGxGb2xkZXJGaWxlc3lzdGVtKG5hbWUsIGZvbGRlciwgY29udGV4dCwge1xuICAgICAgY2xpZW50LFxuICAgICAgaG9zdCxcbiAgICAgIHVzZXJLZXksXG4gICAgfSk7XG4gICAgaWYgKCFyZXNvbHZlZCkgY29udGludWU7XG4gICAgY29uc3QgbW91bnQgPSBmb2xkZXIubW91bnQgPz8gYC8ke25hbWV9YDtcbiAgICBtb3VudHNbbW91bnRdID0gcmVzb2x2ZWQuZmlsZXN5c3RlbTtcbiAgICBpZiAocmVzb2x2ZWQuY2FjaGVLZXkpIGNhY2hlS2V5cy5wdXNoKHJlc29sdmVkLmNhY2hlS2V5KTtcbiAgICBpZiAoZm9sZGVyLnJlYWRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgc2tpbGxQYXRocy5wdXNoKG1vdW50KTtcbiAgICAgIHNraWxsU291cmNlcy5wdXNoKHsgLi4ucmVzb2x2ZWQuc2tpbGxTb3VyY2UsIGlkOiBvYmplY3QudG9TdGFibGVLZXkoeyBtb3VudCwgc291cmNlOiByZXNvbHZlZC5za2lsbFNvdXJjZS5pZCB9KSB9KTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJza2lsbC1mb2xkZXJzOm1vdW50ZWRcIiwge1xuICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMobW91bnRzKSxcbiAgICBza2lsbFBhdGhzLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG1vdW50cyxcbiAgICBza2lsbFNvdXJjZXMsXG4gICAgc2tpbGxQYXRocyxcbiAgICAuLi4oY2FjaGVLZXlzLmxlbmd0aCA9PT0gT2JqZWN0LmtleXMobW91bnRzKS5sZW5ndGggJiYgY2FjaGVLZXlzLmxlbmd0aCA+IDBcbiAgICAgID8geyBjYWNoZUtleTogb2JqZWN0LnRvU3RhYmxlS2V5KGNhY2hlS2V5cy5zb3J0KCkpIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25lIHNraWxsIGZvbGRlciB0byBhIE1hc3RyYSBmaWxlc3lzdGVtLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGl0XG4gKiBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJGaWxlc3lzdGVtKFxuICBuYW1lOiBzdHJpbmcsXG4gIGZvbGRlcjogU2tpbGxGb2xkZXJPcHRpb25zLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4gIGNhY2hlOiB7XG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG4gICAgaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHVzZXJLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfSxcbik6IFByb21pc2U8XG4gIHwge1xuICAgICAgY2FjaGVLZXk/OiBzdHJpbmc7XG4gICAgICBmaWxlc3lzdGVtOiBXb3Jrc3BhY2VGaWxlc3lzdGVtO1xuICAgICAgc2tpbGxTb3VyY2U6IFNraWxsQ2F0YWxvZ3VlU291cmNlO1xuICAgIH1cbiAgfCB1bmRlZmluZWRcbj4ge1xuICBpZiAoZm9sZGVyLmZpbGVzeXN0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZpbGVzeXN0ZW0gPSBhd2FpdCByZXNvbHZlU2tpbGxGb2xkZXJWYWx1ZShmb2xkZXIuZmlsZXN5c3RlbSwgY29udGV4dCk7XG4gICAgcmV0dXJuIGZpbGVzeXN0ZW1cbiAgICAgID8ge1xuICAgICAgICAgIGZpbGVzeXN0ZW0sXG4gICAgICAgICAgc2tpbGxTb3VyY2U6IG1hc3RyYVNraWxsU291cmNlKFxuICAgICAgICAgICAgb2JqZWN0LnRvU3RhYmxlS2V5KHtcbiAgICAgICAgICAgICAgaWQ6IGZpbGVzeXN0ZW0uaWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBmaWxlc3lzdGVtLnByb3ZpZGVyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmaWxlc3lzdGVtLFxuICAgICAgICAgICksXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG4gIC8vIEEgcGF0aCBtb3VudCBuZWVkcyB0aGUgcmVxdWVzdCdzIE9CTyBjbGllbnQgdG8gcmVhY2ggdGhlIHdvcmtzcGFjZS5cbiAgaWYgKGZvbGRlci5wYXRoID09PSB1bmRlZmluZWQgfHwgIWNhY2hlLmNsaWVudCB8fCAhY2FjaGUuaG9zdCB8fCAhY2FjaGUudXNlcktleSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcjpza2lwcGVkXCIsIHtcbiAgICAgIG5hbWUsXG4gICAgICByZWFzb246IGZvbGRlci5wYXRoID09PSB1bmRlZmluZWQgPyBcIm5vLWxvY2F0aW9uXCIgOiBcIm1pc3Npbmctb2JvLWNsaWVudFwiLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgcm9vdCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoYXdhaXQgcmVzb2x2ZVNraWxsRm9sZGVyVmFsdWUoZm9sZGVyLnBhdGgsIGNvbnRleHQpKTtcbiAgaWYgKCFyb290KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZGF0YWJyaWNrc0ZpbGVzeXN0ZW0oY2FjaGUuY2xpZW50LCByb290LCBmb2xkZXIud3JpdGFibGUgIT09IHRydWUsIHtcbiAgICBob3N0OiBjYWNoZS5ob3N0LFxuICAgIHVzZXJLZXk6IGNhY2hlLnVzZXJLZXksXG4gIH0pO1xufVxuXG4vKiogUmVhZCBhIHtAbGluayBTa2lsbEZvbGRlclZhbHVlfSwgY2FsbGluZyBpdCB3aGVuIGl0IGlzIGEgcGVyLXJlcXVlc3QgcmVzb2x2ZXIuICovXG5mdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJWYWx1ZTxUPihcbiAgdmFsdWU6IFNraWxsRm9sZGVyVmFsdWU8VD4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbik6IFQgfCB1bmRlZmluZWQgfCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyAodmFsdWUgYXMgKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4pKGNvbnRleHQpXG4gICAgOiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBGaWxsIGluIGBpZGAgYW5kIGBuYW1lYCB3aGVuIGVpdGhlciBpcyBvbWl0dGVkIG9uIHtAbGluayBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zfS5cbiAqIFNsdWdpZmllcyBgbmFtZWAgaW50byBgaWRgOyB0b2tlbml6ZXMgYGlkYCBpbnRvIGEgZGlzcGxheSBgbmFtZWAuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zOiBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zKToge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59IHtcbiAgbGV0IGlkID0gb3B0aW9ucy5pZDtcbiAgbGV0IG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIGlmICghaWQpIHtcbiAgICBpZCA9IG5hbWUgPyBzdHJpbmdVdGlscy50b1NsdWcobmFtZSkgOiBcIndvcmtzcGFjZVwiO1xuICB9XG4gIGlmICghbmFtZSkge1xuICAgIG5hbWUgPSBBcnJheS5mcm9tKHN0cmluZ1V0aWxzLnRva2VuaXplKGlkKSkuam9pbihcIiBcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIG5hbWUgfTtcbn1cblxuLyoqIENvbGxlY3QgdGhlIHNraWxsLWZvbGRlciByZXNvbHZlciBhbmQgYW55IGNhbGxlci1zdXBwbGllZCBvbmVzLiAqL1xuZnVuY3Rpb24gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgc2tpbGxGb2xkZXJzOiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnM+LFxuICBtb3VudHM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSB8IHVuZGVmaW5lZCxcbik6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSB7XG4gIGNvbnN0IHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdID0gW107XG4gIGNvbnN0IGZvbGRlckNvdW50ID0gT2JqZWN0LmtleXMoc2tpbGxGb2xkZXJzKS5sZW5ndGg7XG4gIGlmIChmb2xkZXJDb3VudCA+IDApIHtcbiAgICByZXNvbHZlcnMucHVzaCgoY29udGV4dCkgPT4gcmVzb2x2ZVNraWxsRm9sZGVyTW91bnRzKHNraWxsRm9sZGVycywgY29udGV4dCkpO1xuICB9XG4gIGlmIChtb3VudHM/Lmxlbmd0aCkge1xuICAgIHJlc29sdmVycy5wdXNoKC4uLm1vdW50cyk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOnJlc29sdmVyc1wiLCB7XG4gICAgc2tpbGxGb2xkZXJDb3VudDogZm9sZGVyQ291bnQsXG4gICAgY3VzdG9tUmVzb2x2ZXJDb3VudDogbW91bnRzPy5sZW5ndGggPz8gMCxcbiAgICB0b3RhbFJlc29sdmVyQ291bnQ6IHJlc29sdmVycy5sZW5ndGgsXG4gIH0pO1xuICByZXR1cm4gcmVzb2x2ZXJzO1xufVxuXG4vKiogTW91bnQgc3RhcnR1cC1wcm92aXNpb25lZCBsb2NhbCBza2lsbCByb290cyBpbnRvIE1hc3RyYSdzIHdvcmtzcGFjZSBmaWxlc3lzdGVtLiAqL1xuZnVuY3Rpb24gbG9jYWxTa2lsbE1vdW50UmVzb2x2ZXJzKHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSB7XG4gIHJldHVybiBbLi4ubmV3IFNldChwYXRocy5tYXAoKHBhdGgpID0+IHBhdGgudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikpXS5tYXAoKHJvb3QsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgbW91bnQgPSBgL3JlbW90ZS1za2lsbHMvJHtpbmRleH1gO1xuICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBMb2NhbEZpbGVTeXN0ZW0oe1xuICAgICAgcm9vdCxcbiAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gICAgfSk7XG4gICAgY29uc3QgZmlsZXN5c3RlbSA9IGZpbGVzeXN0ZW1zKHNvdXJjZSwgeyByZWFkT25seTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gKCkgPT4gKHtcbiAgICAgIG1vdW50czogeyBbbW91bnRdOiBmaWxlc3lzdGVtIH0sXG4gICAgICBza2lsbFNvdXJjZXM6IFtzaGFyZWRTa2lsbFNvdXJjZShvYmplY3QudG9TdGFibGVLZXkoeyBtb3VudCwgcm9vdCB9KSwgc291cmNlKV0sXG4gICAgICBza2lsbFBhdGhzOiBbbW91bnRdLFxuICAgICAgY2FjaGVLZXk6IG9iamVjdC50b1N0YWJsZUtleSh7IG1vdW50LCByb290IH0pLFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIEFkYXB0IGEgcG9ydGFibGUgZGJ4LXRvb2xzIGZpbGVzeXN0ZW0gdG8gY2F0YWxvZ3VlIGRpc2NvdmVyeSBjYWxsYmFja3MuICovXG5mdW5jdGlvbiBzaGFyZWRTa2lsbFNvdXJjZShpZDogc3RyaW5nLCBmaWxlc3lzdGVtOiBGaWxlU3lzdGVtKTogU2tpbGxDYXRhbG9ndWVTb3VyY2Uge1xuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIGFzeW5jIGxpc3QocGF0aCkge1xuICAgICAgYXdhaXQgZmlsZXN5c3RlbS5pbml0KCk7XG4gICAgICByZXR1cm4gKGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihwYXRoKSkuZmxhdE1hcCgoZW50cnkpID0+XG4gICAgICAgIGVudHJ5LnR5cGUgPT09IFwiZmlsZVwiIHx8IGVudHJ5LnR5cGUgPT09IFwiZGlyZWN0b3J5XCJcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogZW50cnkudHlwZSxcbiAgICAgICAgICAgICAgICAuLi4oZW50cnkuc2l6ZSAhPT0gdW5kZWZpbmVkID8geyBzaXplOiBlbnRyeS5zaXplIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgLi4uKGVudHJ5Lm1ldGFkYXRhID8geyBtZXRhZGF0YTogZW50cnkubWV0YWRhdGEgfSA6IHt9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFzeW5jIHJlYWQocGF0aCkge1xuICAgICAgYXdhaXQgZmlsZXN5c3RlbS5pbml0KCk7XG4gICAgICByZXR1cm4gZmlsZXN5c3RlbS5yZWFkRmlsZShwYXRoLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KTtcbiAgICB9LFxuICB9O1xufVxuXG4vKiogQWRhcHQgYW4gYXJiaXRyYXJ5IE1hc3RyYSBmaWxlc3lzdGVtIHdoZW4gbm8gcG9ydGFibGUgc291cmNlIGlzIGF2YWlsYWJsZS4gKi9cbmZ1bmN0aW9uIG1hc3RyYVNraWxsU291cmNlKGlkOiBzdHJpbmcsIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW0pOiBTa2lsbENhdGFsb2d1ZVNvdXJjZSB7XG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgbGlzdDogKHBhdGgpID0+IGZpbGVzeXN0ZW0ucmVhZGRpcihwYXRoKSxcbiAgICBhc3luYyByZWFkKHBhdGgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgZmlsZXN5c3RlbS5yZWFkRmlsZShwYXRoLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KTtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEdhdGUgc2tpbGwtZm9sZGVyIG1vdW50cyBvbiB0aGUgcmVxdWVzdCdzIHRva2VuLlxuICpcbiAqIEFsd2F5cyBhbGxvd3MgbW91bnRzIGluIGRldmVsb3BtZW50OyBpbiBvdGhlciBlbnZpcm9ubWVudHMgcmVxdWlyZXNcbiAqIHtAbGluayBoYXNXb3Jrc3BhY2VGaWxlU2NvcGV9LlxuICovXG5mdW5jdGlvbiBzaG91bGRNb3VudFNraWxsRm9sZGVycyhyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiBib29sZWFuIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0KTtcbn1cblxuLyoqIFJlYWQgdGhlIHRyaW1tZWQgT0JPIHVzZXIgZW1haWwgc3RhbXBlZCBvbiB7QGxpbmsgTUFTVFJBX1VTRVJfRU1BSUxfS0VZfS4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRFbWFpbChyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSkpID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcmFwIGEge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfSBhcyBhIE1hc3RyYSBmaWxlc3lzdGVtLiBXaGVuIHRoZSByb290IGlzXG4gKiBtaXNzaW5nIChhbmQge0BsaW5rIHJlYWRPbmx5fSBzbyB3ZSB3aWxsIG5vdCBjcmVhdGUgaXQpLCBmYWxsIGJhY2sgdG9cbiAqIHtAbGluayBzY3JhdGNoRmlsZXN5c3RlbX0gc28gc2tpbGwgc2NhbnMgc3RpbGwgaGF2ZSBhIHdyaXRhYmxlIGxvY2FsIG1vdW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBkYXRhYnJpY2tzRmlsZXN5c3RlbShcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHJvb3Q6IHN0cmluZyxcbiAgcmVhZE9ubHk6IGJvb2xlYW4gPSB0cnVlLFxuICBjYWNoZTogeyBob3N0OiBzdHJpbmc7IHVzZXJLZXk6IHN0cmluZyB9LFxuKTogUHJvbWlzZTxcbiAge1xuICAgIGNhY2hlS2V5OiBzdHJpbmc7XG4gICAgZmlsZXN5c3RlbTogV29ya3NwYWNlRmlsZXN5c3RlbTtcbiAgICBza2lsbFNvdXJjZTogU2tpbGxDYXRhbG9ndWVTb3VyY2U7XG4gIH1cbiAgfCB1bmRlZmluZWRcbj4ge1xuICBjb25zdCBmcyA9IG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7XG4gICAgY2xpZW50OiB3b3Jrc3BhY2VDbGllbnQudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoY2xpZW50KSxcbiAgICByb290LFxuICAgIHJlYWRPbmx5LFxuICAgIGNyZWF0ZVJvb3Q6ICFyZWFkT25seSxcbiAgfSk7XG4gIGNvbnN0IGNhY2hlS2V5ID0gb2JqZWN0LnRvU3RhYmxlS2V5KHtcbiAgICBob3N0OiBjYWNoZS5ob3N0LFxuICAgIHJlYWRPbmx5LFxuICAgIHJvb3QsXG4gICAgdXNlcktleTogY2FjaGUudXNlcktleSxcbiAgfSk7XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtcyhmcywgeyByZWFkT25seSB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmaWxlc3lzdGVtLmluaXQoKTtcbiAgICBpZiAoYXdhaXQgZmlsZXN5c3RlbS5leGlzdHMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYWNoZUtleSxcbiAgICAgICAgZmlsZXN5c3RlbSxcbiAgICAgICAgc2tpbGxTb3VyY2U6IHNoYXJlZFNraWxsU291cmNlKGNhY2hlS2V5LCBmcyksXG4gICAgICB9O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZGF0YWJyaWNrcy1tb3VudDpzY3JhdGNoLWZhbGxiYWNrXCIsIHtcbiAgICAgIHJvb3QsXG4gICAgICByZWFkT25seSxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUnVuIGV2ZXJ5IG1vdW50IHJlc29sdmVyIGZvciBvbmUgcmVxdWVzdCBhbmQgbWVyZ2UgbW91bnRzIHBsdXMgc2tpbGwgcGF0aHMuXG4gKiBMYXRlciByZXNvbHZlcnMgb3ZlcndyaXRlIG1vdW50IGtleXMgZnJvbSBlYXJsaWVyIG9uZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24oXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxTb3VyY2VzOiBTa2lsbENhdGFsb2d1ZVNvdXJjZVtdID0gW107XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNhY2hlS2V5czogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGNhY2hlYWJsZSA9IHRydWU7XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIHJlc29sdmVyXSBvZiByZXNvbHZlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgY29udHJpYnV0aW9uID0gYXdhaXQgcmVzb2x2ZXIoY29udGV4dCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHtcbiAgICAgIGluZGV4LFxuICAgICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhjb250cmlidXRpb24ubW91bnRzKSxcbiAgICAgIHNraWxsUGF0aHM6IGNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzID8/IFtdLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24obW91bnRzLCBjb250cmlidXRpb24ubW91bnRzKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoY29udHJpYnV0aW9uLm1vdW50cykubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGNvbnRyaWJ1dGlvbi5jYWNoZUtleSkgY2FjaGVLZXlzLnB1c2goY29udHJpYnV0aW9uLmNhY2hlS2V5KTtcbiAgICAgIGVsc2UgY2FjaGVhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb250cmlidXRpb24uc2tpbGxQYXRocz8ubGVuZ3RoKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uY29udHJpYnV0aW9uLnNraWxsUGF0aHMpO1xuICAgIH1cbiAgICBpZiAoY29udHJpYnV0aW9uLnNraWxsU291cmNlcz8ubGVuZ3RoKSB7XG4gICAgICBza2lsbFNvdXJjZXMucHVzaCguLi5jb250cmlidXRpb24uc2tpbGxTb3VyY2VzKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6bWVyZ2VkXCIsIHtcbiAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKG1vdW50cyksXG4gICAgc2tpbGxQYXRocyxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudHMsXG4gICAgc2tpbGxTb3VyY2VzLFxuICAgIHNraWxsUGF0aHMsXG4gICAgLi4uKGNhY2hlYWJsZSAmJiBjYWNoZUtleXMubGVuZ3RoID4gMFxuICAgICAgPyB7IGNhY2hlS2V5OiBvYmplY3QudG9TdGFibGVLZXkoeyBtb3VudHM6IE9iamVjdC5rZXlzKG1vdW50cyksIHNvdXJjZXM6IGNhY2hlS2V5cyB9KSB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IHdoZW4gYW55IG1vdW50IHJlc29sdmVkOyBvdGhlcndpc2UgYVxuICogZnJlc2gge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfSBzbyBNYXN0cmEgYWx3YXlzIGhhcyBhIHdyaXRhYmxlIGxvY2FsIHJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICByZXNvbHZlQ29udHJpYnV0aW9uOiAoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KSA9PiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPixcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VGaWxlc3lzdGVtPiB7XG4gIGNvbnN0IHsgY2FjaGVLZXksIG1vdW50cyB9ID0gYXdhaXQgcmVzb2x2ZUNvbnRyaWJ1dGlvbihjb250ZXh0KTtcbiAgY29uc3QgbW91bnRLZXlzID0gT2JqZWN0LmtleXMobW91bnRzKTtcbiAgaWYgKG1vdW50S2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJmaWxlc3lzdGVtOnNjcmF0Y2hcIiwge1xuICAgICAgaGFzUmVxdWVzdENvbnRleHQ6IEJvb2xlYW4oY29udGV4dC5yZXF1ZXN0Q29udGV4dCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHNjcmF0Y2hGaWxlc3lzdGVtKCk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpjb21wb3NpdGVcIiwgeyBtb3VudEtleXMgfSk7XG4gIGlmICghY2FjaGVLZXkpIHJldHVybiBuZXcgQ29tcG9zaXRlRmlsZXN5c3RlbSh7IG1vdW50cyB9KTtcbiAgY29uc3QgZXhpc3RpbmcgPSBzY29wZWRXb3Jrc3BhY2VGaWxlc3lzdGVtcy5nZXQoY2FjaGVLZXkpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgY29uc3QgZmlsZXN5c3RlbSA9IG5ldyBDb21wb3NpdGVGaWxlc3lzdGVtKHsgbW91bnRzIH0pO1xuICBzY29wZWRXb3Jrc3BhY2VGaWxlc3lzdGVtcy5zZXQoY2FjaGVLZXksIGZpbGVzeXN0ZW0pO1xuICByZXR1cm4gZmlsZXN5c3RlbTtcbn1cblxuLyoqIE1lbW9pemUgb25lIGNvbXBsZXRlIG1vdW50IGNvbnRyaWJ1dGlvbiBmb3IgZWFjaCByZXF1ZXN0IGNvbnRleHQuICovXG5mdW5jdGlvbiBjb250cmlidXRpb25SZXNvbHZlcihcbiAgcmVzb2x2ZXJzOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10sXG4pOiAoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KSA9PiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IHNjb3BlZCA9IG5ldyBXZWFrTWFwPFJlcXVlc3RDb250ZXh0LCBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPj4oKTtcbiAgbGV0IHVuc2NvcGVkOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIChjb250ZXh0KSA9PiB7XG4gICAgaWYgKCFjb250ZXh0LnJlcXVlc3RDb250ZXh0KSB7XG4gICAgICB1bnNjb3BlZCA/Pz0gcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHVuc2NvcGVkO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9IHNjb3BlZC5nZXQoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgY29uc3QgcGVuZGluZyA9IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgICBzY29wZWQuc2V0KGNvbnRleHQucmVxdWVzdENvbnRleHQsIHBlbmRpbmcpO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufVxuXG4vKiogUmVzb2x2ZSBvbmUgc2VtYW50aWMgY2F0YWxvZ3VlIG93bmVyIGZyb20gYSByZXF1ZXN0J3Mgb3JkZXJlZCBza2lsbCByb290cy4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2tpbGxDYXRhbG9ndWVSZXNvbHZlcihcbiAgcmVzb2x2ZUNvbnRyaWJ1dGlvbjogKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4sXG4gIHR0bE1zOiBudW1iZXIgfCB1bmRlZmluZWQsXG4pOiBTa2lsbENhdGFsb2d1ZVJlc29sdmVyIHtcbiAgcmV0dXJuIGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlQ29udHJpYnV0aW9uKHsgcmVxdWVzdENvbnRleHQgfSk7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNsaWVudCA9IHVzZXI/LmV4ZWN1dGlvbkNvbnRleHQuY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBob3N0ID0gY2xpZW50ID8gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpIDogXCJsb2NhbFwiO1xuICAgIHJldHVybiB3b3Jrc3BhY2VTa2lsbENhdGFsb2d1ZSh7XG4gICAgICBob3N0LFxuICAgICAgc291cmNlczogY29udHJpYnV0aW9uLnNraWxsU291cmNlcyA/PyBbXSxcbiAgICAgIHR0bE1zLFxuICAgICAgdXNlcktleTogdXNlcj8uaWQgPz8gXCJzZXJ2aWNlXCIsXG4gICAgfSk7XG4gIH07XG59XG4iXX0=
|
|
599
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsVUFBVSxJQUFJLGdCQUFnQixHQUcvQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckYsT0FBTyxFQUFFLEVBQUUsSUFBSSxRQUFRLEVBQUUsU0FBUyxFQUF3QixNQUFNLHNCQUFzQixDQUFDO0FBRXZGLE9BQU8sRUFDTCxlQUFlLEVBQ2YsU0FBUyxHQVFWLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsZUFBZSxFQUNmLGNBQWMsR0FFZixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsV0FBVyxFQUNYLDBCQUEwQixFQUMxQixpQkFBaUIsR0FFbEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUEwQyxNQUFNLGNBQWMsQ0FBQztBQUN6RixPQUFPLEVBQUUsMkJBQTJC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SSxRQUF5RCxDQUFDO0lBQzlELE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzVCLFFBQVEsS0FBSyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUQsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELElBQUksUUFBUTtZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFzdHJhIHdvcmtzcGFjZSBmYWN0b3J5IGZvciBEYXRhYnJpY2tzIEFwcHMuXG4gKlxuICogQnVpbGRzIGEge0BsaW5rIFdvcmtzcGFjZX0gd2l0aCBEYXRhYnJpY2tzIFNhbmRib3ggY29tbWFuZCBleGVjdXRpb24sIGFuXG4gKiBpc29sYXRlZCBgL3RtcGAgc2NyYXRjaCBtb3VudCwgYW5kIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IG92ZXIgdGhlXG4gKiBuYW1lZCBza2lsbCBmb2xkZXJzXG4gKiByZXNvbHZlZCBmb3IgdGhhdCByZXF1ZXN0LiBBIHNraWxsIGZvbGRlciBtYXBzIGEgbmFtZSB0byBhIGxvY2F0aW9uIHBsdXMgaXRzXG4gKiByZWFkYWJsZSAvIHdyaXRhYmxlIHBvbGljeTogYSBEYXRhYnJpY2tzIHBhdGggbW91bnRlZCB0aHJvdWdoIHRoZSBPQk8gY2xpZW50XG4gKiBvbiB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSwgb3IgYW55IHtAbGluayBXb3Jrc3BhY2VGaWxlc3lzdGVtfSBhIGNvbnN1bWluZ1xuICogbGlicmFyeSBhbHJlYWR5IG93bnMuIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9IHN1cHBsaWVzIHRoZSBBc3Npc3RhbnRcbiAqIHRyZWVzLCBhbmQgYHNraWxsRm9sZGVyc2AgbWVyZ2VzIG92ZXIgaXQgLSBzYW1lIG5hbWUgb3ZlcnJpZGVzLCBgZmFsc2VgXG4gKiBkaXNhYmxlcywgYSBuZXcgbmFtZSBhZGRzLiBPcHRpb25hbCBtb3VudCByZXNvbHZlcnMgY29udHJpYnV0ZSBmdXJ0aGVyXG4gKiBmaWxlc3lzdGVtcyBhbmQgc2tpbGwgc2NhbiByb290cyBvbiB0b3AuXG4gKlxuICogRGF0YWJyaWNrcyBtb3VudHMgdXNlIGBAZGJ4LXRvb2xzL2RhdGFicmlja3NgIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX1cbiAqIHdyYXBwZWQgYnkge0BsaW5rIGZpbGVzeXN0ZW1zfTsgaW5hY2Nlc3NpYmxlIHJvb3RzIGFyZSBza2lwcGVkIGluZGVwZW5kZW50bHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgY3JlYXRlV29ya3NwYWNlQ2xpZW50LCBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgZmlsZXNDYWNoZSBhcyBmaWxlc0NhY2hlUGx1Z2luLFxuICB0eXBlIEZpbGVzQ2FjaGVFeHBvcnRzLFxuICB0eXBlIEZpbGVzQ2FjaGVTY29wZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L2ZpbGVzLWNhY2hlXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSwgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZnMgYXMgc2hhcmVkRlMsIHBvc2l4UGF0aCwgdHlwZSBGaWxlU3lzdGVtQ2FjaGUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZnNcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgV09SS1NQQUNFX1RPT0xTLFxuICBXb3Jrc3BhY2UsXG4gIHR5cGUgU2tpbGxzUmVzb2x2ZXIsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbiAgdHlwZSBUb29sQ29uZmlnV2l0aEFyZ3NDb250ZXh0LFxuICB0eXBlIFdvcmtzcGFjZVRvb2xDb25maWcsXG4gIHR5cGUgV29ya3NwYWNlVG9vbHNDb25maWcsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvd29ya3NwYWNlXCI7XG5cbmltcG9ydCB7XG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgcmVzb2x2ZVVzZXJLZXksXG4gIHR5cGUgVXNlcixcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICBmaWxlc3lzdGVtcyxcbiAgTW91bnRlZENvbXBvc2l0ZUZpbGVzeXN0ZW0sXG4gIHNjcmF0Y2hGaWxlc3lzdGVtLFxuICB0eXBlIE1hc3RyYUZpbGVTeXN0ZW1BZGFwdGVyT3B0aW9ucyxcbn0gZnJvbSBcIi4vZmlsZXN5c3RlbXMudHNcIjtcbmltcG9ydCB7IE1vbnR5U2FuZGJveCB9IGZyb20gXCIuL21vbnR5LXNhbmRib3gudHNcIjtcbmltcG9ydCB7IERhdGFicmlja3NTYW5kYm94LCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NhbmRib3gudHNcIjtcbmltcG9ydCB7IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCwgcGVyc29uYWxXb3Jrc3BhY2VQYXRoIH0gZnJvbSBcIi4vc2tpbGwtcGF0aHMudHNcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIE9BdXRoIHNjb3BlcyB0aGF0IGdhdGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZmlsZSBtb3VudHMuICovXG5jb25zdCBXT1JLU1BBQ0VfRklMRV9TQ09QRVMgPSBbXCJ3b3Jrc3BhY2VcIiwgXCJ3b3Jrc3BhY2Uud29ya3NwYWNlXCIsIFwiYWxsLWFwaXNcIl0gYXMgY29uc3Q7XG5jb25zdCBTQ1JBVENIX01PVU5UID0gXCIvdG1wXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvd29ya3NwYWNlc1wiKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIFBlci1yZXF1ZXN0IGNvbnRleHQgZm9yIG1vdW50IGFuZCBza2lsbC1mb2xkZXIgcmVzb2x2ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3Jrc3BhY2VNb3VudENvbnRleHQge1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xufVxuXG4vKipcbiAqIEEgc2tpbGwtZm9sZGVyIGZpZWxkIGdpdmVuIGVpdGhlciBkaXJlY3RseSBvciBhcyBhIHBlci1yZXF1ZXN0IHJlc29sdmVyLlxuICogQSByZXNvbHZlciByZXR1cm5pbmcgYHVuZGVmaW5lZGAgc2tpcHMgdGhlIGZvbGRlciBmb3IgdGhhdCByZXF1ZXN0LlxuICovXG5leHBvcnQgdHlwZSBTa2lsbEZvbGRlclZhbHVlPFQ+ID1cbiAgVCB8ICgoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KSA9PiBUIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxUIHwgdW5kZWZpbmVkPik7XG5cbi8qKlxuICogT25lIG5hbWVkIHNraWxsLWZvbGRlciBsb2NhdGlvbiBhbmQgaXRzIHJlYWQgLyB3cml0ZSBwb2xpY3kuXG4gKlxuICogR2l2ZSB7QGxpbmsgcGF0aH0gZm9yIGEgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgdHJlZSAobW91bnRlZCB0aHJvdWdoIHRoZVxuICogcmVxdWVzdCdzIE9CTyBjbGllbnQpLCBvciB7QGxpbmsgZmlsZXN5c3RlbX0gZm9yIGEgbW91bnQgdGhlIGNvbnN1bWVyIGJ1aWxkc1xuICogaXRzZWxmLiB7QGxpbmsgZmlsZXN5c3RlbX0gd2lucyB3aGVuIGJvdGggYXJlIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTa2lsbEZvbGRlck9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2Ugcm9vdCBtb3VudGVkIGF0IGl0cyBhY3R1YWwgcGF0aC4gKi9cbiAgcGF0aD86IFNraWxsRm9sZGVyVmFsdWU8c3RyaW5nPjtcbiAgLyoqIFJlYWR5LW1hZGUgbW91bnQsIGZvciBsb2NhdGlvbnMgdGhlIE9CTyBjbGllbnQgY2Fubm90IHJlYWNoLiAqL1xuICBmaWxlc3lzdGVtPzogU2tpbGxGb2xkZXJWYWx1ZTxXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIEh1bWFuLWZyaWVuZGx5IG1vdW50IG5hbWUgc2hvd24gaW4gZmlsZXN5c3RlbSBsaXN0aW5ncy4gKi9cbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBNb3VudCBkZXNjcmlwdGlvbiBzaG93biBpbiBmaWxlc3lzdGVtIGxpc3RpbmdzIGFuZCB3b3Jrc3BhY2UgaW5zdHJ1Y3Rpb25zLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFNjYW4gdGhpcyBtb3VudCBmb3IgYFNLSUxMLm1kYCBmaWxlcy4gRGVmYXVsdHMgdG8gYHRydWVgOyBgZmFsc2VgIG1vdW50c1xuICAgKiB0aGUgbG9jYXRpb24gZm9yIGZpbGUgdG9vbHMgd2l0aG91dCBhZGRpbmcgaXQgdG8gc2tpbGwgZGlzY292ZXJ5LlxuICAgKi9cbiAgcmVhZGFibGU/OiBib29sZWFuO1xuICAvKipcbiAgICogU2tpbGwgcm9vdHMgcmVsYXRpdmUgdG8gdGhpcyBmaWxlc3lzdGVtIHJvb3QuIERlZmF1bHRzIHRvIGBbXCIuXCJdYC5cbiAgICogRWFjaCBwYXRoIGlzIGpvaW5lZCB0byB0aGUgYWN0dWFsIG1vdW50IHBhdGggYmVmb3JlIE1hc3RyYSBzY2FucyBpdC5cbiAgICovXG4gIHNraWxscz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQWxsb3cgd3JpdGUgYXR0ZW1wdHMgdG8gYSB7QGxpbmsgcGF0aH0gbW91bnQuIERlZmF1bHRzIHRvIGB0cnVlYCBmb3JcbiAgICogYC9Xb3Jrc3BhY2VgIHJvb3RzIGFuZCBgZmFsc2VgIGVsc2V3aGVyZS4gRGF0YWJyaWNrcyBwZXJtaXNzaW9ucyBzdGlsbFxuICAgKiBkZXRlcm1pbmUgd2hldGhlciBlYWNoIG11dGF0aW9uIHN1Y2NlZWRzLlxuICAgKi9cbiAgd3JpdGFibGU/OiBib29sZWFuO1xuICAvKipcbiAgICogQ3JlYXRlIGEgd3JpdGFibGUge0BsaW5rIHBhdGh9IHJvb3Qgd2hlbiBtaXNzaW5nLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgd3JpdGFibGV9OyBzZXQgYGZhbHNlYCBmb3IgcHJlLWV4aXN0aW5nIHJvb3RzIHdpdGggY29uZGl0aW9uYWwgYWNjZXNzLlxuICAgKi9cbiAgY3JlYXRlUm9vdD86IGJvb2xlYW47XG4gIC8qKiBNb3VudCBwb2ludCBpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZS4gRGF0YWJyaWNrcyBwYXRocyBkZWZhdWx0IHRvIHRoZWlyIGFjdHVhbCByb290LiAqL1xuICBtb3VudD86IHN0cmluZztcbn1cblxuLyoqIE1vdW50IG1hcCBwbHVzIG9wdGlvbmFsIE1hc3RyYSBza2lsbCBzY2FuIHJvb3RzIGZvciBvbmUgcmVzb2x2ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIFBhdGhzIHdpdGhpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZSB3aGVyZSBgU0tJTEwubWRgIGZpbGVzIGFyZSBzY2FubmVkLiAqL1xuICBza2lsbFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qKiBDb250cmlidXRlcyBmaWxlc3lzdGVtIG1vdW50cyAoYW5kIG9wdGlvbmFsIHNraWxsIHBhdGhzKSBmb3Igb25lIHJlcXVlc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pID0+IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj47XG5cbi8qKiBOYW1lcyBjYXJyaWVkIGJ5IHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNraWxsRm9sZGVyTmFtZSA9IFwib3JnYW5pemF0aW9uLXNraWxsc1wiIHwgXCJwZXJzb25hbC1za2lsbHNcIjtcblxuLyoqXG4gKiBTYW5kYm94IHNlbGVjdGlvbiBmb3Ige0BsaW5rIGNyZWF0ZVdvcmtzcGFjZX0uIERhdGFicmlja3MgaXMgdGhlIGRlZmF1bHQ7XG4gKiBgZmFsc2VgIGRpc2FibGVzIGNvbW1hbmQgZXhlY3V0aW9uLCBhbmQgYSBNYXN0cmEgcHJvdmlkZXIgb3IgcmVzb2x2ZXIgaXMgYW5cbiAqIGV4cGxpY2l0IHJlcGxhY2VtZW50LlxuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uID1cbiAgfCBmYWxzZVxuICB8IFwiZGF0YWJyaWNrc1wiXG4gIHwgXCJtb250eVwiXG4gIHwgRGF0YWJyaWNrc1dvcmtzcGFjZVNhbmRib3hPcHRpb25zXG4gIHwgV29ya3NwYWNlU2FuZGJveFxuICB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIHtcbiAgLyoqIFdvcmtzcGFjZSBpZDsgZGVyaXZlZCBmcm9tIGBuYW1lYCBvciBgXCJ3b3Jrc3BhY2VcImAgd2hlbiBvbWl0dGVkLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIERpc3BsYXkgbmFtZTsgZGVyaXZlZCBmcm9tIGBpZGAgd2hlbiBvbWl0dGVkLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogU3RhcnQgZnJvbSB7QGxpbmsgREVGQVVMVF9TS0lMTF9GT0xERVJTfS4gRGVmYXVsdHMgdG8gYHRydWVgOyBgZmFsc2VgXG4gICAqIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IG1hcCwgbGVhdmluZyBvbmx5IHRoZSB7QGxpbmsgc2tpbGxGb2xkZXJzfSBnaXZlbiBoZXJlLlxuICAgKi9cbiAgYXNzaXN0YW50U2tpbGxzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE5hbWVkIHNraWxsIGZvbGRlcnMgbWVyZ2VkIG92ZXIge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU306IGEgbWF0Y2hpbmdcbiAgICogbmFtZSBvdmVycmlkZXMgdGhhdCBkZWZhdWx0LCBgZmFsc2VgIGRpc2FibGVzIGl0LCBhbmQgYW55IG90aGVyIG5hbWUgYWRkc1xuICAgKiBhIGZvbGRlci5cbiAgICovXG4gIHNraWxsRm9sZGVycz86IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucyB8IGZhbHNlPjtcbiAgLyoqIEV4dHJhIHBlci1yZXF1ZXN0IG1vdW50IHJlc29sdmVycyAocnVuIGFmdGVyIHRoZSBza2lsbC1mb2xkZXIgbW91bnRzKS4gKi9cbiAgbW91bnRzPzogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdO1xuICAvKiogUmVwbGFjZSB0aGUgYXV0by1idWlsdCBkeW5hbWljIHNraWxscyByZXNvbHZlci4gKi9cbiAgc2tpbGxzPzogU2tpbGxzUmVzb2x2ZXI7XG4gIC8qKiBGb3J3YXJkZWQgdG8gTWFzdHJhIHdoZW4gc2tpbGwgZGlzY292ZXJ5IGlzIGVuYWJsZWQuICovXG4gIGNoZWNrU2tpbGxGaWxlTXRpbWU/OiBib29sZWFuO1xuICAvKiogQWRkaXRpb25hbCBuYXRpdmUgTWFzdHJhIHdvcmtzcGFjZSB0b29sIGNvbmZpZ3VyYXRpb24gYW5kIG92ZXJyaWRlcy4gKi9cbiAgdG9vbHM/OiBXb3Jrc3BhY2VUb29sc0NvbmZpZztcbiAgLyoqIEFwcEtpdCBwbHVnaW4gY29udGV4dCB1c2VkIHRvIGRpc2NvdmVyIG9wdGlvbmFsIHNpYmxpbmcgY2FwYWJpbGl0aWVzLiAqL1xuICBwbHVnaW5Db250ZXh0PzogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2U7XG4gIC8qKiBFbmFibGUgQk0yNSBrZXl3b3JkIHNlYXJjaCBvdmVyIGluZGV4ZWQgd29ya3NwYWNlIGNvbnRlbnQuICovXG4gIGJtMjU/OiBib29sZWFuO1xuICAvKipcbiAgICogQ29tbWFuZCBzYW5kYm94LiBEZWZhdWx0cyB0byBNb250eS4gUGFzcyBgXCJkYXRhYnJpY2tzXCJgIG9yIGFuIG9wdGlvbnNcbiAgICogb2JqZWN0IGZvciBEYXRhYnJpY2tzIFNhbmRib3gsIGBmYWxzZWAgdG8gZGlzYWJsZSBjb21tYW5kIGV4ZWN1dGlvbiwgb3IgYW5cbiAgICogZXhwbGljaXQgTWFzdHJhIHNhbmRib3gvcHJvdmlkZXIgcmVzb2x2ZXIuXG4gICAqL1xuICBzYW5kYm94PzogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIEV4dHJhIExPQ0FMIHNraWxsIHJvb3RzIG1vdW50ZWQgcmVhZC1vbmx5IGZvciBldmVyeSByZXF1ZXN0J3Mgc2tpbGwgZGlzY292ZXJ5LlxuICAgKiBVc2VkIGJ5IHRoZSBwbHVnaW4gdG8gc3VyZmFjZSByZW1vdGUgc2tpbGxzIHByb3Zpc2lvbmVkIHRvIGEgbG9jYWwgdGVtcFxuICAgKiBkaXIgYXQgc3RhcnR1cCAoc2VlIGByZW1vdGUtc2tpbGxzLnRzYCkuIERhdGFicmlja3MtaG9zdGVkIHJlbW90ZSBza2lsbHNcbiAgICogbmVlZCBubyBlbnRyeSBoZXJlIC0gdGhleSBsYW5kIGluIHRoZSBBc3Npc3RhbnQgdHJlZSB0aGUgYnVpbHQtaW4gbW91bnRcbiAgICogYWxyZWFkeSBzY2Fucy5cbiAgICovXG4gIGV4dHJhU2tpbGxQYXRocz86IHN0cmluZ1tdO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlZmF1bHRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgc2tpbGwgZm9sZGVycyBldmVyeSB3b3Jrc3BhY2Ugc3RhcnRzIHdpdGguXG4gKlxuICogLSBgb3JnYW5pemF0aW9uLXNraWxsc2AgLSBgL1dvcmtzcGFjZS8uYXNzaXN0YW50YCB3aXRoIGBza2lsbHNgOyB3cml0ZVxuICogICBhdHRlbXB0cyByZXF1aXJlIGFwcHJvdmFsIGFuZCByZW1haW4gc3ViamVjdCB0byBEYXRhYnJpY2tzIHBlcm1pc3Npb25zLlxuICogLSBgcGVyc29uYWwtc2tpbGxzYCAtIHRoZSByZXF1ZXN0aW5nIHVzZXIncyBgL1dvcmtzcGFjZS9Vc2Vycy88ZW1haWw+YCByb290XG4gKiAgIHdpdGggYC5hc3Npc3RhbnQvc2tpbGxzYCwgd3JpdGFibGUgYW5kIHNraXBwZWQgd2l0aG91dCBhbiBlbWFpbC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0tJTExfRk9MREVSUzogUmVhZG9ubHk8UmVjb3JkPERlZmF1bHRTa2lsbEZvbGRlck5hbWUsIFNraWxsRm9sZGVyT3B0aW9ucz4+ID0ge1xuICBcIm9yZ2FuaXphdGlvbi1za2lsbHNcIjoge1xuICAgIGRlc2NyaXB0aW9uOiBcIk9yZ2FuaXphdGlvbiBza2lsbHMgc2hhcmVkIHdpdGggZXZlcnlvbmUgaW4gdGhpcyBEYXRhYnJpY2tzIHdvcmtzcGFjZS5cIixcbiAgICBkaXNwbGF5TmFtZTogXCJPcmdhbml6YXRpb24gU2tpbGxzXCIsXG4gICAgcGF0aDogT1JHQU5JWkFUSU9OX0FTU0lTVEFOVF9QQVRILFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHNraWxsczogW1wic2tpbGxzXCJdLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNyZWF0ZVJvb3Q6IGZhbHNlLFxuICB9LFxuICBcInBlcnNvbmFsLXNraWxsc1wiOiB7XG4gICAgZGVzY3JpcHRpb246IFwiWW91ciBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob21lIGRpcmVjdG9yeSBmb3IgcGVyc29uYWwgZmlsZXMgYW5kIHNraWxscy5cIixcbiAgICBkaXNwbGF5TmFtZTogXCJIb21lXCIsXG4gICAgcGF0aDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgICAgY29uc3QgZW1haWwgPSByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQpO1xuICAgICAgcmV0dXJuIGVtYWlsID8gcGVyc29uYWxXb3Jrc3BhY2VQYXRoKGVtYWlsKSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHNraWxsczogW1wiLmFzc2lzdGFudC9za2lsbHNcIl0sXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gIH0sXG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgc2tpbGwgZm9sZGVycyBvbmx5XG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKClcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIE92ZXJyaWRlIGEgZGVmYXVsdCwgZHJvcCBhbm90aGVyLCBhbmQgYWRkIGEgbG9jYXRpb24gb2YgeW91ciBvd25cbiAqIGBgYHRzXG4gKiBjcmVhdGVXb3Jrc3BhY2Uoe1xuICogICBza2lsbEZvbGRlcnM6IHtcbiAqICAgICBcIm9yZ2FuaXphdGlvbi1za2lsbHNcIjoge1xuICogICAgICAgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC8uYXNzaXN0YW50XCIsXG4gKiAgICAgICBza2lsbHM6IFtcInNraWxsc1wiXSxcbiAqICAgICB9LFxuICogICAgIFwicGVyc29uYWwtc2tpbGxzXCI6IGZhbHNlLFxuICogICAgIHJ1bmJvb2tzOiB7IHBhdGg6IFwiL1dvcmtzcGFjZS9TaGFyZWQvcnVuYm9va3Mvc2tpbGxzXCIsIHdyaXRhYmxlOiB0cnVlIH0sXG4gKiAgICAgdm9sdW1lOiB7IGZpbGVzeXN0ZW06IG15Vm9sdW1lRmlsZXN5c3RlbSB9LFxuICogICB9LFxuICogfSlcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFNraWxsIGZvbGRlcnMgcGx1cyBhIGN1c3RvbSBtb3VudCByZXNvbHZlclxuICogYGBgdHNcbiAqIGNyZWF0ZVdvcmtzcGFjZSh7XG4gKiAgIG1vdW50czogW1xuICogICAgIGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+ICh7XG4gKiAgICAgICBtb3VudHM6IHsgXCIvZGF0YVwiOiBteUZpbGVzeXN0ZW0gfSxcbiAqICAgICAgIHNraWxsUGF0aHM6IFtdLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV29ya3NwYWNlKG9wdGlvbnM6IENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMgPSB7fSk6IFdvcmtzcGFjZSB7XG4gIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zKTtcbiAgY29uc3Qgc2tpbGxGb2xkZXJzID0gcmVzb2x2ZVNraWxsRm9sZGVycyhvcHRpb25zKTtcbiAgY29uc3QgZm9sZGVyTmFtZXMgPSBPYmplY3Qua2V5cyhza2lsbEZvbGRlcnMpO1xuICBjb25zdCBleHRyYVNraWxsUGF0aHMgPSBvcHRpb25zLmV4dHJhU2tpbGxQYXRocyA/PyBbXTtcbiAgY29uc3QgZmlsZXNDYWNoZSA9IHBsdWdpblJlZ2lzdHJ5Lmluc3RhbmNlKG9wdGlvbnMucGx1Z2luQ29udGV4dCwgZmlsZXNDYWNoZVBsdWdpbik/LmV4cG9ydHMoKTtcbiAgY29uc3QgcmV0YWluRmlsZXN5c3RlbVNvdXJjZSA9XG4gICAgZmlsZXNDYWNoZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgKG9wdGlvbnMubW91bnRzPy5sZW5ndGggPz8gMCkgPT09IDAgJiZcbiAgICBPYmplY3QudmFsdWVzKHNraWxsRm9sZGVycykuZXZlcnkoXG4gICAgICAoZm9sZGVyKSA9PlxuICAgICAgICB0eXBlb2YgZm9sZGVyLmZpbGVzeXN0ZW0gIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAhKHR5cGVvZiBmb2xkZXIucGF0aCA9PT0gXCJmdW5jdGlvblwiICYmIGZvbGRlci5tb3VudCAhPT0gdW5kZWZpbmVkKSxcbiAgICApO1xuICBjb25zdCByZXNvbHZlcnMgPSBidWlsZE1vdW50UmVzb2x2ZXJzKFxuICAgIHNraWxsRm9sZGVycyxcbiAgICBbLi4uKG9wdGlvbnMubW91bnRzID8/IFtdKSwgLi4ubG9jYWxTa2lsbE1vdW50UmVzb2x2ZXJzKGV4dHJhU2tpbGxQYXRocyldLFxuICAgIGZpbGVzQ2FjaGUsXG4gICk7XG4gIGNvbnN0IHJlc29sdmVDb250cmlidXRpb24gPSBjb250cmlidXRpb25SZXNvbHZlcihyZXNvbHZlcnMpO1xuICBjb25zdCByZXNvbHZlRmlsZXN5c3RlbSA9IChjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQpID0+XG4gICAgcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gICAgICByZXNvbHZlQ29udHJpYnV0aW9uLFxuICAgICAgY29udGV4dCxcbiAgICAgIHJldGFpbkZpbGVzeXN0ZW1Tb3VyY2UgPyBmaWxlc0NhY2hlIDogdW5kZWZpbmVkLFxuICAgICk7XG4gIGNvbnN0IHNraWxsczogU2tpbGxzUmVzb2x2ZXIgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IHJlcXVlc3RDb250ZXh0IH07XG4gICAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlQ29udHJpYnV0aW9uKGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gICAgICAgIGF3YWl0IHJlc29sdmVGaWxlc3lzdGVtKGNvbnRleHQpLFxuICAgICAgICBjb250cmlidXRpb24uc2tpbGxQYXRocyA/PyBbXSxcbiAgICAgICk7XG4gICAgfSk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZmFsc2U7XG4gIGNvbnN0IGJtMjUgPSBvcHRpb25zLmJtMjUgIT09IGZhbHNlO1xuICBjb25zdCBzYW5kYm94ID0gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3gob3B0aW9ucy5zYW5kYm94LCBpZCwgbmFtZSk7XG4gIGNvbnN0IHRvb2xzID0gd29ya3NwYWNlVG9vbHMob3B0aW9ucy50b29scyk7XG4gIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZTpjcmVhdGVcIiwge1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgcmVzb2x2ZXJDb3VudDogcmVzb2x2ZXJzLmxlbmd0aCxcbiAgICBza2lsbEZvbGRlcnM6IGZvbGRlck5hbWVzLFxuICAgIGN1c3RvbU1vdW50UmVzb2x2ZXJzOiBvcHRpb25zLm1vdW50cz8ubGVuZ3RoID8/IDAsXG4gICAgY3VzdG9tU2tpbGxzUmVzb2x2ZXI6IEJvb2xlYW4ob3B0aW9ucy5za2lsbHMpLFxuICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgYm0yNSxcbiAgICBleHRyYVNraWxsUGF0aHM6IGV4dHJhU2tpbGxQYXRocy5sZW5ndGgsXG4gICAgc2FuZGJveDogc2FuZGJveCA/IHNhbmRib3hOYW1lKG9wdGlvbnMuc2FuZGJveCkgOiBcImRpc2FibGVkXCIsXG4gIH0pO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IG5ldyBXb3Jrc3BhY2Uoe1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogcmVzb2x2ZUZpbGVzeXN0ZW0sXG4gICAgLi4uKHJlc29sdmVycy5sZW5ndGggPiAwIHx8IG9wdGlvbnMuc2tpbGxzXG4gICAgICA/IHtcbiAgICAgICAgICBza2lsbHMsXG4gICAgICAgICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHNhbmRib3hcbiAgICAgID8ge1xuICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiB7IGR5bmFtaWNTYW5kYm94OiBcInJlc29sdmVcIiBhcyBjb25zdCB9LFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBibTI1LFxuICAgIHRvb2xzLFxuICB9KTtcbiAgcmV0dXJuIHdvcmtzcGFjZTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0aGUgY29uZmlndXJlZCBza2lsbCBmb2xkZXJzIG92ZXIge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU30uXG4gKlxuICogYGFzc2lzdGFudFNraWxsczogZmFsc2VgIGRyb3BzIHRoZSBkZWZhdWx0cywgYW5kIGEgYGZhbHNlYCB2YWx1ZSByZW1vdmVzIG9uZVxuICogZW50cnkgYnkgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlcnMoXG4gIG9wdGlvbnM6IFBpY2s8Q3JlYXRlV29ya3NwYWNlT3B0aW9ucywgXCJhc3Npc3RhbnRTa2lsbHNcIiB8IFwic2tpbGxGb2xkZXJzXCI+ID0ge30sXG4pOiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnM+IHtcbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnM+ID1cbiAgICBvcHRpb25zLmFzc2lzdGFudFNraWxscyA9PT0gZmFsc2UgPyB7fSA6IHsgLi4uREVGQVVMVF9TS0lMTF9GT0xERVJTIH07XG4gIGZvciAoY29uc3QgW25hbWUsIGZvbGRlcl0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5za2lsbEZvbGRlcnMgPz8ge30pKSB7XG4gICAgaWYgKGZvbGRlciA9PT0gZmFsc2UpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWRbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlZFtuYW1lXSA9IGZvbGRlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcml2YXRlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogUmVxdWlyZSBhcHByb3ZhbCB1bmxlc3MgYSBmaWxlc3lzdGVtIG11dGF0aW9uIHN0YXlzIGluc2lkZSBhIHVzZXItb3duZWQgd3JpdGFibGUgcm9vdC4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVBcHByb3ZhbE91dHNpZGVXcml0YWJsZVJvb3RzKHtcbiAgYXJncyxcbiAgcmVxdWVzdENvbnRleHQsXG59OiBUb29sQ29uZmlnV2l0aEFyZ3NDb250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGlucHV0UGF0aCA9IGFyZ3MucGF0aDtcbiAgaWYgKHR5cGVvZiBpbnB1dFBhdGggIT09IFwic3RyaW5nXCIgfHwgIXBvc2l4UGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aCkpIHJldHVybiB0cnVlO1xuICBjb25zdCBub3JtYWxpemVkID0gcG9zaXhQYXRoLm5vcm1hbGl6ZShpbnB1dFBhdGgpO1xuICBpZiAoIW5vcm1hbGl6ZWQub2spIHJldHVybiB0cnVlO1xuICBpZiAocG9zaXhQYXRoLmlzV2l0aGluUm9vdChTQ1JBVENIX01PVU5ULCBub3JtYWxpemVkLnBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGVtYWlsVmFsdWUgPSByZXF1ZXN0Q29udGV4dFtNQVNUUkFfVVNFUl9FTUFJTF9LRVldO1xuICBjb25zdCBlbWFpbCA9IHR5cGVvZiBlbWFpbFZhbHVlID09PSBcInN0cmluZ1wiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChlbWFpbFZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFlbWFpbCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhcG9zaXhQYXRoLmlzV2l0aGluUm9vdChwZXJzb25hbFdvcmtzcGFjZVBhdGgoZW1haWwpLCBub3JtYWxpemVkLnBhdGgpO1xufVxuXG5mdW5jdGlvbiB3b3Jrc3BhY2VUb29scyhjb25maWd1cmVkOiBXb3Jrc3BhY2VUb29sc0NvbmZpZyB8IHVuZGVmaW5lZCk6IFdvcmtzcGFjZVRvb2xzQ29uZmlnIHtcbiAgY29uc3QgcmVxdWlyZUFwcHJvdmFsOiBXb3Jrc3BhY2VUb29sQ29uZmlnID1cbiAgICBjb25maWd1cmVkPy5yZXF1aXJlQXBwcm92YWwgPT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHJlcXVpcmVBcHByb3ZhbDogcmVxdWlyZUFwcHJvdmFsT3V0c2lkZVdyaXRhYmxlUm9vdHMgfVxuICAgICAgOiB7fTtcbiAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgW1dPUktTUEFDRV9UT09MUy5GSUxFU1lTVEVNLldSSVRFX0ZJTEVdOiByZXF1aXJlQXBwcm92YWwsXG4gICAgW1dPUktTUEFDRV9UT09MUy5GSUxFU1lTVEVNLkVESVRfRklMRV06IHJlcXVpcmVBcHByb3ZhbCxcbiAgICBbV09SS1NQQUNFX1RPT0xTLkZJTEVTWVNURU0uQVNUX0VESVRdOiByZXF1aXJlQXBwcm92YWwsXG4gICAgW1dPUktTUEFDRV9UT09MUy5GSUxFU1lTVEVNLkRFTEVURV06IHJlcXVpcmVBcHByb3ZhbCxcbiAgICBbV09SS1NQQUNFX1RPT0xTLkZJTEVTWVNURU0uTUtESVJdOiByZXF1aXJlQXBwcm92YWwsXG4gIH0gc2F0aXNmaWVzIFdvcmtzcGFjZVRvb2xzQ29uZmlnO1xuICBjb25zdCBjb25maWd1cmVkVG9vbHMgPSBjb25maWd1cmVkIGFzXG4gICAgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgV29ya3NwYWNlVG9vbENvbmZpZyB8IHVuZGVmaW5lZD4+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBtZXJnZWRUb29scyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhkZWZhdWx0cykubWFwKChbbmFtZSwgZGVmYXVsdENvbmZpZ10pID0+IFtcbiAgICAgIG5hbWUsXG4gICAgICB7IC4uLmRlZmF1bHRDb25maWcsIC4uLmNvbmZpZ3VyZWRUb29scz8uW25hbWVdIH0sXG4gICAgXSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4uZGVmYXVsdHMsXG4gICAgLi4uY29uZmlndXJlZCxcbiAgICAuLi5tZXJnZWRUb29scyxcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VTYW5kYm94KFxuICBzZWxlY3Rpb246IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gfCB1bmRlZmluZWQsXG4gIHdvcmtzcGFjZUlkOiBzdHJpbmcsXG4gIHdvcmtzcGFjZU5hbWU6IHN0cmluZyxcbik6IFdvcmtzcGFjZVNhbmRib3ggfCBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWd1cmVkID0gc2VsZWN0aW9uID8/IFwibW9udHlcIjtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoY29uZmlndXJlZCA9PT0gXCJtb250eVwiKSByZXR1cm4gbmV3IE1vbnR5U2FuZGJveCgpO1xuICBpZiAodHlwZW9mIGNvbmZpZ3VyZWQgPT09IFwiZnVuY3Rpb25cIiB8fCBpc1NhbmRib3goY29uZmlndXJlZCkpIHJldHVybiBjb25maWd1cmVkO1xuXG4gIGNvbnN0IG9wdGlvbnM6IERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyA9XG4gICAgY29uZmlndXJlZCA9PT0gXCJkYXRhYnJpY2tzXCIgPyB7IHByb3ZpZGVyOiBcImRhdGFicmlja3NcIiB9IDogY29uZmlndXJlZDtcbiAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgICBcIkRhdGFicmlja3Mgc2FuZGJveCB1c2VyIGNvbnRleHRcIixcbiAgICAgICAgXCJJbnZva2UgY29tbWFuZCB0b29scyBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBNYXN0cmEgcGx1Z2luLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlndXJlZElkID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLnNhbmRib3hJZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gb3B0aW9ucy5zYW5kYm94SWQoeyByZXF1ZXN0Q29udGV4dCB9KVxuICAgICAgICA6IG9wdGlvbnMuc2FuZGJveElkO1xuICAgIGNvbnN0IHNhbmRib3hJZCA9IGNvbmZpZ3VyZWRJZCA/PyBkZWZhdWx0U2FuZGJveElkKHdvcmtzcGFjZUlkLCB1c2VyLmlkKTtcbiAgICBjb25zdCBjbGllbnQgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMuY2xpZW50ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBvcHRpb25zLmNsaWVudCh7IHJlcXVlc3RDb250ZXh0IH0pXG4gICAgICAgIDogKG9wdGlvbnMuY2xpZW50ID8/IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpKTtcbiAgICBjb25zdCB7XG4gICAgICBwcm92aWRlcjogX3Byb3ZpZGVyLFxuICAgICAgc2FuZGJveElkOiBfc2FuZGJveElkLFxuICAgICAgY2xpZW50OiBfY2xpZW50LFxuICAgICAgLi4uc2FuZGJveE9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcbiAgICByZXR1cm4gbmV3IERhdGFicmlja3NTYW5kYm94KHtcbiAgICAgIC4uLnNhbmRib3hPcHRpb25zLFxuICAgICAgY2xpZW50LFxuICAgICAgc2FuZGJveElkLFxuICAgICAgZGlzcGxheU5hbWU6IG9wdGlvbnMuZGlzcGxheU5hbWUgPz8gYE1hc3RyYSAke3dvcmtzcGFjZU5hbWV9YCxcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFNhbmRib3hJZCh3b3Jrc3BhY2VJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKG9iamVjdC50b1N0YWJsZUtleSh7IHdvcmtzcGFjZUlkLCB1c2VySWQgfSkpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAzMik7XG4gIHJldHVybiBgbWFzdHJhLSR7ZGlnZXN0fWA7XG59XG5cbmZ1bmN0aW9uIGlzU2FuZGJveCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZVNhbmRib3gge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJpZFwiIGluIHZhbHVlICYmIFwicHJvdmlkZXJcIiBpbiB2YWx1ZSAmJiBcInN0YXR1c1wiIGluIHZhbHVlLFxuICApO1xufVxuXG5mdW5jdGlvbiBzYW5kYm94TmFtZShzZWxlY3Rpb246IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoc2VsZWN0aW9uID09PSB1bmRlZmluZWQgfHwgc2VsZWN0aW9uID09PSBcIm1vbnR5XCIpIHJldHVybiBcIm1vbnR5XCI7XG4gIGlmIChzZWxlY3Rpb24gPT09IFwiZGF0YWJyaWNrc1wiKSByZXR1cm4gXCJkYXRhYnJpY2tzXCI7XG4gIGlmIChzZWxlY3Rpb24gPT09IGZhbHNlKSByZXR1cm4gXCJkaXNhYmxlZFwiO1xuICBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gXCJyZXNvbHZlclwiO1xuICByZXR1cm4gaXNTYW5kYm94KHNlbGVjdGlvbikgPyBzZWxlY3Rpb24ucHJvdmlkZXIgOiAoc2VsZWN0aW9uLnByb3ZpZGVyID8/IFwiZGF0YWJyaWNrc1wiKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciB0aGUgcmVxdWVzdCB0b2tlbiBjYXJyaWVzIGEgc2NvcGUgdGhhdCBhbGxvd3Mgd29ya3NwYWNlXG4gKiBmaWxlIEFQSSBhY2Nlc3MgKGB3b3Jrc3BhY2VgIG9yIGBhbGwtYXBpc2Agb24ge0BsaW5rIE1BU1RSQV9TQ09QRVNfS0VZfSkuXG4gKi9cbmZ1bmN0aW9uIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuLmluY2x1ZGVzQWNjZXNzVG9rZW5TY29wZShcbiAgICByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9TQ09QRVNfS0VZKSxcbiAgICBXT1JLU1BBQ0VfRklMRV9TQ09QRVMsXG4gICk7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSByZXF1ZXN0IGNsaWVudCBhbmQgYXV0aG9yaXphdGlvbi1zYWZlIGZpbGVzLWNhY2hlIHNjb3BlLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZpbGVzQ2FjaGVTY29wZShjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQpOiBQcm9taXNlPFxuICB8IHtcbiAgICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICAgICAgc2NvcGU6IEZpbGVzQ2FjaGVTY29wZTtcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjb250ZXh0LnJlcXVlc3RDb250ZXh0O1xuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHVzZXI/LmV4ZWN1dGlvbkNvbnRleHQuY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCB8fCAhdXNlciB8fCAhY2xpZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGNsaWVudCxcbiAgICBzY29wZToge1xuICAgICAgaG9zdDogKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpLFxuICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpLFxuICAgICAgLi4uKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfV09SS1NQQUNFX0lEPy50cmltKClcbiAgICAgICAgPyB7IHdvcmtzcGFjZUlkOiBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1dPUktTUEFDRV9JRC50cmltKCkgfVxuICAgICAgICA6IHt9KSxcbiAgICB9LFxuICB9O1xufVxuXG4vKiogSm9pbiBvbmUgcmVsYXRpdmUgc2tpbGwgcm9vdCB0byBpdHMgYWN0dWFsIGNvbXBvc2l0ZSBtb3VudCBwYXRoLiAqL1xuZnVuY3Rpb24gbW91bnRlZFNraWxsUGF0aChtb3VudDogc3RyaW5nLCBza2lsbFJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwb3NpeFBhdGguaXNBYnNvbHV0ZShza2lsbFJvb3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU2tpbGwgcGF0aCBtdXN0IGJlIHJlbGF0aXZlIHRvIGl0cyBtb3VudDogJHtza2lsbFJvb3R9YCk7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBvc2l4UGF0aC5ub3JtYWxpemUoc2tpbGxSb290KTtcbiAgaWYgKCFub3JtYWxpemVkLm9rKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU2tpbGwgcGF0aCBlc2NhcGVzIGl0cyBtb3VudDogJHtza2lsbFJvb3R9YCk7XG4gIH1cbiAgcmV0dXJuIHBvc2l4UGF0aC5qb2luKHBvc2l4UGF0aC5ub3JtYWxpemVSb290KG1vdW50KSwgbm9ybWFsaXplZC5wYXRoLnNsaWNlKDEpKTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGEgRGF0YWJyaWNrcyBwYXRoIGJlbG9uZ3MgdG8gdGhlIHdyaXRhYmxlIFdvcmtzcGFjZSBuYW1lc3BhY2UuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVJvb3Qocm9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChyb290KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPT09IFwiL1dvcmtzcGFjZVwiIHx8IG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcIi9Xb3Jrc3BhY2UvXCIpO1xufVxuXG4vKipcbiAqIE1vdW50IHJlc29sdmVyIGZvciB0aGUgbmFtZWQgc2tpbGwgZm9sZGVycy5cbiAqXG4gKiBHYXRlcyBvbiB3b3Jrc3BhY2UgZmlsZSBzY29wZSAob3IgZGV2ZWxvcG1lbnQgbW9kZSksIHRoZW4gbW91bnRzIGV2ZXJ5XG4gKiBmb2xkZXIgd2hvc2UgbG9jYXRpb24gcmVzb2x2ZXMgZm9yIHRoaXMgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyTW91bnRzKFxuICBza2lsbEZvbGRlcnM6IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucz4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjb250ZXh0LnJlcXVlc3RDb250ZXh0O1xuXG4gIGlmICghcmVxdWVzdENvbnRleHQgfHwgIXNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0KSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6c2tpcHBlZFwiLCB7XG4gICAgICByZWFzb246ICFyZXF1ZXN0Q29udGV4dCA/IFwibm8tcmVxdWVzdC1jb250ZXh0XCIgOiBcIm1pc3Npbmctd29ya3NwYWNlLXNjb3BlXCIsXG4gICAgICBub2RlRW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcbiAgICAgIHNjb3BlczogcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfU0NPUEVTX0tFWSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgbW91bnRzLCBza2lsbFBhdGhzIH07XG4gIH1cblxuICBjb25zdCBzY29wZWQgPSBhd2FpdCByZXNvbHZlRmlsZXNDYWNoZVNjb3BlKGNvbnRleHQpO1xuICBjb25zdCBjbGllbnQgPSBzY29wZWQ/LmNsaWVudDtcbiAgY29uc3QgZmlsZVN5c3RlbUNhY2hlID1cbiAgICBmaWxlc0NhY2hlICYmIHNjb3BlZCA/IGF3YWl0IGZpbGVzQ2FjaGUuZm9yU2NvcGUoc2NvcGVkLnNjb3BlKSA6IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBmb2xkZXJdIG9mIE9iamVjdC5lbnRyaWVzKHNraWxsRm9sZGVycykpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0obmFtZSwgZm9sZGVyLCBjb250ZXh0LCB7XG4gICAgICBjbGllbnQsXG4gICAgICBmaWxlU3lzdGVtQ2FjaGUsXG4gICAgfSk7XG4gICAgaWYgKCFyZXNvbHZlZCkgY29udGludWU7XG4gICAgY29uc3QgbW91bnQgPSBmb2xkZXIubW91bnQgPz8gcmVzb2x2ZWQucm9vdCA/PyBgLyR7bmFtZX1gO1xuICAgIG1vdW50c1ttb3VudF0gPSByZXNvbHZlZC5maWxlc3lzdGVtO1xuICAgIGlmIChmb2xkZXIucmVhZGFibGUgIT09IGZhbHNlKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uKGZvbGRlci5za2lsbHMgPz8gW1wiLlwiXSkubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKG1vdW50LCBwYXRoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbW91bnRzLFxuICAgIHNraWxsUGF0aHMsXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvbmUgc2tpbGwgZm9sZGVyIHRvIGEgTWFzdHJhIGZpbGVzeXN0ZW0sIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgaXRcbiAqIGZvciB0aGlzIHJlcXVlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm9sZGVyOiBTa2lsbEZvbGRlck9wdGlvbnMsXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbiAgY2FjaGU6IHtcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgICBmaWxlU3lzdGVtQ2FjaGU6IEZpbGVTeXN0ZW1DYWNoZSB8IHVuZGVmaW5lZDtcbiAgfSxcbik6IFByb21pc2U8XG4gIHwge1xuICAgICAgZmlsZXN5c3RlbTogV29ya3NwYWNlRmlsZXN5c3RlbTtcbiAgICAgIHJvb3Q/OiBzdHJpbmc7XG4gICAgfVxuICB8IHVuZGVmaW5lZFxuPiB7XG4gIGlmIChmb2xkZXIuZmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZmlsZXN5c3RlbSA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlclZhbHVlKGZvbGRlci5maWxlc3lzdGVtLCBjb250ZXh0KTtcbiAgICByZXR1cm4gZmlsZXN5c3RlbVxuICAgICAgPyB7XG4gICAgICAgICAgZmlsZXN5c3RlbSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gQSBwYXRoIG1vdW50IG5lZWRzIHRoZSByZXF1ZXN0J3MgT0JPIGNsaWVudCB0byByZWFjaCB0aGUgd29ya3NwYWNlLlxuICBpZiAoZm9sZGVyLnBhdGggPT09IHVuZGVmaW5lZCB8fCAhY2FjaGUuY2xpZW50KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGwtZm9sZGVyOnNraXBwZWRcIiwge1xuICAgICAgbmFtZSxcbiAgICAgIHJlYXNvbjogZm9sZGVyLnBhdGggPT09IHVuZGVmaW5lZCA/IFwibm8tbG9jYXRpb25cIiA6IFwibWlzc2luZy1vYm8tY2xpZW50XCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByb290ID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChhd2FpdCByZXNvbHZlU2tpbGxGb2xkZXJWYWx1ZShmb2xkZXIucGF0aCwgY29udGV4dCkpO1xuICBpZiAoIXJvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdyaXRhYmxlID0gZm9sZGVyLndyaXRhYmxlID8/IGlzV29ya3NwYWNlUm9vdChyb290KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBkYXRhYnJpY2tzRmlsZXN5c3RlbShcbiAgICBjYWNoZS5jbGllbnQsXG4gICAgcm9vdCxcbiAgICAhd3JpdGFibGUsXG4gICAgZm9sZGVyLmNyZWF0ZVJvb3QgPz8gZm9sZGVyLndyaXRhYmxlID09PSB0cnVlLFxuICAgIGNhY2hlLmZpbGVTeXN0ZW1DYWNoZSxcbiAgICBmb2xkZXIucmVhZGFibGUgPT09IGZhbHNlID8gW10gOiAoZm9sZGVyLnNraWxscyA/PyBbXCIuXCJdKSxcbiAgICB7XG4gICAgICAuLi4oZm9sZGVyLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZm9sZGVyLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi4oZm9sZGVyLmRpc3BsYXlOYW1lID8geyBkaXNwbGF5TmFtZTogZm9sZGVyLmRpc3BsYXlOYW1lIH0gOiB7fSksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIHJlc29sdmVkID8geyAuLi5yZXNvbHZlZCwgcm9vdCB9IDogdW5kZWZpbmVkO1xufVxuXG4vKiogUmVhZCBhIHtAbGluayBTa2lsbEZvbGRlclZhbHVlfSwgY2FsbGluZyBpdCB3aGVuIGl0IGlzIGEgcGVyLXJlcXVlc3QgcmVzb2x2ZXIuICovXG5mdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJWYWx1ZTxUPihcbiAgdmFsdWU6IFNraWxsRm9sZGVyVmFsdWU8VD4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbik6IFQgfCB1bmRlZmluZWQgfCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyAodmFsdWUgYXMgKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4pKGNvbnRleHQpXG4gICAgOiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBGaWxsIGluIGBpZGAgYW5kIGBuYW1lYCB3aGVuIGVpdGhlciBpcyBvbWl0dGVkIG9uIHtAbGluayBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zfS5cbiAqIFNsdWdpZmllcyBgbmFtZWAgaW50byBgaWRgOyB0b2tlbml6ZXMgYGlkYCBpbnRvIGEgZGlzcGxheSBgbmFtZWAuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zOiBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zKToge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59IHtcbiAgbGV0IGlkID0gb3B0aW9ucy5pZDtcbiAgbGV0IG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIGlmICghaWQpIHtcbiAgICBpZCA9IG5hbWUgPyBzdHJpbmdVdGlscy50b1NsdWcobmFtZSkgOiBcIndvcmtzcGFjZVwiO1xuICB9XG4gIGlmICghbmFtZSkge1xuICAgIG5hbWUgPSBBcnJheS5mcm9tKHN0cmluZ1V0aWxzLnRva2VuaXplKGlkKSkuam9pbihcIiBcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIG5hbWUgfTtcbn1cblxuLyoqIENvbGxlY3QgdGhlIHNraWxsLWZvbGRlciByZXNvbHZlciBhbmQgYW55IGNhbGxlci1zdXBwbGllZCBvbmVzLiAqL1xuZnVuY3Rpb24gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgc2tpbGxGb2xkZXJzOiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnM+LFxuICBtb3VudHM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSB8IHVuZGVmaW5lZCxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtzY3JhdGNoTW91bnRSZXNvbHZlcigpXTtcbiAgY29uc3QgZm9sZGVyQ291bnQgPSBPYmplY3Qua2V5cyhza2lsbEZvbGRlcnMpLmxlbmd0aDtcbiAgaWYgKGZvbGRlckNvdW50ID4gMCkge1xuICAgIHJlc29sdmVycy5wdXNoKChjb250ZXh0KSA9PiByZXNvbHZlU2tpbGxGb2xkZXJNb3VudHMoc2tpbGxGb2xkZXJzLCBjb250ZXh0LCBmaWxlc0NhY2hlKSk7XG4gIH1cbiAgaWYgKG1vdW50cz8ubGVuZ3RoKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goLi4ubW91bnRzKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJzXCIsIHtcbiAgICBza2lsbEZvbGRlckNvdW50OiBmb2xkZXJDb3VudCxcbiAgICBjdXN0b21SZXNvbHZlckNvdW50OiBtb3VudHM/Lmxlbmd0aCA/PyAwLFxuICAgIHRvdGFsUmVzb2x2ZXJDb3VudDogcmVzb2x2ZXJzLmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiByZXNvbHZlcnM7XG59XG5cbi8qKiBDb250cmlidXRlIG9uZSBpc29sYXRlZCBsb2NhbCBzY3JhdGNoIGZpbGVzeXN0ZW0gYXQgYC90bXBgLiAqL1xuZnVuY3Rpb24gc2NyYXRjaE1vdW50UmVzb2x2ZXIoKTogV29ya3NwYWNlTW91bnRSZXNvbHZlciB7XG4gIHJldHVybiAoKSA9PiAoe1xuICAgIG1vdW50czogeyBbU0NSQVRDSF9NT1VOVF06IHNjcmF0Y2hGaWxlc3lzdGVtKCkgfSxcbiAgfSk7XG59XG5cbi8qKiBNb3VudCBzdGFydHVwLXByb3Zpc2lvbmVkIGxvY2FsIHNraWxsIHJvb3RzIGludG8gTWFzdHJhJ3Mgd29ya3NwYWNlIGZpbGVzeXN0ZW0uICovXG5mdW5jdGlvbiBsb2NhbFNraWxsTW91bnRSZXNvbHZlcnMocGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KHBhdGhzLm1hcCgocGF0aCkgPT4gcGF0aC50cmltKCkpLmZpbHRlcihCb29sZWFuKSldLm1hcCgocm9vdCkgPT4ge1xuICAgIGNvbnN0IG1vdW50ID0gcG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qocm9vdCk7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICBjcmVhdGVSb290OiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlc3lzdGVtID0gZmlsZXN5c3RlbXMoc291cmNlLCB7IHJlYWRPbmx5OiB0cnVlIH0pO1xuICAgIHJldHVybiAoKSA9PiAoe1xuICAgICAgbW91bnRzOiB7IFttb3VudF06IGZpbGVzeXN0ZW0gfSxcbiAgICAgIHNraWxsUGF0aHM6IFttb3VudF0sXG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdhdGUgc2tpbGwtZm9sZGVyIG1vdW50cyBvbiB0aGUgcmVxdWVzdCdzIHRva2VuLlxuICpcbiAqIEFsd2F5cyBhbGxvd3MgbW91bnRzIGluIGRldmVsb3BtZW50OyBpbiBvdGhlciBlbnZpcm9ubWVudHMgcmVxdWlyZXNcbiAqIHtAbGluayBoYXNXb3Jrc3BhY2VGaWxlU2NvcGV9LlxuICovXG5mdW5jdGlvbiBzaG91bGRNb3VudFNraWxsRm9sZGVycyhyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiBib29sZWFuIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0KTtcbn1cblxuLyoqIFJlYWQgdGhlIHRyaW1tZWQgT0JPIHVzZXIgZW1haWwgc3RhbXBlZCBvbiB7QGxpbmsgTUFTVFJBX1VTRVJfRU1BSUxfS0VZfS4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRFbWFpbChyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSkpID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcmFwIGEge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfSBhcyBhIE1hc3RyYSBmaWxlc3lzdGVtLiBNaXNzaW5nIG9yXG4gKiBpbmFjY2Vzc2libGUgcm9vdHMgcmV0dXJuIGB1bmRlZmluZWRgIHNvIHRoZSBpbmRlcGVuZGVudCBgL3RtcGAgbW91bnQgYW5kXG4gKiBhbnkgb3RoZXIgYWNjZXNzaWJsZSByb290cyByZW1haW4gdXNhYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkYXRhYnJpY2tzRmlsZXN5c3RlbShcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHJvb3Q6IHN0cmluZyxcbiAgcmVhZE9ubHk6IGJvb2xlYW4gPSB0cnVlLFxuICBjcmVhdGVSb290OiBib29sZWFuID0gIXJlYWRPbmx5LFxuICBmaWxlU3lzdGVtQ2FjaGU/OiBGaWxlU3lzdGVtQ2FjaGUsXG4gIHNraWxsUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIGFkYXB0ZXJPcHRpb25zOiBQaWNrPE1hc3RyYUZpbGVTeXN0ZW1BZGFwdGVyT3B0aW9ucywgXCJkZXNjcmlwdGlvblwiIHwgXCJkaXNwbGF5TmFtZVwiPiA9IHt9LFxuKTogUHJvbWlzZTxcbiAgfCB7XG4gICAgICBmaWxlc3lzdGVtOiBXb3Jrc3BhY2VGaWxlc3lzdGVtO1xuICAgIH1cbiAgfCB1bmRlZmluZWRcbj4ge1xuICBjb25zdCBpbml0aWFsQ2xpZW50ID0gd29ya3NwYWNlQ2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KGNsaWVudCk7XG4gIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHtcbiAgICBjbGllbnQ6ICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3Jrc3BhY2VDbGllbnQudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGluaXRpYWxDbGllbnQ7XG4gICAgICB9XG4gICAgfSxcbiAgICByb290LFxuICAgIHJlYWRPbmx5LFxuICAgIGNyZWF0ZVJvb3QsXG4gIH0pO1xuICBjb25zdCBzb3VyY2UgPSBmaWxlU3lzdGVtQ2FjaGVcbiAgICA/IHNoYXJlZEZTLmNhY2hlKGZzLCBmaWxlU3lzdGVtQ2FjaGUsIHsgcmVhZEZpbGVQYXRoczogc2tpbGxQYXRocyB9KVxuICAgIDogZnM7XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtcyhzb3VyY2UsIHsgLi4uYWRhcHRlck9wdGlvbnMsIHJlYWRPbmx5IH0pO1xuICB0cnkge1xuICAgIGF3YWl0IGZpbGVzeXN0ZW0uaW5pdCgpO1xuICAgIGlmIChhd2FpdCBmaWxlc3lzdGVtLmV4aXN0cyhcIi5cIikpIHtcbiAgICAgIHJldHVybiB7IGZpbGVzeXN0ZW0gfTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6c2tpcHBlZFwiLCB7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHksXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJ1biBldmVyeSBtb3VudCByZXNvbHZlciBmb3Igb25lIHJlcXVlc3QgYW5kIG1lcmdlIG1vdW50cyBwbHVzIHNraWxsIHBhdGhzLlxuICogTGF0ZXIgcmVzb2x2ZXJzIG92ZXJ3cml0ZSBtb3VudCBrZXlzIGZyb20gZWFybGllciBvbmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIHJlc29sdmVyXSBvZiByZXNvbHZlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgY29udHJpYnV0aW9uID0gYXdhaXQgcmVzb2x2ZXIoY29udGV4dCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHtcbiAgICAgIGluZGV4LFxuICAgICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhjb250cmlidXRpb24ubW91bnRzKSxcbiAgICAgIHNraWxsUGF0aHM6IGNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzID8/IFtdLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24obW91bnRzLCBjb250cmlidXRpb24ubW91bnRzKTtcbiAgICBpZiAoY29udHJpYnV0aW9uLnNraWxsUGF0aHM/Lmxlbmd0aCkge1xuICAgICAgc2tpbGxQYXRocy5wdXNoKC4uLmNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6bWVyZ2VkXCIsIHtcbiAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKG1vdW50cyksXG4gICAgc2tpbGxQYXRocyxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudHMsXG4gICAgc2tpbGxQYXRocyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IHdoZW4gYW55IG1vdW50IHJlc29sdmVkOyBvdGhlcndpc2UgYVxuICogZnJlc2gge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfSBzbyBNYXN0cmEgYWx3YXlzIGhhcyBhIHdyaXRhYmxlIGxvY2FsIHJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICByZXNvbHZlQ29udHJpYnV0aW9uOiAoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KSA9PiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPixcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuICBmaWxlc0NhY2hlPzogRmlsZXNDYWNoZUV4cG9ydHMsXG4pOiBQcm9taXNlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+IHtcbiAgY29uc3QgeyBtb3VudHMgfSA9IGF3YWl0IHJlc29sdmVDb250cmlidXRpb24oY29udGV4dCk7XG4gIGNvbnN0IG1vdW50S2V5cyA9IE9iamVjdC5rZXlzKG1vdW50cyk7XG4gIGlmIChtb3VudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpzY3JhdGNoXCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBzY3JhdGNoRmlsZXN5c3RlbSgpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06Y29tcG9zaXRlXCIsIHsgbW91bnRLZXlzIH0pO1xuICBjb25zdCBsb2FkID0gKCkgPT4gbmV3IE1vdW50ZWRDb21wb3NpdGVGaWxlc3lzdGVtKHsgbW91bnRzIH0pO1xuICBpZiAoIWZpbGVzQ2FjaGUpIHJldHVybiBsb2FkKCk7XG4gIGNvbnN0IHNjb3BlZCA9IGF3YWl0IHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dCk7XG4gIGlmICghc2NvcGVkKSByZXR1cm4gbG9hZCgpO1xuICByZXR1cm4gZmlsZXNDYWNoZS5mb3JGaWxlU3lzdGVtKHNjb3BlZC5zY29wZSwgeyBwYXRoczogbW91bnRLZXlzIH0sIGxvYWQpO1xufVxuXG4vKipcbiAqIEV4cGFuZCBza2lsbCByb290cyBpbnRvIGNvbmNyZXRlIHNraWxsIGRpcmVjdG9yaWVzIGFuZCBrZWVwIHRoZSBmaXJzdFxuICogc2FtZS1uYW1lZCBkaXJlY3RvcnkuIE1hc3RyYSBzdGlsbCBvd25zIHBhcnNpbmcsIGluZGV4aW5nLCBhbmQgcmVmcmVzaGVzLFxuICogd2hpbGUgb3JnYW5pemF0aW9uIHJvb3RzIHJldGFpbiBwcmVjZWRlbmNlIG92ZXIgcGVyc29uYWwgcm9vdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW0sXG4gIHJvb3RzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihyb290KTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSBcImZpbGVcIiAmJiBlbnRyeS5uYW1lID09PSBcIlNLSUxMLm1kXCIpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwb3NpeFBhdGguYmFzZW5hbWUocm9vdCk7XG4gICAgICAgIGlmICghc2VsZWN0ZWQuaGFzKG5hbWUpKSBzZWxlY3RlZC5zZXQobmFtZSwgcm9vdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS50eXBlICE9PSBcImRpcmVjdG9yeVwiIHx8IHNlbGVjdGVkLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICAgIHNlbGVjdGVkLnNldChlbnRyeS5uYW1lLCBwb3NpeFBhdGguam9pbihyb290LCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLXJvb3Q6c2tpcHBlZFwiLCB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5zZWxlY3RlZC52YWx1ZXMoKV07XG59XG5cbi8qKiBNZW1vaXplIG9uZSBjb21wbGV0ZSBtb3VudCBjb250cmlidXRpb24gZm9yIGVhY2ggcmVxdWVzdCBjb250ZXh0LiAqL1xuZnVuY3Rpb24gY29udHJpYnV0aW9uUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuKTogKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBzY29wZWQgPSBuZXcgV2Vha01hcDxSZXF1ZXN0Q29udGV4dCwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4+KCk7XG4gIGxldCB1bnNjb3BlZDogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoY29udGV4dCkgPT4ge1xuICAgIGlmICghY29udGV4dC5yZXF1ZXN0Q29udGV4dCkge1xuICAgICAgdW5zY29wZWQgPz89IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiB1bnNjb3BlZDtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBzY29wZWQuZ2V0KGNvbnRleHQucmVxdWVzdENvbnRleHQpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGNvbnN0IHBlbmRpbmcgPSByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKHJlc29sdmVycywgY29udGV4dCk7XG4gICAgc2NvcGVkLnNldChjb250ZXh0LnJlcXVlc3RDb250ZXh0LCBwZW5kaW5nKTtcbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn1cbiJdfQ==
|