@dbx-tools/databricks 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -63,13 +63,13 @@ recursion, encoding, error mapping) is shared with `LocalFileSystem` /
63
63
  ## Resolve Workspace Identity
64
64
 
65
65
  ```ts
66
- import { workspace } from "@dbx-tools/databricks";
66
+ import { workspaceClient } from "@dbx-tools/databricks";
67
67
 
68
- const url = await workspace.getWorkspaceUrl();
69
- const id = await workspace.getWorkspaceId();
68
+ const url = await workspaceClient.getWorkspaceUrl();
69
+ const id = await workspaceClient.getWorkspaceId();
70
70
  ```
71
71
 
72
- `workspace.getWorkspaceUrl()` checks the active AppKit execution context when
72
+ `workspaceClient.getWorkspaceUrl()` checks the active AppKit execution context when
73
73
  present, then a default Databricks SDK client, then environment/config. Use it in
74
74
  libraries that should work inside an AppKit request and from a standalone
75
75
  script.
package/index.ts CHANGED
@@ -3,12 +3,12 @@
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/databricks";
6
- export const PACKAGE_VERSION = "0.9.5";
6
+ export const PACKAGE_VERSION = "0.9.7";
7
7
  export * as cloud from "./src/cloud.ts";
8
8
  export * as databricksFS from "./src/databricks-fs.ts";
9
9
  export * as databricksPath from "./src/databricks-path.ts";
10
10
  export * as net from "./src/net.ts";
11
- export * as workspace from "./src/workspace.ts";
11
+ export * as workspaceClient from "./src/workspace-client.ts";
12
12
  export { RANGE_CACHE_TTL_MS, CloudProvider } from "./src/cloud.ts";
13
13
  export type { CloudLocation } from "./src/cloud.ts";
14
14
  export { DatabricksFileSystem } from "./src/databricks-fs.ts";
@@ -16,4 +16,4 @@ export type { DatabricksFileSystemOptions } from "./src/databricks-fs.ts";
16
16
  export { isHomeRelativePath } from "./src/databricks-path.ts";
17
17
  export type { DatabricksFilesBackend, NormalizeDatabricksRootOptions, ResolveDatabricksRootOptions } from "./src/databricks-path.ts";
18
18
  export { getPublicIp } from "./src/net.ts";
19
- export type { WorkspaceClient } from "./src/workspace.ts";
19
+ export type { WorkspaceClient } from "./src/workspace-client.ts";
package/lib/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/databricks";
2
- export declare const PACKAGE_VERSION = "0.9.5";
2
+ export declare const PACKAGE_VERSION = "0.9.7";
3
3
  export * as cloud from "./src/cloud.ts";
4
4
  export * as databricksFS from "./src/databricks-fs.ts";
5
5
  export * as databricksPath from "./src/databricks-path.ts";
6
6
  export * as net from "./src/net.ts";
7
- export * as workspace from "./src/workspace.ts";
7
+ export * as workspaceClient from "./src/workspace-client.ts";
8
8
  export { RANGE_CACHE_TTL_MS, CloudProvider } from "./src/cloud.ts";
9
9
  export type { CloudLocation } from "./src/cloud.ts";
10
10
  export { DatabricksFileSystem } from "./src/databricks-fs.ts";
@@ -12,4 +12,4 @@ export type { DatabricksFileSystemOptions } from "./src/databricks-fs.ts";
12
12
  export { isHomeRelativePath } from "./src/databricks-path.ts";
13
13
  export type { DatabricksFilesBackend, NormalizeDatabricksRootOptions, ResolveDatabricksRootOptions } from "./src/databricks-path.ts";
14
14
  export { getPublicIp } from "./src/net.ts";
15
- export type { WorkspaceClient } from "./src/workspace.ts";
15
+ export type { WorkspaceClient } from "./src/workspace-client.ts";
package/lib/index.js CHANGED
@@ -2,14 +2,14 @@
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/databricks";
5
- export const PACKAGE_VERSION = "0.9.5";
5
+ export const PACKAGE_VERSION = "0.9.7";
6
6
  export * as cloud from "./src/cloud.js";
7
7
  export * as databricksFS from "./src/databricks-fs.js";
8
8
  export * as databricksPath from "./src/databricks-path.js";
9
9
  export * as net from "./src/net.js";
10
- export * as workspace from "./src/workspace.js";
10
+ export * as workspaceClient from "./src/workspace-client.js";
11
11
  export { RANGE_CACHE_TTL_MS, CloudProvider } from "./src/cloud.js";
12
12
  export { DatabricksFileSystem } from "./src/databricks-fs.js";
13
13
  export { isHomeRelativePath } from "./src/databricks-path.js";
14
14
  export { getPublicIp } from "./src/net.js";
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS41XCI7XG5leHBvcnQgKiBhcyBjbG91ZCBmcm9tIFwiLi9zcmMvY2xvdWQudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3NGUyBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1mcy50c1wiO1xuZXhwb3J0ICogYXMgZGF0YWJyaWNrc1BhdGggZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtcGF0aC50c1wiO1xuZXhwb3J0ICogYXMgbmV0IGZyb20gXCIuL3NyYy9uZXQudHNcIjtcbmV4cG9ydCAqIGFzIHdvcmtzcGFjZSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlLnRzXCI7XG5leHBvcnQgeyBSQU5HRV9DQUNIRV9UVExfTVMsIENsb3VkUHJvdmlkZXIgfSBmcm9tIFwiLi9zcmMvY2xvdWQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2xvdWRMb2NhdGlvbiB9IGZyb20gXCIuL3NyYy9jbG91ZC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0gfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1mcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1mcy50c1wiO1xuZXhwb3J0IHsgaXNIb21lUmVsYXRpdmVQYXRoIH0gZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtcGF0aC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzRmlsZXNCYWNrZW5kLCBOb3JtYWxpemVEYXRhYnJpY2tzUm9vdE9wdGlvbnMsIFJlc29sdmVEYXRhYnJpY2tzUm9vdE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1wYXRoLnRzXCI7XG5leHBvcnQgeyBnZXRQdWJsaWNJcCB9IGZyb20gXCIuL3NyYy9uZXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS50c1wiO1xuIl19
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS43XCI7XG5leHBvcnQgKiBhcyBjbG91ZCBmcm9tIFwiLi9zcmMvY2xvdWQudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3NGUyBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1mcy50c1wiO1xuZXhwb3J0ICogYXMgZGF0YWJyaWNrc1BhdGggZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtcGF0aC50c1wiO1xuZXhwb3J0ICogYXMgbmV0IGZyb20gXCIuL3NyYy9uZXQudHNcIjtcbmV4cG9ydCAqIGFzIHdvcmtzcGFjZUNsaWVudCBmcm9tIFwiLi9zcmMvd29ya3NwYWNlLWNsaWVudC50c1wiO1xuZXhwb3J0IHsgUkFOR0VfQ0FDSEVfVFRMX01TLCBDbG91ZFByb3ZpZGVyIH0gZnJvbSBcIi4vc3JjL2Nsb3VkLnRzXCI7XG5leHBvcnQgdHlwZSB7IENsb3VkTG9jYXRpb24gfSBmcm9tIFwiLi9zcmMvY2xvdWQudHNcIjtcbmV4cG9ydCB7IERhdGFicmlja3NGaWxlU3lzdGVtIH0gZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtZnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW1PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtZnMudHNcIjtcbmV4cG9ydCB7IGlzSG9tZVJlbGF0aXZlUGF0aCB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCwgTm9ybWFsaXplRGF0YWJyaWNrc1Jvb3RPcHRpb25zLCBSZXNvbHZlRGF0YWJyaWNrc1Jvb3RPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtcGF0aC50c1wiO1xuZXhwb3J0IHsgZ2V0UHVibGljSXAgfSBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCIuL3NyYy93b3Jrc3BhY2UtY2xpZW50LnRzXCI7XG4iXX0=
package/lib/src/cloud.js CHANGED
@@ -22,7 +22,7 @@ import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
22
22
  import { tmpdir } from "node:os";
23
23
  import { dirname, join } from "node:path";
24
24
  import { file } from "@dbx-tools/core";
25
- import { error, functionModule, hash, http, json, log, net } from "@dbx-tools/shared-core";
25
+ import { errorUtils, functionUtils, hash, http, json, log, net } from "@dbx-tools/shared-core";
26
26
  import { resolveHostIps } from "./net.js";
27
27
  const logger = log.logger("cloud");
28
28
  /** How long a fetched provider IP-range feed is reused before refetch. */
@@ -98,19 +98,21 @@ export async function loadProviderRanges() {
98
98
  const settled = await Promise.allSettled([loadAwsRanges(), loadAzureRanges(), loadGcpRanges()]);
99
99
  const out = [];
100
100
  for (const result of settled) {
101
- if (result.status === "fulfilled")
101
+ if (result.status === "fulfilled") {
102
102
  out.push(result.value);
103
- else
104
- logger.warn("provider range load failed", { error: error.errorMessage(result.reason) });
103
+ }
104
+ else {
105
+ logger.warn("provider range load failed", { error: errorUtils.errorMessage(result.reason) });
106
+ }
105
107
  }
106
108
  return out;
107
109
  }
108
110
  // ────────────────────────────────────────────────────────────────
109
111
  // Per-provider cached loaders
110
112
  // ────────────────────────────────────────────────────────────────
