@dbx-tools/databricks 0.9.40 → 0.9.43
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/index.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +2 -2
- package/lib/src/databricks-fs.d.ts +20 -0
- package/lib/src/databricks-fs.js +54 -1
- package/package.json +7 -7
- package/src/databricks-fs.ts +68 -0
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
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.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.43";
|
|
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";
|
|
@@ -12,7 +12,7 @@ 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";
|
|
15
|
-
export type { DatabricksFileSystemOptions } from "./src/databricks-fs.ts";
|
|
15
|
+
export type { DatabricksFileSystemOptions, DatabricksStreamWriteOptions } 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";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/databricks";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.43";
|
|
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";
|
|
@@ -8,7 +8,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";
|
|
11
|
-
export type { DatabricksFileSystemOptions } from "./src/databricks-fs.ts";
|
|
11
|
+
export type { DatabricksFileSystemOptions, DatabricksStreamWriteOptions } 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";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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
|
+
export const PACKAGE_VERSION = "0.9.43";
|
|
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";
|
|
@@ -12,4 +12,4 @@ 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,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS40M1wiO1xuZXhwb3J0ICogYXMgY2xvdWQgZnJvbSBcIi4vc3JjL2Nsb3VkLnRzXCI7XG5leHBvcnQgKiBhcyBkYXRhYnJpY2tzRlMgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtZnMudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3NQYXRoIGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmV4cG9ydCAqIGFzIG5ldCBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2VDbGllbnQgZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS1jbGllbnQudHNcIjtcbmV4cG9ydCB7IFJBTkdFX0NBQ0hFX1RUTF9NUywgQ2xvdWRQcm92aWRlciB9IGZyb20gXCIuL3NyYy9jbG91ZC50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbG91ZExvY2F0aW9uIH0gZnJvbSBcIi4vc3JjL2Nsb3VkLnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLWZzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGaWxlU3lzdGVtT3B0aW9ucywgRGF0YWJyaWNrc1N0cmVhbVdyaXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLWZzLnRzXCI7XG5leHBvcnQgeyBpc0hvbWVSZWxhdGl2ZVBhdGggfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1wYXRoLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGaWxlc0JhY2tlbmQsIE5vcm1hbGl6ZURhdGFicmlja3NSb290T3B0aW9ucywgUmVzb2x2ZURhdGFicmlja3NSb290T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmV4cG9ydCB7IGdldFB1YmxpY0lwIH0gZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlLWNsaWVudC50c1wiO1xuIl19
|
|
@@ -47,6 +47,11 @@ export interface DatabricksFileSystemOptions {
|
|
|
47
47
|
*/
|
|
48
48
|
createRoot?: boolean;
|
|
49
49
|
}
|
|
50
|
+
/** Existing-file behavior for a streamed UC Volume upload. */
|
|
51
|
+
export interface DatabricksStreamWriteOptions {
|
|
52
|
+
/** Replace an existing file. Defaults to true. */
|
|
53
|
+
overwrite?: boolean;
|
|
54
|
+
}
|
|
50
55
|
/**
|
|
51
56
|
* {@link FileSystem} implementation over Databricks workspace files, UC
|
|
52
57
|
* volumes, and DBFS.
|
|
@@ -69,6 +74,21 @@ export declare class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
69
74
|
* workspace current user when needed.
|
|
70
75
|
*/
|
|
71
76
|
static create(options: DatabricksFileSystemOptions): Promise<DatabricksFileSystem>;
|
|
77
|
+
/**
|
|
78
|
+
* Open a UC Volume file as a web stream without buffering it in memory.
|
|
79
|
+
*
|
|
80
|
+
* Reuse this for large Volume transfers. Workspace files and DBFS retain
|
|
81
|
+
* their existing buffered APIs because their SDK surfaces are not raw streams.
|
|
82
|
+
*/
|
|
83
|
+
readStream(inputPath: string): Promise<globalThis.ReadableStream<Uint8Array>>;
|
|
84
|
+
/**
|
|
85
|
+
* Stream a file to a UC Volume without loading it completely into memory.
|
|
86
|
+
*
|
|
87
|
+
* Parent directories are created consistently with {@link writeFile}. The
|
|
88
|
+
* Files API owns transfer retries and authentication through the injected
|
|
89
|
+
* {@link WorkspaceClient}.
|
|
90
|
+
*/
|
|
91
|
+
writeStream(inputPath: string, content: globalThis.ReadableStream<Uint8Array>, options?: DatabricksStreamWriteOptions): Promise<void>;
|
|
72
92
|
protected onInit(): Promise<void>;
|
|
73
93
|
/** Run the handler for `absolutePath`'s Databricks API with the live client. */
|
|
74
94
|
private dispatch;
|
package/lib/src/databricks-fs.js
CHANGED
|
@@ -60,6 +60,59 @@ export class DatabricksFileSystem extends BaseFileSystem {
|
|
|
60
60
|
const root = await resolveDatabricksRoot(options.root, { client });
|
|
61
61
|
return new DatabricksFileSystem({ ...options, root, client });
|
|
62
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Open a UC Volume file as a web stream without buffering it in memory.
|
|
65
|
+
*
|
|
66
|
+
* Reuse this for large Volume transfers. Workspace files and DBFS retain
|
|
67
|
+
* their existing buffered APIs because their SDK surfaces are not raw streams.
|
|
68
|
+
*/
|
|
69
|
+
async readStream(inputPath) {
|
|
70
|
+
const resolvedPath = await this.resolveFor(inputPath);
|
|
71
|
+
try {
|
|
72
|
+
return await this.dispatch(resolvedPath, {
|
|
73
|
+
dbfs: unreachableBackend,
|
|
74
|
+
workspace: unreachableBackend,
|
|
75
|
+
volumes: async (client) => {
|
|
76
|
+
const response = await client.files.download({ file_path: resolvedPath });
|
|
77
|
+
const contents = response.contents;
|
|
78
|
+
if (!contents) {
|
|
79
|
+
throw new FileSystemError("IO_ERROR", "Volume download returned no content", resolvedPath);
|
|
80
|
+
}
|
|
81
|
+
return contents;
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
throw baseFS.mapFileSystemError(error, resolvedPath);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Stream a file to a UC Volume without loading it completely into memory.
|
|
91
|
+
*
|
|
92
|
+
* Parent directories are created consistently with {@link writeFile}. The
|
|
93
|
+
* Files API owns transfer retries and authentication through the injected
|
|
94
|
+
* {@link WorkspaceClient}.
|
|
95
|
+
*/
|
|
96
|
+
async writeStream(inputPath, content, options = {}) {
|
|
97
|
+
await this._init();
|
|
98
|
+
this.assertWritable("write stream");
|
|
99
|
+
await this.ensureParentDirectory(inputPath);
|
|
100
|
+
const resolvedPath = await this.resolveFor(inputPath, { allowMissing: true });
|
|
101
|
+
try {
|
|
102
|
+
await this.dispatch(resolvedPath, {
|
|
103
|
+
dbfs: unreachableBackend,
|
|
104
|
+
workspace: unreachableBackend,
|
|
105
|
+
volumes: (client) => client.files.upload({
|
|
106
|
+
file_path: resolvedPath,
|
|
107
|
+
contents: content,
|
|
108
|
+
overwrite: options.overwrite ?? true,
|
|
109
|
+
}),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw baseFS.mapFileSystemError(error, resolvedPath);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
63
116
|
async onInit() {
|
|
64
117
|
this.client = this.clientOption ?? (await getWorkspaceClient());
|
|
65
118
|
}
|
|
@@ -324,4 +377,4 @@ function bufferToReadableStream(buffer) {
|
|
|
324
377
|
},
|
|
325
378
|
});
|
|
326
379
|
}
|
|
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
|
|
380
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1mcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYnJpY2tzLWZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFDTCxjQUFjLEVBQ2QsTUFBTSxFQUNOLGVBQWUsRUFDZixTQUFTLEdBS1YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IscUJBQXFCLEdBRXRCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUF3QixNQUFNLHVCQUF1QixDQUFDO0FBRWpGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdkMsbUZBQW1GO0FBQ25GLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBcUQ1Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsY0FBNEI7SUFDNUQsTUFBTSxDQUE4QjtJQUMzQixZQUFZLENBQThCO0lBRTNELFlBQVksT0FBb0M7UUFDOUMsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNuRixLQUFLLENBQUM7WUFDSixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxjQUFjLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEQsT0FBTyxFQUFFLFlBQVk7WUFDckIsSUFBSTtZQUNKLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixVQUFVLEVB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QUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVDLElBQUksSUFBSTtZQUFFLE1BQU07UUFDaEIsSUFBSSxLQUFLO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLE1BQWM7SUFDNUMsT0FBTyxJQUFJLGNBQWMsQ0FBYTtRQUNwQyxLQUFLLENBQUMsVUFBVTtZQUNkLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMzQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckIsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGFicmlja3Mge0BsaW5rIEZpbGVTeXN0ZW19IGJhY2tlZCBieSB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fS5cbiAqXG4gKiBFeHRlbmRzIHtAbGluayBCYXNlRmlsZVN5c3RlbX0uIFJvdXRlcyBJL08gYnkgYWJzb2x1dGUgcGF0aDpcbiAqIC0gYC9Xb3Jrc3BhY2VgLCBgL1VzZXJzYCwgYC9SZXBvc2AsIGAvU2hhcmVkYCDihpIgd29ya3NwYWNlIG9iamVjdHMgQVBJXG4gKiAtIGAvVm9sdW1lcy8uLi5gIChvciBgY2F0YWxvZy5zY2hlbWEudm9sdW1lYCByb290cykg4oaSIFVuaXR5IENhdGFsb2cgRmlsZXMgQVBJXG4gKiAtIGAvZGJmcy8uLi5gIOKGkiBEQkZTIEFQSVxuICpcbiAqIEV2ZXJ5IHByaW1pdGl2ZSBwaWNrcyBpdHMgQVBJIHRocm91Z2gge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtLmRpc3BhdGNofVxuICogcmF0aGVyIHRoYW4gcmUtYnJhbmNoaW5nIGJ5IGhhbmQsIGFuZCBlcnJvciBub3JtYWxpemF0aW9uIGlzIGluaGVyaXRlZCBmcm9tXG4gKiB7QGxpbmsgQmFzZUZpbGVTeXN0ZW19LCBzbyBhIHByaW1pdGl2ZSBoZXJlIGlzIGp1c3QgdGhlIFNESyBjYWxsLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBoYXNoLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgQmFzZUZpbGVTeXN0ZW0sXG4gIGJhc2VGUyxcbiAgRmlsZVN5c3RlbUVycm9yLFxuICBwb3NpeFBhdGgsXG4gIHR5cGUgQ29weU9wdGlvbnMsXG4gIHR5cGUgRmlsZUVudHJ5LFxuICB0eXBlIEZpbGVTdGF0LFxuICB0eXBlIFdyaXRlRmlsZU9wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHtcbiAgaXNIb21lUmVsYXRpdmVQYXRoLFxuICBub3JtYWxpemVEYXRhYnJpY2tzUm9vdCxcbiAgcmVzb2x2ZURhdGFicmlja3NGaWxlc0JhY2tlbmQsXG4gIHJlc29sdmVEYXRhYnJpY2tzUm9vdCxcbiAgdHlwZSBEYXRhYnJpY2tzRmlsZXNCYWNrZW5kLFxufSBmcm9tIFwiLi9kYXRhYnJpY2tzLXBhdGgudHNcIjtcbmltcG9ydCB7IGdldFdvcmtzcGFjZUNsaWVudCwgdHlwZSBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiLi93b3Jrc3BhY2UtY2xpZW50LnRzXCI7XG5cbmNvbnN0IERCRlNfUkVBRF9DSFVOS19CWVRFUyA9IDEwMjQgKiAxMDI0O1xuY29uc3QgREJGU19QVVRfTUFYX0JZVEVTID0gMTAyNCAqIDEwMjQ7XG5cbi8qKiBTZWdtZW50cyBpbiBgL1ZvbHVtZXMvPGNhdGFsb2c+LzxzY2hlbWE+Lzx2b2x1bWU+YCwgcHJvdmlzaW9uZWQgb3V0IG9mIGJhbmQuICovXG5jb25zdCBWT0xVTUVfUk9PVF9ERVBUSCA9IDQ7XG5cbi8qKlxuICogT25lIGhhbmRsZXIgcGVyIERhdGFicmlja3MgQVBJLCBrZXllZCBieSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVzQmFja2VuZH0gc29cbiAqIGFkZGluZyBhIGJhY2tlbmQgaXMgYSBjb21waWxlIGVycm9yIHVudGlsIGV2ZXJ5IGNhbGwgc2l0ZSBoYW5kbGVzIGl0LlxuICovXG50eXBlIEJhY2tlbmRIYW5kbGVyczxUPiA9IFJlY29yZDxEYXRhYnJpY2tzRmlsZXNCYWNrZW5kLCAoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpID0+IFByb21pc2U8VD4+O1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc0ZpbGVTeXN0ZW1PcHRpb25zIHtcbiAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyLiBEZWZhdWx0cyB0byBhIHN0YWJsZSBoYXNoIG9mIHRoZSBub3JtYWxpemVkIHJvb3QuICovXG4gIGlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWxlc3lzdGVtIHJvb3QuIEFjY2VwdHM6XG4gICAqIC0gYC9Wb2x1bWVzL2NhdGFsb2cvc2NoZW1hL3ZvbHVtZWAgKGFsc28gYC9Wb2x1bWUvLi4uYClcbiAgICogLSBgY2F0YWxvZy5zY2hlbWEudm9sdW1lYFxuICAgKiAtIGB+YCAvIGB+Ly4uLmAg4oaSIGAvV29ya3NwYWNlL1VzZXJzLzx1c2VyTmFtZT4vLi4uYCAobmVlZHMge0BsaW5rIHVzZXJOYW1lfSxcbiAgICogICBvciB1c2Uge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtLmNyZWF0ZX0pXG4gICAqIC0gYC9Xb3Jrc3BhY2UvLi4uYCwgYC9Vc2Vycy8uLi5gLCBgL1JlcG9zLy4uLmAsIGAvU2hhcmVkLy4uLmBcbiAgICogLSBgL2RiZnMvLi4uYFxuICAgKi9cbiAgcm9vdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2VybmFtZSBmb3IgZXhwYW5kaW5nIGB+YC4gV2hlbiBvbWl0dGVkIGFuZCB7QGxpbmsgcm9vdH0gaXMgaG9tZS1yZWxhdGl2ZSxcbiAgICogcHJlZmVyIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbS5jcmVhdGV9IHdoaWNoIHJlc29sdmVzIGl0IHZpYVxuICAgKiBgZ2V0Q3VycmVudFVzZXJOYW1lYC5cbiAgICovXG4gIHVzZXJOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQuIERlZmF1bHRzIHRvIGB0cnlHZXRXb3Jrc3BhY2VDbGllbnQoKWAsIG90aGVyd2lzZVxuICAgKiBhIGRlZmF1bHQge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0gZnJvbSBlbnYgLyBwcm9maWxlIGF1dGguXG4gICAqL1xuICBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQ7XG5cbiAgLyoqIEJsb2NrIGFsbCB3cml0ZSBvcGVyYXRpb25zLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUge0BsaW5rIHJvb3R9IChhbmQgcGFyZW50cykgZHVyaW5nIGluaXQuIERlZmF1bHRzIHRvIGZhbHNlICh2b2x1bWVcbiAgICogYW5kIHdvcmtzcGFjZSByb290cyBhcmUgdXN1YWxseSBwcm92aXNpb25lZCBvdXQgb2YgYmFuZCkuXG4gICAqL1xuICBjcmVhdGVSb290PzogYm9vbGVhbjtcbn1cblxuLyoqIEV4aXN0aW5nLWZpbGUgYmVoYXZpb3IgZm9yIGEgc3RyZWFtZWQgVUMgVm9sdW1lIHVwbG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1N0cmVhbVdyaXRlT3B0aW9ucyB7XG4gIC8qKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGUuIERlZmF1bHRzIHRvIHRydWUuICovXG4gIG92ZXJ3cml0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICoge0BsaW5rIEZpbGVTeXN0ZW19IGltcGxlbWVudGF0aW9uIG92ZXIgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZmlsZXMsIFVDXG4gKiB2b2x1bWVzLCBhbmQgREJGUy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHsgcm9vdDogXCJtYWluLmRlZmF1bHQuYXNzZXRzXCIgfSk7XG4gKiBhd2FpdCBmcy53cml0ZUZpbGUoXCJub3Rlcy9oZWxsby50eHRcIiwgXCJoaVwiKTtcbiAqXG4gKiBjb25zdCBob21lID0gYXdhaXQgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0uY3JlYXRlKHsgcm9vdDogXCJ+XCIgfSk7XG4gKiBjb25zdCBsaXN0aW5nID0gYXdhaXQgaG9tZS5yZWFkZGlyKFwiLlwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0gZXh0ZW5kcyBCYXNlRmlsZVN5c3RlbTxcImRhdGFicmlja3NcIj4ge1xuICBwcml2YXRlIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudE9wdGlvbjogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IERhdGFicmlja3NGaWxlU3lzdGVtT3B0aW9ucykge1xuICAgIGNvbnN0IHJvb3QgPSBub3JtYWxpemVEYXRhYnJpY2tzUm9vdChvcHRpb25zLnJvb3QsIHsgdXNlck5hbWU6IG9wdGlvbnMudXNlck5hbWUgfSk7XG4gICAgc3VwZXIoe1xuICAgICAgaWQ6IG9wdGlvbnMuaWQgPz8gYGRhdGFicmlja3MtJHtoYXNoLmZudkhhc2gocm9vdCl9YCxcbiAgICAgIGJhY2tlbmQ6IFwiZGF0YWJyaWNrc1wiLFxuICAgICAgcm9vdCxcbiAgICAgIHJlYWRPbmx5OiBvcHRpb25zLnJlYWRPbmx5LFxuICAgICAgY3JlYXRlUm9vdDogb3B0aW9ucy5jcmVhdGVSb290ID8/IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMuY2xpZW50T3B0aW9uID0gb3B0aW9ucy5jbGllbnQ7XG4gICAgdGhpcy5jbGllbnQgPSBvcHRpb25zLmNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19LCByZXNvbHZpbmcgYH5gIHJvb3RzIHZpYSB0aGVcbiAgICogd29ya3NwYWNlIGN1cnJlbnQgdXNlciB3aGVuIG5lZWRlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUob3B0aW9uczogRGF0YWJyaWNrc0ZpbGVTeXN0ZW1PcHRpb25zKTogUHJvbWlzZTxEYXRhYnJpY2tzRmlsZVN5c3RlbT4ge1xuICAgIGlmICghaXNIb21lUmVsYXRpdmVQYXRoKG9wdGlvbnMucm9vdCkgfHwgb3B0aW9ucy51c2VyTmFtZT8udHJpbSgpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBjbGllbnQgPSBvcHRpb25zLmNsaWVudCA/PyAoYXdhaXQgZ2V0V29ya3NwYWNlQ2xpZW50KCkpO1xuICAgIGNvbnN0IHJvb3QgPSBhd2FpdCByZXNvbHZlRGF0YWJyaWNrc1Jvb3Qob3B0aW9ucy5yb290LCB7IGNsaWVudCB9KTtcbiAgICByZXR1cm4gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHsgLi4ub3B0aW9ucywgcm9vdCwgY2xpZW50IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gYSBVQyBWb2x1bWUgZmlsZSBhcyBhIHdlYiBzdHJlYW0gd2l0aG91dCBidWZmZXJpbmcgaXQgaW4gbWVtb3J5LlxuICAgKlxuICAgKiBSZXVzZSB0aGlzIGZvciBsYXJnZSBWb2x1bWUgdHJhbnNmZXJzLiBXb3Jrc3BhY2UgZmlsZXMgYW5kIERCRlMgcmV0YWluXG4gICAqIHRoZWlyIGV4aXN0aW5nIGJ1ZmZlcmVkIEFQSXMgYmVjYXVzZSB0aGVpciBTREsgc3VyZmFjZXMgYXJlIG5vdCByYXcgc3RyZWFtcy5cbiAgICovXG4gIGFzeW5jIHJlYWRTdHJlYW0oaW5wdXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4+IHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCB0aGlzLnJlc29sdmVGb3IoaW5wdXRQYXRoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZGlzcGF0Y2gocmVzb2x2ZWRQYXRoLCB7XG4gICAgICAgIGRiZnM6IHVucmVhY2hhYmxlQmFja2VuZCxcbiAgICAgICAgd29ya3NwYWNlOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgICAgIHZvbHVtZXM6IGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5maWxlcy5kb3dubG9hZCh7IGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcmVzcG9uc2UuY29udGVudHMgYXMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFxuICAgICAgICAgICAgICBcIklPX0VSUk9SXCIsXG4gICAgICAgICAgICAgIFwiVm9sdW1lIGRvd25sb2FkIHJldHVybmVkIG5vIGNvbnRlbnRcIixcbiAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGJhc2VGUy5tYXBGaWxlU3lzdGVtRXJyb3IoZXJyb3IsIHJlc29sdmVkUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBhIGZpbGUgdG8gYSBVQyBWb2x1bWUgd2l0aG91dCBsb2FkaW5nIGl0IGNvbXBsZXRlbHkgaW50byBtZW1vcnkuXG4gICAqXG4gICAqIFBhcmVudCBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCBjb25zaXN0ZW50bHkgd2l0aCB7QGxpbmsgd3JpdGVGaWxlfS4gVGhlXG4gICAqIEZpbGVzIEFQSSBvd25zIHRyYW5zZmVyIHJldHJpZXMgYW5kIGF1dGhlbnRpY2F0aW9uIHRocm91Z2ggdGhlIGluamVjdGVkXG4gICAqIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9LlxuICAgKi9cbiAgYXN5bmMgd3JpdGVTdHJlYW0oXG4gICAgaW5wdXRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PixcbiAgICBvcHRpb25zOiBEYXRhYnJpY2tzU3RyZWFtV3JpdGVPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuX2luaXQoKTtcbiAgICB0aGlzLmFzc2VydFdyaXRhYmxlKFwid3JpdGUgc3RyZWFtXCIpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50RGlyZWN0b3J5KGlucHV0UGF0aCk7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gYXdhaXQgdGhpcy5yZXNvbHZlRm9yKGlucHV0UGF0aCwgeyBhbGxvd01pc3Npbmc6IHRydWUgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2gocmVzb2x2ZWRQYXRoLCB7XG4gICAgICAgIGRiZnM6IHVucmVhY2hhYmxlQmFja2VuZCxcbiAgICAgICAgd29ya3NwYWNlOiB1bnJlYWNoYWJsZUJhY2tlbmQsXG4gICAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+XG4gICAgICAgICAgY2xpZW50LmZpbGVzLnVwbG9hZCh7XG4gICAgICAgICAgICBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICAgIGNvbnRlbnRzOiBjb250ZW50IGFzIG5ldmVyLFxuICAgICAgICAgICAgb3ZlcndyaXRlOiBvcHRpb25zLm92ZXJ3cml0ZSA/PyB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGJhc2VGUy5tYXBGaWxlU3lzdGVtRXJyb3IoZXJyb3IsIHJlc29sdmVkUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIG9uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsaWVudCA9IHRoaXMuY2xpZW50T3B0aW9uID8/IChhd2FpdCBnZXRXb3Jrc3BhY2VDbGllbnQoKSk7XG4gIH1cblxuICAvKiogUnVuIHRoZSBoYW5kbGVyIGZvciBgYWJzb2x1dGVQYXRoYCdzIERhdGFicmlja3MgQVBJIHdpdGggdGhlIGxpdmUgY2xpZW50LiAqL1xuICBwcml2YXRlIGRpc3BhdGNoPFQ+KGFic29sdXRlUGF0aDogc3RyaW5nLCBoYW5kbGVyczogQmFja2VuZEhhbmRsZXJzPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKCF0aGlzLmNsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgXCJJT19FUlJPUlwiLFxuICAgICAgICBcIkRhdGFicmlja3MgZmlsZXN5c3RlbSBpcyBub3QgaW5pdGlhbGl6ZWQgKG5vIFdvcmtzcGFjZUNsaWVudClcIixcbiAgICAgICAgYWJzb2x1dGVQYXRoLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZXJzW3Jlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKGFic29sdXRlUGF0aCldKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAvKiBQcmltaXRpdmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVJvb3REaXJlY3RvcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVEaXJlY3RvcnlBdCh0aGlzLnJvb3QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlYWRCeXRlc0F0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgdGhpcy5kaXNwYXRjaDxCdWZmZXI+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogKGNsaWVudCkgPT4gdGhpcy5yZWFkRGJmc0ZpbGUoY2xpZW50LCByZXNvbHZlZFBhdGgpLFxuICAgICAgd29ya3NwYWNlOiBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LndvcmtzcGFjZS5leHBvcnQoeyBwYXRoOiByZXNvbHZlZFBhdGgsIGZvcm1hdDogXCJBVVRPXCIgfSk7XG4gICAgICAgIHJldHVybiBkZWNvZGVCYXNlNjQocmVzcG9uc2UuY29udGVudCk7XG4gICAgICB9LFxuICAgICAgdm9sdW1lczogYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5maWxlcy5kb3dubG9hZCh7IGZpbGVfcGF0aDogcmVzb2x2ZWRQYXRoIH0pO1xuICAgICAgICByZXR1cm4gcmVhZFJlc3BvbnNlQm9keShcbiAgICAgICAgICByZXNwb25zZS5jb250ZW50cyBhcyBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHwgdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnVmZmVyLmJ5dGVPZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB3cml0ZUJ5dGVzQXQoXG4gICAgcmVzb2x2ZWRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogVWludDhBcnJheSxcbiAgICBvcHRpb25zOiBSZXF1aXJlZDxXcml0ZUZpbGVPcHRpb25zPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oY29udGVudCk7XG4gICAgY29uc3Qgb3ZlcndyaXRlID0gb3B0aW9ucy5vdmVyd3JpdGU7XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IHRoaXMud3JpdGVEYmZzRmlsZShjbGllbnQsIHJlc29sdmVkUGF0aCwgYnVmZmVyLCBvdmVyd3JpdGUpLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PlxuICAgICAgICBjbGllbnQud29ya3NwYWNlLmltcG9ydCh7XG4gICAgICAgICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgIGZvcm1hdDogXCJBVVRPXCIsXG4gICAgICAgICAgY29udGVudDogYnVmZmVyLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICAgIG92ZXJ3cml0ZSxcbiAgICAgICAgfSksXG4gICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PlxuICAgICAgICBjbGllbnQuZmlsZXMudXBsb2FkKHtcbiAgICAgICAgICBmaWxlX3BhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICBjb250ZW50czogYnVmZmVyVG9SZWFkYWJsZVN0cmVhbShidWZmZXIpIGFzIG5ldmVyLFxuICAgICAgICAgIG92ZXJ3cml0ZSxcbiAgICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlRmlsZUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IGNsaWVudC5kYmZzLmRlbGV0ZSh7IHBhdGg6IHJlc29sdmVkUGF0aCwgcmVjdXJzaXZlOiBmYWxzZSB9KSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT4gY2xpZW50LndvcmtzcGFjZS5kZWxldGUoeyBwYXRoOiByZXNvbHZlZFBhdGgsIHJlY3Vyc2l2ZTogZmFsc2UgfSksXG4gICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PiBjbGllbnQuZmlsZXMuZGVsZXRlKHsgZmlsZV9wYXRoOiByZXNvbHZlZFBhdGggfSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlRGlyZWN0b3J5QXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3BhdGNoPHVua25vd24+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogKGNsaWVudCkgPT4gY2xpZW50LmRiZnMubWtkaXJzKHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pLFxuICAgICAgd29ya3NwYWNlOiAoY2xpZW50KSA9PiBjbGllbnQud29ya3NwYWNlLm1rZGlycyh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+IHRoaXMuY3JlYXRlVm9sdW1lRGlyZWN0b3JpZXMoY2xpZW50LCByZXNvbHZlZFBhdGgpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlbW92ZURpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaDx1bmtub3duPihyZXNvbHZlZFBhdGgsIHtcbiAgICAgIGRiZnM6IChjbGllbnQpID0+IGNsaWVudC5kYmZzLmRlbGV0ZSh7IHBhdGg6IHJlc29sdmVkUGF0aCwgcmVjdXJzaXZlOiBmYWxzZSB9KSxcbiAgICAgIHdvcmtzcGFjZTogKGNsaWVudCkgPT4gY2xpZW50LndvcmtzcGFjZS5kZWxldGUoeyBwYXRoOiByZXNvbHZlZFBhdGgsIHJlY3Vyc2l2ZTogZmFsc2UgfSksXG4gICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PiBjbGllbnQuZmlsZXMuZGVsZXRlRGlyZWN0b3J5KHsgZGlyZWN0b3J5X3BhdGg6IHJlc29sdmVkUGF0aCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBsaXN0RGlyZWN0b3J5QXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEZpbGVFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2g8RmlsZUVudHJ5W10+KHJlc29sdmVkUGF0aCwge1xuICAgICAgZGJmczogKGNsaWVudCkgPT5cbiAgICAgICAgY29sbGVjdChjbGllbnQuZGJmcy5saXN0KHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pLCAoaW5mbykgPT4gKHtcbiAgICAgICAgICBuYW1lOiBwb3NpeFBhdGguYmFzZW5hbWUoaW5mby5wYXRoID8/IFwiXCIpLFxuICAgICAgICAgIHR5cGU6IGluZm8uaXNfZGlyID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIHNpemU6IGluZm8uZmlsZV9zaXplLFxuICAgICAgICB9KSksXG4gICAgICB3b3Jrc3BhY2U6IChjbGllbnQpID0+XG4gICAgICAgIGNvbGxlY3QoY2xpZW50LndvcmtzcGFjZS5saXN0KHsgcGF0aDogcmVzb2x2ZWRQYXRoIH0pLCAoaW5mbykgPT4gKHtcbiAgICAgICAgICBuYW1lOiBwb3NpeFBhdGguYmFzZW5hbWUoaW5mby5wYXRoID8/IFwiXCIpLFxuICAgICAgICAgIHR5cGU6IGluZm8ub2JqZWN0X3R5cGUgPT09IFwiRElSRUNUT1JZXCIgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICAgIH0pKSxcbiAgICAgIHZvbHVtZXM6IChjbGllbnQpID0+XG4gICAgICAgIGNvbGxlY3QoY2xpZW50LmZpbGVzLmxpc3REaXJlY3RvcnlDb250ZW50cyh7IGRpcmVjdG9yeV9wYXRoOiByZXNvbHZlZFBhdGggfSksIChlbnRyeSkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lID8/IHBvc2l4UGF0aC5iYXNlbmFtZShlbnRyeS5wYXRoID8/IFwiXCIpLFxuICAgICAgICAgIHR5cGU6IGVudHJ5LmlzX2RpcmVjdG9yeSA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIixcbiAgICAgICAgICBzaXplOiBlbnRyeS5maWxlX3NpemUsXG4gICAgICAgIH0pKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzdGF0QXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPE9taXQ8RmlsZVN0YXQsIFwicGF0aFwiPj4ge1xuICAgIGNvbnN0IGZhbGxiYWNrTmFtZSA9IHBvc2l4UGF0aC5iYXNlbmFtZShyZXNvbHZlZFBhdGgpIHx8IHBvc2l4UGF0aC5iYXNlbmFtZSh0aGlzLnJvb3QpO1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoPE9taXQ8RmlsZVN0YXQsIFwicGF0aFwiPj4ocmVzb2x2ZWRQYXRoLCB7XG4gICAgICBkYmZzOiBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBjbGllbnQuZGJmcy5nZXRTdGF0dXMoeyBwYXRoOiByZXNvbHZlZFBhdGggfSk7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVkID0gb2JqZWN0LnRvRGF0ZShpbmZvLm1vZGlmaWNhdGlvbl90aW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBwb3NpeFBhdGguYmFzZW5hbWUoaW5mby5wYXRoID8/IHJlc29sdmVkUGF0aCkgfHwgZmFsbGJhY2tOYW1lLFxuICAgICAgICAgIHR5cGU6IGluZm8uaXNfZGlyID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwiLFxuICAgICAgICAgIHNpemU6IGluZm8uZmlsZV9zaXplLFxuICAgICAgICAgIGNyZWF0ZWRBdDogbW9kaWZpZWQsXG4gICAgICAgICAgbW9kaWZpZWRBdDogbW9kaWZpZWQsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgd29ya3NwYWNlOiBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBjbGllbnQud29ya3NwYWNlLmdldFN0YXR1cyh7IHBhdGg6IHJlc29sdmVkUGF0aCB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBwb3NpeFBhdGguYmFzZW5hbWUoaW5mby5wYXRoID8/IHJlc29sdmVkUGF0aCkgfHwgZmFsbGJhY2tOYW1lLFxuICAgICAgICAgIHR5cGU6IGluZm8ub2JqZWN0X3R5cGUgPT09IFwiRElSRUNUT1JZXCIgPyBcImRpcmVjdG9yeVwiIDogXCJmaWxlXCIsXG4gICAgICAgICAgY3JlYXRlZEF0OiBvYmplY3QudG9EYXRlKGluZm8uY3JlYXRlZF9hdCksXG4gICAgICAgICAgbW9kaWZpZWRBdDogb2JqZWN0LnRvRGF0ZShpbmZvLm1vZGlmaWVkX2F0KSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB2b2x1bWVzOiAoY2xpZW50KSA9PiB0aGlzLnN0YXRWb2x1bWVQYXRoKGNsaWVudCwgcmVzb2x2ZWRQYXRoLCBmYWxsYmFja05hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHRyeU1vdmVGaWxlQXQoXG4gICAgc291cmNlUGF0aDogc3RyaW5nLFxuICAgIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIF9vcHRpb25zOiBSZXF1aXJlZDxDb3B5T3B0aW9ucz4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIE9ubHkgREJGUyBleHBvc2VzIGEgc2VydmVyLXNpZGUgbW92ZTsgZXZlcnl0aGluZyBlbHNlIGZhbGxzIGJhY2sgdG8gdGhlXG4gICAgLy8gcG9ydGFibGUgY29weSArIGRlbGV0ZSBpbiBCYXNlRmlsZVN5c3RlbS5cbiAgICBpZiAoXG4gICAgICByZXNvbHZlRGF0YWJyaWNrc0ZpbGVzQmFja2VuZChzb3VyY2VQYXRoKSAhPT0gXCJkYmZzXCIgfHxcbiAgICAgIHJlc29sdmVEYXRhYnJpY2tzRmlsZXNCYWNrZW5kKGRlc3RpbmF0aW9uUGF0aCkgIT09IFwiZGJmc1wiXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2g8dW5rbm93bj4oc291cmNlUGF0aCwge1xuICAgICAgZGJmczogKGNsaWVudCkgPT5cbiAgICAgICAgY2xpZW50LmRiZnMubW92ZSh7IHNvdXJjZV9wYXRoOiBzb3VyY2VQYXRoLCBkZXN0aW5hdGlvbl9wYXRoOiBkZXN0aW5hdGlvblBhdGggfSksXG4gICAgICB3b3Jrc3BhY2U6IHVucmVhY2hhYmxlQmFja2VuZCxcbiAgICAgIHZvbHVtZXM6IHVucmVhY2hhYmxlQmFja2VuZCxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAvKiBCYWNrZW5kLXNwZWNpZmljIEkvTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgLyoqXG4gICAqIFVDIGBjcmVhdGVEaXJlY3RvcnlgIGlzIHNpbmdsZS1sZXZlbCwgc28gd2FsayB0aGUgcGF0aCBjcmVhdGluZyBlYWNoIGxldmVsXG4gICAqIGJlbG93IHRoZSB2b2x1bWUgaXRzZWxmLiBBIGxldmVsIHRoYXQgYWxyZWFkeSBleGlzdHMgaXMgbm90IGFuIGVycm9yLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVWb2x1bWVEaXJlY3RvcmllcyhcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgICBhYnNvbHV0ZVBhdGg6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSBhYnNvbHV0ZVBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgY3VycmVudCA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY3VycmVudCA9IGAke2N1cnJlbnR9LyR7cGFydHNbaV19YDtcbiAgICAgIGlmIChpIDwgVk9MVU1FX1JPT1RfREVQVEgpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LmZpbGVzLmNyZWF0ZURpcmVjdG9yeSh7IGRpcmVjdG9yeV9wYXRoOiBjdXJyZW50IH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIEFscmVhZHkgcHJlc2VudCBpcyBmaW5lOyBhbnl0aGluZyBlbHNlIGlzIGEgcmVhbCBmYWlsdXJlLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsaWVudC5maWxlcy5nZXREaXJlY3RvcnlNZXRhZGF0YSh7IGRpcmVjdG9yeV9wYXRoOiBjdXJyZW50IH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogU3RhdCBhIFVDIHBhdGg6IGZpbGUgbWV0YWRhdGEgZmlyc3QsIHRoZW4gYSBkaXJlY3RvcnkgcHJvYmUuICovXG4gIHByaXZhdGUgYXN5bmMgc3RhdFZvbHVtZVBhdGgoXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICAgYWJzb2x1dGVQYXRoOiBzdHJpbmcsXG4gICAgZmFsbGJhY2tOYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgY2xpZW50LmZpbGVzLmdldE1ldGFkYXRhKHsgZmlsZV9wYXRoOiBhYnNvbHV0ZVBhdGggfSk7XG4gICAgICBjb25zdCBtb2RpZmllZCA9IG9iamVjdC50b0RhdGUobWV0YWRhdGFbXCJsYXN0LW1vZGlmaWVkXCJdKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGZhbGxiYWNrTmFtZSxcbiAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgIHNpemU6IE51bWJlcihtZXRhZGF0YVtcImNvbnRlbnQtbGVuZ3RoXCJdID8/IDApLFxuICAgICAgICBjcmVhdGVkQXQ6IG1vZGlmaWVkLFxuICAgICAgICBtb2RpZmllZEF0OiBtb2RpZmllZCxcbiAgICAgICAgbWltZVR5cGU6IG1ldGFkYXRhW1wiY29udGVudC10eXBlXCJdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChmaWxlRXJyKSB7XG4gICAgICAvLyBBIGRpcmVjdG9yeSBoYXMgbm8gZmlsZSBtZXRhZGF0YSwgYW5kIGFuIHVucmVhZGFibGUgb25lIHJlcG9ydHMgYXNcbiAgICAgIC8vIG1pc3NpbmcgLyBkZW5pZWQgLSBib3RoIGFyZSB3b3J0aCBhIGRpcmVjdG9yeSBwcm9iZSBiZWZvcmUgZmFpbGluZy5cbiAgICAgIGNvbnN0IGNvZGUgPSBiYXNlRlMubWFwRmlsZVN5c3RlbUVycm9yKGZpbGVFcnIsIGFic29sdXRlUGF0aCkuY29kZTtcbiAgICAgIGlmIChjb2RlICE9PSBcIk5PVF9GT1VORFwiICYmIGNvZGUgIT09IFwiUEVSTUlTU0lPTl9ERU5JRURcIikgdGhyb3cgZmlsZUVycjtcbiAgICAgIGF3YWl0IGNsaWVudC5maWxlcy5nZXREaXJlY3RvcnlNZXRhZGF0YSh7IGRpcmVjdG9yeV9wYXRoOiBhYnNvbHV0ZVBhdGggfSk7XG4gICAgICByZXR1cm4geyBuYW1lOiBmYWxsYmFja05hbWUsIHR5cGU6IFwiZGlyZWN0b3J5XCIgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWREYmZzRmlsZShjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCwgYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZGJmcy5yZWFkKHtcbiAgICAgICAgcGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGxlbmd0aDogREJGU19SRUFEX0NIVU5LX0JZVEVTLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBjaHVuayA9IGRlY29kZUJhc2U2NChyZXNwb25zZS5kYXRhKTtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IDApIGJyZWFrO1xuICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPCBEQkZTX1JFQURfQ0hVTktfQllURVMpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZURiZnNGaWxlKFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICAgIGFic29sdXRlUGF0aDogc3RyaW5nLFxuICAgIGJ1ZmZlcjogQnVmZmVyLFxuICAgIG92ZXJ3cml0ZTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPD0gREJGU19QVVRfTUFYX0JZVEVTKSB7XG4gICAgICBhd2FpdCBjbGllbnQuZGJmcy5wdXQoe1xuICAgICAgICBwYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICAgIGNvbnRlbnRzOiBidWZmZXIudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICAgIG92ZXJ3cml0ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgY2xpZW50LmRiZnMuY3JlYXRlKHsgcGF0aDogYWJzb2x1dGVQYXRoLCBvdmVyd3JpdGUgfSk7XG4gICAgY29uc3QgaGFuZGxlID0gY3JlYXRlZC5oYW5kbGU7XG4gICAgaWYgKGhhbmRsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFwiSU9fRVJST1JcIiwgXCJEQkZTIHVwbG9hZCBoYW5kbGUgbWlzc2luZ1wiLCBhYnNvbHV0ZVBhdGgpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgYnVmZmVyLmxlbmd0aDsgb2Zmc2V0ICs9IERCRlNfUFVUX01BWF9CWVRFUykge1xuICAgICAgICBjb25zdCBzbGljZSA9IGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIERCRlNfUFVUX01BWF9CWVRFUyk7XG4gICAgICAgIGF3YWl0IGNsaWVudC5kYmZzLmFkZEJsb2NrKHsgaGFuZGxlLCBkYXRhOiBzbGljZS50b1N0cmluZyhcImJhc2U2NFwiKSB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGF3YWl0IGNsaWVudC5kYmZzLmNsb3NlKHsgaGFuZGxlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGF3YWl0IGNsaWVudC5kYmZzLmNsb3NlKHsgaGFuZGxlIH0pO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogRHJhaW4gYW4gU0RLIGFzeW5jIGl0ZXJhYmxlIGludG8gYSBtYXBwZWQgYXJyYXkuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0PFMsIFQ+KHNvdXJjZTogQXN5bmNJdGVyYWJsZTxTPiwgbWFwOiAoaXRlbTogUykgPT4gVCk6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IGl0ZW1zOiBUW10gPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHNvdXJjZSkgaXRlbXMucHVzaChtYXAoaXRlbSkpO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbi8qKiBIYW5kbGVyIGZvciBhIGJhY2tlbmQgYSBjYWxsIHNpdGUgaGFzIGFscmVhZHkgcnVsZWQgb3V0LiAqL1xuZnVuY3Rpb24gdW5yZWFjaGFibGVCYWNrZW5kKCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcIk5PVF9TVVBQT1JURURcIiwgXCJVbnN1cHBvcnRlZCBEYXRhYnJpY2tzIGJhY2tlbmQgZm9yIHRoaXMgb3BlcmF0aW9uXCIpO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVCYXNlNjQoZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVmZmVyIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSwgXCJiYXNlNjRcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSZXNwb25zZUJvZHkoXG4gIGNvbnRlbnRzOiBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgaWYgKCFjb250ZW50cykgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgY29uc3QgcmVhZGVyID0gY29udGVudHMuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgaWYgKHZhbHVlKSBjaHVua3MucHVzaCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoY2h1bmtzLm1hcCgoY2h1bmspID0+IEJ1ZmZlci5mcm9tKGNodW5rKSkpO1xufVxuXG5mdW5jdGlvbiBidWZmZXJUb1JlYWRhYmxlU3RyZWFtKGJ1ZmZlcjogQnVmZmVyKTogZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -24,12 +24,12 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@databricks/appkit": "0.81.0",
|
|
27
|
-
"@dbx-tools/appkit": "^0.9.
|
|
28
|
-
"@dbx-tools/auth": "^0.9.
|
|
29
|
-
"@dbx-tools/cli-service": "^0.9.
|
|
30
|
-
"@dbx-tools/core": "^0.9.
|
|
31
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
32
|
-
"@dbx-tools/shared-fs": "^0.9.
|
|
27
|
+
"@dbx-tools/appkit": "^0.9.43",
|
|
28
|
+
"@dbx-tools/auth": "^0.9.43",
|
|
29
|
+
"@dbx-tools/cli-service": "^0.9.43",
|
|
30
|
+
"@dbx-tools/core": "^0.9.43",
|
|
31
|
+
"@dbx-tools/shared-core": "^0.9.43",
|
|
32
|
+
"@dbx-tools/shared-fs": "^0.9.43"
|
|
33
33
|
},
|
|
34
34
|
"main": "./lib/index.js",
|
|
35
35
|
"license": "Apache-2.0",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"./package.json": "./package.json"
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
|
-
"version": "0.9.
|
|
68
|
+
"version": "0.9.43",
|
|
69
69
|
"types": "./lib/index.d.ts",
|
|
70
70
|
"dbxToolsConfig": {
|
|
71
71
|
"tags": [
|
package/src/databricks-fs.ts
CHANGED
|
@@ -84,6 +84,12 @@ export interface DatabricksFileSystemOptions {
|
|
|
84
84
|
createRoot?: boolean;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
/** Existing-file behavior for a streamed UC Volume upload. */
|
|
88
|
+
export interface DatabricksStreamWriteOptions {
|
|
89
|
+
/** Replace an existing file. Defaults to true. */
|
|
90
|
+
overwrite?: boolean;
|
|
91
|
+
}
|
|
92
|
+
|
|
87
93
|
/**
|
|
88
94
|
* {@link FileSystem} implementation over Databricks workspace files, UC
|
|
89
95
|
* volumes, and DBFS.
|
|
@@ -127,6 +133,68 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
127
133
|
return new DatabricksFileSystem({ ...options, root, client });
|
|
128
134
|
}
|
|
129
135
|
|
|
136
|
+
/**
|
|
137
|
+
* Open a UC Volume file as a web stream without buffering it in memory.
|
|
138
|
+
*
|
|
139
|
+
* Reuse this for large Volume transfers. Workspace files and DBFS retain
|
|
140
|
+
* their existing buffered APIs because their SDK surfaces are not raw streams.
|
|
141
|
+
*/
|
|
142
|
+
async readStream(inputPath: string): Promise<globalThis.ReadableStream<Uint8Array>> {
|
|
143
|
+
const resolvedPath = await this.resolveFor(inputPath);
|
|
144
|
+
try {
|
|
145
|
+
return await this.dispatch(resolvedPath, {
|
|
146
|
+
dbfs: unreachableBackend,
|
|
147
|
+
workspace: unreachableBackend,
|
|
148
|
+
volumes: async (client) => {
|
|
149
|
+
const response = await client.files.download({ file_path: resolvedPath });
|
|
150
|
+
const contents = response.contents as globalThis.ReadableStream<Uint8Array> | undefined;
|
|
151
|
+
if (!contents) {
|
|
152
|
+
throw new FileSystemError(
|
|
153
|
+
"IO_ERROR",
|
|
154
|
+
"Volume download returned no content",
|
|
155
|
+
resolvedPath,
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
return contents;
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
} catch (error) {
|
|
162
|
+
throw baseFS.mapFileSystemError(error, resolvedPath);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Stream a file to a UC Volume without loading it completely into memory.
|
|
168
|
+
*
|
|
169
|
+
* Parent directories are created consistently with {@link writeFile}. The
|
|
170
|
+
* Files API owns transfer retries and authentication through the injected
|
|
171
|
+
* {@link WorkspaceClient}.
|
|
172
|
+
*/
|
|
173
|
+
async writeStream(
|
|
174
|
+
inputPath: string,
|
|
175
|
+
content: globalThis.ReadableStream<Uint8Array>,
|
|
176
|
+
options: DatabricksStreamWriteOptions = {},
|
|
177
|
+
): Promise<void> {
|
|
178
|
+
await this._init();
|
|
179
|
+
this.assertWritable("write stream");
|
|
180
|
+
await this.ensureParentDirectory(inputPath);
|
|
181
|
+
const resolvedPath = await this.resolveFor(inputPath, { allowMissing: true });
|
|
182
|
+
try {
|
|
183
|
+
await this.dispatch(resolvedPath, {
|
|
184
|
+
dbfs: unreachableBackend,
|
|
185
|
+
workspace: unreachableBackend,
|
|
186
|
+
volumes: (client) =>
|
|
187
|
+
client.files.upload({
|
|
188
|
+
file_path: resolvedPath,
|
|
189
|
+
contents: content as never,
|
|
190
|
+
overwrite: options.overwrite ?? true,
|
|
191
|
+
}),
|
|
192
|
+
});
|
|
193
|
+
} catch (error) {
|
|
194
|
+
throw baseFS.mapFileSystemError(error, resolvedPath);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
130
198
|
protected override async onInit(): Promise<void> {
|
|
131
199
|
this.client = this.clientOption ?? (await getWorkspaceClient());
|
|
132
200
|
}
|