@dbx-tools/auth 0.9.51 → 0.9.54
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 +11 -3
- package/index.ts +3 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +3 -2
- package/lib/src/_profile-config.js +17 -7
- package/lib/src/client.js +15 -1
- package/lib/src/runtime-auth.d.ts +21 -0
- package/lib/src/runtime-auth.js +139 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -4
- package/src/_profile-config.ts +20 -5
- package/src/client.ts +15 -0
- package/src/runtime-auth.ts +209 -0
package/README.md
CHANGED
|
@@ -5,8 +5,9 @@ Node.js and Bun.
|
|
|
5
5
|
|
|
6
6
|
The package resolves profile configuration, selects PAT, M2M, CLI U2M, App
|
|
7
7
|
service-principal, or App OBO authentication, and coordinates token acquisition
|
|
8
|
-
in process memory.
|
|
9
|
-
|
|
8
|
+
in process memory. Generated Python bindings can also accept authentication from
|
|
9
|
+
the shared Python runtime. The Node package does not own workspace HTTP APIs or
|
|
10
|
+
construct Databricks SDK clients.
|
|
10
11
|
|
|
11
12
|
## Features
|
|
12
13
|
|
|
@@ -14,9 +15,11 @@ SDK clients.
|
|
|
14
15
|
- Secret-free configured profile enumeration.
|
|
15
16
|
- CLI-backed U2M token and login commands.
|
|
16
17
|
- Direct PAT, M2M, App service-principal, and request-scoped App OBO tokens.
|
|
18
|
+
- Automatic Python SDK runtime authentication for empty binding options.
|
|
17
19
|
- Check-lock-recheck token acquisition and explicit token refresh.
|
|
18
20
|
- Authentication headers with the resolved workspace ID when available.
|
|
19
|
-
- No SDK, generic HTTP client, executable installer, or persistent
|
|
21
|
+
- No JavaScript SDK, generic HTTP client, executable installer, or persistent
|
|
22
|
+
token cache.
|
|
20
23
|
|
|
21
24
|
CLI-backed U2M requires an available `databricks` executable or an explicit
|
|
22
25
|
`DATABRICKS_CLI_PATH`. The Databricks CLI remains responsible for its own login
|
|
@@ -39,6 +42,11 @@ const profiles = profile.listProfiles();
|
|
|
39
42
|
`{ login: false }` to token or authentication acquisition to disable
|
|
40
43
|
interactive login. Pass `{ refresh: true }` to bypass a reusable cached token.
|
|
41
44
|
|
|
45
|
+
When this package runs through a generated Python binding in a Databricks
|
|
46
|
+
notebook or Job, `createAuthClient()` with no profile or credential options uses
|
|
47
|
+
the Python SDK's default `WorkspaceClient`. Explicit options continue through
|
|
48
|
+
the normal profile, PAT, M2M, CLI, or App paths.
|
|
49
|
+
|
|
42
50
|
Browser and UI code should import auth-type values, target values, profile
|
|
43
51
|
summaries, profile selections, and client-configuration schemas from
|
|
44
52
|
`@dbx-tools/shared-auth`.
|
package/index.ts
CHANGED
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/auth";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.54";
|
|
7
7
|
export * as bindings from "./src/bindings.ts";
|
|
8
8
|
export * as client from "./src/client.ts";
|
|
9
9
|
export * as config from "./src/config.ts";
|
|
10
10
|
export * as profile from "./src/profile.ts";
|
|
11
|
+
export * as runtimeAuth from "./src/runtime-auth.ts";
|
|
11
12
|
export type { AccessToken, TokenOptions, AuthClient, DatabricksAuthDependencies } from "./src/client.ts";
|
|
12
13
|
export { AuthOptionsSchema, DatabricksAuthOptionsSchema, AUTH_DEFAULTS, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER } from "./src/config.ts";
|
|
13
14
|
export type { AuthOptions, DatabricksAuthOptions } from "./src/config.ts";
|
|
14
15
|
export type { ListProfilesOptions } from "./src/profile.ts";
|
|
16
|
+
export type { DatabricksRuntimeAuthClient } from "./src/runtime-auth.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/auth";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.54";
|
|
3
3
|
export * as bindings from "./src/bindings.ts";
|
|
4
4
|
export * as client from "./src/client.ts";
|
|
5
5
|
export * as config from "./src/config.ts";
|
|
6
6
|
export * as profile from "./src/profile.ts";
|
|
7
|
+
export * as runtimeAuth from "./src/runtime-auth.ts";
|
|
7
8
|
export type { AccessToken, TokenOptions, AuthClient, DatabricksAuthDependencies } from "./src/client.ts";
|
|
8
9
|
export { AuthOptionsSchema, DatabricksAuthOptionsSchema, AUTH_DEFAULTS, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER } from "./src/config.ts";
|
|
9
10
|
export type { AuthOptions, DatabricksAuthOptions } from "./src/config.ts";
|
|
10
11
|
export type { ListProfilesOptions } from "./src/profile.ts";
|
|
12
|
+
export type { DatabricksRuntimeAuthClient } from "./src/runtime-auth.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/auth";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.54";
|
|
6
6
|
export * as bindings from "./src/bindings.js";
|
|
7
7
|
export * as client from "./src/client.js";
|
|
8
8
|
export * as config from "./src/config.js";
|
|
9
9
|
export * as profile from "./src/profile.js";
|
|
10
|
+
export * as runtimeAuth from "./src/runtime-auth.js";
|
|
10
11
|
export { AuthOptionsSchema, DatabricksAuthOptionsSchema, AUTH_DEFAULTS, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER } from "./src/config.js";
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsMkJBQTJCLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLDJCQUEyQixFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2F1dGhcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS41NFwiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBjbGllbnQgZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIHByb2ZpbGUgZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCAqIGFzIHJ1bnRpbWVBdXRoIGZyb20gXCIuL3NyYy9ydW50aW1lLWF1dGgudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWNjZXNzVG9rZW4sIFRva2VuT3B0aW9ucywgQXV0aENsaWVudCwgRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgeyBBdXRoT3B0aW9uc1NjaGVtYSwgRGF0YWJyaWNrc0F1dGhPcHRpb25zU2NoZW1hLCBBVVRIX0RFRkFVTFRTLCBERUZBVUxUX0NMSUVOVF9JRCwgREVGQVVMVF9DT05GSUdfRklMRSwgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLCBXT1JLU1BBQ0VfSURfSEVBREVSIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRoT3B0aW9ucywgRGF0YWJyaWNrc0F1dGhPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBMaXN0UHJvZmlsZXNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc1J1bnRpbWVBdXRoQ2xpZW50IH0gZnJvbSBcIi4vc3JjL3J1bnRpbWUtYXV0aC50c1wiO1xuIl19
|
|
@@ -70,15 +70,25 @@ export function parseDatabricksConfig(source) {
|
|
|
70
70
|
if (!name.trim() || !object.isRecord(value)) {
|
|
71
71
|
throw new AuthError("config", "Databricks configuration values must belong to a profile");
|
|
72
72
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
_appendConfigSections(config, [name.trim()], value);
|
|
74
|
+
}
|
|
75
|
+
return config;
|
|
76
|
+
}
|
|
77
|
+
function _appendConfigSections(config, path, value) {
|
|
78
|
+
const section = new Map();
|
|
79
|
+
let nested = false;
|
|
80
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
81
|
+
if (object.isRecord(entry)) {
|
|
82
|
+
nested = true;
|
|
83
|
+
_appendConfigSections(config, [...path, key], entry);
|
|
84
|
+
}
|
|
85
|
+
else if (entry !== undefined && entry !== null) {
|
|
77
86
|
section.set(key.trim().toLowerCase(), String(entry).trim());
|
|
78
87
|
}
|
|
79
|
-
config.set(name.trim(), section);
|
|
80
88
|
}
|
|
81
|
-
|
|
89
|
+
if (section.size || !nested) {
|
|
90
|
+
config.set(path.join("."), section);
|
|
91
|
+
}
|
|
82
92
|
}
|
|
83
93
|
export function loadRawProfile(config, name) {
|
|
84
94
|
const section = config?.get(name);
|
|
@@ -440,4 +450,4 @@ function credentialCacheKey(profile) {
|
|
|
440
450
|
const digest = createHash("sha256").update(identity).digest("hex");
|
|
441
451
|
return `${profile.name}-${profile.authType === AuthType.AppServicePrincipal ? "app-sp" : "oauth-m2m"}-${digest}`;
|
|
442
452
|
}
|
|
443
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3Byb2ZpbGUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19wcm9maWxlLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVyRSxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxLQUFLLE1BQU0sTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssV0FBVyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFFBQVEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUVMLDJCQUEyQixFQUMzQixpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUF5QyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQztBQWlCL0MsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsUUFB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LENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQzthQUNoQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7YUFDakMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxRQUFRLE1BQU0sRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLGFBQWE7UUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksVUFBVSxDQUFDO0lBQ2xGLE1BQU0sUUFBUSxHQUFHO1FBQ2YsT0FBTyxDQUFDLElBQUk7UUFDWixPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUU7UUFDdkIsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFO1FBQ3pCLE9BQU8sQ0FBQyxRQUFRO1FBQ2hCLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRTtRQUNyQixhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDeEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDYixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksTUFBTSxFQUFFLENBQUM7QUFDbkgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGlzQWJzb2x1dGUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IEF1dGhUeXBlLCBUYXJnZXRLaW5kIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGgvY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NQcm9maWxlU3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoL3Byb2ZpbGVcIjtcbmltcG9ydCAqIGFzIGVudmlyb25tZW50VXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZW52aXJvbm1lbnQtdXRpbHNcIjtcbmltcG9ydCAqIGFzIG9iamVjdCBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vYmplY3RcIjtcbmltcG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL3N0cmluZy11dGlsc1wiO1xuaW1wb3J0IHsgdHJpbVRvVW5kZWZpbmVkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvc3RyaW5nLXV0aWxzXCI7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZUluaSB9IGZyb20gXCJpbmlcIjtcblxuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4vX2Vycm9ycy50c1wiO1xuaW1wb3J0IHsgYXV0aExvZ2dlciB9IGZyb20gXCIuL19sb2dnaW5nLnRzXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NQcm9maWxlIH0gZnJvbSBcIi4vX3R5cGVzLnRzXCI7XG5pbXBvcnQge1xuICB0eXBlIERhdGFicmlja3NBdXRoT3B0aW9ucyxcbiAgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLFxuICBERUZBVUxUX0NMSUVOVF9JRCxcbiAgREVGQVVMVF9DT05GSUdfRklMRSxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGF1dGhMb2dnZXIoXCJwcm9maWxlLXNlbGVjdGlvblwiKTtcbmNvbnN0IGNvbmZpZ0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEluaUNvbmZpZyB8IEVycm9yIHwgdW5kZWZpbmVkPigpO1xuXG5leHBvcnQgY29uc3QgU0VUVElOR1NfU0VDVElPTiA9IFwiX19zZXR0aW5nc19fXCI7XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj47XG5leHBvcnQgdHlwZSBJbmlDb25maWcgPSBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuZXhwb3J0IGludGVyZmFjZSBSYXdQcm9maWxlIHtcbiAgaG9zdD86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB3b3Jrc3BhY2VJZD86IHN0cmluZztcbiAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIGNsaWVudFNlY3JldD86IHN0cmluZztcbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIGdyb3VwSWQ/OiBzdHJpbmc7XG4gIHNjb3Blcz86IHN0cmluZztcbiAgYXV0aFR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBzZWxlY3RlZCBEYXRhYnJpY2tzIGNvbmZpZ3VyYXRpb24gcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29uZmlnRmlsZShcbiAgZXhwbGljaXQ/OiBzdHJpbmcsXG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPVxuICAgIHRyaW1Ub1VuZGVmaW5lZChleHBsaWNpdCkgPz9cbiAgICB0cmltVG9VbmRlZmluZWQoZW52aXJvbm1lbnQuREFUQUJSSUNLU19DT05GSUdfRklMRSkgPz9cbiAgICBERUZBVUxUX0NPTkZJR19GSUxFO1xuICBjb25zdCBleHBhbmRlZCA9XG4gICAgc2VsZWN0ZWQgPT09IFwiflwiXG4gICAgICA/IGhvbWVkaXIoKVxuICAgICAgOiBzZWxlY3RlZC5zdGFydHNXaXRoKFwifi9cIilcbiAgICAgICAgPyByZXNvbHZlKGhvbWVkaXIoKSwgc2VsZWN0ZWQuc2xpY2UoMikpXG4gICAgICAgIDogc2VsZWN0ZWQ7XG4gIHJldHVybiBpc0Fic29sdXRlKGV4cGFuZGVkKSA/IGV4cGFuZGVkIDogcmVzb2x2ZShleHBhbmRlZCk7XG59XG5cbi8qKiBMb2FkIGFuZCBjYWNoZSB0aGUgc2VsZWN0ZWQgRGF0YWJyaWNrcyBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb25maWcoXG4gIGNvbmZpZ0ZpbGU/OiBzdHJpbmcsXG4gIHJlZnJlc2ggPSBmYWxzZSxcbiAgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYsXG4pOiBJbmlDb25maWcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXRoID0gcmVzb2x2ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZSwgZW52aXJvbm1lbnQpO1xuICBpZiAocmVmcmVzaCkgY29uZmlnQ2FjaGUuZGVsZXRlKHBhdGgpO1xuICBpZiAoY29uZmlnQ2FjaGUuaGFzKHBhdGgpKSB7XG4gICAgY29uc3QgY2FjaGVkID0gY29uZmlnQ2FjaGUuZ2V0KHBhdGgpO1xuICAgIGlmIChjYWNoZWQgaW5zdGFuY2VvZiBFcnJvcikgdGhyb3cgY2FjaGVkO1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgaWYgKCFleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgY29uZmlnQ2FjaGUuc2V0KHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHBhcnNlRGF0YWJyaWNrc0NvbmZpZyhyZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBjb25maWdDYWNoZS5zZXQocGF0aCwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIGNvbnN0IGVycm9yID1cbiAgICAgIGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZSA6IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgYENvdWxkIG5vdCByZWFkICR7cGF0aH1gLCB7IGNhdXNlIH0pO1xuICAgIGNvbmZpZ0NhY2hlLnNldChwYXRoLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqIEludmFsaWRhdGUgY2FjaGVkIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgYW4gZXh0ZXJuYWwgd3JpdGUuICovXG5leHBvcnQgZnVuY3Rpb24gaW52YWxpZGF0ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZT86IHN0cmluZyk6IHZvaWQge1xuICBjb25maWdDYWNoZS5kZWxldGUocmVzb2x2ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZSkpO1xufVxuXG4vKiogUGFyc2UgRGF0YWJyaWNrcyBJTkkgdGV4dCB0aHJvdWdoIHRoZSBtYWludGFpbmVkIGBpbmlgIHBhY2thZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRhYnJpY2tzQ29uZmlnKHNvdXJjZTogc3RyaW5nKTogSW5pQ29uZmlnIHtcbiAgbGV0IHBhcnNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gcGFyc2VJbmkoc291cmNlKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiRGF0YWJyaWNrcyBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZCBJTklcIiwgeyBjYXVzZSB9KTtcbiAgfVxuICBjb25zdCBjb25maWc6IEluaUNvbmZpZyA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICBpZiAoIW5hbWUudHJpbSgpIHx8ICFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiRGF0YWJyaWNrcyBjb25maWd1cmF0aW9uIHZhbHVlcyBtdXN0IGJlbG9uZyB0byBhIHByb2ZpbGVcIik7XG4gICAgfVxuICAgIGNvbnN0IHNlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQgfHwgZW50cnkgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgc2VjdGlvbi5zZXQoa2V5LnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBTdHJpbmcoZW50cnkpLnRyaW0oKSk7XG4gICAgfVxuICAgIGNvbmZpZy5zZXQobmFtZS50cmltKCksIHNlY3Rpb24pO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmF3UHJvZmlsZShjb25maWc6IEluaUNvbmZpZyB8IHVuZGVmaW5lZCwgbmFtZTogc3RyaW5nKTogUmF3UHJvZmlsZSB7XG4gIGNvbnN0IHNlY3Rpb24gPSBjb25maWc/LmdldChuYW1lKTtcbiAgcmV0dXJuIHtcbiAgICBob3N0OiBzZWN0aW9uPy5nZXQoXCJob3N0XCIpLFxuICAgIGFjY291bnRJZDogc2VjdGlvbj8uZ2V0KFwiYWNjb3VudF9pZFwiKSxcbiAgICB3b3Jrc3BhY2VJZDogc2VjdGlvbj8uZ2V0KFwid29ya3NwYWNlX2lkXCIpLFxuICAgIGNsaWVudElkOiBzZWN0aW9uPy5nZXQoXCJjbGllbnRfaWRcIiksXG4gICAgY2xpZW50U2VjcmV0OiBzZWN0aW9uPy5nZXQoXCJjbGllbnRfc2VjcmV0XCIpLFxuICAgIGFjY2Vzc1Rva2VuOiBzZWN0aW9uPy5nZXQoXCJ0b2tlblwiKSxcbiAgICBncm91cElkOiBzZWN0aW9uPy5nZXQoXCJncm91cF9pZFwiKSxcbiAgICBzY29wZXM6IHNlY3Rpb24/LmdldChcInNjb3Blc1wiKSxcbiAgICBhdXRoVHlwZTogdHJpbVRvVW5kZWZpbmVkKHNlY3Rpb24/LmdldChcImF1dGhfdHlwZVwiKSk/LnRvTG93ZXJDYXNlKCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJvZmlsZU5hbWUoXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBleHBsaWNpdDogYm9vbGVhbixcbiAgY29uZmlnOiBJbmlDb25maWcgfCB1bmRlZmluZWQsXG4gIHByZWZlclVzZXJUb01hY2hpbmU6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBsZXQgc2VsZWN0ZWQgPSByZXF1ZXN0ZWQ7XG4gIGxldCBzb3VyY2UgPSByZXF1ZXN0ZWQgPyBcInJlcXVlc3RlZFwiIDogdW5kZWZpbmVkO1xuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgc2VsZWN0ZWQgPSB0cmltVG9VbmRlZmluZWQoY29uZmlnPy5nZXQoU0VUVElOR1NfU0VDVElPTik/LmdldChcImRlZmF1bHRfcHJvZmlsZVwiKSk7XG4gICAgaWYgKHNlbGVjdGVkKSBzb3VyY2UgPSBcInNldHRpbmdzLWRlZmF1bHRcIjtcbiAgfVxuICBpZiAoIXNlbGVjdGVkICYmIGNvbmZpZz8uaGFzKFwiREVGQVVMVFwiKSkge1xuICAgIHNlbGVjdGVkID0gXCJERUZBVUxUXCI7XG4gICAgc291cmNlID0gXCJkZWZhdWx0LXNlY3Rpb25cIjtcbiAgfVxuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgY29uc3QgcHJvZmlsZXMgPSBbLi4uKGNvbmZpZz8ua2V5cygpID8/IFtdKV0uZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBTRVRUSU5HU19TRUNUSU9OKTtcbiAgICBpZiAocHJvZmlsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBzZWxlY3RlZCA9IHByb2ZpbGVzWzBdO1xuICAgICAgc291cmNlID0gXCJzb2xlLXByb2ZpbGVcIjtcbiAgICB9XG4gIH1cbiAgaWYgKCFzZWxlY3RlZCkge1xuICAgIHNlbGVjdGVkID0gXCJERUZBVUxUXCI7XG4gICAgc291cmNlID0gXCJmYWxsYmFja1wiO1xuICB9XG4gIGlmIChzZWxlY3RlZCA9PT0gU0VUVElOR1NfU0VDVElPTikge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgYCR7U0VUVElOR1NfU0VDVElPTn0gaXMgcmVzZXJ2ZWRgKTtcbiAgfVxuICBpZiAoZXhwbGljaXQgfHwgIXByZWZlclVzZXJUb01hY2hpbmUgfHwgIWNvbmZpZykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIERhdGFicmlja3MgcHJvZmlsZVwiLCB7XG4gICAgICBwcm9maWxlOiBzZWxlY3RlZCxcbiAgICAgIHNvdXJjZSxcbiAgICAgIGV4cGxpY2l0LFxuICAgICAgcHJlZmVyVXNlclRvTWFjaGluZSxcbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH1cbiAgY29uc3QgY3VycmVudCA9IGxvYWRSYXdQcm9maWxlKGNvbmZpZywgc2VsZWN0ZWQpO1xuICBpZiAoIWlzTTJtUHJvZmlsZShjdXJyZW50KSB8fCAhY3VycmVudC5ob3N0KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2VsZWN0ZWQgRGF0YWJyaWNrcyBwcm9maWxlXCIsIHtcbiAgICAgIHByb2ZpbGU6IHNlbGVjdGVkLFxuICAgICAgc291cmNlLFxuICAgICAgZXhwbGljaXQsXG4gICAgICBwcmVmZXJVc2VyVG9NYWNoaW5lLFxuICAgIH0pO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxuICBjb25zdCBtYXRjaGVzID0gWy4uLmNvbmZpZy5rZXlzKCldLmZpbHRlcigobmFtZSkgPT4ge1xuICAgIGlmIChuYW1lID09PSBzZWxlY3RlZCB8fCBuYW1lID09PSBTRVRUSU5HU19TRUNUSU9OKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gbG9hZFJhd1Byb2ZpbGUoY29uZmlnLCBuYW1lKTtcbiAgICByZXR1cm4gY2FuZGlkYXRlLmF1dGhUeXBlID09PSBcImRhdGFicmlja3MtY2xpXCIgJiYgc2FtZVRhcmdldChjdXJyZW50LCBjYW5kaWRhdGUpO1xuICB9KTtcbiAgY29uc3QgcHJlZmVycmVkID0gbWF0Y2hlcy5sZW5ndGggPT09IDEgPyBtYXRjaGVzWzBdISA6IHNlbGVjdGVkO1xuICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBEYXRhYnJpY2tzIHByb2ZpbGVcIiwge1xuICAgIHByb2ZpbGU6IHByZWZlcnJlZCxcbiAgICBzb3VyY2U6IHByZWZlcnJlZCA9PT0gc2VsZWN0ZWQgPyBzb3VyY2UgOiBcIm1hdGNoaW5nLWNsaS1wcm9maWxlXCIsXG4gICAgb3JpZ2luYWxQcm9maWxlOiBwcmVmZXJyZWQgPT09IHNlbGVjdGVkID8gdW5kZWZpbmVkIDogc2VsZWN0ZWQsXG4gICAgZXhwbGljaXQsXG4gICAgcHJlZmVyVXNlclRvTWFjaGluZSxcbiAgICBtYXRjaGluZ0NsaVByb2ZpbGVzOiBtYXRjaGVzLmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiBwcmVmZXJyZWQ7XG59XG5cbi8qKiBOb3JtYWxpemUgRGF0YWJyaWNrcyBob3N0cyBhbmQgcmVxdWlyZSBUTFMgb3V0c2lkZSBsb29wYmFjayBkZXZlbG9wbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVIb3N0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHByb2ZpbGUgPSBcIkRFRkFVTFRcIik6IHN0cmluZyB7XG4gIGNvbnN0IHNlbGVjdGVkID0gdHJpbVRvVW5kZWZpbmVkKHZhbHVlKTtcbiAgaWYgKCFzZWxlY3RlZCkgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBgUHJvZmlsZSAke3Byb2ZpbGV9IGhhcyBubyBob3N0YCk7XG4gIGNvbnN0IHdpdGhTY2hlbWUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHNlbGVjdGVkKSA/IHNlbGVjdGVkIDogYGh0dHBzOi8vJHtzZWxlY3RlZH1gO1xuICBsZXQgdXJsOiBVUkw7XG4gIHRyeSB7XG4gICAgdXJsID0gbmV3IFVSTCh3aXRoU2NoZW1lKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBQcm9maWxlICR7cHJvZmlsZX0gaGFzIGFuIGludmFsaWQgaG9zdGAsIHsgY2F1c2UgfSk7XG4gIH1cbiAgaWYgKHVybC5wcm90b2NvbCAhPT0gXCJodHRwczpcIiAmJiB1cmwuaG9zdG5hbWUgIT09IFwibG9jYWxob3N0XCIgJiYgdXJsLmhvc3RuYW1lICE9PSBcIjEyNy4wLjAuMVwiKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcIkRhdGFicmlja3MgaG9zdCBtdXN0IHVzZSBIVFRQU1wiKTtcbiAgfVxuICByZXR1cm4gdXJsLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF1dGhUeXBlKFxuICBhdXRoVHlwZTogQXV0aFR5cGUgfCB1bmRlZmluZWQsXG4gIGNsaWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNsaWVudFNlY3JldDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogQXV0aFR5cGUge1xuICBzd2l0Y2ggKGF1dGhUeXBlKSB7XG4gICAgY2FzZSBBdXRoVHlwZS5EYXRhYnJpY2tzQ2xpOlxuICAgICAgcmV0dXJuIEF1dGhUeXBlLkRhdGFicmlja3NDbGk7XG4gICAgY2FzZSBBdXRoVHlwZS5PQXV0aE0yTTpcbiAgICAgIGlmICghY2xpZW50SWQgfHwgIWNsaWVudFNlY3JldCkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwib2F1dGgtbTJtIHJlcXVpcmVzIGNsaWVudF9pZCBhbmQgY2xpZW50X3NlY3JldFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBBdXRoVHlwZS5PQXV0aE0yTTtcbiAgICBjYXNlIEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW46XG4gICAgICBpZiAoIWFjY2Vzc1Rva2VuKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwicGF0IHJlcXVpcmVzIHRva2VuXCIpO1xuICAgICAgcmV0dXJuIEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW47XG4gICAgY2FzZSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mOlxuICAgICAgaWYgKCFhY2Nlc3NUb2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiYXBwX29ibyByZXF1aXJlcyB0aGUgY29uZmlndXJlZCBhY2Nlc3MgdG9rZW4gaGVhZGVyXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEF1dGhUeXBlLkFwcE9uQmVoYWxmT2Y7XG4gICAgY2FzZSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsOlxuICAgICAgaWYgKCFjbGllbnRJZCB8fCAhY2xpZW50U2VjcmV0KSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJhcHBfc3AgcmVxdWlyZXMgY2xpZW50IGlkIGFuZCBzZWNyZXRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbDtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGlmIChjbGllbnRJZCAmJiBjbGllbnRTZWNyZXQpIHJldHVybiBBdXRoVHlwZS5PQXV0aE0yTTtcbiAgICAgIGlmIChjbGllbnRTZWNyZXQpIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJvYXV0aC1tMm0gY2xpZW50X3NlY3JldCByZXF1aXJlcyBjbGllbnRfaWRcIik7XG4gICAgICByZXR1cm4gYWNjZXNzVG9rZW4gPyBBdXRoVHlwZS5QZXJzb25hbEFjY2Vzc1Rva2VuIDogQXV0aFR5cGUuRGF0YWJyaWNrc0NsaTtcbiAgfVxufVxuXG4vKiogUGFyc2Ugb25lIGV4dGVybmFsIGF1dGgtdHlwZSB2YWx1ZSBpbnRvIHRoZSBjYW5vbmljYWwgZW51bS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF1dGhUeXBlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBBdXRoVHlwZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlbGVjdGVkID0gdHJpbVRvVW5kZWZpbmVkKHZhbHVlKT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKHNlbGVjdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChPYmplY3QudmFsdWVzKEF1dGhUeXBlKS5pbmNsdWRlcyhzZWxlY3RlZCBhcyBBdXRoVHlwZSkpIHJldHVybiBzZWxlY3RlZCBhcyBBdXRoVHlwZTtcbiAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBgQXV0aGVudGljYXRpb24gdHlwZSAke3NlbGVjdGVkfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0T2JvVG9rZW4oXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBoZWFkZXJOYW1lID0gREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50cnkgPSBPYmplY3QuZW50cmllcyhoZWFkZXJzID8/IHt9KS5maW5kKFxuICAgIChbbmFtZV0pID0+IG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpLFxuICApO1xuICBjb25zdCB2YWx1ZSA9IHRyaW1Ub1VuZGVmaW5lZChlbnRyeT8uWzFdKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKSAhPT0gREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IFtzY2hlbWUsIC4uLnBhcnRzXSA9IHZhbHVlLnNwbGl0KC9cXHMrLyk7XG4gIHJldHVybiBzY2hlbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiYmVhcmVyXCIgPyB0cmltVG9VbmRlZmluZWQocGFydHMuam9pbihcIiBcIikpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJUYXJnZXQoaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkLCBhY2NvdW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRhcmdldEtpbmQge1xuICBpZiAoYWNjb3VudElkICYmIGhvc3QpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG5ldyBVUkwobm9ybWFsaXplSG9zdChob3N0KSkuaG9zdG5hbWUgPT09IFwiYWNjb3VudHMuY2xvdWQuZGF0YWJyaWNrcy5jb21cIikge1xuICAgICAgICByZXR1cm4gVGFyZ2V0S2luZC5BY2NvdW50O1xuICAgICAgfVxuICAgIH0gY2F0Y2gge31cbiAgfVxuICByZXR1cm4gVGFyZ2V0S2luZC5Xb3Jrc3BhY2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhcmdldCh2YWx1ZTogc3RyaW5nKTogVGFyZ2V0S2luZCB7XG4gIHN3aXRjaCAodmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlIFRhcmdldEtpbmQuV29ya3NwYWNlOlxuICAgICAgcmV0dXJuIFRhcmdldEtpbmQuV29ya3NwYWNlO1xuICAgIGNhc2UgVGFyZ2V0S2luZC5BY2NvdW50OlxuICAgICAgcmV0dXJuIFRhcmdldEtpbmQuQWNjb3VudDtcbiAgICBjYXNlIFRhcmdldEtpbmQuVW5pZmllZDpcbiAgICAgIHJldHVybiBUYXJnZXRLaW5kLlVuaWZpZWQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJUYXJnZXQgbXVzdCBiZSB3b3Jrc3BhY2UsIGFjY291bnQsIG9yIHVuaWZpZWRcIik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pc3NpbmcocHJvZmlsZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBQcm9maWxlICR7cHJvZmlsZX0gcmVxdWlyZXMgJHtmaWVsZH1gKTtcbn1cblxuZnVuY3Rpb24gc2FtZVRhcmdldChsZWZ0OiBSYXdQcm9maWxlLCByaWdodDogUmF3UHJvZmlsZSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGlmIChub3JtYWxpemVIb3N0KGxlZnQuaG9zdCkgIT09IG5vcm1hbGl6ZUhvc3QocmlnaHQuaG9zdCkpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgKCFsZWZ0LmFjY291bnRJZCB8fCBsZWZ0LmFjY291bnRJZCA9PT0gcmlnaHQuYWNjb3VudElkKSAmJlxuICAgICghbGVmdC53b3Jrc3BhY2VJZCB8fCBsZWZ0LndvcmtzcGFjZUlkID09PSByaWdodC53b3Jrc3BhY2VJZClcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNNMm1Qcm9maWxlKHByb2ZpbGU6IFJhd1Byb2ZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBwcm9maWxlLmF1dGhUeXBlID09PSBBdXRoVHlwZS5PQXV0aE0yTSB8fFxuICAgICghcHJvZmlsZS5hdXRoVHlwZSAmJiBCb29sZWFuKHByb2ZpbGUuY2xpZW50SWQgJiYgcHJvZmlsZS5jbGllbnRTZWNyZXQpKVxuICApO1xufVxuXG4vKiogRW51bWVyYXRlIHNlY3JldC1mcmVlIHByb2ZpbGUgbWV0YWRhdGEgZnJvbSBjYWNoZWQgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0RGF0YWJyaWNrc1Byb2ZpbGVzKFxuICBjb25maWdGaWxlPzogc3RyaW5nLFxuICByZWZyZXNoID0gZmFsc2UsXG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LFxuKTogRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5W10ge1xuICBjb25zdCBwYXRoID0gcmVzb2x2ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZSwgZW52aXJvbm1lbnQpO1xuICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKGNvbmZpZ0ZpbGUsIHJlZnJlc2gsIGVudmlyb25tZW50KTtcbiAgaWYgKCFjb25maWcpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWQgRGF0YWJyaWNrcyBwcm9maWxlc1wiLCB7IHBhdGgsIHJlZnJlc2gsIGNvdW50OiAwIH0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9maWxlcyA9IFsuLi5jb25maWcua2V5cygpXVxuICAgIC5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IFNFVFRJTkdTX1NFQ1RJT04pXG4gICAgLm1hcCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IGxvYWRSYXdQcm9maWxlKGNvbmZpZywgbmFtZSk7XG4gICAgICBjb25zdCBob3N0ID0gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHByb2ZpbGUuaG9zdCk7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocHJvZmlsZS5hY2NvdW50SWQpO1xuICAgICAgY29uc3Qgd29ya3NwYWNlSWQgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocHJvZmlsZS53b3Jrc3BhY2VJZCk7XG4gICAgICBjb25zdCBhdXRoVHlwZSA9IHJlc29sdmVBdXRoVHlwZShcbiAgICAgICAgcGFyc2VBdXRoVHlwZShwcm9maWxlLmF1dGhUeXBlKSxcbiAgICAgICAgcHJvZmlsZS5jbGllbnRJZCxcbiAgICAgICAgcHJvZmlsZS5jbGllbnRTZWNyZXQsXG4gICAgICAgIHByb2ZpbGUuYWNjZXNzVG9rZW4sXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgLi4uKGhvc3QgPyB7IGhvc3QgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFjY291bnRJZCA/IHsgYWNjb3VudElkIH0gOiB7fSksXG4gICAgICAgIC4uLih3b3Jrc3BhY2VJZCA/IHsgd29ya3NwYWNlSWQgfSA6IHt9KSxcbiAgICAgICAgdGFyZ2V0OiBpbmZlclRhcmdldChob3N0LCBhY2NvdW50SWQpLFxuICAgICAgICBhdXRoVHlwZSxcbiAgICAgICAgcHJpbmNpcGFsOlxuICAgICAgICAgIGF1dGhUeXBlID09PSBBdXRoVHlwZS5PQXV0aE0yTSB8fCBhdXRoVHlwZSA9PT0gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgICAgPyAoc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHByb2ZpbGUuY2xpZW50SWQpID8/IG5hbWUpXG4gICAgICAgICAgICA6IG5hbWUsXG4gICAgICB9O1xuICAgIH0pXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lm5hbWUubG9jYWxlQ29tcGFyZShyaWdodC5uYW1lKSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBEYXRhYnJpY2tzIHByb2ZpbGVzXCIsIHsgcGF0aCwgcmVmcmVzaCwgY291bnQ6IHByb2ZpbGVzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHByb2ZpbGVzO1xufVxuXG4vKiogUmVzb2x2ZSBvcHRpb25zLCBlbnZpcm9ubWVudCwgcmVxdWVzdCBoZWFkZXJzLCBhbmQgY29uZmlndXJhdGlvbiBpbnRvIGNyZWRlbnRpYWxzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzUHJvZmlsZShcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQgPSBwcm9jZXNzLmVudixcbik6IERhdGFicmlja3NQcm9maWxlIHtcbiAgY29uc3QgaW5BcHAgPSBlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudih7IC4uLmVudmlyb25tZW50IH0pO1xuICBjb25zdCBlbnZpcm9ubWVudFByb2ZpbGUgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW52aXJvbm1lbnQuREFUQUJSSUNLU19DT05GSUdfUFJPRklMRSk7XG4gIGNvbnN0IGV4cGxpY2l0UHJvZmlsZSA9IEJvb2xlYW4oXG4gICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMucHJvZmlsZSkgPz8gZW52aXJvbm1lbnRQcm9maWxlLFxuICApO1xuICBjb25zdCByZXF1ZXN0VG9rZW4gPSByZXF1ZXN0T2JvVG9rZW4ob3B0aW9ucy5yZXF1ZXN0SGVhZGVycywgb3B0aW9ucy5hY2Nlc3NUb2tlbkhlYWRlcik7XG4gIGNvbnN0IGV4cGxpY2l0QXV0aFR5cGUgPVxuICAgIG9wdGlvbnMuYXV0aFR5cGUgPz9cbiAgICAoIWluQXBwICYmICFleHBsaWNpdFByb2ZpbGUgPyBwYXJzZUF1dGhUeXBlKGVudmlyb25tZW50LkRBVEFCUklDS1NfQVVUSF9UWVBFKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGFwcFNlcnZpY2VQcmluY2lwYWwgPSBbXG4gICAgZW52aXJvbm1lbnQuREFUQUJSSUNLU19IT1NULFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX0lELFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVCxcbiAgXS5ldmVyeSgodmFsdWUpID0+IEJvb2xlYW4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHZhbHVlKSkpO1xuICBjb25zdCBzZWxlY3RlZEF1dGhUeXBlID1cbiAgICAhaW5BcHAgfHwgZXhwbGljaXRQcm9maWxlIHx8IGV4cGxpY2l0QXV0aFR5cGVcbiAgICAgID8gZXhwbGljaXRBdXRoVHlwZVxuICAgICAgOiByZXF1ZXN0VG9rZW5cbiAgICAgICAgPyBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mXG4gICAgICAgIDogYXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgID8gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBhcHBBdXRoID1cbiAgICBzZWxlY3RlZEF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mIHx8XG4gICAgc2VsZWN0ZWRBdXRoVHlwZSA9PT0gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbDtcbiAgY29uc3QgaWdub3JlQW1iaWVudENyZWRlbnRpYWxzID0gZXhwbGljaXRQcm9maWxlICYmICFhcHBBdXRoO1xuICBjb25zdCBjb25maWdQYXRoID0gcmVzb2x2ZUNvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWdGaWxlLCBlbnZpcm9ubWVudCk7XG4gIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcob3B0aW9ucy5jb25maWdGaWxlLCBmYWxzZSwgZW52aXJvbm1lbnQpO1xuICBjb25zdCByZXF1ZXN0ZWROYW1lID0gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMucHJvZmlsZSkgPz8gZW52aXJvbm1lbnRQcm9maWxlO1xuICBjb25zdCBwcm9maWxlTmFtZSA9IHJlc29sdmVQcm9maWxlTmFtZShcbiAgICByZXF1ZXN0ZWROYW1lLFxuICAgIGV4cGxpY2l0UHJvZmlsZSxcbiAgICBjb25maWcsXG4gICAgb3B0aW9ucy5wcmVmZXJVc2VyVG9NYWNoaW5lID8/IHRydWUsXG4gICk7XG4gIGNvbnN0IGFtYmllbnRDcmVkZW50aWFscyA9IFtcbiAgICBvcHRpb25zLmFjY2Vzc1Rva2VuLFxuICAgIG9wdGlvbnMuY2xpZW50SWQsXG4gICAgb3B0aW9ucy5jbGllbnRTZWNyZXQsXG4gICAgZW52aXJvbm1lbnQuREFUQUJSSUNLU19UT0tFTixcbiAgICBlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0NMSUVOVF9JRCxcbiAgICBlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0NMSUVOVF9TRUNSRVQsXG4gIF0uc29tZSgodmFsdWUpID0+IEJvb2xlYW4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHZhbHVlKSkpO1xuICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPVxuICAgIGV4cGxpY2l0UHJvZmlsZSB8fCAoIWFtYmllbnRDcmVkZW50aWFscyAmJiBjb25maWc/Lmhhcyhwcm9maWxlTmFtZSkpID8gcHJvZmlsZU5hbWUgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBsb2FkUmF3UHJvZmlsZShjb25maWcsIHByb2ZpbGVOYW1lKTtcbiAgY29uc3QgYW1iaWVudCA9IChuYW1lOiBrZXlvZiBOb2RlSlMuUHJvY2Vzc0Vudik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICAgIGlnbm9yZUFtYmllbnRDcmVkZW50aWFscyA/IHVuZGVmaW5lZCA6IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbnZpcm9ubWVudFtuYW1lXSk7XG4gIGNvbnN0IGhvc3QgPSBub3JtYWxpemVIb3N0KFxuICAgIG9wdGlvbnMuaG9zdCA/PyBhbWJpZW50KFwiREFUQUJSSUNLU19IT1NUXCIpID8/IGNvbmZpZ3VyZWQuaG9zdCxcbiAgICBwcm9maWxlTmFtZSxcbiAgKTtcbiAgY29uc3QgYWNjb3VudElkID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5hY2NvdW50SWQpID8/XG4gICAgYW1iaWVudChcIkRBVEFCUklDS1NfQUNDT1VOVF9JRFwiKSA/P1xuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmFjY291bnRJZCk7XG4gIGNvbnN0IHdvcmtzcGFjZUlkID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy53b3Jrc3BhY2VJZCkgPz9cbiAgICBhbWJpZW50KFwiREFUQUJSSUNLU19XT1JLU1BBQ0VfSURcIikgPz9cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoY29uZmlndXJlZC53b3Jrc3BhY2VJZCk7XG4gIGNvbnN0IGNsaWVudElkVmFsdWUgPVxuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChvcHRpb25zLmNsaWVudElkKSA/P1xuICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX0NMSUVOVF9JRFwiKSA/P1xuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmNsaWVudElkKTtcbiAgY29uc3QgY2xpZW50U2VjcmV0ID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5jbGllbnRTZWNyZXQpID8/XG4gICAgYW1iaWVudChcIkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVFwiKSA/P1xuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmNsaWVudFNlY3JldCk7XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID1cbiAgICBzZWxlY3RlZEF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mXG4gICAgICA/IHJlcXVlc3RUb2tlblxuICAgICAgOiAoc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMuYWNjZXNzVG9rZW4pID8/XG4gICAgICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX1RPS0VOXCIpID8/XG4gICAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmFjY2Vzc1Rva2VuKSk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRBdXRoVHlwZSA9XG4gICAgc2VsZWN0ZWRBdXRoVHlwZSA/P1xuICAgIHBhcnNlQXV0aFR5cGUoYW1iaWVudChcIkRBVEFCUklDS1NfQVVUSF9UWVBFXCIpKSA/P1xuICAgIHBhcnNlQXV0aFR5cGUoY29uZmlndXJlZC5hdXRoVHlwZSk7XG4gIGNvbnN0IGF1dGhUeXBlID0gcmVzb2x2ZUF1dGhUeXBlKGNvbmZpZ3VyZWRBdXRoVHlwZSwgY2xpZW50SWRWYWx1ZSwgY2xpZW50U2VjcmV0LCBhY2Nlc3NUb2tlbik7XG4gIGNvbnN0IGNsaWVudElkID1cbiAgICBhdXRoVHlwZSA9PT0gQXV0aFR5cGUuRGF0YWJyaWNrc0NsaVxuICAgICAgPyAoY2xpZW50SWRWYWx1ZSA/PyBERUZBVUxUX0NMSUVOVF9JRClcbiAgICAgIDogYXV0aFR5cGUgPT09IEF1dGhUeXBlLk9BdXRoTTJNIHx8IGF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsXG4gICAgICAgID8gKGNsaWVudElkVmFsdWUgPz8gbWlzc2luZyhwcm9maWxlTmFtZSwgXCJjbGllbnRfaWRcIikpXG4gICAgICAgIDogKGNsaWVudElkVmFsdWUgPz8gXCJcIik7XG4gIGNvbnN0IHNjb3BlcyA9IG9wdGlvbnMuc2NvcGVzPy5sZW5ndGhcbiAgICA/IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChvcHRpb25zLnNjb3BlcylcbiAgICA6IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChjb25maWd1cmVkLnNjb3Blcz8uc3BsaXQoXCIsXCIpID8/IFtcImFsbC1hcGlzXCJdKTtcbiAgY29uc3QgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQgPyBwYXJzZVRhcmdldChvcHRpb25zLnRhcmdldCkgOiBpbmZlclRhcmdldChob3N0LCBhY2NvdW50SWQpO1xuICBjb25zdCBncm91cElkID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5ncm91cElkKSA/P1xuICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX0dST1VQX0lEXCIpID8/XG4gICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGNvbmZpZ3VyZWQuZ3JvdXBJZCk7XG4gIGNvbnN0IHByaW5jaXBhbCA9XG4gICAgYXV0aFR5cGUgPT09IEF1dGhUeXBlLk9BdXRoTTJNIHx8IGF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsXG4gICAgICA/IGNsaWVudElkXG4gICAgICA6IHByb2ZpbGVOYW1lO1xuICBjb25zdCBjYWNoZUtleSA9IGNyZWRlbnRpYWxDYWNoZUtleSh7XG4gICAgbmFtZTogcHJvZmlsZU5hbWUsXG4gICAgaG9zdCxcbiAgICBhY2NvdW50SWQsXG4gICAgd29ya3NwYWNlSWQsXG4gICAgY2xpZW50SWQsXG4gICAgZ3JvdXBJZCxcbiAgICBzY29wZXMsXG4gICAgYXV0aFR5cGUsXG4gICAgYWNjZXNzVG9rZW4sXG4gIH0pO1xuICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBEYXRhYnJpY2tzIHByb2ZpbGVcIiwge1xuICAgIHByb2ZpbGU6IHByb2ZpbGVOYW1lLFxuICAgIGhvc3QsXG4gICAgYXV0aFR5cGUsXG4gICAgdGFyZ2V0LFxuICAgIGluQXBwLFxuICAgIGV4cGxpY2l0UHJvZmlsZSxcbiAgICBjb25maWd1cmVkQXV0aFR5cGU6IGNvbmZpZ3VyZWRBdXRoVHlwZSA/PyBcImF1dG9tYXRpY1wiLFxuICAgIGhhc0FjY291bnRJZDogQm9vbGVhbihhY2NvdW50SWQpLFxuICAgIGhhc1dvcmtzcGFjZUlkOiBCb29sZWFuKHdvcmtzcGFjZUlkKSxcbiAgICBoYXNHcm91cElkOiBCb29sZWFuKGdyb3VwSWQpLFxuICAgIHNjb3BlQ291bnQ6IHNjb3Blcy5sZW5ndGgsXG4gICAgY29uZmlnUGF0aCxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogcHJvZmlsZU5hbWUsXG4gICAgLi4uKHNlbGVjdGVkUHJvZmlsZSA/IHsgc2VsZWN0ZWRQcm9maWxlIH0gOiB7fSksXG4gICAgaG9zdCxcbiAgICAuLi4oYWNjb3VudElkID8geyBhY2NvdW50SWQgfSA6IHt9KSxcbiAgICAuLi4od29ya3NwYWNlSWQgPyB7IHdvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgY2xpZW50SWQsXG4gICAgLi4uKGdyb3VwSWQgPyB7IGdyb3VwSWQgfSA6IHt9KSxcbiAgICBzY29wZXMsXG4gICAgdGFyZ2V0LFxuICAgIGF1dGhUeXBlLFxuICAgIC4uLihjbGllbnRTZWNyZXQgPyB7IGNsaWVudFNlY3JldCB9IDoge30pLFxuICAgIC4uLihhY2Nlc3NUb2tlbiA/IHsgYWNjZXNzVG9rZW4gfSA6IHt9KSxcbiAgICBjYWNoZUtleSxcbiAgICBwcmluY2lwYWwsXG4gIH07XG59XG5cbi8qKiBOb3JtYWxpemUgT0F1dGggc2NvcGVzIGZvciBtYWNoaW5lIGNyZWRlbnRpYWxzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hY2hpbmVTY29wZXMoc2NvcGVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzY29wZXMubGVuZ3RoID8gc2NvcGVzIDogW1wiYWxsLWFwaXNcIl0pLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY3JlZGVudGlhbENhY2hlS2V5KFxuICBwcm9maWxlOiBQaWNrPFxuICAgIERhdGFicmlja3NQcm9maWxlLFxuICAgIHwgXCJuYW1lXCJcbiAgICB8IFwiaG9zdFwiXG4gICAgfCBcImFjY291bnRJZFwiXG4gICAgfCBcIndvcmtzcGFjZUlkXCJcbiAgICB8IFwiY2xpZW50SWRcIlxuICAgIHwgXCJncm91cElkXCJcbiAgICB8IFwic2NvcGVzXCJcbiAgICB8IFwiYXV0aFR5cGVcIlxuICAgIHwgXCJhY2Nlc3NUb2tlblwiXG4gID4sXG4pOiBzdHJpbmcge1xuICBpZiAocHJvZmlsZS5hdXRoVHlwZSA9PT0gQXV0aFR5cGUuRGF0YWJyaWNrc0NsaSkgcmV0dXJuIHByb2ZpbGUubmFtZTtcbiAgaWYgKHByb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW4pIHtcbiAgICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKHByb2ZpbGUuYWNjZXNzVG9rZW4gPz8gXCJcIilcbiAgICAgIC5kaWdlc3QoXCJoZXhcIik7XG4gICAgcmV0dXJuIGAke3Byb2ZpbGUubmFtZX0tcGF0LSR7ZGlnZXN0fWA7XG4gIH1cbiAgaWYgKHByb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLkFwcE9uQmVoYWxmT2YpIHJldHVybiBgJHtwcm9maWxlLm5hbWV9LWFwcC1vYm9gO1xuICBjb25zdCBpZGVudGl0eSA9IFtcbiAgICBwcm9maWxlLmhvc3QsXG4gICAgcHJvZmlsZS5hY2NvdW50SWQgPz8gXCJcIixcbiAgICBwcm9maWxlLndvcmtzcGFjZUlkID8/IFwiXCIsXG4gICAgcHJvZmlsZS5jbGllbnRJZCxcbiAgICBwcm9maWxlLmdyb3VwSWQgPz8gXCJcIixcbiAgICBtYWNoaW5lU2NvcGVzKHByb2ZpbGUuc2NvcGVzKS5qb2luKFwiIFwiKSxcbiAgXS5qb2luKFwiXFwwXCIpO1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpZGVudGl0eSkuZGlnZXN0KFwiaGV4XCIpO1xuICByZXR1cm4gYCR7cHJvZmlsZS5uYW1lfS0ke3Byb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLkFwcFNlcnZpY2VQcmluY2lwYWwgPyBcImFwcC1zcFwiIDogXCJvYXV0aC1tMm1cIn0tJHtkaWdlc3R9YDtcbn1cbiJdfQ==
|
|
453
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3Byb2ZpbGUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19wcm9maWxlLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVyRSxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxLQUFLLE1BQU0sTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssV0FBVyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFFBQVEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUVMLDJCQUEyQixFQUMzQixpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUF5QyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQztBQWlCL0MsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsUUFBaUIsRUFDakIsY0FBMkIsT0FBTyxDQUFDLEdBQUc7SUFFdEMsTUFBTSxRQUFRLEdBQ1osZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUN6QixlQUFlLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDO1FBQ25ELG1CQUFtQixDQUFDO0lBQ3RCLE1BQU0sUUFBUSxHQUNaLFFBQVEsS0FBSyxHQUFHO1FBQ2QsQ0FBQyxDQUFDLE9BQU8sRUFBRTtRQUNYLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUN6QixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUNqQixPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELDREQUE0RDtBQUM1RCxNQUFNLFVBQVUsVUFBVSxDQUN4QixVQUFtQixFQUNuQixPQUFPLEdBQUcsS0FBSyxFQUNmLGNBQTJCLE9BQU8sQ0FBQyxHQUFHO0lBRXRDLE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RCxJQUFJLE9BQU87UUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxNQUFNLFlBQVksS0FBSztZQUFFLE1BQU0sTUFBTSxDQUFDO1FBQzFDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdEIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRSxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sS0FBSyxHQUNULEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLGtCQUFrQixJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDaEcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0IsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsVUFBbUI7SUFDdEQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQWM7SUFDbEQsSUFBSSxNQUErQixDQUFDO0lBQ3BDLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUE0QixDQUFDO0lBQ3ZELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsMkNBQTJDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBYyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSwwREFBMEQsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQzVCLE1BQWlCLEVBQ2pCLElBQXVCLEVBQ3ZCLEtBQThCO0lBRTlCLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzFDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNuQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDZCxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RCxDQUFDO2FBQU0sSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBNkIsRUFBRSxJQUFZO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsT0FBTztRQUNMLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUMxQixTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUM7UUFDckMsV0FBVyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQ3pDLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUNuQyxZQUFZLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFDM0MsV0FBVyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNqQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDOUIsUUFBUSxFQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFO0tBQ3BFLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxTQUE2QixFQUM3QixRQUFpQixFQUNqQixNQUE2QixFQUM3QixtQkFBNEI7SUFFNUIsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQ3pCLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDakQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsUUFBUSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLFFBQVE7WUFBRSxNQUFNLEdBQUcsa0JBQWtCLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3hDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDckIsTUFBTSxHQUFHLGlCQUFpQixDQUFDO0lBQzdCLENBQUM7SUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pGLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sR0FBRyxjQUFjLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQ3JCLE1BQU0sR0FBRyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUNELElBQUksUUFBUSxLQUFLLGdCQUFnQixFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxnQkFBZ0IsY0FBYyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELElBQUksUUFBUSxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoRCxNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFO1lBQzFDLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLE1BQU07WUFDTixRQUFRO1lBQ1IsbUJBQW1CO1NBQ3BCLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRTtZQUMxQyxPQUFPLEVBQUUsUUFBUTtZQUNqQixNQUFNO1lBQ04sUUFBUTtZQUNSLG1CQUFtQjtTQUNwQixDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2pELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssZ0JBQWdCO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDakUsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvQyxPQUFPLFNBQVMsQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNuRixDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUNoRSxNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFO1FBQzFDLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLE1BQU0sRUFBRSxTQUFTLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtRQUNoRSxlQUFlLEVBQUUsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRO1FBQzlELFFBQVE7UUFDUixtQkFBbUI7UUFDbkIsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDcEMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQXlCLEVBQUUsT0FBTyxHQUFHLFNBQVM7SUFDMUUsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxRQUFRO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxPQUFPLGNBQWMsQ0FBQyxDQUFDO0lBQy9FLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxRQUFRLEVBQUUsQ0FBQztJQUNyRixJQUFJLEdBQVEsQ0FBQztJQUNiLElBQUksQ0FBQztRQUNILEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLFdBQVcsT0FBTyxzQkFBc0IsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxXQUFXLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUM5RixNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUM3QixRQUE4QixFQUM5QixRQUE0QixFQUM1QixZQUFnQyxFQUNoQyxXQUErQjtJQUUvQixRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssUUFBUSxDQUFDLGFBQWE7WUFDekIsT0FBTyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQ2hDLEtBQUssUUFBUSxDQUFDLFFBQVE7WUFDcEIsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxnREFBZ0QsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7WUFDRCxPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDM0IsS0FBSyxRQUFRLENBQUMsbUJBQW1CO1lBQy9CLElBQUksQ0FBQyxXQUFXO2dCQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUM7WUFDdEUsT0FBTyxRQUFRLENBQUMsbUJBQW1CLENBQUM7UUFDdEMsS0FBSyxRQUFRLENBQUMsYUFBYTtZQUN6QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLHFEQUFxRCxDQUFDLENBQUM7WUFDdkYsQ0FBQztZQUNELE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxLQUFLLFFBQVEsQ0FBQyxtQkFBbUI7WUFDL0IsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFDRCxPQUFPLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztRQUN0QyxLQUFLLFNBQVM7WUFDWixJQUFJLFFBQVEsSUFBSSxZQUFZO2dCQUFFLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUN2RCxJQUFJLFlBQVk7Z0JBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsNENBQTRDLENBQUMsQ0FBQztZQUM5RixPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO0lBQy9FLENBQUM7QUFDSCxDQUFDO0FBRUQsa0VBQWtFO0FBQ2xFLE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBeUI7SUFDckQsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3ZELElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQW9CLENBQUM7UUFBRSxPQUFPLFFBQW9CLENBQUM7SUFDeEYsTUFBTSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsdUJBQXVCLFFBQVEsbUJBQW1CLENBQUMsQ0FBQztBQUNwRixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsT0FBZ0MsRUFDaEMsVUFBVSxHQUFHLDJCQUEyQjtJQUV4QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzlDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FDNUQsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLEtBQUssMkJBQTJCO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0UsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsT0FBTyxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0YsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBd0IsRUFBRSxTQUE2QjtJQUNqRixJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSywrQkFBK0IsRUFBRSxDQUFDO2dCQUM5RSxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDNUIsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO0lBQ1osQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQztBQUM5QixDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3ZDLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDbkMsS0FBSyxVQUFVLENBQUMsU0FBUztZQUN2QixPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDOUIsS0FBSyxVQUFVLENBQUMsT0FBTztZQUNyQixPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDNUIsS0FBSyxVQUFVLENBQUMsT0FBTztZQUNyQixPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDNUI7WUFDRSxNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO0lBQ25GLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxPQUFlLEVBQUUsS0FBYTtJQUNwRCxNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLE9BQU8sYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFnQixFQUFFLEtBQWlCO0lBQ3JELElBQUksQ0FBQztRQUNILElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLENBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUM5RCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLE9BQW1CO0lBQ3ZDLE9BQU8sQ0FDTCxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxRQUFRO1FBQ3RDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUN6RSxDQUFDO0FBQ0osQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLFVBQW1CLEVBQ25CLE9BQU8sR0FBRyxLQUFLLEVBQ2YsY0FBMkIsT0FBTyxDQUFDLEdBQUc7SUFFdEMsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDaEMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUM7U0FDM0MsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDWixNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FDOUIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFDL0IsT0FBTyxDQUFDLFFBQVEsRUFDaEIsT0FBTyxDQUFDLFlBQVksRUFDcEIsT0FBTyxDQUFDLFdBQVcsQ0FDcEIsQ0FBQztRQUNGLE9BQU87WUFDTCxJQUFJO1lBQ0osR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO1lBQ3BDLFFBQVE7WUFDUixTQUFTLEVBQ1AsUUFBUSxLQUFLLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxLQUFLLFFBQVEsQ0FBQyxtQkFBbUI7Z0JBQ3pFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQztnQkFDekQsQ0FBQyxDQUFDLElBQUk7U0FDWCxDQUFDO0lBQ0osQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCx5RkFBeUY7QUFDekYsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxPQUE4QixFQUM5QixjQUEyQixPQUFPLENBQUMsR0FBRztJQUV0QyxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN0RSxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDOUYsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUM3QixXQUFXLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxrQkFBa0IsQ0FDbkUsQ0FBQztJQUNGLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sZ0JBQWdCLEdBQ3BCLE9BQU8sQ0FBQyxRQUFRO1FBQ2hCLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0YsTUFBTSxtQkFBbUIsR0FBRztRQUMxQixXQUFXLENBQUMsZUFBZTtRQUMzQixXQUFXLENBQUMsb0JBQW9CO1FBQ2hDLFdBQVcsQ0FBQyx3QkFBd0I7S0FDckMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxNQUFNLGdCQUFnQixHQUNwQixDQUFDLEtBQUssSUFBSSxlQUFlLElBQUksZ0JBQWdCO1FBQzNDLENBQUMsQ0FBQyxnQkFBZ0I7UUFDbEIsQ0FBQyxDQUFDLFlBQVk7WUFDWixDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWE7WUFDeEIsQ0FBQyxDQUFDLG1CQUFtQjtnQkFDbkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUI7Z0JBQzlCLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDcEIsTUFBTSxPQUFPLEdBQ1gsZ0JBQWdCLEtBQUssUUFBUSxDQUFDLGFBQWE7UUFDM0MsZ0JBQWdCLEtBQUssUUFBUSxDQUFDLG1CQUFtQixDQUFDO0lBQ3BELE1BQU0sd0JBQXdCLEdBQUcsZUFBZSxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQzdELE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdEUsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLGtCQUFrQixDQUFDO0lBQ3pGLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUNwQyxhQUFhLEVBQ2IsZUFBZSxFQUNmLE1BQU0sRUFDTixPQUFPLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUNwQyxDQUFDO0lBQ0YsTUFBTSxrQkFBa0IsR0FBRztRQUN6QixPQUFPLENBQUMsV0FBVztRQUNuQixPQUFPLENBQUMsUUFBUTtRQUNoQixPQUFPLENBQUMsWUFBWTtRQUNwQixXQUFXLENBQUMsZ0JBQWdCO1FBQzVCLFdBQVcsQ0FBQyxvQkFBb0I7UUFDaEMsV0FBVyxDQUFDLHdCQUF3QjtLQUNyQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sZUFBZSxHQUNuQixlQUFlLElBQUksQ0FBQyxDQUFDLGtCQUFrQixJQUFJLE1BQU0sRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDakcsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2RCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQTZCLEVBQXNCLEVBQUUsQ0FDcEUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4RixNQUFNLElBQUksR0FBRyxhQUFhLENBQ3hCLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksVUFBVSxDQUFDLElBQUksRUFDN0QsV0FBVyxDQUNaLENBQUM7SUFDRixNQUFNLFNBQVMsR0FDYixXQUFXLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDOUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDO1FBQ2hDLFdBQVcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sV0FBVyxHQUNmLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUNoRCxPQUFPLENBQUMseUJBQXlCLENBQUM7UUFDbEMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEQsTUFBTSxhQUFhLEdBQ2pCLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUM3QyxPQUFPLENBQUMsc0JBQXNCLENBQUM7UUFDL0IsV0FBVyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkQsTUFBTSxZQUFZLEdBQ2hCLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUNqRCxPQUFPLENBQUMsMEJBQTBCLENBQUM7UUFDbkMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdkQsTUFBTSxXQUFXLEdBQ2YsZ0JBQWdCLEtBQUssUUFBUSxDQUFDLGFBQWE7UUFDekMsQ0FBQyxDQUFDLFlBQVk7UUFDZCxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDakQsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1lBQzNCLFdBQVcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxrQkFBa0IsR0FDdEIsZ0JBQWdCO1FBQ2hCLGFBQWEsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUM5QyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQy9GLE1BQU0sUUFBUSxHQUNaLFFBQVEsS0FBSyxRQUFRLENBQUMsYUFBYTtRQUNqQyxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksaUJBQWlCLENBQUM7UUFDdEMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsS0FBSyxRQUFRLENBQUMsbUJBQW1CO1lBQzNFLENBQUMsQ0FBQyxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU07UUFDbkMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN2QyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDekUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzRixNQUFNLE9BQU8sR0FDWCxXQUFXLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDNUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBQzlCLFdBQVcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sU0FBUyxHQUNiLFFBQVEsS0FBSyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsS0FBSyxRQUFRLENBQUMsbUJBQW1CO1FBQ3pFLENBQUMsQ0FBQyxRQUFRO1FBQ1YsQ0FBQyxDQUFDLFdBQVcsQ0FBQztJQUNsQixNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQztRQUNsQyxJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJO1FBQ0osU0FBUztRQUNULFdBQVc7UUFDWCxRQUFRO1FBQ1IsT0FBTztRQUNQLE1BQU07UUFDTixRQUFRO1FBQ1IsV0FBVztLQUNaLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUU7UUFDMUMsT0FBTyxFQUFFLFdBQVc7UUFDcEIsSUFBSTtRQUNKLFFBQVE7UUFDUixNQUFNO1FBQ04sS0FBSztRQUNMLGVBQWU7UUFDZixrQkFBa0IsRUFBRSxrQkFBa0IsSUFBSSxXQUFXO1FBQ3JELFlBQVksRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQ2hDLGNBQWMsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ3BDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzVCLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTTtRQUN6QixVQUFVO0tBQ1gsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNMLElBQUksRUFBRSxXQUFXO1FBQ2pCLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxJQUFJO1FBQ0osR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxRQUFRO1FBQ1IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU07UUFDTixNQUFNO1FBQ04sUUFBUTtRQUNSLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkMsUUFBUTtRQUNSLFNBQVM7S0FDVixDQUFDO0FBQ0osQ0FBQztBQUVELHNEQUFzRDtBQUN0RCxNQUFNLFVBQVUsYUFBYSxDQUFDLE1BQXlCO0lBQ3JELE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM3RSxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FDekIsT0FXQztJQUVELElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsYUFBYTtRQUFFLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztJQUNyRSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQzthQUNoQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7YUFDakMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxRQUFRLE1BQU0sRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLGFBQWE7UUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksVUFBVSxDQUFDO0lBQ2xGLE1BQU0sUUFBUSxHQUFHO1FBQ2YsT0FBTyxDQUFDLElBQUk7UUFDWixPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUU7UUFDdkIsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFO1FBQ3pCLE9BQU8sQ0FBQyxRQUFRO1FBQ2hCLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRTtRQUNyQixhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDeEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDYixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksTUFBTSxFQUFFLENBQUM7QUFDbkgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGlzQWJzb2x1dGUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IEF1dGhUeXBlLCBUYXJnZXRLaW5kIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGgvY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NQcm9maWxlU3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoL3Byb2ZpbGVcIjtcbmltcG9ydCAqIGFzIGVudmlyb25tZW50VXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZW52aXJvbm1lbnQtdXRpbHNcIjtcbmltcG9ydCAqIGFzIG9iamVjdCBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vYmplY3RcIjtcbmltcG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL3N0cmluZy11dGlsc1wiO1xuaW1wb3J0IHsgdHJpbVRvVW5kZWZpbmVkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvc3RyaW5nLXV0aWxzXCI7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZUluaSB9IGZyb20gXCJpbmlcIjtcblxuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4vX2Vycm9ycy50c1wiO1xuaW1wb3J0IHsgYXV0aExvZ2dlciB9IGZyb20gXCIuL19sb2dnaW5nLnRzXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NQcm9maWxlIH0gZnJvbSBcIi4vX3R5cGVzLnRzXCI7XG5pbXBvcnQge1xuICB0eXBlIERhdGFicmlja3NBdXRoT3B0aW9ucyxcbiAgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLFxuICBERUZBVUxUX0NMSUVOVF9JRCxcbiAgREVGQVVMVF9DT05GSUdfRklMRSxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGF1dGhMb2dnZXIoXCJwcm9maWxlLXNlbGVjdGlvblwiKTtcbmNvbnN0IGNvbmZpZ0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEluaUNvbmZpZyB8IEVycm9yIHwgdW5kZWZpbmVkPigpO1xuXG5leHBvcnQgY29uc3QgU0VUVElOR1NfU0VDVElPTiA9IFwiX19zZXR0aW5nc19fXCI7XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj47XG5leHBvcnQgdHlwZSBJbmlDb25maWcgPSBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuZXhwb3J0IGludGVyZmFjZSBSYXdQcm9maWxlIHtcbiAgaG9zdD86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB3b3Jrc3BhY2VJZD86IHN0cmluZztcbiAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIGNsaWVudFNlY3JldD86IHN0cmluZztcbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIGdyb3VwSWQ/OiBzdHJpbmc7XG4gIHNjb3Blcz86IHN0cmluZztcbiAgYXV0aFR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBzZWxlY3RlZCBEYXRhYnJpY2tzIGNvbmZpZ3VyYXRpb24gcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29uZmlnRmlsZShcbiAgZXhwbGljaXQ/OiBzdHJpbmcsXG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPVxuICAgIHRyaW1Ub1VuZGVmaW5lZChleHBsaWNpdCkgPz9cbiAgICB0cmltVG9VbmRlZmluZWQoZW52aXJvbm1lbnQuREFUQUJSSUNLU19DT05GSUdfRklMRSkgPz9cbiAgICBERUZBVUxUX0NPTkZJR19GSUxFO1xuICBjb25zdCBleHBhbmRlZCA9XG4gICAgc2VsZWN0ZWQgPT09IFwiflwiXG4gICAgICA/IGhvbWVkaXIoKVxuICAgICAgOiBzZWxlY3RlZC5zdGFydHNXaXRoKFwifi9cIilcbiAgICAgICAgPyByZXNvbHZlKGhvbWVkaXIoKSwgc2VsZWN0ZWQuc2xpY2UoMikpXG4gICAgICAgIDogc2VsZWN0ZWQ7XG4gIHJldHVybiBpc0Fic29sdXRlKGV4cGFuZGVkKSA/IGV4cGFuZGVkIDogcmVzb2x2ZShleHBhbmRlZCk7XG59XG5cbi8qKiBMb2FkIGFuZCBjYWNoZSB0aGUgc2VsZWN0ZWQgRGF0YWJyaWNrcyBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb25maWcoXG4gIGNvbmZpZ0ZpbGU/OiBzdHJpbmcsXG4gIHJlZnJlc2ggPSBmYWxzZSxcbiAgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYsXG4pOiBJbmlDb25maWcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXRoID0gcmVzb2x2ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZSwgZW52aXJvbm1lbnQpO1xuICBpZiAocmVmcmVzaCkgY29uZmlnQ2FjaGUuZGVsZXRlKHBhdGgpO1xuICBpZiAoY29uZmlnQ2FjaGUuaGFzKHBhdGgpKSB7XG4gICAgY29uc3QgY2FjaGVkID0gY29uZmlnQ2FjaGUuZ2V0KHBhdGgpO1xuICAgIGlmIChjYWNoZWQgaW5zdGFuY2VvZiBFcnJvcikgdGhyb3cgY2FjaGVkO1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgaWYgKCFleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgY29uZmlnQ2FjaGUuc2V0KHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHBhcnNlRGF0YWJyaWNrc0NvbmZpZyhyZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBjb25maWdDYWNoZS5zZXQocGF0aCwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIGNvbnN0IGVycm9yID1cbiAgICAgIGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZSA6IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgYENvdWxkIG5vdCByZWFkICR7cGF0aH1gLCB7IGNhdXNlIH0pO1xuICAgIGNvbmZpZ0NhY2hlLnNldChwYXRoLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqIEludmFsaWRhdGUgY2FjaGVkIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgYW4gZXh0ZXJuYWwgd3JpdGUuICovXG5leHBvcnQgZnVuY3Rpb24gaW52YWxpZGF0ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZT86IHN0cmluZyk6IHZvaWQge1xuICBjb25maWdDYWNoZS5kZWxldGUocmVzb2x2ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZSkpO1xufVxuXG4vKiogUGFyc2UgRGF0YWJyaWNrcyBJTkkgdGV4dCB0aHJvdWdoIHRoZSBtYWludGFpbmVkIGBpbmlgIHBhY2thZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRhYnJpY2tzQ29uZmlnKHNvdXJjZTogc3RyaW5nKTogSW5pQ29uZmlnIHtcbiAgbGV0IHBhcnNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gcGFyc2VJbmkoc291cmNlKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiRGF0YWJyaWNrcyBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZCBJTklcIiwgeyBjYXVzZSB9KTtcbiAgfVxuICBjb25zdCBjb25maWc6IEluaUNvbmZpZyA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICBpZiAoIW5hbWUudHJpbSgpIHx8ICFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiRGF0YWJyaWNrcyBjb25maWd1cmF0aW9uIHZhbHVlcyBtdXN0IGJlbG9uZyB0byBhIHByb2ZpbGVcIik7XG4gICAgfVxuICAgIF9hcHBlbmRDb25maWdTZWN0aW9ucyhjb25maWcsIFtuYW1lLnRyaW0oKV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gY29uZmlnO1xufVxuXG5mdW5jdGlvbiBfYXBwZW5kQ29uZmlnU2VjdGlvbnMoXG4gIGNvbmZpZzogSW5pQ29uZmlnLFxuICBwYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHNlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBsZXQgbmVzdGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChvYmplY3QuaXNSZWNvcmQoZW50cnkpKSB7XG4gICAgICBuZXN0ZWQgPSB0cnVlO1xuICAgICAgX2FwcGVuZENvbmZpZ1NlY3Rpb25zKGNvbmZpZywgWy4uLnBhdGgsIGtleV0sIGVudHJ5KTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkgIT09IG51bGwpIHtcbiAgICAgIHNlY3Rpb24uc2V0KGtleS50cmltKCkudG9Mb3dlckNhc2UoKSwgU3RyaW5nKGVudHJ5KS50cmltKCkpO1xuICAgIH1cbiAgfVxuICBpZiAoc2VjdGlvbi5zaXplIHx8ICFuZXN0ZWQpIHtcbiAgICBjb25maWcuc2V0KHBhdGguam9pbihcIi5cIiksIHNlY3Rpb24pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmF3UHJvZmlsZShjb25maWc6IEluaUNvbmZpZyB8IHVuZGVmaW5lZCwgbmFtZTogc3RyaW5nKTogUmF3UHJvZmlsZSB7XG4gIGNvbnN0IHNlY3Rpb24gPSBjb25maWc/LmdldChuYW1lKTtcbiAgcmV0dXJuIHtcbiAgICBob3N0OiBzZWN0aW9uPy5nZXQoXCJob3N0XCIpLFxuICAgIGFjY291bnRJZDogc2VjdGlvbj8uZ2V0KFwiYWNjb3VudF9pZFwiKSxcbiAgICB3b3Jrc3BhY2VJZDogc2VjdGlvbj8uZ2V0KFwid29ya3NwYWNlX2lkXCIpLFxuICAgIGNsaWVudElkOiBzZWN0aW9uPy5nZXQoXCJjbGllbnRfaWRcIiksXG4gICAgY2xpZW50U2VjcmV0OiBzZWN0aW9uPy5nZXQoXCJjbGllbnRfc2VjcmV0XCIpLFxuICAgIGFjY2Vzc1Rva2VuOiBzZWN0aW9uPy5nZXQoXCJ0b2tlblwiKSxcbiAgICBncm91cElkOiBzZWN0aW9uPy5nZXQoXCJncm91cF9pZFwiKSxcbiAgICBzY29wZXM6IHNlY3Rpb24/LmdldChcInNjb3Blc1wiKSxcbiAgICBhdXRoVHlwZTogdHJpbVRvVW5kZWZpbmVkKHNlY3Rpb24/LmdldChcImF1dGhfdHlwZVwiKSk/LnRvTG93ZXJDYXNlKCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJvZmlsZU5hbWUoXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBleHBsaWNpdDogYm9vbGVhbixcbiAgY29uZmlnOiBJbmlDb25maWcgfCB1bmRlZmluZWQsXG4gIHByZWZlclVzZXJUb01hY2hpbmU6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBsZXQgc2VsZWN0ZWQgPSByZXF1ZXN0ZWQ7XG4gIGxldCBzb3VyY2UgPSByZXF1ZXN0ZWQgPyBcInJlcXVlc3RlZFwiIDogdW5kZWZpbmVkO1xuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgc2VsZWN0ZWQgPSB0cmltVG9VbmRlZmluZWQoY29uZmlnPy5nZXQoU0VUVElOR1NfU0VDVElPTik/LmdldChcImRlZmF1bHRfcHJvZmlsZVwiKSk7XG4gICAgaWYgKHNlbGVjdGVkKSBzb3VyY2UgPSBcInNldHRpbmdzLWRlZmF1bHRcIjtcbiAgfVxuICBpZiAoIXNlbGVjdGVkICYmIGNvbmZpZz8uaGFzKFwiREVGQVVMVFwiKSkge1xuICAgIHNlbGVjdGVkID0gXCJERUZBVUxUXCI7XG4gICAgc291cmNlID0gXCJkZWZhdWx0LXNlY3Rpb25cIjtcbiAgfVxuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgY29uc3QgcHJvZmlsZXMgPSBbLi4uKGNvbmZpZz8ua2V5cygpID8/IFtdKV0uZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBTRVRUSU5HU19TRUNUSU9OKTtcbiAgICBpZiAocHJvZmlsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBzZWxlY3RlZCA9IHByb2ZpbGVzWzBdO1xuICAgICAgc291cmNlID0gXCJzb2xlLXByb2ZpbGVcIjtcbiAgICB9XG4gIH1cbiAgaWYgKCFzZWxlY3RlZCkge1xuICAgIHNlbGVjdGVkID0gXCJERUZBVUxUXCI7XG4gICAgc291cmNlID0gXCJmYWxsYmFja1wiO1xuICB9XG4gIGlmIChzZWxlY3RlZCA9PT0gU0VUVElOR1NfU0VDVElPTikge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgYCR7U0VUVElOR1NfU0VDVElPTn0gaXMgcmVzZXJ2ZWRgKTtcbiAgfVxuICBpZiAoZXhwbGljaXQgfHwgIXByZWZlclVzZXJUb01hY2hpbmUgfHwgIWNvbmZpZykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIERhdGFicmlja3MgcHJvZmlsZVwiLCB7XG4gICAgICBwcm9maWxlOiBzZWxlY3RlZCxcbiAgICAgIHNvdXJjZSxcbiAgICAgIGV4cGxpY2l0LFxuICAgICAgcHJlZmVyVXNlclRvTWFjaGluZSxcbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH1cbiAgY29uc3QgY3VycmVudCA9IGxvYWRSYXdQcm9maWxlKGNvbmZpZywgc2VsZWN0ZWQpO1xuICBpZiAoIWlzTTJtUHJvZmlsZShjdXJyZW50KSB8fCAhY3VycmVudC5ob3N0KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2VsZWN0ZWQgRGF0YWJyaWNrcyBwcm9maWxlXCIsIHtcbiAgICAgIHByb2ZpbGU6IHNlbGVjdGVkLFxuICAgICAgc291cmNlLFxuICAgICAgZXhwbGljaXQsXG4gICAgICBwcmVmZXJVc2VyVG9NYWNoaW5lLFxuICAgIH0pO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxuICBjb25zdCBtYXRjaGVzID0gWy4uLmNvbmZpZy5rZXlzKCldLmZpbHRlcigobmFtZSkgPT4ge1xuICAgIGlmIChuYW1lID09PSBzZWxlY3RlZCB8fCBuYW1lID09PSBTRVRUSU5HU19TRUNUSU9OKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gbG9hZFJhd1Byb2ZpbGUoY29uZmlnLCBuYW1lKTtcbiAgICByZXR1cm4gY2FuZGlkYXRlLmF1dGhUeXBlID09PSBcImRhdGFicmlja3MtY2xpXCIgJiYgc2FtZVRhcmdldChjdXJyZW50LCBjYW5kaWRhdGUpO1xuICB9KTtcbiAgY29uc3QgcHJlZmVycmVkID0gbWF0Y2hlcy5sZW5ndGggPT09IDEgPyBtYXRjaGVzWzBdISA6IHNlbGVjdGVkO1xuICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBEYXRhYnJpY2tzIHByb2ZpbGVcIiwge1xuICAgIHByb2ZpbGU6IHByZWZlcnJlZCxcbiAgICBzb3VyY2U6IHByZWZlcnJlZCA9PT0gc2VsZWN0ZWQgPyBzb3VyY2UgOiBcIm1hdGNoaW5nLWNsaS1wcm9maWxlXCIsXG4gICAgb3JpZ2luYWxQcm9maWxlOiBwcmVmZXJyZWQgPT09IHNlbGVjdGVkID8gdW5kZWZpbmVkIDogc2VsZWN0ZWQsXG4gICAgZXhwbGljaXQsXG4gICAgcHJlZmVyVXNlclRvTWFjaGluZSxcbiAgICBtYXRjaGluZ0NsaVByb2ZpbGVzOiBtYXRjaGVzLmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiBwcmVmZXJyZWQ7XG59XG5cbi8qKiBOb3JtYWxpemUgRGF0YWJyaWNrcyBob3N0cyBhbmQgcmVxdWlyZSBUTFMgb3V0c2lkZSBsb29wYmFjayBkZXZlbG9wbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVIb3N0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHByb2ZpbGUgPSBcIkRFRkFVTFRcIik6IHN0cmluZyB7XG4gIGNvbnN0IHNlbGVjdGVkID0gdHJpbVRvVW5kZWZpbmVkKHZhbHVlKTtcbiAgaWYgKCFzZWxlY3RlZCkgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBgUHJvZmlsZSAke3Byb2ZpbGV9IGhhcyBubyBob3N0YCk7XG4gIGNvbnN0IHdpdGhTY2hlbWUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHNlbGVjdGVkKSA/IHNlbGVjdGVkIDogYGh0dHBzOi8vJHtzZWxlY3RlZH1gO1xuICBsZXQgdXJsOiBVUkw7XG4gIHRyeSB7XG4gICAgdXJsID0gbmV3IFVSTCh3aXRoU2NoZW1lKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBQcm9maWxlICR7cHJvZmlsZX0gaGFzIGFuIGludmFsaWQgaG9zdGAsIHsgY2F1c2UgfSk7XG4gIH1cbiAgaWYgKHVybC5wcm90b2NvbCAhPT0gXCJodHRwczpcIiAmJiB1cmwuaG9zdG5hbWUgIT09IFwibG9jYWxob3N0XCIgJiYgdXJsLmhvc3RuYW1lICE9PSBcIjEyNy4wLjAuMVwiKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcIkRhdGFicmlja3MgaG9zdCBtdXN0IHVzZSBIVFRQU1wiKTtcbiAgfVxuICByZXR1cm4gdXJsLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF1dGhUeXBlKFxuICBhdXRoVHlwZTogQXV0aFR5cGUgfCB1bmRlZmluZWQsXG4gIGNsaWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNsaWVudFNlY3JldDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogQXV0aFR5cGUge1xuICBzd2l0Y2ggKGF1dGhUeXBlKSB7XG4gICAgY2FzZSBBdXRoVHlwZS5EYXRhYnJpY2tzQ2xpOlxuICAgICAgcmV0dXJuIEF1dGhUeXBlLkRhdGFicmlja3NDbGk7XG4gICAgY2FzZSBBdXRoVHlwZS5PQXV0aE0yTTpcbiAgICAgIGlmICghY2xpZW50SWQgfHwgIWNsaWVudFNlY3JldCkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwib2F1dGgtbTJtIHJlcXVpcmVzIGNsaWVudF9pZCBhbmQgY2xpZW50X3NlY3JldFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBBdXRoVHlwZS5PQXV0aE0yTTtcbiAgICBjYXNlIEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW46XG4gICAgICBpZiAoIWFjY2Vzc1Rva2VuKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwicGF0IHJlcXVpcmVzIHRva2VuXCIpO1xuICAgICAgcmV0dXJuIEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW47XG4gICAgY2FzZSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mOlxuICAgICAgaWYgKCFhY2Nlc3NUb2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiYXBwX29ibyByZXF1aXJlcyB0aGUgY29uZmlndXJlZCBhY2Nlc3MgdG9rZW4gaGVhZGVyXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEF1dGhUeXBlLkFwcE9uQmVoYWxmT2Y7XG4gICAgY2FzZSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsOlxuICAgICAgaWYgKCFjbGllbnRJZCB8fCAhY2xpZW50U2VjcmV0KSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJhcHBfc3AgcmVxdWlyZXMgY2xpZW50IGlkIGFuZCBzZWNyZXRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbDtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGlmIChjbGllbnRJZCAmJiBjbGllbnRTZWNyZXQpIHJldHVybiBBdXRoVHlwZS5PQXV0aE0yTTtcbiAgICAgIGlmIChjbGllbnRTZWNyZXQpIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJvYXV0aC1tMm0gY2xpZW50X3NlY3JldCByZXF1aXJlcyBjbGllbnRfaWRcIik7XG4gICAgICByZXR1cm4gYWNjZXNzVG9rZW4gPyBBdXRoVHlwZS5QZXJzb25hbEFjY2Vzc1Rva2VuIDogQXV0aFR5cGUuRGF0YWJyaWNrc0NsaTtcbiAgfVxufVxuXG4vKiogUGFyc2Ugb25lIGV4dGVybmFsIGF1dGgtdHlwZSB2YWx1ZSBpbnRvIHRoZSBjYW5vbmljYWwgZW51bS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF1dGhUeXBlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBBdXRoVHlwZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlbGVjdGVkID0gdHJpbVRvVW5kZWZpbmVkKHZhbHVlKT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKHNlbGVjdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChPYmplY3QudmFsdWVzKEF1dGhUeXBlKS5pbmNsdWRlcyhzZWxlY3RlZCBhcyBBdXRoVHlwZSkpIHJldHVybiBzZWxlY3RlZCBhcyBBdXRoVHlwZTtcbiAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBgQXV0aGVudGljYXRpb24gdHlwZSAke3NlbGVjdGVkfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0T2JvVG9rZW4oXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBoZWFkZXJOYW1lID0gREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50cnkgPSBPYmplY3QuZW50cmllcyhoZWFkZXJzID8/IHt9KS5maW5kKFxuICAgIChbbmFtZV0pID0+IG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpLFxuICApO1xuICBjb25zdCB2YWx1ZSA9IHRyaW1Ub1VuZGVmaW5lZChlbnRyeT8uWzFdKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKSAhPT0gREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IFtzY2hlbWUsIC4uLnBhcnRzXSA9IHZhbHVlLnNwbGl0KC9cXHMrLyk7XG4gIHJldHVybiBzY2hlbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiYmVhcmVyXCIgPyB0cmltVG9VbmRlZmluZWQocGFydHMuam9pbihcIiBcIikpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJUYXJnZXQoaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkLCBhY2NvdW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRhcmdldEtpbmQge1xuICBpZiAoYWNjb3VudElkICYmIGhvc3QpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG5ldyBVUkwobm9ybWFsaXplSG9zdChob3N0KSkuaG9zdG5hbWUgPT09IFwiYWNjb3VudHMuY2xvdWQuZGF0YWJyaWNrcy5jb21cIikge1xuICAgICAgICByZXR1cm4gVGFyZ2V0S2luZC5BY2NvdW50O1xuICAgICAgfVxuICAgIH0gY2F0Y2gge31cbiAgfVxuICByZXR1cm4gVGFyZ2V0S2luZC5Xb3Jrc3BhY2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhcmdldCh2YWx1ZTogc3RyaW5nKTogVGFyZ2V0S2luZCB7XG4gIHN3aXRjaCAodmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlIFRhcmdldEtpbmQuV29ya3NwYWNlOlxuICAgICAgcmV0dXJuIFRhcmdldEtpbmQuV29ya3NwYWNlO1xuICAgIGNhc2UgVGFyZ2V0S2luZC5BY2NvdW50OlxuICAgICAgcmV0dXJuIFRhcmdldEtpbmQuQWNjb3VudDtcbiAgICBjYXNlIFRhcmdldEtpbmQuVW5pZmllZDpcbiAgICAgIHJldHVybiBUYXJnZXRLaW5kLlVuaWZpZWQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJUYXJnZXQgbXVzdCBiZSB3b3Jrc3BhY2UsIGFjY291bnQsIG9yIHVuaWZpZWRcIik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pc3NpbmcocHJvZmlsZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBQcm9maWxlICR7cHJvZmlsZX0gcmVxdWlyZXMgJHtmaWVsZH1gKTtcbn1cblxuZnVuY3Rpb24gc2FtZVRhcmdldChsZWZ0OiBSYXdQcm9maWxlLCByaWdodDogUmF3UHJvZmlsZSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGlmIChub3JtYWxpemVIb3N0KGxlZnQuaG9zdCkgIT09IG5vcm1hbGl6ZUhvc3QocmlnaHQuaG9zdCkpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgKCFsZWZ0LmFjY291bnRJZCB8fCBsZWZ0LmFjY291bnRJZCA9PT0gcmlnaHQuYWNjb3VudElkKSAmJlxuICAgICghbGVmdC53b3Jrc3BhY2VJZCB8fCBsZWZ0LndvcmtzcGFjZUlkID09PSByaWdodC53b3Jrc3BhY2VJZClcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNNMm1Qcm9maWxlKHByb2ZpbGU6IFJhd1Byb2ZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBwcm9maWxlLmF1dGhUeXBlID09PSBBdXRoVHlwZS5PQXV0aE0yTSB8fFxuICAgICghcHJvZmlsZS5hdXRoVHlwZSAmJiBCb29sZWFuKHByb2ZpbGUuY2xpZW50SWQgJiYgcHJvZmlsZS5jbGllbnRTZWNyZXQpKVxuICApO1xufVxuXG4vKiogRW51bWVyYXRlIHNlY3JldC1mcmVlIHByb2ZpbGUgbWV0YWRhdGEgZnJvbSBjYWNoZWQgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0RGF0YWJyaWNrc1Byb2ZpbGVzKFxuICBjb25maWdGaWxlPzogc3RyaW5nLFxuICByZWZyZXNoID0gZmFsc2UsXG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LFxuKTogRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5W10ge1xuICBjb25zdCBwYXRoID0gcmVzb2x2ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZSwgZW52aXJvbm1lbnQpO1xuICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKGNvbmZpZ0ZpbGUsIHJlZnJlc2gsIGVudmlyb25tZW50KTtcbiAgaWYgKCFjb25maWcpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWQgRGF0YWJyaWNrcyBwcm9maWxlc1wiLCB7IHBhdGgsIHJlZnJlc2gsIGNvdW50OiAwIH0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9maWxlcyA9IFsuLi5jb25maWcua2V5cygpXVxuICAgIC5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IFNFVFRJTkdTX1NFQ1RJT04pXG4gICAgLm1hcCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IGxvYWRSYXdQcm9maWxlKGNvbmZpZywgbmFtZSk7XG4gICAgICBjb25zdCBob3N0ID0gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHByb2ZpbGUuaG9zdCk7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocHJvZmlsZS5hY2NvdW50SWQpO1xuICAgICAgY29uc3Qgd29ya3NwYWNlSWQgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocHJvZmlsZS53b3Jrc3BhY2VJZCk7XG4gICAgICBjb25zdCBhdXRoVHlwZSA9IHJlc29sdmVBdXRoVHlwZShcbiAgICAgICAgcGFyc2VBdXRoVHlwZShwcm9maWxlLmF1dGhUeXBlKSxcbiAgICAgICAgcHJvZmlsZS5jbGllbnRJZCxcbiAgICAgICAgcHJvZmlsZS5jbGllbnRTZWNyZXQsXG4gICAgICAgIHByb2ZpbGUuYWNjZXNzVG9rZW4sXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgLi4uKGhvc3QgPyB7IGhvc3QgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFjY291bnRJZCA/IHsgYWNjb3VudElkIH0gOiB7fSksXG4gICAgICAgIC4uLih3b3Jrc3BhY2VJZCA/IHsgd29ya3NwYWNlSWQgfSA6IHt9KSxcbiAgICAgICAgdGFyZ2V0OiBpbmZlclRhcmdldChob3N0LCBhY2NvdW50SWQpLFxuICAgICAgICBhdXRoVHlwZSxcbiAgICAgICAgcHJpbmNpcGFsOlxuICAgICAgICAgIGF1dGhUeXBlID09PSBBdXRoVHlwZS5PQXV0aE0yTSB8fCBhdXRoVHlwZSA9PT0gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgICAgPyAoc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHByb2ZpbGUuY2xpZW50SWQpID8/IG5hbWUpXG4gICAgICAgICAgICA6IG5hbWUsXG4gICAgICB9O1xuICAgIH0pXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lm5hbWUubG9jYWxlQ29tcGFyZShyaWdodC5uYW1lKSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBEYXRhYnJpY2tzIHByb2ZpbGVzXCIsIHsgcGF0aCwgcmVmcmVzaCwgY291bnQ6IHByb2ZpbGVzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHByb2ZpbGVzO1xufVxuXG4vKiogUmVzb2x2ZSBvcHRpb25zLCBlbnZpcm9ubWVudCwgcmVxdWVzdCBoZWFkZXJzLCBhbmQgY29uZmlndXJhdGlvbiBpbnRvIGNyZWRlbnRpYWxzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzUHJvZmlsZShcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQgPSBwcm9jZXNzLmVudixcbik6IERhdGFicmlja3NQcm9maWxlIHtcbiAgY29uc3QgaW5BcHAgPSBlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudih7IC4uLmVudmlyb25tZW50IH0pO1xuICBjb25zdCBlbnZpcm9ubWVudFByb2ZpbGUgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW52aXJvbm1lbnQuREFUQUJSSUNLU19DT05GSUdfUFJPRklMRSk7XG4gIGNvbnN0IGV4cGxpY2l0UHJvZmlsZSA9IEJvb2xlYW4oXG4gICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMucHJvZmlsZSkgPz8gZW52aXJvbm1lbnRQcm9maWxlLFxuICApO1xuICBjb25zdCByZXF1ZXN0VG9rZW4gPSByZXF1ZXN0T2JvVG9rZW4ob3B0aW9ucy5yZXF1ZXN0SGVhZGVycywgb3B0aW9ucy5hY2Nlc3NUb2tlbkhlYWRlcik7XG4gIGNvbnN0IGV4cGxpY2l0QXV0aFR5cGUgPVxuICAgIG9wdGlvbnMuYXV0aFR5cGUgPz9cbiAgICAoIWluQXBwICYmICFleHBsaWNpdFByb2ZpbGUgPyBwYXJzZUF1dGhUeXBlKGVudmlyb25tZW50LkRBVEFCUklDS1NfQVVUSF9UWVBFKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGFwcFNlcnZpY2VQcmluY2lwYWwgPSBbXG4gICAgZW52aXJvbm1lbnQuREFUQUJSSUNLU19IT1NULFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX0lELFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVCxcbiAgXS5ldmVyeSgodmFsdWUpID0+IEJvb2xlYW4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHZhbHVlKSkpO1xuICBjb25zdCBzZWxlY3RlZEF1dGhUeXBlID1cbiAgICAhaW5BcHAgfHwgZXhwbGljaXRQcm9maWxlIHx8IGV4cGxpY2l0QXV0aFR5cGVcbiAgICAgID8gZXhwbGljaXRBdXRoVHlwZVxuICAgICAgOiByZXF1ZXN0VG9rZW5cbiAgICAgICAgPyBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mXG4gICAgICAgIDogYXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgID8gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBhcHBBdXRoID1cbiAgICBzZWxlY3RlZEF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mIHx8XG4gICAgc2VsZWN0ZWRBdXRoVHlwZSA9PT0gQXV0aFR5cGUuQXBwU2VydmljZVByaW5jaXBhbDtcbiAgY29uc3QgaWdub3JlQW1iaWVudENyZWRlbnRpYWxzID0gZXhwbGljaXRQcm9maWxlICYmICFhcHBBdXRoO1xuICBjb25zdCBjb25maWdQYXRoID0gcmVzb2x2ZUNvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWdGaWxlLCBlbnZpcm9ubWVudCk7XG4gIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcob3B0aW9ucy5jb25maWdGaWxlLCBmYWxzZSwgZW52aXJvbm1lbnQpO1xuICBjb25zdCByZXF1ZXN0ZWROYW1lID0gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMucHJvZmlsZSkgPz8gZW52aXJvbm1lbnRQcm9maWxlO1xuICBjb25zdCBwcm9maWxlTmFtZSA9IHJlc29sdmVQcm9maWxlTmFtZShcbiAgICByZXF1ZXN0ZWROYW1lLFxuICAgIGV4cGxpY2l0UHJvZmlsZSxcbiAgICBjb25maWcsXG4gICAgb3B0aW9ucy5wcmVmZXJVc2VyVG9NYWNoaW5lID8/IHRydWUsXG4gICk7XG4gIGNvbnN0IGFtYmllbnRDcmVkZW50aWFscyA9IFtcbiAgICBvcHRpb25zLmFjY2Vzc1Rva2VuLFxuICAgIG9wdGlvbnMuY2xpZW50SWQsXG4gICAgb3B0aW9ucy5jbGllbnRTZWNyZXQsXG4gICAgZW52aXJvbm1lbnQuREFUQUJSSUNLU19UT0tFTixcbiAgICBlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0NMSUVOVF9JRCxcbiAgICBlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0NMSUVOVF9TRUNSRVQsXG4gIF0uc29tZSgodmFsdWUpID0+IEJvb2xlYW4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHZhbHVlKSkpO1xuICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPVxuICAgIGV4cGxpY2l0UHJvZmlsZSB8fCAoIWFtYmllbnRDcmVkZW50aWFscyAmJiBjb25maWc/Lmhhcyhwcm9maWxlTmFtZSkpID8gcHJvZmlsZU5hbWUgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBsb2FkUmF3UHJvZmlsZShjb25maWcsIHByb2ZpbGVOYW1lKTtcbiAgY29uc3QgYW1iaWVudCA9IChuYW1lOiBrZXlvZiBOb2RlSlMuUHJvY2Vzc0Vudik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICAgIGlnbm9yZUFtYmllbnRDcmVkZW50aWFscyA/IHVuZGVmaW5lZCA6IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbnZpcm9ubWVudFtuYW1lXSk7XG4gIGNvbnN0IGhvc3QgPSBub3JtYWxpemVIb3N0KFxuICAgIG9wdGlvbnMuaG9zdCA/PyBhbWJpZW50KFwiREFUQUJSSUNLU19IT1NUXCIpID8/IGNvbmZpZ3VyZWQuaG9zdCxcbiAgICBwcm9maWxlTmFtZSxcbiAgKTtcbiAgY29uc3QgYWNjb3VudElkID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5hY2NvdW50SWQpID8/XG4gICAgYW1iaWVudChcIkRBVEFCUklDS1NfQUNDT1VOVF9JRFwiKSA/P1xuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmFjY291bnRJZCk7XG4gIGNvbnN0IHdvcmtzcGFjZUlkID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy53b3Jrc3BhY2VJZCkgPz9cbiAgICBhbWJpZW50KFwiREFUQUJSSUNLU19XT1JLU1BBQ0VfSURcIikgPz9cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoY29uZmlndXJlZC53b3Jrc3BhY2VJZCk7XG4gIGNvbnN0IGNsaWVudElkVmFsdWUgPVxuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChvcHRpb25zLmNsaWVudElkKSA/P1xuICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX0NMSUVOVF9JRFwiKSA/P1xuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmNsaWVudElkKTtcbiAgY29uc3QgY2xpZW50U2VjcmV0ID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5jbGllbnRTZWNyZXQpID8/XG4gICAgYW1iaWVudChcIkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVFwiKSA/P1xuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmNsaWVudFNlY3JldCk7XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID1cbiAgICBzZWxlY3RlZEF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mXG4gICAgICA/IHJlcXVlc3RUb2tlblxuICAgICAgOiAoc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMuYWNjZXNzVG9rZW4pID8/XG4gICAgICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX1RPS0VOXCIpID8/XG4gICAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChjb25maWd1cmVkLmFjY2Vzc1Rva2VuKSk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRBdXRoVHlwZSA9XG4gICAgc2VsZWN0ZWRBdXRoVHlwZSA/P1xuICAgIHBhcnNlQXV0aFR5cGUoYW1iaWVudChcIkRBVEFCUklDS1NfQVVUSF9UWVBFXCIpKSA/P1xuICAgIHBhcnNlQXV0aFR5cGUoY29uZmlndXJlZC5hdXRoVHlwZSk7XG4gIGNvbnN0IGF1dGhUeXBlID0gcmVzb2x2ZUF1dGhUeXBlKGNvbmZpZ3VyZWRBdXRoVHlwZSwgY2xpZW50SWRWYWx1ZSwgY2xpZW50U2VjcmV0LCBhY2Nlc3NUb2tlbik7XG4gIGNvbnN0IGNsaWVudElkID1cbiAgICBhdXRoVHlwZSA9PT0gQXV0aFR5cGUuRGF0YWJyaWNrc0NsaVxuICAgICAgPyAoY2xpZW50SWRWYWx1ZSA/PyBERUZBVUxUX0NMSUVOVF9JRClcbiAgICAgIDogYXV0aFR5cGUgPT09IEF1dGhUeXBlLk9BdXRoTTJNIHx8IGF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsXG4gICAgICAgID8gKGNsaWVudElkVmFsdWUgPz8gbWlzc2luZyhwcm9maWxlTmFtZSwgXCJjbGllbnRfaWRcIikpXG4gICAgICAgIDogKGNsaWVudElkVmFsdWUgPz8gXCJcIik7XG4gIGNvbnN0IHNjb3BlcyA9IG9wdGlvbnMuc2NvcGVzPy5sZW5ndGhcbiAgICA/IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChvcHRpb25zLnNjb3BlcylcbiAgICA6IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChjb25maWd1cmVkLnNjb3Blcz8uc3BsaXQoXCIsXCIpID8/IFtcImFsbC1hcGlzXCJdKTtcbiAgY29uc3QgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQgPyBwYXJzZVRhcmdldChvcHRpb25zLnRhcmdldCkgOiBpbmZlclRhcmdldChob3N0LCBhY2NvdW50SWQpO1xuICBjb25zdCBncm91cElkID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5ncm91cElkKSA/P1xuICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX0dST1VQX0lEXCIpID8/XG4gICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGNvbmZpZ3VyZWQuZ3JvdXBJZCk7XG4gIGNvbnN0IHByaW5jaXBhbCA9XG4gICAgYXV0aFR5cGUgPT09IEF1dGhUeXBlLk9BdXRoTTJNIHx8IGF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsXG4gICAgICA/IGNsaWVudElkXG4gICAgICA6IHByb2ZpbGVOYW1lO1xuICBjb25zdCBjYWNoZUtleSA9IGNyZWRlbnRpYWxDYWNoZUtleSh7XG4gICAgbmFtZTogcHJvZmlsZU5hbWUsXG4gICAgaG9zdCxcbiAgICBhY2NvdW50SWQsXG4gICAgd29ya3NwYWNlSWQsXG4gICAgY2xpZW50SWQsXG4gICAgZ3JvdXBJZCxcbiAgICBzY29wZXMsXG4gICAgYXV0aFR5cGUsXG4gICAgYWNjZXNzVG9rZW4sXG4gIH0pO1xuICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBEYXRhYnJpY2tzIHByb2ZpbGVcIiwge1xuICAgIHByb2ZpbGU6IHByb2ZpbGVOYW1lLFxuICAgIGhvc3QsXG4gICAgYXV0aFR5cGUsXG4gICAgdGFyZ2V0LFxuICAgIGluQXBwLFxuICAgIGV4cGxpY2l0UHJvZmlsZSxcbiAgICBjb25maWd1cmVkQXV0aFR5cGU6IGNvbmZpZ3VyZWRBdXRoVHlwZSA/PyBcImF1dG9tYXRpY1wiLFxuICAgIGhhc0FjY291bnRJZDogQm9vbGVhbihhY2NvdW50SWQpLFxuICAgIGhhc1dvcmtzcGFjZUlkOiBCb29sZWFuKHdvcmtzcGFjZUlkKSxcbiAgICBoYXNHcm91cElkOiBCb29sZWFuKGdyb3VwSWQpLFxuICAgIHNjb3BlQ291bnQ6IHNjb3Blcy5sZW5ndGgsXG4gICAgY29uZmlnUGF0aCxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogcHJvZmlsZU5hbWUsXG4gICAgLi4uKHNlbGVjdGVkUHJvZmlsZSA/IHsgc2VsZWN0ZWRQcm9maWxlIH0gOiB7fSksXG4gICAgaG9zdCxcbiAgICAuLi4oYWNjb3VudElkID8geyBhY2NvdW50SWQgfSA6IHt9KSxcbiAgICAuLi4od29ya3NwYWNlSWQgPyB7IHdvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgY2xpZW50SWQsXG4gICAgLi4uKGdyb3VwSWQgPyB7IGdyb3VwSWQgfSA6IHt9KSxcbiAgICBzY29wZXMsXG4gICAgdGFyZ2V0LFxuICAgIGF1dGhUeXBlLFxuICAgIC4uLihjbGllbnRTZWNyZXQgPyB7IGNsaWVudFNlY3JldCB9IDoge30pLFxuICAgIC4uLihhY2Nlc3NUb2tlbiA/IHsgYWNjZXNzVG9rZW4gfSA6IHt9KSxcbiAgICBjYWNoZUtleSxcbiAgICBwcmluY2lwYWwsXG4gIH07XG59XG5cbi8qKiBOb3JtYWxpemUgT0F1dGggc2NvcGVzIGZvciBtYWNoaW5lIGNyZWRlbnRpYWxzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hY2hpbmVTY29wZXMoc2NvcGVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzY29wZXMubGVuZ3RoID8gc2NvcGVzIDogW1wiYWxsLWFwaXNcIl0pLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY3JlZGVudGlhbENhY2hlS2V5KFxuICBwcm9maWxlOiBQaWNrPFxuICAgIERhdGFicmlja3NQcm9maWxlLFxuICAgIHwgXCJuYW1lXCJcbiAgICB8IFwiaG9zdFwiXG4gICAgfCBcImFjY291bnRJZFwiXG4gICAgfCBcIndvcmtzcGFjZUlkXCJcbiAgICB8IFwiY2xpZW50SWRcIlxuICAgIHwgXCJncm91cElkXCJcbiAgICB8IFwic2NvcGVzXCJcbiAgICB8IFwiYXV0aFR5cGVcIlxuICAgIHwgXCJhY2Nlc3NUb2tlblwiXG4gID4sXG4pOiBzdHJpbmcge1xuICBpZiAocHJvZmlsZS5hdXRoVHlwZSA9PT0gQXV0aFR5cGUuRGF0YWJyaWNrc0NsaSkgcmV0dXJuIHByb2ZpbGUubmFtZTtcbiAgaWYgKHByb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW4pIHtcbiAgICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKHByb2ZpbGUuYWNjZXNzVG9rZW4gPz8gXCJcIilcbiAgICAgIC5kaWdlc3QoXCJoZXhcIik7XG4gICAgcmV0dXJuIGAke3Byb2ZpbGUubmFtZX0tcGF0LSR7ZGlnZXN0fWA7XG4gIH1cbiAgaWYgKHByb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLkFwcE9uQmVoYWxmT2YpIHJldHVybiBgJHtwcm9maWxlLm5hbWV9LWFwcC1vYm9gO1xuICBjb25zdCBpZGVudGl0eSA9IFtcbiAgICBwcm9maWxlLmhvc3QsXG4gICAgcHJvZmlsZS5hY2NvdW50SWQgPz8gXCJcIixcbiAgICBwcm9maWxlLndvcmtzcGFjZUlkID8/IFwiXCIsXG4gICAgcHJvZmlsZS5jbGllbnRJZCxcbiAgICBwcm9maWxlLmdyb3VwSWQgPz8gXCJcIixcbiAgICBtYWNoaW5lU2NvcGVzKHByb2ZpbGUuc2NvcGVzKS5qb2luKFwiIFwiKSxcbiAgXS5qb2luKFwiXFwwXCIpO1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpZGVudGl0eSkuZGlnZXN0KFwiaGV4XCIpO1xuICByZXR1cm4gYCR7cHJvZmlsZS5uYW1lfS0ke3Byb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLkFwcFNlcnZpY2VQcmluY2lwYWwgPyBcImFwcC1zcFwiIDogXCJvYXV0aC1tMm1cIn0tJHtkaWdlc3R9YDtcbn1cbiJdfQ==
|
package/lib/src/client.js
CHANGED
|
@@ -8,6 +8,7 @@ import { machineScopes, resolveConfigFile, resolveDatabricksProfile } from "./_p
|
|
|
8
8
|
import { DatabricksServicePrincipalProvider } from "./_service-principal.js";
|
|
9
9
|
import { MemoryCredentialStore } from "./_storage.js";
|
|
10
10
|
import { AUTH_DEFAULTS, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER, } from "./config.js";
|
|
11
|
+
import { _databricksRuntimeAuthClient, createDatabricksRuntimeAuthClient } from "./runtime-auth.js";
|
|
11
12
|
const logger = authLogger("databricks");
|
|
12
13
|
/** Default Databricks auth facade over the provider-neutral lifecycle. */
|
|
13
14
|
class DefaultAuthClient {
|
|
@@ -81,6 +82,16 @@ class DefaultAuthClient {
|
|
|
81
82
|
}
|
|
82
83
|
/** Create a Databricks authentication client. */
|
|
83
84
|
export async function createAuthClient(options = {}, dependencies = {}) {
|
|
85
|
+
if (usesDefaultCredentialSource(options)) {
|
|
86
|
+
const runtime = await _databricksRuntimeAuthClient();
|
|
87
|
+
if (runtime) {
|
|
88
|
+
logger.debug("selected Databricks Python runtime authentication", {
|
|
89
|
+
host: runtime.host,
|
|
90
|
+
hasWorkspaceId: Boolean(runtime.workspaceId),
|
|
91
|
+
});
|
|
92
|
+
return createDatabricksRuntimeAuthClient(runtime, options);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
84
95
|
return createResolvedAuth(options, dependencies);
|
|
85
96
|
}
|
|
86
97
|
/** Resolve a Databricks profile and create its token lifecycle. */
|
|
@@ -220,4 +231,7 @@ function cliEnvironment(profile, configFile) {
|
|
|
220
231
|
function stringValue(value) {
|
|
221
232
|
return typeof value === "string" && value.trim() ? value : undefined;
|
|
222
233
|
}
|
|
223
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRixPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEcsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFDTCxhQUFhLEVBRWIsMkJBQTJCLEVBQzNCLG1CQUFtQixHQUNwQixNQUFNLGFBQWEsQ0FBQztBQUVyQixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7QUFnQ3hDLDBFQUEwRTtBQUMxRSxNQUFNLGlCQUFpQjtJQVVGO0lBQ0E7SUFDQTtJQVhWLE9BQU8sQ0FBVTtJQUNqQixJQUFJLENBQVM7SUFDYixTQUFTLENBQVU7SUFDbkIsV0FBVyxDQUFVO0lBQ3JCLE1BQU0sQ0FBYTtJQUNuQixRQUFRLENBQVc7SUFDbkIsU0FBUyxDQUFTO0lBRTNCLFlBQ21CLFlBQStCLEVBQy9CLE1BQXVCLEVBQ3ZCLFlBQW9CO1FBRnBCLGlCQUFZLEdBQVosWUFBWSxDQUFtQjtR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RUFBRSxLQUFLO2dCQUMzQixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsV0FBWTthQUN2QztZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEYXRhYnJpY2tzQXV0aENsaWVudEluZm8gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtYXV0aC9jbGllbnRcIjtcbmltcG9ydCB7IEF1dGhUeXBlLCBUYXJnZXRLaW5kIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGgvY29uZmlnXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzQ2xpUHJvdmlkZXIsIHJlc29sdmVEYXRhYnJpY2tzQ2xpIH0gZnJvbSBcIi4vX2RhdGFicmlja3MtY2xpLnRzXCI7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tIFwiLi9fZXJyb3JzLnRzXCI7XG5pbXBvcnQgeyBwdWJsaWNUb2tlbiwgVG9rZW5MaWZlY3ljbGUgfSBmcm9tIFwiLi9fbGlmZWN5Y2xlLnRzXCI7XG5pbXBvcnQgeyBhdXRoTG9nZ2VyLCB0b2tlbk1ldGFkYXRhIH0gZnJvbSBcIi4vX2xvZ2dpbmcudHNcIjtcbmltcG9ydCB7IERhdGFicmlja3NQZXJzb25hbEFjY2Vzc1Rva2VuUHJvdmlkZXIgfSBmcm9tIFwiLi9fcGVyc29uYWwtYWNjZXNzLXRva2VuLnRzXCI7XG5pbXBvcnQgeyBtYWNoaW5lU2NvcGVzLCByZXNvbHZlQ29uZmlnRmlsZSwgcmVzb2x2ZURhdGFicmlja3NQcm9maWxlIH0gZnJvbSBcIi4vX3Byb2ZpbGUtY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzU2VydmljZVByaW5jaXBhbFByb3ZpZGVyIH0gZnJvbSBcIi4vX3NlcnZpY2UtcHJpbmNpcGFsLnRzXCI7XG5pbXBvcnQgeyBNZW1vcnlDcmVkZW50aWFsU3RvcmUgfSBmcm9tIFwiLi9fc3RvcmFnZS50c1wiO1xuaW1wb3J0IHsgdHlwZSBEYXRhYnJpY2tzUHJvZmlsZSwgdHlwZSBUb2tlbiwgdHlwZSBUb2tlblByb3ZpZGVyIH0gZnJvbSBcIi4vX3R5cGVzLnRzXCI7XG5pbXBvcnQge1xuICBBVVRIX0RFRkFVTFRTLFxuICB0eXBlIERhdGFicmlja3NBdXRoT3B0aW9ucyxcbiAgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLFxuICBXT1JLU1BBQ0VfSURfSEVBREVSLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gYXV0aExvZ2dlcihcImRhdGFicmlja3NcIik7XG5cbi8qKiBQdWJsaWMgY3JlZGVudGlhbCByZXN1bHQgd2l0aCBubyByZWZyZXNoIHRva2VuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NUb2tlbiB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIHRva2VuVHlwZTogc3RyaW5nO1xuICBleHBpcnk/OiBzdHJpbmc7XG4gIHNjb3Blczogc3RyaW5nW107XG59XG5cbi8qKiBUb2tlbiBhY3F1aXNpdGlvbiBjb250cm9scy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5PcHRpb25zIHtcbiAgLyoqIFBlcm1pdCBpbnRlcmFjdGl2ZSBDTEkgbG9naW4gd2hlbiByZXF1aXJlZC4gKi9cbiAgbG9naW4/OiBib29sZWFuO1xuICAvKiogQnlwYXNzIGEgcmV1c2FibGUgY2FjaGVkIHRva2VuIGFuZCByZWZyZXNoIGl0LiAqL1xuICByZWZyZXNoPzogYm9vbGVhbjtcbn1cblxuLyoqIFdvcmtzcGFjZUNsaWVudC1zaGFwZWQgRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbiBmYWNhZGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhDbGllbnQgZXh0ZW5kcyBEYXRhYnJpY2tzQXV0aENsaWVudEluZm8ge1xuICB0b2tlbihvcHRpb25zPzogVG9rZW5PcHRpb25zKTogUHJvbWlzZTxBY2Nlc3NUb2tlbj47XG4gIGhlYWRlcnMob3B0aW9ucz86IFRva2VuT3B0aW9ucyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIGxvZ291dCgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogSW5qZWN0YWJsZSBob3N0IGNhcGFiaWxpdGllcyBmb3IgRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMge1xuICBlbnZpcm9ubWVudD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuICBmZXRjaD86IHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoO1xuICByZXNvbHZlQ2xpPzogKCkgPT4gUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xufVxuXG4vKiogRGVmYXVsdCBEYXRhYnJpY2tzIGF1dGggZmFjYWRlIG92ZXIgdGhlIHByb3ZpZGVyLW5ldXRyYWwgbGlmZWN5Y2xlLiAqL1xuY2xhc3MgRGVmYXVsdEF1dGhDbGllbnQgaW1wbGVtZW50cyBBdXRoQ2xpZW50IHtcbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBhY2NvdW50SWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdvcmtzcGFjZUlkPzogc3RyaW5nO1xuICByZWFkb25seSB0YXJnZXQ6IFRhcmdldEtpbmQ7XG4gIHJlYWRvbmx5IGF1dGhUeXBlOiBBdXRoVHlwZTtcbiAgcmVhZG9ubHkgcHJpbmNpcGFsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9maWxlVmFsdWU6IERhdGFicmlja3NQcm9maWxlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50PzogVG9rZW5MaWZlY3ljbGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0VG9rZW4/OiBUb2tlbixcbiAgKSB7XG4gICAgdGhpcy5wcm9maWxlID0gcHJvZmlsZVZhbHVlLnNlbGVjdGVkUHJvZmlsZTtcbiAgICB0aGlzLmhvc3QgPSBwcm9maWxlVmFsdWUuaG9zdDtcbiAgICB0aGlzLmFjY291bnRJZCA9IHByb2ZpbGVWYWx1ZS5hY2NvdW50SWQ7XG4gICAgdGhpcy53b3Jrc3BhY2VJZCA9IHByb2ZpbGVWYWx1ZS53b3Jrc3BhY2VJZDtcbiAgICB0aGlzLnRhcmdldCA9IHByb2ZpbGVWYWx1ZS50YXJnZXQ7XG4gICAgdGhpcy5hdXRoVHlwZSA9IHByb2ZpbGVWYWx1ZS5hdXRoVHlwZTtcbiAgICB0aGlzLnByaW5jaXBhbCA9IHByb2ZpbGVWYWx1ZS5wcmluY2lwYWw7XG4gIH1cblxuICB0b2tlbihvcHRpb25zOiBUb2tlbk9wdGlvbnMgPSB7fSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIkRhdGFicmlja3MgdG9rZW4gcmVxdWVzdGVkXCIsIHtcbiAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgbG9naW46IG9wdGlvbnMubG9naW4gPz8gXCJhdXRvXCIsXG4gICAgICByZWZyZXNoOiBvcHRpb25zLnJlZnJlc2ggPz8gZmFsc2UsXG4gICAgICBzb3VyY2U6IHRoaXMucmVxdWVzdFRva2VuID8gXCJyZXF1ZXN0XCIgOiBcImxpZmVjeWNsZVwiLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLnJlcXVlc3RUb2tlbikgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwdWJsaWNUb2tlbih0aGlzLnJlcXVlc3RUb2tlbikpO1xuICAgIHJldHVybiBvcHRpb25zLnJlZnJlc2hcbiAgICAgID8gdGhpcy5yZXF1aXJlZENsaWVudCgpLmZvcmNlUmVmcmVzaChvcHRpb25zLmxvZ2luID8/IHRydWUpXG4gICAgICA6IHRoaXMucmVxdWlyZWRDbGllbnQoKS50b2tlbldpdGhMb2dpbihvcHRpb25zLmxvZ2luKTtcbiAgfVxuXG4gIGFzeW5jIGhlYWRlcnMob3B0aW9uczogVG9rZW5PcHRpb25zID0ge30pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMudG9rZW4ob3B0aW9ucyk7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgIFtERUZBVUxUX0FDQ0VTU19UT0tFTl9IRUFERVJdOiBgJHt0b2tlbi50b2tlblR5cGV9ICR7dG9rZW4uYWNjZXNzVG9rZW59YCxcbiAgICAgIC4uLih0aGlzLnByb2ZpbGVWYWx1ZS53b3Jrc3BhY2VJZFxuICAgICAgICA/IHsgW1dPUktTUEFDRV9JRF9IRUFERVJdOiB0aGlzLnByb2ZpbGVWYWx1ZS53b3Jrc3BhY2VJZCB9XG4gICAgICAgIDoge30pLFxuICAgIH07XG4gICAgbG9nZ2VyLmRlYnVnKFwiZ2VuZXJhdGVkIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gaGVhZGVyc1wiLCB7XG4gICAgICAuLi50aGlzLmNvbnRleHQoKSxcbiAgICAgIGhlYWRlck5hbWVzOiBPYmplY3Qua2V5cyhoZWFkZXJzKSxcbiAgICAgIHRva2VuOiB0b2tlbk1ldGFkYXRhKHRva2VuKSxcbiAgICB9KTtcbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG4gIGxvZ291dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJEYXRhYnJpY2tzIGxvZ291dCByZXF1ZXN0ZWRcIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgIHJldHVybiB0aGlzLmNsaWVudD8ubG9nb3V0KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlcXVpcmVkQ2xpZW50KCk6IFRva2VuTGlmZWN5Y2xlIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50KSB0aHJvdyBuZXcgQXV0aEVycm9yKFwib2F1dGhcIiwgXCJBdXRoZW50aWNhdGlvbiBsaWZlY3ljbGUgaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIGNvbnRleHQoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9maWxlOiB0aGlzLnByb2ZpbGVWYWx1ZS5uYW1lLFxuICAgICAgaG9zdDogdGhpcy5wcm9maWxlVmFsdWUuaG9zdCxcbiAgICAgIGF1dGhUeXBlOiB0aGlzLnByb2ZpbGVWYWx1ZS5hdXRoVHlwZSxcbiAgICAgIGhhc1dvcmtzcGFjZUlkOiBCb29sZWFuKHRoaXMucHJvZmlsZVZhbHVlLndvcmtzcGFjZUlkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBDcmVhdGUgYSBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIGNsaWVudC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBdXRoQ2xpZW50KFxuICBvcHRpb25zOiBEYXRhYnJpY2tzQXV0aE9wdGlvbnMgPSB7fSxcbiAgZGVwZW5kZW5jaWVzOiBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyA9IHt9LFxuKTogUHJvbWlzZTxBdXRoQ2xpZW50PiB7XG4gIHJldHVybiBjcmVhdGVSZXNvbHZlZEF1dGgob3B0aW9ucywgZGVwZW5kZW5jaWVzKTtcbn1cblxuLyoqIFJlc29sdmUgYSBEYXRhYnJpY2tzIHByb2ZpbGUgYW5kIGNyZWF0ZSBpdHMgdG9rZW4gbGlmZWN5Y2xlLiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVzb2x2ZWRBdXRoKFxuICBvcHRpb25zOiBEYXRhYnJpY2tzQXV0aE9wdGlvbnMsXG4gIGRlcGVuZGVuY2llczogRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMsXG4pOiBQcm9taXNlPERlZmF1bHRBdXRoQ2xpZW50PiB7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gZGVwZW5kZW5jaWVzLmVudmlyb25tZW50ID8/IHByb2Nlc3MuZW52O1xuICBjb25zdCBwcm9maWxlID0gcmVzb2x2ZURhdGFicmlja3NQcm9maWxlKG9wdGlvbnMsIGVudmlyb25tZW50KTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRpbmcgRGF0YWJyaWNrcyBhdXRoXCIsIHtcbiAgICBwcm9maWxlOiBwcm9maWxlLm5hbWUsXG4gICAgaG9zdDogcHJvZmlsZS5ob3N0LFxuICAgIGF1dGhUeXBlOiBwcm9maWxlLmF1dGhUeXBlLFxuICB9KTtcbiAgaWYgKHByb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLkFwcE9uQmVoYWxmT2YpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVkIHJlcXVlc3Qtc2NvcGVkIEFwcCBPQk8gYXV0aGVudGljYXRpb25cIiwge1xuICAgICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgICAgaG9zdDogcHJvZmlsZS5ob3N0LFxuICAgICAgaGFzV29ya3NwYWNlSWQ6IEJvb2xlYW4ocHJvZmlsZS53b3Jrc3BhY2VJZCksXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBEZWZhdWx0QXV0aENsaWVudChwcm9maWxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGFjY2Vzc1Rva2VuOiBwcm9maWxlLmFjY2Vzc1Rva2VuISxcbiAgICAgIHRva2VuVHlwZTogXCJCZWFyZXJcIixcbiAgICAgIHNjb3BlczogWy4uLnByb2ZpbGUuc2NvcGVzXSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwcm92aWRlciA9IGF3YWl0IHByb3ZpZGVyRm9yKHByb2ZpbGUsIG9wdGlvbnMsIGRlcGVuZGVuY2llcyk7XG4gIGNvbnN0IHN0b3JlID0gbmV3IE1lbW9yeUNyZWRlbnRpYWxTdG9yZSgpO1xuICBjb25zdCBjbGllbnQgPSBuZXcgVG9rZW5MaWZlY3ljbGUocHJvZmlsZS5jYWNoZUtleSwgcHJvdmlkZXIsIHN0b3JlLCB7XG4gICAgLi4uQVVUSF9ERUZBVUxUUyxcbiAgICAuLi5vcHRpb25zLmF1dGgsXG4gIH0pO1xuICBjb25zdCBhdXRoID0gbmV3IERlZmF1bHRBdXRoQ2xpZW50KHByb2ZpbGUsIGNsaWVudCk7XG4gIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZWQgYXV0aGVudGljYXRpb24gbGlmZWN5Y2xlXCIsIHtcbiAgICBwcm9maWxlOiBwcm9maWxlLm5hbWUsXG4gICAgaG9zdDogcHJvZmlsZS5ob3N0LFxuICAgIGF1dGhUeXBlOiBwcm9maWxlLmF1dGhUeXBlLFxuICB9KTtcbiAgcmV0dXJuIGF1dGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb3ZpZGVyRm9yKFxuICBwcm9maWxlOiBEYXRhYnJpY2tzUHJvZmlsZSxcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzLFxuKTogUHJvbWlzZTxUb2tlblByb3ZpZGVyPiB7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gZGVwZW5kZW5jaWVzLmVudmlyb25tZW50ID8/IHByb2Nlc3MuZW52O1xuICBzd2l0Y2ggKHByb2ZpbGUuYXV0aFR5cGUpIHtcbiAgICBjYXNlIEF1dGhUeXBlLkRhdGFicmlja3NDbGk6IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIERhdGFicmlja3MgQ0xJIHByb3ZpZGVyXCIsIHsgcHJvZmlsZTogcHJvZmlsZS5uYW1lIH0pO1xuICAgICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzQ2xpUHJvdmlkZXIoXG4gICAgICAgIHByb2ZpbGUubmFtZSxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBkZXBlbmRlbmNpZXMucmVzb2x2ZUNsaSA/IGRlcGVuZGVuY2llcy5yZXNvbHZlQ2xpKCkgOiByZXNvbHZlRGF0YWJyaWNrc0NsaShlbnZpcm9ubWVudCksXG4gICAgICAgIGNsaUVudmlyb25tZW50KHByb2ZpbGUsIHJlc29sdmVDb25maWdGaWxlKG9wdGlvbnMuY29uZmlnRmlsZSwgZW52aXJvbm1lbnQpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgQXV0aFR5cGUuUGVyc29uYWxBY2Nlc3NUb2tlbjpcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIHBlcnNvbmFsIGFjY2VzcyB0b2tlbiBwcm92aWRlclwiLCB7IHByb2ZpbGU6IHByb2ZpbGUubmFtZSB9KTtcbiAgICAgIHJldHVybiBuZXcgRGF0YWJyaWNrc1BlcnNvbmFsQWNjZXNzVG9rZW5Qcm92aWRlcihwcm9maWxlLmFjY2Vzc1Rva2VuISk7XG4gICAgY2FzZSBBdXRoVHlwZS5PQXV0aE0yTTpcbiAgICBjYXNlIEF1dGhUeXBlLkFwcFNlcnZpY2VQcmluY2lwYWw6IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIHNlcnZpY2UtcHJpbmNpcGFsIHByb3ZpZGVyXCIsIHtcbiAgICAgICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgICAgICBhdXRoVHlwZTogcHJvZmlsZS5hdXRoVHlwZSxcbiAgICAgICAgdGFyZ2V0OiBwcm9maWxlLnRhcmdldCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgcmVzb2x2ZU9BdXRoRW5kcG9pbnRzKHByb2ZpbGUsIGRlcGVuZGVuY2llcy5mZXRjaCk7XG4gICAgICByZXR1cm4gbmV3IERhdGFicmlja3NTZXJ2aWNlUHJpbmNpcGFsUHJvdmlkZXIoe1xuICAgICAgICB0b2tlbkVuZHBvaW50OiBlbmRwb2ludHMudG9rZW5FbmRwb2ludCxcbiAgICAgICAgY2xpZW50SWQ6IHByb2ZpbGUuY2xpZW50SWQsXG4gICAgICAgIGNsaWVudFNlY3JldDogcHJvZmlsZS5jbGllbnRTZWNyZXQhLFxuICAgICAgICBzY29wZXM6IG1hY2hpbmVTY29wZXMocHJvZmlsZS5zY29wZXMpLFxuICAgICAgICAuLi4ocHJvZmlsZS5ncm91cElkID8geyBncm91cElkOiBwcm9maWxlLmdyb3VwSWQgfSA6IHt9KSxcbiAgICAgICAgYWxsb3dJbnNlY3VyZVJlcXVlc3RzOiBpc0xvb3BiYWNrSHR0cChwcm9maWxlLmhvc3QpLFxuICAgICAgICBmZXRjaDogZGVwZW5kZW5jaWVzLmZldGNoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgQXV0aFR5cGUuQXBwT25CZWhhbGZPZjpcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJBcHAgT0JPIHRva2VucyBkbyBub3QgdXNlIGEgdG9rZW4gcHJvdmlkZXJcIik7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEF1dGhvcml6YXRpb25TZXJ2ZXIge1xuICB0b2tlbkVuZHBvaW50OiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVPQXV0aEVuZHBvaW50cyhcbiAgcHJvZmlsZTogRGF0YWJyaWNrc1Byb2ZpbGUsXG4gIGZldGNoZXI6IHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoID0gZ2xvYmFsVGhpcy5mZXRjaCxcbik6IFByb21pc2U8QXV0aG9yaXphdGlvblNlcnZlcj4ge1xuICBjb25zdCBob3N0ID0gcHJvZmlsZS5ob3N0LnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcbiAgaWYgKHByb2ZpbGUudGFyZ2V0ID09PSBUYXJnZXRLaW5kLkFjY291bnQpIHtcbiAgICBpZiAoIXByb2ZpbGUuYWNjb3VudElkKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiQWNjb3VudCB0YXJnZXQgcmVxdWlyZXMgYWNjb3VudF9pZFwiKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSB7XG4gICAgICB0b2tlbkVuZHBvaW50OiBgJHtob3N0fS9vaWRjL2FjY291bnRzLyR7cHJvZmlsZS5hY2NvdW50SWR9L3YxL3Rva2VuYCxcbiAgICB9O1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmVkIGFjY291bnQgT0F1dGggZW5kcG9pbnRcIiwge1xuICAgICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgICAgdG9rZW5PcmlnaW46IG5ldyBVUkwoZW5kcG9pbnRzLnRva2VuRW5kcG9pbnQpLm9yaWdpbixcbiAgICB9KTtcbiAgICByZXR1cm4gZW5kcG9pbnRzO1xuICB9XG4gIGNvbnN0IGRpc2NvdmVyeSA9XG4gICAgcHJvZmlsZS50YXJnZXQgPT09IFRhcmdldEtpbmQuVW5pZmllZFxuICAgICAgPyBgJHtob3N0fS9vaWRjL2FjY291bnRzLyR7cmVxdWlyZWRBY2NvdW50SWQocHJvZmlsZSl9Ly53ZWxsLWtub3duL29hdXRoLWF1dGhvcml6YXRpb24tc2VydmVyYFxuICAgICAgOiBgJHtob3N0fS9vaWRjLy53ZWxsLWtub3duL29hdXRoLWF1dGhvcml6YXRpb24tc2VydmVyYDtcbiAgbG9nZ2VyLmRlYnVnKFwicmVxdWVzdGluZyBPQXV0aCBkaXNjb3ZlcnlcIiwge1xuICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICB0YXJnZXQ6IHByb2ZpbGUudGFyZ2V0LFxuICAgIGRpc2NvdmVyeSxcbiAgfSk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hlcihkaXNjb3ZlcnksIHsgcmVkaXJlY3Q6IFwibWFudWFsXCIgfSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInJlY2VpdmVkIE9BdXRoIGRpc2NvdmVyeSByZXNwb25zZVwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICB9KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcIm9hdXRoXCIsIGBPQXV0aCBpcyBub3Qgc3VwcG9ydGVkIGF0ICR7ZGlzY292ZXJ5fWApO1xuICB9XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwib2F1dGhcIiwgYE9BdXRoIGRpc2NvdmVyeSByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHRva2VuRW5kcG9pbnQgPSBzdHJpbmdWYWx1ZSh2YWx1ZS50b2tlbl9lbmRwb2ludCk7XG4gIGlmICghdG9rZW5FbmRwb2ludCkgdGhyb3cgbmV3IEF1dGhFcnJvcihcIm9hdXRoXCIsIFwiT0F1dGggZGlzY292ZXJ5IHJlc3BvbnNlIGlzIGluY29tcGxldGVcIik7XG4gIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmVkIE9BdXRoIHRva2VuIGVuZHBvaW50XCIsIHtcbiAgICBwcm9maWxlOiBwcm9maWxlLm5hbWUsXG4gICAgdG9rZW5PcmlnaW46IG5ldyBVUkwodG9rZW5FbmRwb2ludCkub3JpZ2luLFxuICB9KTtcbiAgcmV0dXJuIHsgdG9rZW5FbmRwb2ludCB9O1xufVxuXG5mdW5jdGlvbiByZXF1aXJlZEFjY291bnRJZChwcm9maWxlOiBEYXRhYnJpY2tzUHJvZmlsZSk6IHN0cmluZyB7XG4gIGlmICghcHJvZmlsZS5hY2NvdW50SWQpIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJVbmlmaWVkIHRhcmdldCByZXF1aXJlcyBhY2NvdW50X2lkXCIpO1xuICByZXR1cm4gcHJvZmlsZS5hY2NvdW50SWQ7XG59XG5cbmZ1bmN0aW9uIGlzTG9vcGJhY2tIdHRwKGhvc3Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKGhvc3QpO1xuICByZXR1cm4gdXJsLnByb3RvY29sID09PSBcImh0dHA6XCIgJiYgW1wiMTI3LjAuMC4xXCIsIFwibG9jYWxob3N0XCJdLmluY2x1ZGVzKHVybC5ob3N0bmFtZSk7XG59XG5cbmZ1bmN0aW9uIGNsaUVudmlyb25tZW50KHByb2ZpbGU6IERhdGFicmlja3NQcm9maWxlLCBjb25maWdGaWxlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIHtcbiAgICBEQVRBQlJJQ0tTX0NPTkZJR19GSUxFOiBjb25maWdGaWxlLFxuICAgIERBVEFCUklDS1NfQ09ORklHX1BST0ZJTEU6IHByb2ZpbGUubmFtZSxcbiAgICBEQVRBQlJJQ0tTX0hPU1Q6IHByb2ZpbGUuaG9zdCxcbiAgICAuLi4ocHJvZmlsZS5hY2NvdW50SWQgPyB7IERBVEFCUklDS1NfQUNDT1VOVF9JRDogcHJvZmlsZS5hY2NvdW50SWQgfSA6IHt9KSxcbiAgICAuLi4ocHJvZmlsZS53b3Jrc3BhY2VJZCA/IHsgREFUQUJSSUNLU19XT1JLU1BBQ0VfSUQ6IHByb2ZpbGUud29ya3NwYWNlSWQgfSA6IHt9KSxcbiAgICAuLi4ocHJvZmlsZS5hdXRoVHlwZSA9PT0gQXV0aFR5cGUuUGVyc29uYWxBY2Nlc3NUb2tlblxuICAgICAgPyB7XG4gICAgICAgICAgREFUQUJSSUNLU19BVVRIX1RZUEU6IFwicGF0XCIsXG4gICAgICAgICAgREFUQUJSSUNLU19UT0tFTjogcHJvZmlsZS5hY2Nlc3NUb2tlbiEsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
234
|
+
function usesDefaultCredentialSource(options) {
|
|
235
|
+
return Object.values(options).every((value) => value === undefined);
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRixPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEcsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFDTCxhQUFhLEVBRWIsMkJBQTJCLEVBQzNCLG1CQUFtQixHQUNwQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7QUFnQ3hDLDBFQUEwRTtBQUMxRSxNQUFNLGlCQUFpQjtJQVVGO0lBQ0E7SUFDQTtJQVhWLE9BQU8sQ0FBVTtJQUNqQixJQUFJLENBQVM7SUFDYixTQUFTLENBQVU7SUFDbkIsV0FBVyxDQUFVO0lBQ3JCLE1BQU0sQ0FBYTtJQUNuQixRQUFRLENBQVc7SUFDbkIsU0FBUyxDQUFTO0lBRTNCLFlBQ21CLFlB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LFVBQVU7UUFDbEMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDdkMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQzdCLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hGLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxtQkFBbUI7WUFDbkQsQ0FBQyxDQUFDO2dCQUNFLG9CQUFvQixFQUFFLEtBQUs7Z0JBQzNCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxXQUFZO2FBQ3ZDO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNSLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYztJQUNqQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUFDLE9BQThCO0lBQ2pFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEYXRhYnJpY2tzQXV0aENsaWVudEluZm8gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtYXV0aC9jbGllbnRcIjtcbmltcG9ydCB7IEF1dGhUeXBlLCBUYXJnZXRLaW5kIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGgvY29uZmlnXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzQ2xpUHJvdmlkZXIsIHJlc29sdmVEYXRhYnJpY2tzQ2xpIH0gZnJvbSBcIi4vX2RhdGFicmlja3MtY2xpLnRzXCI7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tIFwiLi9fZXJyb3JzLnRzXCI7XG5pbXBvcnQgeyBwdWJsaWNUb2tlbiwgVG9rZW5MaWZlY3ljbGUgfSBmcm9tIFwiLi9fbGlmZWN5Y2xlLnRzXCI7XG5pbXBvcnQgeyBhdXRoTG9nZ2VyLCB0b2tlbk1ldGFkYXRhIH0gZnJvbSBcIi4vX2xvZ2dpbmcudHNcIjtcbmltcG9ydCB7IERhdGFicmlja3NQZXJzb25hbEFjY2Vzc1Rva2VuUHJvdmlkZXIgfSBmcm9tIFwiLi9fcGVyc29uYWwtYWNjZXNzLXRva2VuLnRzXCI7XG5pbXBvcnQgeyBtYWNoaW5lU2NvcGVzLCByZXNvbHZlQ29uZmlnRmlsZSwgcmVzb2x2ZURhdGFicmlja3NQcm9maWxlIH0gZnJvbSBcIi4vX3Byb2ZpbGUtY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzU2VydmljZVByaW5jaXBhbFByb3ZpZGVyIH0gZnJvbSBcIi4vX3NlcnZpY2UtcHJpbmNpcGFsLnRzXCI7XG5pbXBvcnQgeyBNZW1vcnlDcmVkZW50aWFsU3RvcmUgfSBmcm9tIFwiLi9fc3RvcmFnZS50c1wiO1xuaW1wb3J0IHsgdHlwZSBEYXRhYnJpY2tzUHJvZmlsZSwgdHlwZSBUb2tlbiwgdHlwZSBUb2tlblByb3ZpZGVyIH0gZnJvbSBcIi4vX3R5cGVzLnRzXCI7XG5pbXBvcnQge1xuICBBVVRIX0RFRkFVTFRTLFxuICB0eXBlIERhdGFicmlja3NBdXRoT3B0aW9ucyxcbiAgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLFxuICBXT1JLU1BBQ0VfSURfSEVBREVSLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IF9kYXRhYnJpY2tzUnVudGltZUF1dGhDbGllbnQsIGNyZWF0ZURhdGFicmlja3NSdW50aW1lQXV0aENsaWVudCB9IGZyb20gXCIuL3J1bnRpbWUtYXV0aC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBhdXRoTG9nZ2VyKFwiZGF0YWJyaWNrc1wiKTtcblxuLyoqIFB1YmxpYyBjcmVkZW50aWFsIHJlc3VsdCB3aXRoIG5vIHJlZnJlc2ggdG9rZW4uICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc1Rva2VuIHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgdG9rZW5UeXBlOiBzdHJpbmc7XG4gIGV4cGlyeT86IHN0cmluZztcbiAgc2NvcGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqIFRva2VuIGFjcXVpc2l0aW9uIGNvbnRyb2xzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb2tlbk9wdGlvbnMge1xuICAvKiogUGVybWl0IGludGVyYWN0aXZlIENMSSBsb2dpbiB3aGVuIHJlcXVpcmVkLiAqL1xuICBsb2dpbj86IGJvb2xlYW47XG4gIC8qKiBCeXBhc3MgYSByZXVzYWJsZSBjYWNoZWQgdG9rZW4gYW5kIHJlZnJlc2ggaXQuICovXG4gIHJlZnJlc2g/OiBib29sZWFuO1xufVxuXG4vKiogV29ya3NwYWNlQ2xpZW50LXNoYXBlZCBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIGZhY2FkZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aENsaWVudCBleHRlbmRzIERhdGFicmlja3NBdXRoQ2xpZW50SW5mbyB7XG4gIHRva2VuKG9wdGlvbnM/OiBUb2tlbk9wdGlvbnMpOiBQcm9taXNlPEFjY2Vzc1Rva2VuPjtcbiAgaGVhZGVycyhvcHRpb25zPzogVG9rZW5PcHRpb25zKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgbG9nb3V0KCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKiBJbmplY3RhYmxlIGhvc3QgY2FwYWJpbGl0aWVzIGZvciBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyB7XG4gIGVudmlyb25tZW50PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj47XG4gIGZldGNoPzogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG4gIHJlc29sdmVDbGk/OiAoKSA9PiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG59XG5cbi8qKiBEZWZhdWx0IERhdGFicmlja3MgYXV0aCBmYWNhZGUgb3ZlciB0aGUgcHJvdmlkZXItbmV1dHJhbCBsaWZlY3ljbGUuICovXG5jbGFzcyBEZWZhdWx0QXV0aENsaWVudCBpbXBsZW1lbnRzIEF1dGhDbGllbnQge1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjY291bnRJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgd29ya3NwYWNlSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldDogVGFyZ2V0S2luZDtcbiAgcmVhZG9ubHkgYXV0aFR5cGU6IEF1dGhUeXBlO1xuICByZWFkb25seSBwcmluY2lwYWw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2ZpbGVWYWx1ZTogRGF0YWJyaWNrc1Byb2ZpbGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ/OiBUb2tlbkxpZmVjeWNsZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RUb2tlbj86IFRva2VuLFxuICApIHtcbiAgICB0aGlzLnByb2ZpbGUgPSBwcm9maWxlVmFsdWUuc2VsZWN0ZWRQcm9maWxlO1xuICAgIHRoaXMuaG9zdCA9IHByb2ZpbGVWYWx1ZS5ob3N0O1xuICAgIHRoaXMuYWNjb3VudElkID0gcHJvZmlsZVZhbHVlLmFjY291bnRJZDtcbiAgICB0aGlzLndvcmtzcGFjZUlkID0gcHJvZmlsZVZhbHVlLndvcmtzcGFjZUlkO1xuICAgIHRoaXMudGFyZ2V0ID0gcHJvZmlsZVZhbHVlLnRhcmdldDtcbiAgICB0aGlzLmF1dGhUeXBlID0gcHJvZmlsZVZhbHVlLmF1dGhUeXBlO1xuICAgIHRoaXMucHJpbmNpcGFsID0gcHJvZmlsZVZhbHVlLnByaW5jaXBhbDtcbiAgfVxuXG4gIHRva2VuKG9wdGlvbnM6IFRva2VuT3B0aW9ucyA9IHt9KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiRGF0YWJyaWNrcyB0b2tlbiByZXF1ZXN0ZWRcIiwge1xuICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICBsb2dpbjogb3B0aW9ucy5sb2dpbiA/PyBcImF1dG9cIixcbiAgICAgIHJlZnJlc2g6IG9wdGlvbnMucmVmcmVzaCA/PyBmYWxzZSxcbiAgICAgIHNvdXJjZTogdGhpcy5yZXF1ZXN0VG9rZW4gPyBcInJlcXVlc3RcIiA6IFwibGlmZWN5Y2xlXCIsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMucmVxdWVzdFRva2VuKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHB1YmxpY1Rva2VuKHRoaXMucmVxdWVzdFRva2VuKSk7XG4gICAgcmV0dXJuIG9wdGlvbnMucmVmcmVzaFxuICAgICAgPyB0aGlzLnJlcXVpcmVkQ2xpZW50KCkuZm9yY2VSZWZyZXNoKG9wdGlvbnMubG9naW4gPz8gdHJ1ZSlcbiAgICAgIDogdGhpcy5yZXF1aXJlZENsaWVudCgpLnRva2VuV2l0aExvZ2luKG9wdGlvbnMubG9naW4pO1xuICB9XG5cbiAgYXN5bmMgaGVhZGVycyhvcHRpb25zOiBUb2tlbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy50b2tlbihvcHRpb25zKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgW0RFRkFVTFRfQUNDRVNTX1RPS0VOX0hFQURFUl06IGAke3Rva2VuLnRva2VuVHlwZX0gJHt0b2tlbi5hY2Nlc3NUb2tlbn1gLFxuICAgICAgLi4uKHRoaXMucHJvZmlsZVZhbHVlLndvcmtzcGFjZUlkXG4gICAgICAgID8geyBbV09SS1NQQUNFX0lEX0hFQURFUl06IHRoaXMucHJvZmlsZVZhbHVlLndvcmtzcGFjZUlkIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgICBsb2dnZXIuZGVidWcoXCJnZW5lcmF0ZWQgRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbiBoZWFkZXJzXCIsIHtcbiAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgaGVhZGVyTmFtZXM6IE9iamVjdC5rZXlzKGhlYWRlcnMpLFxuICAgICAgdG9rZW46IHRva2VuTWV0YWRhdGEodG9rZW4pLFxuICAgIH0pO1xuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIkRhdGFicmlja3MgbG9nb3V0IHJlcXVlc3RlZFwiLCB0aGlzLmNvbnRleHQoKSk7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Py5sb2dvdXQoKSA/PyBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWlyZWRDbGllbnQoKTogVG9rZW5MaWZlY3ljbGUge1xuICAgIGlmICghdGhpcy5jbGllbnQpIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBcIkF1dGhlbnRpY2F0aW9uIGxpZmVjeWNsZSBpcyBub3QgYXZhaWxhYmxlXCIpO1xuICAgIHJldHVybiB0aGlzLmNsaWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY29udGV4dCgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZVZhbHVlLm5hbWUsXG4gICAgICBob3N0OiB0aGlzLnByb2ZpbGVWYWx1ZS5ob3N0LFxuICAgICAgYXV0aFR5cGU6IHRoaXMucHJvZmlsZVZhbHVlLmF1dGhUeXBlLFxuICAgICAgaGFzV29ya3NwYWNlSWQ6IEJvb2xlYW4odGhpcy5wcm9maWxlVmFsdWUud29ya3NwYWNlSWQpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqIENyZWF0ZSBhIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gY2xpZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUF1dGhDbGllbnQoXG4gIG9wdGlvbnM6IERhdGFicmlja3NBdXRoT3B0aW9ucyA9IHt9LFxuICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzID0ge30sXG4pOiBQcm9taXNlPEF1dGhDbGllbnQ+IHtcbiAgaWYgKHVzZXNEZWZhdWx0Q3JlZGVudGlhbFNvdXJjZShvcHRpb25zKSkge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSBhd2FpdCBfZGF0YWJyaWNrc1J1bnRpbWVBdXRoQ2xpZW50KCk7XG4gICAgaWYgKHJ1bnRpbWUpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIERhdGFicmlja3MgUHl0aG9uIHJ1bnRpbWUgYXV0aGVudGljYXRpb25cIiwge1xuICAgICAgICBob3N0OiBydW50aW1lLmhvc3QsXG4gICAgICAgIGhhc1dvcmtzcGFjZUlkOiBCb29sZWFuKHJ1bnRpbWUud29ya3NwYWNlSWQpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY3JlYXRlRGF0YWJyaWNrc1J1bnRpbWVBdXRoQ2xpZW50KHJ1bnRpbWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY3JlYXRlUmVzb2x2ZWRBdXRoKG9wdGlvbnMsIGRlcGVuZGVuY2llcyk7XG59XG5cbi8qKiBSZXNvbHZlIGEgRGF0YWJyaWNrcyBwcm9maWxlIGFuZCBjcmVhdGUgaXRzIHRva2VuIGxpZmVjeWNsZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVkQXV0aChcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzLFxuKTogUHJvbWlzZTxEZWZhdWx0QXV0aENsaWVudD4ge1xuICBjb25zdCBlbnZpcm9ubWVudCA9IGRlcGVuZGVuY2llcy5lbnZpcm9ubWVudCA/PyBwcm9jZXNzLmVudjtcbiAgY29uc3QgcHJvZmlsZSA9IHJlc29sdmVEYXRhYnJpY2tzUHJvZmlsZShvcHRpb25zLCBlbnZpcm9ubWVudCk7XG4gIGxvZ2dlci5kZWJ1ZyhcImNyZWF0aW5nIERhdGFicmlja3MgYXV0aFwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgIGhvc3Q6IHByb2ZpbGUuaG9zdCxcbiAgICBhdXRoVHlwZTogcHJvZmlsZS5hdXRoVHlwZSxcbiAgfSk7XG4gIGlmIChwcm9maWxlLmF1dGhUeXBlID09PSBBdXRoVHlwZS5BcHBPbkJlaGFsZk9mKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlZCByZXF1ZXN0LXNjb3BlZCBBcHAgT0JPIGF1dGhlbnRpY2F0aW9uXCIsIHtcbiAgICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICAgIGhvc3Q6IHByb2ZpbGUuaG9zdCxcbiAgICAgIGhhc1dvcmtzcGFjZUlkOiBCb29sZWFuKHByb2ZpbGUud29ya3NwYWNlSWQpLFxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgRGVmYXVsdEF1dGhDbGllbnQocHJvZmlsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBhY2Nlc3NUb2tlbjogcHJvZmlsZS5hY2Nlc3NUb2tlbiEsXG4gICAgICB0b2tlblR5cGU6IFwiQmVhcmVyXCIsXG4gICAgICBzY29wZXM6IFsuLi5wcm9maWxlLnNjb3Blc10sXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcHJvdmlkZXIgPSBhd2FpdCBwcm92aWRlckZvcihwcm9maWxlLCBvcHRpb25zLCBkZXBlbmRlbmNpZXMpO1xuICBjb25zdCBzdG9yZSA9IG5ldyBNZW1vcnlDcmVkZW50aWFsU3RvcmUoKTtcbiAgY29uc3QgY2xpZW50ID0gbmV3IFRva2VuTGlmZWN5Y2xlKHByb2ZpbGUuY2FjaGVLZXksIHByb3ZpZGVyLCBzdG9yZSwge1xuICAgIC4uLkFVVEhfREVGQVVMVFMsXG4gICAgLi4ub3B0aW9ucy5hdXRoLFxuICB9KTtcbiAgY29uc3QgYXV0aCA9IG5ldyBEZWZhdWx0QXV0aENsaWVudChwcm9maWxlLCBjbGllbnQpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVkIGF1dGhlbnRpY2F0aW9uIGxpZmVjeWNsZVwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgIGhvc3Q6IHByb2ZpbGUuaG9zdCxcbiAgICBhdXRoVHlwZTogcHJvZmlsZS5hdXRoVHlwZSxcbiAgfSk7XG4gIHJldHVybiBhdXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm92aWRlckZvcihcbiAgcHJvZmlsZTogRGF0YWJyaWNrc1Byb2ZpbGUsXG4gIG9wdGlvbnM6IERhdGFicmlja3NBdXRoT3B0aW9ucyxcbiAgZGVwZW5kZW5jaWVzOiBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8VG9rZW5Qcm92aWRlcj4ge1xuICBjb25zdCBlbnZpcm9ubWVudCA9IGRlcGVuZGVuY2llcy5lbnZpcm9ubWVudCA/PyBwcm9jZXNzLmVudjtcbiAgc3dpdGNoIChwcm9maWxlLmF1dGhUeXBlKSB7XG4gICAgY2FzZSBBdXRoVHlwZS5EYXRhYnJpY2tzQ2xpOiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBEYXRhYnJpY2tzIENMSSBwcm92aWRlclwiLCB7IHByb2ZpbGU6IHByb2ZpbGUubmFtZSB9KTtcbiAgICAgIHJldHVybiBuZXcgRGF0YWJyaWNrc0NsaVByb3ZpZGVyKFxuICAgICAgICBwcm9maWxlLm5hbWUsXG4gICAgICAgICgpID0+XG4gICAgICAgICAgZGVwZW5kZW5jaWVzLnJlc29sdmVDbGkgPyBkZXBlbmRlbmNpZXMucmVzb2x2ZUNsaSgpIDogcmVzb2x2ZURhdGFicmlja3NDbGkoZW52aXJvbm1lbnQpLFxuICAgICAgICBjbGlFbnZpcm9ubWVudChwcm9maWxlLCByZXNvbHZlQ29uZmlnRmlsZShvcHRpb25zLmNvbmZpZ0ZpbGUsIGVudmlyb25tZW50KSksXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlIEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW46XG4gICAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBwZXJzb25hbCBhY2Nlc3MgdG9rZW4gcHJvdmlkZXJcIiwgeyBwcm9maWxlOiBwcm9maWxlLm5hbWUgfSk7XG4gICAgICByZXR1cm4gbmV3IERhdGFicmlja3NQZXJzb25hbEFjY2Vzc1Rva2VuUHJvdmlkZXIocHJvZmlsZS5hY2Nlc3NUb2tlbiEpO1xuICAgIGNhc2UgQXV0aFR5cGUuT0F1dGhNMk06XG4gICAgY2FzZSBBdXRoVHlwZS5BcHBTZXJ2aWNlUHJpbmNpcGFsOiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBzZXJ2aWNlLXByaW5jaXBhbCBwcm92aWRlclwiLCB7XG4gICAgICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICAgICAgYXV0aFR5cGU6IHByb2ZpbGUuYXV0aFR5cGUsXG4gICAgICAgIHRhcmdldDogcHJvZmlsZS50YXJnZXQsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IHJlc29sdmVPQXV0aEVuZHBvaW50cyhwcm9maWxlLCBkZXBlbmRlbmNpZXMuZmV0Y2gpO1xuICAgICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzU2VydmljZVByaW5jaXBhbFByb3ZpZGVyKHtcbiAgICAgICAgdG9rZW5FbmRwb2ludDogZW5kcG9pbnRzLnRva2VuRW5kcG9pbnQsXG4gICAgICAgIGNsaWVudElkOiBwcm9maWxlLmNsaWVudElkLFxuICAgICAgICBjbGllbnRTZWNyZXQ6IHByb2ZpbGUuY2xpZW50U2VjcmV0ISxcbiAgICAgICAgc2NvcGVzOiBtYWNoaW5lU2NvcGVzKHByb2ZpbGUuc2NvcGVzKSxcbiAgICAgICAgLi4uKHByb2ZpbGUuZ3JvdXBJZCA/IHsgZ3JvdXBJZDogcHJvZmlsZS5ncm91cElkIH0gOiB7fSksXG4gICAgICAgIGFsbG93SW5zZWN1cmVSZXF1ZXN0czogaXNMb29wYmFja0h0dHAocHJvZmlsZS5ob3N0KSxcbiAgICAgICAgZmV0Y2g6IGRlcGVuZGVuY2llcy5mZXRjaCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNlIEF1dGhUeXBlLkFwcE9uQmVoYWxmT2Y6XG4gICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiQXBwIE9CTyB0b2tlbnMgZG8gbm90IHVzZSBhIHRva2VuIHByb3ZpZGVyXCIpO1xuICB9XG59XG5cbmludGVyZmFjZSBBdXRob3JpemF0aW9uU2VydmVyIHtcbiAgdG9rZW5FbmRwb2ludDogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlT0F1dGhFbmRwb2ludHMoXG4gIHByb2ZpbGU6IERhdGFicmlja3NQcm9maWxlLFxuICBmZXRjaGVyOiB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaCA9IGdsb2JhbFRoaXMuZmV0Y2gsXG4pOiBQcm9taXNlPEF1dGhvcml6YXRpb25TZXJ2ZXI+IHtcbiAgY29uc3QgaG9zdCA9IHByb2ZpbGUuaG9zdC5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG4gIGlmIChwcm9maWxlLnRhcmdldCA9PT0gVGFyZ2V0S2luZC5BY2NvdW50KSB7XG4gICAgaWYgKCFwcm9maWxlLmFjY291bnRJZCkgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcIkFjY291bnQgdGFyZ2V0IHJlcXVpcmVzIGFjY291bnRfaWRcIik7XG4gICAgY29uc3QgZW5kcG9pbnRzID0ge1xuICAgICAgdG9rZW5FbmRwb2ludDogYCR7aG9zdH0vb2lkYy9hY2NvdW50cy8ke3Byb2ZpbGUuYWNjb3VudElkfS92MS90b2tlbmAsXG4gICAgfTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBhY2NvdW50IE9BdXRoIGVuZHBvaW50XCIsIHtcbiAgICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICAgIHRva2VuT3JpZ2luOiBuZXcgVVJMKGVuZHBvaW50cy50b2tlbkVuZHBvaW50KS5vcmlnaW4sXG4gICAgfSk7XG4gICAgcmV0dXJuIGVuZHBvaW50cztcbiAgfVxuICBjb25zdCBkaXNjb3ZlcnkgPVxuICAgIHByb2ZpbGUudGFyZ2V0ID09PSBUYXJnZXRLaW5kLlVuaWZpZWRcbiAgICAgID8gYCR7aG9zdH0vb2lkYy9hY2NvdW50cy8ke3JlcXVpcmVkQWNjb3VudElkKHByb2ZpbGUpfS8ud2VsbC1rbm93bi9vYXV0aC1hdXRob3JpemF0aW9uLXNlcnZlcmBcbiAgICAgIDogYCR7aG9zdH0vb2lkYy8ud2VsbC1rbm93bi9vYXV0aC1hdXRob3JpemF0aW9uLXNlcnZlcmA7XG4gIGxvZ2dlci5kZWJ1ZyhcInJlcXVlc3RpbmcgT0F1dGggZGlzY292ZXJ5XCIsIHtcbiAgICBwcm9maWxlOiBwcm9maWxlLm5hbWUsXG4gICAgdGFyZ2V0OiBwcm9maWxlLnRhcmdldCxcbiAgICBkaXNjb3ZlcnksXG4gIH0pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoZXIoZGlzY292ZXJ5LCB7IHJlZGlyZWN0OiBcIm1hbnVhbFwiIH0pO1xuICBsb2dnZXIuZGVidWcoXCJyZWNlaXZlZCBPQXV0aCBkaXNjb3ZlcnkgcmVzcG9uc2VcIiwge1xuICAgIHByb2ZpbGU6IHByb2ZpbGUubmFtZSxcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgfSk7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBgT0F1dGggaXMgbm90IHN1cHBvcnRlZCBhdCAke2Rpc2NvdmVyeX1gKTtcbiAgfVxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcIm9hdXRoXCIsIGBPQXV0aCBkaXNjb3ZlcnkgcmV0dXJuZWQgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgfVxuICBjb25zdCB2YWx1ZSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCB0b2tlbkVuZHBvaW50ID0gc3RyaW5nVmFsdWUodmFsdWUudG9rZW5fZW5kcG9pbnQpO1xuICBpZiAoIXRva2VuRW5kcG9pbnQpIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBcIk9BdXRoIGRpc2NvdmVyeSByZXNwb25zZSBpcyBpbmNvbXBsZXRlXCIpO1xuICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBPQXV0aCB0b2tlbiBlbmRwb2ludFwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZS5uYW1lLFxuICAgIHRva2VuT3JpZ2luOiBuZXcgVVJMKHRva2VuRW5kcG9pbnQpLm9yaWdpbixcbiAgfSk7XG4gIHJldHVybiB7IHRva2VuRW5kcG9pbnQgfTtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZWRBY2NvdW50SWQocHJvZmlsZTogRGF0YWJyaWNrc1Byb2ZpbGUpOiBzdHJpbmcge1xuICBpZiAoIXByb2ZpbGUuYWNjb3VudElkKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwiVW5pZmllZCB0YXJnZXQgcmVxdWlyZXMgYWNjb3VudF9pZFwiKTtcbiAgcmV0dXJuIHByb2ZpbGUuYWNjb3VudElkO1xufVxuXG5mdW5jdGlvbiBpc0xvb3BiYWNrSHR0cChob3N0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChob3N0KTtcbiAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiICYmIFtcIjEyNy4wLjAuMVwiLCBcImxvY2FsaG9zdFwiXS5pbmNsdWRlcyh1cmwuaG9zdG5hbWUpO1xufVxuXG5mdW5jdGlvbiBjbGlFbnZpcm9ubWVudChwcm9maWxlOiBEYXRhYnJpY2tzUHJvZmlsZSwgY29uZmlnRmlsZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiB7XG4gICAgREFUQUJSSUNLU19DT05GSUdfRklMRTogY29uZmlnRmlsZSxcbiAgICBEQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFOiBwcm9maWxlLm5hbWUsXG4gICAgREFUQUJSSUNLU19IT1NUOiBwcm9maWxlLmhvc3QsXG4gICAgLi4uKHByb2ZpbGUuYWNjb3VudElkID8geyBEQVRBQlJJQ0tTX0FDQ09VTlRfSUQ6IHByb2ZpbGUuYWNjb3VudElkIH0gOiB7fSksXG4gICAgLi4uKHByb2ZpbGUud29ya3NwYWNlSWQgPyB7IERBVEFCUklDS1NfV09SS1NQQUNFX0lEOiBwcm9maWxlLndvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgLi4uKHByb2ZpbGUuYXV0aFR5cGUgPT09IEF1dGhUeXBlLlBlcnNvbmFsQWNjZXNzVG9rZW5cbiAgICAgID8ge1xuICAgICAgICAgIERBVEFCUklDS1NfQVVUSF9UWVBFOiBcInBhdFwiLFxuICAgICAgICAgIERBVEFCUklDS1NfVE9LRU46IHByb2ZpbGUuYWNjZXNzVG9rZW4hLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1c2VzRGVmYXVsdENyZWRlbnRpYWxTb3VyY2Uob3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKG9wdGlvbnMpLmV2ZXJ5KCh2YWx1ZSkgPT4gdmFsdWUgPT09IHVuZGVmaW5lZCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AuthClient } from "./client.ts";
|
|
2
|
+
import { type DatabricksAuthOptions } from "./config.ts";
|
|
3
|
+
/** Python runtime authentication operations backed by one SDK WorkspaceClient. */
|
|
4
|
+
export interface DatabricksRuntimeAuthClient {
|
|
5
|
+
/** Resolved Databricks workspace URL. */
|
|
6
|
+
readonly host: string;
|
|
7
|
+
/** Resolved workspace identifier when the Python SDK provides one. */
|
|
8
|
+
readonly workspaceId?: string;
|
|
9
|
+
/** Resolved caller identifier when the Python SDK provides one. */
|
|
10
|
+
readonly principal?: string;
|
|
11
|
+
/** Return the Python SDK's directly configured token, when present. */
|
|
12
|
+
token(): Promise<string | undefined>;
|
|
13
|
+
/** Return fresh authentication headers from the Python SDK. */
|
|
14
|
+
authenticate(): Promise<Record<string, string>>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Return auth installed by the shared Python Node runtime, when available.
|
|
18
|
+
*/
|
|
19
|
+
export declare function _databricksRuntimeAuthClient(): Promise<DatabricksRuntimeAuthClient | undefined>;
|
|
20
|
+
/** Create an auth facade over a Python runtime WorkspaceClient. */
|
|
21
|
+
export declare function createDatabricksRuntimeAuthClient(runtime: DatabricksRuntimeAuthClient, options: DatabricksAuthOptions): AuthClient;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { RUNTIME_AUTH_TYPE } from "@dbx-tools/shared-auth/client";
|
|
2
|
+
import { TargetKind } from "@dbx-tools/shared-auth/config";
|
|
3
|
+
import { getAccessTokenPayload, getAccessTokenScopes } from "@dbx-tools/shared-core/token";
|
|
4
|
+
import { AuthError } from "./_errors.js";
|
|
5
|
+
import { TokenLifecycle } from "./_lifecycle.js";
|
|
6
|
+
import { normalizeHost } from "./_profile-config.js";
|
|
7
|
+
import { MemoryCredentialStore } from "./_storage.js";
|
|
8
|
+
import { AUTH_DEFAULTS, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER, } from "./config.js";
|
|
9
|
+
const MINIMUM_RUNTIME_TOKEN_TTL_MS = 60_000;
|
|
10
|
+
const RUNTIME_PRINCIPAL = "runtime";
|
|
11
|
+
/**
|
|
12
|
+
* Return auth installed by the shared Python Node runtime, when available.
|
|
13
|
+
*/
|
|
14
|
+
export async function _databricksRuntimeAuthClient() {
|
|
15
|
+
const runtime = globalThis[Symbol.for("@dbx-tools/node-runtime/runtime")];
|
|
16
|
+
return runtime?.databricksRuntimeAuthClient?.();
|
|
17
|
+
}
|
|
18
|
+
/** Create an auth facade over a Python runtime WorkspaceClient. */
|
|
19
|
+
export function createDatabricksRuntimeAuthClient(runtime, options) {
|
|
20
|
+
const lifecycleOptions = {
|
|
21
|
+
...AUTH_DEFAULTS,
|
|
22
|
+
...options.auth,
|
|
23
|
+
};
|
|
24
|
+
const provider = new DatabricksRuntimeTokenProvider(runtime, lifecycleOptions.refreshBufferMs);
|
|
25
|
+
const lifecycle = new TokenLifecycle(runtimeCacheKey(runtime), provider, new MemoryCredentialStore(), lifecycleOptions);
|
|
26
|
+
return new DefaultDatabricksRuntimeAuthClient(runtime, provider, lifecycle);
|
|
27
|
+
}
|
|
28
|
+
function runtimeCacheKey(runtime) {
|
|
29
|
+
return [
|
|
30
|
+
RUNTIME_AUTH_TYPE,
|
|
31
|
+
normalizeHost(runtime.host, RUNTIME_PRINCIPAL),
|
|
32
|
+
runtime.workspaceId ?? "",
|
|
33
|
+
runtime.principal ?? "",
|
|
34
|
+
].join(":");
|
|
35
|
+
}
|
|
36
|
+
function normalizedHeaders(headers) {
|
|
37
|
+
return Object.fromEntries(Object.entries(headers).map(([name, value]) => [name.toLowerCase(), value]));
|
|
38
|
+
}
|
|
39
|
+
function runtimeToken(headers, refreshBufferMs, configuredToken) {
|
|
40
|
+
const authorization = headers[DEFAULT_ACCESS_TOKEN_HEADER];
|
|
41
|
+
const match = authorization?.trim().match(/^(\S+)\s+(.+)$/);
|
|
42
|
+
const accessToken = match?.[2]?.trim() || configuredToken?.trim();
|
|
43
|
+
if (!accessToken) {
|
|
44
|
+
throw new AuthError("oauth", "Databricks Python runtime authentication did not provide an access token");
|
|
45
|
+
}
|
|
46
|
+
const payload = getAccessTokenPayload(accessToken);
|
|
47
|
+
const jwtExpiry = typeof payload.exp === "number" && Number.isFinite(payload.exp)
|
|
48
|
+
? new Date(payload.exp * 1000).toISOString()
|
|
49
|
+
: undefined;
|
|
50
|
+
// Opaque runtime credentials still need a bounded Node cache. Reacquire them
|
|
51
|
+
// from the Python SDK after one refresh-buffer interval.
|
|
52
|
+
const expiry = jwtExpiry ??
|
|
53
|
+
new Date(Date.now() + Math.max(refreshBufferMs * 2, MINIMUM_RUNTIME_TOKEN_TTL_MS)).toISOString();
|
|
54
|
+
return {
|
|
55
|
+
accessToken,
|
|
56
|
+
tokenType: match?.[1] || "Bearer",
|
|
57
|
+
...(expiry ? { expiry } : {}),
|
|
58
|
+
scopes: [...getAccessTokenScopes(accessToken)],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
class DatabricksRuntimeTokenProvider {
|
|
62
|
+
runtime;
|
|
63
|
+
refreshBufferMs;
|
|
64
|
+
#accessToken;
|
|
65
|
+
#headers;
|
|
66
|
+
constructor(runtime, refreshBufferMs) {
|
|
67
|
+
this.runtime = runtime;
|
|
68
|
+
this.refreshBufferMs = refreshBufferMs;
|
|
69
|
+
}
|
|
70
|
+
authenticate() {
|
|
71
|
+
return this.acquire();
|
|
72
|
+
}
|
|
73
|
+
login() {
|
|
74
|
+
return this.acquire();
|
|
75
|
+
}
|
|
76
|
+
refresh() {
|
|
77
|
+
return this.acquire();
|
|
78
|
+
}
|
|
79
|
+
canAuthenticateSilently() {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
headers(token) {
|
|
83
|
+
if (this.#accessToken === token.accessToken && this.#headers) {
|
|
84
|
+
return { ...this.#headers };
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
[DEFAULT_ACCESS_TOKEN_HEADER]: `${token.tokenType} ${token.accessToken}`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
clear() {
|
|
91
|
+
this.#accessToken = undefined;
|
|
92
|
+
this.#headers = undefined;
|
|
93
|
+
}
|
|
94
|
+
async acquire() {
|
|
95
|
+
const headers = normalizedHeaders(await this.runtime.authenticate());
|
|
96
|
+
const token = runtimeToken(headers, this.refreshBufferMs, await this.runtime.token());
|
|
97
|
+
this.#accessToken = token.accessToken;
|
|
98
|
+
this.#headers = {
|
|
99
|
+
...headers,
|
|
100
|
+
[DEFAULT_ACCESS_TOKEN_HEADER]: `${token.tokenType} ${token.accessToken}`,
|
|
101
|
+
};
|
|
102
|
+
return token;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
class DefaultDatabricksRuntimeAuthClient {
|
|
106
|
+
provider;
|
|
107
|
+
lifecycle;
|
|
108
|
+
profile = undefined;
|
|
109
|
+
host;
|
|
110
|
+
accountId = undefined;
|
|
111
|
+
workspaceId;
|
|
112
|
+
target = TargetKind.Workspace;
|
|
113
|
+
authType = RUNTIME_AUTH_TYPE;
|
|
114
|
+
principal;
|
|
115
|
+
constructor(runtime, provider, lifecycle) {
|
|
116
|
+
this.provider = provider;
|
|
117
|
+
this.lifecycle = lifecycle;
|
|
118
|
+
this.host = normalizeHost(runtime.host, RUNTIME_PRINCIPAL);
|
|
119
|
+
this.workspaceId = runtime.workspaceId;
|
|
120
|
+
this.principal = runtime.principal || RUNTIME_PRINCIPAL;
|
|
121
|
+
}
|
|
122
|
+
token(options = {}) {
|
|
123
|
+
return options.refresh
|
|
124
|
+
? this.lifecycle.forceRefresh(options.login ?? true)
|
|
125
|
+
: this.lifecycle.tokenWithLogin(options.login);
|
|
126
|
+
}
|
|
127
|
+
async headers(options = {}) {
|
|
128
|
+
const headers = this.provider.headers(await this.token(options));
|
|
129
|
+
if (this.workspaceId && headers[WORKSPACE_ID_HEADER] === undefined) {
|
|
130
|
+
headers[WORKSPACE_ID_HEADER] = this.workspaceId;
|
|
131
|
+
}
|
|
132
|
+
return headers;
|
|
133
|
+
}
|
|
134
|
+
async logout() {
|
|
135
|
+
await this.lifecycle.logout();
|
|
136
|
+
this.provider.clear();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1hdXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUtYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd0RCxPQUFPLEVBQ0wsYUFBYSxFQUViLDJCQUEyQixFQUMzQixtQkFBbUIsR0FDcEIsTUFBTSxhQUFhLENBQUM7QUFFckIsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLENBQUM7QUFDNUMsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUM7QUFvQnBDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSw0QkFBNEI7SUFHaEQsTUFBTSxPQUFPLEdBQ1gsVUFHRCxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sT0FBTyxFQUFFLDJCQUEyQixFQUFFLEVBQUUsQ0FBQztBQUNsRCxDQUFDO0FBRUQsbUVBQW1FO0FBQ25FLE1BQU0sVUFBVSxpQ0FBaUMsQ0FDL0MsT0FBb0MsRUFDcEMsT0FBOEI7SUFFOUIsTUFBTSxnQkFBZ0IsR0FBRztRQUN2QixHQUFHLGFBQWE7UUFDaEIsR0FBRyxPQUFPLENBQUMsSUFBSTtLQUNoQixDQUFDO0lBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSw4QkFB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QUksSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuRSxPQUFPLENBQUMsbUJBQW1CLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU07UUFDVixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSVU5USU1FX0FVVEhfVFlQRSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoL2NsaWVudFwiO1xuaW1wb3J0IHsgVGFyZ2V0S2luZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW5QYXlsb2FkLCBnZXRBY2Nlc3NUb2tlblNjb3BlcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL3Rva2VuXCI7XG5cbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL19lcnJvcnMudHNcIjtcbmltcG9ydCB7IFRva2VuTGlmZWN5Y2xlIH0gZnJvbSBcIi4vX2xpZmVjeWNsZS50c1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplSG9zdCB9IGZyb20gXCIuL19wcm9maWxlLWNvbmZpZy50c1wiO1xuaW1wb3J0IHsgTWVtb3J5Q3JlZGVudGlhbFN0b3JlIH0gZnJvbSBcIi4vX3N0b3JhZ2UudHNcIjtcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2VuUHJvdmlkZXIgfSBmcm9tIFwiLi9fdHlwZXMudHNcIjtcbmltcG9ydCB0eXBlIHsgQWNjZXNzVG9rZW4sIEF1dGhDbGllbnQsIFRva2VuT3B0aW9ucyB9IGZyb20gXCIuL2NsaWVudC50c1wiO1xuaW1wb3J0IHtcbiAgQVVUSF9ERUZBVUxUUyxcbiAgdHlwZSBEYXRhYnJpY2tzQXV0aE9wdGlvbnMsXG4gIERFRkFVTFRfQUNDRVNTX1RPS0VOX0hFQURFUixcbiAgV09SS1NQQUNFX0lEX0hFQURFUixcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbmNvbnN0IE1JTklNVU1fUlVOVElNRV9UT0tFTl9UVExfTVMgPSA2MF8wMDA7XG5jb25zdCBSVU5USU1FX1BSSU5DSVBBTCA9IFwicnVudGltZVwiO1xuXG4vKiogUHl0aG9uIHJ1bnRpbWUgYXV0aGVudGljYXRpb24gb3BlcmF0aW9ucyBiYWNrZWQgYnkgb25lIFNESyBXb3Jrc3BhY2VDbGllbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NSdW50aW1lQXV0aENsaWVudCB7XG4gIC8qKiBSZXNvbHZlZCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBVUkwuICovXG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgLyoqIFJlc29sdmVkIHdvcmtzcGFjZSBpZGVudGlmaWVyIHdoZW4gdGhlIFB5dGhvbiBTREsgcHJvdmlkZXMgb25lLiAqL1xuICByZWFkb25seSB3b3Jrc3BhY2VJZD86IHN0cmluZztcbiAgLyoqIFJlc29sdmVkIGNhbGxlciBpZGVudGlmaWVyIHdoZW4gdGhlIFB5dGhvbiBTREsgcHJvdmlkZXMgb25lLiAqL1xuICByZWFkb25seSBwcmluY2lwYWw/OiBzdHJpbmc7XG4gIC8qKiBSZXR1cm4gdGhlIFB5dGhvbiBTREsncyBkaXJlY3RseSBjb25maWd1cmVkIHRva2VuLCB3aGVuIHByZXNlbnQuICovXG4gIHRva2VuKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgLyoqIFJldHVybiBmcmVzaCBhdXRoZW50aWNhdGlvbiBoZWFkZXJzIGZyb20gdGhlIFB5dGhvbiBTREsuICovXG4gIGF1dGhlbnRpY2F0ZSgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xufVxuXG5pbnRlcmZhY2UgUHl0aG9uTm9kZVJ1bnRpbWUge1xuICBkYXRhYnJpY2tzUnVudGltZUF1dGhDbGllbnQ/KCk6IFByb21pc2U8RGF0YWJyaWNrc1J1bnRpbWVBdXRoQ2xpZW50IHwgdW5kZWZpbmVkPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYXV0aCBpbnN0YWxsZWQgYnkgdGhlIHNoYXJlZCBQeXRob24gTm9kZSBydW50aW1lLCB3aGVuIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9kYXRhYnJpY2tzUnVudGltZUF1dGhDbGllbnQoKTogUHJvbWlzZTxcbiAgRGF0YWJyaWNrc1J1bnRpbWVBdXRoQ2xpZW50IHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3QgcnVudGltZSA9IChcbiAgICBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgICAgW2tleTogc3ltYm9sXTogUHl0aG9uTm9kZVJ1bnRpbWUgfCB1bmRlZmluZWQ7XG4gICAgfVxuICApW1N5bWJvbC5mb3IoXCJAZGJ4LXRvb2xzL25vZGUtcnVudGltZS9ydW50aW1lXCIpXTtcbiAgcmV0dXJuIHJ1bnRpbWU/LmRhdGFicmlja3NSdW50aW1lQXV0aENsaWVudD8uKCk7XG59XG5cbi8qKiBDcmVhdGUgYW4gYXV0aCBmYWNhZGUgb3ZlciBhIFB5dGhvbiBydW50aW1lIFdvcmtzcGFjZUNsaWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRhYnJpY2tzUnVudGltZUF1dGhDbGllbnQoXG4gIHJ1bnRpbWU6IERhdGFicmlja3NSdW50aW1lQXV0aENsaWVudCxcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuKTogQXV0aENsaWVudCB7XG4gIGNvbnN0IGxpZmVjeWNsZU9wdGlvbnMgPSB7XG4gICAgLi4uQVVUSF9ERUZBVUxUUyxcbiAgICAuLi5vcHRpb25zLmF1dGgsXG4gIH07XG4gIGNvbnN0IHByb3ZpZGVyID0gbmV3IERhdGFicmlja3NSdW50aW1lVG9rZW5Qcm92aWRlcihydW50aW1lLCBsaWZlY3ljbGVPcHRpb25zLnJlZnJlc2hCdWZmZXJNcyk7XG4gIGNvbnN0IGxpZmVjeWNsZSA9IG5ldyBUb2tlbkxpZmVjeWNsZShcbiAgICBydW50aW1lQ2FjaGVLZXkocnVudGltZSksXG4gICAgcHJvdmlkZXIsXG4gICAgbmV3IE1lbW9yeUNyZWRlbnRpYWxTdG9yZSgpLFxuICAgIGxpZmVjeWNsZU9wdGlvbnMsXG4gICk7XG4gIHJldHVybiBuZXcgRGVmYXVsdERhdGFicmlja3NSdW50aW1lQXV0aENsaWVudChydW50aW1lLCBwcm92aWRlciwgbGlmZWN5Y2xlKTtcbn1cblxuZnVuY3Rpb24gcnVudGltZUNhY2hlS2V5KHJ1bnRpbWU6IERhdGFicmlja3NSdW50aW1lQXV0aENsaWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBbXG4gICAgUlVOVElNRV9BVVRIX1RZUEUsXG4gICAgbm9ybWFsaXplSG9zdChydW50aW1lLmhvc3QsIFJVTlRJTUVfUFJJTkNJUEFMKSxcbiAgICBydW50aW1lLndvcmtzcGFjZUlkID8/IFwiXCIsXG4gICAgcnVudGltZS5wcmluY2lwYWwgPz8gXCJcIixcbiAgXS5qb2luKFwiOlwiKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplZEhlYWRlcnMoaGVhZGVyczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhoZWFkZXJzKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IFtuYW1lLnRvTG93ZXJDYXNlKCksIHZhbHVlXSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJ1bnRpbWVUb2tlbihcbiAgaGVhZGVyczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIHJlZnJlc2hCdWZmZXJNczogbnVtYmVyLFxuICBjb25maWd1cmVkVG9rZW4/OiBzdHJpbmcsXG4pOiBUb2tlbiB7XG4gIGNvbnN0IGF1dGhvcml6YXRpb24gPSBoZWFkZXJzW0RFRkFVTFRfQUNDRVNTX1RPS0VOX0hFQURFUl07XG4gIGNvbnN0IG1hdGNoID0gYXV0aG9yaXphdGlvbj8udHJpbSgpLm1hdGNoKC9eKFxcUyspXFxzKyguKykkLyk7XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID0gbWF0Y2g/LlsyXT8udHJpbSgpIHx8IGNvbmZpZ3VyZWRUb2tlbj8udHJpbSgpO1xuICBpZiAoIWFjY2Vzc1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcbiAgICAgIFwib2F1dGhcIixcbiAgICAgIFwiRGF0YWJyaWNrcyBQeXRob24gcnVudGltZSBhdXRoZW50aWNhdGlvbiBkaWQgbm90IHByb3ZpZGUgYW4gYWNjZXNzIHRva2VuXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXlsb2FkID0gZ2V0QWNjZXNzVG9rZW5QYXlsb2FkKGFjY2Vzc1Rva2VuKTtcbiAgY29uc3Qgand0RXhwaXJ5ID1cbiAgICB0eXBlb2YgcGF5bG9hZC5leHAgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHBheWxvYWQuZXhwKVxuICAgICAgPyBuZXcgRGF0ZShwYXlsb2FkLmV4cCAqIDEwMDApLnRvSVNPU3RyaW5nKClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAvLyBPcGFxdWUgcnVudGltZSBjcmVkZW50aWFscyBzdGlsbCBuZWVkIGEgYm91bmRlZCBOb2RlIGNhY2hlLiBSZWFjcXVpcmUgdGhlbVxuICAvLyBmcm9tIHRoZSBQeXRob24gU0RLIGFmdGVyIG9uZSByZWZyZXNoLWJ1ZmZlciBpbnRlcnZhbC5cbiAgY29uc3QgZXhwaXJ5ID1cbiAgICBqd3RFeHBpcnkgPz9cbiAgICBuZXcgRGF0ZShcbiAgICAgIERhdGUubm93KCkgKyBNYXRoLm1heChyZWZyZXNoQnVmZmVyTXMgKiAyLCBNSU5JTVVNX1JVTlRJTUVfVE9LRU5fVFRMX01TKSxcbiAgICApLnRvSVNPU3RyaW5nKCk7XG4gIHJldHVybiB7XG4gICAgYWNjZXNzVG9rZW4sXG4gICAgdG9rZW5UeXBlOiBtYXRjaD8uWzFdIHx8IFwiQmVhcmVyXCIsXG4gICAgLi4uKGV4cGlyeSA/IHsgZXhwaXJ5IH0gOiB7fSksXG4gICAgc2NvcGVzOiBbLi4uZ2V0QWNjZXNzVG9rZW5TY29wZXMoYWNjZXNzVG9rZW4pXSxcbiAgfTtcbn1cblxuY2xhc3MgRGF0YWJyaWNrc1J1bnRpbWVUb2tlblByb3ZpZGVyIGltcGxlbWVudHMgVG9rZW5Qcm92aWRlciB7XG4gICNhY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgI2hlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZTogRGF0YWJyaWNrc1J1bnRpbWVBdXRoQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaEJ1ZmZlck1zOiBudW1iZXIsXG4gICkge31cblxuICBhdXRoZW50aWNhdGUoKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgIHJldHVybiB0aGlzLmFjcXVpcmUoKTtcbiAgfVxuXG4gIGxvZ2luKCk6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gdGhpcy5hY3F1aXJlKCk7XG4gIH1cblxuICByZWZyZXNoKCk6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gdGhpcy5hY3F1aXJlKCk7XG4gIH1cblxuICBjYW5BdXRoZW50aWNhdGVTaWxlbnRseSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGhlYWRlcnModG9rZW46IEFjY2Vzc1Rva2VuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuI2FjY2Vzc1Rva2VuID09PSB0b2tlbi5hY2Nlc3NUb2tlbiAmJiB0aGlzLiNoZWFkZXJzKSB7XG4gICAgICByZXR1cm4geyAuLi50aGlzLiNoZWFkZXJzIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBbREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSXTogYCR7dG9rZW4udG9rZW5UeXBlfSAke3Rva2VuLmFjY2Vzc1Rva2VufWAsXG4gICAgfTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuI2FjY2Vzc1Rva2VuID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuI2hlYWRlcnMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFjcXVpcmUoKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBub3JtYWxpemVkSGVhZGVycyhhd2FpdCB0aGlzLnJ1bnRpbWUuYXV0aGVudGljYXRlKCkpO1xuICAgIGNvbnN0IHRva2VuID0gcnVudGltZVRva2VuKGhlYWRlcnMsIHRoaXMucmVmcmVzaEJ1ZmZlck1zLCBhd2FpdCB0aGlzLnJ1bnRpbWUudG9rZW4oKSk7XG4gICAgdGhpcy4jYWNjZXNzVG9rZW4gPSB0b2tlbi5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLiNoZWFkZXJzID0ge1xuICAgICAgLi4uaGVhZGVycyxcbiAgICAgIFtERUZBVUxUX0FDQ0VTU19UT0tFTl9IRUFERVJdOiBgJHt0b2tlbi50b2tlblR5cGV9ICR7dG9rZW4uYWNjZXNzVG9rZW59YCxcbiAgICB9O1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxufVxuXG5jbGFzcyBEZWZhdWx0RGF0YWJyaWNrc1J1bnRpbWVBdXRoQ2xpZW50IGltcGxlbWVudHMgQXV0aENsaWVudCB7XG4gIHJlYWRvbmx5IHByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgYWNjb3VudElkID0gdW5kZWZpbmVkO1xuICByZWFkb25seSB3b3Jrc3BhY2VJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0ID0gVGFyZ2V0S2luZC5Xb3Jrc3BhY2U7XG4gIHJlYWRvbmx5IGF1dGhUeXBlID0gUlVOVElNRV9BVVRIX1RZUEU7XG4gIHJlYWRvbmx5IHByaW5jaXBhbDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJ1bnRpbWU6IERhdGFicmlja3NSdW50aW1lQXV0aENsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVyOiBEYXRhYnJpY2tzUnVudGltZVRva2VuUHJvdmlkZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsaWZlY3ljbGU6IFRva2VuTGlmZWN5Y2xlLFxuICApIHtcbiAgICB0aGlzLmhvc3QgPSBub3JtYWxpemVIb3N0KHJ1bnRpbWUuaG9zdCwgUlVOVElNRV9QUklOQ0lQQUwpO1xuICAgIHRoaXMud29ya3NwYWNlSWQgPSBydW50aW1lLndvcmtzcGFjZUlkO1xuICAgIHRoaXMucHJpbmNpcGFsID0gcnVudGltZS5wcmluY2lwYWwgfHwgUlVOVElNRV9QUklOQ0lQQUw7XG4gIH1cblxuICB0b2tlbihvcHRpb25zOiBUb2tlbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8QWNjZXNzVG9rZW4+IHtcbiAgICByZXR1cm4gb3B0aW9ucy5yZWZyZXNoXG4gICAgICA/IHRoaXMubGlmZWN5Y2xlLmZvcmNlUmVmcmVzaChvcHRpb25zLmxvZ2luID8/IHRydWUpXG4gICAgICA6IHRoaXMubGlmZWN5Y2xlLnRva2VuV2l0aExvZ2luKG9wdGlvbnMubG9naW4pO1xuICB9XG5cbiAgYXN5bmMgaGVhZGVycyhvcHRpb25zOiBUb2tlbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnByb3ZpZGVyLmhlYWRlcnMoYXdhaXQgdGhpcy50b2tlbihvcHRpb25zKSk7XG4gICAgaWYgKHRoaXMud29ya3NwYWNlSWQgJiYgaGVhZGVyc1tXT1JLU1BBQ0VfSURfSEVBREVSXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzW1dPUktTUEFDRV9JRF9IRUFERVJdID0gdGhpcy53b3Jrc3BhY2VJZDtcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBhc3luYyBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5saWZlY3ljbGUubG9nb3V0KCk7XG4gICAgdGhpcy5wcm92aWRlci5jbGVhcigpO1xuICB9XG59XG4iXX0=
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/_databricks-cli.ts","../src/_errors.ts","../src/_lifecycle.ts","../src/_logging.ts","../src/_personal-access-token.ts","../src/_profile-config.ts","../src/_service-principal.ts","../src/_storage.ts","../src/_types.ts","../src/bindings.ts","../src/client.ts","../src/config.ts","../src/profile.ts","../index.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/_databricks-cli.ts","../src/_errors.ts","../src/_lifecycle.ts","../src/_logging.ts","../src/_personal-access-token.ts","../src/_profile-config.ts","../src/_service-principal.ts","../src/_storage.ts","../src/_types.ts","../src/bindings.ts","../src/client.ts","../src/config.ts","../src/profile.ts","../src/runtime-auth.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
"typescript": "^5.9.3"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@dbx-tools/core": "^0.9.
|
|
28
|
-
"@dbx-tools/shared-auth": "^0.9.
|
|
29
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
27
|
+
"@dbx-tools/core": "^0.9.54",
|
|
28
|
+
"@dbx-tools/shared-auth": "^0.9.54",
|
|
29
|
+
"@dbx-tools/shared-core": "^0.9.54",
|
|
30
30
|
"ini": "^6.0.0",
|
|
31
31
|
"oauth4webapi": "^3.8.8",
|
|
32
32
|
"zod": "4.3.6"
|
|
@@ -58,10 +58,14 @@
|
|
|
58
58
|
"types": "./lib/src/profile.d.ts",
|
|
59
59
|
"default": "./lib/src/profile.js"
|
|
60
60
|
},
|
|
61
|
+
"./runtime-auth": {
|
|
62
|
+
"types": "./lib/src/runtime-auth.d.ts",
|
|
63
|
+
"default": "./lib/src/runtime-auth.js"
|
|
64
|
+
},
|
|
61
65
|
"./package.json": "./package.json"
|
|
62
66
|
}
|
|
63
67
|
},
|
|
64
|
-
"version": "0.9.
|
|
68
|
+
"version": "0.9.54",
|
|
65
69
|
"types": "./lib/index.d.ts",
|
|
66
70
|
"dbxToolsConfig": {
|
|
67
71
|
"tags": [
|
|
@@ -90,6 +94,10 @@
|
|
|
90
94
|
"types": "./lib/src/profile.d.ts",
|
|
91
95
|
"default": "./lib/src/profile.js"
|
|
92
96
|
},
|
|
97
|
+
"./runtime-auth": {
|
|
98
|
+
"types": "./lib/src/runtime-auth.d.ts",
|
|
99
|
+
"default": "./lib/src/runtime-auth.js"
|
|
100
|
+
},
|
|
93
101
|
"./package.json": "./package.json"
|
|
94
102
|
},
|
|
95
103
|
"files": [
|
package/src/_profile-config.ts
CHANGED
|
@@ -106,14 +106,29 @@ export function parseDatabricksConfig(source: string): IniConfig {
|
|
|
106
106
|
if (!name.trim() || !object.isRecord(value)) {
|
|
107
107
|
throw new AuthError("config", "Databricks configuration values must belong to a profile");
|
|
108
108
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
_appendConfigSections(config, [name.trim()], value);
|
|
110
|
+
}
|
|
111
|
+
return config;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function _appendConfigSections(
|
|
115
|
+
config: IniConfig,
|
|
116
|
+
path: readonly string[],
|
|
117
|
+
value: Record<string, unknown>,
|
|
118
|
+
): void {
|
|
119
|
+
const section = new Map<string, string>();
|
|
120
|
+
let nested = false;
|
|
121
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
122
|
+
if (object.isRecord(entry)) {
|
|
123
|
+
nested = true;
|
|
124
|
+
_appendConfigSections(config, [...path, key], entry);
|
|
125
|
+
} else if (entry !== undefined && entry !== null) {
|
|
112
126
|
section.set(key.trim().toLowerCase(), String(entry).trim());
|
|
113
127
|
}
|
|
114
|
-
config.set(name.trim(), section);
|
|
115
128
|
}
|
|
116
|
-
|
|
129
|
+
if (section.size || !nested) {
|
|
130
|
+
config.set(path.join("."), section);
|
|
131
|
+
}
|
|
117
132
|
}
|
|
118
133
|
|
|
119
134
|
export function loadRawProfile(config: IniConfig | undefined, name: string): RawProfile {
|
package/src/client.ts
CHANGED
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
DEFAULT_ACCESS_TOKEN_HEADER,
|
|
16
16
|
WORKSPACE_ID_HEADER,
|
|
17
17
|
} from "./config.ts";
|
|
18
|
+
import { _databricksRuntimeAuthClient, createDatabricksRuntimeAuthClient } from "./runtime-auth.ts";
|
|
18
19
|
|
|
19
20
|
const logger = authLogger("databricks");
|
|
20
21
|
|
|
@@ -126,6 +127,16 @@ export async function createAuthClient(
|
|
|
126
127
|
options: DatabricksAuthOptions = {},
|
|
127
128
|
dependencies: DatabricksAuthDependencies = {},
|
|
128
129
|
): Promise<AuthClient> {
|
|
130
|
+
if (usesDefaultCredentialSource(options)) {
|
|
131
|
+
const runtime = await _databricksRuntimeAuthClient();
|
|
132
|
+
if (runtime) {
|
|
133
|
+
logger.debug("selected Databricks Python runtime authentication", {
|
|
134
|
+
host: runtime.host,
|
|
135
|
+
hasWorkspaceId: Boolean(runtime.workspaceId),
|
|
136
|
+
});
|
|
137
|
+
return createDatabricksRuntimeAuthClient(runtime, options);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
129
140
|
return createResolvedAuth(options, dependencies);
|
|
130
141
|
}
|
|
131
142
|
|
|
@@ -289,3 +300,7 @@ function cliEnvironment(profile: DatabricksProfile, configFile: string): Record<
|
|
|
289
300
|
function stringValue(value: unknown): string | undefined {
|
|
290
301
|
return typeof value === "string" && value.trim() ? value : undefined;
|
|
291
302
|
}
|
|
303
|
+
|
|
304
|
+
function usesDefaultCredentialSource(options: DatabricksAuthOptions): boolean {
|
|
305
|
+
return Object.values(options).every((value) => value === undefined);
|
|
306
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { RUNTIME_AUTH_TYPE } from "@dbx-tools/shared-auth/client";
|
|
2
|
+
import { TargetKind } from "@dbx-tools/shared-auth/config";
|
|
3
|
+
import { getAccessTokenPayload, getAccessTokenScopes } from "@dbx-tools/shared-core/token";
|
|
4
|
+
|
|
5
|
+
import { AuthError } from "./_errors.ts";
|
|
6
|
+
import { TokenLifecycle } from "./_lifecycle.ts";
|
|
7
|
+
import { normalizeHost } from "./_profile-config.ts";
|
|
8
|
+
import { MemoryCredentialStore } from "./_storage.ts";
|
|
9
|
+
import type { Token, TokenProvider } from "./_types.ts";
|
|
10
|
+
import type { AccessToken, AuthClient, TokenOptions } from "./client.ts";
|
|
11
|
+
import {
|
|
12
|
+
AUTH_DEFAULTS,
|
|
13
|
+
type DatabricksAuthOptions,
|
|
14
|
+
DEFAULT_ACCESS_TOKEN_HEADER,
|
|
15
|
+
WORKSPACE_ID_HEADER,
|
|
16
|
+
} from "./config.ts";
|
|
17
|
+
|
|
18
|
+
const MINIMUM_RUNTIME_TOKEN_TTL_MS = 60_000;
|
|
19
|
+
const RUNTIME_PRINCIPAL = "runtime";
|
|
20
|
+
|
|
21
|
+
/** Python runtime authentication operations backed by one SDK WorkspaceClient. */
|
|
22
|
+
export interface DatabricksRuntimeAuthClient {
|
|
23
|
+
/** Resolved Databricks workspace URL. */
|
|
24
|
+
readonly host: string;
|
|
25
|
+
/** Resolved workspace identifier when the Python SDK provides one. */
|
|
26
|
+
readonly workspaceId?: string;
|
|
27
|
+
/** Resolved caller identifier when the Python SDK provides one. */
|
|
28
|
+
readonly principal?: string;
|
|
29
|
+
/** Return the Python SDK's directly configured token, when present. */
|
|
30
|
+
token(): Promise<string | undefined>;
|
|
31
|
+
/** Return fresh authentication headers from the Python SDK. */
|
|
32
|
+
authenticate(): Promise<Record<string, string>>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface PythonNodeRuntime {
|
|
36
|
+
databricksRuntimeAuthClient?(): Promise<DatabricksRuntimeAuthClient | undefined>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Return auth installed by the shared Python Node runtime, when available.
|
|
41
|
+
*/
|
|
42
|
+
export async function _databricksRuntimeAuthClient(): Promise<
|
|
43
|
+
DatabricksRuntimeAuthClient | undefined
|
|
44
|
+
> {
|
|
45
|
+
const runtime = (
|
|
46
|
+
globalThis as typeof globalThis & {
|
|
47
|
+
[key: symbol]: PythonNodeRuntime | undefined;
|
|
48
|
+
}
|
|
49
|
+
)[Symbol.for("@dbx-tools/node-runtime/runtime")];
|
|
50
|
+
return runtime?.databricksRuntimeAuthClient?.();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Create an auth facade over a Python runtime WorkspaceClient. */
|
|
54
|
+
export function createDatabricksRuntimeAuthClient(
|
|
55
|
+
runtime: DatabricksRuntimeAuthClient,
|
|
56
|
+
options: DatabricksAuthOptions,
|
|
57
|
+
): AuthClient {
|
|
58
|
+
const lifecycleOptions = {
|
|
59
|
+
...AUTH_DEFAULTS,
|
|
60
|
+
...options.auth,
|
|
61
|
+
};
|
|
62
|
+
const provider = new DatabricksRuntimeTokenProvider(runtime, lifecycleOptions.refreshBufferMs);
|
|
63
|
+
const lifecycle = new TokenLifecycle(
|
|
64
|
+
runtimeCacheKey(runtime),
|
|
65
|
+
provider,
|
|
66
|
+
new MemoryCredentialStore(),
|
|
67
|
+
lifecycleOptions,
|
|
68
|
+
);
|
|
69
|
+
return new DefaultDatabricksRuntimeAuthClient(runtime, provider, lifecycle);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function runtimeCacheKey(runtime: DatabricksRuntimeAuthClient): string {
|
|
73
|
+
return [
|
|
74
|
+
RUNTIME_AUTH_TYPE,
|
|
75
|
+
normalizeHost(runtime.host, RUNTIME_PRINCIPAL),
|
|
76
|
+
runtime.workspaceId ?? "",
|
|
77
|
+
runtime.principal ?? "",
|
|
78
|
+
].join(":");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function normalizedHeaders(headers: Readonly<Record<string, string>>): Record<string, string> {
|
|
82
|
+
return Object.fromEntries(
|
|
83
|
+
Object.entries(headers).map(([name, value]) => [name.toLowerCase(), value]),
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function runtimeToken(
|
|
88
|
+
headers: Readonly<Record<string, string>>,
|
|
89
|
+
refreshBufferMs: number,
|
|
90
|
+
configuredToken?: string,
|
|
91
|
+
): Token {
|
|
92
|
+
const authorization = headers[DEFAULT_ACCESS_TOKEN_HEADER];
|
|
93
|
+
const match = authorization?.trim().match(/^(\S+)\s+(.+)$/);
|
|
94
|
+
const accessToken = match?.[2]?.trim() || configuredToken?.trim();
|
|
95
|
+
if (!accessToken) {
|
|
96
|
+
throw new AuthError(
|
|
97
|
+
"oauth",
|
|
98
|
+
"Databricks Python runtime authentication did not provide an access token",
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
const payload = getAccessTokenPayload(accessToken);
|
|
102
|
+
const jwtExpiry =
|
|
103
|
+
typeof payload.exp === "number" && Number.isFinite(payload.exp)
|
|
104
|
+
? new Date(payload.exp * 1000).toISOString()
|
|
105
|
+
: undefined;
|
|
106
|
+
// Opaque runtime credentials still need a bounded Node cache. Reacquire them
|
|
107
|
+
// from the Python SDK after one refresh-buffer interval.
|
|
108
|
+
const expiry =
|
|
109
|
+
jwtExpiry ??
|
|
110
|
+
new Date(
|
|
111
|
+
Date.now() + Math.max(refreshBufferMs * 2, MINIMUM_RUNTIME_TOKEN_TTL_MS),
|
|
112
|
+
).toISOString();
|
|
113
|
+
return {
|
|
114
|
+
accessToken,
|
|
115
|
+
tokenType: match?.[1] || "Bearer",
|
|
116
|
+
...(expiry ? { expiry } : {}),
|
|
117
|
+
scopes: [...getAccessTokenScopes(accessToken)],
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
class DatabricksRuntimeTokenProvider implements TokenProvider {
|
|
122
|
+
#accessToken?: string;
|
|
123
|
+
#headers?: Record<string, string>;
|
|
124
|
+
|
|
125
|
+
constructor(
|
|
126
|
+
private readonly runtime: DatabricksRuntimeAuthClient,
|
|
127
|
+
private readonly refreshBufferMs: number,
|
|
128
|
+
) {}
|
|
129
|
+
|
|
130
|
+
authenticate(): Promise<Token> {
|
|
131
|
+
return this.acquire();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
login(): Promise<Token> {
|
|
135
|
+
return this.acquire();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
refresh(): Promise<Token> {
|
|
139
|
+
return this.acquire();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
canAuthenticateSilently(): boolean {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
headers(token: AccessToken): Record<string, string> {
|
|
147
|
+
if (this.#accessToken === token.accessToken && this.#headers) {
|
|
148
|
+
return { ...this.#headers };
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
[DEFAULT_ACCESS_TOKEN_HEADER]: `${token.tokenType} ${token.accessToken}`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
clear(): void {
|
|
156
|
+
this.#accessToken = undefined;
|
|
157
|
+
this.#headers = undefined;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private async acquire(): Promise<Token> {
|
|
161
|
+
const headers = normalizedHeaders(await this.runtime.authenticate());
|
|
162
|
+
const token = runtimeToken(headers, this.refreshBufferMs, await this.runtime.token());
|
|
163
|
+
this.#accessToken = token.accessToken;
|
|
164
|
+
this.#headers = {
|
|
165
|
+
...headers,
|
|
166
|
+
[DEFAULT_ACCESS_TOKEN_HEADER]: `${token.tokenType} ${token.accessToken}`,
|
|
167
|
+
};
|
|
168
|
+
return token;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
class DefaultDatabricksRuntimeAuthClient implements AuthClient {
|
|
173
|
+
readonly profile = undefined;
|
|
174
|
+
readonly host: string;
|
|
175
|
+
readonly accountId = undefined;
|
|
176
|
+
readonly workspaceId?: string;
|
|
177
|
+
readonly target = TargetKind.Workspace;
|
|
178
|
+
readonly authType = RUNTIME_AUTH_TYPE;
|
|
179
|
+
readonly principal: string;
|
|
180
|
+
|
|
181
|
+
constructor(
|
|
182
|
+
runtime: DatabricksRuntimeAuthClient,
|
|
183
|
+
private readonly provider: DatabricksRuntimeTokenProvider,
|
|
184
|
+
private readonly lifecycle: TokenLifecycle,
|
|
185
|
+
) {
|
|
186
|
+
this.host = normalizeHost(runtime.host, RUNTIME_PRINCIPAL);
|
|
187
|
+
this.workspaceId = runtime.workspaceId;
|
|
188
|
+
this.principal = runtime.principal || RUNTIME_PRINCIPAL;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
token(options: TokenOptions = {}): Promise<AccessToken> {
|
|
192
|
+
return options.refresh
|
|
193
|
+
? this.lifecycle.forceRefresh(options.login ?? true)
|
|
194
|
+
: this.lifecycle.tokenWithLogin(options.login);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async headers(options: TokenOptions = {}): Promise<Record<string, string>> {
|
|
198
|
+
const headers = this.provider.headers(await this.token(options));
|
|
199
|
+
if (this.workspaceId && headers[WORKSPACE_ID_HEADER] === undefined) {
|
|
200
|
+
headers[WORKSPACE_ID_HEADER] = this.workspaceId;
|
|
201
|
+
}
|
|
202
|
+
return headers;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async logout(): Promise<void> {
|
|
206
|
+
await this.lifecycle.logout();
|
|
207
|
+
this.provider.clear();
|
|
208
|
+
}
|
|
209
|
+
}
|