111
- const loadAwsRanges = functionModule.memoize(fetchAwsRanges, { ttlMs: RANGE_CACHE_TTL_MS });
112
- const loadAzureRanges = functionModule.memoize(fetchAzureRanges, { ttlMs: RANGE_CACHE_TTL_MS });
113
- const loadGcpRanges = functionModule.memoize(fetchGcpRanges, { ttlMs: RANGE_CACHE_TTL_MS });
113
+ const loadAwsRanges = functionUtils.memoize(fetchAwsRanges, { ttlMs: RANGE_CACHE_TTL_MS });
114
+ const loadAzureRanges = functionUtils.memoize(fetchAzureRanges, { ttlMs: RANGE_CACHE_TTL_MS });
115
+ const loadGcpRanges = functionUtils.memoize(fetchGcpRanges, { ttlMs: RANGE_CACHE_TTL_MS });
114
116
  /**
115
117
  * AWS `ip-ranges.json`: a flat list of IPv4 (`prefixes`) and IPv6
116
118
  * (`ipv6_prefixes`) blocks, each already tagged with a `region` such
@@ -237,4 +239,4 @@ async function fetchText(url) {
237
239
  async function getCreated(path) {
238
240
  return (await file.statSync(path))?.birthtime;
239
241
  }
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xvdWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFbkMsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV0RCxrRUFBa0U7QUFDbEUsTUFBTSxjQUFjLEdBQUcsZ0RBQWdELENBQUM7QUFDeEUsa0VBQWtFO0FBQ2xFLE1BQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBQ3JFOzs7O0dBSUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLGdFQUFnRSxDQUFDO0FBQzdGLDhGQUE4RjtBQUM5RixNQUFNLGVBQWUsR0FDbkIsa0ZBQWtGLENBQUM7QUFFckYsOENBQThDO0FBQzlDLE1BQU0sQ0FBTixJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsNEJBQVcsQ0FBQTtJQUNYLGdD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QVEsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSxLQUFLLFVBQVUsVUFBVSxDQUFDLElBQVk7SUFDcEMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZXN0LWVmZm9ydCBnZW9sb2NhdGlvbiBvZiBhIGhvc3QgdG8gdGhlIGNsb3VkIHByb3ZpZGVyIGFuZCByZWdpb24gaXRcbiAqIHJ1bnMgaW4uIFJlc29sdmVzIHRoZSBob3N0IHRvIGl0cyBJUCBhZGRyZXNzKGVzKSB2aWEgRE5TLCB0aGVuIG1hdGNoZXNcbiAqIHRob3NlIGFkZHJlc3NlcyBhZ2FpbnN0IHRoZSBwdWJsaWMgSVAtcmFuZ2UgZmVlZHMgZWFjaCBoeXBlcnNjYWxlclxuICogcHVibGlzaGVzIChBV1MsIEF6dXJlLCBHQ1ApLiBIYW5keSBmb3IgcGxhY2luZyBhIERhdGFicmlja3Mgd29ya3NwYWNlXG4gKiBVUkwsIGJ1dCB3b3JrcyBmb3IgYW55IGhvc3QuXG4gKlxuICogVGhlIHJhbmdlIGZlZWRzIGFyZSBsYXJnZSBhbmQgY2hhbmdlIHNsb3dseSwgc28gZWFjaCBwcm92aWRlcidzIGZlZWRcbiAqIGlzIGNhY2hlZCBmb3Ige0BsaW5rIFJBTkdFX0NBQ0hFX1RUTF9NU30gKDI0IGhvdXJzKSBhdCB0d28gbGF5ZXJzOiBhblxuICogb24tZGlzayBjb3B5IHVuZGVyIHRoZSBPUyB0ZW1wIGRpciAoc3Vydml2ZXMgcHJvY2VzcyByZXN0YXJ0cywgc2hhcmVkXG4gKiBhY3Jvc3MgcHJvY2Vzc2VzKSBwbHVzIGFuIGluLXByb2Nlc3MgbWVtb2l6ZWQgcGFyc2UuIEEgcHJvdmlkZXIgd2hvc2VcbiAqIGZlZWQgZmFpbHMgdG8gbG9hZCBpcyBza2lwcGVkIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHdob2xlIGxvb2t1cCAtXG4gKiB0aGUgb3RoZXIgcHJvdmlkZXJzIHN0aWxsIGFuc3dlci5cbiAqXG4gKiBTZXJ2ZXItb25seTogRE5TIHJlc29sdXRpb24gbmVlZHMgYG5vZGU6ZG5zYCAodmlhIGAuL25ldC50c2ApLCB0aGVcbiAqIGRpc2sgY2FjaGUgbmVlZHMgYG5vZGU6ZnNgIC8gYG5vZGU6b3NgIC8gYG5vZGU6cGF0aGAsIGFuZCB0aGUgZmVlZHNcbiAqIGFyZSBmZXRjaGVkIHdpdGggdGhlIGdsb2JhbCBgZmV0Y2hgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHJlbmFtZSwgdW5saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGZpbGUgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBlcnJvciwgZnVuY3Rpb25Nb2R1bGUsIGhhc2gsIGh0dHAsIGpzb24sIGxvZywgbmV0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHJlc29sdmVIb3N0SXBzIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjbG91ZFwiKTtcblxuLyoqIEhvdyBsb25nIGEgZmV0Y2hlZCBwcm92aWRlciBJUC1yYW5nZSBmZWVkIGlzIHJldXNlZCBiZWZvcmUgcmVmZXRjaC4gKi9cbmV4cG9ydCBjb25zdCBSQU5HRV9DQUNIRV9UVExfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiogQVdTIHB1Ymxpc2hlcyBhIHNpbmdsZSBzdGFibGUsIHVuYXV0aGVudGljYXRlZCByYW5nZXMgZmVlZC4gKi9cbmNvbnN0IEFXU19SQU5HRVNfVVJMID0gXCJodHRwczovL2lwLXJhbmdlcy5hbWF6b25hd3MuY29tL2lwLXJhbmdlcy5qc29uXCI7XG4vKiogR0NQIHB1Ymxpc2hlcyBhIHNpbmdsZSBzdGFibGUsIHVuYXV0aGVudGljYXRlZCByYW5nZXMgZmVlZC4gKi9cbmNvbnN0IEdDUF9SQU5HRVNfVVJMID0gXCJodHRwczovL3d3dy5nc3RhdGljLmNvbS9pcHJhbmdlcy9jbG91ZC5qc29uXCI7XG4vKipcbiAqIEF6dXJlIGhhcyBubyBzdGFibGUgZmVlZCBVUkwgLSB0aGUgSlNPTiBkb3dubG9hZCBsaW5rICh3aXRoIGFcbiAqIHJvdGF0aW5nIGRhdGUgc3RhbXApIGxpdmVzIG9uIHRoaXMgaHVtYW4tZmFjaW5nIGRvd25sb2FkIHBhZ2UgYW5kXG4gKiBtdXN0IGJlIHNjcmFwZWQgb3V0LiBTZWUge0BsaW5rIGZldGNoQXp1cmVSYW5nZXN9LlxuICovXG5jb25zdCBBWlVSRV9ET1dOTE9BRF9QQUdFID0gXCJodHRwczovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD01NjUxOVwiO1xuLyoqIFJlZ2V4IHRoYXQgcGx1Y2tzIHRoZSBjdXJyZW50IGBTZXJ2aWNlVGFnc19QdWJsaWNfPGRhdGU+Lmpzb25gIGxpbmsgb2ZmIHRoZSBBenVyZSBwYWdlLiAqL1xuY29uc3QgQVpVUkVfSlNPTl9MSU5LID1cbiAgL2h0dHBzOlxcL1xcL2Rvd25sb2FkXFwubWljcm9zb2Z0XFwuY29tXFwvZG93bmxvYWRcXC9bXlwiJ10qU2VydmljZVRhZ3NfUHVibGljX1xcZCtcXC5qc29uLztcblxuLyoqIENsb3VkIGh5cGVyc2NhbGVyIGEgaG9zdCByZXNvbHZlcyBpbnRvLiAqL1xuZXhwb3J0IGVudW0gQ2xvdWRQcm92aWRlciB7XG4gIEF3cyA9IFwiYXdzXCIsXG4gIEF6dXJlID0gXCJhenVyZVwiLFxuICBHY3AgPSBcImdjcFwiLFxufVxuXG4vKipcbiAqIFdoZXJlIGEgaG9zdCBsaXZlczogdGhlIHtAbGluayBDbG91ZFByb3ZpZGVyfSwgdGhlIHByb3ZpZGVyLW5hdGl2ZVxuICogYHJlZ2lvbmAgc3RyaW5nICh3aGF0ZXZlciB0aGUgcHJvdmlkZXIncyBmZWVkIGNhbGxzIGl0LCBlLmcuXG4gKiBgXCJ1cy1lYXN0LTFcImAgb24gQVdTLCBgXCJlYXN0dXMyXCJgIG9uIEF6dXJlLCBgXCJ1cy1lYXN0MVwiYCBvbiBHQ1ApLCB0aGVcbiAqIHJlc29sdmVkIGBpcGAgdGhhdCBtYXRjaGVkLCBhbmQgdGhlIGBjaWRyYCBibG9jayBpdCBmZWxsIGluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkTG9jYXRpb24ge1xuICBwcm92aWRlcjogQ2xvdWRQcm92aWRlcjtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGlwOiBzdHJpbmc7XG4gIGNpZHI6IHN0cmluZztcbn1cblxuLyoqIEEgcGFyc2VkIENJRFIgYmxvY2sgdGFnZ2VkIHdpdGggdGhlIHJlZ2lvbiBpdCBiZWxvbmdzIHRvLiAqL1xuaW50ZXJmYWNlIFJlZ2lvbkNpZHIgZXh0ZW5kcyBuZXQuQ2lkciB7XG4gIHJlZ2lvbjogc3RyaW5nO1xufVxuXG4vKiogT25lIHByb3ZpZGVyJ3MgcGFyc2VkLCByZWdpb24tdGFnZ2VkIHJhbmdlIHRhYmxlLiAqL1xuaW50ZXJmYWNlIFByb3ZpZGVyUmFuZ2VzIHtcbiAgcHJvdmlkZXI6IENsb3VkUHJvdmlkZXI7XG4gIHJhbmdlczogUmVnaW9uQ2lkcltdO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYGlucHV0YCdzIGhvc3QgdG8gYSB7QGxpbmsgQ2xvdWRMb2NhdGlvbn0sIG9yIGBudWxsYCB3aGVuIHRoZVxuICogaG9zdCBjYW4ndCBiZSByZXNvbHZlZCBvciBub25lIG9mIGl0cyBJUHMgbWF0Y2ggYSBrbm93biBjbG91ZCByYW5nZS5cbiAqIGBpbnB1dGAgaXMgYW55IHtAbGluayBuZXQuVXJsTGlrZX0gLSBhIFVSTCwgYSBiYXJlIGhvc3QsIG9yIGEgYHsgdXJsIH1gXG4gKiB3cmFwcGVyLlxuICpcbiAqIFRoZSBwcm92aWRlciByYW5nZSBmZWVkcyBhcmUgY2FjaGVkIGZvciB7QGxpbmsgUkFOR0VfQ0FDSEVfVFRMX01TfSwgc29cbiAqIG9ubHkgdGhlIGZpcnN0IGNhbGwgaW4gYSAyNC1ob3VyIHdpbmRvdyBwYXlzIHRoZSBmZXRjaCBjb3N0OyB0aGUgRE5TXG4gKiBsb29rdXAgaGFwcGVucyBvbiBldmVyeSBjYWxsLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCByZXNvbHZlQ2xvdWRMb2NhdGlvbihcImh0dHBzOi8vYWRiLTEyMzQ1Njc4OTAuNy5henVyZWRhdGFicmlja3MubmV0XCIpO1xuICogLy8geyBwcm92aWRlcjogQ2xvdWRQcm92aWRlci5BenVyZSxcbiAqIC8vICAgcmVnaW9uOiBcImVhc3R1czJcIiwgaXA6IFwiLi4uXCIsIGNpZHI6IFwiLi4uXCIgfVxuICpcbiAqIGF3YWl0IHJlc29sdmVDbG91ZExvY2F0aW9uKFwiZGJjLWFiYzEyMy5jbG91ZC5kYXRhYnJpY2tzLmNvbVwiKTtcbiAqIC8vIHsgcHJvdmlkZXI6IENsb3VkUHJvdmlkZXIuQXdzLFxuICogLy8gICByZWdpb246IFwidXMtd2VzdC0yXCIsIGlwOiBcIi4uLlwiLCBjaWRyOiBcIi4uLlwiIH1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDbG91ZExvY2F0aW9uKGlucHV0OiBuZXQuVXJsTGlrZSk6IFByb21pc2U8Q2xvdWRMb2NhdGlvbiB8IG51bGw+IHtcbiAgY29uc3QgaXBzID0gYXdhaXQgcmVzb2x2ZUhvc3RJcHMoaW5wdXQpO1xuICBpZiAoaXBzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIm5vIGlwcyByZXNvbHZlZFwiLCB7IGlucHV0OiBTdHJpbmcoaW5wdXQpIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHByb3ZpZGVycyA9IGF3YWl0IGxvYWRQcm92aWRlclJhbmdlcygpO1xuICBmb3IgKGNvbnN0IGlwIG9mIGlwcykge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldC5wYXJzZUlwKGlwKTtcbiAgICBpZiAoIXBhcnNlZCkgY29udGludWU7XG4gICAgZm9yIChjb25zdCB7IHByb3ZpZGVyLCByYW5nZXMgfSBvZiBwcm92aWRlcnMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gbmV0LmZpbmRDb250YWluaW5nQ2lkcihwYXJzZWQsIHJhbmdlcyk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHsgcHJvdmlkZXIsIHJlZ2lvbjogbWF0Y2gucmVnaW9uLCBpcCwgY2lkcjogbWF0Y2guY2lkciB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoXCJubyBjbG91ZCByYW5nZSBtYXRjaGVkXCIsIHsgaXBzIH0pO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBMb2FkIGV2ZXJ5IHByb3ZpZGVyJ3MgcmVnaW9uLXRhZ2dlZCByYW5nZSB0YWJsZSwgZWFjaCBjYWNoZWQgZm9yXG4gKiB7QGxpbmsgUkFOR0VfQ0FDSEVfVFRMX01TfS4gUHJvdmlkZXJzIGFyZSBsb2FkZWQgaW4gcGFyYWxsZWwgYW5kIGFcbiAqIGZlZWQgdGhhdCBmYWlscyB0byBmZXRjaCBvciBwYXJzZSBpcyBkcm9wcGVkIChsb2dnZWQsIG5vdCB0aHJvd24pIHNvXG4gKiBhIHNpbmdsZSBmbGFreSBmZWVkIG5ldmVyIHNpbmtzIHRoZSB3aG9sZSBsb29rdXAuIEV4cG9zZWQgZm9yIGNhbGxlcnNcbiAqIHRoYXQgd2FudCB0byBtYXRjaCBtYW55IElQcyBhZ2FpbnN0IG9uZSBjYWNoZWQgc25hcHNob3Qgd2l0aG91dCBhIEROU1xuICogc3RlcCBwZXIgYWRkcmVzcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQcm92aWRlclJhbmdlcygpOiBQcm9taXNlPFByb3ZpZGVyUmFuZ2VzW10+IHtcbiAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbbG9hZEF3c1JhbmdlcygpLCBsb2FkQXp1cmVSYW5nZXMoKSwgbG9hZEdjcFJhbmdlcygpXSk7XG4gIGNvbnN0IG91dDogUHJvdmlkZXJSYW5nZXNbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBzZXR0bGVkKSB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpIG91dC5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgZWxzZSBsb2dnZXIud2FybihcInByb3ZpZGVyIHJhbmdlIGxvYWQgZmFpbGVkXCIsIHsgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShyZXN1bHQucmVhc29uKSB9KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBlci1wcm92aWRlciBjYWNoZWQgbG9hZGVyc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IGxvYWRBd3NSYW5nZXMgPSBmdW5jdGlvbk1vZHVsZS5tZW1vaXplKGZldGNoQXdzUmFuZ2VzLCB7IHR0bE1zOiBSQU5HRV9DQUNIRV9UVExfTVMgfSk7XG5jb25zdCBsb2FkQXp1cmVSYW5nZXMgPSBmdW5jdGlvbk1vZHVsZS5tZW1vaXplKGZldGNoQXp1cmVSYW5nZXMsIHsgdHRsTXM6IFJBTkdFX0NBQ0hFX1RUTF9NUyB9KTtcbmNvbnN0IGxvYWRHY3BSYW5nZXMgPSBmdW5jdGlvbk1vZHVsZS5tZW1vaXplKGZldGNoR2NwUmFuZ2VzLCB7IHR0bE1zOiBSQU5HRV9DQUNIRV9UVExfTVMgfSk7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUHJvdmlkZXIgZmVlZCBmZXRjaCArIHBhcnNlXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEF3c0ZlZWQge1xuICBwcmVmaXhlcz86IHsgaXBfcHJlZml4Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfVtdO1xuICBpcHY2X3ByZWZpeGVzPzogeyBpcHY2X3ByZWZpeD86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nIH1bXTtcbn1cblxuLyoqXG4gKiBBV1MgYGlwLXJhbmdlcy5qc29uYDogYSBmbGF0IGxpc3Qgb2YgSVB2NCAoYHByZWZpeGVzYCkgYW5kIElQdjZcbiAqIChgaXB2Nl9wcmVmaXhlc2ApIGJsb2NrcywgZWFjaCBhbHJlYWR5IHRhZ2dlZCB3aXRoIGEgYHJlZ2lvbmAgc3VjaFxuICogYXMgYFwidXMtZWFzdC0xXCJgIChvciBgXCJHTE9CQUxcImAgZm9yIGVkZ2UgcmFuZ2VzKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBd3NSYW5nZXMoKTogUHJvbWlzZTxQcm92aWRlclJhbmdlcz4ge1xuICBjb25zdCBmZWVkID0gYXdhaXQgZmV0Y2hKc29uPEF3c0ZlZWQ+KEFXU19SQU5HRVNfVVJMKTtcbiAgY29uc3QgcmFuZ2VzOiBSZWdpb25DaWRyW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBmZWVkLnByZWZpeGVzID8/IFtdKSB7XG4gICAgYWRkUmFuZ2UocmFuZ2VzLCBlbnRyeS5pcF9wcmVmaXgsIGVudHJ5LnJlZ2lvbik7XG4gIH1cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBmZWVkLmlwdjZfcHJlZml4ZXMgPz8gW10pIHtcbiAgICBhZGRSYW5nZShyYW5nZXMsIGVudHJ5LmlwdjZfcHJlZml4LCBlbnRyeS5yZWdpb24pO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBhd3MgcmFuZ2VzXCIsIHsgY291bnQ6IHJhbmdlcy5sZW5ndGggfSk7XG4gIHJldHVybiB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkF3cywgcmFuZ2VzIH07XG59XG5cbmludGVyZmFjZSBHY3BGZWVkIHtcbiAgcHJlZml4ZXM/OiB7IGlwdjRQcmVmaXg/OiBzdHJpbmc7IGlwdjZQcmVmaXg/OiBzdHJpbmc7IHNjb3BlPzogc3RyaW5nIH1bXTtcbn1cblxuLyoqXG4gKiBHQ1AgYGNsb3VkLmpzb25gOiBhIGxpc3Qgb2YgYmxvY2tzIGVhY2ggY2FycnlpbmcgYW4gYGlwdjRQcmVmaXhgIG9yXG4gKiBgaXB2NlByZWZpeGAgYW5kIGEgYHNjb3BlYCB0aGF0IGlzIHRoZSByZWdpb24gKGBcInVzLWVhc3QxXCJgKSBvclxuICogYFwiZ2xvYmFsXCJgIGZvciBub24tcmVnaW9uYWwgcmFuZ2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaEdjcFJhbmdlcygpOiBQcm9taXNlPFByb3ZpZGVyUmFuZ2VzPiB7XG4gIGNvbnN0IGZlZWQgPSBhd2FpdCBmZXRjaEpzb248R2NwRmVlZD4oR0NQX1JBTkdFU19VUkwpO1xuICBjb25zdCByYW5nZXM6IFJlZ2lvbkNpZHJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZlZWQucHJlZml4ZXMgPz8gW10pIHtcbiAgICBhZGRSYW5nZShyYW5nZXMsIGVudHJ5LmlwdjRQcmVmaXggPz8gZW50cnkuaXB2NlByZWZpeCwgZW50cnkuc2NvcGUpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBnY3AgcmFuZ2VzXCIsIHsgY291bnQ6IHJhbmdlcy5sZW5ndGggfSk7XG4gIHJldHVybiB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkdjcCwgcmFuZ2VzIH07XG59XG5cbmludGVyZmFjZSBBenVyZUZlZWQge1xuICB2YWx1ZXM/OiB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBwcm9wZXJ0aWVzPzogeyByZWdpb24/OiBzdHJpbmc7IGFkZHJlc3NQcmVmaXhlcz86IHN0cmluZ1tdIH07XG4gIH1bXTtcbn1cblxuLyoqXG4gKiBBenVyZSBzZXJ2aWNlIHRhZ3M6IE1pY3Jvc29mdCBzaGlwcyBubyBzdGFibGUgZmVlZCBVUkwsIHNvIHNjcmFwZSB0aGVcbiAqIGN1cnJlbnQgYFNlcnZpY2VUYWdzX1B1YmxpY188ZGF0ZT4uanNvbmAgbGluayBvZmYgdGhlIGRvd25sb2FkIHBhZ2VcbiAqIGFuZCBmZXRjaCBpdC4gT25seSB0aGUgcmVnaW9uYWwgYEF6dXJlQ2xvdWQuPHJlZ2lvbj5gIGFnZ3JlZ2F0ZXNcbiAqICh3aGljaCBoYXZlIGEgbm9uLWVtcHR5IGByZWdpb25gKSBhcmUga2VwdDsgdGhlIGNsb3VkLXdpZGVcbiAqIGBBenVyZUNsb3VkYCB0YWcgYW5kIHBlci1zZXJ2aWNlIHRhZ3MgYXJlIGlnbm9yZWQgc28gYW4gYWRkcmVzcyBtYXBzXG4gKiBjbGVhbmx5IHRvIG9uZSByZWdpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQXp1cmVSYW5nZXMoKTogUHJvbWlzZTxQcm92aWRlclJhbmdlcz4ge1xuICBjb25zdCBwYWdlID0gYXdhaXQgZmV0Y2hUZXh0KEFaVVJFX0RPV05MT0FEX1BBR0UpO1xuICBjb25zdCBqc29uVXJsID0gcGFnZS5tYXRjaChBWlVSRV9KU09OX0xJTkspPy5bMF07XG4gIGlmICghanNvblVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBmaW5kIFNlcnZpY2VUYWdzIEpTT04gbGluayBvbiBBenVyZSBkb3dubG9hZCBwYWdlXCIpO1xuICB9XG4gIGNvbnN0IGZlZWQgPSBhd2FpdCBmZXRjaEpzb248QXp1cmVGZWVkPihqc29uVXJsKTtcbiAgY29uc3QgcmFuZ2VzOiBSZWdpb25DaWRyW10gPSBbXTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBmZWVkLnZhbHVlcyA/PyBbXSkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHZhbHVlLnByb3BlcnRpZXM/LnJlZ2lvbjtcbiAgICBpZiAoIXJlZ2lvbiB8fCAhdmFsdWUubmFtZT8uc3RhcnRzV2l0aChcIkF6dXJlQ2xvdWQuXCIpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiB2YWx1ZS5wcm9wZXJ0aWVzPy5hZGRyZXNzUHJlZml4ZXMgPz8gW10pIHtcbiAgICAgIGFkZFJhbmdlKHJhbmdlcywgcHJlZml4LCByZWdpb24pO1xuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgYXp1cmUgcmFuZ2VzXCIsIHsgY291bnQ6IHJhbmdlcy5sZW5ndGggfSk7XG4gIHJldHVybiB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkF6dXJlLCByYW5nZXMgfTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBIZWxwZXJzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFBhcnNlIGBjaWRyYCBhbmQsIHdoZW4gdmFsaWQgYW5kIGByZWdpb25gIGlzIHNldCwgcHVzaCBhIHRhZ2dlZCByYW5nZS4gKi9cbmZ1bmN0aW9uIGFkZFJhbmdlKHJhbmdlczogUmVnaW9uQ2lkcltdLCBjaWRyPzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFjaWRyIHx8ICFyZWdpb24pIHJldHVybjtcbiAgY29uc3QgcGFyc2VkID0gbmV0LnBhcnNlQ2lkcihjaWRyKTtcbiAgaWYgKHBhcnNlZCkgcmFuZ2VzLnB1c2goeyAuLi5wYXJzZWQsIHJlZ2lvbiB9KTtcbn1cblxuLyoqXG4gKiBGZXRjaCBhbmQgcGFyc2UgYSBwcm92aWRlciBmZWVkLiBBIHBhcnNlIGZhaWx1cmUgbmFtZXMgdGhlIFVSTCByYXRoZXIgdGhhblxuICogc3VyZmFjaW5nIGFuIG9wYXF1ZSBgVW5leHBlY3RlZCB0b2tlbmAgLSB0aGUgdGV4dCBtYXkgY29tZSBmcm9tIHRoZSBvbi1kaXNrXG4gKiBjYWNoZSwgc28gXCJ3aGljaCBmZWVkXCIgaXMgdGhlIHBhcnQgd29ydGgga25vd2luZy4ge0BsaW5rIGxvYWRQcm92aWRlclJhbmdlc31cbiAqIHR1cm5zIHRoZSB0aHJvdyBpbnRvIGEgcGVyLXByb3ZpZGVyIHdhcm5pbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoSnNvbjxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCB0ZXh0ID0gYXdhaXQgZmV0Y2hUZXh0KHVybCk7XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2U8VD4odGV4dCk7XG4gIGlmIChwYXJzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFuZ2UgZmVlZCByZXR1cm5lZCBub24tSlNPTiBjb250ZW50OiAke3VybH1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIEZldGNoIGB1cmxgIGFzIHRleHQgd2l0aCBhIDI0aCBvbi1kaXNrIGNhY2hlIHVuZGVyIHRoZSBPUyB0ZW1wIGRpclxuICogKGtleWVkIGJ5IGFuIEZOViBoYXNoIG9mIHRoZSBVUkwpLiBBIGZyZXNoIGNhY2hlIGZpbGUgaXMgcmV0dXJuZWRcbiAqIGRpcmVjdGx5OyBhIG1pc3MvZXhwaXJ5IGZldGNoZXMsIHdyaXRlcyB0byBhIHVuaXF1ZSB0ZW1wIGZpbGUsIGFuZFxuICogYXRvbWljYWxseSByZW5hbWVzIGl0IGludG8gcGxhY2Ugc28gY29uY3VycmVudCBjYWxsZXJzIG5ldmVyIG9ic2VydmVcbiAqIGEgaGFsZi13cml0dGVuIGNhY2hlIGVudHJ5LlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRleHQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjYWNoZURpciA9IGpvaW4odG1wZGlyKCksIFwiZGJ4LXRvb2xzXCIsIFwic2hhcmVkXCIsIFwiY2xvdWRcIik7XG4gIGNvbnN0IGNhY2hlRGlyQ3JlYXRlZCA9IGF3YWl0IG1rZGlyKGNhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY2FjaGVQYXRoID0gam9pbihjYWNoZURpciwgYGZldGNoLSR7aGFzaC5mbnZIYXNoKHVybCl9LnR4dGApO1xuICBjb25zdCBjcmVhdGVkQXQgPSBjYWNoZURpckNyZWF0ZWQgPyB1bmRlZmluZWQgOiBhd2FpdCBnZXRDcmVhdGVkKGNhY2hlUGF0aCk7XG4gIGlmIChjcmVhdGVkQXQpIHtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBuZXcgRGF0ZShjcmVhdGVkQXQuZ2V0VGltZSgpICsgUkFOR0VfQ0FDSEVfVFRMX01TKTtcbiAgICBpZiAoZXhwaXJlc0F0ID4gbmV3IERhdGUoKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiY2FjaGVkIGZldGNoIGhpdFwiLCB7IHVybCwgY2FjaGVQYXRoIH0pO1xuICAgICAgcmV0dXJuIHJlYWRGaWxlKGNhY2hlUGF0aCwgXCJ1dGY4XCIpO1xuICAgIH1cbiAgfVxuICBsZXQgdGVtcFBhdGg6IHN0cmluZyB8IG51bGwgPSBqb2luKGNhY2hlRGlyLCBgJHtoYXNoLmlkKCl9LnR4dGApO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBhd2FpdCBodHRwLmNyZWF0ZUZldGNoRXJyb3IocmVzcG9uc2UsIHVybCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKHRlbXBQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBQYXRoLCByZXNwb25zZVRleHQpO1xuXG4gICAgYXdhaXQgcmVuYW1lKHRlbXBQYXRoLCBjYWNoZVBhdGgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNhY2hlZCBmZXRjaCBsb2FkXCIsIHsgdXJsLCBjYWNoZVBhdGggfSk7XG4gICAgdGVtcFBhdGggPSBudWxsO1xuICAgIHJldHVybiByZXNwb25zZVRleHQ7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHRlbXBQYXRoKSB7XG4gICAgICBhd2FpdCB1bmxpbmsodGVtcFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQmlydGggdGltZSBvZiBgcGF0aGAsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgZG9lc24ndCBleGlzdCB5ZXQuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDcmVhdGVkKHBhdGg6IHN0cmluZyk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gKGF3YWl0IGZpbGUuc3RhdFN5bmMocGF0aCkpPy5iaXJ0aHRpbWU7XG59XG4iXX0=
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xvdWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFbkMsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV0RCxrRUFBa0U7QUFDbEUsTUFBTSxjQUFjLEdBQUcsZ0RBQWdELENBQUM7QUFDeEUsa0VBQWtFO0FBQ2xFLE1BQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBQ3JFOzs7O0dBSUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLGdFQUFnRSxDQUFDO0FBQzdGLDhGQUE4RjtBQUM5RixNQUFNLGVBQWUsR0FDbkIsa0ZBQWtGLENBQUM7QUFFckYsOENBQThDO0FBQzlDLE1BQU0sQ0FBTixJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsNEJBQVcsQ0FBQTtJQUNYLGdD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QUksUUFBUSxFQUFFLENBQUM7WUFDYixNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3BDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmVzdC1lZmZvcnQgZ2VvbG9jYXRpb24gb2YgYSBob3N0IHRvIHRoZSBjbG91ZCBwcm92aWRlciBhbmQgcmVnaW9uIGl0XG4gKiBydW5zIGluLiBSZXNvbHZlcyB0aGUgaG9zdCB0byBpdHMgSVAgYWRkcmVzcyhlcykgdmlhIEROUywgdGhlbiBtYXRjaGVzXG4gKiB0aG9zZSBhZGRyZXNzZXMgYWdhaW5zdCB0aGUgcHVibGljIElQLXJhbmdlIGZlZWRzIGVhY2ggaHlwZXJzY2FsZXJcbiAqIHB1Ymxpc2hlcyAoQVdTLCBBenVyZSwgR0NQKS4gSGFuZHkgZm9yIHBsYWNpbmcgYSBEYXRhYnJpY2tzIHdvcmtzcGFjZVxuICogVVJMLCBidXQgd29ya3MgZm9yIGFueSBob3N0LlxuICpcbiAqIFRoZSByYW5nZSBmZWVkcyBhcmUgbGFyZ2UgYW5kIGNoYW5nZSBzbG93bHksIHNvIGVhY2ggcHJvdmlkZXIncyBmZWVkXG4gKiBpcyBjYWNoZWQgZm9yIHtAbGluayBSQU5HRV9DQUNIRV9UVExfTVN9ICgyNCBob3VycykgYXQgdHdvIGxheWVyczogYW5cbiAqIG9uLWRpc2sgY29weSB1bmRlciB0aGUgT1MgdGVtcCBkaXIgKHN1cnZpdmVzIHByb2Nlc3MgcmVzdGFydHMsIHNoYXJlZFxuICogYWNyb3NzIHByb2Nlc3NlcykgcGx1cyBhbiBpbi1wcm9jZXNzIG1lbW9pemVkIHBhcnNlLiBBIHByb3ZpZGVyIHdob3NlXG4gKiBmZWVkIGZhaWxzIHRvIGxvYWQgaXMgc2tpcHBlZCByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSB3aG9sZSBsb29rdXAgLVxuICogdGhlIG90aGVyIHByb3ZpZGVycyBzdGlsbCBhbnN3ZXIuXG4gKlxuICogU2VydmVyLW9ubHk6IEROUyByZXNvbHV0aW9uIG5lZWRzIGBub2RlOmRuc2AgKHZpYSBgLi9uZXQudHNgKSwgdGhlXG4gKiBkaXNrIGNhY2hlIG5lZWRzIGBub2RlOmZzYCAvIGBub2RlOm9zYCAvIGBub2RlOnBhdGhgLCBhbmQgdGhlIGZlZWRzXG4gKiBhcmUgZmV0Y2hlZCB3aXRoIHRoZSBnbG9iYWwgYGZldGNoYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWtkaXIsIHJlYWRGaWxlLCByZW5hbWUsIHVubGluaywgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBmaWxlIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgZnVuY3Rpb25VdGlscywgaGFzaCwgaHR0cCwganNvbiwgbG9nLCBuZXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZUhvc3RJcHMgfSBmcm9tIFwiLi9uZXQudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImNsb3VkXCIpO1xuXG4vKiogSG93IGxvbmcgYSBmZXRjaGVkIHByb3ZpZGVyIElQLXJhbmdlIGZlZWQgaXMgcmV1c2VkIGJlZm9yZSByZWZldGNoLiAqL1xuZXhwb3J0IGNvbnN0IFJBTkdFX0NBQ0hFX1RUTF9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKiBBV1MgcHVibGlzaGVzIGEgc2luZ2xlIHN0YWJsZSwgdW5hdXRoZW50aWNhdGVkIHJhbmdlcyBmZWVkLiAqL1xuY29uc3QgQVdTX1JBTkdFU19VUkwgPSBcImh0dHBzOi8vaXAtcmFuZ2VzLmFtYXpvbmF3cy5jb20vaXAtcmFuZ2VzLmpzb25cIjtcbi8qKiBHQ1AgcHVibGlzaGVzIGEgc2luZ2xlIHN0YWJsZSwgdW5hdXRoZW50aWNhdGVkIHJhbmdlcyBmZWVkLiAqL1xuY29uc3QgR0NQX1JBTkdFU19VUkwgPSBcImh0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2lwcmFuZ2VzL2Nsb3VkLmpzb25cIjtcbi8qKlxuICogQXp1cmUgaGFzIG5vIHN0YWJsZSBmZWVkIFVSTCAtIHRoZSBKU09OIGRvd25sb2FkIGxpbmsgKHdpdGggYVxuICogcm90YXRpbmcgZGF0ZSBzdGFtcCkgbGl2ZXMgb24gdGhpcyBodW1hbi1mYWNpbmcgZG93bmxvYWQgcGFnZSBhbmRcbiAqIG11c3QgYmUgc2NyYXBlZCBvdXQuIFNlZSB7QGxpbmsgZmV0Y2hBenVyZVJhbmdlc30uXG4gKi9cbmNvbnN0IEFaVVJFX0RPV05MT0FEX1BBR0UgPSBcImh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTU2NTE5XCI7XG4vKiogUmVnZXggdGhhdCBwbHVja3MgdGhlIGN1cnJlbnQgYFNlcnZpY2VUYWdzX1B1YmxpY188ZGF0ZT4uanNvbmAgbGluayBvZmYgdGhlIEF6dXJlIHBhZ2UuICovXG5jb25zdCBBWlVSRV9KU09OX0xJTksgPVxuICAvaHR0cHM6XFwvXFwvZG93bmxvYWRcXC5taWNyb3NvZnRcXC5jb21cXC9kb3dubG9hZFxcL1teXCInXSpTZXJ2aWNlVGFnc19QdWJsaWNfXFxkK1xcLmpzb24vO1xuXG4vKiogQ2xvdWQgaHlwZXJzY2FsZXIgYSBob3N0IHJlc29sdmVzIGludG8uICovXG5leHBvcnQgZW51bSBDbG91ZFByb3ZpZGVyIHtcbiAgQXdzID0gXCJhd3NcIixcbiAgQXp1cmUgPSBcImF6dXJlXCIsXG4gIEdjcCA9IFwiZ2NwXCIsXG59XG5cbi8qKlxuICogV2hlcmUgYSBob3N0IGxpdmVzOiB0aGUge0BsaW5rIENsb3VkUHJvdmlkZXJ9LCB0aGUgcHJvdmlkZXItbmF0aXZlXG4gKiBgcmVnaW9uYCBzdHJpbmcgKHdoYXRldmVyIHRoZSBwcm92aWRlcidzIGZlZWQgY2FsbHMgaXQsIGUuZy5cbiAqIGBcInVzLWVhc3QtMVwiYCBvbiBBV1MsIGBcImVhc3R1czJcImAgb24gQXp1cmUsIGBcInVzLWVhc3QxXCJgIG9uIEdDUCksIHRoZVxuICogcmVzb2x2ZWQgYGlwYCB0aGF0IG1hdGNoZWQsIGFuZCB0aGUgYGNpZHJgIGJsb2NrIGl0IGZlbGwgaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRMb2NhdGlvbiB7XG4gIHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyO1xuICByZWdpb246IHN0cmluZztcbiAgaXA6IHN0cmluZztcbiAgY2lkcjogc3RyaW5nO1xufVxuXG4vKiogQSBwYXJzZWQgQ0lEUiBibG9jayB0YWdnZWQgd2l0aCB0aGUgcmVnaW9uIGl0IGJlbG9uZ3MgdG8uICovXG5pbnRlcmZhY2UgUmVnaW9uQ2lkciBleHRlbmRzIG5ldC5DaWRyIHtcbiAgcmVnaW9uOiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgcHJvdmlkZXIncyBwYXJzZWQsIHJlZ2lvbi10YWdnZWQgcmFuZ2UgdGFibGUuICovXG5pbnRlcmZhY2UgUHJvdmlkZXJSYW5nZXMge1xuICBwcm92aWRlcjogQ2xvdWRQcm92aWRlcjtcbiAgcmFuZ2VzOiBSZWdpb25DaWRyW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSBgaW5wdXRgJ3MgaG9zdCB0byBhIHtAbGluayBDbG91ZExvY2F0aW9ufSwgb3IgYG51bGxgIHdoZW4gdGhlXG4gKiBob3N0IGNhbid0IGJlIHJlc29sdmVkIG9yIG5vbmUgb2YgaXRzIElQcyBtYXRjaCBhIGtub3duIGNsb3VkIHJhbmdlLlxuICogYGlucHV0YCBpcyBhbnkge0BsaW5rIG5ldC5VcmxMaWtlfSAtIGEgVVJMLCBhIGJhcmUgaG9zdCwgb3IgYSBgeyB1cmwgfWBcbiAqIHdyYXBwZXIuXG4gKlxuICogVGhlIHByb3ZpZGVyIHJhbmdlIGZlZWRzIGFyZSBjYWNoZWQgZm9yIHtAbGluayBSQU5HRV9DQUNIRV9UVExfTVN9LCBzb1xuICogb25seSB0aGUgZmlyc3QgY2FsbCBpbiBhIDI0LWhvdXIgd2luZG93IHBheXMgdGhlIGZldGNoIGNvc3Q7IHRoZSBETlNcbiAqIGxvb2t1cCBoYXBwZW5zIG9uIGV2ZXJ5IGNhbGwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHJlc29sdmVDbG91ZExvY2F0aW9uKFwiaHR0cHM6Ly9hZGItMTIzNDU2Nzg5MC43LmF6dXJlZGF0YWJyaWNrcy5uZXRcIik7XG4gKiAvLyB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkF6dXJlLFxuICogLy8gICByZWdpb246IFwiZWFzdHVzMlwiLCBpcDogXCIuLi5cIiwgY2lkcjogXCIuLi5cIiB9XG4gKlxuICogYXdhaXQgcmVzb2x2ZUNsb3VkTG9jYXRpb24oXCJkYmMtYWJjMTIzLmNsb3VkLmRhdGFicmlja3MuY29tXCIpO1xuICogLy8geyBwcm92aWRlcjogQ2xvdWRQcm92aWRlci5Bd3MsXG4gKiAvLyAgIHJlZ2lvbjogXCJ1cy13ZXN0LTJcIiwgaXA6IFwiLi4uXCIsIGNpZHI6IFwiLi4uXCIgfVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNsb3VkTG9jYXRpb24oaW5wdXQ6IG5ldC5VcmxMaWtlKTogUHJvbWlzZTxDbG91ZExvY2F0aW9uIHwgbnVsbD4ge1xuICBjb25zdCBpcHMgPSBhd2FpdCByZXNvbHZlSG9zdElwcyhpbnB1dCk7XG4gIGlmIChpcHMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwibm8gaXBzIHJlc29sdmVkXCIsIHsgaW5wdXQ6IFN0cmluZyhpbnB1dCkgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgbG9hZFByb3ZpZGVyUmFuZ2VzKCk7XG4gIGZvciAoY29uc3QgaXAgb2YgaXBzKSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV0LnBhcnNlSXAoaXApO1xuICAgIGlmICghcGFyc2VkKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvdmlkZXIsIHJhbmdlcyB9IG9mIHByb3ZpZGVycykge1xuICAgICAgY29uc3QgbWF0Y2ggPSBuZXQuZmluZENvbnRhaW5pbmdDaWRyKHBhcnNlZCwgcmFuZ2VzKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4geyBwcm92aWRlciwgcmVnaW9uOiBtYXRjaC5yZWdpb24sIGlwLCBjaWRyOiBtYXRjaC5jaWRyIH07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcIm5vIGNsb3VkIHJhbmdlIG1hdGNoZWRcIiwgeyBpcHMgfSk7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIExvYWQgZXZlcnkgcHJvdmlkZXIncyByZWdpb24tdGFnZ2VkIHJhbmdlIHRhYmxlLCBlYWNoIGNhY2hlZCBmb3JcbiAqIHtAbGluayBSQU5HRV9DQUNIRV9UVExfTVN9LiBQcm92aWRlcnMgYXJlIGxvYWRlZCBpbiBwYXJhbGxlbCBhbmQgYVxuICogZmVlZCB0aGF0IGZhaWxzIHRvIGZldGNoIG9yIHBhcnNlIGlzIGRyb3BwZWQgKGxvZ2dlZCwgbm90IHRocm93bikgc29cbiAqIGEgc2luZ2xlIGZsYWt5IGZlZWQgbmV2ZXIgc2lua3MgdGhlIHdob2xlIGxvb2t1cC4gRXhwb3NlZCBmb3IgY2FsbGVyc1xuICogdGhhdCB3YW50IHRvIG1hdGNoIG1hbnkgSVBzIGFnYWluc3Qgb25lIGNhY2hlZCBzbmFwc2hvdCB3aXRob3V0IGEgRE5TXG4gKiBzdGVwIHBlciBhZGRyZXNzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFByb3ZpZGVyUmFuZ2VzKCk6IFByb21pc2U8UHJvdmlkZXJSYW5nZXNbXT4ge1xuICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtsb2FkQXdzUmFuZ2VzKCksIGxvYWRBenVyZVJhbmdlcygpLCBsb2FkR2NwUmFuZ2VzKCldKTtcbiAgY29uc3Qgb3V0OiBQcm92aWRlclJhbmdlc1tdID0gW107XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHNldHRsZWQpIHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgb3V0LnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLndhcm4oXCJwcm92aWRlciByYW5nZSBsb2FkIGZhaWxlZFwiLCB7IGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShyZXN1bHQucmVhc29uKSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQZXItcHJvdmlkZXIgY2FjaGVkIGxvYWRlcnNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBsb2FkQXdzUmFuZ2VzID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGZldGNoQXdzUmFuZ2VzLCB7IHR0bE1zOiBSQU5HRV9DQUNIRV9UVExfTVMgfSk7XG5jb25zdCBsb2FkQXp1cmVSYW5nZXMgPSBmdW5jdGlvblV0aWxzLm1lbW9pemUoZmV0Y2hBenVyZVJhbmdlcywgeyB0dGxNczogUkFOR0VfQ0FDSEVfVFRMX01TIH0pO1xuY29uc3QgbG9hZEdjcFJhbmdlcyA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZShmZXRjaEdjcFJhbmdlcywgeyB0dGxNczogUkFOR0VfQ0FDSEVfVFRMX01TIH0pO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFByb3ZpZGVyIGZlZWQgZmV0Y2ggKyBwYXJzZVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmludGVyZmFjZSBBd3NGZWVkIHtcbiAgcHJlZml4ZXM/OiB7IGlwX3ByZWZpeD86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nIH1bXTtcbiAgaXB2Nl9wcmVmaXhlcz86IHsgaXB2Nl9wcmVmaXg/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9W107XG59XG5cbi8qKlxuICogQVdTIGBpcC1yYW5nZXMuanNvbmA6IGEgZmxhdCBsaXN0IG9mIElQdjQgKGBwcmVmaXhlc2ApIGFuZCBJUHY2XG4gKiAoYGlwdjZfcHJlZml4ZXNgKSBibG9ja3MsIGVhY2ggYWxyZWFkeSB0YWdnZWQgd2l0aCBhIGByZWdpb25gIHN1Y2hcbiAqIGFzIGBcInVzLWVhc3QtMVwiYCAob3IgYFwiR0xPQkFMXCJgIGZvciBlZGdlIHJhbmdlcykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQXdzUmFuZ2VzKCk6IFByb21pc2U8UHJvdmlkZXJSYW5nZXM+IHtcbiAgY29uc3QgZmVlZCA9IGF3YWl0IGZldGNoSnNvbjxBd3NGZWVkPihBV1NfUkFOR0VTX1VSTCk7XG4gIGNvbnN0IHJhbmdlczogUmVnaW9uQ2lkcltdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZmVlZC5wcmVmaXhlcyA/PyBbXSkge1xuICAgIGFkZFJhbmdlKHJhbmdlcywgZW50cnkuaXBfcHJlZml4LCBlbnRyeS5yZWdpb24pO1xuICB9XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZmVlZC5pcHY2X3ByZWZpeGVzID8/IFtdKSB7XG4gICAgYWRkUmFuZ2UocmFuZ2VzLCBlbnRyeS5pcHY2X3ByZWZpeCwgZW50cnkucmVnaW9uKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgYXdzIHJhbmdlc1wiLCB7IGNvdW50OiByYW5nZXMubGVuZ3RoIH0pO1xuICByZXR1cm4geyBwcm92aWRlcjogQ2xvdWRQcm92aWRlci5Bd3MsIHJhbmdlcyB9O1xufVxuXG5pbnRlcmZhY2UgR2NwRmVlZCB7XG4gIHByZWZpeGVzPzogeyBpcHY0UHJlZml4Pzogc3RyaW5nOyBpcHY2UHJlZml4Pzogc3RyaW5nOyBzY29wZT86IHN0cmluZyB9W107XG59XG5cbi8qKlxuICogR0NQIGBjbG91ZC5qc29uYDogYSBsaXN0IG9mIGJsb2NrcyBlYWNoIGNhcnJ5aW5nIGFuIGBpcHY0UHJlZml4YCBvclxuICogYGlwdjZQcmVmaXhgIGFuZCBhIGBzY29wZWAgdGhhdCBpcyB0aGUgcmVnaW9uIChgXCJ1cy1lYXN0MVwiYCkgb3JcbiAqIGBcImdsb2JhbFwiYCBmb3Igbm9uLXJlZ2lvbmFsIHJhbmdlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hHY3BSYW5nZXMoKTogUHJvbWlzZTxQcm92aWRlclJhbmdlcz4ge1xuICBjb25zdCBmZWVkID0gYXdhaXQgZmV0Y2hKc29uPEdjcEZlZWQ+KEdDUF9SQU5HRVNfVVJMKTtcbiAgY29uc3QgcmFuZ2VzOiBSZWdpb25DaWRyW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBmZWVkLnByZWZpeGVzID8/IFtdKSB7XG4gICAgYWRkUmFuZ2UocmFuZ2VzLCBlbnRyeS5pcHY0UHJlZml4ID8/IGVudHJ5LmlwdjZQcmVmaXgsIGVudHJ5LnNjb3BlKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgZ2NwIHJhbmdlc1wiLCB7IGNvdW50OiByYW5nZXMubGVuZ3RoIH0pO1xuICByZXR1cm4geyBwcm92aWRlcjogQ2xvdWRQcm92aWRlci5HY3AsIHJhbmdlcyB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVGZWVkIHtcbiAgdmFsdWVzPzoge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgcHJvcGVydGllcz86IHsgcmVnaW9uPzogc3RyaW5nOyBhZGRyZXNzUHJlZml4ZXM/OiBzdHJpbmdbXSB9O1xuICB9W107XG59XG5cbi8qKlxuICogQXp1cmUgc2VydmljZSB0YWdzOiBNaWNyb3NvZnQgc2hpcHMgbm8gc3RhYmxlIGZlZWQgVVJMLCBzbyBzY3JhcGUgdGhlXG4gKiBjdXJyZW50IGBTZXJ2aWNlVGFnc19QdWJsaWNfPGRhdGU+Lmpzb25gIGxpbmsgb2ZmIHRoZSBkb3dubG9hZCBwYWdlXG4gKiBhbmQgZmV0Y2ggaXQuIE9ubHkgdGhlIHJlZ2lvbmFsIGBBenVyZUNsb3VkLjxyZWdpb24+YCBhZ2dyZWdhdGVzXG4gKiAod2hpY2ggaGF2ZSBhIG5vbi1lbXB0eSBgcmVnaW9uYCkgYXJlIGtlcHQ7IHRoZSBjbG91ZC13aWRlXG4gKiBgQXp1cmVDbG91ZGAgdGFnIGFuZCBwZXItc2VydmljZSB0YWdzIGFyZSBpZ25vcmVkIHNvIGFuIGFkZHJlc3MgbWFwc1xuICogY2xlYW5seSB0byBvbmUgcmVnaW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaEF6dXJlUmFuZ2VzKCk6IFByb21pc2U8UHJvdmlkZXJSYW5nZXM+IHtcbiAgY29uc3QgcGFnZSA9IGF3YWl0IGZldGNoVGV4dChBWlVSRV9ET1dOTE9BRF9QQUdFKTtcbiAgY29uc3QganNvblVybCA9IHBhZ2UubWF0Y2goQVpVUkVfSlNPTl9MSU5LKT8uWzBdO1xuICBpZiAoIWpzb25VcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmluZCBTZXJ2aWNlVGFncyBKU09OIGxpbmsgb24gQXp1cmUgZG93bmxvYWQgcGFnZVwiKTtcbiAgfVxuICBjb25zdCBmZWVkID0gYXdhaXQgZmV0Y2hKc29uPEF6dXJlRmVlZD4oanNvblVybCk7XG4gIGNvbnN0IHJhbmdlczogUmVnaW9uQ2lkcltdID0gW107XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgZmVlZC52YWx1ZXMgPz8gW10pIHtcbiAgICBjb25zdCByZWdpb24gPSB2YWx1ZS5wcm9wZXJ0aWVzPy5yZWdpb247XG4gICAgaWYgKCFyZWdpb24gfHwgIXZhbHVlLm5hbWU/LnN0YXJ0c1dpdGgoXCJBenVyZUNsb3VkLlwiKSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgdmFsdWUucHJvcGVydGllcz8uYWRkcmVzc1ByZWZpeGVzID8/IFtdKSB7XG4gICAgICBhZGRSYW5nZShyYW5nZXMsIHByZWZpeCwgcmVnaW9uKTtcbiAgICB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwibG9hZGVkIGF6dXJlIHJhbmdlc1wiLCB7IGNvdW50OiByYW5nZXMubGVuZ3RoIH0pO1xuICByZXR1cm4geyBwcm92aWRlcjogQ2xvdWRQcm92aWRlci5BenVyZSwgcmFuZ2VzIH07XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSGVscGVyc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBQYXJzZSBgY2lkcmAgYW5kLCB3aGVuIHZhbGlkIGFuZCBgcmVnaW9uYCBpcyBzZXQsIHB1c2ggYSB0YWdnZWQgcmFuZ2UuICovXG5mdW5jdGlvbiBhZGRSYW5nZShyYW5nZXM6IFJlZ2lvbkNpZHJbXSwgY2lkcj86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghY2lkciB8fCAhcmVnaW9uKSByZXR1cm47XG4gIGNvbnN0IHBhcnNlZCA9IG5ldC5wYXJzZUNpZHIoY2lkcik7XG4gIGlmIChwYXJzZWQpIHJhbmdlcy5wdXNoKHsgLi4ucGFyc2VkLCByZWdpb24gfSk7XG59XG5cbi8qKlxuICogRmV0Y2ggYW5kIHBhcnNlIGEgcHJvdmlkZXIgZmVlZC4gQSBwYXJzZSBmYWlsdXJlIG5hbWVzIHRoZSBVUkwgcmF0aGVyIHRoYW5cbiAqIHN1cmZhY2luZyBhbiBvcGFxdWUgYFVuZXhwZWN0ZWQgdG9rZW5gIC0gdGhlIHRleHQgbWF5IGNvbWUgZnJvbSB0aGUgb24tZGlza1xuICogY2FjaGUsIHNvIFwid2hpY2ggZmVlZFwiIGlzIHRoZSBwYXJ0IHdvcnRoIGtub3dpbmcuIHtAbGluayBsb2FkUHJvdmlkZXJSYW5nZXN9XG4gKiB0dXJucyB0aGUgdGhyb3cgaW50byBhIHBlci1wcm92aWRlciB3YXJuaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaEpzb248VD4odXJsOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgdGV4dCA9IGF3YWl0IGZldGNoVGV4dCh1cmwpO1xuICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlPFQ+KHRleHQpO1xuICBpZiAocGFyc2VkID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJhbmdlIGZlZWQgcmV0dXJuZWQgbm9uLUpTT04gY29udGVudDogJHt1cmx9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBGZXRjaCBgdXJsYCBhcyB0ZXh0IHdpdGggYSAyNGggb24tZGlzayBjYWNoZSB1bmRlciB0aGUgT1MgdGVtcCBkaXJcbiAqIChrZXllZCBieSBhbiBGTlYgaGFzaCBvZiB0aGUgVVJMKS4gQSBmcmVzaCBjYWNoZSBmaWxlIGlzIHJldHVybmVkXG4gKiBkaXJlY3RseTsgYSBtaXNzL2V4cGlyeSBmZXRjaGVzLCB3cml0ZXMgdG8gYSB1bmlxdWUgdGVtcCBmaWxlLCBhbmRcbiAqIGF0b21pY2FsbHkgcmVuYW1lcyBpdCBpbnRvIHBsYWNlIHNvIGNvbmN1cnJlbnQgY2FsbGVycyBuZXZlciBvYnNlcnZlXG4gKiBhIGhhbGYtd3JpdHRlbiBjYWNoZSBlbnRyeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hUZXh0KHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKHRtcGRpcigpLCBcImRieC10b29sc1wiLCBcInNoYXJlZFwiLCBcImNsb3VkXCIpO1xuICBjb25zdCBjYWNoZURpckNyZWF0ZWQgPSBhd2FpdCBta2RpcihjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGNhY2hlUGF0aCA9IGpvaW4oY2FjaGVEaXIsIGBmZXRjaC0ke2hhc2guZm52SGFzaCh1cmwpfS50eHRgKTtcbiAgY29uc3QgY3JlYXRlZEF0ID0gY2FjaGVEaXJDcmVhdGVkID8gdW5kZWZpbmVkIDogYXdhaXQgZ2V0Q3JlYXRlZChjYWNoZVBhdGgpO1xuICBpZiAoY3JlYXRlZEF0KSB7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gbmV3IERhdGUoY3JlYXRlZEF0LmdldFRpbWUoKSArIFJBTkdFX0NBQ0hFX1RUTF9NUyk7XG4gICAgaWYgKGV4cGlyZXNBdCA+IG5ldyBEYXRlKCkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImNhY2hlZCBmZXRjaCBoaXRcIiwgeyB1cmwsIGNhY2hlUGF0aCB9KTtcbiAgICAgIHJldHVybiByZWFkRmlsZShjYWNoZVBhdGgsIFwidXRmOFwiKTtcbiAgICB9XG4gIH1cbiAgbGV0IHRlbXBQYXRoOiBzdHJpbmcgfCBudWxsID0gam9pbihjYWNoZURpciwgYCR7aGFzaC5pZCgpfS50eHRgKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgYXdhaXQgaHR0cC5jcmVhdGVGZXRjaEVycm9yKHJlc3BvbnNlLCB1cmwpO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZSh0ZW1wUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHdyaXRlRmlsZSh0ZW1wUGF0aCwgcmVzcG9uc2VUZXh0KTtcblxuICAgIGF3YWl0IHJlbmFtZSh0ZW1wUGF0aCwgY2FjaGVQYXRoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJjYWNoZWQgZmV0Y2ggbG9hZFwiLCB7IHVybCwgY2FjaGVQYXRoIH0pO1xuICAgIHRlbXBQYXRoID0gbnVsbDtcbiAgICByZXR1cm4gcmVzcG9uc2VUZXh0O1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh0ZW1wUGF0aCkge1xuICAgICAgYXdhaXQgdW5saW5rKHRlbXBQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEJpcnRoIHRpbWUgb2YgYHBhdGhgLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q3JlYXRlZChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPERhdGUgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIChhd2FpdCBmaWxlLnN0YXRTeW5jKHBhdGgpKT8uYmlydGh0aW1lO1xufVxuIl19
@@ -13,7 +13,7 @@
13
13
  * @module
14
14
  */
