@dbx-tools/appkit-mastra 0.9.5 → 0.9.7
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 +23 -24
- package/index.ts +1 -3
- package/lib/index.d.ts +1 -3
- package/lib/index.js +2 -3
- package/lib/src/agents.d.ts +2 -2
- package/lib/src/agents.js +6 -6
- package/lib/src/chart.js +23 -23
- package/lib/src/evaluation.js +3 -3
- package/lib/src/genie.d.ts +2 -2
- package/lib/src/genie.js +20 -20
- package/lib/src/memory.js +9 -26
- package/lib/src/mlflow.js +4 -4
- package/lib/src/model.js +4 -4
- package/lib/src/monty-sandbox.js +6 -6
- package/lib/src/observability.js +3 -3
- package/lib/src/plugin.js +26 -21
- package/lib/src/remote-skills.js +20 -30
- package/lib/src/sandbox.js +10 -10
- package/lib/src/server.js +5 -5
- package/lib/src/serving-sanitize.js +12 -9
- package/lib/src/serving.js +8 -8
- package/lib/src/storage-schema.js +4 -4
- package/lib/src/summarize.js +3 -3
- package/lib/src/workspaces.js +9 -9
- package/lib/src/writer.js +3 -3
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -17
- package/src/agents.ts +8 -8
- package/src/chart.ts +24 -24
- package/src/evaluation.ts +2 -2
- package/src/genie.ts +20 -20
- package/src/memory.ts +11 -27
- package/src/mlflow.ts +3 -3
- package/src/model.ts +3 -3
- package/src/monty-sandbox.ts +5 -5
- package/src/observability.ts +2 -2
- package/src/plugin.ts +30 -20
- package/src/remote-skills.ts +36 -38
- package/src/sandbox.ts +9 -9
- package/src/server.ts +4 -4
- package/src/serving-sanitize.ts +11 -13
- package/src/serving.ts +7 -7
- package/src/storage-schema.ts +3 -3
- package/src/summarize.ts +2 -2
- package/src/workspaces.ts +8 -8
- package/src/writer.ts +2 -2
- package/lib/src/pagination.d.ts +0 -33
- package/lib/src/pagination.js +0 -36
- package/src/pagination.ts +0 -47
package/lib/src/workspaces.js
CHANGED
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { createHash } from "node:crypto";
|
|
21
21
|
import { ConfigurationError, createWorkspaceClient } from "@databricks/appkit";
|
|
22
|
-
import { DatabricksFileSystem,
|
|
23
|
-
import {
|
|
22
|
+
import { DatabricksFileSystem, workspaceClient } from "@dbx-tools/databricks";
|
|
23
|
+
import { errorUtils, log, object, stringUtils, token } from "@dbx-tools/shared-core";
|
|
24
24
|
import { CompositeFilesystem, Workspace, } from "@mastra/core/workspace";
|
|
25
25
|
import { MASTRA_SCOPES_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_KEY } from "./config.js";
|
|
26
26
|
import { scratchFilesystem, filesystems } from "./filesystems.js";
|
|
@@ -260,7 +260,7 @@ async function resolveSkillFolderFilesystem(name, folder, context, client) {
|
|
|
260
260
|
});
|
|
261
261
|
return undefined;
|
|
262
262
|
}
|
|
263
|
-
const root =
|
|
263
|
+
const root = stringUtils.trimToNull(await resolveSkillFolderValue(folder.path, context));
|
|
264
264
|
if (!root)
|
|
265
265
|
return undefined;
|
|
266
266
|
return databricksFilesystem(client, root, folder.writable !== true);
|
|
@@ -279,10 +279,10 @@ function resolveWorkspaceIdentity(options) {
|
|
|
279
279
|
let id = options.id;
|
|
280
280
|
let name = options.name;
|
|
281
281
|
if (!id) {
|
|
282
|
-
id = name ?
|
|
282
|
+
id = name ? stringUtils.toSlug(name) : "workspace";
|
|
283
283
|
}
|
|
284
284
|
if (!name) {
|
|
285
|
-
name = Array.from(
|
|
285
|
+
name = Array.from(stringUtils.tokenize(id)).join(" ");
|
|
286
286
|
}
|
|
287
287
|
return { id, name };
|
|
288
288
|
}
|
|
@@ -316,7 +316,7 @@ function shouldMountSkillFolders(requestContext) {
|
|
|
316
316
|
}
|
|
317
317
|
/** Read the trimmed OBO user email stamped on {@link MASTRA_USER_EMAIL_KEY}. */
|
|
318
318
|
function resolveScopedEmail(requestContext) {
|
|
319
|
-
return
|
|
319
|
+
return stringUtils.trimToNull(requestContext?.get(MASTRA_USER_EMAIL_KEY)) ?? undefined;
|
|
320
320
|
}
|
|
321
321
|
/**
|
|
322
322
|
* Wrap a {@link DatabricksFileSystem} as a Mastra filesystem. When the root is
|
|
@@ -325,7 +325,7 @@ function resolveScopedEmail(requestContext) {
|
|
|
325
325
|
*/
|
|
326
326
|
async function databricksFilesystem(client, root, readOnly = true) {
|
|
327
327
|
const fs = new DatabricksFileSystem({
|
|
328
|
-
client:
|
|
328
|
+
client: workspaceClient.toLegacyWorkspaceClient(client),
|
|
329
329
|
root,
|
|
330
330
|
readOnly,
|
|
331
331
|
createRoot: !readOnly,
|
|
@@ -340,7 +340,7 @@ async function databricksFilesystem(client, root, readOnly = true) {
|
|
|
340
340
|
logger.debug("databricks-mount:scratch-fallback", {
|
|
341
341
|
root,
|
|
342
342
|
readOnly,
|
|
343
|
-
error:
|
|
343
|
+
error: errorUtils.errorMessage(err),
|
|
344
344
|
});
|
|
345
345
|
}
|
|
346
346
|
return scratchFilesystem();
|
|
@@ -400,4 +400,4 @@ function buildWorkspaceSkillsResolver(resolvers, extraSkillPaths = []) {
|
|
|
400
400
|
return merged;
|
|
401
401
|
};
|
|
402
402
|
}
|
|
403
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLElBQUksbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRixPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTNFLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsU0FBUyxHQU1WLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBYSxNQUFNLGFBQWEsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBMEMsTUFBTSxjQUFjLENBQUM7QUFDekYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekYsNkVBQTZFO0FBRTdFLCtEQUErRDtBQUMvRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsV0FBVyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsQ0FBVSxDQUFDO0FBRXhGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQWdIL0MsOEVBQThFO0FBRTlFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWlFO0lBQ2pHLGdCQUFnQixFQUFFO1FBQ2hCLElBQUksRUFBRSw0QkFBNEI7UUFDbEMsUUFBUSxFQUFFLElBQUk7UUFDZCxRQUFRLEVBQUUsS0FBSztLQUNoQjtJQUNELG9CQUFvQixFQUFFO1FBQ3BCLElBQUksRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRTtZQUMzQixNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNqRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsUUFBUSxFQUFFLElBQUk7UUFDZCxRQUFRLEVBQUUsSUFBSTtLQUNmO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxVQUFrQyxFQUFFO0lBQ2xFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkQsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5QyxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO0lBQ3RELE1BQU0sTUFBTSxHQUNWLE9BQU8sQ0FBQyxNQUFNO1FBQ2QsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDakQsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUM7WUFDMUQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pCLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25FLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUU7UUFDL0IsRUFBRTtRQUNGLElBQUk7UUFDSixhQUFhLEVBQUUsU0FBUyxDQUFDLE1BQU07UUFDL0IsWUFBWSxFQUFFLFdBQVc7UUFDekIsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztRQUNqRCxvQkFBb0IsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM3QyxtQkFBbUI7UUFDbkIsSUFBSTtRQUNKLGVBQWUsRUFBRSxlQUFlLENBQUMsTUFBTTtRQUN2QyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO0tBQzdELENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxTQUFTLENBQUM7UUFDbkIsRUFBRTtRQUNGLElBQUk7UUFDSixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUM7UUFDdkUsR0FBRyxDQUFDLE1BQU07WUFDUixDQUFDLENBQUM7Z0JBQ0UsTUFBTTtnQkFDTixtQkFBbUI7YUFDcEI7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLE9BQU87WUFDVCxDQUFDLENBQUM7Z0JBQ0UsT0FBTztnQkFDUCxZQUFZLEVBQUUsRUFBRSxjQUFjLEVBQUUsU0FBa0IsRUFBRTthQUNyRDtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxJQUFJO0tBQ0wsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxVQUE0RSxFQUFFO0lBRTlFLE1BQU0sTUFBTSxHQUNWLE9BQU8sQ0FBQyxlQUFlLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3hFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN4RSxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNyQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsK0VBQStFO0FBRS9FLFNBQVMsdUJBQXVCLENBQzlCLFNBQWdELEVBQ2hELFdBQW1CLEVBQ25CLGFBQXFCO0lBRXJCLE1BQU0sVUFBVSxHQUFHLFNBQVMsSUFBSSxZQUFZLENBQUM7SUFDN0MsSUFBSSxVQUFVLEtBQUssS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzNDLElBQUksVUFBVSxLQUFLLE9BQU87UUFBRSxPQUFPLElBQUksWUFBWSxFQUFFLENBQUM7SUFDdEQsSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQztRQUFFLE9BQU8sVUFBVSxDQUFDO0lBRWpGLE1BQU0sT0FBTyxHQUNYLFVBQVUsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDeEUsT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRTtRQUM1QixNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBcUIsQ0FBQztRQUNyRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUN2QyxpQ0FBaUMsRUFDakMsc0VBQXNFLENBQ3ZFLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQ2hCLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxVQUFVO1lBQ3JDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDdkMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDeEIsTUFBTSxTQUFTLEdBQUcsWUFBWSxJQUFJLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQ1YsT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVU7WUFDbEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUNsRCxNQUFNLEVBQ0osUUFBUSxFQUFFLFNBQVMsRUFDbkIsU0FBUyxFQUFFLFVBQVUsRUFDckIsTUFBTSxFQUFFLE9BQU8sRUFDZixHQUFHLGNBQWMsRUFDbEIsR0FBRyxPQUFPLENBQUM7UUFDWixPQUFPLElBQUksaUJBQWlCLENBQUM7WUFDM0IsR0FBRyxjQUFjO1lBQ2pCLE1BQU07WUFDTixTQUFTO1lBQ1QsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksVUFBVSxhQUFhLEVBQUU7U0FDOUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsV0FBbUIsRUFBRSxNQUFjO0lBQzNELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNuRCxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2IsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoQixPQUFPLFVBQVUsTUFBTSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEtBQWM7SUFDL0IsT0FBTyxPQUFPLENBQ1osS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLFVBQVUsSUFBSSxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssQ0FDaEcsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxTQUFnRDtJQUNuRSxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLFlBQVk7UUFBRSxPQUFPLFlBQVksQ0FBQztJQUMvRSxJQUFJLFNBQVMsS0FBSyxPQUFPO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDMUMsSUFBSSxTQUFTLEtBQUssS0FBSztRQUFFLE9BQU8sVUFBVSxDQUFDO0lBQzNDLElBQUksT0FBTyxTQUFTLEtBQUssVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDO0lBQ3ZELE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLENBQUM7QUFDMUYsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMscUJBQXFCLENBQUMsY0FBMEM7SUFDdkUsT0FBTyxLQUFLLENBQUMsd0JBQXdCLENBQ25DLGNBQWMsRUFBRSxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFDdEMscUJBQXFCLENBQ3RCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsd0JBQXdCLENBQ3JDLFlBQWdELEVBQ2hELE9BQThCO0lBRTlCLE1BQU0sTUFBTSxHQUF3QyxFQUFFLENBQUM7SUFDdkQsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFFOUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDaEUsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRTtZQUNwQyxNQUFNLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyx5QkFBeUI7WUFDMUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtZQUM3QixNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztTQUMvQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBcUIsQ0FBQztJQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsTUFBcUMsQ0FBQztJQUU1RSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQzFELE1BQU0sVUFBVSxHQUFHLE1BQU0sNEJBQTRCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLFVBQVU7WUFBRSxTQUFTO1FBQzFCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzNCLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxLQUFLO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRTtRQUNwQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDOUIsVUFBVTtLQUNYLENBQUMsQ0FBQztJQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDaEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILEtBQUssVUFBVSw0QkFBNEIsQ0FDekMsSUFBWSxFQUNaLE1BQTBCLEVBQzFCLE9BQThCLEVBQzlCLE1BQW1DO0lBRW5DLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxPQUFPLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELHNFQUFzRTtJQUN0RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRTtZQUNuQyxJQUFJO1lBQ0osTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtTQUN6RSxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNwRixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLE9BQU8sb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxxRkFBcUY7QUFDckYsU0FBUyx1QkFBdUIsQ0FDOUIsS0FBMEIsRUFDMUIsT0FBOEI7SUFFOUIsT0FBTyxPQUFPLEtBQUssS0FBSyxVQUFVO1FBQ2hDLENBQUMsQ0FBRSxLQUFvRixDQUFDLE9BQU8sQ0FBQztRQUNoRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ1osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsd0JBQXdCLENBQUMsT0FBK0I7SUFJL0QsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUNwQixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNSLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN0QixDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLFNBQVMsbUJBQW1CLENBQzFCLFlBQWdELEVBQ2hELE1BQTRDO0lBRTVDLE1BQU0sU0FBUyxHQUE2QixFQUFFLENBQUM7SUFDL0MsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckQsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELElBQUksTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ25CLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRTtRQUMvQixnQkFBZ0IsRUFBRSxXQUFXO1FBQzdCLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztRQUN4QyxrQkFBa0IsRUFBRSxTQUFTLENBQUMsTUFBTTtLQUNyQyxDQUFDLENBQUM7SUFDSCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHVCQUF1QixDQUFDLGNBQThCO0lBQzdELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssYUFBYTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3hELE9BQU8scUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixTQUFTLGtCQUFrQixDQUFDLGNBQTBDO0lBQ3BFLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDcEYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsb0JBQW9CLENBQ2pDLE1BQXVCLEVBQ3ZCLElBQVksRUFDWixXQUFvQixJQUFJO0lBRXhCLE1BQU0sRUFBRSxHQUFHLElBQUksb0JBQW9CLENBQUM7UUFDbEMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQztRQUMzRCxJQUFJO1FBQ0osUUFBUTtRQUNSLFVBQVUsRUFBRSxDQUFDLFFBQVE7S0FDdEIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsSUFBSSxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUU7WUFDaEQsSUFBSTtZQUNKLFFBQVE7WUFDUixLQUFLLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8saUJBQWlCLEVBQUUsQ0FBQztBQUM3QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLDRCQUE0QixDQUN6QyxTQUFtQyxFQUNuQyxPQUE4QjtJQUU5QixNQUFNLE1BQU0sR0FBd0MsRUFBRSxDQUFDO0lBQ3ZELE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztJQUVoQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtZQUM5QixLQUFLO1lBQ0wsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUMzQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFVBQVUsSUFBSSxFQUFFO1NBQzFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxJQUFJLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDcEMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO1FBQzVCLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM5QixVQUFVO0tBQ1gsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsMEJBQTBCLENBQ3ZDLFNBQW1DLEVBQ25DLE9BQThCO0lBRTlCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxRSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFO1lBQ2pDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO1NBQ25ELENBQUMsQ0FBQztRQUNILE9BQU8saUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDcEQsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyw0QkFBNEIsQ0FDbkMsU0FBbUMsRUFDbkMsa0JBQTRCLEVBQUU7SUFFOUIsT0FBTyxLQUFLLEVBQUUsT0FBc0IsRUFBRSxFQUFFO1FBQ3RDLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RSxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDakUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFzdHJhIHdvcmtzcGFjZSBmYWN0b3J5IGZvciBEYXRhYnJpY2tzIEFwcHMuXG4gKlxuICogQnVpbGRzIGEgcGVyLXJlcXVlc3Qge0BsaW5rIFdvcmtzcGFjZX0gd2l0aCBEYXRhYnJpY2tzIFNhbmRib3ggY29tbWFuZFxuICogZXhlY3V0aW9uIHBsdXMgYSB7QGxpbmsgQ29tcG9zaXRlRmlsZXN5c3RlbX0gb3ZlciB0aGUgTkFNRUQgc2tpbGwgZm9sZGVyc1xuICogcmVzb2x2ZWQgZm9yIHRoYXQgcmVxdWVzdC4gQSBza2lsbCBmb2xkZXIgbWFwcyBhIG5hbWUgdG8gYSBsb2NhdGlvbiBwbHVzIGl0c1xuICogcmVhZGFibGUgLyB3cml0YWJsZSBwb2xpY3k6IGEgRGF0YWJyaWNrcyBwYXRoIG1vdW50ZWQgdGhyb3VnaCB0aGUgT0JPIGNsaWVudFxuICogb24ge0BsaW5rIE1BU1RSQV9VU0VSX0tFWX0sIG9yIGFueSB7QGxpbmsgV29ya3NwYWNlRmlsZXN5c3RlbX0gYSBjb25zdW1pbmdcbiAqIGxpYnJhcnkgYWxyZWFkeSBvd25zLiB7QGxpbmsgREVGQVVMVF9TS0lMTF9GT0xERVJTfSBzdXBwbGllcyB0aGUgQXNzaXN0YW50XG4gKiB0cmVlcywgYW5kIGBza2lsbEZvbGRlcnNgIG1lcmdlcyBvdmVyIGl0IC0gc2FtZSBuYW1lIG92ZXJyaWRlcywgYGZhbHNlYFxuICogZGlzYWJsZXMsIGEgbmV3IG5hbWUgYWRkcy4gT3B0aW9uYWwgbW91bnQgcmVzb2x2ZXJzIGNvbnRyaWJ1dGUgZnVydGhlclxuICogZmlsZXN5c3RlbXMgYW5kIHNraWxsIHNjYW4gcm9vdHMgb24gdG9wLlxuICpcbiAqIERhdGFicmlja3MgbW91bnRzIHVzZSBgQGRieC10b29scy9kYXRhYnJpY2tzYCB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19XG4gKiB3cmFwcGVkIGJ5IHtAbGluayBmaWxlc3lzdGVtc307IG1pc3Npbmcgcm9vdHMgZmFsbCBiYWNrIHRvXG4gKiB7QGxpbmsgc2NyYXRjaEZpbGVzeXN0ZW19LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IsIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0sIHdvcmtzcGFjZSBhcyBkYXRhYnJpY2tzV29ya3NwYWNlIH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgZXJyb3IsIGxvZywgb2JqZWN0LCBzdHJpbmcsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQ29tcG9zaXRlRmlsZXN5c3RlbSxcbiAgV29ya3NwYWNlLFxuICB0eXBlIFNraWxsc0NvbnRleHQsXG4gIHR5cGUgU2tpbGxzUmVzb2x2ZXIsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcblxuaW1wb3J0IHsgTUFTVFJBX1NDT1BFU19LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1VTRVJfS0VZLCB0eXBlIFVzZXIgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHNjcmF0Y2hGaWxlc3lzdGVtLCBmaWxlc3lzdGVtcyB9IGZyb20gXCIuL2ZpbGVzeXN0ZW1zLnRzXCI7XG5pbXBvcnQgeyBNb250eVNhbmRib3ggfSBmcm9tIFwiLi9tb250eS1zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzU2FuZGJveCwgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRILCB1c2VyQXNzaXN0YW50U2tpbGxzUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBPQXV0aCBzY29wZXMgdGhhdCBnYXRlIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGUgbW91bnRzLiAqL1xuY29uc3QgV09SS1NQQUNFX0ZJTEVfU0NPUEVTID0gW1wid29ya3NwYWNlXCIsIFwid29ya3NwYWNlLndvcmtzcGFjZVwiLCBcImFsbC1hcGlzXCJdIGFzIGNvbnN0O1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3dvcmtzcGFjZXNcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItcmVxdWVzdCBjb250ZXh0IGZvciBtb3VudCBhbmQgc2tpbGwtZm9sZGVyIHJlc29sdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250ZXh0IHtcbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBBIHNraWxsLWZvbGRlciBmaWVsZCBnaXZlbiBlaXRoZXIgZGlyZWN0bHkgb3IgYXMgYSBwZXItcmVxdWVzdCByZXNvbHZlci5cbiAqIEEgcmVzb2x2ZXIgcmV0dXJuaW5nIGB1bmRlZmluZWRgIHNraXBzIHRoZSBmb2xkZXIgZm9yIHRoYXQgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IHR5cGUgU2tpbGxGb2xkZXJWYWx1ZTxUPiA9XG4gIFQgfCAoKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4pO1xuXG4vKipcbiAqIE9uZSBuYW1lZCBza2lsbC1mb2xkZXIgbG9jYXRpb24gYW5kIGl0cyByZWFkIC8gd3JpdGUgcG9saWN5LlxuICpcbiAqIEdpdmUge0BsaW5rIHBhdGh9IGZvciBhIERhdGFicmlja3Mgd29ya3NwYWNlIHRyZWUgKG1vdW50ZWQgdGhyb3VnaCB0aGVcbiAqIHJlcXVlc3QncyBPQk8gY2xpZW50KSwgb3Ige0BsaW5rIGZpbGVzeXN0ZW19IGZvciBhIG1vdW50IHRoZSBjb25zdW1lciBidWlsZHNcbiAqIGl0c2VsZi4ge0BsaW5rIGZpbGVzeXN0ZW19IHdpbnMgd2hlbiBib3RoIGFyZSBzZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tpbGxGb2xkZXJPcHRpb25zIHtcbiAgLyoqIEFic29sdXRlIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGggZm9yIHRoaXMgZm9sZGVyLiAqL1xuICBwYXRoPzogU2tpbGxGb2xkZXJWYWx1ZTxzdHJpbmc+O1xuICAvKiogUmVhZHktbWFkZSBtb3VudCwgZm9yIGxvY2F0aW9ucyB0aGUgT0JPIGNsaWVudCBjYW5ub3QgcmVhY2guICovXG4gIGZpbGVzeXN0ZW0/OiBTa2lsbEZvbGRlclZhbHVlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKipcbiAgICogU2NhbiB0aGlzIG1vdW50IGZvciBgU0tJTEwubWRgIGZpbGVzLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGBmYWxzZWAgbW91bnRzXG4gICAqIHRoZSBsb2NhdGlvbiBmb3IgZmlsZSB0b29scyB3aXRob3V0IGFkZGluZyBpdCB0byBza2lsbCBkaXNjb3ZlcnkuXG4gICAqL1xuICByZWFkYWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvdyB3cml0ZXMgdG8gYSB7QGxpbmsgcGF0aH0gbW91bnQgKGFuZCBjcmVhdGUgdGhlIHJvb3Qgd2hlbiBtaXNzaW5nKS5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC4gQSBzdXBwbGllZCB7QGxpbmsgZmlsZXN5c3RlbX0gY2FycmllcyBpdHMgb3duXG4gICAqIHJlYWQtb25seSBmbGFnIGluc3RlYWQuXG4gICAqL1xuICB3cml0YWJsZT86IGJvb2xlYW47XG4gIC8qKiBNb3VudCBwb2ludCBpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZS4gRGVmYXVsdHMgdG8gYC88bmFtZT5gLiAqL1xuICBtb3VudD86IHN0cmluZztcbn1cblxuLyoqIE1vdW50IG1hcCBwbHVzIG9wdGlvbmFsIE1hc3RyYSBza2lsbCBzY2FuIHJvb3RzIGZvciBvbmUgcmVzb2x2ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIFBhdGhzIHdpdGhpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZSB3aGVyZSBgU0tJTEwubWRgIGZpbGVzIGFyZSBzY2FubmVkLiAqL1xuICBza2lsbFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qKiBDb250cmlidXRlcyBmaWxlc3lzdGVtIG1vdW50cyAoYW5kIG9wdGlvbmFsIHNraWxsIHBhdGhzKSBmb3Igb25lIHJlcXVlc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pID0+IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj47XG5cbi8qKiBOYW1lcyBjYXJyaWVkIGJ5IHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNraWxsRm9sZGVyTmFtZSA9IFwid29ya3NwYWNlLXRlYW1cIiB8IFwid29ya3NwYWNlLXRlYW0tYXBwXCI7XG5cbi8qKlxuICogU2FuZGJveCBzZWxlY3Rpb24gZm9yIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LiBEYXRhYnJpY2tzIGlzIHRoZSBkZWZhdWx0O1xuICogYGZhbHNlYCBkaXNhYmxlcyBjb21tYW5kIGV4ZWN1dGlvbiwgYW5kIGEgTWFzdHJhIHByb3ZpZGVyIG9yIHJlc29sdmVyIGlzIGFuXG4gKiBleHBsaWNpdCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiA9XG4gIHwgZmFsc2VcbiAgfCBcImRhdGFicmlja3NcIlxuICB8IFwibW9udHlcIlxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9uc1xuICB8IFdvcmtzcGFjZVNhbmRib3hcbiAgfCBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlV29ya3NwYWNlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyB7XG4gIC8qKiBXb3Jrc3BhY2UgaWQ7IGRlcml2ZWQgZnJvbSBgbmFtZWAgb3IgYFwid29ya3NwYWNlXCJgIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWU7IGRlcml2ZWQgZnJvbSBgaWRgIHdoZW4gb21pdHRlZC4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YXJ0IGZyb20ge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU30uIERlZmF1bHRzIHRvIGB0cnVlYDsgYGZhbHNlYFxuICAgKiBzdGFydHMgZnJvbSBhbiBlbXB0eSBtYXAsIGxlYXZpbmcgb25seSB0aGUge0BsaW5rIHNraWxsRm9sZGVyc30gZ2l2ZW4gaGVyZS5cbiAgICovXG4gIGFzc2lzdGFudFNraWxscz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBOYW1lZCBza2lsbCBmb2xkZXJzIG1lcmdlZCBvdmVyIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9OiBhIG1hdGNoaW5nXG4gICAqIG5hbWUgb3ZlcnJpZGVzIHRoYXQgZGVmYXVsdCwgYGZhbHNlYCBkaXNhYmxlcyBpdCwgYW5kIGFueSBvdGhlciBuYW1lIGFkZHNcbiAgICogYSBmb2xkZXIuXG4gICAqL1xuICBza2lsbEZvbGRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnMgfCBmYWxzZT47XG4gIC8qKiBFeHRyYSBwZXItcmVxdWVzdCBtb3VudCByZXNvbHZlcnMgKHJ1biBhZnRlciB0aGUgc2tpbGwtZm9sZGVyIG1vdW50cykuICovXG4gIG1vdW50cz86IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXTtcbiAgLyoqIFJlcGxhY2UgdGhlIGF1dG8tYnVpbHQgZHluYW1pYyBza2lsbHMgcmVzb2x2ZXIuICovXG4gIHNraWxscz86IFNraWxsc1Jlc29sdmVyO1xuICAvKiogRm9yd2FyZGVkIHRvIE1hc3RyYSB3aGVuIHNraWxsIGRpc2NvdmVyeSBpcyBlbmFibGVkLiAqL1xuICBjaGVja1NraWxsRmlsZU10aW1lPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBCTTI1IGtleXdvcmQgc2VhcmNoIG92ZXIgaW5kZXhlZCB3b3Jrc3BhY2UgY29udGVudC4gKi9cbiAgYm0yNT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb21tYW5kIHNhbmRib3guIERlZmF1bHRzIHRvIERhdGFicmlja3MgU2FuZGJveC4gUGFzcyBgZmFsc2VgIHRvIGRpc2FibGVcbiAgICogY29tbWFuZCBleGVjdXRpb24sIG9yIGFuIGV4cGxpY2l0IE1hc3RyYSBzYW5kYm94L3Byb3ZpZGVyIHJlc29sdmVyIHRvXG4gICAqIHJlcGxhY2UgRGF0YWJyaWNrcyBmb3IgdGhpcyB3b3Jrc3BhY2UuXG4gICAqL1xuICBzYW5kYm94PzogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIEV4dHJhIExPQ0FMIHNraWxsIHNjYW4gcGF0aHMgYWRkZWQgdG8gZXZlcnkgcmVxdWVzdCdzIHNraWxsIGRpc2NvdmVyeS5cbiAgICogVXNlZCBieSB0aGUgcGx1Z2luIHRvIHN1cmZhY2UgcmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIGxvY2FsIHRlbXBcbiAgICogZGlyIGF0IHN0YXJ0dXAgKHNlZSBgcmVtb3RlLXNraWxscy50c2ApLiBEYXRhYnJpY2tzLWhvc3RlZCByZW1vdGUgc2tpbGxzXG4gICAqIG5lZWQgbm8gZW50cnkgaGVyZSAtIHRoZXkgbGFuZCBpbiB0aGUgQXNzaXN0YW50IHRyZWUgdGhlIGJ1aWx0LWluIG1vdW50XG4gICAqIGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHNraWxsIGZvbGRlcnMgZXZlcnkgd29ya3NwYWNlIHN0YXJ0cyB3aXRoLlxuICpcbiAqIC0gYHdvcmtzcGFjZS10ZWFtYCAtIHRoZSBzaGFyZWQgd29ya3NwYWNlIEFzc2lzdGFudCB0cmVlLCByZWFkLW9ubHkgYmVjYXVzZVxuICogICB3cml0aW5nIGl0IGlzIGEgd29ya3NwYWNlLWFkbWluIGFjdGlvbi5cbiAqIC0gYHdvcmtzcGFjZS10ZWFtLWFwcGAgLSB0aGUgcmVxdWVzdGluZyB1c2VyJ3Mgb3duIEFzc2lzdGFudCB0cmVlLCB3cml0YWJsZVxuICogICBzbyB0aGUgYXBwIGNhbiBzYXZlIHNraWxscyBiYWNrIHRvIGl0LiBTa2lwcGVkIHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBub1xuICogICB1c2VyIGVtYWlsLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TS0lMTF9GT0xERVJTOiBSZWFkb25seTxSZWNvcmQ8RGVmYXVsdFNraWxsRm9sZGVyTmFtZSwgU2tpbGxGb2xkZXJPcHRpb25zPj4gPSB7XG4gIFwid29ya3NwYWNlLXRlYW1cIjoge1xuICAgIHBhdGg6IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEgsXG4gICAgcmVhZGFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICB9LFxuICBcIndvcmtzcGFjZS10ZWFtLWFwcFwiOiB7XG4gICAgcGF0aDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgICAgY29uc3QgZW1haWwgPSByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQpO1xuICAgICAgcmV0dXJuIGVtYWlsID8gdXNlckFzc2lzdGFudFNraWxsc1BhdGgoZW1haWwpIDogdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgcmVhZGFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gIH0sXG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgc2tpbGwgZm9sZGVycyBvbmx5XG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKClcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIE92ZXJyaWRlIGEgZGVmYXVsdCwgZHJvcCBhbm90aGVyLCBhbmQgYWRkIGEgbG9jYXRpb24gb2YgeW91ciBvd25cbiAqIGBgYHRzXG4gKiBjcmVhdGVXb3Jrc3BhY2Uoe1xuICogICBza2lsbEZvbGRlcnM6IHtcbiAqICAgICBcIndvcmtzcGFjZS10ZWFtXCI6IHsgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC90ZWFtLXNraWxsc1wiIH0sXG4gKiAgICAgXCJ3b3Jrc3BhY2UtdGVhbS1hcHBcIjogZmFsc2UsXG4gKiAgICAgcnVuYm9va3M6IHsgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC9ydW5ib29rcy9za2lsbHNcIiwgd3JpdGFibGU6IHRydWUgfSxcbiAqICAgICB2b2x1bWU6IHsgZmlsZXN5c3RlbTogbXlWb2x1bWVGaWxlc3lzdGVtIH0sXG4gKiAgIH0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU2tpbGwgZm9sZGVycyBwbHVzIGEgY3VzdG9tIG1vdW50IHJlc29sdmVyXG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKHtcbiAqICAgbW91bnRzOiBbXG4gKiAgICAgYXN5bmMgKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gKHtcbiAqICAgICAgIG1vdW50czogeyBcIi9kYXRhXCI6IG15RmlsZXN5c3RlbSB9LFxuICogICAgICAgc2tpbGxQYXRoczogW10sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXb3Jrc3BhY2Uob3B0aW9uczogQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyA9IHt9KTogV29ya3NwYWNlIHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnMpO1xuICBjb25zdCBza2lsbEZvbGRlcnMgPSByZXNvbHZlU2tpbGxGb2xkZXJzKG9wdGlvbnMpO1xuICBjb25zdCBmb2xkZXJOYW1lcyA9IE9iamVjdC5rZXlzKHNraWxsRm9sZGVycyk7XG4gIGNvbnN0IHJlc29sdmVycyA9IGJ1aWxkTW91bnRSZXNvbHZlcnMoc2tpbGxGb2xkZXJzLCBvcHRpb25zLm1vdW50cyk7XG4gIGNvbnN0IGV4dHJhU2tpbGxQYXRocyA9IG9wdGlvbnMuZXh0cmFTa2lsbFBhdGhzID8/IFtdO1xuICBjb25zdCBza2lsbHMgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKHJlc29sdmVycy5sZW5ndGggPiAwIHx8IGV4dHJhU2tpbGxQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIocmVzb2x2ZXJzLCBleHRyYVNraWxsUGF0aHMpXG4gICAgICA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZm9sZGVyTmFtZXMubGVuZ3RoID4gMDtcbiAgY29uc3QgYm0yNSA9IG9wdGlvbnMuYm0yNSAhPT0gZmFsc2U7XG4gIGNvbnN0IHNhbmRib3ggPSByZXNvbHZlV29ya3NwYWNlU2FuZGJveChvcHRpb25zLnNhbmRib3gsIGlkLCBuYW1lKTtcbiAgbG9nZ2VyLmRlYnVnKFwid29ya3NwYWNlOmNyZWF0ZVwiLCB7XG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICByZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICAgIHNraWxsRm9sZGVyczogZm9sZGVyTmFtZXMsXG4gICAgY3VzdG9tTW91bnRSZXNvbHZlcnM6IG9wdGlvbnMubW91bnRzPy5sZW5ndGggPz8gMCxcbiAgICBjdXN0b21Ta2lsbHNSZXNvbHZlcjogQm9vbGVhbihvcHRpb25zLnNraWxscyksXG4gICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICBibTI1LFxuICAgIGV4dHJhU2tpbGxQYXRoczogZXh0cmFTa2lsbFBhdGhzLmxlbmd0aCxcbiAgICBzYW5kYm94OiBzYW5kYm94ID8gc2FuZGJveE5hbWUob3B0aW9ucy5zYW5kYm94KSA6IFwiZGlzYWJsZWRcIixcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBXb3Jrc3BhY2Uoe1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogKGNvbnRleHQpID0+IHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKHJlc29sdmVycywgY29udGV4dCksXG4gICAgLi4uKHNraWxsc1xuICAgICAgPyB7XG4gICAgICAgICAgc2tpbGxzLFxuICAgICAgICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzYW5kYm94XG4gICAgICA/IHtcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIGluc3RydWN0aW9uczogeyBkeW5hbWljU2FuZGJveDogXCJyZXNvbHZlXCIgYXMgY29uc3QgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgYm0yNSxcbiAgfSk7XG59XG5cbi8qKlxuICogTWVyZ2UgdGhlIGNvbmZpZ3VyZWQgc2tpbGwgZm9sZGVycyBvdmVyIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LlxuICpcbiAqIGBhc3Npc3RhbnRTa2lsbHM6IGZhbHNlYCBkcm9wcyB0aGUgZGVmYXVsdHMsIGFuZCBhIGBmYWxzZWAgdmFsdWUgcmVtb3ZlcyBvbmVcbiAqIGVudHJ5IGJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJzKFxuICBvcHRpb25zOiBQaWNrPENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMsIFwiYXNzaXN0YW50U2tpbGxzXCIgfCBcInNraWxsRm9sZGVyc1wiPiA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPiB7XG4gIGNvbnN0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPiA9XG4gICAgb3B0aW9ucy5hc3Npc3RhbnRTa2lsbHMgPT09IGZhbHNlID8ge30gOiB7IC4uLkRFRkFVTFRfU0tJTExfRk9MREVSUyB9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBmb2xkZXJdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuc2tpbGxGb2xkZXJzID8/IHt9KSkge1xuICAgIGlmIChmb2xkZXIgPT09IGZhbHNlKSB7XG4gICAgICBkZWxldGUgbWVyZ2VkW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZWRbbmFtZV0gPSBmb2xkZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJpdmF0ZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3goXG4gIHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCxcbiAgd29ya3NwYWNlSWQ6IHN0cmluZyxcbiAgd29ya3NwYWNlTmFtZTogc3RyaW5nLFxuKTogV29ya3NwYWNlU2FuZGJveCB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBzZWxlY3Rpb24gPz8gXCJkYXRhYnJpY2tzXCI7XG4gIGlmIChjb25maWd1cmVkID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IFwibW9udHlcIikgcmV0dXJuIG5ldyBNb250eVNhbmRib3goKTtcbiAgaWYgKHR5cGVvZiBjb25maWd1cmVkID09PSBcImZ1bmN0aW9uXCIgfHwgaXNTYW5kYm94KGNvbmZpZ3VyZWQpKSByZXR1cm4gY29uZmlndXJlZDtcblxuICBjb25zdCBvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgPVxuICAgIGNvbmZpZ3VyZWQgPT09IFwiZGF0YWJyaWNrc1wiID8geyBwcm92aWRlcjogXCJkYXRhYnJpY2tzXCIgfSA6IGNvbmZpZ3VyZWQ7XG4gIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiB7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgICAgXCJEYXRhYnJpY2tzIHNhbmRib3ggdXNlciBjb250ZXh0XCIsXG4gICAgICAgIFwiSW52b2tlIGNvbW1hbmQgdG9vbHMgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgTWFzdHJhIHBsdWdpbi5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ3VyZWRJZCA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zYW5kYm94SWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG9wdGlvbnMuc2FuZGJveElkKHsgcmVxdWVzdENvbnRleHQgfSlcbiAgICAgICAgOiBvcHRpb25zLnNhbmRib3hJZDtcbiAgICBjb25zdCBzYW5kYm94SWQgPSBjb25maWd1cmVkSWQgPz8gZGVmYXVsdFNhbmRib3hJZCh3b3Jrc3BhY2VJZCwgdXNlci5pZCk7XG4gICAgY29uc3QgY2xpZW50ID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLmNsaWVudCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gb3B0aW9ucy5jbGllbnQoeyByZXF1ZXN0Q29udGV4dCB9KVxuICAgICAgICA6IChvcHRpb25zLmNsaWVudCA/PyBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKSk7XG4gICAgY29uc3Qge1xuICAgICAgcHJvdmlkZXI6IF9wcm92aWRlcixcbiAgICAgIHNhbmRib3hJZDogX3NhbmRib3hJZCxcbiAgICAgIGNsaWVudDogX2NsaWVudCxcbiAgICAgIC4uLnNhbmRib3hPcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzU2FuZGJveCh7XG4gICAgICAuLi5zYW5kYm94T3B0aW9ucyxcbiAgICAgIGNsaWVudCxcbiAgICAgIHNhbmRib3hJZCxcbiAgICAgIGRpc3BsYXlOYW1lOiBvcHRpb25zLmRpc3BsYXlOYW1lID8/IGBNYXN0cmEgJHt3b3Jrc3BhY2VOYW1lfWAsXG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTYW5kYm94SWQod29ya3NwYWNlSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgLnVwZGF0ZShvYmplY3QudG9TdGFibGVLZXkoeyB3b3Jrc3BhY2VJZCwgdXNlcklkIH0pKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMzIpO1xuICByZXR1cm4gYG1hc3RyYS0ke2RpZ2VzdH1gO1xufVxuXG5mdW5jdGlvbiBpc1NhbmRib3godmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VTYW5kYm94IHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiB2YWx1ZSAmJiBcInByb3ZpZGVyXCIgaW4gdmFsdWUgJiYgXCJzdGF0dXNcIiBpbiB2YWx1ZSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2FuZGJveE5hbWUoc2VsZWN0aW9uOiBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdGlvbiA9PT0gXCJkYXRhYnJpY2tzXCIpIHJldHVybiBcImRhdGFicmlja3NcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gXCJtb250eVwiKSByZXR1cm4gXCJtb250eVwiO1xuICBpZiAoc2VsZWN0aW9uID09PSBmYWxzZSkgcmV0dXJuIFwiZGlzYWJsZWRcIjtcbiAgaWYgKHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFwicmVzb2x2ZXJcIjtcbiAgcmV0dXJuIGlzU2FuZGJveChzZWxlY3Rpb24pID8gc2VsZWN0aW9uLnByb3ZpZGVyIDogKHNlbGVjdGlvbi5wcm92aWRlciA/PyBcImRhdGFicmlja3NcIik7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgdGhlIHJlcXVlc3QgdG9rZW4gY2FycmllcyBhIHNjb3BlIHRoYXQgYWxsb3dzIHdvcmtzcGFjZVxuICogZmlsZSBBUEkgYWNjZXNzIChgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIG9uIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0pLlxuICovXG5mdW5jdGlvbiBoYXNXb3Jrc3BhY2VGaWxlU2NvcGUocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbi5pbmNsdWRlc0FjY2Vzc1Rva2VuU2NvcGUoXG4gICAgcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfU0NPUEVTX0tFWSksXG4gICAgV09SS1NQQUNFX0ZJTEVfU0NPUEVTLFxuICApO1xufVxuXG4vKipcbiAqIE1vdW50IHJlc29sdmVyIGZvciB0aGUgbmFtZWQgc2tpbGwgZm9sZGVycy5cbiAqXG4gKiBHYXRlcyBvbiB3b3Jrc3BhY2UgZmlsZSBzY29wZSAob3IgZGV2ZWxvcG1lbnQgbW9kZSksIHRoZW4gbW91bnRzIGV2ZXJ5XG4gKiBmb2xkZXIgd2hvc2UgbG9jYXRpb24gcmVzb2x2ZXMgZm9yIHRoaXMgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyTW91bnRzKFxuICBza2lsbEZvbGRlcnM6IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucz4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbik6IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+IHtcbiAgY29uc3QgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiA9IHt9O1xuICBjb25zdCBza2lsbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQucmVxdWVzdENvbnRleHQ7XG5cbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCB8fCAhc2hvdWxkTW91bnRTa2lsbEZvbGRlcnMocmVxdWVzdENvbnRleHQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGwtZm9sZGVyczpza2lwcGVkXCIsIHtcbiAgICAgIHJlYXNvbjogIXJlcXVlc3RDb250ZXh0ID8gXCJuby1yZXF1ZXN0LWNvbnRleHRcIiA6IFwibWlzc2luZy13b3Jrc3BhY2Utc2NvcGVcIixcbiAgICAgIG5vZGVFbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuICAgICAgc2NvcGVzOiByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9TQ09QRVNfS0VZKSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHMgfTtcbiAgfVxuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0LmNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZm9sZGVyXSBvZiBPYmplY3QuZW50cmllcyhza2lsbEZvbGRlcnMpKSB7XG4gICAgY29uc3QgZmlsZXN5c3RlbSA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0obmFtZSwgZm9sZGVyLCBjb250ZXh0LCBjbGllbnQpO1xuICAgIGlmICghZmlsZXN5c3RlbSkgY29udGludWU7XG4gICAgY29uc3QgbW91bnQgPSBmb2xkZXIubW91bnQgPz8gYC8ke25hbWV9YDtcbiAgICBtb3VudHNbbW91bnRdID0gZmlsZXN5c3RlbTtcbiAgICBpZiAoZm9sZGVyLnJlYWRhYmxlICE9PSBmYWxzZSkgc2tpbGxQYXRocy5wdXNoKG1vdW50KTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7IG1vdW50cywgc2tpbGxQYXRocyB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25lIHNraWxsIGZvbGRlciB0byBhIE1hc3RyYSBmaWxlc3lzdGVtLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGl0XG4gKiBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJGaWxlc3lzdGVtKFxuICBuYW1lOiBzdHJpbmcsXG4gIGZvbGRlcjogU2tpbGxGb2xkZXJPcHRpb25zLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VGaWxlc3lzdGVtIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChmb2xkZXIuZmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlc29sdmVTa2lsbEZvbGRlclZhbHVlKGZvbGRlci5maWxlc3lzdGVtLCBjb250ZXh0KTtcbiAgfVxuICAvLyBBIHBhdGggbW91bnQgbmVlZHMgdGhlIHJlcXVlc3QncyBPQk8gY2xpZW50IHRvIHJlYWNoIHRoZSB3b3Jrc3BhY2UuXG4gIGlmIChmb2xkZXIucGF0aCA9PT0gdW5kZWZpbmVkIHx8ICFjbGllbnQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJza2lsbC1mb2xkZXI6c2tpcHBlZFwiLCB7XG4gICAgICBuYW1lLFxuICAgICAgcmVhc29uOiBmb2xkZXIucGF0aCA9PT0gdW5kZWZpbmVkID8gXCJuby1sb2NhdGlvblwiIDogXCJtaXNzaW5nLW9iby1jbGllbnRcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJvb3QgPSBzdHJpbmcudHJpbVRvTnVsbChhd2FpdCByZXNvbHZlU2tpbGxGb2xkZXJWYWx1ZShmb2xkZXIucGF0aCwgY29udGV4dCkpO1xuICBpZiAoIXJvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBkYXRhYnJpY2tzRmlsZXN5c3RlbShjbGllbnQsIHJvb3QsIGZvbGRlci53cml0YWJsZSAhPT0gdHJ1ZSk7XG59XG5cbi8qKiBSZWFkIGEge0BsaW5rIFNraWxsRm9sZGVyVmFsdWV9LCBjYWxsaW5nIGl0IHdoZW4gaXQgaXMgYSBwZXItcmVxdWVzdCByZXNvbHZlci4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlclZhbHVlPFQ+KFxuICB2YWx1ZTogU2tpbGxGb2xkZXJWYWx1ZTxUPixcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICA/ICh2YWx1ZSBhcyAoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KSA9PiBUIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxUIHwgdW5kZWZpbmVkPikoY29udGV4dClcbiAgICA6IHZhbHVlO1xufVxuXG4vKipcbiAqIEZpbGwgaW4gYGlkYCBhbmQgYG5hbWVgIHdoZW4gZWl0aGVyIGlzIG9taXR0ZWQgb24ge0BsaW5rIENyZWF0ZVdvcmtzcGFjZU9wdGlvbnN9LlxuICogU2x1Z2lmaWVzIGBuYW1lYCBpbnRvIGBpZGA7IHRva2VuaXplcyBgaWRgIGludG8gYSBkaXNwbGF5IGBuYW1lYC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnM6IENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMpOiB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn0ge1xuICBsZXQgaWQgPSBvcHRpb25zLmlkO1xuICBsZXQgbmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgaWYgKCFpZCkge1xuICAgIGlkID0gbmFtZSA/IHN0cmluZy50b1NsdWcobmFtZSkgOiBcIndvcmtzcGFjZVwiO1xuICB9XG4gIGlmICghbmFtZSkge1xuICAgIG5hbWUgPSBBcnJheS5mcm9tKHN0cmluZy50b2tlbml6ZShpZCkpLmpvaW4oXCIgXCIpO1xuICB9XG4gIHJldHVybiB7IGlkLCBuYW1lIH07XG59XG5cbi8qKiBDb2xsZWN0IHRoZSBza2lsbC1mb2xkZXIgcmVzb2x2ZXIgYW5kIGFueSBjYWxsZXItc3VwcGxpZWQgb25lcy4gKi9cbmZ1bmN0aW9uIGJ1aWxkTW91bnRSZXNvbHZlcnMoXG4gIHNraWxsRm9sZGVyczogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPixcbiAgbW91bnRzOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10gfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtdO1xuICBjb25zdCBmb2xkZXJDb3VudCA9IE9iamVjdC5rZXlzKHNraWxsRm9sZGVycykubGVuZ3RoO1xuICBpZiAoZm9sZGVyQ291bnQgPiAwKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goKGNvbnRleHQpID0+IHJlc29sdmVTa2lsbEZvbGRlck1vdW50cyhza2lsbEZvbGRlcnMsIGNvbnRleHQpKTtcbiAgfVxuICBpZiAobW91bnRzPy5sZW5ndGgpIHtcbiAgICByZXNvbHZlcnMucHVzaCguLi5tb3VudHMpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czpyZXNvbHZlcnNcIiwge1xuICAgIHNraWxsRm9sZGVyQ291bnQ6IGZvbGRlckNvdW50LFxuICAgIGN1c3RvbVJlc29sdmVyQ291bnQ6IG1vdW50cz8ubGVuZ3RoID8/IDAsXG4gICAgdG90YWxSZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVycztcbn1cblxuLyoqXG4gKiBHYXRlIHNraWxsLWZvbGRlciBtb3VudHMgb24gdGhlIHJlcXVlc3QncyB0b2tlbi5cbiAqXG4gKiBBbHdheXMgYWxsb3dzIG1vdW50cyBpbiBkZXZlbG9wbWVudDsgaW4gb3RoZXIgZW52aXJvbm1lbnRzIHJlcXVpcmVzXG4gKiB7QGxpbmsgaGFzV29ya3NwYWNlRmlsZVNjb3BlfS5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkTW91bnRTa2lsbEZvbGRlcnMocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogYm9vbGVhbiB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dCk7XG59XG5cbi8qKiBSZWFkIHRoZSB0cmltbWVkIE9CTyB1c2VyIGVtYWlsIHN0YW1wZWQgb24ge0BsaW5rIE1BU1RSQV9VU0VSX0VNQUlMX0tFWX0uICovXG5mdW5jdGlvbiByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHN0cmluZy50cmltVG9OdWxsKHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZKSkgPz8gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdyYXAgYSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19IGFzIGEgTWFzdHJhIGZpbGVzeXN0ZW0uIFdoZW4gdGhlIHJvb3QgaXNcbiAqIG1pc3NpbmcgKGFuZCB7QGxpbmsgcmVhZE9ubHl9IHNvIHdlIHdpbGwgbm90IGNyZWF0ZSBpdCksIGZhbGwgYmFjayB0b1xuICoge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfSBzbyBza2lsbCBzY2FucyBzdGlsbCBoYXZlIGEgd3JpdGFibGUgbG9jYWwgbW91bnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgcm9vdDogc3RyaW5nLFxuICByZWFkT25seTogYm9vbGVhbiA9IHRydWUsXG4pOiBQcm9taXNlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+IHtcbiAgY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgIGNsaWVudDogZGF0YWJyaWNrc1dvcmtzcGFjZS50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChjbGllbnQpLFxuICAgIHJvb3QsXG4gICAgcmVhZE9ubHksXG4gICAgY3JlYXRlUm9vdDogIXJlYWRPbmx5LFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5pbml0KCk7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhcIi5cIikpIHtcbiAgICAgIHJldHVybiBmaWxlc3lzdGVtcyhmcywgeyByZWFkT25seSB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6c2NyYXRjaC1mYWxsYmFja1wiLCB7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHksXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHNjcmF0Y2hGaWxlc3lzdGVtKCk7XG59XG5cbi8qKlxuICogUnVuIGV2ZXJ5IG1vdW50IHJlc29sdmVyIGZvciBvbmUgcmVxdWVzdCBhbmQgbWVyZ2UgbW91bnRzIHBsdXMgc2tpbGwgcGF0aHMuXG4gKiBMYXRlciByZXNvbHZlcnMgb3ZlcndyaXRlIG1vdW50IGtleXMgZnJvbSBlYXJsaWVyIG9uZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24oXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzb2x2ZXJdIG9mIHJlc29sdmVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlcihjb250ZXh0KTtcbiAgICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJcIiwge1xuICAgICAgaW5kZXgsXG4gICAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKGNvbnRyaWJ1dGlvbi5tb3VudHMpLFxuICAgICAgc2tpbGxQYXRoczogY29udHJpYnV0aW9uLnNraWxsUGF0aHMgPz8gW10sXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihtb3VudHMsIGNvbnRyaWJ1dGlvbi5tb3VudHMpO1xuICAgIGlmIChjb250cmlidXRpb24uc2tpbGxQYXRocz8ubGVuZ3RoKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uY29udHJpYnV0aW9uLnNraWxsUGF0aHMpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czptZXJnZWRcIiwge1xuICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMobW91bnRzKSxcbiAgICBza2lsbFBhdGhzLFxuICB9KTtcblxuICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHMgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IHdoZW4gYW55IG1vdW50IHJlc29sdmVkOyBvdGhlcndpc2UgYVxuICogZnJlc2gge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfSBzbyBNYXN0cmEgYWx3YXlzIGhhcyBhIHdyaXRhYmxlIGxvY2FsIHJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VGaWxlc3lzdGVtPiB7XG4gIGNvbnN0IHsgbW91bnRzIH0gPSBhd2FpdCByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKHJlc29sdmVycywgY29udGV4dCk7XG4gIGNvbnN0IG1vdW50S2V5cyA9IE9iamVjdC5rZXlzKG1vdW50cyk7XG4gIGlmIChtb3VudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpzY3JhdGNoXCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBzY3JhdGNoRmlsZXN5c3RlbSgpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06Y29tcG9zaXRlXCIsIHsgbW91bnRLZXlzIH0pO1xuICByZXR1cm4gbmV3IENvbXBvc2l0ZUZpbGVzeXN0ZW0oeyBtb3VudHMgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGR5bmFtaWMge0BsaW5rIFNraWxsc1Jlc29sdmVyfSB0aGF0IGNvbGxlY3RzIGBza2lsbFBhdGhzYCBmcm9tXG4gKiBldmVyeSBtb3VudCByZXNvbHZlciBvbiBlYWNoIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBleHRyYVNraWxsUGF0aHM6IHN0cmluZ1tdID0gW10sXG4pOiBTa2lsbHNSZXNvbHZlciB7XG4gIHJldHVybiBhc3luYyAoY29udGV4dDogU2tpbGxzQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgc2tpbGxQYXRocyB9ID0gYXdhaXQgcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgIGNvbnN0IG1lcmdlZCA9IFsuLi4oc2tpbGxQYXRocyA/PyBbXSksIC4uLmV4dHJhU2tpbGxQYXRoc107XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGxzOnJlc29sdmVkXCIsIHsgc2tpbGxQYXRocywgZXh0cmFTa2lsbFBhdGhzIH0pO1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH07XG59XG4iXX0=
|
|
403
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXJGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsU0FBUyxHQU1WLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBYSxNQUFNLGFBQWEsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBMEMsTUFBTSxjQUFjLENBQUM7QUFDekYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekYsNkVBQTZFO0FBRTdFLCtEQUErRDtBQUMvRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsV0FBVyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsQ0FBVSxDQUFDO0FBRXhGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQWdIL0MsOEVBQThFO0FBRTlFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJB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QyxDQUFDO1FBQ2pFLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1hc3RyYSB3b3Jrc3BhY2UgZmFjdG9yeSBmb3IgRGF0YWJyaWNrcyBBcHBzLlxuICpcbiAqIEJ1aWxkcyBhIHBlci1yZXF1ZXN0IHtAbGluayBXb3Jrc3BhY2V9IHdpdGggRGF0YWJyaWNrcyBTYW5kYm94IGNvbW1hbmRcbiAqIGV4ZWN1dGlvbiBwbHVzIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IG92ZXIgdGhlIE5BTUVEIHNraWxsIGZvbGRlcnNcbiAqIHJlc29sdmVkIGZvciB0aGF0IHJlcXVlc3QuIEEgc2tpbGwgZm9sZGVyIG1hcHMgYSBuYW1lIHRvIGEgbG9jYXRpb24gcGx1cyBpdHNcbiAqIHJlYWRhYmxlIC8gd3JpdGFibGUgcG9saWN5OiBhIERhdGFicmlja3MgcGF0aCBtb3VudGVkIHRocm91Z2ggdGhlIE9CTyBjbGllbnRcbiAqIG9uIHtAbGluayBNQVNUUkFfVVNFUl9LRVl9LCBvciBhbnkge0BsaW5rIFdvcmtzcGFjZUZpbGVzeXN0ZW19IGEgY29uc3VtaW5nXG4gKiBsaWJyYXJ5IGFscmVhZHkgb3ducy4ge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU30gc3VwcGxpZXMgdGhlIEFzc2lzdGFudFxuICogdHJlZXMsIGFuZCBgc2tpbGxGb2xkZXJzYCBtZXJnZXMgb3ZlciBpdCAtIHNhbWUgbmFtZSBvdmVycmlkZXMsIGBmYWxzZWBcbiAqIGRpc2FibGVzLCBhIG5ldyBuYW1lIGFkZHMuIE9wdGlvbmFsIG1vdW50IHJlc29sdmVycyBjb250cmlidXRlIGZ1cnRoZXJcbiAqIGZpbGVzeXN0ZW1zIGFuZCBza2lsbCBzY2FuIHJvb3RzIG9uIHRvcC5cbiAqXG4gKiBEYXRhYnJpY2tzIG1vdW50cyB1c2UgYEBkYngtdG9vbHMvZGF0YWJyaWNrc2Age0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfVxuICogd3JhcHBlZCBieSB7QGxpbmsgZmlsZXN5c3RlbXN9OyBtaXNzaW5nIHJvb3RzIGZhbGwgYmFjayB0b1xuICoge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yLCBjcmVhdGVXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IERhdGFicmlja3NGaWxlU3lzdGVtLCB3b3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQ29tcG9zaXRlRmlsZXN5c3RlbSxcbiAgV29ya3NwYWNlLFxuICB0eXBlIFNraWxsc0NvbnRleHQsXG4gIHR5cGUgU2tpbGxzUmVzb2x2ZXIsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcblxuaW1wb3J0IHsgTUFTVFJBX1NDT1BFU19LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1VTRVJfS0VZLCB0eXBlIFVzZXIgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHNjcmF0Y2hGaWxlc3lzdGVtLCBmaWxlc3lzdGVtcyB9IGZyb20gXCIuL2ZpbGVzeXN0ZW1zLnRzXCI7XG5pbXBvcnQgeyBNb250eVNhbmRib3ggfSBmcm9tIFwiLi9tb250eS1zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzU2FuZGJveCwgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRILCB1c2VyQXNzaXN0YW50U2tpbGxzUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBPQXV0aCBzY29wZXMgdGhhdCBnYXRlIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGUgbW91bnRzLiAqL1xuY29uc3QgV09SS1NQQUNFX0ZJTEVfU0NPUEVTID0gW1wid29ya3NwYWNlXCIsIFwid29ya3NwYWNlLndvcmtzcGFjZVwiLCBcImFsbC1hcGlzXCJdIGFzIGNvbnN0O1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3dvcmtzcGFjZXNcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItcmVxdWVzdCBjb250ZXh0IGZvciBtb3VudCBhbmQgc2tpbGwtZm9sZGVyIHJlc29sdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250ZXh0IHtcbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBBIHNraWxsLWZvbGRlciBmaWVsZCBnaXZlbiBlaXRoZXIgZGlyZWN0bHkgb3IgYXMgYSBwZXItcmVxdWVzdCByZXNvbHZlci5cbiAqIEEgcmVzb2x2ZXIgcmV0dXJuaW5nIGB1bmRlZmluZWRgIHNraXBzIHRoZSBmb2xkZXIgZm9yIHRoYXQgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IHR5cGUgU2tpbGxGb2xkZXJWYWx1ZTxUPiA9XG4gIFQgfCAoKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4pO1xuXG4vKipcbiAqIE9uZSBuYW1lZCBza2lsbC1mb2xkZXIgbG9jYXRpb24gYW5kIGl0cyByZWFkIC8gd3JpdGUgcG9saWN5LlxuICpcbiAqIEdpdmUge0BsaW5rIHBhdGh9IGZvciBhIERhdGFicmlja3Mgd29ya3NwYWNlIHRyZWUgKG1vdW50ZWQgdGhyb3VnaCB0aGVcbiAqIHJlcXVlc3QncyBPQk8gY2xpZW50KSwgb3Ige0BsaW5rIGZpbGVzeXN0ZW19IGZvciBhIG1vdW50IHRoZSBjb25zdW1lciBidWlsZHNcbiAqIGl0c2VsZi4ge0BsaW5rIGZpbGVzeXN0ZW19IHdpbnMgd2hlbiBib3RoIGFyZSBzZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tpbGxGb2xkZXJPcHRpb25zIHtcbiAgLyoqIEFic29sdXRlIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGggZm9yIHRoaXMgZm9sZGVyLiAqL1xuICBwYXRoPzogU2tpbGxGb2xkZXJWYWx1ZTxzdHJpbmc+O1xuICAvKiogUmVhZHktbWFkZSBtb3VudCwgZm9yIGxvY2F0aW9ucyB0aGUgT0JPIGNsaWVudCBjYW5ub3QgcmVhY2guICovXG4gIGZpbGVzeXN0ZW0/OiBTa2lsbEZvbGRlclZhbHVlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKipcbiAgICogU2NhbiB0aGlzIG1vdW50IGZvciBgU0tJTEwubWRgIGZpbGVzLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGBmYWxzZWAgbW91bnRzXG4gICAqIHRoZSBsb2NhdGlvbiBmb3IgZmlsZSB0b29scyB3aXRob3V0IGFkZGluZyBpdCB0byBza2lsbCBkaXNjb3ZlcnkuXG4gICAqL1xuICByZWFkYWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvdyB3cml0ZXMgdG8gYSB7QGxpbmsgcGF0aH0gbW91bnQgKGFuZCBjcmVhdGUgdGhlIHJvb3Qgd2hlbiBtaXNzaW5nKS5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC4gQSBzdXBwbGllZCB7QGxpbmsgZmlsZXN5c3RlbX0gY2FycmllcyBpdHMgb3duXG4gICAqIHJlYWQtb25seSBmbGFnIGluc3RlYWQuXG4gICAqL1xuICB3cml0YWJsZT86IGJvb2xlYW47XG4gIC8qKiBNb3VudCBwb2ludCBpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZS4gRGVmYXVsdHMgdG8gYC88bmFtZT5gLiAqL1xuICBtb3VudD86IHN0cmluZztcbn1cblxuLyoqIE1vdW50IG1hcCBwbHVzIG9wdGlvbmFsIE1hc3RyYSBza2lsbCBzY2FuIHJvb3RzIGZvciBvbmUgcmVzb2x2ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIFBhdGhzIHdpdGhpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZSB3aGVyZSBgU0tJTEwubWRgIGZpbGVzIGFyZSBzY2FubmVkLiAqL1xuICBza2lsbFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qKiBDb250cmlidXRlcyBmaWxlc3lzdGVtIG1vdW50cyAoYW5kIG9wdGlvbmFsIHNraWxsIHBhdGhzKSBmb3Igb25lIHJlcXVlc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pID0+IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj47XG5cbi8qKiBOYW1lcyBjYXJyaWVkIGJ5IHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNraWxsRm9sZGVyTmFtZSA9IFwid29ya3NwYWNlLXRlYW1cIiB8IFwid29ya3NwYWNlLXRlYW0tYXBwXCI7XG5cbi8qKlxuICogU2FuZGJveCBzZWxlY3Rpb24gZm9yIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LiBEYXRhYnJpY2tzIGlzIHRoZSBkZWZhdWx0O1xuICogYGZhbHNlYCBkaXNhYmxlcyBjb21tYW5kIGV4ZWN1dGlvbiwgYW5kIGEgTWFzdHJhIHByb3ZpZGVyIG9yIHJlc29sdmVyIGlzIGFuXG4gKiBleHBsaWNpdCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiA9XG4gIHwgZmFsc2VcbiAgfCBcImRhdGFicmlja3NcIlxuICB8IFwibW9udHlcIlxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9uc1xuICB8IFdvcmtzcGFjZVNhbmRib3hcbiAgfCBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlV29ya3NwYWNlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyB7XG4gIC8qKiBXb3Jrc3BhY2UgaWQ7IGRlcml2ZWQgZnJvbSBgbmFtZWAgb3IgYFwid29ya3NwYWNlXCJgIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWU7IGRlcml2ZWQgZnJvbSBgaWRgIHdoZW4gb21pdHRlZC4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YXJ0IGZyb20ge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU30uIERlZmF1bHRzIHRvIGB0cnVlYDsgYGZhbHNlYFxuICAgKiBzdGFydHMgZnJvbSBhbiBlbXB0eSBtYXAsIGxlYXZpbmcgb25seSB0aGUge0BsaW5rIHNraWxsRm9sZGVyc30gZ2l2ZW4gaGVyZS5cbiAgICovXG4gIGFzc2lzdGFudFNraWxscz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBOYW1lZCBza2lsbCBmb2xkZXJzIG1lcmdlZCBvdmVyIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9OiBhIG1hdGNoaW5nXG4gICAqIG5hbWUgb3ZlcnJpZGVzIHRoYXQgZGVmYXVsdCwgYGZhbHNlYCBkaXNhYmxlcyBpdCwgYW5kIGFueSBvdGhlciBuYW1lIGFkZHNcbiAgICogYSBmb2xkZXIuXG4gICAqL1xuICBza2lsbEZvbGRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnMgfCBmYWxzZT47XG4gIC8qKiBFeHRyYSBwZXItcmVxdWVzdCBtb3VudCByZXNvbHZlcnMgKHJ1biBhZnRlciB0aGUgc2tpbGwtZm9sZGVyIG1vdW50cykuICovXG4gIG1vdW50cz86IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXTtcbiAgLyoqIFJlcGxhY2UgdGhlIGF1dG8tYnVpbHQgZHluYW1pYyBza2lsbHMgcmVzb2x2ZXIuICovXG4gIHNraWxscz86IFNraWxsc1Jlc29sdmVyO1xuICAvKiogRm9yd2FyZGVkIHRvIE1hc3RyYSB3aGVuIHNraWxsIGRpc2NvdmVyeSBpcyBlbmFibGVkLiAqL1xuICBjaGVja1NraWxsRmlsZU10aW1lPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBCTTI1IGtleXdvcmQgc2VhcmNoIG92ZXIgaW5kZXhlZCB3b3Jrc3BhY2UgY29udGVudC4gKi9cbiAgYm0yNT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb21tYW5kIHNhbmRib3guIERlZmF1bHRzIHRvIERhdGFicmlja3MgU2FuZGJveC4gUGFzcyBgZmFsc2VgIHRvIGRpc2FibGVcbiAgICogY29tbWFuZCBleGVjdXRpb24sIG9yIGFuIGV4cGxpY2l0IE1hc3RyYSBzYW5kYm94L3Byb3ZpZGVyIHJlc29sdmVyIHRvXG4gICAqIHJlcGxhY2UgRGF0YWJyaWNrcyBmb3IgdGhpcyB3b3Jrc3BhY2UuXG4gICAqL1xuICBzYW5kYm94PzogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIEV4dHJhIExPQ0FMIHNraWxsIHNjYW4gcGF0aHMgYWRkZWQgdG8gZXZlcnkgcmVxdWVzdCdzIHNraWxsIGRpc2NvdmVyeS5cbiAgICogVXNlZCBieSB0aGUgcGx1Z2luIHRvIHN1cmZhY2UgcmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIGxvY2FsIHRlbXBcbiAgICogZGlyIGF0IHN0YXJ0dXAgKHNlZSBgcmVtb3RlLXNraWxscy50c2ApLiBEYXRhYnJpY2tzLWhvc3RlZCByZW1vdGUgc2tpbGxzXG4gICAqIG5lZWQgbm8gZW50cnkgaGVyZSAtIHRoZXkgbGFuZCBpbiB0aGUgQXNzaXN0YW50IHRyZWUgdGhlIGJ1aWx0LWluIG1vdW50XG4gICAqIGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHNraWxsIGZvbGRlcnMgZXZlcnkgd29ya3NwYWNlIHN0YXJ0cyB3aXRoLlxuICpcbiAqIC0gYHdvcmtzcGFjZS10ZWFtYCAtIHRoZSBzaGFyZWQgd29ya3NwYWNlIEFzc2lzdGFudCB0cmVlLCByZWFkLW9ubHkgYmVjYXVzZVxuICogICB3cml0aW5nIGl0IGlzIGEgd29ya3NwYWNlLWFkbWluIGFjdGlvbi5cbiAqIC0gYHdvcmtzcGFjZS10ZWFtLWFwcGAgLSB0aGUgcmVxdWVzdGluZyB1c2VyJ3Mgb3duIEFzc2lzdGFudCB0cmVlLCB3cml0YWJsZVxuICogICBzbyB0aGUgYXBwIGNhbiBzYXZlIHNraWxscyBiYWNrIHRvIGl0LiBTa2lwcGVkIHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBub1xuICogICB1c2VyIGVtYWlsLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TS0lMTF9GT0xERVJTOiBSZWFkb25seTxSZWNvcmQ8RGVmYXVsdFNraWxsRm9sZGVyTmFtZSwgU2tpbGxGb2xkZXJPcHRpb25zPj4gPSB7XG4gIFwid29ya3NwYWNlLXRlYW1cIjoge1xuICAgIHBhdGg6IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEgsXG4gICAgcmVhZGFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICB9LFxuICBcIndvcmtzcGFjZS10ZWFtLWFwcFwiOiB7XG4gICAgcGF0aDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgICAgY29uc3QgZW1haWwgPSByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQpO1xuICAgICAgcmV0dXJuIGVtYWlsID8gdXNlckFzc2lzdGFudFNraWxsc1BhdGgoZW1haWwpIDogdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgcmVhZGFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gIH0sXG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgc2tpbGwgZm9sZGVycyBvbmx5XG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKClcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIE92ZXJyaWRlIGEgZGVmYXVsdCwgZHJvcCBhbm90aGVyLCBhbmQgYWRkIGEgbG9jYXRpb24gb2YgeW91ciBvd25cbiAqIGBgYHRzXG4gKiBjcmVhdGVXb3Jrc3BhY2Uoe1xuICogICBza2lsbEZvbGRlcnM6IHtcbiAqICAgICBcIndvcmtzcGFjZS10ZWFtXCI6IHsgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC90ZWFtLXNraWxsc1wiIH0sXG4gKiAgICAgXCJ3b3Jrc3BhY2UtdGVhbS1hcHBcIjogZmFsc2UsXG4gKiAgICAgcnVuYm9va3M6IHsgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC9ydW5ib29rcy9za2lsbHNcIiwgd3JpdGFibGU6IHRydWUgfSxcbiAqICAgICB2b2x1bWU6IHsgZmlsZXN5c3RlbTogbXlWb2x1bWVGaWxlc3lzdGVtIH0sXG4gKiAgIH0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU2tpbGwgZm9sZGVycyBwbHVzIGEgY3VzdG9tIG1vdW50IHJlc29sdmVyXG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKHtcbiAqICAgbW91bnRzOiBbXG4gKiAgICAgYXN5bmMgKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gKHtcbiAqICAgICAgIG1vdW50czogeyBcIi9kYXRhXCI6IG15RmlsZXN5c3RlbSB9LFxuICogICAgICAgc2tpbGxQYXRoczogW10sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXb3Jrc3BhY2Uob3B0aW9uczogQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyA9IHt9KTogV29ya3NwYWNlIHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnMpO1xuICBjb25zdCBza2lsbEZvbGRlcnMgPSByZXNvbHZlU2tpbGxGb2xkZXJzKG9wdGlvbnMpO1xuICBjb25zdCBmb2xkZXJOYW1lcyA9IE9iamVjdC5rZXlzKHNraWxsRm9sZGVycyk7XG4gIGNvbnN0IHJlc29sdmVycyA9IGJ1aWxkTW91bnRSZXNvbHZlcnMoc2tpbGxGb2xkZXJzLCBvcHRpb25zLm1vdW50cyk7XG4gIGNvbnN0IGV4dHJhU2tpbGxQYXRocyA9IG9wdGlvbnMuZXh0cmFTa2lsbFBhdGhzID8/IFtdO1xuICBjb25zdCBza2lsbHMgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKHJlc29sdmVycy5sZW5ndGggPiAwIHx8IGV4dHJhU2tpbGxQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIocmVzb2x2ZXJzLCBleHRyYVNraWxsUGF0aHMpXG4gICAgICA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZm9sZGVyTmFtZXMubGVuZ3RoID4gMDtcbiAgY29uc3QgYm0yNSA9IG9wdGlvbnMuYm0yNSAhPT0gZmFsc2U7XG4gIGNvbnN0IHNhbmRib3ggPSByZXNvbHZlV29ya3NwYWNlU2FuZGJveChvcHRpb25zLnNhbmRib3gsIGlkLCBuYW1lKTtcbiAgbG9nZ2VyLmRlYnVnKFwid29ya3NwYWNlOmNyZWF0ZVwiLCB7XG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICByZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICAgIHNraWxsRm9sZGVyczogZm9sZGVyTmFtZXMsXG4gICAgY3VzdG9tTW91bnRSZXNvbHZlcnM6IG9wdGlvbnMubW91bnRzPy5sZW5ndGggPz8gMCxcbiAgICBjdXN0b21Ta2lsbHNSZXNvbHZlcjogQm9vbGVhbihvcHRpb25zLnNraWxscyksXG4gICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICBibTI1LFxuICAgIGV4dHJhU2tpbGxQYXRoczogZXh0cmFTa2lsbFBhdGhzLmxlbmd0aCxcbiAgICBzYW5kYm94OiBzYW5kYm94ID8gc2FuZGJveE5hbWUob3B0aW9ucy5zYW5kYm94KSA6IFwiZGlzYWJsZWRcIixcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBXb3Jrc3BhY2Uoe1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogKGNvbnRleHQpID0+IHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKHJlc29sdmVycywgY29udGV4dCksXG4gICAgLi4uKHNraWxsc1xuICAgICAgPyB7XG4gICAgICAgICAgc2tpbGxzLFxuICAgICAgICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzYW5kYm94XG4gICAgICA/IHtcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIGluc3RydWN0aW9uczogeyBkeW5hbWljU2FuZGJveDogXCJyZXNvbHZlXCIgYXMgY29uc3QgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgYm0yNSxcbiAgfSk7XG59XG5cbi8qKlxuICogTWVyZ2UgdGhlIGNvbmZpZ3VyZWQgc2tpbGwgZm9sZGVycyBvdmVyIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LlxuICpcbiAqIGBhc3Npc3RhbnRTa2lsbHM6IGZhbHNlYCBkcm9wcyB0aGUgZGVmYXVsdHMsIGFuZCBhIGBmYWxzZWAgdmFsdWUgcmVtb3ZlcyBvbmVcbiAqIGVudHJ5IGJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJzKFxuICBvcHRpb25zOiBQaWNrPENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMsIFwiYXNzaXN0YW50U2tpbGxzXCIgfCBcInNraWxsRm9sZGVyc1wiPiA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPiB7XG4gIGNvbnN0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPiA9XG4gICAgb3B0aW9ucy5hc3Npc3RhbnRTa2lsbHMgPT09IGZhbHNlID8ge30gOiB7IC4uLkRFRkFVTFRfU0tJTExfRk9MREVSUyB9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBmb2xkZXJdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuc2tpbGxGb2xkZXJzID8/IHt9KSkge1xuICAgIGlmIChmb2xkZXIgPT09IGZhbHNlKSB7XG4gICAgICBkZWxldGUgbWVyZ2VkW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZWRbbmFtZV0gPSBmb2xkZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJpdmF0ZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3goXG4gIHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCxcbiAgd29ya3NwYWNlSWQ6IHN0cmluZyxcbiAgd29ya3NwYWNlTmFtZTogc3RyaW5nLFxuKTogV29ya3NwYWNlU2FuZGJveCB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBzZWxlY3Rpb24gPz8gXCJkYXRhYnJpY2tzXCI7XG4gIGlmIChjb25maWd1cmVkID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IFwibW9udHlcIikgcmV0dXJuIG5ldyBNb250eVNhbmRib3goKTtcbiAgaWYgKHR5cGVvZiBjb25maWd1cmVkID09PSBcImZ1bmN0aW9uXCIgfHwgaXNTYW5kYm94KGNvbmZpZ3VyZWQpKSByZXR1cm4gY29uZmlndXJlZDtcblxuICBjb25zdCBvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgPVxuICAgIGNvbmZpZ3VyZWQgPT09IFwiZGF0YWJyaWNrc1wiID8geyBwcm92aWRlcjogXCJkYXRhYnJpY2tzXCIgfSA6IGNvbmZpZ3VyZWQ7XG4gIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiB7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgICAgXCJEYXRhYnJpY2tzIHNhbmRib3ggdXNlciBjb250ZXh0XCIsXG4gICAgICAgIFwiSW52b2tlIGNvbW1hbmQgdG9vbHMgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgTWFzdHJhIHBsdWdpbi5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ3VyZWRJZCA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zYW5kYm94SWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG9wdGlvbnMuc2FuZGJveElkKHsgcmVxdWVzdENvbnRleHQgfSlcbiAgICAgICAgOiBvcHRpb25zLnNhbmRib3hJZDtcbiAgICBjb25zdCBzYW5kYm94SWQgPSBjb25maWd1cmVkSWQgPz8gZGVmYXVsdFNhbmRib3hJZCh3b3Jrc3BhY2VJZCwgdXNlci5pZCk7XG4gICAgY29uc3QgY2xpZW50ID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLmNsaWVudCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gb3B0aW9ucy5jbGllbnQoeyByZXF1ZXN0Q29udGV4dCB9KVxuICAgICAgICA6IChvcHRpb25zLmNsaWVudCA/PyBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKSk7XG4gICAgY29uc3Qge1xuICAgICAgcHJvdmlkZXI6IF9wcm92aWRlcixcbiAgICAgIHNhbmRib3hJZDogX3NhbmRib3hJZCxcbiAgICAgIGNsaWVudDogX2NsaWVudCxcbiAgICAgIC4uLnNhbmRib3hPcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzU2FuZGJveCh7XG4gICAgICAuLi5zYW5kYm94T3B0aW9ucyxcbiAgICAgIGNsaWVudCxcbiAgICAgIHNhbmRib3hJZCxcbiAgICAgIGRpc3BsYXlOYW1lOiBvcHRpb25zLmRpc3BsYXlOYW1lID8/IGBNYXN0cmEgJHt3b3Jrc3BhY2VOYW1lfWAsXG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTYW5kYm94SWQod29ya3NwYWNlSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgLnVwZGF0ZShvYmplY3QudG9TdGFibGVLZXkoeyB3b3Jrc3BhY2VJZCwgdXNlcklkIH0pKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMzIpO1xuICByZXR1cm4gYG1hc3RyYS0ke2RpZ2VzdH1gO1xufVxuXG5mdW5jdGlvbiBpc1NhbmRib3godmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VTYW5kYm94IHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiB2YWx1ZSAmJiBcInByb3ZpZGVyXCIgaW4gdmFsdWUgJiYgXCJzdGF0dXNcIiBpbiB2YWx1ZSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2FuZGJveE5hbWUoc2VsZWN0aW9uOiBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdGlvbiA9PT0gXCJkYXRhYnJpY2tzXCIpIHJldHVybiBcImRhdGFicmlja3NcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gXCJtb250eVwiKSByZXR1cm4gXCJtb250eVwiO1xuICBpZiAoc2VsZWN0aW9uID09PSBmYWxzZSkgcmV0dXJuIFwiZGlzYWJsZWRcIjtcbiAgaWYgKHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFwicmVzb2x2ZXJcIjtcbiAgcmV0dXJuIGlzU2FuZGJveChzZWxlY3Rpb24pID8gc2VsZWN0aW9uLnByb3ZpZGVyIDogKHNlbGVjdGlvbi5wcm92aWRlciA/PyBcImRhdGFicmlja3NcIik7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgdGhlIHJlcXVlc3QgdG9rZW4gY2FycmllcyBhIHNjb3BlIHRoYXQgYWxsb3dzIHdvcmtzcGFjZVxuICogZmlsZSBBUEkgYWNjZXNzIChgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIG9uIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0pLlxuICovXG5mdW5jdGlvbiBoYXNXb3Jrc3BhY2VGaWxlU2NvcGUocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbi5pbmNsdWRlc0FjY2Vzc1Rva2VuU2NvcGUoXG4gICAgcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfU0NPUEVTX0tFWSksXG4gICAgV09SS1NQQUNFX0ZJTEVfU0NPUEVTLFxuICApO1xufVxuXG4vKipcbiAqIE1vdW50IHJlc29sdmVyIGZvciB0aGUgbmFtZWQgc2tpbGwgZm9sZGVycy5cbiAqXG4gKiBHYXRlcyBvbiB3b3Jrc3BhY2UgZmlsZSBzY29wZSAob3IgZGV2ZWxvcG1lbnQgbW9kZSksIHRoZW4gbW91bnRzIGV2ZXJ5XG4gKiBmb2xkZXIgd2hvc2UgbG9jYXRpb24gcmVzb2x2ZXMgZm9yIHRoaXMgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyTW91bnRzKFxuICBza2lsbEZvbGRlcnM6IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucz4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbik6IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+IHtcbiAgY29uc3QgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiA9IHt9O1xuICBjb25zdCBza2lsbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQucmVxdWVzdENvbnRleHQ7XG5cbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCB8fCAhc2hvdWxkTW91bnRTa2lsbEZvbGRlcnMocmVxdWVzdENvbnRleHQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGwtZm9sZGVyczpza2lwcGVkXCIsIHtcbiAgICAgIHJlYXNvbjogIXJlcXVlc3RDb250ZXh0ID8gXCJuby1yZXF1ZXN0LWNvbnRleHRcIiA6IFwibWlzc2luZy13b3Jrc3BhY2Utc2NvcGVcIixcbiAgICAgIG5vZGVFbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuICAgICAgc2NvcGVzOiByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9TQ09QRVNfS0VZKSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHMgfTtcbiAgfVxuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0LmNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZm9sZGVyXSBvZiBPYmplY3QuZW50cmllcyhza2lsbEZvbGRlcnMpKSB7XG4gICAgY29uc3QgZmlsZXN5c3RlbSA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0obmFtZSwgZm9sZGVyLCBjb250ZXh0LCBjbGllbnQpO1xuICAgIGlmICghZmlsZXN5c3RlbSkgY29udGludWU7XG4gICAgY29uc3QgbW91bnQgPSBmb2xkZXIubW91bnQgPz8gYC8ke25hbWV9YDtcbiAgICBtb3VudHNbbW91bnRdID0gZmlsZXN5c3RlbTtcbiAgICBpZiAoZm9sZGVyLnJlYWRhYmxlICE9PSBmYWxzZSkgc2tpbGxQYXRocy5wdXNoKG1vdW50KTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7IG1vdW50cywgc2tpbGxQYXRocyB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25lIHNraWxsIGZvbGRlciB0byBhIE1hc3RyYSBmaWxlc3lzdGVtLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGl0XG4gKiBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJGaWxlc3lzdGVtKFxuICBuYW1lOiBzdHJpbmcsXG4gIGZvbGRlcjogU2tpbGxGb2xkZXJPcHRpb25zLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VGaWxlc3lzdGVtIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChmb2xkZXIuZmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlc29sdmVTa2lsbEZvbGRlclZhbHVlKGZvbGRlci5maWxlc3lzdGVtLCBjb250ZXh0KTtcbiAgfVxuICAvLyBBIHBhdGggbW91bnQgbmVlZHMgdGhlIHJlcXVlc3QncyBPQk8gY2xpZW50IHRvIHJlYWNoIHRoZSB3b3Jrc3BhY2UuXG4gIGlmIChmb2xkZXIucGF0aCA9PT0gdW5kZWZpbmVkIHx8ICFjbGllbnQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJza2lsbC1mb2xkZXI6c2tpcHBlZFwiLCB7XG4gICAgICBuYW1lLFxuICAgICAgcmVhc29uOiBmb2xkZXIucGF0aCA9PT0gdW5kZWZpbmVkID8gXCJuby1sb2NhdGlvblwiIDogXCJtaXNzaW5nLW9iby1jbGllbnRcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJvb3QgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlclZhbHVlKGZvbGRlci5wYXRoLCBjb250ZXh0KSk7XG4gIGlmICghcm9vdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRhdGFicmlja3NGaWxlc3lzdGVtKGNsaWVudCwgcm9vdCwgZm9sZGVyLndyaXRhYmxlICE9PSB0cnVlKTtcbn1cblxuLyoqIFJlYWQgYSB7QGxpbmsgU2tpbGxGb2xkZXJWYWx1ZX0sIGNhbGxpbmcgaXQgd2hlbiBpdCBpcyBhIHBlci1yZXF1ZXN0IHJlc29sdmVyLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyVmFsdWU8VD4oXG4gIHZhbHVlOiBTa2lsbEZvbGRlclZhbHVlPFQ+LFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pOiBUIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gKHZhbHVlIGFzIChjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQpID0+IFQgfCB1bmRlZmluZWQgfCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+KShjb250ZXh0KVxuICAgIDogdmFsdWU7XG59XG5cbi8qKlxuICogRmlsbCBpbiBgaWRgIGFuZCBgbmFtZWAgd2hlbiBlaXRoZXIgaXMgb21pdHRlZCBvbiB7QGxpbmsgQ3JlYXRlV29ya3NwYWNlT3B0aW9uc30uXG4gKiBTbHVnaWZpZXMgYG5hbWVgIGludG8gYGlkYDsgdG9rZW5pemVzIGBpZGAgaW50byBhIGRpc3BsYXkgYG5hbWVgLlxuICovXG5mdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlSWRlbnRpdHkob3B0aW9uczogQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyk6IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xufSB7XG4gIGxldCBpZCA9IG9wdGlvbnMuaWQ7XG4gIGxldCBuYW1lID0gb3B0aW9ucy5uYW1lO1xuICBpZiAoIWlkKSB7XG4gICAgaWQgPSBuYW1lID8gc3RyaW5nVXRpbHMudG9TbHVnKG5hbWUpIDogXCJ3b3Jrc3BhY2VcIjtcbiAgfVxuICBpZiAoIW5hbWUpIHtcbiAgICBuYW1lID0gQXJyYXkuZnJvbShzdHJpbmdVdGlscy50b2tlbml6ZShpZCkpLmpvaW4oXCIgXCIpO1xuICB9XG4gIHJldHVybiB7IGlkLCBuYW1lIH07XG59XG5cbi8qKiBDb2xsZWN0IHRoZSBza2lsbC1mb2xkZXIgcmVzb2x2ZXIgYW5kIGFueSBjYWxsZXItc3VwcGxpZWQgb25lcy4gKi9cbmZ1bmN0aW9uIGJ1aWxkTW91bnRSZXNvbHZlcnMoXG4gIHNraWxsRm9sZGVyczogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPixcbiAgbW91bnRzOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10gfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtdO1xuICBjb25zdCBmb2xkZXJDb3VudCA9IE9iamVjdC5rZXlzKHNraWxsRm9sZGVycykubGVuZ3RoO1xuICBpZiAoZm9sZGVyQ291bnQgPiAwKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goKGNvbnRleHQpID0+IHJlc29sdmVTa2lsbEZvbGRlck1vdW50cyhza2lsbEZvbGRlcnMsIGNvbnRleHQpKTtcbiAgfVxuICBpZiAobW91bnRzPy5sZW5ndGgpIHtcbiAgICByZXNvbHZlcnMucHVzaCguLi5tb3VudHMpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czpyZXNvbHZlcnNcIiwge1xuICAgIHNraWxsRm9sZGVyQ291bnQ6IGZvbGRlckNvdW50LFxuICAgIGN1c3RvbVJlc29sdmVyQ291bnQ6IG1vdW50cz8ubGVuZ3RoID8/IDAsXG4gICAgdG90YWxSZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVycztcbn1cblxuLyoqXG4gKiBHYXRlIHNraWxsLWZvbGRlciBtb3VudHMgb24gdGhlIHJlcXVlc3QncyB0b2tlbi5cbiAqXG4gKiBBbHdheXMgYWxsb3dzIG1vdW50cyBpbiBkZXZlbG9wbWVudDsgaW4gb3RoZXIgZW52aXJvbm1lbnRzIHJlcXVpcmVzXG4gKiB7QGxpbmsgaGFzV29ya3NwYWNlRmlsZVNjb3BlfS5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkTW91bnRTa2lsbEZvbGRlcnMocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogYm9vbGVhbiB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dCk7XG59XG5cbi8qKiBSZWFkIHRoZSB0cmltbWVkIE9CTyB1c2VyIGVtYWlsIHN0YW1wZWQgb24ge0BsaW5rIE1BU1RSQV9VU0VSX0VNQUlMX0tFWX0uICovXG5mdW5jdGlvbiByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpKSA/PyB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV3JhcCBhIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX0gYXMgYSBNYXN0cmEgZmlsZXN5c3RlbS4gV2hlbiB0aGUgcm9vdCBpc1xuICogbWlzc2luZyAoYW5kIHtAbGluayByZWFkT25seX0gc28gd2Ugd2lsbCBub3QgY3JlYXRlIGl0KSwgZmFsbCBiYWNrIHRvXG4gKiB7QGxpbmsgc2NyYXRjaEZpbGVzeXN0ZW19IHNvIHNraWxsIHNjYW5zIHN0aWxsIGhhdmUgYSB3cml0YWJsZSBsb2NhbCBtb3VudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGF0YWJyaWNrc0ZpbGVzeXN0ZW0oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICByb290OiBzdHJpbmcsXG4gIHJlYWRPbmx5OiBib29sZWFuID0gdHJ1ZSxcbik6IFByb21pc2U8V29ya3NwYWNlRmlsZXN5c3RlbT4ge1xuICBjb25zdCBmcyA9IG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7XG4gICAgY2xpZW50OiB3b3Jrc3BhY2VDbGllbnQudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoY2xpZW50KSxcbiAgICByb290LFxuICAgIHJlYWRPbmx5LFxuICAgIGNyZWF0ZVJvb3Q6ICFyZWFkT25seSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMuaW5pdCgpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4gZmlsZXN5c3RlbXMoZnMsIHsgcmVhZE9ubHkgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OnNjcmF0Y2gtZmFsbGJhY2tcIiwge1xuICAgICAgcm9vdCxcbiAgICAgIHJlYWRPbmx5LFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHNjcmF0Y2hGaWxlc3lzdGVtKCk7XG59XG5cbi8qKlxuICogUnVuIGV2ZXJ5IG1vdW50IHJlc29sdmVyIGZvciBvbmUgcmVxdWVzdCBhbmQgbWVyZ2UgbW91bnRzIHBsdXMgc2tpbGwgcGF0aHMuXG4gKiBMYXRlciByZXNvbHZlcnMgb3ZlcndyaXRlIG1vdW50IGtleXMgZnJvbSBlYXJsaWVyIG9uZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24oXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzb2x2ZXJdIG9mIHJlc29sdmVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlcihjb250ZXh0KTtcbiAgICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJcIiwge1xuICAgICAgaW5kZXgsXG4gICAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKGNvbnRyaWJ1dGlvbi5tb3VudHMpLFxuICAgICAgc2tpbGxQYXRoczogY29udHJpYnV0aW9uLnNraWxsUGF0aHMgPz8gW10sXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihtb3VudHMsIGNvbnRyaWJ1dGlvbi5tb3VudHMpO1xuICAgIGlmIChjb250cmlidXRpb24uc2tpbGxQYXRocz8ubGVuZ3RoKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uY29udHJpYnV0aW9uLnNraWxsUGF0aHMpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czptZXJnZWRcIiwge1xuICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMobW91bnRzKSxcbiAgICBza2lsbFBhdGhzLFxuICB9KTtcblxuICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHMgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IHdoZW4gYW55IG1vdW50IHJlc29sdmVkOyBvdGhlcndpc2UgYVxuICogZnJlc2gge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfSBzbyBNYXN0cmEgYWx3YXlzIGhhcyBhIHdyaXRhYmxlIGxvY2FsIHJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VGaWxlc3lzdGVtPiB7XG4gIGNvbnN0IHsgbW91bnRzIH0gPSBhd2FpdCByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKHJlc29sdmVycywgY29udGV4dCk7XG4gIGNvbnN0IG1vdW50S2V5cyA9IE9iamVjdC5rZXlzKG1vdW50cyk7XG4gIGlmIChtb3VudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpzY3JhdGNoXCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBzY3JhdGNoRmlsZXN5c3RlbSgpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06Y29tcG9zaXRlXCIsIHsgbW91bnRLZXlzIH0pO1xuICByZXR1cm4gbmV3IENvbXBvc2l0ZUZpbGVzeXN0ZW0oeyBtb3VudHMgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGR5bmFtaWMge0BsaW5rIFNraWxsc1Jlc29sdmVyfSB0aGF0IGNvbGxlY3RzIGBza2lsbFBhdGhzYCBmcm9tXG4gKiBldmVyeSBtb3VudCByZXNvbHZlciBvbiBlYWNoIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBleHRyYVNraWxsUGF0aHM6IHN0cmluZ1tdID0gW10sXG4pOiBTa2lsbHNSZXNvbHZlciB7XG4gIHJldHVybiBhc3luYyAoY29udGV4dDogU2tpbGxzQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgc2tpbGxQYXRocyB9ID0gYXdhaXQgcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgIGNvbnN0IG1lcmdlZCA9IFsuLi4oc2tpbGxQYXRocyA/PyBbXSksIC4uLmV4dHJhU2tpbGxQYXRoc107XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGxzOnJlc29sdmVkXCIsIHsgc2tpbGxQYXRocywgZXh0cmFTa2lsbFBhdGhzIH0pO1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH07XG59XG4iXX0=
|
package/lib/src/writer.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
12
|
-
import {
|
|
12
|
+
import { errorUtils } from "@dbx-tools/shared-core";
|
|
13
13
|
import { GENIE_PROGRESS_PART_TYPE } from "@dbx-tools/shared-mastra";
|
|
14
14
|
/**
|
|
15
15
|
* Best-effort native custom progress write. No-op when the writer or owning
|
|
@@ -36,8 +36,8 @@ export async function safeWriteProgress(log, writer, toolCallId, event, context
|
|
|
36
36
|
catch (err) {
|
|
37
37
|
log.warn("writer:error", {
|
|
38
38
|
...context,
|
|
39
|
-
error:
|
|
39
|
+
error: errorUtils.errorMessage(err),
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dyaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBTyxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSx3QkFBd0IsRUFBeUIsTUFBTSwwQkFBMEIsQ0FBQztBQUczRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxHQUFlLEVBQ2YsTUFBc0MsRUFDdEMsVUFBOEIsRUFDOUIsS0FBdUIsRUFDdkIsVUFBbUMsRUFBRTtJQUVyQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QyxPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNsQixJQUFJLEVBQUUsd0JBQXdCO1lBQzlCLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUU7U0FDNUIsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixHQUFHLE9BQU87WUFDVixLQUFLLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7U0FDcEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCBoZWxwZXIgZm9yIHB1Ymxpc2hpbmcgR2VuaWUgcHJvZ3Jlc3MgdGhyb3VnaCBNYXN0cmEncyBuYXRpdmVcbiAqIGBjdHgud3JpdGVyLmN1c3RvbSgpYCBkYXRhLXBhcnQgc3VyZmFjZS5cbiAqXG4gKiBGYWlsdXJlcyBhcmUgbG9nZ2VkIGF0IGB3YXJuYCAoYSBwZXJzaXN0ZW50bHktY2xvc2VkIHdyaXRlciBpc1xuICogdGhlIG1vc3QgbGlrZWx5IGN1bHByaXQgd2hlbiBldmVudHMgZ28gbWlzc2luZyBjbGllbnQtc2lkZSkgYnV0XG4gKiBzd2FsbG93ZWQgc28gYSBjYW5jZWxsZWQgcmVxdWVzdCBvciBhIGNsaWVudCB0aGF0IG5hdmlnYXRlZFxuICogYXdheSBjYW4ndCBjcmFzaCBhIHRvb2wgbWlkLWZsaWdodC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IEdFTklFX1BST0dSRVNTX1BBUlRfVFlQRSwgdHlwZSBHZW5pZVdyaXRlckV2ZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHR5cGUgeyBUb29sRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBuYXRpdmUgY3VzdG9tIHByb2dyZXNzIHdyaXRlLiBOby1vcCB3aGVuIHRoZSB3cml0ZXIgb3Igb3duaW5nXG4gKiB0b29sIGNhbGwgaWQgaXMgdW5hdmFpbGFibGU7XG4gKiBjYXVnaHQgZXJyb3JzIGFyZSBsb2dnZWQgdmlhIGBsb2cud2FybihcIndyaXRlcjplcnJvclwiLCAuLi4pYFxuICogYWxvbmcgd2l0aCBhbnkgY2FsbGVyLXN1cHBsaWVkIGBjb250ZXh0YCBmaWVsZHMgKGUuZy4gYVxuICogYGNoYXJ0SWRgIG9yIGBtZXNzYWdlSWRgKSBzbyB0aGUgd2FybmluZyBpcyBncmVwcGFibGUgcGVyXG4gKiByZXNvdXJjZS5cbiAqXG4gKiBSZXR1cm5zIHdoZW4gdGhlIHdyaXRlIHJlc29sdmVzIG9yIHJlamVjdHM7IG5ldmVyIHRocm93cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhZmVXcml0ZVByb2dyZXNzKFxuICBsb2c6IGxvZy5Mb2dnZXIsXG4gIHdyaXRlcjogVG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZXJcIl0sXG4gIHRvb2xDYWxsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZXZlbnQ6IEdlbmllV3JpdGVyRXZlbnQsXG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCF3cml0ZXIgfHwgIXRvb2xDYWxsSWQpIHtcbiAgICBsb2cuZGVidWcoXCJ3cml0ZXI6bm8td3JpdGVyXCIsIGNvbnRleHQpO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlci5jdXN0b20oe1xuICAgICAgdHlwZTogR0VOSUVfUFJPR1JFU1NfUEFSVF9UWVBFLFxuICAgICAgZGF0YTogeyB0b29sQ2FsbElkLCBldmVudCB9LFxuICAgIH0pO1xuICAgIGxvZy5kZWJ1ZyhcIndyaXRlcjpva1wiLCBjb250ZXh0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oXCJ3cml0ZXI6ZXJyb3JcIiwge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/filesystems.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/
|
|
1
|
+
{"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/filesystems.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/sandbox.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/trace-io.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -32,27 +32,27 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@databricks/appkit": "0.81.0",
|
|
35
|
-
"@dbx-tools/appkit": "^0.9.
|
|
36
|
-
"@dbx-tools/core": "^0.9.
|
|
37
|
-
"@dbx-tools/databricks": "^0.9.
|
|
38
|
-
"@dbx-tools/fs": "^0.9.
|
|
39
|
-
"@dbx-tools/genie": "^0.9.
|
|
40
|
-
"@dbx-tools/model": "^0.9.
|
|
41
|
-
"@dbx-tools/model-rs": "^0.9.
|
|
42
|
-
"@dbx-tools/path": "^0.9.
|
|
43
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
44
|
-
"@dbx-tools/shared-fs": "^0.9.
|
|
45
|
-
"@dbx-tools/shared-genie": "^0.9.
|
|
46
|
-
"@dbx-tools/shared-mastra": "^0.9.
|
|
47
|
-
"@dbx-tools/shared-model": "^0.9.
|
|
35
|
+
"@dbx-tools/appkit": "^0.9.7",
|
|
36
|
+
"@dbx-tools/core": "^0.9.7",
|
|
37
|
+
"@dbx-tools/databricks": "^0.9.7",
|
|
38
|
+
"@dbx-tools/fs": "^0.9.7",
|
|
39
|
+
"@dbx-tools/genie": "^0.9.7",
|
|
40
|
+
"@dbx-tools/model": "^0.9.7",
|
|
41
|
+
"@dbx-tools/model-rs": "^0.9.7",
|
|
42
|
+
"@dbx-tools/path": "^0.9.7",
|
|
43
|
+
"@dbx-tools/shared-core": "^0.9.7",
|
|
44
|
+
"@dbx-tools/shared-fs": "^0.9.7",
|
|
45
|
+
"@dbx-tools/shared-genie": "^0.9.7",
|
|
46
|
+
"@dbx-tools/shared-mastra": "^0.9.7",
|
|
47
|
+
"@dbx-tools/shared-model": "^0.9.7",
|
|
48
48
|
"@mastra/ai-sdk": "1.10.5",
|
|
49
49
|
"@mastra/core": "1.71.0",
|
|
50
|
-
"@mastra/express": "1.5.
|
|
50
|
+
"@mastra/express": "1.5.15",
|
|
51
51
|
"@mastra/fastembed": "1.3.2",
|
|
52
52
|
"@mastra/mcp": "2.1.0",
|
|
53
53
|
"@mastra/memory": "1.32.1",
|
|
54
|
-
"@mastra/observability": "1.18.
|
|
55
|
-
"@mastra/otel-bridge": "1.5.
|
|
54
|
+
"@mastra/observability": "1.18.1",
|
|
55
|
+
"@mastra/otel-bridge": "1.5.11",
|
|
56
56
|
"@mastra/pg": "1.27.1",
|
|
57
57
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
58
58
|
"@opentelemetry/api": "^1.9.1",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"./package.json": "./package.json"
|
|
76
76
|
}
|
|
77
77
|
},
|
|
78
|
-
"version": "0.9.
|
|
78
|
+
"version": "0.9.7",
|
|
79
79
|
"types": "./lib/index.d.ts",
|
|
80
80
|
"type": "module",
|
|
81
81
|
"exports": {
|
package/src/agents.ts
CHANGED
|
@@ -23,8 +23,8 @@ import type {
|
|
|
23
23
|
ToolkitOptions as AppKitToolkitOptions,
|
|
24
24
|
ToolProvider,
|
|
25
25
|
} from "@databricks/appkit/beta";
|
|
26
|
-
import {
|
|
27
|
-
import { log, object,
|
|
26
|
+
import { pluginRegistry, toolkitEntries } from "@dbx-tools/appkit";
|
|
27
|
+
import { log, object, stringUtils } from "@dbx-tools/shared-core";
|
|
28
28
|
import type {
|
|
29
29
|
AgentConfig,
|
|
30
30
|
AgentExecutionOptions,
|
|
@@ -147,7 +147,7 @@ export interface AppKitToolOptions {
|
|
|
147
147
|
* words don't collide in traces. Stable across runs.
|
|
148
148
|
*/
|
|
149
149
|
function deriveToolId(description: string): string {
|
|
150
|
-
return
|
|
150
|
+
return stringUtils.toUniqueSlug(description, { fallbackPrefix: "tool" });
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
/**
|
|
@@ -522,7 +522,7 @@ function defaultAgentDescription(name: string): string {
|
|
|
522
522
|
*/
|
|
523
523
|
export async function buildAgents(opts: {
|
|
524
524
|
config: MastraPluginConfig;
|
|
525
|
-
context:
|
|
525
|
+
context: pluginRegistry.PluginContextLike | undefined;
|
|
526
526
|
memoryBuilder?: MemoryBuilder;
|
|
527
527
|
log: log.Logger;
|
|
528
528
|
/**
|
|
@@ -759,7 +759,7 @@ function resolveDefinitions(config: MastraPluginConfig): Record<string, AnyMastr
|
|
|
759
759
|
/** Derive a registry id from a definition's `name`, with a fallback. */
|
|
760
760
|
function deriveAgentKey(def: AnyMastraAgentDefinition, index?: number): string {
|
|
761
761
|
if (def.name) {
|
|
762
|
-
const slug =
|
|
762
|
+
const slug = stringUtils.toIdentifier(def.name);
|
|
763
763
|
if (slug) return slug;
|
|
764
764
|
}
|
|
765
765
|
return index === undefined ? FALLBACK_AGENT_ID : `agent_${index}`;
|
|
@@ -852,7 +852,7 @@ function resolveAgentWorkspace(
|
|
|
852
852
|
*/
|
|
853
853
|
function buildPluginsMap(
|
|
854
854
|
config: MastraPluginConfig,
|
|
855
|
-
context:
|
|
855
|
+
context: pluginRegistry.PluginContextLike | undefined,
|
|
856
856
|
): MastraPlugins {
|
|
857
857
|
const cache = new Map<string, MastraPluginToolkitProvider | null>();
|
|
858
858
|
return new Proxy({} as MastraPlugins, {
|
|
@@ -886,7 +886,7 @@ function buildPluginsMap(
|
|
|
886
886
|
*/
|
|
887
887
|
function resolveProvider(
|
|
888
888
|
config: MastraPluginConfig,
|
|
889
|
-
context:
|
|
889
|
+
context: pluginRegistry.PluginContextLike | undefined,
|
|
890
890
|
propName: string,
|
|
891
891
|
): MastraPluginToolkitProvider | null {
|
|
892
892
|
if (propName === "genie") {
|
|
@@ -952,7 +952,7 @@ function toolkitEntriesFromDefinitions(
|
|
|
952
952
|
definitions: AgentToolDefinition[],
|
|
953
953
|
options: ToolkitOptions = {},
|
|
954
954
|
): Record<string, ToolkitEntry> {
|
|
955
|
-
return
|
|
955
|
+
return toolkitEntries.entries(pluginName, definitions, options);
|
|
956
956
|
}
|
|
957
957
|
|
|
958
958
|
function isPromiseLike<T>(value: T | Promise<T>): value is Promise<T> {
|
package/src/chart.ts
CHANGED
|
@@ -29,16 +29,16 @@
|
|
|
29
29
|
|
|
30
30
|
import { AppKitError, CacheManager, ExecutionError } from "@databricks/appkit";
|
|
31
31
|
import {
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
asyncUtils,
|
|
33
|
+
errorUtils,
|
|
34
34
|
hash,
|
|
35
35
|
json,
|
|
36
36
|
log,
|
|
37
37
|
object,
|
|
38
|
-
|
|
38
|
+
stringUtils,
|
|
39
39
|
type BrandContext,
|
|
40
40
|
} from "@dbx-tools/shared-core";
|
|
41
|
-
import {
|
|
41
|
+
import { markers, wire, type Chart, type ChartResult } from "@dbx-tools/shared-mastra";
|
|
42
42
|
import { model } from "@dbx-tools/shared-model";
|
|
43
43
|
import { Agent } from "@mastra/core/agent";
|
|
44
44
|
import type { RequestContext } from "@mastra/core/request-context";
|
|
@@ -169,7 +169,7 @@ export const chartPlanSchema = z.object({
|
|
|
169
169
|
.nullable()
|
|
170
170
|
.default(null)
|
|
171
171
|
.describe(
|
|
172
|
-
|
|
172
|
+
stringUtils.toDescription(`
|
|
173
173
|
Short title shown above the chart. Use null to fall back to the
|
|
174
174
|
\`title\` argument the caller passed in.
|
|
175
175
|
`),
|
|
@@ -179,7 +179,7 @@ export const chartPlanSchema = z.object({
|
|
|
179
179
|
.nullable()
|
|
180
180
|
.default(null)
|
|
181
181
|
.describe(
|
|
182
|
-
|
|
182
|
+
stringUtils.toDescription(`
|
|
183
183
|
Axis label for the primary (usually bottom / value) axis.
|
|
184
184
|
Used for bar / horizontalBar / line / area / combo / waterfall
|
|
185
185
|
/ scatter / heatmap; use null for pie / funnel / treemap / radar.
|
|
@@ -190,7 +190,7 @@ export const chartPlanSchema = z.object({
|
|
|
190
190
|
.nullable()
|
|
191
191
|
.default(null)
|
|
192
192
|
.describe(
|
|
193
|
-
|
|
193
|
+
stringUtils.toDescription(`
|
|
194
194
|
Axis label for the secondary (usually left) axis. Used for
|
|
195
195
|
bar / horizontalBar / line / area / combo / waterfall /
|
|
196
196
|
scatter / heatmap; use null for pie / funnel / treemap / radar.
|
|
@@ -201,7 +201,7 @@ export const chartPlanSchema = z.object({
|
|
|
201
201
|
.nullable()
|
|
202
202
|
.default(null)
|
|
203
203
|
.describe(
|
|
204
|
-
|
|
204
|
+
stringUtils.toDescription(`
|
|
205
205
|
Primary category labels. For \`bar\` / \`horizontalBar\` /
|
|
206
206
|
\`line\` / \`area\` / \`combo\` / \`waterfall\`: one label per
|
|
207
207
|
data point. For \`heatmap\`: x-axis categories. For \`radar\`:
|
|
@@ -215,7 +215,7 @@ export const chartPlanSchema = z.object({
|
|
|
215
215
|
.nullable()
|
|
216
216
|
.default(null)
|
|
217
217
|
.describe(
|
|
218
|
-
|
|
218
|
+
stringUtils.toDescription(`
|
|
219
219
|
Y-axis (row) labels for \`heatmap\`. Use null when the
|
|
220
220
|
row labels come from the series names, which is the preferred
|
|
221
221
|
way to build a heatmap. Use null for every other chart type.
|
|
@@ -225,7 +225,7 @@ export const chartPlanSchema = z.object({
|
|
|
225
225
|
.array(
|
|
226
226
|
z.object({
|
|
227
227
|
name: z.string().describe(
|
|
228
|
-
|
|
228
|
+
stringUtils.toDescription(`
|
|
229
229
|
Legend name for this series.
|
|
230
230
|
`),
|
|
231
231
|
),
|
|
@@ -238,7 +238,7 @@ export const chartPlanSchema = z.object({
|
|
|
238
238
|
"Which y-axis to bind (0 = left, 1 = right). Use on `combo` when series have different units or scales; use null otherwise.",
|
|
239
239
|
),
|
|
240
240
|
data: z.array(chartDataPointSchema).describe(
|
|
241
|
-
|
|
241
|
+
stringUtils.toDescription(`
|
|
242
242
|
Data points. For category charts (\`bar\` / \`horizontalBar\`
|
|
243
243
|
/ \`line\` / \`area\` / \`combo\` / \`waterfall\` / \`radar\`),
|
|
244
244
|
an array of numbers aligned to \`categories\`; for
|
|
@@ -254,7 +254,7 @@ export const chartPlanSchema = z.object({
|
|
|
254
254
|
)
|
|
255
255
|
.default([])
|
|
256
256
|
.describe(
|
|
257
|
-
|
|
257
|
+
stringUtils.toDescription(`
|
|
258
258
|
One or more series to plot. Required for every chart type
|
|
259
259
|
except \`custom\`, which carries its series inside \`option\`.
|
|
260
260
|
Slice charts (\`pie\` / \`funnel\` / \`treemap\`) and
|
|
@@ -268,7 +268,7 @@ export const chartPlanSchema = z.object({
|
|
|
268
268
|
.nullable()
|
|
269
269
|
.default(null)
|
|
270
270
|
.describe(
|
|
271
|
-
|
|
271
|
+
stringUtils.toDescription(`
|
|
272
272
|
Required for \`custom\`; use null for every other chart type. A
|
|
273
273
|
COMPLETE Echarts option, as a JSON object encoded in a string:
|
|
274
274
|
\`series\` (each with its own \`type\` and that series' own data
|
|
@@ -294,7 +294,7 @@ type ChartPlanInput = z.input<typeof chartPlanSchema>;
|
|
|
294
294
|
*/
|
|
295
295
|
export const chartPlannerRequestSchema = z.object({
|
|
296
296
|
title: z.string().describe(
|
|
297
|
-
|
|
297
|
+
stringUtils.toDescription(`
|
|
298
298
|
Concise title shown above the chart (e.g. "Top 10 SKUs by Revenue").
|
|
299
299
|
`),
|
|
300
300
|
),
|
|
@@ -302,7 +302,7 @@ export const chartPlannerRequestSchema = z.object({
|
|
|
302
302
|
.string()
|
|
303
303
|
.optional()
|
|
304
304
|
.describe(
|
|
305
|
-
|
|
305
|
+
stringUtils.toDescription(`
|
|
306
306
|
One-line intent the chart-planner uses when picking a chart type
|
|
307
307
|
and axis encodings (e.g. "compare quarterly revenue across
|
|
308
308
|
regions", "highlight the steep drop after position 5"). Not shown
|
|
@@ -314,7 +314,7 @@ export const chartPlannerRequestSchema = z.object({
|
|
|
314
314
|
.nonempty("Data must contain at least one row")
|
|
315
315
|
.readonly()
|
|
316
316
|
.describe(
|
|
317
|
-
|
|
317
|
+
stringUtils.toDescription(`
|
|
318
318
|
Tabular dataset to chart. One object per row, keyed by column
|
|
319
319
|
name. Values may be strings, numbers, booleans, or null. The
|
|
320
320
|
chart-planner decides which columns are categories vs. numeric
|
|
@@ -363,7 +363,7 @@ function formatChartTypePicker(): string {
|
|
|
363
363
|
* System prompt for the inner chart-planning agent. Tuned for a
|
|
364
364
|
* fast-tier model (Haiku, GPT-5-mini, Gemini Flash Lite).
|
|
365
365
|
*/
|
|
366
|
-
const CHART_PLANNER_INSTRUCTIONS =
|
|
366
|
+
const CHART_PLANNER_INSTRUCTIONS = stringUtils.toDescription(`
|
|
367
367
|
You design Apache Echarts visualizations. The user gives you a
|
|
368
368
|
tabular dataset (rows of objects) plus a title and an optional
|
|
369
369
|
description of the intent. You produce a small chart plan (chart
|
|
@@ -471,7 +471,7 @@ async function runChartPlanner(
|
|
|
471
471
|
): Promise<ChartResult> {
|
|
472
472
|
const { title, description, data } = request;
|
|
473
473
|
const { requestContext, abortSignal } = options;
|
|
474
|
-
const prompt =
|
|
474
|
+
const prompt = stringUtils.toDescription({
|
|
475
475
|
Title: title,
|
|
476
476
|
...(description ? { Description: description } : {}),
|
|
477
477
|
"Dataset (JSON, one row per object)": JSON.stringify(data, null, 2),
|
|
@@ -515,7 +515,7 @@ async function writeChart(entry: Chart, userKey: string): Promise<void> {
|
|
|
515
515
|
} catch (err) {
|
|
516
516
|
logger.warn("write-error", {
|
|
517
517
|
chartId: entry.chartId,
|
|
518
|
-
error:
|
|
518
|
+
error: errorUtils.errorMessage(err),
|
|
519
519
|
});
|
|
520
520
|
}
|
|
521
521
|
}
|
|
@@ -533,7 +533,7 @@ async function readChart(chartId: string, userKey: string): Promise<Chart | unde
|
|
|
533
533
|
} catch (err) {
|
|
534
534
|
logger.warn("read-error", {
|
|
535
535
|
chartId,
|
|
536
|
-
error:
|
|
536
|
+
error: errorUtils.errorMessage(err),
|
|
537
537
|
});
|
|
538
538
|
return undefined;
|
|
539
539
|
}
|
|
@@ -599,7 +599,7 @@ export async function prepareChart(opts: PrepareChartOptions): Promise<ChartTool
|
|
|
599
599
|
// Fire-and-forget. Failures land in the cache as `error` entries;
|
|
600
600
|
// never escape into an unhandled rejection.
|
|
601
601
|
void runPrepareChart(chartId, opts);
|
|
602
|
-
return { chartId, marker:
|
|
602
|
+
return { chartId, marker: markers.formatMarker("chart", chartId) };
|
|
603
603
|
}
|
|
604
604
|
|
|
605
605
|
async function runPrepareChart(chartId: string, opts: PrepareChartOptions): Promise<void> {
|
|
@@ -628,7 +628,7 @@ async function runPrepareChart(chartId: string, opts: PrepareChartOptions): Prom
|
|
|
628
628
|
elapsedMs: Date.now() - startedAt,
|
|
629
629
|
});
|
|
630
630
|
} catch (err) {
|
|
631
|
-
logger.warn("error", { chartId, error:
|
|
631
|
+
logger.warn("error", { chartId, error: errorUtils.errorMessage(err) });
|
|
632
632
|
// The entry's `error` is rendered in the chat, so only an AppKitError's
|
|
633
633
|
// own message travels; anything else could carry upstream provider detail.
|
|
634
634
|
const errText = err instanceof AppKitError ? err.message : CHART_FAILED_MESSAGE;
|
|
@@ -693,7 +693,7 @@ export async function fetchChart(
|
|
|
693
693
|
if (last.result !== undefined || last.error !== undefined) return last;
|
|
694
694
|
const remaining = deadline - Date.now();
|
|
695
695
|
if (remaining <= 0) return last;
|
|
696
|
-
await
|
|
696
|
+
await asyncUtils.sleep(Math.min(intervalMs, remaining), options.signal);
|
|
697
697
|
}
|
|
698
698
|
}
|
|
699
699
|
|
|
@@ -1198,7 +1198,7 @@ export function planToEchartsOption(
|
|
|
1198
1198
|
export function buildRenderDataTool(config: MastraPluginConfig) {
|
|
1199
1199
|
return createTool({
|
|
1200
1200
|
id: "render_data",
|
|
1201
|
-
description:
|
|
1201
|
+
description: stringUtils.toDescription([
|
|
1202
1202
|
`
|
|
1203
1203
|
Submit a tabular dataset for inline rendering as a chart in
|
|
1204
1204
|
the user's view. Pass a title, the raw rows (array of objects
|
package/src/evaluation.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { DriveResult, EvalDriver } from "@databricks/appkit/beta";
|
|
8
|
-
import {
|
|
8
|
+
import { errorUtils, hash, object } from "@dbx-tools/shared-core";
|
|
9
9
|
import type { Agent } from "@mastra/core/agent";
|
|
10
10
|
import type { RequestContext } from "@mastra/core/request-context";
|
|
11
11
|
|
|
@@ -60,7 +60,7 @@ export function createMastraEvalDriver(
|
|
|
60
60
|
};
|
|
61
61
|
} catch (caught) {
|
|
62
62
|
return {
|
|
63
|
-
reply:
|
|
63
|
+
reply: errorUtils.errorMessage(caught),
|
|
64
64
|
toolCalls: [],
|
|
65
65
|
toolCallDetails: [],
|
|
66
66
|
succeeded: false,
|