15
15
  import { BaseFileSystem, type CopyOptions, type FileEntry, type FileStat, type WriteFileOptions } from "@dbx-tools/shared-fs";
16
- import { type WorkspaceClient } from "./workspace.ts";
16
+ import { type WorkspaceClient } from "./workspace-client.ts";
17
17
  /** Options for {@link DatabricksFileSystem}. */
18
18
  export interface DatabricksFileSystemOptions {
19
19
  /** Unique identifier. Defaults to a stable hash of the normalized root. */
@@ -15,7 +15,7 @@
15
15
  import { hash, object } from "@dbx-tools/shared-core";
16
16
  import { BaseFileSystem, baseFS, FileSystemError, posixPath, } from "@dbx-tools/shared-fs";
17
17
  import { isHomeRelativePath, normalizeDatabricksRoot, resolveDatabricksFilesBackend, resolveDatabricksRoot, } from "./databricks-path.js";
18
- import { getWorkspaceClient } from "./workspace.js";
18
+ import { getWorkspaceClient } from "./workspace-client.js";
19
19
  const DBFS_READ_CHUNK_BYTES = 1024 * 1024;
20
20
  const DBFS_PUT_MAX_BYTES = 1024 * 1024;
21
21
  /** Segments in `/Volumes/<catalog>/<schema>/<volume>`, provisioned out of band. */
@@ -324,4 +324,4 @@ function bufferToReadableStream(buffer) {
324
324
  },
325
325
  });
326
326
  }
327
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1mcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYnJpY2tzLWZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFDTCxjQUFjLEVBQ2QsTUFBTSxFQUNOLGVBQWUsRUFDZixTQUFTLEdBS1YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IscUJBQXFCLEdBRXRCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBRTFFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdkMsbUZBQW1GO0FBQ25GLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBK0M1Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsY0FBNEI7SUFDNUQsTUFBTSxDQUE4QjtJQUMzQixZQUFZLENBQThCO0lBRTNELFlBQVksT0FBb0M7UUFDOUMsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNuRixLQUFLLENBQUM7WUFDSixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxjQUFjLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEQsT0FBTyxFQUFFLFlBQVk7WUFDckIsSUFBSTtZQUNKLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixVQUFVLEVB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QUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGFicmlja3Mge0BsaW5rIEZpbGVTeXN0ZW19IGJhY2tlZCBieSB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fS5cbiAqXG4gKiBFeHRlbmRzIHtAbGluayBCYXNlRmlsZVN5c3RlbX0uIFJvdXRlcyBJL08gYnkgYWJzb2x1dGUgcGF0aDpcbiAqIC0gYC9Xb3Jrc3BhY2VgLCBgL1VzZXJzYCwgYC9SZXBvc2AsIGAvU2hhcmVkYCDihpIgd29ya3NwYWNlIG9iamVjdHMgQVBJXG4gKiAtIGAvVm9sdW1lcy8uLi5gIChvciBgY2F0YWxvZy5zY2hlbWEudm9sdW1lYCByb290cykg4oaSIFVuaXR5IENhdGFsb2cgRmlsZXMgQVBJXG4gKiAtIGAvZGJmcy8uLi5gIOKGkiBEQkZTIEFQSVxuICpcbiAqIEV2ZXJ5IHByaW1pdGl2ZSBwaWNrcyBpdHMgQVBJIHRocm91Z2gge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtLmRpc3BhdGNofVxuICogcmF0aGVyIHRoYW4gcmUtYnJhbmNoaW5nIGJ5IGhhbmQsIGFuZCBlcnJvciBub3JtYWxpemF0aW9uIGlzIGluaGVyaXRlZCBmcm9tXG4gKiB7QGxpbmsgQmFzZUZpbGVTeXN0ZW19LCBzbyBhIHByaW1pdGl2ZSBoZXJlIGlzIGp1c3QgdGhlIFNESyBjYWxsLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBoYXNoLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgQmFzZUZpbGVTeXN0ZW0sXG4gIGJhc2VGUyxcbiAgRmlsZVN5c3RlbUVycm9yLFxuICBwb3NpeFBhdGgsXG4gIHR5cGUgQ29weU9wdGlvbnMsXG4gIHR5cGUgRmlsZUVudHJ5LFxuICB0eXBlIEZpbGVTdGF0LFxuICB0eXBlIFdyaXRlRmlsZU9wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHtcbiAgaXNIb21lUmVsYXRpdmVQYXRoLFxuICBub3JtYWxpemVEYXRhYnJpY2tzUm9vdCxcbiAgcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQsXG4gIHJlc29sdmVEYXRhYnJpY2tzUm9vdCxcbiAgdHlwZSBEYXRhYnJpY2tzRmlsZXNCYWNrZW5kLFxufSBmcm9tIFwiLi9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmltcG9ydCB7IGdldFdvcmtzcGFjZUNsaWVudCwgdHlwZSBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiLi93b3Jrc3BhY2UudHNcIjtcblxuY29uc3QgREJGU19SRUFEX0NIVU5LX0JZVEVTID0gMTAyNCAqIDEwMjQ7XG5jb25zdCBEQkZTX1BVVF9NQVhfQllURVMgPSAxMDI0ICogMTAyNDtcblxuLyoqIFNlZ21lbnRzIGluIGAvVm9sdW1lcy88Y2F0YWxvZz4vPHNjaGVtYT4vPHZvbHVtZT5gLCBwcm92aXNpb25lZCBvdXQgb2YgYmFuZC4gKi9cbmNvbnN0IFZPTFVNRV9ST09UX0RFUFRIID0gNDtcblxuLyoqXG4gKiBPbmUgaGFuZGxlciBwZXIgRGF0YWJyaWNrcyBBUEksIGtleWVkIGJ5IHtAbGluayBEYXRhYnJpY2tzRmlsZXNCYWNrZW5kfSBzb1xuICogYWRkaW5nIGEgYmFja2VuZCBpcyBhIGNvbXBpbGUgZXJyb3IgdW50aWwgZXZlcnkgY2FsbCBzaXRlIGhhbmRsZXMgaXQuXG4gKi9cbnR5cGUgQmFja2VuZEhhbmRsZXJzPFQ+ID0gUmVjb3JkPERhdGFicmlja3NGaWxlc0JhY2tlbmQsIChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCkgPT4gUHJvbWlzZTxUPj47XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzRmlsZVN5c3RlbU9wdGlvbnMge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGhhc2ggb2YgdGhlIG5vcm1hbGl6ZWQgcm9vdC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbGVzeXN0ZW0gcm9vdC4gQWNjZXB0czpcbiAgICogLSBgL1ZvbHVtZXMvY2F0YWxvZy9zY2hlbWEvdm9sdW1lYCAoYWxzbyBgL1ZvbHVtZS8uLi5gKVxuICAgKiAtIGBjYXRhbG9nLnNjaGVtYS52b2x1bWVgXG4gICAqIC0gYH5gIC8gYH4vLi4uYCDihpIgYC9Xb3Jrc3BhY2UvVXNlcnMvPHVzZXJOYW1lPi8uLi5gIChuZWVkcyB7QGxpbmsgdXNlck5hbWV9LFxuICAgKiAgIG9yIHVzZSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uY3JlYXRlfSlcbiAgICogLSBgL1dvcmtzcGFjZS8uLi5gLCBgL1VzZXJzLy4uLmAsIGAvUmVwb3MvLi4uYCwgYC9TaGFyZWQvLi4uYFxuICAgKiAtIGAvZGJmcy8uLi5gXG4gICAqL1xuICByb290OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZXJuYW1lIGZvciBleHBhbmRpbmcgYH5gLiBXaGVuIG9taXR0ZWQgYW5kIHtAbGluayByb290fSBpcyBob21lLXJlbGF0aXZlLFxuICAgKiBwcmVmZXIge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtLmNyZWF0ZX0gd2hpY2ggcmVzb2x2ZXMgaXQgdmlhXG4gICAqIGBnZXRDdXJyZW50VXNlck5hbWVgLlxuICAgKi9cbiAgdXNlck5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudC4gRGVmYXVsdHMgdG8gYHRyeUdldFdvcmtzcGFjZUNsaWVudCgpYCwgb3RoZXJ3aXNlXG4gICAqIGEgZGVmYXVsdCB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fSBmcm9tIGVudiAvIHByb2ZpbGUgYXV0aC5cbiAgICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudDtcblxuICAvKiogQmxvY2sgYWxsIHdyaXRlIG9wZXJhdGlvbnMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB7QGxpbmsgcm9vdH0gKGFuZCBwYXJlbnRzKSBkdXJpbmcgaW5pdC4gRGVmYXVsdHMgdG8gZmFsc2UgKHZvbHVtZVxuICAgKiBhbmQgd29ya3NwYWNlIHJvb3RzIGFyZSB1c3VhbGx5IHByb3Zpc2lvbmVkIG91dCBvZiBiYW5kKS5cbiAgICovXG4gIGNyZWF0ZVJvb3Q/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIHtAbGluayBGaWxlU3lzdGVtfSBpbXBsZW1lbnRhdGlvbiBvdmVyIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGVzLCBVQ1xuICogdm9sdW1lcywgYW5kIERCRlMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBmcyA9IG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7IHJvb3Q6IFwibWFpbi5kZWZhdWx0LmFzc2V0c1wiIH0pO1xuICogYXdhaXQgZnMud3JpdGVGaWxlKFwibm90ZXMvaGVsbG8udHh0XCIsIFwiaGlcIik7XG4gKlxuICogY29uc3QgaG9tZSA9IGF3YWl0IERhdGFicmlja3NGaWxlU3lzdGVtLmNyZWF0ZSh7IHJvb3Q6IFwiflwiIH0pO1xuICogY29uc3QgbGlzdGluZyA9IGF3YWl0IGhvbWUucmVhZGRpcihcIi5cIik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFicmlja3NGaWxlU3lzdGVtIGV4dGVuZHMgQmFzZUZpbGVTeXN0ZW08XCJkYXRhYnJpY2tzXCI+IHtcbiAgcHJpdmF0ZSBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnRPcHRpb246IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEYXRhYnJpY2tzRmlsZVN5c3RlbU9wdGlvbnMpIHtcbiAgICBjb25zdCByb290ID0gbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3Qob3B0aW9ucy5yb290LCB7IHVzZXJOYW1lOiBvcHRpb25zLnVzZXJOYW1lIH0pO1xuICAgIHN1cGVyKHtcbiAgICAgIGlkOiBvcHRpb25zLmlkID8/IGBkYXRhYnJpY2tzLSR7aGFzaC5mbnZIYXNoKHJvb3QpfWAsXG4gICAgICBiYWNrZW5kOiBcImRhdGFicmlja3NcIixcbiAgICAgIHJvb3QsXG4gICAgICByZWFkT25seTogb3B0aW9ucy5yZWFkT25seSxcbiAgICAgIGNyZWF0ZVJvb3Q6IG9wdGlvbnMuY3JlYXRlUm9vdCA/PyBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmNsaWVudE9wdGlvbiA9IG9wdGlvbnMuY2xpZW50O1xuICAgIHRoaXMuY2xpZW50ID0gb3B0aW9ucy5jbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IGEge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfSwgcmVzb2x2aW5nIGB+YCByb290cyB2aWEgdGhlXG4gICAqIHdvcmtzcGFjZSBjdXJyZW50IHVzZXIgd2hlbiBuZWVkZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IERhdGFicmlja3NGaWxlU3lzdGVtT3B0aW9ucyk6IFByb21pc2U8RGF0YWJyaWNrc0ZpbGVTeXN0ZW0+IHtcbiAgICBpZiAoIWlzSG9tZVJlbGF0aXZlUGF0aChvcHRpb25zLnJvb3QpIHx8IG9wdGlvbnMudXNlck5hbWU/LnRyaW0oKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbShvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgY2xpZW50ID0gb3B0aW9ucy5jbGllbnQgPz8gKGF3YWl0IGdldFdvcmtzcGFjZUNsaWVudCgpKTtcbiAgICBjb25zdCByb290ID0gYXdhaXQgcmVzb2x2ZURhdGFicmlja3NSb290KG9wdGlvbnMucm9vdCwgeyBjbGllbnQgfSk7XG4gICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7IC4uLm9wdGlvbnMsIHJvb3QsIGNsaWVudCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBvbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbGllbnQgPSB0aGlzLmNsaWVudE9wdGlvbiA/PyAoYXdhaXQgZ2V0V29ya3NwYWNlQ2xpZW50KCkpO1xuICB9XG5cbiAgLyoqIFJ1biB0aGUgaGFuZGxlciBmb3IgYGFic29sdXRlUGF0aGAncyBEYXRhYnJpY2tzIEFQSSB3aXRoIHRoZSBsaXZlIGNsaWVudC4gKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaDxUPihhYnNvbHV0ZVBhdGg6IHN0cmluZywgaGFuZGxlcnM6IEJhY2tlbmRIYW5kbGVyczxUPik6IFByb21pc2U8VD4ge1xuICAgIGlmICghdGhpcy5jbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXG4gICAgICAgIFwiSU9fRVJST1JcIixcbiAgICAgICAgXCJEYXRhYnJpY2tzIGZpbGVzeXN0ZW0gaXMgbm90IGluaXRpYWxpemVkIChubyBXb3Jrc3BhY2VDbGllbnQpXCIsXG4gICAgICAgIGFic29sdXRlUGF0aCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVyc1tyZXNvbHZlRGF0YWJyaWNrc0ZpbGVzQmFja2VuZChhYnNvbHV0ZVBhdGgpXSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgLyogUHJpbWl0aXZlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVSb290RGlyZWN0b3J5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlyZWN0b3J5QXQodGhpcy5yb290KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQnl0ZXNBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHRoaXMuZGlzcGF0Y2g8QnVmZmVyPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IHRoaXMucmVhZERiZnNGaWxlKGNsaWVudCwgcmVzb2x2ZWRQYXRoKSxcbiAgICAgIHdvcmtzcGFjZTogYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2UuZXhwb3J0KHsgcGF0aDogcmVzb2x2ZWRQYXRoLCBmb3JtYXQ6IFwiQVVUT1wiIH0pO1xuICAgICAgICByZXR1cm4gZGVjb2RlQmFzZTY0KHJlc3BvbnNlLmNvbnRlbnQpO1xuICAgICAgfSxcbiAgICAgIHZvbHVtZXM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZmlsZXMuZG93bmxvYWQoeyBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCB9KTtcbiAgICAgICAgcmV0dXJuIHJlYWRSZXNwb25zZUJvZHkoXG4gICAgICAgICAgcmVzcG9uc2UuY29udGVudHMgYXMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlci5idWZmZXIsIGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgd3JpdGVCeXRlc0F0KFxuICAgIHJlc29sdmVkUGF0aDogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IFVpbnQ4QXJyYXksXG4gICAgb3B0aW9uczogUmVxdWlyZWQ8V3JpdGVGaWxlT3B0aW9ucz4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQpO1xuICAgIGNvbnN0IG92ZXJ3cml0ZSA9IG9wdGlvbnMub3ZlcndyaXRlO1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiB0aGlzLndyaXRlRGJmc0ZpbGUoY2xpZW50LCByZXNvbHZlZFBhdGgsIGJ1ZmZlciwgb3ZlcndyaXRlKSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT5cbiAgICAgICAgY2xpZW50LndvcmtzcGFjZS5pbXBvcnQoe1xuICAgICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICBmb3JtYXQ6IFwiQVVUT1wiLFxuICAgICAgICAgIGNvbnRlbnQ6IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgICBvdmVyd3JpdGUsXG4gICAgICAgIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT5cbiAgICAgICAgY2xpZW50LmZpbGVzLnVwbG9hZCh7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgICAgY29udGVudHM6IGJ1ZmZlclRvUmVhZGFibGVTdHJlYW0oYnVmZmVyKSBhcyBuZXZlcixcbiAgICAgICAgICBvdmVyd3JpdGUsXG4gICAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUZpbGVBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiBjbGllbnQuZGJmcy5kZWxldGUoeyBwYXRoOiByZXNvbHZlZFBhdGgsIHJlY3Vyc2l2ZTogZmFsc2UgfSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+IGNsaWVudC53b3Jrc3BhY2UuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gY2xpZW50LmZpbGVzLmRlbGV0ZSh7IGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZURpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IGNsaWVudC5kYmZzLm1rZGlycyh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT4gY2xpZW50LndvcmtzcGFjZS5ta2RpcnMoeyBwYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PiB0aGlzLmNyZWF0ZVZvbHVtZURpcmVjdG9yaWVzKGNsaWVudCwgcmVzb2x2ZWRQYXRoKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZW1vdmVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiBjbGllbnQuZGJmcy5kZWxldGUoeyBwYXRoOiByZXNvbHZlZFBhdGgsIHJlY3Vyc2l2ZTogZmFsc2UgfSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+IGNsaWVudC53b3Jrc3BhY2UuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gY2xpZW50LmZpbGVzLmRlbGV0ZURpcmVjdG9yeSh7IGRpcmVjdG9yeV9wYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgbGlzdERpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlRW50cnlbXT4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoPEZpbGVFbnRyeVtdPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+XG4gICAgICAgIGNvbGxlY3QoY2xpZW50LmRiZnMubGlzdCh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGluZm8pID0+ICh7XG4gICAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKGluZm8ucGF0aCA/PyBcIlwiKSxcbiAgICAgICAgICB0eXBlOiBpbmZvLmlzX2RpciA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBzaXplOiBpbmZvLmZpbGVfc2l6ZSxcbiAgICAgICAgfSkpLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PlxuICAgICAgICBjb2xsZWN0KGNsaWVudC53b3Jrc3BhY2UubGlzdCh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGluZm8pID0+ICh7XG4gICAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKGluZm8ucGF0aCA/PyBcIlwiKSxcbiAgICAgICAgICB0eXBlOiBpbmZvLm9iamVjdF90eXBlID09PSBcIkRJUkVDVE9SWVwiID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICB9KSksXG4gICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PlxuICAgICAgICBjb2xsZWN0KGNsaWVudC5maWxlcy5saXN0RGlyZWN0b3J5Q29udGVudHMoeyBkaXJlY3RvcnlfcGF0aDogcmVzb2x2ZWRQYXRoIH0pLCAoZW50cnkpID0+ICh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSA/PyBwb3NpeFBhdGguYmFzZW5hbWUoZW50cnkucGF0aCA/PyBcIlwiKSxcbiAgICAgICAgICB0eXBlOiBlbnRyeS5pc19kaXJlY3RvcnkgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICAgICAgc2l6ZTogZW50cnkuZmlsZV9zaXplLFxuICAgICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgc3RhdEF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxPbWl0PEZpbGVTdGF0LCBcInBhdGhcIj4+IHtcbiAgICBjb25zdCBmYWxsYmFja05hbWUgPSBwb3NpeFBhdGguYmFzZW5hbWUocmVzb2x2ZWRQYXRoKSB8fCBwb3NpeFBhdGguYmFzZW5hbWUodGhpcy5yb290KTtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaDxPbWl0PEZpbGVTdGF0LCBcInBhdGhcIj4+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgY2xpZW50LmRiZnMuZ2V0U3RhdHVzKHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICBjb25zdCBtb2RpZmllZCA9IG9iamVjdC50b0RhdGUoaW5mby5tb2RpZmljYXRpb25fdGltZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKGluZm8ucGF0aCA/PyByZXNvbHZlZFBhdGgpIHx8IGZhbGxiYWNrTmFtZSxcbiAgICAgICAgICB0eXBlOiBpbmZvLmlzX2RpciA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBzaXplOiBpbmZvLmZpbGVfc2l6ZSxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG1vZGlmaWVkLFxuICAgICAgICAgIG1vZGlmaWVkQXQ6IG1vZGlmaWVkLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHdvcmtzcGFjZTogYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgY2xpZW50LndvcmtzcGFjZS5nZXRTdGF0dXMoeyBwYXRoOiByZXNvbHZlZFBhdGggfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcG9zaXhQYXRoLmJhc2VuYW1lKGluZm8ucGF0aCA/PyByZXNvbHZlZFBhdGgpIHx8IGZhbGxiYWNrTmFtZSxcbiAgICAgICAgICB0eXBlOiBpbmZvLm9iamVjdF90eXBlID09PSBcIkRJUkVDVE9SWVwiID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIGNyZWF0ZWRBdDogb2JqZWN0LnRvRGF0ZShpbmZvLmNyZWF0ZWRfYXQpLFxuICAgICAgICAgIG1vZGlmaWVkQXQ6IG9iamVjdC50b0RhdGUoaW5mby5tb2RpZmllZF9hdCksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gdGhpcy5zdGF0Vm9sdW1lUGF0aChjbGllbnQsIHJlc29sdmVkUGF0aCwgZmFsbGJhY2tOYW1lKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB0cnlNb3ZlRmlsZUF0KFxuICAgIHNvdXJjZVBhdGg6IHN0cmluZyxcbiAgICBkZXN0aW5hdGlvblBhdGg6IHN0cmluZyxcbiAgICBfb3B0aW9uczogUmVxdWlyZWQ8Q29weU9wdGlvbnM+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBPbmx5IERCRlMgZXhwb3NlcyBhIHNlcnZlci1zaWRlIG1vdmU7IGV2ZXJ5dGhpbmcgZWxzZSBmYWxscyBiYWNrIHRvIHRoZVxuICAgIC8vIHBvcnRhYmxlIGNvcHkgKyBkZWxldGUgaW4gQmFzZUZpbGVTeXN0ZW0uXG4gICAgaWYgKFxuICAgICAgcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQoc291cmNlUGF0aCkgIT09IFwiZGJmc1wiIHx8XG4gICAgICByZXNvbHZlRGF0YWJyaWNrc0ZpbGVzQmFja2VuZChkZXN0aW5hdGlvblBhdGgpICE9PSBcImRiZnNcIlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmRpc3BhdGNoPHVua25vd24+KHNvdXJjZVBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+XG4gICAgICAgIGNsaWVudC5kYmZzLm1vdmUoeyBzb3VyY2VfcGF0aDogc291cmNlUGF0aCwgZGVzdGluYXRpb25fcGF0aDogZGVzdGluYXRpb25QYXRoIH0pLFxuICAgICAgd29ya3NwYWNlOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgICB2b2x1bWVzOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgLyogQmFja2VuZC1zcGVjaWZpYyBJL08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gIC8qKlxuICAgKiBVQyBgY3JlYXRlRGlyZWN0b3J5YCBpcyBzaW5nbGUtbGV2ZWwsIHNvIHdhbGsgdGhlIHBhdGggY3JlYXRpbmcgZWFjaCBsZXZlbFxuICAgKiBiZWxvdyB0aGUgdm9sdW1lIGl0c2VsZi4gQSBsZXZlbCB0aGF0IGFscmVhZHkgZXhpc3RzIGlzIG5vdCBhbiBlcnJvci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlVm9sdW1lRGlyZWN0b3JpZXMoXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICAgYWJzb2x1dGVQYXRoOiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRzID0gYWJzb2x1dGVQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGN1cnJlbnQgPSBcIlwiO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGN1cnJlbnQgPSBgJHtjdXJyZW50fS8ke3BhcnRzW2ldfWA7XG4gICAgICBpZiAoaSA8IFZPTFVNRV9ST09UX0RFUFRIKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5maWxlcy5jcmVhdGVEaXJlY3RvcnkoeyBkaXJlY3RvcnlfcGF0aDogY3VycmVudCB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBbHJlYWR5IHByZXNlbnQgaXMgZmluZTsgYW55dGhpbmcgZWxzZSBpcyBhIHJlYWwgZmFpbHVyZS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjbGllbnQuZmlsZXMuZ2V0RGlyZWN0b3J5TWV0YWRhdGEoeyBkaXJlY3RvcnlfcGF0aDogY3VycmVudCB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0YXQgYSBVQyBwYXRoOiBmaWxlIG1ldGFkYXRhIGZpcnN0LCB0aGVuIGEgZGlyZWN0b3J5IHByb2JlLiAqL1xuICBwcml2YXRlIGFzeW5jIHN0YXRWb2x1bWVQYXRoKFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICAgIGFic29sdXRlUGF0aDogc3RyaW5nLFxuICAgIGZhbGxiYWNrTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPE9taXQ8RmlsZVN0YXQsIFwicGF0aFwiPj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGNsaWVudC5maWxlcy5nZXRNZXRhZGF0YSh7IGZpbGVfcGF0aDogYWJzb2x1dGVQYXRoIH0pO1xuICAgICAgY29uc3QgbW9kaWZpZWQgPSBvYmplY3QudG9EYXRlKG1ldGFkYXRhW1wibGFzdC1tb2RpZmllZFwiXSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBmYWxsYmFja05hbWUsXG4gICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICBzaXplOiBOdW1iZXIobWV0YWRhdGFbXCJjb250ZW50LWxlbmd0aFwiXSA/PyAwKSxcbiAgICAgICAgY3JlYXRlZEF0OiBtb2RpZmllZCxcbiAgICAgICAgbW9kaWZpZWRBdDogbW9kaWZpZWQsXG4gICAgICAgIG1pbWVUeXBlOiBtZXRhZGF0YVtcImNvbnRlbnQtdHlwZVwiXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZmlsZUVycikge1xuICAgICAgLy8gQSBkaXJlY3RvcnkgaGFzIG5vIGZpbGUgbWV0YWRhdGEsIGFuZCBhbiB1bnJlYWRhYmxlIG9uZSByZXBvcnRzIGFzXG4gICAgICAvLyBtaXNzaW5nIC8gZGVuaWVkIC0gYm90aCBhcmUgd29ydGggYSBkaXJlY3RvcnkgcHJvYmUgYmVmb3JlIGZhaWxpbmcuXG4gICAgICBjb25zdCBjb2RlID0gYmFzZUZTLm1hcEZpbGVTeXN0ZW1FcnJvcihmaWxlRXJyLCBhYnNvbHV0ZVBhdGgpLmNvZGU7XG4gICAgICBpZiAoY29kZSAhPT0gXCJOT1RfRk9VTkRcIiAmJiBjb2RlICE9PSBcIlBFUk1JU1NJT05fREVOSUVEXCIpIHRocm93IGZpbGVFcnI7XG4gICAgICBhd2FpdCBjbGllbnQuZmlsZXMuZ2V0RGlyZWN0b3J5TWV0YWRhdGEoeyBkaXJlY3RvcnlfcGF0aDogYWJzb2x1dGVQYXRoIH0pO1xuICAgICAgcmV0dXJuIHsgbmFtZTogZmFsbGJhY2tOYW1lLCB0eXBlOiBcImRpcmVjdG9yeVwiIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkRGJmc0ZpbGUoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsIGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmRiZnMucmVhZCh7XG4gICAgICAgIHBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBsZW5ndGg6IERCRlNfUkVBRF9DSFVOS19CWVRFUyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY2h1bmsgPSBkZWNvZGVCYXNlNjQocmVzcG9uc2UuZGF0YSk7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID09PSAwKSBicmVhaztcbiAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgIG9mZnNldCArPSBjaHVuay5sZW5ndGg7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoIDwgREJGU19SRUFEX0NIVU5LX0JZVEVTKSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoY2h1bmtzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVEYmZzRmlsZShcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgICBhYnNvbHV0ZVBhdGg6IHN0cmluZyxcbiAgICBidWZmZXI6IEJ1ZmZlcixcbiAgICBvdmVyd3JpdGU6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChidWZmZXIubGVuZ3RoIDw9IERCRlNfUFVUX01BWF9CWVRFUykge1xuICAgICAgYXdhaXQgY2xpZW50LmRiZnMucHV0KHtcbiAgICAgICAgcGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgICBjb250ZW50czogYnVmZmVyLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICBvdmVyd3JpdGUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNsaWVudC5kYmZzLmNyZWF0ZSh7IHBhdGg6IGFic29sdXRlUGF0aCwgb3ZlcndyaXRlIH0pO1xuICAgIGNvbnN0IGhhbmRsZSA9IGNyZWF0ZWQuaGFuZGxlO1xuICAgIGlmIChoYW5kbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcIklPX0VSUk9SXCIsIFwiREJGUyB1cGxvYWQgaGFuZGxlIG1pc3NpbmdcIiwgYWJzb2x1dGVQYXRoKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGJ1ZmZlci5sZW5ndGg7IG9mZnNldCArPSBEQkZTX1BVVF9NQVhfQllURVMpIHtcbiAgICAgICAgY29uc3Qgc2xpY2UgPSBidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBEQkZTX1BVVF9NQVhfQllURVMpO1xuICAgICAgICBhd2FpdCBjbGllbnQuZGJmcy5hZGRCbG9jayh7IGhhbmRsZSwgZGF0YTogc2xpY2UudG9TdHJpbmcoXCJiYXNlNjRcIikgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBhd2FpdCBjbGllbnQuZGJmcy5jbG9zZSh7IGhhbmRsZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBhd2FpdCBjbGllbnQuZGJmcy5jbG9zZSh7IGhhbmRsZSB9KTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIERyYWluIGFuIFNESyBhc3luYyBpdGVyYWJsZSBpbnRvIGEgbWFwcGVkIGFycmF5LiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdDxTLCBUPihzb3VyY2U6IEFzeW5jSXRlcmFibGU8Uz4sIG1hcDogKGl0ZW06IFMpID0+IFQpOiBQcm9taXNlPFRbXT4ge1xuICBjb25zdCBpdGVtczogVFtdID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBzb3VyY2UpIGl0ZW1zLnB1c2gobWFwKGl0ZW0pKTtcbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG4vKiogSGFuZGxlciBmb3IgYSBiYWNrZW5kIGEgY2FsbCBzaXRlIGhhcyBhbHJlYWR5IHJ1bGVkIG91dC4gKi9cbmZ1bmN0aW9uIHVucmVhY2hhYmxlQmFja2VuZCgpOiBQcm9taXNlPG5ldmVyPiB7XG4gIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXCJOT1RfU1VQUE9SVEVEXCIsIFwiVW5zdXBwb3J0ZWQgRGF0YWJyaWNrcyBiYWNrZW5kIGZvciB0aGlzIG9wZXJhdGlvblwiKTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlQmFzZTY0KGRhdGE6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1ZmZlciB7XG4gIGlmICghZGF0YSkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEsIFwiYmFzZTY0XCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUmVzcG9uc2VCb2R5KFxuICBjb250ZW50czogZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGlmICghY29udGVudHMpIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gIGNvbnN0IHJlYWRlciA9IGNvbnRlbnRzLmdldFJlYWRlcigpO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgIGlmICh2YWx1ZSkgY2h1bmtzLnB1c2godmFsdWUpO1xuICB9XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcy5tYXAoKGNodW5rKSA9PiBCdWZmZXIuZnJvbShjaHVuaykpKTtcbn1cblxuZnVuY3Rpb24gYnVmZmVyVG9SZWFkYWJsZVN0cmVhbShidWZmZXI6IEJ1ZmZlcik6IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
327
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1mcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYnJpY2tzLWZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFDTCxjQUFjLEVBQ2QsTUFBTSxFQUNOLGVBQWUsRUFDZixTQUFTLEdBS1YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IscUJBQXFCLEdBRXRCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUF3QixNQUFNLHVCQUF1QixDQUFDO0FBRWpGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdkMsbUZBQW1GO0FBQ25GLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBK0M1Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsY0FBNEI7SUFDNUQsTUFBTSxDQUE4QjtJQUMzQixZQUFZLENBQThCO0lBRTNELFlBQVksT0FBb0M7UUFDOUMsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNuRixLQUFLLENBQUM7WUFDSixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxjQUFjLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEQsT0FBTyxFQUFFLFlBQVk7WUFDckIsSUFBSTtZQUNKLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixVQUFVLEVB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QUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGFicmlja3Mge0BsaW5rIEZpbGVTeXN0ZW19IGJhY2tlZCBieSB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fS5cbiAqXG4gKiBFeHRlbmRzIHtAbGluayBCYXNlRmlsZVN5c3RlbX0uIFJvdXRlcyBJL08gYnkgYWJzb2x1dGUgcGF0aDpcbiAqIC0gYC9Xb3Jrc3BhY2VgLCBgL1VzZXJzYCwgYC9SZXBvc2AsIGAvU2hhcmVkYCDihpIgd29ya3NwYWNlIG9iamVjdHMgQVBJXG4gKiAtIGAvVm9sdW1lcy8uLi5gIChvciBgY2F0YWxvZy5zY2hlbWEudm9sdW1lYCByb290cykg4oaSIFVuaXR5IENhdGFsb2cgRmlsZXMgQVBJXG4gKiAtIGAvZGJmcy8uLi5gIOKGkiBEQkZTIEFQSVxuICpcbiAqIEV2ZXJ5IHByaW1pdGl2ZSBwaWNrcyBpdHMgQVBJIHRocm91Z2gge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtLmRpc3BhdGNofVxuICogcmF0aGVyIHRoYW4gcmUtYnJhbmNoaW5nIGJ5IGhhbmQsIGFuZCBlcnJvciBub3JtYWxpemF0aW9uIGlzIGluaGVyaXRlZCBmcm9tXG4gKiB7QGxpbmsgQmFzZUZpbGVTeXN0ZW19LCBzbyBhIHByaW1pdGl2ZSBoZXJlIGlzIGp1c3QgdGhlIFNESyBjYWxsLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBoYXNoLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgQmFzZUZpbGVTeXN0ZW0sXG4gIGJhc2VGUyxcbiAgRmlsZVN5c3RlbUVycm9yLFxuICBwb3NpeFBhdGgsXG4gIHR5cGUgQ29weU9wdGlvbnMsXG4gIHR5cGUgRmlsZUVudHJ5LFxuICB0eXBlIEZpbGVTdGF0LFxuICB0eXBlIFdyaXRlRmlsZU9wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHtcbiAgaXNIb21lUmVsYXRpdmVQYXRoLFxuICBub3JtYWxpemVEYXRhYnJpY2tzUm9vdCxcbiAgcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQsXG4gIHJlc29sdmVEYXRhYnJpY2tzUm9vdCxcbiAgdHlwZSBEYXRhYnJpY2tzRmlsZXNCYWNrZW5kLFxufSBmcm9tIFwiLi9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmltcG9ydCB7IGdldFdvcmtzcGFjZUNsaWVudCwgdHlwZSBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiLi93b3Jrc3BhY2UtY2xpZW50LnRzXCI7XG5cbmNvbnN0IERCRlNfUkVBRF9DSFVOS19CWVRFUyA9IDEwMjQgKiAxMDI0O1xuY29uc3QgREJGU19QVVRfTUFYX0JZVEVTID0gMTAyNCAqIDEwMjQ7XG5cbi8qKiBTZWdtZW50cyBpbiBgL1ZvbHVtZXMvPGNhdGFsb2c+LzxzY2hlbWE+Lzx2b2x1bWU+YCwgcHJvdmlzaW9uZWQgb3V0IG9mIGJhbmQuICovXG5jb25zdCBWT0xVTUVfUk9PVF9ERVBUSCA9IDQ7XG5cbi8qKlxuICogT25lIGhhbmRsZXIgcGVyIERhdGFicmlja3MgQVBJLCBrZXllZCBieSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVzQmFja2VuZH0gc29cbiAqIGFkZGluZyBhIGJhY2tlbmQgaXMgYSBjb21waWxlIGVycm9yIHVudGlsIGV2ZXJ5IGNhbGwgc2l0ZSBoYW5kbGVzIGl0LlxuICovXG50eXBlIEJhY2tlbmRIYW5kbGVyczxUPiA9IFJlY29yZDxEYXRhYnJpY2tzRmlsZXNCYWNrZW5kLCAoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpID0+IFByb21pc2U8VD4+O1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc0ZpbGVTeXN0ZW1PcHRpb25zIHtcbiAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyLiBEZWZhdWx0cyB0byBhIHN0YWJsZSBoYXNoIG9mIHRoZSBub3JtYWxpemVkIHJvb3QuICovXG4gIGlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWxlc3lzdGVtIHJvb3QuIEFjY2VwdHM6XG4gICAqIC0gYC9Wb2x1bWVzL2NhdGFsb2cvc2NoZW1hL3ZvbHVtZWAgKGFsc28gYC9Wb2x1bWUvLi4uYClcbiAgICogLSBgY2F0YWxvZy5zY2hlbWEudm9sdW1lYFxuICAgKiAtIGB+YCAvIGB+Ly4uLmAg4oaSIGAvV29ya3NwYWNlL1VzZXJzLzx1c2VyTmFtZT4vLi4uYCAobmVlZHMge0BsaW5rIHVzZXJOYW1lfSxcbiAgICogICBvciB1c2Uge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtLmNyZWF0ZX0pXG4gICAqIC0gYC9Xb3Jrc3BhY2UvLi4uYCwgYC9Vc2Vycy8uLi5gLCBgL1JlcG9zLy4uLmAsIGAvU2hhcmVkLy4uLmBcbiAgICogLSBgL2RiZnMvLi4uYFxuICAgKi9cbiAgcm9vdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2VybmFtZSBmb3IgZXhwYW5kaW5nIGB+YC4gV2hlbiBvbWl0dGVkIGFuZCB7QGxpbmsgcm9vdH0gaXMgaG9tZS1yZWxhdGl2ZSxcbiAgICogcHJlZmVyIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbS5jcmVhdGV9IHdoaWNoIHJlc29sdmVzIGl0IHZpYVxuICAgKiBgZ2V0Q3VycmVudFVzZXJOYW1lYC5cbiAgICovXG4gIHVzZXJOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQuIERlZmF1bHRzIHRvIGB0cnlHZXRXb3Jrc3BhY2VDbGllbnQoKWAsIG90aGVyd2lzZVxuICAgKiBhIGRlZmF1bHQge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0gZnJvbSBlbnYgLyBwcm9maWxlIGF1dGguXG4gICAqL1xuICBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQ7XG5cbiAgLyoqIEJsb2NrIGFsbCB3cml0ZSBvcGVyYXRpb25zLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUge0BsaW5rIHJvb3R9IChhbmQgcGFyZW50cykgZHVyaW5nIGluaXQuIERlZmF1bHRzIHRvIGZhbHNlICh2b2x1bWVcbiAgICogYW5kIHdvcmtzcGFjZSByb290cyBhcmUgdXN1YWxseSBwcm92aXNpb25lZCBvdXQgb2YgYmFuZCkuXG4gICAqL1xuICBjcmVhdGVSb290PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiB7QGxpbmsgRmlsZVN5c3RlbX0gaW1wbGVtZW50YXRpb24gb3ZlciBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlcywgVUNcbiAqIHZvbHVtZXMsIGFuZCBEQkZTLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oeyByb290OiBcIm1haW4uZGVmYXVsdC5hc3NldHNcIiB9KTtcbiAqIGF3YWl0IGZzLndyaXRlRmlsZShcIm5vdGVzL2hlbGxvLnR4dFwiLCBcImhpXCIpO1xuICpcbiAqIGNvbnN0IGhvbWUgPSBhd2FpdCBEYXRhYnJpY2tzRmlsZVN5c3RlbS5jcmVhdGUoeyByb290OiBcIn5cIiB9KTtcbiAqIGNvbnN0IGxpc3RpbmcgPSBhd2FpdCBob21lLnJlYWRkaXIoXCIuXCIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYnJpY2tzRmlsZVN5c3RlbSBleHRlbmRzIEJhc2VGaWxlU3lzdGVtPFwiZGF0YWJyaWNrc1wiPiB7XG4gIHByaXZhdGUgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50T3B0aW9uOiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGF0YWJyaWNrc0ZpbGVTeXN0ZW1PcHRpb25zKSB7XG4gICAgY29uc3Qgcm9vdCA9IG5vcm1hbGl6ZURhdGFicmlja3NSb290KG9wdGlvbnMucm9vdCwgeyB1c2VyTmFtZTogb3B0aW9ucy51c2VyTmFtZSB9KTtcbiAgICBzdXBlcih7XG4gICAgICBpZDogb3B0aW9ucy5pZCA/PyBgZGF0YWJyaWNrcy0ke2hhc2guZm52SGFzaChyb290KX1gLFxuICAgICAgYmFja2VuZDogXCJkYXRhYnJpY2tzXCIsXG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHk6IG9wdGlvbnMucmVhZE9ubHksXG4gICAgICBjcmVhdGVSb290OiBvcHRpb25zLmNyZWF0ZVJvb3QgPz8gZmFsc2UsXG4gICAgfSk7XG4gICAgdGhpcy5jbGllbnRPcHRpb24gPSBvcHRpb25zLmNsaWVudDtcbiAgICB0aGlzLmNsaWVudCA9IG9wdGlvbnMuY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX0sIHJlc29sdmluZyBgfmAgcm9vdHMgdmlhIHRoZVxuICAgKiB3b3Jrc3BhY2UgY3VycmVudCB1c2VyIHdoZW4gbmVlZGVkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBEYXRhYnJpY2tzRmlsZVN5c3RlbU9wdGlvbnMpOiBQcm9taXNlPERhdGFicmlja3NGaWxlU3lzdGVtPiB7XG4gICAgaWYgKCFpc0hvbWVSZWxhdGl2ZVBhdGgob3B0aW9ucy5yb290KSB8fCBvcHRpb25zLnVzZXJOYW1lPy50cmltKCkpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0ob3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IGNsaWVudCA9IG9wdGlvbnMuY2xpZW50ID8/IChhd2FpdCBnZXRXb3Jrc3BhY2VDbGllbnQoKSk7XG4gICAgY29uc3Qgcm9vdCA9IGF3YWl0IHJlc29sdmVEYXRhYnJpY2tzUm9vdChvcHRpb25zLnJvb3QsIHsgY2xpZW50IH0pO1xuICAgIHJldHVybiBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oeyAuLi5vcHRpb25zLCByb290LCBjbGllbnQgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgb25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2xpZW50ID0gdGhpcy5jbGllbnRPcHRpb24gPz8gKGF3YWl0IGdldFdvcmtzcGFjZUNsaWVudCgpKTtcbiAgfVxuXG4gIC8qKiBSdW4gdGhlIGhhbmRsZXIgZm9yIGBhYnNvbHV0ZVBhdGhgJ3MgRGF0YWJyaWNrcyBBUEkgd2l0aCB0aGUgbGl2ZSBjbGllbnQuICovXG4gIHByaXZhdGUgZGlzcGF0Y2g8VD4oYWJzb2x1dGVQYXRoOiBzdHJpbmcsIGhhbmRsZXJzOiBCYWNrZW5kSGFuZGxlcnM8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIXRoaXMuY2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFxuICAgICAgICBcIklPX0VSUk9SXCIsXG4gICAgICAgIFwiRGF0YWJyaWNrcyBmaWxlc3lzdGVtIGlzIG5vdCBpbml0aWFsaXplZCAobm8gV29ya3NwYWNlQ2xpZW50KVwiLFxuICAgICAgICBhYnNvbHV0ZVBhdGgsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlcnNbcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQoYWJzb2x1dGVQYXRoKV0odGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gIC8qIFByaW1pdGl2ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlUm9vdERpcmVjdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZURpcmVjdG9yeUF0KHRoaXMucm9vdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcmVhZEJ5dGVzQXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBidWZmZXIgPSBhd2FpdCB0aGlzLmRpc3BhdGNoPEJ1ZmZlcj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiB0aGlzLnJlYWREYmZzRmlsZShjbGllbnQsIHJlc29sdmVkUGF0aCksXG4gICAgICB3b3Jrc3BhY2U6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQud29ya3NwYWNlLmV4cG9ydCh7IHBhdGg6IHJlc29sdmVkUGF0aCwgZm9ybWF0OiBcIkFVVE9cIiB9KTtcbiAgICAgICAgcmV0dXJuIGRlY29kZUJhc2U2NChyZXNwb25zZS5jb250ZW50KTtcbiAgICAgIH0sXG4gICAgICB2b2x1bWVzOiBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmZpbGVzLmRvd25sb2FkKHsgZmlsZV9wYXRoOiByZXNvbHZlZFBhdGggfSk7XG4gICAgICAgIHJldHVybiByZWFkUmVzcG9uc2VCb2R5KFxuICAgICAgICAgIHJlc3BvbnNlLmNvbnRlbnRzIGFzIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShidWZmZXIuYnVmZmVyLCBidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHdyaXRlQnl0ZXNBdChcbiAgICByZXNvbHZlZFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50OiBVaW50OEFycmF5LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFdyaXRlRmlsZU9wdGlvbnM+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShjb250ZW50KTtcbiAgICBjb25zdCBvdmVyd3JpdGUgPSBvcHRpb25zLm92ZXJ3cml0ZTtcbiAgICBhd2FpdCB0aGlzLmRpc3BhdGNoPHVua25vd24+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogKGNsaWVudCkgPT4gdGhpcy53cml0ZURiZnNGaWxlKGNsaWVudCwgcmVzb2x2ZWRQYXRoLCBidWZmZXIsIG92ZXJ3cml0ZSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+XG4gICAgICAgIGNsaWVudC53b3Jrc3BhY2UuaW1wb3J0KHtcbiAgICAgICAgICBwYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgICAgZm9ybWF0OiBcIkFVVE9cIixcbiAgICAgICAgICBjb250ZW50OiBidWZmZXIudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgICB9KSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+XG4gICAgICAgIGNsaWVudC5maWxlcy51cGxvYWQoe1xuICAgICAgICAgIGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgIGNvbnRlbnRzOiBidWZmZXJUb1JlYWRhYmxlU3RyZWFtKGJ1ZmZlcikgYXMgbmV2ZXIsXG4gICAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVGaWxlQXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3BhdGNoPHVua25vd24+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogKGNsaWVudCkgPT4gY2xpZW50LmRiZnMuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PiBjbGllbnQud29ya3NwYWNlLmRlbGV0ZSh7IHBhdGg6IHJlc29sdmVkUGF0aCwgcmVjdXJzaXZlOiBmYWxzZSB9KSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+IGNsaWVudC5maWxlcy5kZWxldGUoeyBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PiBjbGllbnQuZGJmcy5ta2RpcnMoeyBwYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+IGNsaWVudC53b3Jrc3BhY2UubWtkaXJzKHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT4gdGhpcy5jcmVhdGVWb2x1bWVEaXJlY3RvcmllcyhjbGllbnQsIHJlc29sdmVkUGF0aCksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcmVtb3ZlRGlyZWN0b3J5QXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3BhdGNoPHVua25vd24+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogKGNsaWVudCkgPT4gY2xpZW50LmRiZnMuZGVsZXRlKHsgcGF0aDogcmVzb2x2ZWRQYXRoLCByZWN1cnNpdmU6IGZhbHNlIH0pLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PiBjbGllbnQud29ya3NwYWNlLmRlbGV0ZSh7IHBhdGg6IHJlc29sdmVkUGF0aCwgcmVjdXJzaXZlOiBmYWxzZSB9KSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+IGNsaWVudC5maWxlcy5kZWxldGVEaXJlY3RvcnkoeyBkaXJlY3RvcnlfcGF0aDogcmVzb2x2ZWRQYXRoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGxpc3REaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8RmlsZUVudHJ5W10+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaDxGaWxlRW50cnlbXT4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PlxuICAgICAgICBjb2xsZWN0KGNsaWVudC5kYmZzLmxpc3QoeyBwYXRoOiByZXNvbHZlZFBhdGggfSksIChpbmZvKSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHBvc2l4UGF0aC5iYXNlbmFtZShpbmZvLnBhdGggPz8gXCJcIiksXG4gICAgICAgICAgdHlwZTogaW5mby5pc19kaXIgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICAgICAgc2l6ZTogaW5mby5maWxlX3NpemUsXG4gICAgICAgIH0pKSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT5cbiAgICAgICAgY29sbGVjdChjbGllbnQud29ya3NwYWNlLmxpc3QoeyBwYXRoOiByZXNvbHZlZFBhdGggfSksIChpbmZvKSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHBvc2l4UGF0aC5iYXNlbmFtZShpbmZvLnBhdGggPz8gXCJcIiksXG4gICAgICAgICAgdHlwZTogaW5mby5vYmplY3RfdHlwZSA9PT0gXCJESVJFQ1RPUllcIiA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgfSkpLFxuICAgICAgdm9sdW1lczogKGNsaWVudCkgPT5cbiAgICAgICAgY29sbGVjdChjbGllbnQuZmlsZXMubGlzdERpcmVjdG9yeUNvbnRlbnRzKHsgZGlyZWN0b3J5X3BhdGg6IHJlc29sdmVkUGF0aCB9KSwgKGVudHJ5KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUgPz8gcG9zaXhQYXRoLmJhc2VuYW1lKGVudHJ5LnBhdGggPz8gXCJcIiksXG4gICAgICAgICAgdHlwZTogZW50cnkuaXNfZGlyZWN0b3J5ID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIHNpemU6IGVudHJ5LmZpbGVfc2l6ZSxcbiAgICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHN0YXRBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PiB7XG4gICAgY29uc3QgZmFsbGJhY2tOYW1lID0gcG9zaXhQYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCkgfHwgcG9zaXhQYXRoLmJhc2VuYW1lKHRoaXMucm9vdCk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2g8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC5kYmZzLmdldFN0YXR1cyh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KTtcbiAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBvYmplY3QudG9EYXRlKGluZm8ubW9kaWZpY2F0aW9uX3RpbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHBvc2l4UGF0aC5iYXNlbmFtZShpbmZvLnBhdGggPz8gcmVzb2x2ZWRQYXRoKSB8fCBmYWxsYmFja05hbWUsXG4gICAgICAgICAgdHlwZTogaW5mby5pc19kaXIgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICAgICAgc2l6ZTogaW5mby5maWxlX3NpemUsXG4gICAgICAgICAgY3JlYXRlZEF0OiBtb2RpZmllZCxcbiAgICAgICAgICBtb2RpZmllZEF0OiBtb2RpZmllZCxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB3b3Jrc3BhY2U6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2UuZ2V0U3RhdHVzKHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHBvc2l4UGF0aC5iYXNlbmFtZShpbmZvLnBhdGggPz8gcmVzb2x2ZWRQYXRoKSB8fCBmYWxsYmFja05hbWUsXG4gICAgICAgICAgdHlwZTogaW5mby5vYmplY3RfdHlwZSA9PT0gXCJESVJFQ1RPUllcIiA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBjcmVhdGVkQXQ6IG9iamVjdC50b0RhdGUoaW5mby5jcmVhdGVkX2F0KSxcbiAgICAgICAgICBtb2RpZmllZEF0OiBvYmplY3QudG9EYXRlKGluZm8ubW9kaWZpZWRfYXQpLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+IHRoaXMuc3RhdFZvbHVtZVBhdGgoY2xpZW50LCByZXNvbHZlZFBhdGgsIGZhbGxiYWNrTmFtZSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdHJ5TW92ZUZpbGVBdChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcsXG4gICAgX29wdGlvbnM6IFJlcXVpcmVkPENvcHlPcHRpb25zPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gT25seSBEQkZTIGV4cG9zZXMgYSBzZXJ2ZXItc2lkZSBtb3ZlOyBldmVyeXRoaW5nIGVsc2UgZmFsbHMgYmFjayB0byB0aGVcbiAgICAvLyBwb3J0YWJsZSBjb3B5ICsgZGVsZXRlIGluIEJhc2VGaWxlU3lzdGVtLlxuICAgIGlmIChcbiAgICAgIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKHNvdXJjZVBhdGgpICE9PSBcImRiZnNcIiB8fFxuICAgICAgcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQoZGVzdGluYXRpb25QYXRoKSAhPT0gXCJkYmZzXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihzb3VyY2VQYXRoLCB7XG4gICAgICBkYmZzOiAoY2xpZW50KSA9PlxuICAgICAgICBjbGllbnQuZGJmcy5tb3ZlKHsgc291cmNlX3BhdGg6IHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uX3BhdGg6IGRlc3RpbmF0aW9uUGF0aCB9KSxcbiAgICAgIHdvcmtzcGFjZTogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgICAgdm9sdW1lczogdW5yZWFjaGFibGVCYWNrZW5kLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gIC8qIEJhY2tlbmQtc3BlY2lmaWMgSS9PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAvKipcbiAgICogVUMgYGNyZWF0ZURpcmVjdG9yeWAgaXMgc2luZ2xlLWxldmVsLCBzbyB3YWxrIHRoZSBwYXRoIGNyZWF0aW5nIGVhY2ggbGV2ZWxcbiAgICogYmVsb3cgdGhlIHZvbHVtZSBpdHNlbGYuIEEgbGV2ZWwgdGhhdCBhbHJlYWR5IGV4aXN0cyBpcyBub3QgYW4gZXJyb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVZvbHVtZURpcmVjdG9yaWVzKFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICAgIGFic29sdXRlUGF0aDogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJ0cyA9IGFic29sdXRlUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBjdXJyZW50ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50ID0gYCR7Y3VycmVudH0vJHtwYXJ0c1tpXX1gO1xuICAgICAgaWYgKGkgPCBWT0xVTUVfUk9PVF9ERVBUSCkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGllbnQuZmlsZXMuY3JlYXRlRGlyZWN0b3J5KHsgZGlyZWN0b3J5X3BhdGg6IGN1cnJlbnQgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBwcmVzZW50IGlzIGZpbmU7IGFueXRoaW5nIGVsc2UgaXMgYSByZWFsIGZhaWx1cmUuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2xpZW50LmZpbGVzLmdldERpcmVjdG9yeU1ldGFkYXRhKHsgZGlyZWN0b3J5X3BhdGg6IGN1cnJlbnQgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBTdGF0IGEgVUMgcGF0aDogZmlsZSBtZXRhZGF0YSBmaXJzdCwgdGhlbiBhIGRpcmVjdG9yeSBwcm9iZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzdGF0Vm9sdW1lUGF0aChcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgICBhYnNvbHV0ZVBhdGg6IHN0cmluZyxcbiAgICBmYWxsYmFja05hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxPbWl0PEZpbGVTdGF0LCBcInBhdGhcIj4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBjbGllbnQuZmlsZXMuZ2V0TWV0YWRhdGEoeyBmaWxlX3BhdGg6IGFic29sdXRlUGF0aCB9KTtcbiAgICAgIGNvbnN0IG1vZGlmaWVkID0gb2JqZWN0LnRvRGF0ZShtZXRhZGF0YVtcImxhc3QtbW9kaWZpZWRcIl0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZmFsbGJhY2tOYW1lLFxuICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgc2l6ZTogTnVtYmVyKG1ldGFkYXRhW1wiY29udGVudC1sZW5ndGhcIl0gPz8gMCksXG4gICAgICAgIGNyZWF0ZWRBdDogbW9kaWZpZWQsXG4gICAgICAgIG1vZGlmaWVkQXQ6IG1vZGlmaWVkLFxuICAgICAgICBtaW1lVHlwZTogbWV0YWRhdGFbXCJjb250ZW50LXR5cGVcIl0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGZpbGVFcnIpIHtcbiAgICAgIC8vIEEgZGlyZWN0b3J5IGhhcyBubyBmaWxlIG1ldGFkYXRhLCBhbmQgYW4gdW5yZWFkYWJsZSBvbmUgcmVwb3J0cyBhc1xuICAgICAgLy8gbWlzc2luZyAvIGRlbmllZCAtIGJvdGggYXJlIHdvcnRoIGEgZGlyZWN0b3J5IHByb2JlIGJlZm9yZSBmYWlsaW5nLlxuICAgICAgY29uc3QgY29kZSA9IGJhc2VGUy5tYXBGaWxlU3lzdGVtRXJyb3IoZmlsZUVyciwgYWJzb2x1dGVQYXRoKS5jb2RlO1xuICAgICAgaWYgKGNvZGUgIT09IFwiTk9UX0ZPVU5EXCIgJiYgY29kZSAhPT0gXCJQRVJNSVNTSU9OX0RFTklFRFwiKSB0aHJvdyBmaWxlRXJyO1xuICAgICAgYXdhaXQgY2xpZW50LmZpbGVzLmdldERpcmVjdG9yeU1ldGFkYXRhKHsgZGlyZWN0b3J5X3BhdGg6IGFic29sdXRlUGF0aCB9KTtcbiAgICAgIHJldHVybiB7IG5hbWU6IGZhbGxiYWNrTmFtZSwgdHlwZTogXCJkaXJlY3RvcnlcIiB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZERiZnNGaWxlKGNsaWVudDogV29ya3NwYWNlQ2xpZW50LCBhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5kYmZzLnJlYWQoe1xuICAgICAgICBwYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgbGVuZ3RoOiBEQkZTX1JFQURfQ0hVTktfQllURVMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNodW5rID0gZGVjb2RlQmFzZTY0KHJlc3BvbnNlLmRhdGEpO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA8IERCRlNfUkVBRF9DSFVOS19CWVRFUykgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlRGJmc0ZpbGUoXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICAgYWJzb2x1dGVQYXRoOiBzdHJpbmcsXG4gICAgYnVmZmVyOiBCdWZmZXIsXG4gICAgb3ZlcndyaXRlOiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA8PSBEQkZTX1BVVF9NQVhfQllURVMpIHtcbiAgICAgIGF3YWl0IGNsaWVudC5kYmZzLnB1dCh7XG4gICAgICAgIHBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgICAgY29udGVudHM6IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBjbGllbnQuZGJmcy5jcmVhdGUoeyBwYXRoOiBhYnNvbHV0ZVBhdGgsIG92ZXJ3cml0ZSB9KTtcbiAgICBjb25zdCBoYW5kbGUgPSBjcmVhdGVkLmhhbmRsZTtcbiAgICBpZiAoaGFuZGxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXCJJT19FUlJPUlwiLCBcIkRCRlMgdXBsb2FkIGhhbmRsZSBtaXNzaW5nXCIsIGFic29sdXRlUGF0aCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBidWZmZXIubGVuZ3RoOyBvZmZzZXQgKz0gREJGU19QVVRfTUFYX0JZVEVTKSB7XG4gICAgICAgIGNvbnN0IHNsaWNlID0gYnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgREJGU19QVVRfTUFYX0JZVEVTKTtcbiAgICAgICAgYXdhaXQgY2xpZW50LmRiZnMuYWRkQmxvY2soeyBoYW5kbGUsIGRhdGE6IHNsaWNlLnRvU3RyaW5nKFwiYmFzZTY0XCIpIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXdhaXQgY2xpZW50LmRiZnMuY2xvc2UoeyBoYW5kbGUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgYXdhaXQgY2xpZW50LmRiZnMuY2xvc2UoeyBoYW5kbGUgfSk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBEcmFpbiBhbiBTREsgYXN5bmMgaXRlcmFibGUgaW50byBhIG1hcHBlZCBhcnJheS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3Q8UywgVD4oc291cmNlOiBBc3luY0l0ZXJhYmxlPFM+LCBtYXA6IChpdGVtOiBTKSA9PiBUKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgaXRlbXM6IFRbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2Ygc291cmNlKSBpdGVtcy5wdXNoKG1hcChpdGVtKSk7XG4gIHJldHVybiBpdGVtcztcbn1cblxuLyoqIEhhbmRsZXIgZm9yIGEgYmFja2VuZCBhIGNhbGwgc2l0ZSBoYXMgYWxyZWFkeSBydWxlZCBvdXQuICovXG5mdW5jdGlvbiB1bnJlYWNoYWJsZUJhY2tlbmQoKTogUHJvbWlzZTxuZXZlcj4ge1xuICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFwiTk9UX1NVUFBPUlRFRFwiLCBcIlVuc3VwcG9ydGVkIERhdGFicmlja3MgYmFja2VuZCBmb3IgdGhpcyBvcGVyYXRpb25cIik7XG59XG5cbmZ1bmN0aW9uIGRlY29kZUJhc2U2NChkYXRhOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdWZmZXIge1xuICBpZiAoIWRhdGEpIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbShkYXRhLCBcImJhc2U2NFwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFJlc3BvbnNlQm9keShcbiAgY29udGVudHM6IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBpZiAoIWNvbnRlbnRzKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICBjb25zdCByZWFkZXIgPSBjb250ZW50cy5nZXRSZWFkZXIoKTtcbiAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSBicmVhaztcbiAgICBpZiAodmFsdWUpIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MubWFwKChjaHVuaykgPT4gQnVmZmVyLmZyb20oY2h1bmspKSk7XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlclRvUmVhZGFibGVTdHJlYW0oYnVmZmVyOiBCdWZmZXIpOiBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
@@ -11,7 +11,7 @@
11
11
  * @module
12
12
  */
13
13
  import { posixPath } from "@dbx-tools/shared-fs";
14
- import { type WorkspaceClient } from "./workspace.ts";
14
+ import { type WorkspaceClient } from "./workspace-client.ts";
15
15
  /** Which Databricks Files API serves an absolute path. */
16
16
  export type DatabricksFilesBackend = "workspace" | "volumes" | "dbfs";
17
17
  /** Options for synchronous {@link normalizeDatabricksRoot}. */
@@ -11,7 +11,7 @@
11
11
  * @module
12
12
  */
13
13
  import { posixPath } from "@dbx-tools/shared-fs";
14
- import { getCurrentUserName } from "./workspace.js";
14
+ import { getCurrentUserName } from "./workspace-client.js";
15
15
  /** `catalog.schema.volume` (no slashes, exactly three dotted segments). */
16
16
  const VOLUME_THREE_PART = /^([^.\/\s]+)\.([^.\/\s]+)\.([^.\/\s]+)$/;
17
17
  /** True when {@link input} is `~` or a path under `~/`. See {@link posixPath.isHomeRelativePath}. */
@@ -110,4 +110,4 @@ export function resolveDatabricksFilesBackend(absolutePath) {
110
110
  // Default: UC Files API (covers unusual absolute roots under the workspace host).
111
111
  return "volumes";
112
112
  }
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1wYXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFicmlja3MtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFLMUUsMkVBQTJFO0FBQzNFLE1BQU0saUJBQWlCLEdBQUcseUNBQXlDLENBQUM7QUFtQnBFLHFHQUFxRztBQUNyRyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBZ0I7SUFDNUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxTQUFTLENBQUMseURBQXlELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixVQUEwQyxFQUFFO0lBRTVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksU0FBUyxDQUFDLDRD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Q0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsWUFBb0I7SUFDaEUsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDNUMsSUFBSSxvQkFBb0IsQ0FBQyxZQUFZLENBQUM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUMzRCxJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRCxrRkFBa0Y7SUFDbEYsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyBwYXRoIHJlY29nbml0aW9uIGFuZCBub3JtYWxpemF0aW9uIGZvciB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19LlxuICpcbiAqIFJvb3RzIG1heSBiZSB3cml0dGVuIGFzOlxuICogLSBVbml0eSBDYXRhbG9nIHZvbHVtZTogYC9Wb2x1bWVzL2NhdGFsb2cvc2NoZW1hL3ZvbHVtZWAgKGFsc28gYWNjZXB0cyBgL1ZvbHVtZS8uLi5gKVxuICogLSBUaHJlZS1wYXJ0IHZvbHVtZSBpZDogYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWAg4oaSIGAvVm9sdW1lcy9jYXRhbG9nL3NjaGVtYS92b2x1bWVgXG4gKiAtIEhvbWUgc2hvcnRoYW5kOiBgfmAgLyBgfi8uLi5gIOKGkiBgL1dvcmtzcGFjZS9Vc2Vycy88dXNlck5hbWU+Ly4uLmBcbiAqIC0gV29ya3NwYWNlIHRyZWU6IGAvV29ya3NwYWNlLy4uLmAsIGAvVXNlcnMvLi4uYCwgYC9SZXBvcy8uLi5gLCBgL1NoYXJlZC8uLi5gXG4gKiAtIERCRlM6IGAvZGJmcy8uLi5gXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBvc2l4UGF0aCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFVzZXJOYW1lLCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCIuL3dvcmtzcGFjZS50c1wiO1xuXG4vKiogV2hpY2ggRGF0YWJyaWNrcyBGaWxlcyBBUEkgc2VydmVzIGFuIGFic29sdXRlIHBhdGguICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzRmlsZXNCYWNrZW5kID0gXCJ3b3Jrc3BhY2VcIiB8IFwidm9sdW1lc1wiIHwgXCJkYmZzXCI7XG5cbi8qKiBgY2F0YWxvZy5zY2hlbWEudm9sdW1lYCAobm8gc2xhc2hlcywgZXhhY3RseSB0aHJlZSBkb3R0ZWQgc2VnbWVudHMpLiAqL1xuY29uc3QgVk9MVU1FX1RIUkVFX1BBUlQgPSAvXihbXi5cXC9cXHNdKylcXC4oW14uXFwvXFxzXSspXFwuKFteLlxcL1xcc10rKSQvO1xuXG4vKiogT3B0aW9ucyBmb3Igc3luY2hyb25vdXMge0BsaW5rIG5vcm1hbGl6ZURhdGFicmlja3NSb290fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplRGF0YWJyaWNrc1Jvb3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVzZXJuYW1lIHVzZWQgdG8gZXhwYW5kIGB+YCDihpIgYC9Xb3Jrc3BhY2UvVXNlcnMvPHVzZXJOYW1lPmAuXG4gICAqIFJlcXVpcmVkIHdoZW4ge0BsaW5rIHJvb3R9IGlzIGB+YCBvciBgfi8uLi5gLiBQcmVmZXJcbiAgICoge0BsaW5rIHJlc29sdmVEYXRhYnJpY2tzUm9vdH0gd2hlbiB0aGUgbmFtZSBzaG91bGQgY29tZSBmcm9tIHRoZSB3b3Jrc3BhY2VcbiAgICogY2xpZW50LlxuICAgKi9cbiAgdXNlck5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKiBPcHRpb25zIGZvciBhc3luYyB7QGxpbmsgcmVzb2x2ZURhdGFicmlja3NSb290fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZURhdGFicmlja3NSb290T3B0aW9ucyB7XG4gIC8qKiBDbGllbnQgdXNlZCB0byByZXNvbHZlIHRoZSBjdXJyZW50IHVzZXJuYW1lIGZvciBgfmAgZXhwYW5zaW9uLiAqL1xuICBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQ7XG59XG5cbi8qKiBUcnVlIHdoZW4ge0BsaW5rIGlucHV0fSBpcyBgfmAgb3IgYSBwYXRoIHVuZGVyIGB+L2AuIFNlZSB7QGxpbmsgcG9zaXhQYXRoLmlzSG9tZVJlbGF0aXZlUGF0aH0uICovXG5leHBvcnQgY29uc3QgaXNIb21lUmVsYXRpdmVQYXRoID0gcG9zaXhQYXRoLmlzSG9tZVJlbGF0aXZlUGF0aDtcblxuLyoqXG4gKiBFeHBhbmQgYH5gIC8gYH4vLi4uYCB0byBgL1dvcmtzcGFjZS9Vc2Vycy88dXNlck5hbWU+Ly4uLmAuXG4gKiBOb24taG9tZSBpbnB1dHMgYXJlIHJldHVybmVkIHVuY2hhbmdlZCAoUE9TSVggc2VwYXJhdG9ycyBvbmx5KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZEhvbWVQYXRoKGlucHV0OiBzdHJpbmcsIHVzZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBuYW1lID0gdXNlck5hbWUudHJpbSgpO1xuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGF0YWJyaWNrcyBob21lIGV4cGFuc2lvbiByZXF1aXJlcyBhIG5vbi1lbXB0eSB1c2VyTmFtZVwiKTtcbiAgfVxuICBpZiAoIWlzSG9tZVJlbGF0aXZlUGF0aChpbnB1dCkpIHtcbiAgICByZXR1cm4gcG9zaXhQYXRoLnRvUG9zaXgoaW5wdXQudHJpbSgpKTtcbiAgfVxuICByZXR1cm4gcG9zaXhQYXRoLmV4cGFuZEhvbWUoaW5wdXQsIGAvV29ya3NwYWNlL1VzZXJzLyR7bmFtZX1gKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYSBEYXRhYnJpY2tzIGZpbGVzeXN0ZW0gcm9vdCB0byBhbiBhYnNvbHV0ZSBQT1NJWCBwYXRoLlxuICpcbiAqIC0gYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWAg4oaSIGAvVm9sdW1lcy9jYXRhbG9nL3NjaGVtYS92b2x1bWVgXG4gKiAtIGAvVm9sdW1lLy4uLmAg4oaSIGAvVm9sdW1lcy8uLi5gIChzaW5ndWxhciB0eXBvIC8gc2hvcnRoYW5kKVxuICogLSBgfmAgLyBgfi8uLi5gIOKGkiBgL1dvcmtzcGFjZS9Vc2Vycy88dXNlck5hbWU+Ly4uLmAgKG5lZWRzIHtAbGluayBOb3JtYWxpemVEYXRhYnJpY2tzUm9vdE9wdGlvbnMudXNlck5hbWV9KVxuICogLSBzdHJpcHMgdHJhaWxpbmcgc2xhc2hlcyAoZXhjZXB0IGAvYClcbiAqXG4gKiBGb3IgYH5gIHdpdGhvdXQgYSBrbm93biB1c2VybmFtZSwgdXNlIHtAbGluayByZXNvbHZlRGF0YWJyaWNrc1Jvb3R9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3QoXG4gIHJvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogTm9ybWFsaXplRGF0YWJyaWNrc1Jvb3RPcHRpb25zID0ge30sXG4pOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gcm9vdC50cmltKCk7XG4gIGlmICghdHJpbW1lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEYXRhYnJpY2tzIGZpbGVzeXN0ZW0gcm9vdCBjYW5ub3QgYmUgZW1wdHlcIik7XG4gIH1cblxuICBpZiAoaXNIb21lUmVsYXRpdmVQYXRoKHRyaW1tZWQpKSB7XG4gICAgaWYgKCFvcHRpb25zLnVzZXJOYW1lPy50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBEYXRhYnJpY2tzIGhvbWUgcGF0aCBcIiR7cm9vdH1cIiByZXF1aXJlcyB1c2VyTmFtZTsgdXNlIHJlc29sdmVEYXRhYnJpY2tzUm9vdCgpIG9yIHBhc3MgdXNlck5hbWVgLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l4UGF0aC5ub3JtYWxpemVSb290KGV4cGFuZEhvbWVQYXRoKHRyaW1tZWQsIG9wdGlvbnMudXNlck5hbWUpKTtcbiAgfVxuXG4gIGNvbnN0IHRocmVlUGFydCA9IFZPTFVNRV9USFJFRV9QQVJULmV4ZWModHJpbW1lZCk7XG4gIGlmICh0aHJlZVBhcnQpIHtcbiAgICByZXR1cm4gcG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3QoYC9Wb2x1bWVzLyR7dGhyZWVQYXJ0WzFdfS8ke3RocmVlUGFydFsyXX0vJHt0aHJlZVBhcnRbM119YCk7XG4gIH1cblxuICBsZXQgcG9zaXggPSBwb3NpeFBhdGgudG9Qb3NpeCh0cmltbWVkKTtcbiAgaWYgKHBvc2l4ID09PSBcIi9Wb2x1bWVcIiB8fCBwb3NpeC5zdGFydHNXaXRoKFwiL1ZvbHVtZS9cIikpIHtcbiAgICBwb3NpeCA9IGAvVm9sdW1lcyR7cG9zaXguc2xpY2UoXCIvVm9sdW1lXCIubGVuZ3RoKX1gO1xuICB9XG5cbiAgaWYgKCFwb3NpeFBhdGguaXNBYnNvbHV0ZShwb3NpeCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgYERhdGFicmlja3MgZmlsZXN5c3RlbSByb290IG11c3QgYmUgYWJzb2x1dGUsIGNhdGFsb2cuc2NoZW1hLnZvbHVtZSwgb3IgfiwgZ290OiAke3Jvb3R9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHBvc2l4UGF0aC5ub3JtYWxpemVSb290KHBvc2l4KTtcbn1cblxuLyoqXG4gKiBMaWtlIHtAbGluayBub3JtYWxpemVEYXRhYnJpY2tzUm9vdH0sIGJ1dCByZXNvbHZlcyBgfmAgdmlhXG4gKiB7QGxpbmsgZ2V0Q3VycmVudFVzZXJOYW1lfSAoQXBwS2l0IGNvbnRleHQgdXNlciwgZWxzZSBgY3VycmVudFVzZXIubWUoKWApLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NSb290KFxuICByb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVEYXRhYnJpY2tzUm9vdE9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmICghaXNIb21lUmVsYXRpdmVQYXRoKHJvb3QpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZURhdGFicmlja3NSb290KHJvb3QpO1xuICB9XG4gIGNvbnN0IHVzZXJOYW1lID0gYXdhaXQgZ2V0Q3VycmVudFVzZXJOYW1lKG9wdGlvbnMuY2xpZW50KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZURhdGFicmlja3NSb290KHJvb3QsIHsgdXNlck5hbWUgfSk7XG59XG5cbi8qKiBUcnVlIHdoZW4ge0BsaW5rIGFic29sdXRlUGF0aH0gaXMgc2VydmVkIGJ5IHRoZSB3b3Jrc3BhY2Ugb2JqZWN0cyBBUEkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXb3Jrc3BhY2VGaWxlc1BhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHBvc2l4UGF0aC50b1Bvc2l4KGFic29sdXRlUGF0aCk7XG4gIHJldHVybiAoXG4gICAgcCA9PT0gXCIvV29ya3NwYWNlXCIgfHxcbiAgICBwLnN0YXJ0c1dpdGgoXCIvV29ya3NwYWNlL1wiKSB8fFxuICAgIHAuc3RhcnRzV2l0aChcIi9Vc2Vycy9cIikgfHxcbiAgICBwLnN0YXJ0c1dpdGgoXCIvUmVwb3MvXCIpIHx8XG4gICAgcC5zdGFydHNXaXRoKFwiL1NoYXJlZC9cIilcbiAgKTtcbn1cblxuLyoqIFRydWUgd2hlbiB7QGxpbmsgYWJzb2x1dGVQYXRofSBpcyBhIFVuaXR5IENhdGFsb2cgdm9sdW1lIHBhdGguICovXG5leHBvcnQgZnVuY3Rpb24gaXNWb2x1bWVzUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwID0gcG9zaXhQYXRoLnRvUG9zaXgoYWJzb2x1dGVQYXRoKTtcbiAgcmV0dXJuIHAgPT09IFwiL1ZvbHVtZXNcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvVm9sdW1lcy9cIik7XG59XG5cbi8qKiBUcnVlIHdoZW4ge0BsaW5rIGFic29sdXRlUGF0aH0gaXMgYSBEQkZTIHBhdGguICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYmZzUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwID0gcG9zaXhQYXRoLnRvUG9zaXgoYWJzb2x1dGVQYXRoKTtcbiAgcmV0dXJuIHAgPT09IFwiL2RiZnNcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvZGJmcy9cIik7XG59XG5cbi8qKlxuICogUGljayB0aGUgRGF0YWJyaWNrcyBBUEkgYmFja2VuZCBmb3IgYW4gYWJzb2x1dGUgcGF0aC5cbiAqXG4gKiBWb2x1bWUgdGhyZWUtcGFydCByb290cyBhcmUgbm9ybWFsaXplZCBiZWZvcmUgdGhpcyBydW5zLCBzbyBjYWxsZXJzIHNob3VsZFxuICogcGFzcyBwYXRocyBmcm9tIHtAbGluayBub3JtYWxpemVEYXRhYnJpY2tzUm9vdH0gLyB7QGxpbmsgQmFzZUZpbGVTeXN0ZW0ucmVzb2x2ZVBhdGh9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBEYXRhYnJpY2tzRmlsZXNCYWNrZW5kIHtcbiAgaWYgKGlzRGJmc1BhdGgoYWJzb2x1dGVQYXRoKSkgcmV0dXJuIFwiZGJmc1wiO1xuICBpZiAoaXNXb3Jrc3BhY2VGaWxlc1BhdGgoYWJzb2x1dGVQYXRoKSkgcmV0dXJuIFwid29ya3NwYWNlXCI7XG4gIGlmIChpc1ZvbHVtZXNQYXRoKGFic29sdXRlUGF0aCkpIHJldHVybiBcInZvbHVtZXNcIjtcbiAgLy8gRGVmYXVsdDogVUMgRmlsZXMgQVBJIChjb3ZlcnMgdW51c3VhbCBhYnNvbHV0ZSByb290cyB1bmRlciB0aGUgd29ya3NwYWNlIGhvc3QpLlxuICByZXR1cm4gXCJ2b2x1bWVzXCI7XG59XG4iXX0=
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1wYXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFicmlja3MtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQXdCLE1BQU0sdUJBQXVCLENBQUM7QUFLakYsMkVBQTJFO0FBQzNFLE1BQU0saUJBQWlCLEdBQUcseUNBQXlDLENBQUM7QUFtQnBFLHFHQUFxRztBQUNyRyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBZ0I7SUFDNUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxTQUFTLENBQUMseURBQXlELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixVQUEwQyxFQUFFO0lBRTVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksU0FBUyxDQUFDLDRD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Q0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsWUFBb0I7SUFDaEUsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDNUMsSUFBSSxvQkFBb0IsQ0FBQyxZQUFZLENBQUM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUMzRCxJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRCxrRkFBa0Y7SUFDbEYsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyBwYXRoIHJlY29nbml0aW9uIGFuZCBub3JtYWxpemF0aW9uIGZvciB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19LlxuICpcbiAqIFJvb3RzIG1heSBiZSB3cml0dGVuIGFzOlxuICogLSBVbml0eSBDYXRhbG9nIHZvbHVtZTogYC9Wb2x1bWVzL2NhdGFsb2cvc2NoZW1hL3ZvbHVtZWAgKGFsc28gYWNjZXB0cyBgL1ZvbHVtZS8uLi5gKVxuICogLSBUaHJlZS1wYXJ0IHZvbHVtZSBpZDogYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWAg4oaSIGAvVm9sdW1lcy9jYXRhbG9nL3NjaGVtYS92b2x1bWVgXG4gKiAtIEhvbWUgc2hvcnRoYW5kOiBgfmAgLyBgfi8uLi5gIOKGkiBgL1dvcmtzcGFjZS9Vc2Vycy88dXNlck5hbWU+Ly4uLmBcbiAqIC0gV29ya3NwYWNlIHRyZWU6IGAvV29ya3NwYWNlLy4uLmAsIGAvVXNlcnMvLi4uYCwgYC9SZXBvcy8uLi5gLCBgL1NoYXJlZC8uLi5gXG4gKiAtIERCRlM6IGAvZGJmcy8uLi5gXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBvc2l4UGF0aCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFVzZXJOYW1lLCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCIuL3dvcmtzcGFjZS1jbGllbnQudHNcIjtcblxuLyoqIFdoaWNoIERhdGFicmlja3MgRmlsZXMgQVBJIHNlcnZlcyBhbiBhYnNvbHV0ZSBwYXRoLiAqL1xuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCA9IFwid29ya3NwYWNlXCIgfCBcInZvbHVtZXNcIiB8IFwiZGJmc1wiO1xuXG4vKiogYGNhdGFsb2cuc2NoZW1hLnZvbHVtZWAgKG5vIHNsYXNoZXMsIGV4YWN0bHkgdGhyZWUgZG90dGVkIHNlZ21lbnRzKS4gKi9cbmNvbnN0IFZPTFVNRV9USFJFRV9QQVJUID0gL14oW14uXFwvXFxzXSspXFwuKFteLlxcL1xcc10rKVxcLihbXi5cXC9cXHNdKykkLztcblxuLyoqIE9wdGlvbnMgZm9yIHN5bmNocm9ub3VzIHtAbGluayBub3JtYWxpemVEYXRhYnJpY2tzUm9vdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZURhdGFicmlja3NSb290T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVc2VybmFtZSB1c2VkIHRvIGV4cGFuZCBgfmAg4oaSIGAvV29ya3NwYWNlL1VzZXJzLzx1c2VyTmFtZT5gLlxuICAgKiBSZXF1aXJlZCB3aGVuIHtAbGluayByb290fSBpcyBgfmAgb3IgYH4vLi4uYC4gUHJlZmVyXG4gICAqIHtAbGluayByZXNvbHZlRGF0YWJyaWNrc1Jvb3R9IHdoZW4gdGhlIG5hbWUgc2hvdWxkIGNvbWUgZnJvbSB0aGUgd29ya3NwYWNlXG4gICAqIGNsaWVudC5cbiAgICovXG4gIHVzZXJOYW1lPzogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgYXN5bmMge0BsaW5rIHJlc29sdmVEYXRhYnJpY2tzUm9vdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVEYXRhYnJpY2tzUm9vdE9wdGlvbnMge1xuICAvKiogQ2xpZW50IHVzZWQgdG8gcmVzb2x2ZSB0aGUgY3VycmVudCB1c2VybmFtZSBmb3IgYH5gIGV4cGFuc2lvbi4gKi9cbiAgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50O1xufVxuXG4vKiogVHJ1ZSB3aGVuIHtAbGluayBpbnB1dH0gaXMgYH5gIG9yIGEgcGF0aCB1bmRlciBgfi9gLiBTZWUge0BsaW5rIHBvc2l4UGF0aC5pc0hvbWVSZWxhdGl2ZVBhdGh9LiAqL1xuZXhwb3J0IGNvbnN0IGlzSG9tZVJlbGF0aXZlUGF0aCA9IHBvc2l4UGF0aC5pc0hvbWVSZWxhdGl2ZVBhdGg7XG5cbi8qKlxuICogRXhwYW5kIGB+YCAvIGB+Ly4uLmAgdG8gYC9Xb3Jrc3BhY2UvVXNlcnMvPHVzZXJOYW1lPi8uLi5gLlxuICogTm9uLWhvbWUgaW5wdXRzIGFyZSByZXR1cm5lZCB1bmNoYW5nZWQgKFBPU0lYIHNlcGFyYXRvcnMgb25seSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmRIb21lUGF0aChpbnB1dDogc3RyaW5nLCB1c2VyTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbmFtZSA9IHVzZXJOYW1lLnRyaW0oKTtcbiAgaWYgKCFuYW1lKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRhdGFicmlja3MgaG9tZSBleHBhbnNpb24gcmVxdWlyZXMgYSBub24tZW1wdHkgdXNlck5hbWVcIik7XG4gIH1cbiAgaWYgKCFpc0hvbWVSZWxhdGl2ZVBhdGgoaW5wdXQpKSB7XG4gICAgcmV0dXJuIHBvc2l4UGF0aC50b1Bvc2l4KGlucHV0LnRyaW0oKSk7XG4gIH1cbiAgcmV0dXJuIHBvc2l4UGF0aC5leHBhbmRIb21lKGlucHV0LCBgL1dvcmtzcGFjZS9Vc2Vycy8ke25hbWV9YCk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgRGF0YWJyaWNrcyBmaWxlc3lzdGVtIHJvb3QgdG8gYW4gYWJzb2x1dGUgUE9TSVggcGF0aC5cbiAqXG4gKiAtIGBjYXRhbG9nLnNjaGVtYS52b2x1bWVgIOKGkiBgL1ZvbHVtZXMvY2F0YWxvZy9zY2hlbWEvdm9sdW1lYFxuICogLSBgL1ZvbHVtZS8uLi5gIOKGkiBgL1ZvbHVtZXMvLi4uYCAoc2luZ3VsYXIgdHlwbyAvIHNob3J0aGFuZClcbiAqIC0gYH5gIC8gYH4vLi4uYCDihpIgYC9Xb3Jrc3BhY2UvVXNlcnMvPHVzZXJOYW1lPi8uLi5gIChuZWVkcyB7QGxpbmsgTm9ybWFsaXplRGF0YWJyaWNrc1Jvb3RPcHRpb25zLnVzZXJOYW1lfSlcbiAqIC0gc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMgKGV4Y2VwdCBgL2ApXG4gKlxuICogRm9yIGB+YCB3aXRob3V0IGEga25vd24gdXNlcm5hbWUsIHVzZSB7QGxpbmsgcmVzb2x2ZURhdGFicmlja3NSb290fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGFicmlja3NSb290KFxuICByb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IE5vcm1hbGl6ZURhdGFicmlja3NSb290T3B0aW9ucyA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IHJvb3QudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGF0YWJyaWNrcyBmaWxlc3lzdGVtIHJvb3QgY2Fubm90IGJlIGVtcHR5XCIpO1xuICB9XG5cbiAgaWYgKGlzSG9tZVJlbGF0aXZlUGF0aCh0cmltbWVkKSkge1xuICAgIGlmICghb3B0aW9ucy51c2VyTmFtZT8udHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgRGF0YWJyaWNrcyBob21lIHBhdGggXCIke3Jvb3R9XCIgcmVxdWlyZXMgdXNlck5hbWU7IHVzZSByZXNvbHZlRGF0YWJyaWNrc1Jvb3QoKSBvciBwYXNzIHVzZXJOYW1lYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChleHBhbmRIb21lUGF0aCh0cmltbWVkLCBvcHRpb25zLnVzZXJOYW1lKSk7XG4gIH1cblxuICBjb25zdCB0aHJlZVBhcnQgPSBWT0xVTUVfVEhSRUVfUEFSVC5leGVjKHRyaW1tZWQpO1xuICBpZiAodGhyZWVQYXJ0KSB7XG4gICAgcmV0dXJuIHBvc2l4UGF0aC5ub3JtYWxpemVSb290KGAvVm9sdW1lcy8ke3RocmVlUGFydFsxXX0vJHt0aHJlZVBhcnRbMl19LyR7dGhyZWVQYXJ0WzNdfWApO1xuICB9XG5cbiAgbGV0IHBvc2l4ID0gcG9zaXhQYXRoLnRvUG9zaXgodHJpbW1lZCk7XG4gIGlmIChwb3NpeCA9PT0gXCIvVm9sdW1lXCIgfHwgcG9zaXguc3RhcnRzV2l0aChcIi9Wb2x1bWUvXCIpKSB7XG4gICAgcG9zaXggPSBgL1ZvbHVtZXMke3Bvc2l4LnNsaWNlKFwiL1ZvbHVtZVwiLmxlbmd0aCl9YDtcbiAgfVxuXG4gIGlmICghcG9zaXhQYXRoLmlzQWJzb2x1dGUocG9zaXgpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBEYXRhYnJpY2tzIGZpbGVzeXN0ZW0gcm9vdCBtdXN0IGJlIGFic29sdXRlLCBjYXRhbG9nLnNjaGVtYS52b2x1bWUsIG9yIH4sIGdvdDogJHtyb290fWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChwb3NpeCk7XG59XG5cbi8qKlxuICogTGlrZSB7QGxpbmsgbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3R9LCBidXQgcmVzb2x2ZXMgYH5gIHZpYVxuICoge0BsaW5rIGdldEN1cnJlbnRVc2VyTmFtZX0gKEFwcEtpdCBjb250ZXh0IHVzZXIsIGVsc2UgYGN1cnJlbnRVc2VyLm1lKClgKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzUm9vdChcbiAgcm9vdDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlRGF0YWJyaWNrc1Jvb3RPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoIWlzSG9tZVJlbGF0aXZlUGF0aChyb290KSkge1xuICAgIHJldHVybiBub3JtYWxpemVEYXRhYnJpY2tzUm9vdChyb290KTtcbiAgfVxuICBjb25zdCB1c2VyTmFtZSA9IGF3YWl0IGdldEN1cnJlbnRVc2VyTmFtZShvcHRpb25zLmNsaWVudCk7XG4gIHJldHVybiBub3JtYWxpemVEYXRhYnJpY2tzUm9vdChyb290LCB7IHVzZXJOYW1lIH0pO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHtAbGluayBhYnNvbHV0ZVBhdGh9IGlzIHNlcnZlZCBieSB0aGUgd29ya3NwYWNlIG9iamVjdHMgQVBJLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZXNQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHAgPSBwb3NpeFBhdGgudG9Qb3NpeChhYnNvbHV0ZVBhdGgpO1xuICByZXR1cm4gKFxuICAgIHAgPT09IFwiL1dvcmtzcGFjZVwiIHx8XG4gICAgcC5zdGFydHNXaXRoKFwiL1dvcmtzcGFjZS9cIikgfHxcbiAgICBwLnN0YXJ0c1dpdGgoXCIvVXNlcnMvXCIpIHx8XG4gICAgcC5zdGFydHNXaXRoKFwiL1JlcG9zL1wiKSB8fFxuICAgIHAuc3RhcnRzV2l0aChcIi9TaGFyZWQvXCIpXG4gICk7XG59XG5cbi8qKiBUcnVlIHdoZW4ge0BsaW5rIGFic29sdXRlUGF0aH0gaXMgYSBVbml0eSBDYXRhbG9nIHZvbHVtZSBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVm9sdW1lc1BhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHBvc2l4UGF0aC50b1Bvc2l4KGFic29sdXRlUGF0aCk7XG4gIHJldHVybiBwID09PSBcIi9Wb2x1bWVzXCIgfHwgcC5zdGFydHNXaXRoKFwiL1ZvbHVtZXMvXCIpO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHtAbGluayBhYnNvbHV0ZVBhdGh9IGlzIGEgREJGUyBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGJmc1BhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHBvc2l4UGF0aC50b1Bvc2l4KGFic29sdXRlUGF0aCk7XG4gIHJldHVybiBwID09PSBcIi9kYmZzXCIgfHwgcC5zdGFydHNXaXRoKFwiL2RiZnMvXCIpO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIERhdGFicmlja3MgQVBJIGJhY2tlbmQgZm9yIGFuIGFic29sdXRlIHBhdGguXG4gKlxuICogVm9sdW1lIHRocmVlLXBhcnQgcm9vdHMgYXJlIG5vcm1hbGl6ZWQgYmVmb3JlIHRoaXMgcnVucywgc28gY2FsbGVycyBzaG91bGRcbiAqIHBhc3MgcGF0aHMgZnJvbSB7QGxpbmsgbm9ybWFsaXplRGF0YWJyaWNrc1Jvb3R9IC8ge0BsaW5rIEJhc2VGaWxlU3lzdGVtLnJlc29sdmVQYXRofS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKGFic29sdXRlUGF0aDogc3RyaW5nKTogRGF0YWJyaWNrc0ZpbGVzQmFja2VuZCB7XG4gIGlmIChpc0RiZnNQYXRoKGFic29sdXRlUGF0aCkpIHJldHVybiBcImRiZnNcIjtcbiAgaWYgKGlzV29ya3NwYWNlRmlsZXNQYXRoKGFic29sdXRlUGF0aCkpIHJldHVybiBcIndvcmtzcGFjZVwiO1xuICBpZiAoaXNWb2x1bWVzUGF0aChhYnNvbHV0ZVBhdGgpKSByZXR1cm4gXCJ2b2x1bWVzXCI7XG4gIC8vIERlZmF1bHQ6IFVDIEZpbGVzIEFQSSAoY292ZXJzIHVudXN1YWwgYWJzb2x1dGUgcm9vdHMgdW5kZXIgdGhlIHdvcmtzcGFjZSBob3N0KS5cbiAgcmV0dXJuIFwidm9sdW1lc1wiO1xufVxuIl19
package/lib/src/net.js CHANGED
@@ -7,13 +7,13 @@
7
7
  * @module
8
8
  */
9
9
  import { lookup } from "node:dns/promises";
10
- import { functionModule, http, net } from "@dbx-tools/shared-core";
10
+ import { functionUtils, http, net } from "@dbx-tools/shared-core";
11
11
  /**
12
12
  * This process's outbound public IP, cached for 5 minutes. Asks Cloudflare's
13
13
  * `cdn-cgi/trace` first and falls back to ipify. Useful for allowlisting or for
14
14
  * reasoning about egress from a Databricks App.
15
15
  */
16
- export const getPublicIp = functionModule.memoize(async () => {
16
+ export const getPublicIp = functionUtils.memoize(async () => {
17
17
  const cloudflareResponse = await fetch("https://cloudflare.com/cdn-cgi/trace");
18
18
  if (cloudflareResponse.ok) {
19
19
  const trace = await cloudflareResponse.text();
@@ -65,4 +65,4 @@ export async function resolveHostIps(input) {
65
65
  return [];
66
66
  }
67
67
  }
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25ldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5FOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FDL0MsS0FBSyxJQUFJLEVBQUU7SUFDVCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDL0UsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxNQUFNLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLEVBQUUsR0FBRyxLQUFLO2FBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNYLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFCLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsSUFBSSxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QixNQUFNLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sYUFBYSxDQUFDLElBQUksRUFBRSxDQUFvQixDQUFDO0lBQ2xFLE1BQU0sRUFBRSxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUM7SUFDekIsSUFBSSxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0FBQ25ELENBQUMsRUFDRCxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUN6QixDQUFDO0FBRUY7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsS0FBa0I7SUFDckQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDN0MsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixzRUFBc0U7SUFDdEUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELElBQUksT0FBTztRQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlcnZlci1zaWRlIG5ldHdvcmtpbmcgaGVscGVycyB0aGF0IG5lZWQgTm9kZSBidWlsdGlucywgbGF5ZXJlZCBvdmVyIHRoZVxuICogYnJvd3Nlci1zYWZlIFVSTCAvIElQIHRvb2xraXQgaW4gYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgJ3MgYG5ldGAgbW9kdWxlOiBETlNcbiAqIHJlc29sdXRpb24gKHtAbGluayByZXNvbHZlSG9zdElwc30sIGBub2RlOmRuc2ApIGFuZCBwdWJsaWMtSVAgZGlzY292ZXJ5XG4gKiAoe0BsaW5rIGdldFB1YmxpY0lwfSkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGxvb2t1cCB9IGZyb20gXCJub2RlOmRucy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZnVuY3Rpb25Nb2R1bGUsIGh0dHAsIG5ldCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKlxuICogVGhpcyBwcm9jZXNzJ3Mgb3V0Ym91bmQgcHVibGljIElQLCBjYWNoZWQgZm9yIDUgbWludXRlcy4gQXNrcyBDbG91ZGZsYXJlJ3NcbiAqIGBjZG4tY2dpL3RyYWNlYCBmaXJzdCBhbmQgZmFsbHMgYmFjayB0byBpcGlmeS4gVXNlZnVsIGZvciBhbGxvd2xpc3Rpbmcgb3IgZm9yXG4gKiByZWFzb25pbmcgYWJvdXQgZWdyZXNzIGZyb20gYSBEYXRhYnJpY2tzIEFwcC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFB1YmxpY0lwID0gZnVuY3Rpb25Nb2R1bGUubWVtb2l6ZShcbiAgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsb3VkZmxhcmVSZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9jbG91ZGZsYXJlLmNvbS9jZG4tY2dpL3RyYWNlXCIpO1xuICAgIGlmIChjbG91ZGZsYXJlUmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IHRyYWNlID0gYXdhaXQgY2xvdWRmbGFyZVJlc3BvbnNlLnRleHQoKTtcbiAgICAgIGNvbnN0IGlwS2V5ID0gXCJpcD1cIjtcbiAgICAgIGNvbnN0IGlwID0gdHJhY2VcbiAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgICAgICAuZmluZCgobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKGlwS2V5KSlcbiAgICAgICAgPy5zbGljZShpcEtleS5sZW5ndGgpO1xuICAgICAgaWYgKGlwKSByZXR1cm4gaXA7XG4gICAgfVxuICAgIGNvbnN0IGlwaWZ5UmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmlwaWZ5Lm9yZz9mb3JtYXQ9anNvblwiKTtcbiAgICBpZiAoIWlwaWZ5UmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IGF3YWl0IGh0dHAuY3JlYXRlRmV0Y2hFcnJvcihpcGlmeVJlc3BvbnNlKTtcbiAgICB9XG4gICAgY29uc3QgaXBpZnlEYXRhID0gKGF3YWl0IGlwaWZ5UmVzcG9uc2UuanNvbigpKSBhcyB7IGlwPzogc3RyaW5nIH07XG4gICAgY29uc3QgaXAgPSBpcGlmeURhdGE/LmlwO1xuICAgIGlmIChpcCkgcmV0dXJuIGlwO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBkZXRlcm1pbmUgcHVibGljIElQXCIpO1xuICB9LFxuICB7IHR0bE1zOiAxMDAwICogNjAgKiA1IH0sXG4pO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIGhvc3Qgb2YgYGlucHV0YCB0byBpdHMgSVAgYWRkcmVzcyhlcykgdmlhIHRoZSBPUyByZXNvbHZlclxuICogKGBkbnMubG9va3VwYCB3aXRoIGBhbGw6IHRydWVgLCBzbyBib3RoIEEgYW5kIEFBQUEgcmVjb3JkcyBhcmUgcmV0dXJuZWQgd2hlblxuICogdGhlIGhvc3QgaXMgZHVhbC1zdGFja2VkKS4gQWNjZXB0cyBhbnkgYG5ldC5VcmxMaWtlYCAtIGEgYmFyZSBob3N0bmFtZSwgYSBmdWxsXG4gKiBVUkwsIG9yIGEgYHsgdXJsIH1gIHdyYXBwZXIgLSBhbmQgcmV0dXJucyB0aGUgZGVkdXBsaWNhdGVkIGxpc3Qgb2YgbGl0ZXJhbFxuICogYWRkcmVzc2VzLiBOZXZlciB0aHJvd3M6IGFuIHVucGFyc2VhYmxlIGlucHV0LCBhbiBJUC1saXRlcmFsIGhvc3QgKHJldHVybmVkXG4gKiBhcy1pcyB3aXRob3V0IGEgRE5TIHJvdW5kLXRyaXApLCBvciBhIHJlc29sdXRpb24gZmFpbHVyZSBhbGwgeWllbGQgdGhlXG4gKiBhcHByb3ByaWF0ZSBsaXN0IG9yIGBbXWAuXG4gKlxuICogYGRucy5sb29rdXBgIChub3QgYHJlc29sdmU0YCAvIGByZXNvbHZlNmApIGlzIHVzZWQgc28gYC9ldGMvaG9zdHNgIGFuZCB0aGVcbiAqIHBsYXRmb3JtIHJlc29sdmVyIG9yZGVyIGFyZSBob25vcmVkLCBtYXRjaGluZyB3aGF0IGFuIG91dGJvdW5kIGNvbm5lY3Rpb24gdG9cbiAqIHRoZSBob3N0IHdvdWxkIGFjdHVhbGx5IHVzZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVIb3N0SXBzKGlucHV0OiBuZXQuVXJsTGlrZSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgaG9zdCA9IG5ldC51cmxCdWlsZGVyKGlucHV0KT8uaG9zdG5hbWU7XG4gIGlmICghaG9zdCkgcmV0dXJuIFtdO1xuICAvLyBXSEFUV0cgYFVSTC5ob3N0bmFtZWAgYnJhY2tldHMgSVB2NiBsaXRlcmFsczsgc3RyaXAgYmVmb3JlIHBhcnNpbmcuXG4gIGNvbnN0IGxpdGVyYWwgPSBuZXQucGFyc2VJcChob3N0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCBcIlwiKSk7XG4gIGlmIChsaXRlcmFsKSByZXR1cm4gW2hvc3QucmVwbGFjZSgvXlxcW3xcXF0kL2csIFwiXCIpXTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgbG9va3VwKGhvc3QsIHsgYWxsOiB0cnVlIH0pO1xuICAgIHJldHVybiBbLi4ubmV3IFNldChyZXN1bHRzLm1hcCgocikgPT4gci5hZGRyZXNzKSldO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cbiJdfQ==
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25ldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWxFOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FDOUMsS0FBSyxJQUFJLEVBQUU7SUFDVCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDL0UsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxNQUFNLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLEVBQUUsR0FBRyxLQUFLO2FBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNYLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFCLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsSUFBSSxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QixNQUFNLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sYUFBYSxDQUFDLElBQUksRUFBRSxDQUFvQixDQUFDO0lBQ2xFLE1BQU0sRUFBRSxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUM7SUFDekIsSUFBSSxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0FBQ25ELENBQUMsRUFDRCxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUN6QixDQUFDO0FBRUY7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsS0FBa0I7SUFDckQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDN0MsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixzRUFBc0U7SUFDdEUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELElBQUksT0FBTztRQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlcnZlci1zaWRlIG5ldHdvcmtpbmcgaGVscGVycyB0aGF0IG5lZWQgTm9kZSBidWlsdGlucywgbGF5ZXJlZCBvdmVyIHRoZVxuICogYnJvd3Nlci1zYWZlIFVSTCAvIElQIHRvb2xraXQgaW4gYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgJ3MgYG5ldGAgbW9kdWxlOiBETlNcbiAqIHJlc29sdXRpb24gKHtAbGluayByZXNvbHZlSG9zdElwc30sIGBub2RlOmRuc2ApIGFuZCBwdWJsaWMtSVAgZGlzY292ZXJ5XG4gKiAoe0BsaW5rIGdldFB1YmxpY0lwfSkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGxvb2t1cCB9IGZyb20gXCJub2RlOmRucy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZnVuY3Rpb25VdGlscywgaHR0cCwgbmV0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuLyoqXG4gKiBUaGlzIHByb2Nlc3MncyBvdXRib3VuZCBwdWJsaWMgSVAsIGNhY2hlZCBmb3IgNSBtaW51dGVzLiBBc2tzIENsb3VkZmxhcmUnc1xuICogYGNkbi1jZ2kvdHJhY2VgIGZpcnN0IGFuZCBmYWxscyBiYWNrIHRvIGlwaWZ5LiBVc2VmdWwgZm9yIGFsbG93bGlzdGluZyBvciBmb3JcbiAqIHJlYXNvbmluZyBhYm91dCBlZ3Jlc3MgZnJvbSBhIERhdGFicmlja3MgQXBwLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UHVibGljSXAgPSBmdW5jdGlvblV0aWxzLm1lbW9pemUoXG4gIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjbG91ZGZsYXJlUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vY2xvdWRmbGFyZS5jb20vY2RuLWNnaS90cmFjZVwiKTtcbiAgICBpZiAoY2xvdWRmbGFyZVJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCB0cmFjZSA9IGF3YWl0IGNsb3VkZmxhcmVSZXNwb25zZS50ZXh0KCk7XG4gICAgICBjb25zdCBpcEtleSA9IFwiaXA9XCI7XG4gICAgICBjb25zdCBpcCA9IHRyYWNlXG4gICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAgICAgLmZpbmQoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChpcEtleSkpXG4gICAgICAgID8uc2xpY2UoaXBLZXkubGVuZ3RoKTtcbiAgICAgIGlmIChpcCkgcmV0dXJuIGlwO1xuICAgIH1cbiAgICBjb25zdCBpcGlmeVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2FwaS5pcGlmeS5vcmc/Zm9ybWF0PWpzb25cIik7XG4gICAgaWYgKCFpcGlmeVJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBhd2FpdCBodHRwLmNyZWF0ZUZldGNoRXJyb3IoaXBpZnlSZXNwb25zZSk7XG4gICAgfVxuICAgIGNvbnN0IGlwaWZ5RGF0YSA9IChhd2FpdCBpcGlmeVJlc3BvbnNlLmpzb24oKSkgYXMgeyBpcD86IHN0cmluZyB9O1xuICAgIGNvbnN0IGlwID0gaXBpZnlEYXRhPy5pcDtcbiAgICBpZiAoaXApIHJldHVybiBpcDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZGV0ZXJtaW5lIHB1YmxpYyBJUFwiKTtcbiAgfSxcbiAgeyB0dGxNczogMTAwMCAqIDYwICogNSB9LFxuKTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBob3N0IG9mIGBpbnB1dGAgdG8gaXRzIElQIGFkZHJlc3MoZXMpIHZpYSB0aGUgT1MgcmVzb2x2ZXJcbiAqIChgZG5zLmxvb2t1cGAgd2l0aCBgYWxsOiB0cnVlYCwgc28gYm90aCBBIGFuZCBBQUFBIHJlY29yZHMgYXJlIHJldHVybmVkIHdoZW5cbiAqIHRoZSBob3N0IGlzIGR1YWwtc3RhY2tlZCkuIEFjY2VwdHMgYW55IGBuZXQuVXJsTGlrZWAgLSBhIGJhcmUgaG9zdG5hbWUsIGEgZnVsbFxuICogVVJMLCBvciBhIGB7IHVybCB9YCB3cmFwcGVyIC0gYW5kIHJldHVybnMgdGhlIGRlZHVwbGljYXRlZCBsaXN0IG9mIGxpdGVyYWxcbiAqIGFkZHJlc3Nlcy4gTmV2ZXIgdGhyb3dzOiBhbiB1bnBhcnNlYWJsZSBpbnB1dCwgYW4gSVAtbGl0ZXJhbCBob3N0IChyZXR1cm5lZFxuICogYXMtaXMgd2l0aG91dCBhIEROUyByb3VuZC10cmlwKSwgb3IgYSByZXNvbHV0aW9uIGZhaWx1cmUgYWxsIHlpZWxkIHRoZVxuICogYXBwcm9wcmlhdGUgbGlzdCBvciBgW11gLlxuICpcbiAqIGBkbnMubG9va3VwYCAobm90IGByZXNvbHZlNGAgLyBgcmVzb2x2ZTZgKSBpcyB1c2VkIHNvIGAvZXRjL2hvc3RzYCBhbmQgdGhlXG4gKiBwbGF0Zm9ybSByZXNvbHZlciBvcmRlciBhcmUgaG9ub3JlZCwgbWF0Y2hpbmcgd2hhdCBhbiBvdXRib3VuZCBjb25uZWN0aW9uIHRvXG4gKiB0aGUgaG9zdCB3b3VsZCBhY3R1YWxseSB1c2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlSG9zdElwcyhpbnB1dDogbmV0LlVybExpa2UpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGhvc3QgPSBuZXQudXJsQnVpbGRlcihpbnB1dCk/Lmhvc3RuYW1lO1xuICBpZiAoIWhvc3QpIHJldHVybiBbXTtcbiAgLy8gV0hBVFdHIGBVUkwuaG9zdG5hbWVgIGJyYWNrZXRzIElQdjYgbGl0ZXJhbHM7IHN0cmlwIGJlZm9yZSBwYXJzaW5nLlxuICBjb25zdCBsaXRlcmFsID0gbmV0LnBhcnNlSXAoaG9zdC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgXCJcIikpO1xuICBpZiAobGl0ZXJhbCkgcmV0dXJuIFtob3N0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCBcIlwiKV07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGxvb2t1cChob3N0LCB7IGFsbDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQocmVzdWx0cy5tYXAoKHIpID0+IHIuYWRkcmVzcykpXTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Resolve the current Databricks workspace's URL, numeric id, and client from
3
+ * the active execution context (AppKit, when initialized), a default
4
+ * {@link WorkspaceClient}, or the environment. Server-only.
5
+ *
6
+ * @module
7
+ */
8
+ import { createWorkspaceClient, } from "@databricks/appkit";
9
+ import { appkit } from "@dbx-tools/appkit";
10
+ import { functionUtils, net } from "@dbx-tools/shared-core";
11
+ /** Databricks workspace ids are a 10-20 digit run embedded in the host. */
12
+ const WORKSPACE_ID_REGEX = /\d{10,20}/;
13
+ /** Resolve AppKit's facade or an existing legacy client to the legacy SDK surface. */
14
+ export function toLegacyWorkspaceClient(client) {
15
+ return "toLegacyWorkspaceClient" in client ? client.toLegacyWorkspaceClient() : client;
16
+ }
17
+ /**
18
+ * Lazily-constructed default `WorkspaceClient` (env / profile auth), memoized so
19
+ * construction happens at most once per process. Used only when there's no
20
+ * AppKit execution context to borrow a client from.
21
+ */
22
+ const getDefaultWorkspaceClient = functionUtils.memoize(async () => createWorkspaceClient().toLegacyWorkspaceClient());
23
+ /**
24
+ * The AppKit execution-context workspace client when available, otherwise
25
+ * `undefined`. Never constructs a fallback client and never throws for a
26
+ * missing AppKit scope.
27
+ */
28
+ export function tryGetWorkspaceClient() {
29
+ return appkit.tryGetExecutionContext()?.client.toLegacyWorkspaceClient();
30
+ }
31
+ /**
32
+ * Resolve a {@link WorkspaceClient}: {@link tryGetWorkspaceClient} first, else
33
+ * a memoized default client from env / profile auth.
34
+ */
35
+ export async function getWorkspaceClient() {
36
+ return tryGetWorkspaceClient() ?? (await getDefaultWorkspaceClient());
37
+ }
38
+ /**
39
+ * The active workspace `Config`: the AppKit execution-context client's config
40
+ * when AppKit is initialized, else the default client's. Returns `undefined`
41
+ * (never throws) when neither is available.
42
+ */
43
+ async function getWorkspaceConfig() {
44
+ try {
45
+ return (await getWorkspaceClient()).config;
46
+ }
47
+ catch {
48
+ return undefined;
49
+ }
50
+ }
51
+ /**
52
+ * Current Databricks username for workspace home paths
53
+ * (`/Workspace/Users/<userName>`).
54
+ *
55
+ * Prefers `userName` on the AppKit execution context when set, otherwise
56
+ * calls `currentUser.me()` on {@link client} (or {@link getWorkspaceClient}).
57
+ */
58
+ export async function getCurrentUserName(client) {
59
+ const contextUser = readContextUserName(appkit.tryGetExecutionContext());
60
+ if (contextUser)
61
+ return contextUser;
62
+ const resolved = client ?? (await getWorkspaceClient());
63
+ const me = await resolved.currentUser.me();
64
+ const userName = me.userName?.trim();
65
+ if (!userName) {
66
+ throw new Error("Databricks currentUser.me() did not return a userName");
67
+ }
68
+ return userName;
69
+ }
70
+ /** Best-effort `userName` off an AppKit execution context (shape varies by mode). */
71
+ function readContextUserName(ctx) {
72
+ if (typeof ctx !== "object" || ctx === null || !("userName" in ctx))
73
+ return undefined;
74
+ const value = ctx.userName;
75
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
76
+ }
77
+ /**
78
+ * Resolve the current workspace host as a `net.UrlBuilder`: the workspace
79
+ * `Config` host first, then the `DATABRICKS_HOST` env var, else `undefined`.
80
+ */
81
+ export async function getWorkspaceUrl() {
82
+ const config = await getWorkspaceConfig();
83
+ if (config) {
84
+ const configHost = net.urlBuilder(await config.getHost());
85
+ if (configHost)
86
+ return configHost;
87
+ }
88
+ const databricksHost = net.urlBuilder(process.env.DATABRICKS_HOST);
89
+ if (databricksHost)
90
+ return databricksHost;
91
+ return undefined;
92
+ }
93
+ /**
94
+ * Resolve the numeric workspace id: the workspace `Config`'s `workspaceId`
95
+ * first, else the 10-20 digit run of `workspaceHost` (defaulting to
96
+ * {@link getWorkspaceUrl}'s host). `undefined` when neither yields an id.
97
+ */
98
+ export async function getWorkspaceId(workspaceHost) {
99
+ const workspaceId = (await getWorkspaceConfig())?.workspaceId;
100
+ if (workspaceId)
101
+ return workspaceId;
102
+ workspaceHost = workspaceHost ?? (await getWorkspaceUrl())?.host;
103
+ if (workspaceHost) {
104
+ const match = workspaceHost.match(WORKSPACE_ID_REGEX)?.[0];
105
+ if (match)
106
+ return match;
107
+ }
108
+ return undefined;
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2UtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFDTCxxQkFBcUIsR0FFdEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCwyRUFBMkU7QUFDM0UsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUM7QUFNdkMsc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsTUFBK0M7SUFFL0MsT0FBTyx5QkFBeUIsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDekYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLHlCQUF5QixHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FDakUscUJBQXFCLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxDQUNsRCxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztBQUMzRSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0I7SUFDdEMsT0FBTyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsTUFBTSx5QkFBeUIsRUFBRSxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsa0JBQWtCO0lBQy9CLElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyxNQUFNLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDN0MsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxNQUF3QjtJQUMvRCxNQUFNLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLElBQUksV0FBVztRQUFFLE9BQU8sV0FBVyxDQUFDO0lBRXBDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUMzQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixTQUFTLG1CQUFtQixDQUFDLEdBQVk7SUFDdkMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RGLE1BQU0sS0FBSyxHQUFJLEdBQThCLENBQUMsUUFBUSxDQUFDO0lBQ3ZELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDOUUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZTtJQUNuQyxNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFrQixFQUFFLENBQUM7SUFDMUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLFVBQVU7WUFBRSxPQUFPLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ25FLElBQUksY0FBYztRQUFFLE9BQU8sY0FBYyxDQUFDO0lBQzFDLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsYUFBc0I7SUFDekQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLGtCQUFrQixFQUFFLENBQUMsRUFBRSxXQUFXLENBQUM7SUFDOUQsSUFBSSxXQUFXO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDcEMsYUFBYSxHQUFHLGFBQWEsSUFBSSxDQUFDLE1BQU0sZUFBZSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUM7SUFDakUsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVzb2x2ZSB0aGUgY3VycmVudCBEYXRhYnJpY2tzIHdvcmtzcGFjZSdzIFVSTCwgbnVtZXJpYyBpZCwgYW5kIGNsaWVudCBmcm9tXG4gKiB0aGUgYWN0aXZlIGV4ZWN1dGlvbiBjb250ZXh0IChBcHBLaXQsIHdoZW4gaW5pdGlhbGl6ZWQpLCBhIGRlZmF1bHRcbiAqIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9LCBvciB0aGUgZW52aXJvbm1lbnQuIFNlcnZlci1vbmx5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVXb3Jrc3BhY2VDbGllbnQsXG4gIHR5cGUgV29ya3NwYWNlQ2xpZW50IGFzIEFwcEtpdFdvcmtzcGFjZUNsaWVudCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBmdW5jdGlvblV0aWxzLCBuZXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKiogRGF0YWJyaWNrcyB3b3Jrc3BhY2UgaWRzIGFyZSBhIDEwLTIwIGRpZ2l0IHJ1biBlbWJlZGRlZCBpbiB0aGUgaG9zdC4gKi9cbmNvbnN0IFdPUktTUEFDRV9JRF9SRUdFWCA9IC9cXGR7MTAsMjB9LztcblxuLyoqIExlZ2FjeSBTREsgY2xpZW50IGV4cG9zZWQgYnkgQXBwS2l0IGZvciBBUElzIG5vdCB5ZXQgb24gaXRzIGZhY2FkZS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZUNsaWVudCA9IFJldHVyblR5cGU8QXBwS2l0V29ya3NwYWNlQ2xpZW50W1widG9MZWdhY3lXb3Jrc3BhY2VDbGllbnRcIl0+O1xudHlwZSBDb25maWcgPSBXb3Jrc3BhY2VDbGllbnRbXCJjb25maWdcIl07XG5cbi8qKiBSZXNvbHZlIEFwcEtpdCdzIGZhY2FkZSBvciBhbiBleGlzdGluZyBsZWdhY3kgY2xpZW50IHRvIHRoZSBsZWdhY3kgU0RLIHN1cmZhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gdG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoXG4gIGNsaWVudDogQXBwS2l0V29ya3NwYWNlQ2xpZW50IHwgV29ya3NwYWNlQ2xpZW50LFxuKTogV29ya3NwYWNlQ2xpZW50IHtcbiAgcmV0dXJuIFwidG9MZWdhY3lXb3Jrc3BhY2VDbGllbnRcIiBpbiBjbGllbnQgPyBjbGllbnQudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoKSA6IGNsaWVudDtcbn1cblxuLyoqXG4gKiBMYXppbHktY29uc3RydWN0ZWQgZGVmYXVsdCBgV29ya3NwYWNlQ2xpZW50YCAoZW52IC8gcHJvZmlsZSBhdXRoKSwgbWVtb2l6ZWQgc29cbiAqIGNvbnN0cnVjdGlvbiBoYXBwZW5zIGF0IG1vc3Qgb25jZSBwZXIgcHJvY2Vzcy4gVXNlZCBvbmx5IHdoZW4gdGhlcmUncyBub1xuICogQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHRvIGJvcnJvdyBhIGNsaWVudCBmcm9tLlxuICovXG5jb25zdCBnZXREZWZhdWx0V29ya3NwYWNlQ2xpZW50ID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGFzeW5jICgpID0+XG4gIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpLnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCksXG4pO1xuXG4vKipcbiAqIFRoZSBBcHBLaXQgZXhlY3V0aW9uLWNvbnRleHQgd29ya3NwYWNlIGNsaWVudCB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlXG4gKiBgdW5kZWZpbmVkYC4gTmV2ZXIgY29uc3RydWN0cyBhIGZhbGxiYWNrIGNsaWVudCBhbmQgbmV2ZXIgdGhyb3dzIGZvciBhXG4gKiBtaXNzaW5nIEFwcEtpdCBzY29wZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeUdldFdvcmtzcGFjZUNsaWVudCgpOiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9OiB7QGxpbmsgdHJ5R2V0V29ya3NwYWNlQ2xpZW50fSBmaXJzdCwgZWxzZVxuICogYSBtZW1vaXplZCBkZWZhdWx0IGNsaWVudCBmcm9tIGVudiAvIHByb2ZpbGUgYXV0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZUNsaWVudCgpOiBQcm9taXNlPFdvcmtzcGFjZUNsaWVudD4ge1xuICByZXR1cm4gdHJ5R2V0V29ya3NwYWNlQ2xpZW50KCkgPz8gKGF3YWl0IGdldERlZmF1bHRXb3Jrc3BhY2VDbGllbnQoKSk7XG59XG5cbi8qKlxuICogVGhlIGFjdGl2ZSB3b3Jrc3BhY2UgYENvbmZpZ2A6IHRoZSBBcHBLaXQgZXhlY3V0aW9uLWNvbnRleHQgY2xpZW50J3MgY29uZmlnXG4gKiB3aGVuIEFwcEtpdCBpcyBpbml0aWFsaXplZCwgZWxzZSB0aGUgZGVmYXVsdCBjbGllbnQncy4gUmV0dXJucyBgdW5kZWZpbmVkYFxuICogKG5ldmVyIHRocm93cykgd2hlbiBuZWl0aGVyIGlzIGF2YWlsYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V29ya3NwYWNlQ29uZmlnKCk6IFByb21pc2U8Q29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCBnZXRXb3Jrc3BhY2VDbGllbnQoKSkuY29uZmlnO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQ3VycmVudCBEYXRhYnJpY2tzIHVzZXJuYW1lIGZvciB3b3Jrc3BhY2UgaG9tZSBwYXRoc1xuICogKGAvV29ya3NwYWNlL1VzZXJzLzx1c2VyTmFtZT5gKS5cbiAqXG4gKiBQcmVmZXJzIGB1c2VyTmFtZWAgb24gdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCB3aGVuIHNldCwgb3RoZXJ3aXNlXG4gKiBjYWxscyBgY3VycmVudFVzZXIubWUoKWAgb24ge0BsaW5rIGNsaWVudH0gKG9yIHtAbGluayBnZXRXb3Jrc3BhY2VDbGllbnR9KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyTmFtZShjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb250ZXh0VXNlciA9IHJlYWRDb250ZXh0VXNlck5hbWUoYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKSk7XG4gIGlmIChjb250ZXh0VXNlcikgcmV0dXJuIGNvbnRleHRVc2VyO1xuXG4gIGNvbnN0IHJlc29sdmVkID0gY2xpZW50ID8/IChhd2FpdCBnZXRXb3Jrc3BhY2VDbGllbnQoKSk7XG4gIGNvbnN0IG1lID0gYXdhaXQgcmVzb2x2ZWQuY3VycmVudFVzZXIubWUoKTtcbiAgY29uc3QgdXNlck5hbWUgPSBtZS51c2VyTmFtZT8udHJpbSgpO1xuICBpZiAoIXVzZXJOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBjdXJyZW50VXNlci5tZSgpIGRpZCBub3QgcmV0dXJuIGEgdXNlck5hbWVcIik7XG4gIH1cbiAgcmV0dXJuIHVzZXJOYW1lO1xufVxuXG4vKiogQmVzdC1lZmZvcnQgYHVzZXJOYW1lYCBvZmYgYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IChzaGFwZSB2YXJpZXMgYnkgbW9kZSkuICovXG5mdW5jdGlvbiByZWFkQ29udGV4dFVzZXJOYW1lKGN0eDogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgY3R4ICE9PSBcIm9iamVjdFwiIHx8IGN0eCA9PT0gbnVsbCB8fCAhKFwidXNlck5hbWVcIiBpbiBjdHgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB2YWx1ZSA9IChjdHggYXMgeyB1c2VyTmFtZT86IHVua25vd24gfSkudXNlck5hbWU7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpID8gdmFsdWUudHJpbSgpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGN1cnJlbnQgd29ya3NwYWNlIGhvc3QgYXMgYSBgbmV0LlVybEJ1aWxkZXJgOiB0aGUgd29ya3NwYWNlXG4gKiBgQ29uZmlnYCBob3N0IGZpcnN0LCB0aGVuIHRoZSBgREFUQUJSSUNLU19IT1NUYCBlbnYgdmFyLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V29ya3NwYWNlVXJsKCk6IFByb21pc2U8bmV0LlVybEJ1aWxkZXIgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0V29ya3NwYWNlQ29uZmlnKCk7XG4gIGlmIChjb25maWcpIHtcbiAgICBjb25zdCBjb25maWdIb3N0ID0gbmV0LnVybEJ1aWxkZXIoYXdhaXQgY29uZmlnLmdldEhvc3QoKSk7XG4gICAgaWYgKGNvbmZpZ0hvc3QpIHJldHVybiBjb25maWdIb3N0O1xuICB9XG4gIGNvbnN0IGRhdGFicmlja3NIb3N0ID0gbmV0LnVybEJ1aWxkZXIocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUKTtcbiAgaWYgKGRhdGFicmlja3NIb3N0KSByZXR1cm4gZGF0YWJyaWNrc0hvc3Q7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbnVtZXJpYyB3b3Jrc3BhY2UgaWQ6IHRoZSB3b3Jrc3BhY2UgYENvbmZpZ2AncyBgd29ya3NwYWNlSWRgXG4gKiBmaXJzdCwgZWxzZSB0aGUgMTAtMjAgZGlnaXQgcnVuIG9mIGB3b3Jrc3BhY2VIb3N0YCAoZGVmYXVsdGluZyB0b1xuICoge0BsaW5rIGdldFdvcmtzcGFjZVVybH0ncyBob3N0KS4gYHVuZGVmaW5lZGAgd2hlbiBuZWl0aGVyIHlpZWxkcyBhbiBpZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZUlkKHdvcmtzcGFjZUhvc3Q/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB3b3Jrc3BhY2VJZCA9IChhd2FpdCBnZXRXb3Jrc3BhY2VDb25maWcoKSk/LndvcmtzcGFjZUlkO1xuICBpZiAod29ya3NwYWNlSWQpIHJldHVybiB3b3Jrc3BhY2VJZDtcbiAgd29ya3NwYWNlSG9zdCA9IHdvcmtzcGFjZUhvc3QgPz8gKGF3YWl0IGdldFdvcmtzcGFjZVVybCgpKT8uaG9zdDtcbiAgaWYgKHdvcmtzcGFjZUhvc3QpIHtcbiAgICBjb25zdCBtYXRjaCA9IHdvcmtzcGFjZUhvc3QubWF0Y2goV09SS1NQQUNFX0lEX1JFR0VYKT8uWzBdO1xuICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"root":["../src/cloud.ts","../src/databricks-fs.ts","../src/databricks-path.ts","../src/net.ts","../src/workspace.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/cloud.ts","../src/databricks-fs.ts","../src/databricks-path.ts","../src/net.ts","../src/workspace-client.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -25,10 +25,10 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@databricks/appkit": "0.81.0",
28
- "@dbx-tools/appkit": "^0.9.5",
29
- "@dbx-tools/core": "^0.9.5",
30
- "@dbx-tools/shared-core": "^0.9.5",
31
- "@dbx-tools/shared-fs": "^0.9.5"
28
+ "@dbx-tools/appkit": "^0.9.7",
29
+ "@dbx-tools/core": "^0.9.7",
30
+ "@dbx-tools/shared-core": "^0.9.7",
31
+ "@dbx-tools/shared-fs": "^0.9.7"
32
32
  },
33
33
  "main": "./lib/index.js",
34
34
  "license": "Apache-2.0",
@@ -44,7 +44,7 @@
44
44
  "./package.json": "./package.json"
45
45
  }
46
46
  },
47
- "version": "0.9.5",
47
+ "version": "0.9.7",
48
48
  "types": "./lib/index.d.ts",
49
49
  "type": "module",
50
50
  "exports": {
package/src/cloud.ts CHANGED
@@ -24,7 +24,7 @@ import { tmpdir } from "node:os";
24
24
  import { dirname, join } from "node:path";
25
25
 
26
26
  import { file } from "@dbx-tools/core";
27
- import { error, functionModule, hash, http, json, log, net } from "@dbx-tools/shared-core";
27
+ import { errorUtils, functionUtils, hash, http, json, log, net } from "@dbx-tools/shared-core";
28
28
  import { resolveHostIps } from "./net.ts";
29
29
 
30
30
  const logger = log.logger("cloud");
@@ -129,8 +129,11 @@ export async function loadProviderRanges(): Promise<ProviderRanges[]> {
129
129
  const settled = await Promise.allSettled([loadAwsRanges(), loadAzureRanges(), loadGcpRanges()]);
130
130
  const out: ProviderRanges[] = [];
131
131
  for (const result of settled) {
132
- if (result.status === "fulfilled") out.push(result.value);
133
- else logger.warn("provider range load failed", { error: error.errorMessage(result.reason) });
132
+ if (result.status === "fulfilled") {
133
+ out.push(result.value);
134
+ } else {
135
+ logger.warn("provider range load failed", { error: errorUtils.errorMessage(result.reason) });
136
+ }
134
137
  }
135
138
  return out;
136
139
  }
@@ -139,9 +142,9 @@ export async function loadProviderRanges(): Promise<ProviderRanges[]> {
139
142
  // Per-provider cached loaders
140
143
  // ────────────────────────────────────────────────────────────────
141
144
 
142
- const loadAwsRanges = functionModule.memoize(fetchAwsRanges, { ttlMs: RANGE_CACHE_TTL_MS });
143
- const loadAzureRanges = functionModule.memoize(fetchAzureRanges, { ttlMs: RANGE_CACHE_TTL_MS });
144
- const loadGcpRanges = functionModule.memoize(fetchGcpRanges, { ttlMs: RANGE_CACHE_TTL_MS });
145
+ const loadAwsRanges = functionUtils.memoize(fetchAwsRanges, { ttlMs: RANGE_CACHE_TTL_MS });
146
+ const loadAzureRanges = functionUtils.memoize(fetchAzureRanges, { ttlMs: RANGE_CACHE_TTL_MS });
147
+ const loadGcpRanges = functionUtils.memoize(fetchGcpRanges, { ttlMs: RANGE_CACHE_TTL_MS });
145
148
 
146
149
  // ────────────────────────────────────────────────────────────────
147
150
  // Provider feed fetch + parse
@@ -31,7 +31,7 @@ import {
31
31
  resolveDatabricksRoot,
32
32
  type DatabricksFilesBackend,
33
33
  } from "./databricks-path.ts";
34
- import { getWorkspaceClient, type WorkspaceClient } from "./workspace.ts";
34
+ import { getWorkspaceClient, type WorkspaceClient } from "./workspace-client.ts";
35
35
 
36
36
  const DBFS_READ_CHUNK_BYTES = 1024 * 1024;
37
37
  const DBFS_PUT_MAX_BYTES = 1024 * 1024;
@@ -12,7 +12,7 @@
12
12
  */
13
13
 
14
14
  import { posixPath } from "@dbx-tools/shared-fs";
15
- import { getCurrentUserName, type WorkspaceClient } from "./workspace.ts";
15
+ import { getCurrentUserName, type WorkspaceClient } from "./workspace-client.ts";
16
16
 
17
17
  /** Which Databricks Files API serves an absolute path. */
18
18
  export type DatabricksFilesBackend = "workspace" | "volumes" | "dbfs";
package/src/net.ts CHANGED
@@ -8,14 +8,14 @@
8
8
  */
9
9
 
10
10
  import { lookup } from "node:dns/promises";
11
- import { functionModule, http, net } from "@dbx-tools/shared-core";
11
+ import { functionUtils, http, net } from "@dbx-tools/shared-core";
12
12
 
13
13
  /**
14
14
  * This process's outbound public IP, cached for 5 minutes. Asks Cloudflare's
15
15
  * `cdn-cgi/trace` first and falls back to ipify. Useful for allowlisting or for
16
16
  * reasoning about egress from a Databricks App.
17
17
  */
18
- export const getPublicIp = functionModule.memoize(
18
+ export const getPublicIp = functionUtils.memoize(
19
19
  async () => {
20
20
  const cloudflareResponse = await fetch("https://cloudflare.com/cdn-cgi/trace");
21
21
  if (cloudflareResponse.ok) {
@@ -11,7 +11,7 @@ import {
11
11
  type WorkspaceClient as AppKitWorkspaceClient,
12
12
  } from "@databricks/appkit";
13
13
  import { appkit } from "@dbx-tools/appkit";
14
- import { functionModule, net } from "@dbx-tools/shared-core";
14
+ import { functionUtils, net } from "@dbx-tools/shared-core";
15
15
 
16
16
  /** Databricks workspace ids are a 10-20 digit run embedded in the host. */
17
17
  const WORKSPACE_ID_REGEX = /\d{10,20}/;
@@ -32,7 +32,7 @@ export function toLegacyWorkspaceClient(
32
32
  * construction happens at most once per process. Used only when there's no
33
33
  * AppKit execution context to borrow a client from.
34
34
  */
35
- const getDefaultWorkspaceClient = functionModule.memoize(async () =>
35
+ const getDefaultWorkspaceClient = functionUtils.memoize(async () =>
36
36
  createWorkspaceClient().toLegacyWorkspaceClient(),
37
37
  );
38
38
 
@@ -1,110 +0,0 @@
1
- /**
2
- * Resolve the current Databricks workspace's URL, numeric id, and client from
3
- * the active execution context (AppKit, when initialized), a default
4
- * {@link WorkspaceClient}, or the environment. Server-only.
5
- *
6
- * @module
7
- */
8
- import { createWorkspaceClient, } from "@databricks/appkit";
9
- import { appkit } from "@dbx-tools/appkit";
10
- import { functionModule, net } from "@dbx-tools/shared-core";
11
- /** Databricks workspace ids are a 10-20 digit run embedded in the host. */
12
- const WORKSPACE_ID_REGEX = /\d{10,20}/;
13
- /** Resolve AppKit's facade or an existing legacy client to the legacy SDK surface. */
14
- export function toLegacyWorkspaceClient(client) {
15
- return "toLegacyWorkspaceClient" in client ? client.toLegacyWorkspaceClient() : client;
16
- }
17
- /**
18
- * Lazily-constructed default `WorkspaceClient` (env / profile auth), memoized so
19
- * construction happens at most once per process. Used only when there's no
20
- * AppKit execution context to borrow a client from.
21
- */
22
- const getDefaultWorkspaceClient = functionModule.memoize(async () => createWorkspaceClient().toLegacyWorkspaceClient());
23
- /**
24
- * The AppKit execution-context workspace client when available, otherwise
25
- * `undefined`. Never constructs a fallback client and never throws for a
26
- * missing AppKit scope.
27
- */
28
- export function tryGetWorkspaceClient() {
29
- return appkit.tryGetExecutionContext()?.client.toLegacyWorkspaceClient();
30
- }
31
- /**
32
- * Resolve a {@link WorkspaceClient}: {@link tryGetWorkspaceClient} first, else
33
- * a memoized default client from env / profile auth.
34
- */
35
- export async function getWorkspaceClient() {
36
- return tryGetWorkspaceClient() ?? (await getDefaultWorkspaceClient());
37
- }
38
- /**
39
- * The active workspace `Config`: the AppKit execution-context client's config
40
- * when AppKit is initialized, else the default client's. Returns `undefined`
41
- * (never throws) when neither is available.
42
- */
43
- async function getWorkspaceConfig() {
44
- try {
45
- return (await getWorkspaceClient()).config;
46
- }
47
- catch {
48
- return undefined;
49
- }
50
- }
51
- /**
52
- * Current Databricks username for workspace home paths
53
- * (`/Workspace/Users/<userName>`).
54
- *
55
- * Prefers `userName` on the AppKit execution context when set, otherwise
56
- * calls `currentUser.me()` on {@link client} (or {@link getWorkspaceClient}).
57
- */
58
- export async function getCurrentUserName(client) {
59
- const contextUser = readContextUserName(appkit.tryGetExecutionContext());
60
- if (contextUser)
61
- return contextUser;
62
- const resolved = client ?? (await getWorkspaceClient());
63
- const me = await resolved.currentUser.me();
64
- const userName = me.userName?.trim();
65
- if (!userName) {
66
- throw new Error("Databricks currentUser.me() did not return a userName");
67
- }
68
- return userName;
69
- }
70
- /** Best-effort `userName` off an AppKit execution context (shape varies by mode). */
71
- function readContextUserName(ctx) {
72
- if (typeof ctx !== "object" || ctx === null || !("userName" in ctx))
73
- return undefined;
74
- const value = ctx.userName;
75
- return typeof value === "string" && value.trim() ? value.trim() : undefined;
76
- }
77
- /**
78
- * Resolve the current workspace host as a `net.UrlBuilder`: the workspace
79
- * `Config` host first, then the `DATABRICKS_HOST` env var, else `undefined`.
80
- */
81
- export async function getWorkspaceUrl() {
82
- const config = await getWorkspaceConfig();
83
- if (config) {
84
- const configHost = net.urlBuilder(await config.getHost());
85
- if (configHost)
86
- return configHost;
87
- }
88
- const databricksHost = net.urlBuilder(process.env.DATABRICKS_HOST);
89
- if (databricksHost)
90
- return databricksHost;
91
- return undefined;
92
- }
93
- /**
94
- * Resolve the numeric workspace id: the workspace `Config`'s `workspaceId`
95
- * first, else the 10-20 digit run of `workspaceHost` (defaulting to
96
- * {@link getWorkspaceUrl}'s host). `undefined` when neither yields an id.
97
- */
98
- export async function getWorkspaceId(workspaceHost) {
99
- const workspaceId = (await getWorkspaceConfig())?.workspaceId;
100
- if (workspaceId)
101
- return workspaceId;
102
- workspaceHost = workspaceHost ?? (await getWorkspaceUrl())?.host;
103
- if (workspaceHost) {
104
- const match = workspaceHost.match(WORKSPACE_ID_REGEX)?.[0];
105
- if (match)
106
- return match;
107
- }
108
- return undefined;
109
- }
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmtzcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQ0wscUJBQXFCLEdBRXRCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0QsMkVBQTJFO0FBQzNFLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0FBTXZDLHNGQUFzRjtBQUN0RixNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLE1BQStDO0lBRS9DLE9BQU8seUJBQXlCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3pGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQ2xFLHFCQUFxQixFQUFFLENBQUMsdUJBQXVCLEVBQUUsQ0FDbEQsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU8sTUFBTSxDQUFDLHNCQUFzQixFQUFFLEVBQUUsTUFBTSxDQUFDLHVCQUF1QixFQUFFLENBQUM7QUFDM0UsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCO0lBQ3RDLE9BQU8scUJBQXFCLEVBQUUsSUFBSSxDQUFDLE1BQU0seUJBQXlCLEVBQUUsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQjtJQUMvQixJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsTUFBTSxrQkFBa0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzdDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQUMsTUFBd0I7SUFDL0QsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztJQUN6RSxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUVwQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUN4RCxNQUFNLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDM0MsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNyQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxxRkFBcUY7QUFDckYsU0FBUyxtQkFBbUIsQ0FBQyxHQUFZO0lBQ3ZDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN0RixNQUFNLEtBQUssR0FBSSxHQUE4QixDQUFDLFFBQVEsQ0FBQztJQUN2RCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzlFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWU7SUFDbkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxrQkFBa0IsRUFBRSxDQUFDO0lBQzFDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxVQUFVO1lBQUUsT0FBTyxVQUFVLENBQUM7SUFDcEMsQ0FBQztJQUNELE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuRSxJQUFJLGNBQWM7UUFBRSxPQUFPLGNBQWMsQ0FBQztJQUMxQyxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUFDLGFBQXNCO0lBQ3pELE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQzlELElBQUksV0FBVztRQUFFLE9BQU8sV0FBVyxDQUFDO0lBQ3BDLGFBQWEsR0FBRyxhQUFhLElBQUksQ0FBQyxNQUFNLGVBQWUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDO0lBQ2pFLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc29sdmUgdGhlIGN1cnJlbnQgRGF0YWJyaWNrcyB3b3Jrc3BhY2UncyBVUkwsIG51bWVyaWMgaWQsIGFuZCBjbGllbnQgZnJvbVxuICogdGhlIGFjdGl2ZSBleGVjdXRpb24gY29udGV4dCAoQXBwS2l0LCB3aGVuIGluaXRpYWxpemVkKSwgYSBkZWZhdWx0XG4gKiB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fSwgb3IgdGhlIGVudmlyb25tZW50LiBTZXJ2ZXItb25seS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgY3JlYXRlV29ya3NwYWNlQ2xpZW50LFxuICB0eXBlIFdvcmtzcGFjZUNsaWVudCBhcyBBcHBLaXRXb3Jrc3BhY2VDbGllbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZnVuY3Rpb25Nb2R1bGUsIG5ldCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKiBEYXRhYnJpY2tzIHdvcmtzcGFjZSBpZHMgYXJlIGEgMTAtMjAgZGlnaXQgcnVuIGVtYmVkZGVkIGluIHRoZSBob3N0LiAqL1xuY29uc3QgV09SS1NQQUNFX0lEX1JFR0VYID0gL1xcZHsxMCwyMH0vO1xuXG4vKiogTGVnYWN5IFNESyBjbGllbnQgZXhwb3NlZCBieSBBcHBLaXQgZm9yIEFQSXMgbm90IHlldCBvbiBpdHMgZmFjYWRlLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlQ2xpZW50ID0gUmV0dXJuVHlwZTxBcHBLaXRXb3Jrc3BhY2VDbGllbnRbXCJ0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudFwiXT47XG50eXBlIENvbmZpZyA9IFdvcmtzcGFjZUNsaWVudFtcImNvbmZpZ1wiXTtcblxuLyoqIFJlc29sdmUgQXBwS2l0J3MgZmFjYWRlIG9yIGFuIGV4aXN0aW5nIGxlZ2FjeSBjbGllbnQgdG8gdGhlIGxlZ2FjeSBTREsgc3VyZmFjZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChcbiAgY2xpZW50OiBBcHBLaXRXb3Jrc3BhY2VDbGllbnQgfCBXb3Jrc3BhY2VDbGllbnQsXG4pOiBXb3Jrc3BhY2VDbGllbnQge1xuICByZXR1cm4gXCJ0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudFwiIGluIGNsaWVudCA/IGNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpIDogY2xpZW50O1xufVxuXG4vKipcbiAqIExhemlseS1jb25zdHJ1Y3RlZCBkZWZhdWx0IGBXb3Jrc3BhY2VDbGllbnRgIChlbnYgLyBwcm9maWxlIGF1dGgpLCBtZW1vaXplZCBzb1xuICogY29uc3RydWN0aW9uIGhhcHBlbnMgYXQgbW9zdCBvbmNlIHBlciBwcm9jZXNzLiBVc2VkIG9ubHkgd2hlbiB0aGVyZSdzIG5vXG4gKiBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQgdG8gYm9ycm93IGEgY2xpZW50IGZyb20uXG4gKi9cbmNvbnN0IGdldERlZmF1bHRXb3Jrc3BhY2VDbGllbnQgPSBmdW5jdGlvbk1vZHVsZS5tZW1vaXplKGFzeW5jICgpID0+XG4gIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpLnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCksXG4pO1xuXG4vKipcbiAqIFRoZSBBcHBLaXQgZXhlY3V0aW9uLWNvbnRleHQgd29ya3NwYWNlIGNsaWVudCB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlXG4gKiBgdW5kZWZpbmVkYC4gTmV2ZXIgY29uc3RydWN0cyBhIGZhbGxiYWNrIGNsaWVudCBhbmQgbmV2ZXIgdGhyb3dzIGZvciBhXG4gKiBtaXNzaW5nIEFwcEtpdCBzY29wZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeUdldFdvcmtzcGFjZUNsaWVudCgpOiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9OiB7QGxpbmsgdHJ5R2V0V29ya3NwYWNlQ2xpZW50fSBmaXJzdCwgZWxzZVxuICogYSBtZW1vaXplZCBkZWZhdWx0IGNsaWVudCBmcm9tIGVudiAvIHByb2ZpbGUgYXV0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZUNsaWVudCgpOiBQcm9taXNlPFdvcmtzcGFjZUNsaWVudD4ge1xuICByZXR1cm4gdHJ5R2V0V29ya3NwYWNlQ2xpZW50KCkgPz8gKGF3YWl0IGdldERlZmF1bHRXb3Jrc3BhY2VDbGllbnQoKSk7XG59XG5cbi8qKlxuICogVGhlIGFjdGl2ZSB3b3Jrc3BhY2UgYENvbmZpZ2A6IHRoZSBBcHBLaXQgZXhlY3V0aW9uLWNvbnRleHQgY2xpZW50J3MgY29uZmlnXG4gKiB3aGVuIEFwcEtpdCBpcyBpbml0aWFsaXplZCwgZWxzZSB0aGUgZGVmYXVsdCBjbGllbnQncy4gUmV0dXJucyBgdW5kZWZpbmVkYFxuICogKG5ldmVyIHRocm93cykgd2hlbiBuZWl0aGVyIGlzIGF2YWlsYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V29ya3NwYWNlQ29uZmlnKCk6IFByb21pc2U8Q29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCBnZXRXb3Jrc3BhY2VDbGllbnQoKSkuY29uZmlnO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQ3VycmVudCBEYXRhYnJpY2tzIHVzZXJuYW1lIGZvciB3b3Jrc3BhY2UgaG9tZSBwYXRoc1xuICogKGAvV29ya3NwYWNlL1VzZXJzLzx1c2VyTmFtZT5gKS5cbiAqXG4gKiBQcmVmZXJzIGB1c2VyTmFtZWAgb24gdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCB3aGVuIHNldCwgb3RoZXJ3aXNlXG4gKiBjYWxscyBgY3VycmVudFVzZXIubWUoKWAgb24ge0BsaW5rIGNsaWVudH0gKG9yIHtAbGluayBnZXRXb3Jrc3BhY2VDbGllbnR9KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyTmFtZShjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb250ZXh0VXNlciA9IHJlYWRDb250ZXh0VXNlck5hbWUoYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKSk7XG4gIGlmIChjb250ZXh0VXNlcikgcmV0dXJuIGNvbnRleHRVc2VyO1xuXG4gIGNvbnN0IHJlc29sdmVkID0gY2xpZW50ID8/IChhd2FpdCBnZXRXb3Jrc3BhY2VDbGllbnQoKSk7XG4gIGNvbnN0IG1lID0gYXdhaXQgcmVzb2x2ZWQuY3VycmVudFVzZXIubWUoKTtcbiAgY29uc3QgdXNlck5hbWUgPSBtZS51c2VyTmFtZT8udHJpbSgpO1xuICBpZiAoIXVzZXJOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBjdXJyZW50VXNlci5tZSgpIGRpZCBub3QgcmV0dXJuIGEgdXNlck5hbWVcIik7XG4gIH1cbiAgcmV0dXJuIHVzZXJOYW1lO1xufVxuXG4vKiogQmVzdC1lZmZvcnQgYHVzZXJOYW1lYCBvZmYgYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IChzaGFwZSB2YXJpZXMgYnkgbW9kZSkuICovXG5mdW5jdGlvbiByZWFkQ29udGV4dFVzZXJOYW1lKGN0eDogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgY3R4ICE9PSBcIm9iamVjdFwiIHx8IGN0eCA9PT0gbnVsbCB8fCAhKFwidXNlck5hbWVcIiBpbiBjdHgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB2YWx1ZSA9IChjdHggYXMgeyB1c2VyTmFtZT86IHVua25vd24gfSkudXNlck5hbWU7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpID8gdmFsdWUudHJpbSgpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGN1cnJlbnQgd29ya3NwYWNlIGhvc3QgYXMgYSBgbmV0LlVybEJ1aWxkZXJgOiB0aGUgd29ya3NwYWNlXG4gKiBgQ29uZmlnYCBob3N0IGZpcnN0LCB0aGVuIHRoZSBgREFUQUJSSUNLU19IT1NUYCBlbnYgdmFyLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V29ya3NwYWNlVXJsKCk6IFByb21pc2U8bmV0LlVybEJ1aWxkZXIgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0V29ya3NwYWNlQ29uZmlnKCk7XG4gIGlmIChjb25maWcpIHtcbiAgICBjb25zdCBjb25maWdIb3N0ID0gbmV0LnVybEJ1aWxkZXIoYXdhaXQgY29uZmlnLmdldEhvc3QoKSk7XG4gICAgaWYgKGNvbmZpZ0hvc3QpIHJldHVybiBjb25maWdIb3N0O1xuICB9XG4gIGNvbnN0IGRhdGFicmlja3NIb3N0ID0gbmV0LnVybEJ1aWxkZXIocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUKTtcbiAgaWYgKGRhdGFicmlja3NIb3N0KSByZXR1cm4gZGF0YWJyaWNrc0hvc3Q7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbnVtZXJpYyB3b3Jrc3BhY2UgaWQ6IHRoZSB3b3Jrc3BhY2UgYENvbmZpZ2AncyBgd29ya3NwYWNlSWRgXG4gKiBmaXJzdCwgZWxzZSB0aGUgMTAtMjAgZGlnaXQgcnVuIG9mIGB3b3Jrc3BhY2VIb3N0YCAoZGVmYXVsdGluZyB0b1xuICoge0BsaW5rIGdldFdvcmtzcGFjZVVybH0ncyBob3N0KS4gYHVuZGVmaW5lZGAgd2hlbiBuZWl0aGVyIHlpZWxkcyBhbiBpZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZUlkKHdvcmtzcGFjZUhvc3Q/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB3b3Jrc3BhY2VJZCA9IChhd2FpdCBnZXRXb3Jrc3BhY2VDb25maWcoKSk/LndvcmtzcGFjZUlkO1xuICBpZiAod29ya3NwYWNlSWQpIHJldHVybiB3b3Jrc3BhY2VJZDtcbiAgd29ya3NwYWNlSG9zdCA9IHdvcmtzcGFjZUhvc3QgPz8gKGF3YWl0IGdldFdvcmtzcGFjZVVybCgpKT8uaG9zdDtcbiAgaWYgKHdvcmtzcGFjZUhvc3QpIHtcbiAgICBjb25zdCBtYXRjaCA9IHdvcmtzcGFjZUhvc3QubWF0Y2goV09SS1NQQUNFX0lEX1JFR0VYKT8uWzBdO1xuICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=