@dbx-tools/cli-model-proxy 0.4.1 → 0.5.1

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.
@@ -1,9 +1,9 @@
1
- #!/usr/bin/env -S npx tsx
1
+ #!/usr/bin/env node
2
2
  /**
3
3
  * `dbx-tools-model-proxy` entry: a local OpenAI-compatible proxy in front of Databricks
4
4
  * Model Serving. Delegates to the commander program in `../src/cli`.
5
5
  */
6
- import { CommanderError, runCli } from "../src/cli";
6
+ import { CommanderError, runCli } from "../src/cli.ts";
7
7
 
8
8
  runCli(process.argv).catch((err: unknown) => {
9
9
  if (err instanceof CommanderError) process.exit(err.exitCode);
package/index.ts 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
 
5
- export * as backend from "./src/backend";
6
- export * as cli from "./src/cli";
7
- export * as defaults from "./src/defaults";
8
- export * as server from "./src/server";
9
- export { DatabricksBackend } from "./src/backend";
10
- export type { BackendOptions } from "./src/backend";
11
- export { buildProgram, runCli, CommanderError } from "./src/cli";
12
- export { DEFAULT_BIND_HOST, DEFAULT_PORT, DEFAULT_RETRY, resolveRetryConfig } from "./src/defaults";
13
- export type { RetryConfig } from "./src/defaults";
14
- export { createProxyServer, parseRetryAfterMs, backoffDelayMs, startProxyServer } from "./src/server";
15
- export type { ProxyServerOptions, StartProxyOptions } from "./src/server";
5
+ export * as backend from "./src/backend.ts";
6
+ export * as cli from "./src/cli.ts";
7
+ export * as defaults from "./src/defaults.ts";
8
+ export * as server from "./src/server.ts";
9
+ export { DatabricksBackend } from "./src/backend.ts";
10
+ export type { BackendOptions } from "./src/backend.ts";
11
+ export { buildProgram, runCli, CommanderError } from "./src/cli.ts";
12
+ export { DEFAULT_BIND_HOST, DEFAULT_PORT, DEFAULT_RETRY, resolveRetryConfig } from "./src/defaults.ts";
13
+ export type { RetryConfig } from "./src/defaults.ts";
14
+ export { createProxyServer, parseRetryAfterMs, backoffDelayMs, startProxyServer } from "./src/server.ts";
15
+ export type { ProxyServerOptions, StartProxyOptions } from "./src/server.ts";
@@ -1,2 +1,2 @@
1
- #!/usr/bin/env -S npx tsx
1
+ #!/usr/bin/env node
2
2
  export {};
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env -S npx tsx
1
+ #!/usr/bin/env node
2
2
  /**
3
3
  * `dbx-tools-model-proxy` entry: a local OpenAI-compatible proxy in front of Databricks
4
4
  * Model Serving. Delegates to the commander program in `../src/cli`.
@@ -10,4 +10,4 @@ runCli(process.argv).catch((err) => {
10
10
  process.stderr.write(`${err instanceof Error ? (err.stack ?? err.message) : String(err)}\n`);
11
11
  process.exit(1);
12
12
  });
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJ4LXRvb2xzLW1vZGVsLXByb3h5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vYmluL2RieC10b29scy1tb2RlbC1wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0E7OztHQUdHO0FBQ0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFcEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFZLEVBQUUsRUFBRTtJQUMxQyxJQUFJLEdBQUcsWUFBWSxjQUFjO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdGLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiAtUyBucHggdHN4XG4vKipcbiAqIGBkYngtdG9vbHMtbW9kZWwtcHJveHlgIGVudHJ5OiBhIGxvY2FsIE9wZW5BSS1jb21wYXRpYmxlIHByb3h5IGluIGZyb250IG9mIERhdGFicmlja3NcbiAqIE1vZGVsIFNlcnZpbmcuIERlbGVnYXRlcyB0byB0aGUgY29tbWFuZGVyIHByb2dyYW0gaW4gYC4uL3NyYy9jbGlgLlxuICovXG5pbXBvcnQgeyBDb21tYW5kZXJFcnJvciwgcnVuQ2xpIH0gZnJvbSBcIi4uL3NyYy9jbGlcIjtcblxucnVuQ2xpKHByb2Nlc3MuYXJndikuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgQ29tbWFuZGVyRXJyb3IpIHByb2Nlc3MuZXhpdChlcnIuZXhpdENvZGUpO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IChlcnIuc3RhY2sgPz8gZXJyLm1lc3NhZ2UpIDogU3RyaW5nKGVycil9XFxuYCk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuIl19
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJ4LXRvb2xzLW1vZGVsLXByb3h5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vYmluL2RieC10b29scy1tb2RlbC1wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0E7OztHQUdHO0FBQ0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFZLEVBQUUsRUFBRTtJQUMxQyxJQUFJLEdBQUcsWUFBWSxjQUFjO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdGLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIGBkYngtdG9vbHMtbW9kZWwtcHJveHlgIGVudHJ5OiBhIGxvY2FsIE9wZW5BSS1jb21wYXRpYmxlIHByb3h5IGluIGZyb250IG9mIERhdGFicmlja3NcbiAqIE1vZGVsIFNlcnZpbmcuIERlbGVnYXRlcyB0byB0aGUgY29tbWFuZGVyIHByb2dyYW0gaW4gYC4uL3NyYy9jbGlgLlxuICovXG5pbXBvcnQgeyBDb21tYW5kZXJFcnJvciwgcnVuQ2xpIH0gZnJvbSBcIi4uL3NyYy9jbGkudHNcIjtcblxucnVuQ2xpKHByb2Nlc3MuYXJndikuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgQ29tbWFuZGVyRXJyb3IpIHByb2Nlc3MuZXhpdChlcnIuZXhpdENvZGUpO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IChlcnIuc3RhY2sgPz8gZXJyLm1lc3NhZ2UpIDogU3RyaW5nKGVycil9XFxuYCk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuIl19
package/lib/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- export * as backend from "./src/backend.js";
2
- export * as cli from "./src/cli.js";
3
- export * as defaults from "./src/defaults.js";
4
- export * as server from "./src/server.js";
5
- export { DatabricksBackend } from "./src/backend.js";
6
- export type { BackendOptions } from "./src/backend.js";
7
- export { buildProgram, runCli, CommanderError } from "./src/cli.js";
8
- export { DEFAULT_BIND_HOST, DEFAULT_PORT, DEFAULT_RETRY, resolveRetryConfig } from "./src/defaults.js";
9
- export type { RetryConfig } from "./src/defaults.js";
10
- export { createProxyServer, parseRetryAfterMs, backoffDelayMs, startProxyServer } from "./src/server.js";
11
- export type { ProxyServerOptions, StartProxyOptions } from "./src/server.js";
1
+ export * as backend from "./src/backend.ts";
2
+ export * as cli from "./src/cli.ts";
3
+ export * as defaults from "./src/defaults.ts";
4
+ export * as server from "./src/server.ts";
5
+ export { DatabricksBackend } from "./src/backend.ts";
6
+ export type { BackendOptions } from "./src/backend.ts";
7
+ export { buildProgram, runCli, CommanderError } from "./src/cli.ts";
8
+ export { DEFAULT_BIND_HOST, DEFAULT_PORT, DEFAULT_RETRY, resolveRetryConfig } from "./src/defaults.ts";
9
+ export type { RetryConfig } from "./src/defaults.ts";
10
+ export { createProxyServer, parseRetryAfterMs, backoffDelayMs, startProxyServer } from "./src/server.ts";
11
+ export type { ProxyServerOptions, StartProxyOptions } from "./src/server.ts";
package/lib/index.js CHANGED
@@ -9,4 +9,4 @@ export { DatabricksBackend } from "./src/backend.js";
9
9
  export { buildProgram, runCli, CommanderError } from "./src/cli.js";
10
10
  export { DEFAULT_BIND_HOST, DEFAULT_PORT, DEFAULT_RETRY, resolveRetryConfig } from "./src/defaults.js";
11
11
  export { createProxyServer, parseRetryAfterMs, backoffDelayMs, startProxyServer } from "./src/server.js";
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxNQUFNLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0ICogYXMgYmFja2VuZCBmcm9tIFwiLi9zcmMvYmFja2VuZFwiO1xuZXhwb3J0ICogYXMgY2xpIGZyb20gXCIuL3NyYy9jbGlcIjtcbmV4cG9ydCAqIGFzIGRlZmF1bHRzIGZyb20gXCIuL3NyYy9kZWZhdWx0c1wiO1xuZXhwb3J0ICogYXMgc2VydmVyIGZyb20gXCIuL3NyYy9zZXJ2ZXJcIjtcbmV4cG9ydCB7IERhdGFicmlja3NCYWNrZW5kIH0gZnJvbSBcIi4vc3JjL2JhY2tlbmRcIjtcbmV4cG9ydCB0eXBlIHsgQmFja2VuZE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYmFja2VuZFwiO1xuZXhwb3J0IHsgYnVpbGRQcm9ncmFtLCBydW5DbGksIENvbW1hbmRlckVycm9yIH0gZnJvbSBcIi4vc3JjL2NsaVwiO1xuZXhwb3J0IHsgREVGQVVMVF9CSU5EX0hPU1QsIERFRkFVTFRfUE9SVCwgREVGQVVMVF9SRVRSWSwgcmVzb2x2ZVJldHJ5Q29uZmlnIH0gZnJvbSBcIi4vc3JjL2RlZmF1bHRzXCI7XG5leHBvcnQgdHlwZSB7IFJldHJ5Q29uZmlnIH0gZnJvbSBcIi4vc3JjL2RlZmF1bHRzXCI7XG5leHBvcnQgeyBjcmVhdGVQcm94eVNlcnZlciwgcGFyc2VSZXRyeUFmdGVyTXMsIGJhY2tvZmZEZWxheU1zLCBzdGFydFByb3h5U2VydmVyIH0gZnJvbSBcIi4vc3JjL3NlcnZlclwiO1xuZXhwb3J0IHR5cGUgeyBQcm94eVNlcnZlck9wdGlvbnMsIFN0YXJ0UHJveHlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NlcnZlclwiO1xuIl19
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV2RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgKiBhcyBiYWNrZW5kIGZyb20gXCIuL3NyYy9iYWNrZW5kLnRzXCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2ZXIgZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc0JhY2tlbmQgfSBmcm9tIFwiLi9zcmMvYmFja2VuZC50c1wiO1xuZXhwb3J0IHR5cGUgeyBCYWNrZW5kT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9iYWNrZW5kLnRzXCI7XG5leHBvcnQgeyBidWlsZFByb2dyYW0sIHJ1bkNsaSwgQ29tbWFuZGVyRXJyb3IgfSBmcm9tIFwiLi9zcmMvY2xpLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0JJTkRfSE9TVCwgREVGQVVMVF9QT1JULCBERUZBVUxUX1JFVFJZLCByZXNvbHZlUmV0cnlDb25maWcgfSBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmV0cnlDb25maWcgfSBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCB7IGNyZWF0ZVByb3h5U2VydmVyLCBwYXJzZVJldHJ5QWZ0ZXJNcywgYmFja29mZkRlbGF5TXMsIHN0YXJ0UHJveHlTZXJ2ZXIgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IFByb3h5U2VydmVyT3B0aW9ucywgU3RhcnRQcm94eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG4iXX0=
package/lib/src/cli.js CHANGED
@@ -161,4 +161,4 @@ export async function runCli(argv) {
161
161
  await buildProgram().parseAsync(argv);
162
162
  }
163
163
  export { CommanderError };
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQStCLE1BQU0seUJBQXlCLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEQsT0FBTyxFQUFFLGlCQUFpQixFQUF1QixNQUFNLFdBQVcsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUU1Qzs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsNkJBQTZCLENBQUM7QUFxQjFELHdEQUF3RDtBQUN4RCxTQUFTLGNBQWMsQ0FBQyxJQUFnQjtJQUN0QyxPQUFPO1FBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xELEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9FLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNB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QU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxvRkFBb0Y7QUFDcEYsU0FBUyxjQUFjLENBQUMsUUFBZ0M7SUFDdEQsT0FBTztRQUNMLEdBQUcsUUFBUTtRQUNYLHVFQUF1RTtRQUN2RSw0REFBNEQ7UUFDNUQsWUFBWSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7S0FDdEQsQ0FBQztBQUNKLENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBQUMsSUFBYztJQUN6QyxNQUFNLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgZGJ4LXRvb2xzLW1vZGVsLXByb3h5YCBDTEkuXG4gKlxuICogUnVuIGJhcmUsIGl0IHNlcnZlczogYSBsb29wYmFjayBPcGVuQUktY29tcGF0aWJsZSBlbmRwb2ludCB0aGF0IGZyb250c1xuICogRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIHdpdGggZnV6enkgbW9kZWwgbmFtZXMgYW5kIHBlci1yZXF1ZXN0IGF1dGguIGBjaGF0YFxuICogc3RhcnRzIHRoYXQgc2FtZSBwcm94eSBhbmQgaGFuZHMgb2ZmIHRvIGFuIG9mZi10aGUtc2hlbGYgdGVybWluYWwgY2xpZW50XG4gKiB3aXJlZCB0byBpdC4gYG1vZGVsc2AgbGlzdHMgdGhlIHJlc29sdmFibGUgZW5kcG9pbnRzOyBgcmVzb2x2ZWAgc2hvd3Mgd2hhdCBhXG4gKiBmdXp6eSBuYW1lIHNuYXBzIHRvLiBBdXRoIGNvbWVzIGZyb20gdGhlIHN0YW5kYXJkIERhdGFicmlja3MgU0RLIHJlc29sdXRpb25cbiAqIChlbnYgdmFycywgYC0tcHJvZmlsZWAsIG9yIGBkYXRhYnJpY2tzIGF1dGggbG9naW5gKS5cbiAqXG4gKiBTaGFyZWQgZmxhZ3MgKGAtLXByb2ZpbGVgLCBgLS13b3Jrc3BhY2UtaG9zdGAsIGAtLXRocmVzaG9sZGAsIOKApikgYXJlIGRlY2xhcmVkXG4gKiBvbiB0aGUgcm9vdCAqYW5kKiByZWRlY2xhcmVkIG9uIHN1YmNvbW1hbmRzIGZvciBoZWxwIGRpc2NvdmVyYWJpbGl0eS4gQ29tbWFuZGVyXG4gKiBwYXJrcyB0aGUgdmFsdWVzIG9uIHRoZSBwYXJlbnQgd2hlbiBib3RoIGRlY2xhcmUgdGhlIHNhbWUgZmxhZywgc28gZXZlcnlcbiAqIHN1YmNvbW1hbmQgYWN0aW9uIG11c3QgcmVhZCB7QGxpbmsgQ29tbWFuZC5vcHRzV2l0aEdsb2JhbHN9IC0gbG9jYWwgYG9wdHNgXG4gKiBhbG9uZSBtaXNzZXMgYC0tcHJvZmlsZWAgKGVudiBgREFUQUJSSUNLU19DT05GSUdfUFJPRklMRWAgc3RpbGwgd29ya2VkIGJlY2F1c2VcbiAqIHRoZSBTREsgcmVhZHMgdGhhdCB3aXRob3V0IHRoZSBDTEkgZmxhZykuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXIgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgeyBjbGFzc2lmeSwgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBDb21tYW5kLCBDb21tYW5kZXJFcnJvciB9IGZyb20gXCJjb21tYW5kZXJcIjtcblxuaW1wb3J0IHsgRGF0YWJyaWNrc0JhY2tlbmQsIHR5cGUgQmFja2VuZE9wdGlvbnMgfSBmcm9tIFwiLi9iYWNrZW5kXCI7XG5pbXBvcnQgeyBERUZBVUxUX0JJTkRfSE9TVCwgREVGQVVMVF9QT1JULCByZXNvbHZlUmV0cnlDb25maWcgfSBmcm9tIFwiLi9kZWZhdWx0c1wiO1xuaW1wb3J0IHsgc3RhcnRQcm94eVNlcnZlciB9IGZyb20gXCIuL3NlcnZlclwiO1xuXG4vKipcbiAqIERlZmF1bHQgdGVybWluYWwgY2xpZW50IGZvciBgY2hhdGAsIGxhdW5jaGVkIHZpYSBgYnVueGAuIE9wZW5IYXJuZXNzIGlzIGFuXG4gKiBPcGVuQUktY29tcGF0aWJsZSBUVUkgdGhhdCByZWFkcyB0aGUgZW5kcG9pbnQgc3RyYWlnaHQgZnJvbSB0aGUgZW52IHdlIGluamVjdFxuICogKGBMTE1fUFJPVklERVI9b3BlbmFpLWNvbXBhdGAgKyBgT1BFTkFJX0JBU0VfVVJMYCksIHNvIG5vIGNvbmZpZyBzdGVwIGlzXG4gKiBuZWVkZWQuIE92ZXJyaWRlIHdpdGggYC0tY2xpZW50YCAvIGBQUk9YWV9DSEFUX0NMSUVOVGAuXG4gKi9cbmNvbnN0IERFRkFVTFRfQ0hBVF9DTElFTlQgPSBcImJ1bnggQGFsaGF6bWlhaS9vcGVuaGFybmVzc1wiO1xuXG4vKiogU2hhcmVkIGAtLXByb2ZpbGVgIC8gYC0td29ya3NwYWNlLWhvc3RgIC8gYC0tdGhyZXNob2xkYCBmbGFncy4gKi9cbmludGVyZmFjZSBDb21tb25PcHRzIHtcbiAgcHJvZmlsZT86IHN0cmluZztcbiAgd29ya3NwYWNlSG9zdD86IHN0cmluZztcbiAgdGhyZXNob2xkPzogc3RyaW5nO1xufVxuXG4vKiogU2hhcmVkIGxpc3RlbiArIGF1dGggZmxhZ3MgZm9yIHRoZSBwcm94eS1zdGFydGluZyBjb21tYW5kcy4gKi9cbmludGVyZmFjZSBTZXJ2ZU9wdHMgZXh0ZW5kcyBDb21tb25PcHRzIHtcbiAgcG9ydDogc3RyaW5nO1xuICBob3N0OiBzdHJpbmc7XG4gIGFwaUtleT86IHN0cmluZztcbiAgLyoqXG4gICAqIENvbW1hbmRlcidzIG5lZ2F0YWJsZS1mbGFnIHZhbHVlIGZvciBgLS1uby1yZXRyeS00MjlgOiBgdHJ1ZWAgYnkgZGVmYXVsdCxcbiAgICogYGZhbHNlYCBvbmNlIHRoZSBmbGFnIGlzIHBhc3NlZC4gT2ZmIG1lYW5zIHJlbGF5IHVwc3RyZWFtIDQyOXMgdW5jaGFuZ2VkLlxuICAgKi9cbiAgcmV0cnk0Mjk6IGJvb2xlYW47XG59XG5cbi8qKiBNYXAgc2hhcmVkIENMSSBmbGFncyBvbnRvIHtAbGluayBCYWNrZW5kT3B0aW9uc30uICovXG5mdW5jdGlvbiBiYWNrZW5kT3B0aW9ucyhvcHRzOiBDb21tb25PcHRzKTogQmFja2VuZE9wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIC4uLihvcHRzLnByb2ZpbGUgPyB7IHByb2ZpbGU6IG9wdHMucHJvZmlsZSB9IDoge30pLFxuICAgIC4uLihvcHRzLndvcmtzcGFjZUhvc3QgPyB7IGhvc3Q6IG9wdHMud29ya3NwYWNlSG9zdCB9IDoge30pLFxuICAgIC4uLihvcHRzLnRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyB0aHJlc2hvbGQ6IE51bWJlcihvcHRzLnRocmVzaG9sZCkgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdWJjb21tYW5kIG9wdGlvbnMgbWVyZ2VkIHdpdGggcGFyZW50IChyb290KSBvcHRpb25zLiBSZXF1aXJlZCBmb3Igc2hhcmVkXG4gKiBmbGFncyB0aGF0IGFyZSBkZWNsYXJlZCBvbiBib3RoIC0gQ29tbWFuZGVyIHN0b3JlcyB0aGVtIG9uIHRoZSBwYXJlbnQsIHNvXG4gKiB0aGUgYWN0aW9uJ3MgbG9jYWwgYG9wdHNgIGFsb25lIG9taXRzIGAtLXByb2ZpbGVgIC8gYC0td29ya3NwYWNlLWhvc3RgLlxuICovXG5mdW5jdGlvbiBnbG9iYWxPcHRzPFQ+KGNvbW1hbmQ6IENvbW1hbmQpOiBUIHtcbiAgcmV0dXJuIGNvbW1hbmQub3B0c1dpdGhHbG9iYWxzKCkgYXMgVDtcbn1cblxuLyoqIENyZWF0ZSB0aGUgYmFja2VuZCBhbmQgc3RhcnQgdGhlIHByb3h5IGZyb20gdGhlIHNoYXJlZCBsaXN0ZW4gZmxhZ3MuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydFByb3h5KFxuICBvcHRzOiBTZXJ2ZU9wdHMsXG4pOiBQcm9taXNlPHsgYmFja2VuZDogRGF0YWJyaWNrc0JhY2tlbmQ7IHNlcnZlcjogU2VydmVyOyB1cmw6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGJhY2tlbmQgPSBhd2FpdCBEYXRhYnJpY2tzQmFja2VuZC5jcmVhdGUoYmFja2VuZE9wdGlvbnMob3B0cykpO1xuICBjb25zdCBhcGlLZXkgPSBvcHRzLmFwaUtleSA/PyBwcm9jZXNzLmVudi5QUk9YWV9BUElfS0VZO1xuICAvLyBgLS1uby1yZXRyeS00MjlgIChvcHRzLnJldHJ5NDI5ID09PSBmYWxzZSkgaXMgdGhlIG9ubHkgZXhwbGljaXQgb3ZlcnJpZGU7XG4gIC8vIG90aGVyd2lzZSByZXNvbHZlUmV0cnlDb25maWcgbGF5ZXJzIFBST1hZX1JFVFJZXyogZW52IHRoZW4gdGhlIG9uLWRlZmF1bHQuXG4gIGNvbnN0IHJldHJ5ID0gcmVzb2x2ZVJldHJ5Q29uZmlnKG9wdHMucmV0cnk0MjkgPT09IGZhbHNlID8geyBlbmFibGVkOiBmYWxzZSB9IDoge30pO1xuICBjb25zdCB7IHNlcnZlciwgdXJsIH0gPSBhd2FpdCBzdGFydFByb3h5U2VydmVyKGJhY2tlbmQsIHtcbiAgICBob3N0OiBvcHRzLmhvc3QsXG4gICAgcG9ydDogTnVtYmVyKG9wdHMucG9ydCksXG4gICAgcmV0cnksXG4gICAgLi4uKGFwaUtleSA/IHsgYXBpS2V5IH0gOiB7fSksXG4gIH0pO1xuICByZXR1cm4geyBiYWNrZW5kLCBzZXJ2ZXIsIHVybCB9O1xufVxuXG4vKiogU2hhcmVkIGF1dGggLyBmdXp6eS1tYXRjaCBmbGFncyBhZGRlZCB0byB0aGUgcm9vdCBhbmQgZXZlcnkgc3ViY29tbWFuZC4gKi9cbmZ1bmN0aW9uIGFkZEF1dGhPcHRpb25zKGNvbW1hbmQ6IENvbW1hbmQpOiBDb21tYW5kIHtcbiAgcmV0dXJuIGNvbW1hbmRcbiAgICAub3B0aW9uKFwiLS1wcm9maWxlIDxwcm9maWxlPlwiLCBcIkRhdGFicmlja3MgY29uZmlnIHByb2ZpbGVcIilcbiAgICAub3B0aW9uKFwiLS13b3Jrc3BhY2UtaG9zdCA8dXJsPlwiLCBcIm92ZXJyaWRlIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob3N0XCIpXG4gICAgLm9wdGlvbihcIi10LCAtLXRocmVzaG9sZCA8bj5cIiwgXCJmdXp6eSBtYXRjaCB0aHJlc2hvbGQgKDAuLjEpXCIpO1xufVxuXG4vKiogQnVpbGQgdGhlIGBkYngtdG9vbHMtbW9kZWwtcHJveHlgIGNvbW1hbmRlciBwcm9ncmFtIChubyBzaWRlIGVmZmVjdHMgdW50aWwgcGFyc2VkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByb2dyYW0oKTogQ29tbWFuZCB7XG4gIC8vIFNlcnZpbmcgaXMgdGhlIHJvb3QgYWN0aW9uLCBub3QgYSBzdWJjb21tYW5kOiB0aGUgYmFyZSBjb21tYW5kIHJ1bnMgdGhlXG4gIC8vIHByb3h5LCBhbmQgYGNoYXRgL2Btb2RlbHNgL2ByZXNvbHZlYCBhcmUgdGhlIG5hbWVkIGRldG91cnMgb2ZmIGl0LlxuICBjb25zdCBwcm9ncmFtID0gYWRkQXV0aE9wdGlvbnMoXG4gICAgbmV3IENvbW1hbmQoKVxuICAgICAgLm5hbWUoXCJkYngtdG9vbHMtbW9kZWwtcHJveHlcIilcbiAgICAgIC5kZXNjcmlwdGlvbihcIkxvY2FsIE9wZW5BSS1jb21wYXRpYmxlIHByb3h5IHRvIERhdGFicmlja3MgTW9kZWwgU2VydmluZy5cIilcbiAgICAgIC5vcHRpb24oXCItcCwgLS1wb3J0IDxwb3J0PlwiLCBcInBvcnQgdG8gbGlzdGVuIG9uXCIsIFN0cmluZyhERUZBVUxUX1BPUlQpKVxuICAgICAgLm9wdGlvbihcIi1ILCAtLWhvc3QgPGhvc3Q+XCIsIFwiYWRkcmVzcyB0byBiaW5kXCIsIERFRkFVTFRfQklORF9IT1NUKVxuICAgICAgLm9wdGlvbihcIi1rLCAtLWFwaS1rZXkgPGtleT5cIiwgXCJyZXF1aXJlIHRoaXMgYmVhcmVyIHRva2VuIGZyb20gbG9jYWwgY2xpZW50c1wiKVxuICAgICAgLm9wdGlvbihcbiAgICAgICAgXCItLW5vLXJldHJ5LTQyOVwiLFxuICAgICAgICBcInJlbGF5IHVwc3RyZWFtIDQyOXMgaW5zdGVhZCBvZiByZXRyeWluZyB3aXRoIGJhY2tvZmYgKGRlZmF1bHQ6IHJldHJ5KVwiLFxuICAgICAgKSxcbiAgKS5hY3Rpb24oYXN5bmMgKG9wdHM6IFNlcnZlT3B0cykgPT4ge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgdXJsIH0gPSBhd2FpdCBzdGFydFByb3h5KG9wdHMpO1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBtb2RlbC1wcm94eSAtPiAke2JhY2tlbmQuaG9zdH1cXG5gKTtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgICBPcGVuQUkgYmFzZSBVUkw6ICR7dXJsfS92MVxcbmApO1xuICB9KTtcblxuICBhZGRBdXRoT3B0aW9ucyhcbiAgICBwcm9ncmFtXG4gICAgICAuY29tbWFuZChcImNoYXRcIilcbiAgICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IHRoZSBwcm94eSBhbmQgbGF1bmNoIGEgdGVybWluYWwgY2hhdCBjbGllbnQgd2lyZWQgdG8gaXQuXCIpXG4gICAgICAub3B0aW9uKFwiLXAsIC0tcG9ydCA8cG9ydD5cIiwgXCJwcm94eSBwb3J0XCIsIFN0cmluZyhERUZBVUxUX1BPUlQpKVxuICAgICAgLm9wdGlvbihcIi1ILCAtLWhvc3QgPGhvc3Q+XCIsIFwicHJveHkgYmluZCBob3N0XCIsIERFRkFVTFRfQklORF9IT1NUKVxuICAgICAgLm9wdGlvbihcIi1tLCAtLW1vZGVsIDxuYW1lPlwiLCBcImRlZmF1bHQgbW9kZWwgKGZ1enp5IG5hbWUgb2spXCIpXG4gICAgICAub3B0aW9uKFxuICAgICAgICBcIi0tbm8tcmV0cnktNDI5XCIsXG4gICAgICAgIFwicmVsYXkgdXBzdHJlYW0gNDI5cyBpbnN0ZWFkIG9mIHJldHJ5aW5nIHdpdGggYmFja29mZiAoZGVmYXVsdDogcmV0cnkpXCIsXG4gICAgICApXG4gICAgICAub3B0aW9uKFxuICAgICAgICBcIi0tY2xpZW50IDxjbWQ+XCIsXG4gICAgICAgIFwidGVybWluYWwgY2hhdCBDTEkgdG8gbGF1bmNoIChydW4gdmlhIHlvdXIgc2hlbGwpXCIsXG4gICAgICAgIHByb2Nlc3MuZW52LlBST1hZX0NIQVRfQ0xJRU5UID8/IERFRkFVTFRfQ0hBVF9DTElFTlQsXG4gICAgICApLFxuICApLmFjdGlvbihhc3luYyAoX2xvY2FsOiBTZXJ2ZU9wdHMgJiB7IG1vZGVsPzogc3RyaW5nOyBjbGllbnQ6IHN0cmluZyB9LCBjb21tYW5kOiBDb21tYW5kKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IGdsb2JhbE9wdHM8U2VydmVPcHRzICYgeyBtb2RlbD86IHN0cmluZzsgY2xpZW50OiBzdHJpbmcgfT4oY29tbWFuZCk7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBzZXJ2ZXIsIHVybCB9ID0gYXdhaXQgc3RhcnRQcm94eShvcHRzKTtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7dXJsfS92MWA7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoXG4gICAgICBgbW9kZWwtcHJveHkgLT4gJHtiYWNrZW5kLmhvc3R9XFxuICBPcGVuQUkgYmFzZSBVUkw6ICR7YmFzZVVybH1cXG4gIGxhdW5jaGluZzogJHtvcHRzLmNsaWVudH1cXG5gLFxuICAgICk7XG4gICAgLy8gSGFuZCBvZmYgdG8gYW4gb2ZmLXRoZS1zaGVsZiBPcGVuQUktY29tcGF0aWJsZSBjbGllbnQsIHBvaW50aW5nIGl0IGF0XG4gICAgLy8gdGhlIHByb3h5IHZpYSB0aGUgc3RhbmRhcmQgZW52IHZhcnMgKHBsdXMgdGhlIHByb3ZpZGVyIHN3aXRjaGVzIGFcbiAgICAvLyBjb3VwbGUgb2YgcG9wdWxhciBDTElzIHJlYWQpLiBgc2hlbGw6IHRydWVgIGxldHMgYC0tY2xpZW50YCBjYXJyeSBpdHNcbiAgICAvLyBvd24gYXJncywgZS5nLiBgLS1jbGllbnQgXCJidW54IG1lcmxpb25cImAuXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihvcHRzLmNsaWVudCwge1xuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIE9QRU5BSV9CQVNFX1VSTDogYmFzZVVybCxcbiAgICAgICAgT1BFTkFJX0FQSV9LRVk6IHByb2Nlc3MuZW52Lk9QRU5BSV9BUElfS0VZID8/IFwibW9kZWwtcHJveHlcIixcbiAgICAgICAgLi4uKG9wdHMubW9kZWwgPyB7IE9QRU5BSV9NT0RFTDogb3B0cy5tb2RlbCB9IDoge30pLFxuICAgICAgICBMTE1fUFJPVklERVI6IFwib3BlbmFpLWNvbXBhdFwiLFxuICAgICAgICBDTEFVREVfQ09ERV9VU0VfT1BFTkFJOiBcIjFcIixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY2hpbGQub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDApO1xuICAgIH0pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4gY2hpbGQua2lsbChcIlNJR0lOVFwiKSk7XG4gIH0pO1xuXG4gIGFkZEF1dGhPcHRpb25zKFxuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKFwibW9kZWxzXCIpXG4gICAgICAuZGVzY3JpcHRpb24oXCJMaXN0IHJlc29sdmFibGUgRGF0YWJyaWNrcyBzZXJ2aW5nIGVuZHBvaW50cyAoYXMgSlNPTikuXCIpXG4gICAgICAub3B0aW9uKFwiLS1jaGF0XCIsIFwib25seSBsaXN0IGNoYXQtY2FwYWJsZSBlbmRwb2ludHNcIiksXG4gICkuYWN0aW9uKGFzeW5jIChfbG9jYWw6IENvbW1vbk9wdHMgJiB7IGNoYXQ/OiBib29sZWFuIH0sIGNvbW1hbmQ6IENvbW1hbmQpID0+IHtcbiAgICBjb25zdCBvcHRzID0gZ2xvYmFsT3B0czxDb21tb25PcHRzICYgeyBjaGF0PzogYm9vbGVhbiB9Pihjb21tYW5kKTtcbiAgICBjb25zdCBiYWNrZW5kID0gYXdhaXQgRGF0YWJyaWNrc0JhY2tlbmQuY3JlYXRlKGJhY2tlbmRPcHRpb25zKG9wdHMpKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBiYWNrZW5kLm1vZGVscygpO1xuICAgIGNvbnN0IGVucmljaGVkID0gZW5kcG9pbnRzLm1hcChlbnJpY2hFbmRwb2ludCk7XG4gICAgY29uc3Qgb3V0ID0gb3B0cy5jaGF0ID8gZW5yaWNoZWQuZmlsdGVyKChlKSA9PiBlLmNhcGFiaWxpdGllcy5jaGF0KSA6IGVucmljaGVkO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KG91dCwgbnVsbCwgMil9XFxuYCk7XG4gIH0pO1xuXG4gIGFkZEF1dGhPcHRpb25zKFxuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKFwicmVzb2x2ZVwiKVxuICAgICAgLmRlc2NyaXB0aW9uKFwiU2hvdyB3aGF0IGEgZnV6enkgbW9kZWwgbmFtZSByZXNvbHZlcyB0byAoYXMgSlNPTikuXCIpXG4gICAgICAuYXJndW1lbnQoXCI8cXVlcnkuLi4+XCIsIFwibW9kZWwgbmFtZSAvIGZ1enp5IHNlYXJjaCB0ZXJtc1wiKSxcbiAgKS5hY3Rpb24oYXN5bmMgKHF1ZXJ5OiBzdHJpbmdbXSwgX2xvY2FsOiBDb21tb25PcHRzLCBjb21tYW5kOiBDb21tYW5kKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IGdsb2JhbE9wdHM8Q29tbW9uT3B0cz4oY29tbWFuZCk7XG4gICAgY29uc3QgYmFja2VuZCA9IGF3YWl0IERhdGFicmlja3NCYWNrZW5kLmNyZWF0ZShiYWNrZW5kT3B0aW9ucyhvcHRzKSk7XG4gICAgY29uc3Qgc2VhcmNoID0gcXVlcnkuam9pbihcIiBcIik7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBiYWNrZW5kLnJlc29sdmUoc2VhcmNoKTtcbiAgICAvLyBTYW1lIHNoYXBlIGFzIG9uZSBgbW9kZWxzYCBlbnRyeSB3aGVuIG1hdGNoZWQ7IG51bGwgd2hlbiBub3RoaW5nIGluIHRoZVxuICAgIC8vIGNhdGFsb2d1ZSBzY29yZXMgd2l0aGluIHRoZSB0aHJlc2hvbGQgKGNhbGxlciBjYW4gZmFsbCBiYWNrIHRvIHRoZSBxdWVyeSkuXG4gICAgaWYgKCFyZXNvbHZlZC5tYXRjaGVkKSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShcIm51bGxcXG5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gKGF3YWl0IGJhY2tlbmQubW9kZWxzKCkpLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gcmVzb2x2ZWQubW9kZWxJZCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoXG4gICAgICBgJHtKU09OLnN0cmluZ2lmeShlbmRwb2ludCA/IGVucmljaEVuZHBvaW50KGVuZHBvaW50KSA6IG51bGwsIG51bGwsIDIpfVxcbmAsXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHByb2dyYW07XG59XG5cbi8qKiBPbmUgYG1vZGVsc2AgLyBgcmVzb2x2ZWAgbGlzdCBlbnRyeTogZW5kcG9pbnQgc3VtbWFyeSArIGRlcml2ZWQgY2FwYWJpbGl0aWVzLiAqL1xuZnVuY3Rpb24gZW5yaWNoRW5kcG9pbnQoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5lbmRwb2ludCxcbiAgICAvLyBgY2hhdGAgPSBPcGVuQUkgY2hhdC9jb21wbGV0aW9ucyArIFJlc3BvbnNlczsgYGVtYmVkZGluZ2AgPSB2ZWN0b3JzO1xuICAgIC8vIGB0b29sc2AgPSBmdW5jdGlvbi90b29sIGNhbGxzIChldmVyeSBjaGF0IGVuZHBvaW50IGhlcmUpLlxuICAgIGNhcGFiaWxpdGllczogY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLFxuICB9O1xufVxuXG4vKiogUGFyc2UgYGFyZ3ZgIGFuZCBydW4gdGhlIG1hdGNoaW5nIGNvbW1hbmQuIFRocm93cyB7QGxpbmsgQ29tbWFuZGVyRXJyb3J9IG9uIGZsYWcgZXJyb3JzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNsaShhcmd2OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZFByb2dyYW0oKS5wYXJzZUFzeW5jKGFyZ3YpO1xufVxuXG5leHBvcnQgeyBDb21tYW5kZXJFcnJvciB9O1xuIl19
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQStCLE1BQU0seUJBQXlCLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEQsT0FBTyxFQUFFLGlCQUFpQixFQUF1QixNQUFNLGNBQWMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUvQzs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsNkJBQTZCLENBQUM7QUFxQjFELHdEQUF3RDtBQUN4RCxTQUFTLGNBQWMsQ0FBQyxJQUFnQjtJQUN0QyxPQUFPO1FBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xELEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9FLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNB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QU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxvRkFBb0Y7QUFDcEYsU0FBUyxjQUFjLENBQUMsUUFBZ0M7SUFDdEQsT0FBTztRQUNMLEdBQUcsUUFBUTtRQUNYLHVFQUF1RTtRQUN2RSw0REFBNEQ7UUFDNUQsWUFBWSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7S0FDdEQsQ0FBQztBQUNKLENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBQUMsSUFBYztJQUN6QyxNQUFNLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgZGJ4LXRvb2xzLW1vZGVsLXByb3h5YCBDTEkuXG4gKlxuICogUnVuIGJhcmUsIGl0IHNlcnZlczogYSBsb29wYmFjayBPcGVuQUktY29tcGF0aWJsZSBlbmRwb2ludCB0aGF0IGZyb250c1xuICogRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIHdpdGggZnV6enkgbW9kZWwgbmFtZXMgYW5kIHBlci1yZXF1ZXN0IGF1dGguIGBjaGF0YFxuICogc3RhcnRzIHRoYXQgc2FtZSBwcm94eSBhbmQgaGFuZHMgb2ZmIHRvIGFuIG9mZi10aGUtc2hlbGYgdGVybWluYWwgY2xpZW50XG4gKiB3aXJlZCB0byBpdC4gYG1vZGVsc2AgbGlzdHMgdGhlIHJlc29sdmFibGUgZW5kcG9pbnRzOyBgcmVzb2x2ZWAgc2hvd3Mgd2hhdCBhXG4gKiBmdXp6eSBuYW1lIHNuYXBzIHRvLiBBdXRoIGNvbWVzIGZyb20gdGhlIHN0YW5kYXJkIERhdGFicmlja3MgU0RLIHJlc29sdXRpb25cbiAqIChlbnYgdmFycywgYC0tcHJvZmlsZWAsIG9yIGBkYXRhYnJpY2tzIGF1dGggbG9naW5gKS5cbiAqXG4gKiBTaGFyZWQgZmxhZ3MgKGAtLXByb2ZpbGVgLCBgLS13b3Jrc3BhY2UtaG9zdGAsIGAtLXRocmVzaG9sZGAsIOKApikgYXJlIGRlY2xhcmVkXG4gKiBvbiB0aGUgcm9vdCAqYW5kKiByZWRlY2xhcmVkIG9uIHN1YmNvbW1hbmRzIGZvciBoZWxwIGRpc2NvdmVyYWJpbGl0eS4gQ29tbWFuZGVyXG4gKiBwYXJrcyB0aGUgdmFsdWVzIG9uIHRoZSBwYXJlbnQgd2hlbiBib3RoIGRlY2xhcmUgdGhlIHNhbWUgZmxhZywgc28gZXZlcnlcbiAqIHN1YmNvbW1hbmQgYWN0aW9uIG11c3QgcmVhZCB7QGxpbmsgQ29tbWFuZC5vcHRzV2l0aEdsb2JhbHN9IC0gbG9jYWwgYG9wdHNgXG4gKiBhbG9uZSBtaXNzZXMgYC0tcHJvZmlsZWAgKGVudiBgREFUQUJSSUNLU19DT05GSUdfUFJPRklMRWAgc3RpbGwgd29ya2VkIGJlY2F1c2VcbiAqIHRoZSBTREsgcmVhZHMgdGhhdCB3aXRob3V0IHRoZSBDTEkgZmxhZykuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXIgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgeyBjbGFzc2lmeSwgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBDb21tYW5kLCBDb21tYW5kZXJFcnJvciB9IGZyb20gXCJjb21tYW5kZXJcIjtcblxuaW1wb3J0IHsgRGF0YWJyaWNrc0JhY2tlbmQsIHR5cGUgQmFja2VuZE9wdGlvbnMgfSBmcm9tIFwiLi9iYWNrZW5kLnRzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0JJTkRfSE9TVCwgREVGQVVMVF9QT1JULCByZXNvbHZlUmV0cnlDb25maWcgfSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuaW1wb3J0IHsgc3RhcnRQcm94eVNlcnZlciB9IGZyb20gXCIuL3NlcnZlci50c1wiO1xuXG4vKipcbiAqIERlZmF1bHQgdGVybWluYWwgY2xpZW50IGZvciBgY2hhdGAsIGxhdW5jaGVkIHZpYSBgYnVueGAuIE9wZW5IYXJuZXNzIGlzIGFuXG4gKiBPcGVuQUktY29tcGF0aWJsZSBUVUkgdGhhdCByZWFkcyB0aGUgZW5kcG9pbnQgc3RyYWlnaHQgZnJvbSB0aGUgZW52IHdlIGluamVjdFxuICogKGBMTE1fUFJPVklERVI9b3BlbmFpLWNvbXBhdGAgKyBgT1BFTkFJX0JBU0VfVVJMYCksIHNvIG5vIGNvbmZpZyBzdGVwIGlzXG4gKiBuZWVkZWQuIE92ZXJyaWRlIHdpdGggYC0tY2xpZW50YCAvIGBQUk9YWV9DSEFUX0NMSUVOVGAuXG4gKi9cbmNvbnN0IERFRkFVTFRfQ0hBVF9DTElFTlQgPSBcImJ1bnggQGFsaGF6bWlhaS9vcGVuaGFybmVzc1wiO1xuXG4vKiogU2hhcmVkIGAtLXByb2ZpbGVgIC8gYC0td29ya3NwYWNlLWhvc3RgIC8gYC0tdGhyZXNob2xkYCBmbGFncy4gKi9cbmludGVyZmFjZSBDb21tb25PcHRzIHtcbiAgcHJvZmlsZT86IHN0cmluZztcbiAgd29ya3NwYWNlSG9zdD86IHN0cmluZztcbiAgdGhyZXNob2xkPzogc3RyaW5nO1xufVxuXG4vKiogU2hhcmVkIGxpc3RlbiArIGF1dGggZmxhZ3MgZm9yIHRoZSBwcm94eS1zdGFydGluZyBjb21tYW5kcy4gKi9cbmludGVyZmFjZSBTZXJ2ZU9wdHMgZXh0ZW5kcyBDb21tb25PcHRzIHtcbiAgcG9ydDogc3RyaW5nO1xuICBob3N0OiBzdHJpbmc7XG4gIGFwaUtleT86IHN0cmluZztcbiAgLyoqXG4gICAqIENvbW1hbmRlcidzIG5lZ2F0YWJsZS1mbGFnIHZhbHVlIGZvciBgLS1uby1yZXRyeS00MjlgOiBgdHJ1ZWAgYnkgZGVmYXVsdCxcbiAgICogYGZhbHNlYCBvbmNlIHRoZSBmbGFnIGlzIHBhc3NlZC4gT2ZmIG1lYW5zIHJlbGF5IHVwc3RyZWFtIDQyOXMgdW5jaGFuZ2VkLlxuICAgKi9cbiAgcmV0cnk0Mjk6IGJvb2xlYW47XG59XG5cbi8qKiBNYXAgc2hhcmVkIENMSSBmbGFncyBvbnRvIHtAbGluayBCYWNrZW5kT3B0aW9uc30uICovXG5mdW5jdGlvbiBiYWNrZW5kT3B0aW9ucyhvcHRzOiBDb21tb25PcHRzKTogQmFja2VuZE9wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIC4uLihvcHRzLnByb2ZpbGUgPyB7IHByb2ZpbGU6IG9wdHMucHJvZmlsZSB9IDoge30pLFxuICAgIC4uLihvcHRzLndvcmtzcGFjZUhvc3QgPyB7IGhvc3Q6IG9wdHMud29ya3NwYWNlSG9zdCB9IDoge30pLFxuICAgIC4uLihvcHRzLnRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyB0aHJlc2hvbGQ6IE51bWJlcihvcHRzLnRocmVzaG9sZCkgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdWJjb21tYW5kIG9wdGlvbnMgbWVyZ2VkIHdpdGggcGFyZW50IChyb290KSBvcHRpb25zLiBSZXF1aXJlZCBmb3Igc2hhcmVkXG4gKiBmbGFncyB0aGF0IGFyZSBkZWNsYXJlZCBvbiBib3RoIC0gQ29tbWFuZGVyIHN0b3JlcyB0aGVtIG9uIHRoZSBwYXJlbnQsIHNvXG4gKiB0aGUgYWN0aW9uJ3MgbG9jYWwgYG9wdHNgIGFsb25lIG9taXRzIGAtLXByb2ZpbGVgIC8gYC0td29ya3NwYWNlLWhvc3RgLlxuICovXG5mdW5jdGlvbiBnbG9iYWxPcHRzPFQ+KGNvbW1hbmQ6IENvbW1hbmQpOiBUIHtcbiAgcmV0dXJuIGNvbW1hbmQub3B0c1dpdGhHbG9iYWxzKCkgYXMgVDtcbn1cblxuLyoqIENyZWF0ZSB0aGUgYmFja2VuZCBhbmQgc3RhcnQgdGhlIHByb3h5IGZyb20gdGhlIHNoYXJlZCBsaXN0ZW4gZmxhZ3MuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydFByb3h5KFxuICBvcHRzOiBTZXJ2ZU9wdHMsXG4pOiBQcm9taXNlPHsgYmFja2VuZDogRGF0YWJyaWNrc0JhY2tlbmQ7IHNlcnZlcjogU2VydmVyOyB1cmw6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGJhY2tlbmQgPSBhd2FpdCBEYXRhYnJpY2tzQmFja2VuZC5jcmVhdGUoYmFja2VuZE9wdGlvbnMob3B0cykpO1xuICBjb25zdCBhcGlLZXkgPSBvcHRzLmFwaUtleSA/PyBwcm9jZXNzLmVudi5QUk9YWV9BUElfS0VZO1xuICAvLyBgLS1uby1yZXRyeS00MjlgIChvcHRzLnJldHJ5NDI5ID09PSBmYWxzZSkgaXMgdGhlIG9ubHkgZXhwbGljaXQgb3ZlcnJpZGU7XG4gIC8vIG90aGVyd2lzZSByZXNvbHZlUmV0cnlDb25maWcgbGF5ZXJzIFBST1hZX1JFVFJZXyogZW52IHRoZW4gdGhlIG9uLWRlZmF1bHQuXG4gIGNvbnN0IHJldHJ5ID0gcmVzb2x2ZVJldHJ5Q29uZmlnKG9wdHMucmV0cnk0MjkgPT09IGZhbHNlID8geyBlbmFibGVkOiBmYWxzZSB9IDoge30pO1xuICBjb25zdCB7IHNlcnZlciwgdXJsIH0gPSBhd2FpdCBzdGFydFByb3h5U2VydmVyKGJhY2tlbmQsIHtcbiAgICBob3N0OiBvcHRzLmhvc3QsXG4gICAgcG9ydDogTnVtYmVyKG9wdHMucG9ydCksXG4gICAgcmV0cnksXG4gICAgLi4uKGFwaUtleSA/IHsgYXBpS2V5IH0gOiB7fSksXG4gIH0pO1xuICByZXR1cm4geyBiYWNrZW5kLCBzZXJ2ZXIsIHVybCB9O1xufVxuXG4vKiogU2hhcmVkIGF1dGggLyBmdXp6eS1tYXRjaCBmbGFncyBhZGRlZCB0byB0aGUgcm9vdCBhbmQgZXZlcnkgc3ViY29tbWFuZC4gKi9cbmZ1bmN0aW9uIGFkZEF1dGhPcHRpb25zKGNvbW1hbmQ6IENvbW1hbmQpOiBDb21tYW5kIHtcbiAgcmV0dXJuIGNvbW1hbmRcbiAgICAub3B0aW9uKFwiLS1wcm9maWxlIDxwcm9maWxlPlwiLCBcIkRhdGFicmlja3MgY29uZmlnIHByb2ZpbGVcIilcbiAgICAub3B0aW9uKFwiLS13b3Jrc3BhY2UtaG9zdCA8dXJsPlwiLCBcIm92ZXJyaWRlIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob3N0XCIpXG4gICAgLm9wdGlvbihcIi10LCAtLXRocmVzaG9sZCA8bj5cIiwgXCJmdXp6eSBtYXRjaCB0aHJlc2hvbGQgKDAuLjEpXCIpO1xufVxuXG4vKiogQnVpbGQgdGhlIGBkYngtdG9vbHMtbW9kZWwtcHJveHlgIGNvbW1hbmRlciBwcm9ncmFtIChubyBzaWRlIGVmZmVjdHMgdW50aWwgcGFyc2VkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByb2dyYW0oKTogQ29tbWFuZCB7XG4gIC8vIFNlcnZpbmcgaXMgdGhlIHJvb3QgYWN0aW9uLCBub3QgYSBzdWJjb21tYW5kOiB0aGUgYmFyZSBjb21tYW5kIHJ1bnMgdGhlXG4gIC8vIHByb3h5LCBhbmQgYGNoYXRgL2Btb2RlbHNgL2ByZXNvbHZlYCBhcmUgdGhlIG5hbWVkIGRldG91cnMgb2ZmIGl0LlxuICBjb25zdCBwcm9ncmFtID0gYWRkQXV0aE9wdGlvbnMoXG4gICAgbmV3IENvbW1hbmQoKVxuICAgICAgLm5hbWUoXCJkYngtdG9vbHMtbW9kZWwtcHJveHlcIilcbiAgICAgIC5kZXNjcmlwdGlvbihcIkxvY2FsIE9wZW5BSS1jb21wYXRpYmxlIHByb3h5IHRvIERhdGFicmlja3MgTW9kZWwgU2VydmluZy5cIilcbiAgICAgIC5vcHRpb24oXCItcCwgLS1wb3J0IDxwb3J0PlwiLCBcInBvcnQgdG8gbGlzdGVuIG9uXCIsIFN0cmluZyhERUZBVUxUX1BPUlQpKVxuICAgICAgLm9wdGlvbihcIi1ILCAtLWhvc3QgPGhvc3Q+XCIsIFwiYWRkcmVzcyB0byBiaW5kXCIsIERFRkFVTFRfQklORF9IT1NUKVxuICAgICAgLm9wdGlvbihcIi1rLCAtLWFwaS1rZXkgPGtleT5cIiwgXCJyZXF1aXJlIHRoaXMgYmVhcmVyIHRva2VuIGZyb20gbG9jYWwgY2xpZW50c1wiKVxuICAgICAgLm9wdGlvbihcbiAgICAgICAgXCItLW5vLXJldHJ5LTQyOVwiLFxuICAgICAgICBcInJlbGF5IHVwc3RyZWFtIDQyOXMgaW5zdGVhZCBvZiByZXRyeWluZyB3aXRoIGJhY2tvZmYgKGRlZmF1bHQ6IHJldHJ5KVwiLFxuICAgICAgKSxcbiAgKS5hY3Rpb24oYXN5bmMgKG9wdHM6IFNlcnZlT3B0cykgPT4ge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgdXJsIH0gPSBhd2FpdCBzdGFydFByb3h5KG9wdHMpO1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBtb2RlbC1wcm94eSAtPiAke2JhY2tlbmQuaG9zdH1cXG5gKTtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgICBPcGVuQUkgYmFzZSBVUkw6ICR7dXJsfS92MVxcbmApO1xuICB9KTtcblxuICBhZGRBdXRoT3B0aW9ucyhcbiAgICBwcm9ncmFtXG4gICAgICAuY29tbWFuZChcImNoYXRcIilcbiAgICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IHRoZSBwcm94eSBhbmQgbGF1bmNoIGEgdGVybWluYWwgY2hhdCBjbGllbnQgd2lyZWQgdG8gaXQuXCIpXG4gICAgICAub3B0aW9uKFwiLXAsIC0tcG9ydCA8cG9ydD5cIiwgXCJwcm94eSBwb3J0XCIsIFN0cmluZyhERUZBVUxUX1BPUlQpKVxuICAgICAgLm9wdGlvbihcIi1ILCAtLWhvc3QgPGhvc3Q+XCIsIFwicHJveHkgYmluZCBob3N0XCIsIERFRkFVTFRfQklORF9IT1NUKVxuICAgICAgLm9wdGlvbihcIi1tLCAtLW1vZGVsIDxuYW1lPlwiLCBcImRlZmF1bHQgbW9kZWwgKGZ1enp5IG5hbWUgb2spXCIpXG4gICAgICAub3B0aW9uKFxuICAgICAgICBcIi0tbm8tcmV0cnktNDI5XCIsXG4gICAgICAgIFwicmVsYXkgdXBzdHJlYW0gNDI5cyBpbnN0ZWFkIG9mIHJldHJ5aW5nIHdpdGggYmFja29mZiAoZGVmYXVsdDogcmV0cnkpXCIsXG4gICAgICApXG4gICAgICAub3B0aW9uKFxuICAgICAgICBcIi0tY2xpZW50IDxjbWQ+XCIsXG4gICAgICAgIFwidGVybWluYWwgY2hhdCBDTEkgdG8gbGF1bmNoIChydW4gdmlhIHlvdXIgc2hlbGwpXCIsXG4gICAgICAgIHByb2Nlc3MuZW52LlBST1hZX0NIQVRfQ0xJRU5UID8/IERFRkFVTFRfQ0hBVF9DTElFTlQsXG4gICAgICApLFxuICApLmFjdGlvbihhc3luYyAoX2xvY2FsOiBTZXJ2ZU9wdHMgJiB7IG1vZGVsPzogc3RyaW5nOyBjbGllbnQ6IHN0cmluZyB9LCBjb21tYW5kOiBDb21tYW5kKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IGdsb2JhbE9wdHM8U2VydmVPcHRzICYgeyBtb2RlbD86IHN0cmluZzsgY2xpZW50OiBzdHJpbmcgfT4oY29tbWFuZCk7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBzZXJ2ZXIsIHVybCB9ID0gYXdhaXQgc3RhcnRQcm94eShvcHRzKTtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7dXJsfS92MWA7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoXG4gICAgICBgbW9kZWwtcHJveHkgLT4gJHtiYWNrZW5kLmhvc3R9XFxuICBPcGVuQUkgYmFzZSBVUkw6ICR7YmFzZVVybH1cXG4gIGxhdW5jaGluZzogJHtvcHRzLmNsaWVudH1cXG5gLFxuICAgICk7XG4gICAgLy8gSGFuZCBvZmYgdG8gYW4gb2ZmLXRoZS1zaGVsZiBPcGVuQUktY29tcGF0aWJsZSBjbGllbnQsIHBvaW50aW5nIGl0IGF0XG4gICAgLy8gdGhlIHByb3h5IHZpYSB0aGUgc3RhbmRhcmQgZW52IHZhcnMgKHBsdXMgdGhlIHByb3ZpZGVyIHN3aXRjaGVzIGFcbiAgICAvLyBjb3VwbGUgb2YgcG9wdWxhciBDTElzIHJlYWQpLiBgc2hlbGw6IHRydWVgIGxldHMgYC0tY2xpZW50YCBjYXJyeSBpdHNcbiAgICAvLyBvd24gYXJncywgZS5nLiBgLS1jbGllbnQgXCJidW54IG1lcmxpb25cImAuXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihvcHRzLmNsaWVudCwge1xuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIE9QRU5BSV9CQVNFX1VSTDogYmFzZVVybCxcbiAgICAgICAgT1BFTkFJX0FQSV9LRVk6IHByb2Nlc3MuZW52Lk9QRU5BSV9BUElfS0VZID8/IFwibW9kZWwtcHJveHlcIixcbiAgICAgICAgLi4uKG9wdHMubW9kZWwgPyB7IE9QRU5BSV9NT0RFTDogb3B0cy5tb2RlbCB9IDoge30pLFxuICAgICAgICBMTE1fUFJPVklERVI6IFwib3BlbmFpLWNvbXBhdFwiLFxuICAgICAgICBDTEFVREVfQ09ERV9VU0VfT1BFTkFJOiBcIjFcIixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY2hpbGQub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDApO1xuICAgIH0pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4gY2hpbGQua2lsbChcIlNJR0lOVFwiKSk7XG4gIH0pO1xuXG4gIGFkZEF1dGhPcHRpb25zKFxuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKFwibW9kZWxzXCIpXG4gICAgICAuZGVzY3JpcHRpb24oXCJMaXN0IHJlc29sdmFibGUgRGF0YWJyaWNrcyBzZXJ2aW5nIGVuZHBvaW50cyAoYXMgSlNPTikuXCIpXG4gICAgICAub3B0aW9uKFwiLS1jaGF0XCIsIFwib25seSBsaXN0IGNoYXQtY2FwYWJsZSBlbmRwb2ludHNcIiksXG4gICkuYWN0aW9uKGFzeW5jIChfbG9jYWw6IENvbW1vbk9wdHMgJiB7IGNoYXQ/OiBib29sZWFuIH0sIGNvbW1hbmQ6IENvbW1hbmQpID0+IHtcbiAgICBjb25zdCBvcHRzID0gZ2xvYmFsT3B0czxDb21tb25PcHRzICYgeyBjaGF0PzogYm9vbGVhbiB9Pihjb21tYW5kKTtcbiAgICBjb25zdCBiYWNrZW5kID0gYXdhaXQgRGF0YWJyaWNrc0JhY2tlbmQuY3JlYXRlKGJhY2tlbmRPcHRpb25zKG9wdHMpKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBiYWNrZW5kLm1vZGVscygpO1xuICAgIGNvbnN0IGVucmljaGVkID0gZW5kcG9pbnRzLm1hcChlbnJpY2hFbmRwb2ludCk7XG4gICAgY29uc3Qgb3V0ID0gb3B0cy5jaGF0ID8gZW5yaWNoZWQuZmlsdGVyKChlKSA9PiBlLmNhcGFiaWxpdGllcy5jaGF0KSA6IGVucmljaGVkO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KG91dCwgbnVsbCwgMil9XFxuYCk7XG4gIH0pO1xuXG4gIGFkZEF1dGhPcHRpb25zKFxuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKFwicmVzb2x2ZVwiKVxuICAgICAgLmRlc2NyaXB0aW9uKFwiU2hvdyB3aGF0IGEgZnV6enkgbW9kZWwgbmFtZSByZXNvbHZlcyB0byAoYXMgSlNPTikuXCIpXG4gICAgICAuYXJndW1lbnQoXCI8cXVlcnkuLi4+XCIsIFwibW9kZWwgbmFtZSAvIGZ1enp5IHNlYXJjaCB0ZXJtc1wiKSxcbiAgKS5hY3Rpb24oYXN5bmMgKHF1ZXJ5OiBzdHJpbmdbXSwgX2xvY2FsOiBDb21tb25PcHRzLCBjb21tYW5kOiBDb21tYW5kKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IGdsb2JhbE9wdHM8Q29tbW9uT3B0cz4oY29tbWFuZCk7XG4gICAgY29uc3QgYmFja2VuZCA9IGF3YWl0IERhdGFicmlja3NCYWNrZW5kLmNyZWF0ZShiYWNrZW5kT3B0aW9ucyhvcHRzKSk7XG4gICAgY29uc3Qgc2VhcmNoID0gcXVlcnkuam9pbihcIiBcIik7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBiYWNrZW5kLnJlc29sdmUoc2VhcmNoKTtcbiAgICAvLyBTYW1lIHNoYXBlIGFzIG9uZSBgbW9kZWxzYCBlbnRyeSB3aGVuIG1hdGNoZWQ7IG51bGwgd2hlbiBub3RoaW5nIGluIHRoZVxuICAgIC8vIGNhdGFsb2d1ZSBzY29yZXMgd2l0aGluIHRoZSB0aHJlc2hvbGQgKGNhbGxlciBjYW4gZmFsbCBiYWNrIHRvIHRoZSBxdWVyeSkuXG4gICAgaWYgKCFyZXNvbHZlZC5tYXRjaGVkKSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShcIm51bGxcXG5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gKGF3YWl0IGJhY2tlbmQubW9kZWxzKCkpLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gcmVzb2x2ZWQubW9kZWxJZCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoXG4gICAgICBgJHtKU09OLnN0cmluZ2lmeShlbmRwb2ludCA/IGVucmljaEVuZHBvaW50KGVuZHBvaW50KSA6IG51bGwsIG51bGwsIDIpfVxcbmAsXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHByb2dyYW07XG59XG5cbi8qKiBPbmUgYG1vZGVsc2AgLyBgcmVzb2x2ZWAgbGlzdCBlbnRyeTogZW5kcG9pbnQgc3VtbWFyeSArIGRlcml2ZWQgY2FwYWJpbGl0aWVzLiAqL1xuZnVuY3Rpb24gZW5yaWNoRW5kcG9pbnQoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5lbmRwb2ludCxcbiAgICAvLyBgY2hhdGAgPSBPcGVuQUkgY2hhdC9jb21wbGV0aW9ucyArIFJlc3BvbnNlczsgYGVtYmVkZGluZ2AgPSB2ZWN0b3JzO1xuICAgIC8vIGB0b29sc2AgPSBmdW5jdGlvbi90b29sIGNhbGxzIChldmVyeSBjaGF0IGVuZHBvaW50IGhlcmUpLlxuICAgIGNhcGFiaWxpdGllczogY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLFxuICB9O1xufVxuXG4vKiogUGFyc2UgYGFyZ3ZgIGFuZCBydW4gdGhlIG1hdGNoaW5nIGNvbW1hbmQuIFRocm93cyB7QGxpbmsgQ29tbWFuZGVyRXJyb3J9IG9uIGZsYWcgZXJyb3JzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNsaShhcmd2OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZFByb2dyYW0oKS5wYXJzZUFzeW5jKGFyZ3YpO1xufVxuXG5leHBvcnQgeyBDb21tYW5kZXJFcnJvciB9O1xuIl19
@@ -31,8 +31,8 @@
31
31
  * @module
32
32
  */
33
33
  import { type Server } from "node:http";
34
- import type { DatabricksBackend } from "./backend.js";
35
- import { type RetryConfig } from "./defaults.js";
34
+ import type { DatabricksBackend } from "./backend.ts";
35
+ import { type RetryConfig } from "./defaults.ts";
36
36
  /** Options shared by {@link createProxyServer} and {@link startProxyServer}. */
37
37
  export interface ProxyServerOptions {
38
38
  /**
package/lib/src/server.js CHANGED
@@ -512,4 +512,4 @@ function sendJson(res, status, body) {
512
512
  function errorBody(message, type) {
513
513
  return { error: { message, type } };
514
514
  }
515
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQTBELE1BQU0sV0FBVyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxLQUFLLElBQUksU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUcvQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBb0IsTUFBTSxZQUFZLENBQUM7QUFFOUYsTUFBTSxFQUFFLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLDRCQUE0QixFQUFFLEdBQ3RGLGVBQWUsQ0FBQztBQUVsQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFNUUsNEVBQTRFO0FBQzVFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzFCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsYUFBYTtDQUNkLENBQUMsQ0FBQztBQUVILDJEQUEyRDtBQUMzRCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBRXhELGdGQUFnRjtBQUNoRixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBRWpFOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGVBQWU7SUFDdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1NBQ3pDLEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUM1QixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQXVCRCxzREFBc0Q7QUFDdEQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixPQUEwQixFQUMxQixVQUE4QixFQUFFO0lBRWhDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUN2QyxLQUFLLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUNILHdFQUF3RTtJQUN4RSwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDeEUsMkNBQTJDO0lBQzNDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEdBQW1CO0lBQzVDLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDekMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCO1lBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO0FBQzNCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxhQUFhLENBQzFCLEdBQVcsRUFDWCxPQUErQixFQUMvQixJQUFZLEVBQ1osTUFBbUI7SUFFbkIsTUFBTSxJQUFJLEdBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3BFLDZFQUE2RTtJQUM3RSw2RUFBNkU7SUFDN0Usc0VBQXNFO0lBQ3RFLHlFQUF5RTtJQUN6RSw2RUFBNkU7SUFDN0UsMkVBQTJFO0lBQzNFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxNQUFxQixFQUFFLEtBQWE7SUFDcEUsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztJQUN6RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN6QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsT0FBZSxFQUNmLEtBQWtCLEVBQ2xCLFlBQWdDLEVBQ2hDLE1BQWM7SUFFZCxJQUFJLFlBQVksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEYsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDO0lBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsT0FBMEIsRUFDMUIsR0FBVyxFQUNYLE9BQStCLEVBQy9CLElBQWEsRUFDYixHQUFtQixFQUNuQixLQUFrQjtJQUVsQixNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLElBQUksUUFBUSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBRXBDLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDdkYsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDeEYsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDL0UseUVBQXlFO1FBQ3pFLDhDQUE4QztRQUM5QyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7WUFDdkMsT0FBTyxFQUFFLE9BQU8sR0FBRyxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixPQUFPO1lBQ1AsR0FBRyxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN4RCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxtRUFBbUU7WUFDbkUsbUNBQW1DO1lBQ25DLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCwyRUFBMkU7UUFDM0UsTUFBTSxZQUFZLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3RFLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsY0FBYztJQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN2QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLE9BQTBCLEVBQzFCLFVBQTZCLEVBQUU7SUFFL0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxpQkFBaUIsQ0FBQztJQUMvQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQztJQUMxQyxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkQsTUFBTSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUMxQyxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQVUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7WUFDN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0IsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxVQUFVLElBQUksSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO0FBQ3hELENBQUM7QUFFRCxLQUFLLFVBQVUsYUFBYSxDQUMxQixPQUEwQixFQUMxQixPQUEyQixFQUMzQixHQUFvQixFQUNwQixHQUFtQjtJQUVuQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM5QixNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxHQUFHLENBQUM7SUFDOUIsSUFBSSxDQUFDO1FBQ0gsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0UsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNyQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDekQsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLGlCQUFpQixFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztZQUMxRSxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hELDJFQUEyRTtZQUMzRSxNQUFNLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6RSxNQUFNLFlBQVksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ2xELE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUM7UUFDN0MsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDNUQsTUFBTSxlQUFlLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1QyxPQUFPO1FBQ1QsQ0FBQztRQUNELFFBQVEsQ0FDTixHQUFHLEVBQ0gsR0FBRyxFQUNILFNBQVMsQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksU0FBUyxFQUFFLEVBQUUsdUJBQXVCLENBQUMsQ0FDMUYsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVc7WUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7O1lBQ3ZFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNqQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILEtBQUssVUFBVSxZQUFZLENBQ3pCLE9BQTBCLEVBQzFCLEdBQW1CLEVBQ25CLFVBQW1CO0lBRW5CLE1BQU0sU0FBUyxHQUFHLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxNQUFNLEdBQUcsU0FBUzthQUNyQixNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDbEUsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixZQUFZLEVBQUUsUUFBUSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsSUFBSTtZQUNuRCxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEUsK0RBQStEO1lBQy9ELHVCQUF1QixFQUFFLFFBQVE7WUFDakMsMEJBQTBCLEVBQUUsRUFBYztZQUMxQyxVQUFVLEVBQUUsZUFBZTtZQUMzQixVQUFVLEVBQUUsTUFBTTtZQUNsQixnQkFBZ0IsRUFBRSxJQUFJO1NBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ04sUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QyxFQUFFLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDakIsTUFBTSxFQUFFLE9BQU87UUFDZixPQUFPLEVBQUUsQ0FBQztRQUNWLFFBQVEsRUFBRSxZQUFZO0tBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ0osUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsV0FBVyxDQUN4QixPQUEwQixFQUMxQixHQUFvQixFQUNwQixHQUFtQixFQUNuQixLQUFrQjtJQUVsQixNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxNQUFNLFNBQVMsR0FBRyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDMUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLGlDQUFpQyxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUMxRixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFFOUIsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0scUJBQXFCLENBQ3pCLE9BQU8sRUFDUCxJQUFJLEVBQ0osU0FBUyxFQUNULFFBQVEsQ0FBQyxPQUFPLEVBQ2hCLFFBQVEsQ0FBQyxPQUFPLEVBQ2hCLEdBQUcsRUFDSCxLQUFLLENBQ04sQ0FBQztRQUNGLE9BQU87SUFDVCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLDJFQUEyRTtJQUMzRSx1Q0FBdUM7SUFDdkMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBRS9FLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztJQUM3QyxPQUFPLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO0lBRXhFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ25CLFNBQVM7UUFDVCxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU87UUFDMUIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1FBQ3pCLFFBQVEsRUFBRSxhQUFhO1FBQ3ZCLE1BQU0sRUFBRSxXQUFXO1FBQ25CLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzNDLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0scUJBQXFCLENBQzFDLE9BQU8sRUFDUCxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFDeEMsT0FBTyxFQUNQLElBQUksRUFDSixHQUFHLEVBQ0gsS0FBSyxDQUNOLENBQUM7SUFFRixHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDN0IsY0FBYyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLGtCQUFrQjtRQUMxRSxrQkFBa0IsRUFBRSxRQUFRLENBQUMsT0FBTztLQUNyQyxDQUFDLENBQUM7SUFDSCxNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQ2xDLE9BQTBCLEVBQzFCLElBQTZCLEVBQzdCLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixPQUFnQixFQUNoQixHQUFtQixFQUNuQixLQUFrQjtJQUVsQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELFNBQVMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO0lBRTFCLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxRQUFRLENBQ04sR0FBRyxFQUNILEdBQUcsRUFDSCxTQUFTLENBQ1AsU0FBUyxPQUFPLHdFQUF3RSxFQUN4Rix1QkFBdUIsQ0FDeEIsQ0FDRixDQUFDO1FBQ0YsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1QyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsa0JBQWtCLENBQUM7SUFDN0MsT0FBTyxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQztJQUVwQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7UUFDckQsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQztRQUN6QyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDbkIsU0FBUztRQUNULFFBQVEsRUFBRSxPQUFPO1FBQ2pCLE9BQU87UUFDUCxRQUFRLEVBQUUsV0FBVztRQUNyQixNQUFNLEVBQUUsS0FBSztLQUNkLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVqRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDdkUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBNEIsQ0FBQztJQUN4RSxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxLQUFLLFVBQVUsZUFBZSxDQUM1QixPQUEwQixFQUMxQixHQUFvQixFQUNwQixHQUFtQixFQUNuQixLQUFrQjtJQUVsQixNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxNQUFNLFNBQVMsR0FBRyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDMUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLGlDQUFpQyxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUMxRixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFFOUIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0QsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1FBQ3JELENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUM7UUFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUVULE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQzVDLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztJQUM3QyxPQUFPLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO0lBRXhFLE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVoRixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUN2QixTQUFTO1FBQ1QsUUFBUSxFQUFFLFFBQVEsQ0FBQyxPQUFPO1FBQzFCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztRQUN6QixRQUFRLEVBQUUsV0FBVztRQUNyQixNQUFNLEVBQUUsV0FBVztRQUNuQixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDeEQsQ0FBQyxDQUFDO0lBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRWpHLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUM3QixjQUFjLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksa0JBQWtCO1FBQzFFLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxPQUFPO0tBQ3JDLENBQUMsQ0FBQztJQUNILE1BQU0sVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFrQixFQUFFLEdBQW1CO0lBQy9ELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDM0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1YsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDaEMsSUFBSSxDQUFDO1FBQ0gsU0FBUyxDQUFDO1lBQ1IsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QyxJQUFJLElBQUk7Z0JBQUUsTUFBTTtZQUNoQixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhO2dCQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQy9ELElBQUksR0FBRyxDQUFDLGFBQWE7Z0JBQUUsTUFBTTtRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYix5RUFBeUU7UUFDekUsd0NBQXdDO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxhQUFhLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsb0JBQW9CLEVBQUU7WUFDdkQsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNaLENBQUM7QUFDSCxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELFNBQVMsWUFBWSxDQUFDLEdBQW9CLEVBQUUsTUFBYztJQUN4RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUN6QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDO0FBQzdELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsWUFBWSxDQUFDLEdBQW9CO0lBQzlDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLEtBQUssRUFBRSxNQUFNLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFtQixDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3hFLENBQUM7QUFFRCwwQ0FBMEM7QUFDMUMsU0FBUyxRQUFRLENBQUMsR0FBbUIsRUFBRSxNQUFjLEVBQUUsSUFBYTtJQUNsRSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDOUQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELG9DQUFvQztBQUNwQyxTQUFTLFNBQVMsQ0FBQyxPQUFlLEVBQUUsSUFBWTtJQUM5QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJLWNvbXBhdGlibGUgSFRUUCBwcm94eSBpbiBmcm9udCBvZiBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcuXG4gKlxuICogRGF0YWJyaWNrcyBzZXJ2aW5nIGVuZHBvaW50cyBzcGVhayBPcGVuQUkgd2lyZSBmb3JtYXRzLCBzbyB0aGlzIHNlcnZlciBpcyBhXG4gKiB0aGluIHBhc3MtdGhyb3VnaDogaXQgcmVzb2x2ZXMgdGhlIHJlcXVlc3QncyAocG9zc2libHkgZnV6enkpIGBtb2RlbGAgdG8gYVxuICogcmVhbCBlbmRwb2ludCBpZCB2aWEgdGhlIHtAbGluayBEYXRhYnJpY2tzQmFja2VuZH0sIHN0YW1wcyBhIGZyZXNoIGF1dGhcbiAqIGhlYWRlciwgYW5kIGZvcndhcmRzIHRvIHRoZSByaWdodCBEYXRhYnJpY2tzIFVSTDpcbiAqXG4gKiAgIC0gQ2hhdCBDb21wbGV0aW9ucyDihpIgYC9zZXJ2aW5nLWVuZHBvaW50cy88bmFtZT4vaW52b2NhdGlvbnNgLCBleGNlcHQgZm9yXG4gKiAgICAgUmVzcG9uc2VzLW9ubHkgbW9kZWxzIChDb2RleCkgd2hpY2ggYXJlIHRyYW5zbGF0ZWQgYW5kIHNlbnQgdG9cbiAqICAgICBgL3NlcnZpbmctZW5kcG9pbnRzL3Jlc3BvbnNlc2AuXG4gKiAgIC0gUmVzcG9uc2VzIOKGkiBuYXRpdmUgYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgIChPcGVuQUktZmFtaWx5KSBvclxuICogICAgIGAvc2VydmluZy1lbmRwb2ludHMvb3Blbi1yZXNwb25zZXNgIChDbGF1ZGUvR2VtaW5pL+KApiksIGJvZHkgZm9yd2FyZGVkXG4gKiAgICAgYXMtaXMuIE5vIGNoYXQgcm91bmQtdHJpcC5cbiAqXG4gKiBBbnkgT3BlbkFJLWNvbXBhdGlibGUgdG9vbCAoaVRlcm0sIGVkaXRvcnMsIHRoZSBgb3BlbmFpYCBTREssIENvZGV4IENMSSkgY2FuXG4gKiBwb2ludCBpdHMgYmFzZSBVUkwgYXQgdGhpcyBzZXJ2ZXIgYW5kIHVzZSBsb29zZSBtb2RlbCBuYW1lcy5cbiAqXG4gKiBSb3V0ZXM6XG4gKiAgIC0gYEdFVCAgL2hlYWx0aGAsIGBHRVQgL2AgICAgICAgICAgICBsaXZlbmVzc1xuICogICAtIGBHRVQgIC92MS9tb2RlbHNgLCBgR0VUIC9tb2RlbHNgICAgbGlzdCByZXNvbHZhYmxlIGVuZHBvaW50cy4gRW1pdHMgdGhlXG4gKiAgICAgT3BlbkFJIGB7b2JqZWN0OlwibGlzdFwiLGRhdGE6W+KApl19YCBzaGFwZSBieSBkZWZhdWx0OyB3aGVuIHRoZSByZXF1ZXN0XG4gKiAgICAgbG9va3MgbGlrZSB0aGUgQ29kZXggQ0xJIChhIGBjbGllbnRfdmVyc2lvbmAgcXVlcnkgcGFyYW0sIHdoaWNoIENvZGV4XG4gKiAgICAgYWx3YXlzIHNlbmRzKSBpdCBlbWl0cyBDb2RleCdzIGB7bW9kZWxzOlt7c2x1ZyzigKZ9XX1gIHNoYXBlIGluc3RlYWQsIHNvXG4gKiAgICAgYm90aCBzdGFuZGFyZCBPcGVuQUkgY2xpZW50cyBhbmQgQ29kZXggY2FuIGVudW1lcmF0ZSB0aGUgY2F0YWxvZ3VlLlxuICogICAtIGBQT1NUIC92MS9jaGF0L2NvbXBsZXRpb25zYCAgICAgICAgcHJveHkgKGFsc28gYC9jb21wbGV0aW9uc2AsXG4gKiAgICAgYC92MS9jb21wbGV0aW9uc2AsIGAvdjEvZW1iZWRkaW5nc2AsIGFuZCB0aGUgdW4tcHJlZml4ZWQgdmFyaWFudHMpXG4gKiAgIC0gYFBPU1QgL3YxL3Jlc3BvbnNlc2AgICAgICAgICAgICAgICBPcGVuQUkgUmVzcG9uc2VzIEFQSSwgZm9yd2FyZGVkIHRvXG4gKiAgICAgRGF0YWJyaWNrcycgbmF0aXZlIFJlc3BvbnNlcyAvIE9wZW4gUmVzcG9uc2VzIHN1cmZhY2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZVNlcnZlciwgdHlwZSBJbmNvbWluZ01lc3NhZ2UsIHR5cGUgU2VydmVyLCB0eXBlIFNlcnZlclJlc3BvbnNlIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHsgYXN5bmMgYXMgYXN5bmNVdGlsLCBlcnJvciwganNvbiwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGNsYXNzaWZ5LCBvcGVuYWlDaGF0LCBvcGVuYWlSZXNwb25zZXMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcInVuZGljaVwiO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NCYWNrZW5kIH0gZnJvbSBcIi4vYmFja2VuZFwiO1xuaW1wb3J0IHsgREVGQVVMVF9CSU5EX0hPU1QsIERFRkFVTFRfUE9SVCwgREVGQVVMVF9SRVRSWSwgdHlwZSBSZXRyeUNvbmZpZyB9IGZyb20gXCIuL2RlZmF1bHRzXCI7XG5cbmNvbnN0IHsgY2hhdFRvUmVzcG9uc2VzUmVxdWVzdCwgcmVzcG9uc2VUb0NoYXRDb21wbGV0aW9uLCBzYW5pdGl6ZU9wZW5SZXNwb25zZXNSZXF1ZXN0IH0gPVxuICBvcGVuYWlSZXNwb25zZXM7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtb2RlbC1wcm94eS9zZXJ2ZXJcIik7XG5cbi8qKlxuICogRGlzcGF0Y2hlciBmb3IgZXZlcnkgdXBzdHJlYW0gY2FsbCwgd2l0aCB1bmRpY2kncyBpbmFjdGl2aXR5IHRpbWVvdXRzXG4gKiBESVNBQkxFRCAoYDBgKS5cbiAqXG4gKiBBIHByb3hpZWQgdHVybiBpcyBvbmx5IGFzIGZhc3QgYXMgdGhlIG1vZGVsIGJlaGluZCBpdCwgYW5kIHVuZGljaSdzXG4gKiBkZWZhdWx0cyAoMzAwcyBgaGVhZGVyc1RpbWVvdXRgLCAzMDBzIGBib2R5VGltZW91dGApIGFyZSBib3RoIHdyb25nIGhlcmUuXG4gKiBgYm9keVRpbWVvdXRgIGlzIHRoZSBraWxsZXI6IGl0IG1lYXN1cmVzIHRoZSBnYXAgQkVUV0VFTiBjaHVua3MsIHNvIGEgbW9kZWxcbiAqIHRoYXQgdGhpbmtzIGZvciBhIHdoaWxlIG1pZC1zdHJlYW0gLSBleHRlbmRlZCByZWFzb25pbmcsIGEgbG9uZyB0b29sIHJvdW5kXG4gKiB0cmlwLCBhIHNsb3cgR2VuaWUvU1FMIHN0ZXAgLSB0cmlwcyBpdCBhbmQgdW5kaWNpIHRlYXJzIHRoZSBzb2NrZXQgZG93blxuICogd2l0aCBgVU5EX0VSUl9CT0RZX1RJTUVPVVRgLCB3aGljaCB0aGUgY2xpZW50IHNlZXMgYXMgYSB0cnVuY2F0ZWQgc3RyZWFtLlxuICpcbiAqIFRoZSBwcm94eSBoYXMgbm8gb3BpbmlvbiBvbiBob3cgbG9uZyBhIG1vZGVsIG1heSB0YWtlLCBzbyBpdCBpbXBvc2VzIG5vXG4gKiBkZWFkbGluZTogdGhlIHN0cmVhbSBlbmRzIHdoZW4gdGhlIHVwc3RyZWFtIGVuZHMgaXQsIG9yIHdoZW4gdGhlIGNsaWVudFxuICogaGFuZ3MgdXAgKHNlZSB7QGxpbmsgcmVxdWVzdEFib3J0U2lnbmFsfSkuIENhbGxlcnMgdGhhdCBETyB3YW50IGEgZGVhZGxpbmVcbiAqIHNob3VsZCBzZW5kIG9uZSwgdGhlIHNhbWUgYXMgdGhleSB3b3VsZCB0byBPcGVuQUkuXG4gKi9cbmNvbnN0IHVwc3RyZWFtRGlzcGF0Y2hlciA9IG5ldyBBZ2VudCh7IGhlYWRlcnNUaW1lb3V0OiAwLCBib2R5VGltZW91dDogMCB9KTtcblxuLyoqIFBPU1Qgcm91dGVzIGZvcndhcmRlZCB0byBhIHNlcnZpbmcgZW5kcG9pbnQgKGNoYXQgb3IgUmVzcG9uc2VzLW9ubHkpLiAqL1xuY29uc3QgUFJPWFlfUEFUSFMgPSBuZXcgU2V0KFtcbiAgXCIvdjEvY2hhdC9jb21wbGV0aW9uc1wiLFxuICBcIi9jaGF0L2NvbXBsZXRpb25zXCIsXG4gIFwiL3YxL2NvbXBsZXRpb25zXCIsXG4gIFwiL2NvbXBsZXRpb25zXCIsXG4gIFwiL3YxL2VtYmVkZGluZ3NcIixcbiAgXCIvZW1iZWRkaW5nc1wiLFxuXSk7XG5cbi8qKiBHRVQgcm91dGVzIHRoYXQgbGlzdCB0aGUgcmVzb2x2YWJsZSBtb2RlbCBjYXRhbG9ndWUuICovXG5jb25zdCBNT0RFTFNfUEFUSFMgPSBuZXcgU2V0KFtcIi92MS9tb2RlbHNcIiwgXCIvbW9kZWxzXCJdKTtcblxuLyoqIFBPU1Qgcm91dGVzIHRoYXQgY2FycnkgYW4gT3BlbkFJIFJlc3BvbnNlcyBBUEkgYm9keSAobmF0aXZlIHBhc3N0aHJvdWdoKS4gKi9cbmNvbnN0IFJFU1BPTlNFU19QQVRIUyA9IG5ldyBTZXQoW1wiL3YxL3Jlc3BvbnNlc1wiLCBcIi9yZXNwb25zZXNcIl0pO1xuXG4vKipcbiAqIEV4dHJhIHJlcXVlc3QgZmllbGRzIHRvIHN0cmlwIGJlZm9yZSBmb3J3YXJkaW5nLCBvbiB0b3Agb2ZcbiAqIGBvcGVuYWlDaGF0LlVOU1VQUE9SVEVEX0NIQVRfRklFTERTYC4gQ29tbWEtc2VwYXJhdGVkIGluIGBQUk9YWV9EUk9QX0ZJRUxEU2AuXG4gKlxuICogQW4gZXNjYXBlIGhhdGNoOiB3aGVuIGEgd29ya3NwYWNlIG9yIGEgbmV3IGNsaWVudCB2ZXJzaW9uIHRyaXBzIGEgZmllbGRcbiAqIERhdGFicmlja3MgcmVqZWN0cywgYW4gb3BlcmF0b3IgY2FuIHVuYmxvY2sgdGhlbXNlbHZlcyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mXG4gKiB3YWl0aW5nIG9uIGEgcmVsZWFzZSBvZiB0aGlzIHBhY2thZ2UuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhRHJvcEZpZWxkcygpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAocHJvY2Vzcy5lbnYuUFJPWFlfRFJPUF9GSUVMRFMgPz8gXCJcIilcbiAgICAuc3BsaXQoXCIsXCIpXG4gICAgLm1hcCgoZmllbGQpID0+IGZpZWxkLnRyaW0oKSlcbiAgICAuZmlsdGVyKChmaWVsZCkgPT4gZmllbGQubGVuZ3RoID4gMCk7XG59XG5cbi8qKiBPcHRpb25zIHNoYXJlZCBieSB7QGxpbmsgY3JlYXRlUHJveHlTZXJ2ZXJ9IGFuZCB7QGxpbmsgc3RhcnRQcm94eVNlcnZlcn0uICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5U2VydmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIHNldCwgbG9jYWwgY2xpZW50cyBtdXN0IHByZXNlbnQgdGhpcyB2YWx1ZSBhcyBhIGJlYXJlciB0b2tlblxuICAgKiAoYEF1dGhvcml6YXRpb246IEJlYXJlciA8a2V5PmApLiBVbnNldCBsZWF2ZXMgdGhlIHByb3h5IG9wZW4sIHdoaWNoIGlzIGZpbmVcbiAgICogZm9yIGEgbG9vcGJhY2sgYmluZCBidXQgc2hvdWxkIGJlIHBhaXJlZCB3aXRoIGEga2V5IG9uIGEgd2lkZXIgb25lLlxuICAgKi9cbiAgYXBpS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogUG9saWN5IGZvciBhYnNvcmJpbmcgdXBzdHJlYW0gNDI5cy4gT21pdHRlZCBkZWZhdWx0cyB0byB7QGxpbmtcbiAgICogREVGQVVMVF9SRVRSWX0gKHJldHJ5IG9uKS4gU2VlIHtAbGluayBSZXRyeUNvbmZpZ30uXG4gICAqL1xuICByZXRyeT86IFJldHJ5Q29uZmlnO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHN0YXJ0UHJveHlTZXJ2ZXJ9LCBhZGRpbmcgdGhlIGxpc3RlbiBhZGRyZXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFByb3h5T3B0aW9ucyBleHRlbmRzIFByb3h5U2VydmVyT3B0aW9ucyB7XG4gIGhvc3Q/OiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG59XG5cbi8qKiBCdWlsZCAoYnV0IGRvIG5vdCBzdGFydCkgdGhlIHByb3h5IEhUVFAgc2VydmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3h5U2VydmVyKFxuICBiYWNrZW5kOiBEYXRhYnJpY2tzQmFja2VuZCxcbiAgb3B0aW9uczogUHJveHlTZXJ2ZXJPcHRpb25zID0ge30sXG4pOiBTZXJ2ZXIge1xuICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKHJlcSwgcmVzKSA9PiB7XG4gICAgdm9pZCBoYW5kbGVSZXF1ZXN0KGJhY2tlbmQsIG9wdGlvbnMsIHJlcSwgcmVzKTtcbiAgfSk7XG4gIC8vIE1hdGNoIHRoZSB1cHN0cmVhbSBwb2xpY3kgb24gdGhlIElOQk9VTkQgc2lkZTogbmV2ZXIgY3V0IGEgY2xpZW50IG9mZlxuICAvLyBtaWQtdHVybi4gTm9kZSdzIGRlZmF1bHRzICgzMDBzIGByZXF1ZXN0VGltZW91dGAsIDYwcyBgaGVhZGVyc1RpbWVvdXRgKVxuICAvLyBhcmUgc2l6ZWQgZm9yIG9yZGluYXJ5IHdlYiB0cmFmZmljLCBub3QgZm9yIGhvbGRpbmcgYSBzdHJlYW1lZCBtb2RlbFxuICAvLyByZXNwb25zZSBvcGVuLCBhbmQgYSBjbGllbnQgdGhhdCBoaXRzIG9uZSBnZXRzIGEgZGVhZCBzb2NrZXQgcmF0aGVyIHRoYW5cbiAgLy8gYW4gZXJyb3IgaXQgY2FuIGFjdCBvbi4gYDBgIGRpc2FibGVzIGVhY2g7IHRoZSB0dXJuIG5vdyBlbmRzIHdoZW4gdGhlXG4gIC8vIG1vZGVsIGlzIGRvbmUgb3IgdGhlIGNsaWVudCBkaXNjb25uZWN0cy5cbiAgc2VydmVyLnJlcXVlc3RUaW1lb3V0ID0gMDtcbiAgc2VydmVyLmhlYWRlcnNUaW1lb3V0ID0gMDtcbiAgc2VydmVyLnRpbWVvdXQgPSAwO1xuICByZXR1cm4gc2VydmVyO1xufVxuXG4vKipcbiAqIFNpZ25hbCB0aGF0IGFib3J0cyB3aGVuIHRoZSBjbGllbnQgaGFuZ3MgdXAuXG4gKlxuICogUmVtb3ZpbmcgdGhlIHRpbWVvdXRzIG1lYW5zIG5vdGhpbmcgZWxzZSB3aWxsIGV2ZXIgZW5kIGEgZm9yZ290dGVuIHJlcXVlc3QsXG4gKiBzbyB0aGUgY2xpZW50J3Mgb3duIGRpc2Nvbm5lY3QgYmVjb21lcyB0aGUgb25seSBiYWNrc3RvcCBhZ2FpbnN0IGFuIHVwc3RyZWFtXG4gKiBjYWxsIHJ1bm5pbmcgb24gd2l0aCBubyBvbmUgdG8gcmVjZWl2ZSBpdC4gUGFzc2luZyB0aGlzIHRvIGBmZXRjaGAgaXMgd2hhdFxuICogbWFrZXMgYSBjYW5jZWxsZWQgdHVybiAoQ3RybC1DLCBhIGNsb3NlZCB0YWIsIGEga2lsbGVkIENMSSkgcmVsZWFzZSB0aGVcbiAqIERhdGFicmlja3Mtc2lkZSBzdHJlYW0gaW5zdGVhZCBvZiBsZWFraW5nIGl0IGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBLZXllZCBvZmYgdGhlIFJFU1BPTlNFLCBub3QgdGhlIHJlcXVlc3Q6IGBJbmNvbWluZ01lc3NhZ2VgIGVtaXRzIGBjbG9zZWAgYXNcbiAqIHNvb24gYXMgaXRzIGJvZHkgaGFzIGJlZW4gZnVsbHkgY29uc3VtZWQsIHdoaWNoIG9uIGV2ZXJ5IFBPU1QgaGVyZSBoYXBwZW5zXG4gKiBiZWZvcmUgdGhlIHVwc3RyZWFtIGNhbGwgaXMgZXZlbiBtYWRlIC0gd2F0Y2hpbmcgdGhhdCB3b3VsZCBhYm9ydCBlYWNoIHR1cm5cbiAqIGluc3RhbnRseS4gYFNlcnZlclJlc3BvbnNlYCBlbWl0cyBgY2xvc2VgIHdoZW4gdGhlIHJlc3BvbnNlIGZpbmlzaGVzIG9yIHRoZVxuICogY29ubmVjdGlvbiBkcm9wcywgc28gdGhlIGB3cml0YWJsZUZpbmlzaGVkYCBjaGVjayBzZXBhcmF0ZXMgXCJjbGllbnQgbGVmdFwiXG4gKiBmcm9tIFwid2UgcmVwbGllZFwiLlxuICovXG5mdW5jdGlvbiBjbGllbnRBYm9ydFNpZ25hbChyZXM6IFNlcnZlclJlc3BvbnNlKTogQWJvcnRTaWduYWwge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICByZXMub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICBpZiAoIXJlcy53cml0YWJsZUZpbmlzaGVkKSBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0pO1xuICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG59XG5cbi8qKlxuICogUE9TVCBhIEpTT04gYm9keSB0byBhIHNlcnZpbmcgZW5kcG9pbnQgb24gdGhlIG5vLXRpbWVvdXRcbiAqIHtAbGluayB1cHN0cmVhbURpc3BhdGNoZXJ9LCBjYW5jZWxsZWQgdmlhIGBzaWduYWxgLlxuICpcbiAqIEV2ZXJ5IHVwc3RyZWFtIGNhbGwgZ29lcyB0aHJvdWdoIGhlcmUgc28gdGhlIHRpbWVvdXQgYW5kIGNhbmNlbGxhdGlvbiBwb2xpY3lcbiAqIGlzIHN0YXRlZCBvbmNlLiBgZGlzcGF0Y2hlcmAgaXMgYW4gdW5kaWNpIGV4dGVuc2lvbiB0aGF0IHRoZSBET01cbiAqIGBSZXF1ZXN0SW5pdGAgTm9kZSBjb21waWxlcyBhZ2FpbnN0IGRvZXMgbm90IGRlY2xhcmUsIGhlbmNlIHRoZSBsb2NhbFxuICogaW50ZXJzZWN0aW9uIHR5cGUgcmF0aGVyIHRoYW4gYSBjYXN0IGF0IGVhY2ggY2FsbCBzaXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiB1cHN0cmVhbUZldGNoKFxuICB1cmw6IHN0cmluZyxcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYm9keTogc3RyaW5nLFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCA9IHsgbWV0aG9kOiBcIlBPU1RcIiwgaGVhZGVycywgYm9keSwgc2lnbmFsIH07XG4gIC8vIGBkaXNwYXRjaGVyYCBpcyBhbiB1bmRpY2kgZXh0ZW5zaW9uIHRoZSBET00gYFJlcXVlc3RJbml0YCBkb2Vzbid0IGRlY2xhcmUsXG4gIC8vIGFuZCBpdCBjYW4ndCBzaW1wbHkgYmUgdHlwZWQgb246IGBAdHlwZXMvbm9kZWAgcGlucyBpdHMgb3duIGB1bmRpY2ktdHlwZXNgXG4gIC8vIGNvcHksIHNvIHRoZSBgQWdlbnRgIGZyb20gb3VyIGB1bmRpY2lgIGRlcGVuZGVuY3kgaXMgYSBzdHJ1Y3R1cmFsbHlcbiAgLy8gaWRlbnRpY2FsIGJ1dCBub21pbmFsbHkgZGlmZmVyZW50IHR5cGUgdGhhbiB0aGUgb25lIHRoZSBnbG9iYWwgYGZldGNoYFxuICAvLyBzaWduYXR1cmUgZXhwZWN0cy4gQXR0YWNoaW5nIGl0IHN0cnVjdHVyYWxseSBzaWRlc3RlcHMgYSB2ZXJzaW9uIHNrZXcgdGhhdFxuICAvLyBubyBjYXN0IGV4cHJlc3NlcyBjbGVhbmx5LCBhbmQgYGZldGNoYCByZWFkcyBpdCBhdCBydW50aW1lIGFsbCB0aGUgc2FtZS5cbiAgUmVmbGVjdC5zZXQoaW5pdCwgXCJkaXNwYXRjaGVyXCIsIHVwc3RyZWFtRGlzcGF0Y2hlcik7XG4gIHJldHVybiBmZXRjaCh1cmwsIGluaXQpO1xufVxuXG4vKipcbiAqIERlbGF5IChtcykgYSBgNDI5YCByZXNwb25zZSBhc2tzIHVzIHRvIHdhaXQsIGZyb20gaXRzIGBSZXRyeS1BZnRlcmAgaGVhZGVyLFxuICogb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQvdW5wYXJzZWFibGUuIEhhbmRsZXMgYm90aCBoZWFkZXIgZm9ybXM6IGFuIGludGVnZXJcbiAqIGNvdW50IG9mIHNlY29uZHMsIGFuZCBhbiBIVFRQIGRhdGUgdG8gd2FpdCB1bnRpbCAoY2xhbXBlZCB0byBgPj0gMGApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXRyeUFmdGVyTXMoaGVhZGVyOiBzdHJpbmcgfCBudWxsLCBub3dNczogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFoZWFkZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRyaW1tZWQgPSBoZWFkZXIudHJpbSgpO1xuICBpZiAoL15cXGQrJC8udGVzdCh0cmltbWVkKSkgcmV0dXJuIE51bWJlcih0cmltbWVkKSAqIDEwMDA7XG4gIGNvbnN0IHdoZW4gPSBEYXRlLnBhcnNlKHRyaW1tZWQpO1xuICBpZiAoTnVtYmVyLmlzTmFOKHdoZW4pKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgd2hlbiAtIG5vd01zKTtcbn1cblxuLyoqXG4gKiBCYWNrb2ZmIChtcykgYmVmb3JlIHJldHJ5IGBhdHRlbXB0YCAoMC1iYXNlZCk6IGV4cG9uZW50aWFsIGZyb21cbiAqIGBiYXNlRGVsYXlNc2AsIGNhcHBlZCBhdCBgbWF4RGVsYXlNc2AsIHdpdGggdXAgdG8gKzUwJSBqaXR0ZXIgc28gY29uY3VycmVudFxuICogcmV0cmllcyBmcm9tIG9uZSBhZ2VudCBkb24ndCByZXN5bmNocm9uaXplIGludG8gdGhlIG5leHQgYnVyc3QuIEEgc2VydmVyLXNlbnRcbiAqIGBSZXRyeS1BZnRlcmAgd2lucyBvdXRyaWdodCAoc3RpbGwgY2FwcGVkKSwgc2luY2UgdGhlIHNlcnZlciBrbm93cyBiZXR0ZXJcbiAqIHRoYW4gb3VyIHNjaGVkdWxlIHdoZW4gaXQgd2lsbCBhY2NlcHQgdHJhZmZpYyBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhY2tvZmZEZWxheU1zKFxuICBhdHRlbXB0OiBudW1iZXIsXG4gIHJldHJ5OiBSZXRyeUNvbmZpZyxcbiAgcmV0cnlBZnRlck1zOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGppdHRlcjogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgaWYgKHJldHJ5QWZ0ZXJNcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gTWF0aC5taW4ocmV0cnlBZnRlck1zLCByZXRyeS5tYXhEZWxheU1zKTtcbiAgY29uc3QgZXhwb25lbnRpYWwgPSByZXRyeS5iYXNlRGVsYXlNcyAqIDIgKiogYXR0ZW1wdDtcbiAgY29uc3QgY2FwcGVkID0gTWF0aC5taW4oZXhwb25lbnRpYWwsIHJldHJ5Lm1heERlbGF5TXMpO1xuICByZXR1cm4gTWF0aC5yb3VuZChjYXBwZWQgKiAoMSArIGppdHRlciAqIDAuNSkpO1xufVxuXG4vKipcbiAqIHtAbGluayB1cHN0cmVhbUZldGNofSB3aXRoIGluLXByb3h5IGA0MjlgIGhhbmRsaW5nLiBXaGVuIGByZXRyeS5lbmFibGVkYCwgYVxuICogNDI5IGlzIHJldHJpZWQgdXAgdG8gYHJldHJ5Lm1heFJldHJpZXNgIHRpbWVzIHdpdGgge0BsaW5rIGJhY2tvZmZEZWxheU1zfVxuICogYmFja29mZiBpbnN0ZWFkIG9mIGJlaW5nIHN1cmZhY2VkOyB0aGUgdGhyb3R0bGVkIHJlc3BvbnNlIGJvZHkgaXMgZHJhaW5lZFxuICogZWFjaCB0aW1lIHNvIHRoZSBjb25uZWN0aW9uIGlzIHJlbGVhc2VkLiBUaGUgcmV0cnkgaGFwcGVucyBCRUZPUkUgdGhlIGNhbGxlclxuICogd3JpdGVzIGFueSBzdGF0dXMgbGluZSwgc28gaXQgaXMgdHJhbnNwYXJlbnQgdG8gYm90aCBzdHJlYW1pbmcgYW5kXG4gKiBub24tc3RyZWFtaW5nIHBhdGhzIC0gdGhlIGNsaWVudCBvbmx5IGV2ZXIgc2VlcyB0aGUgZmluYWwgcmVzcG9uc2UuXG4gKlxuICogQmFpbHMgZWFybHkgKHJldHVybmluZyB0aGUgNDI5KSB3aGVuIHJldHJpZXMgYXJlIGV4aGF1c3RlZCwgd2hlbiB0aGUgY2xpZW50XG4gKiBoYXMgaHVuZyB1cCAoYHNpZ25hbC5hYm9ydGVkYCksIG9yIHdoZW4gdGhlIHJlc3BvbnNlIGNhcnJpZXMgbm8gYFJldHJ5LUFmdGVyYFxuICogYW5kIHdlIHdvdWxkIG90aGVyd2lzZSBsb29wIGJsaW5kIHBhc3QgdGhlIGNhcC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBzdHJlYW1GZXRjaFJldHJ5aW5nKFxuICBiYWNrZW5kOiBEYXRhYnJpY2tzQmFja2VuZCxcbiAgdXJsOiBzdHJpbmcsXG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJvZHk6IHVua25vd24sXG4gIHJlczogU2VydmVyUmVzcG9uc2UsXG4gIHJldHJ5OiBSZXRyeUNvbmZpZyxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3Qgc2lnbmFsID0gY2xpZW50QWJvcnRTaWduYWwocmVzKTtcbiAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB1cHN0cmVhbUZldGNoKHVybCwgaGVhZGVycywgcGF5bG9hZCwgc2lnbmFsKTtcbiAgaWYgKCFyZXRyeS5lbmFibGVkKSByZXR1cm4gcmVzcG9uc2U7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5ICYmIGF0dGVtcHQgPCByZXRyeS5tYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCByZXRyeUFmdGVyTXMgPSBwYXJzZVJldHJ5QWZ0ZXJNcyhyZXNwb25zZS5oZWFkZXJzLmdldChcInJldHJ5LWFmdGVyXCIpLCBEYXRlLm5vdygpKTtcbiAgICBjb25zdCBkZWxheU1zID0gYmFja29mZkRlbGF5TXMoYXR0ZW1wdCwgcmV0cnksIHJldHJ5QWZ0ZXJNcywgaml0dGVyRnJhY3Rpb24oKSk7XG4gICAgLy8gUmVsZWFzZSB0aGUgdGhyb3R0bGVkIHJlc3BvbnNlJ3Mgc29ja2V0IGJlZm9yZSB3YWl0aW5nOyBpdHMgYm9keSBpcyBhblxuICAgIC8vIGVycm9yIHBheWxvYWQgd2UgYXJlIGNob29zaW5nIG5vdCB0byByZWxheS5cbiAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSA0Mjk7IGJhY2tpbmcgb2ZmXCIsIHtcbiAgICAgIGF0dGVtcHQ6IGF0dGVtcHQgKyAxLFxuICAgICAgbWF4UmV0cmllczogcmV0cnkubWF4UmV0cmllcyxcbiAgICAgIGRlbGF5TXMsXG4gICAgICAuLi4ocmV0cnlBZnRlck1zICE9PSB1bmRlZmluZWQgPyB7IHJldHJ5QWZ0ZXJNcyB9IDoge30pLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhc3luY1V0aWwuc2xlZXAoZGVsYXlNcywgc2lnbmFsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENsaWVudCBodW5nIHVwIG1pZC13YWl0OiByZXR1cm4gdGhlIGxhc3QgNDI5IHJhdGhlciB0aGFuIGlzc3VlIGFcbiAgICAgIC8vIHJlcXVlc3Qgbm8gb25lIGlzIGxpc3RlbmluZyBmb3IuXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIC8vIEZyZXNoIGF1dGggaGVhZGVyIHBlciBhdHRlbXB0IHNvIGEgbG9uZyBiYWNrb2ZmIGNhbid0IG91dGxpdmUgdGhlIHRva2VuLlxuICAgIGNvbnN0IHJldHJ5SGVhZGVycyA9IHsgLi4uKGF3YWl0IGJhY2tlbmQuYXV0aEhlYWRlcnMoKSksIC4uLmhlYWRlcnMgfTtcbiAgICByZXNwb25zZSA9IGF3YWl0IHVwc3RyZWFtRmV0Y2godXJsLCByZXRyeUhlYWRlcnMsIHBheWxvYWQsIHNpZ25hbCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG4vKipcbiAqIEppdHRlciBmcmFjdGlvbiBpbiBgWzAsIDEpYC4gU3BsaXQgb3V0IHNvIHRlc3RzIGNhbiBzdHViIGRldGVybWluaXNtO1xuICogYE1hdGgucmFuZG9tYCBpcyBmaW5lIGZvciBzcHJlYWRpbmcgcmV0cnkgdGltaW5nLlxuICovXG5mdW5jdGlvbiBqaXR0ZXJGcmFjdGlvbigpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbmQgc3RhcnQgdGhlIHByb3h5LCByZXNvbHZpbmcgb25jZSBpdCBpcyBhY2NlcHRpbmcgY29ubmVjdGlvbnMuXG4gKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgYW5kIGl0cyBiYXNlIFVSTCAod2l0aCB0aGUgYWN0dWFsbHktYm91bmQgcG9ydCwgc28gYVxuICogYHBvcnQ6IDBgIHJlcXVlc3Qgc3VyZmFjZXMgdGhlIE9TLWFzc2lnbmVkIHBvcnQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRQcm94eVNlcnZlcihcbiAgYmFja2VuZDogRGF0YWJyaWNrc0JhY2tlbmQsXG4gIG9wdGlvbnM6IFN0YXJ0UHJveHlPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPHsgc2VydmVyOiBTZXJ2ZXI7IHVybDogc3RyaW5nIH0+IHtcbiAgY29uc3QgaG9zdCA9IG9wdGlvbnMuaG9zdCA/PyBERUZBVUxUX0JJTkRfSE9TVDtcbiAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCA/PyBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVByb3h5U2VydmVyKGJhY2tlbmQsIG9wdGlvbnMpO1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25FcnJvciA9IChlcnI6IEVycm9yKSA9PiByZWplY3QoZXJyKTtcbiAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCwgKCkgPT4ge1xuICAgICAgc2VydmVyLm9mZihcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbiAgY29uc3QgYWRkcmVzcyA9IHNlcnZlci5hZGRyZXNzKCk7XG4gIGNvbnN0IGJvdW5kUG9ydCA9IHR5cGVvZiBhZGRyZXNzID09PSBcIm9iamVjdFwiICYmIGFkZHJlc3MgPyBhZGRyZXNzLnBvcnQgOiBwb3J0O1xuICByZXR1cm4geyBzZXJ2ZXIsIHVybDogYGh0dHA6Ly8ke2hvc3R9OiR7Ym91bmRQb3J0fWAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVxdWVzdChcbiAgYmFja2VuZDogRGF0YWJyaWNrc0JhY2tlbmQsXG4gIG9wdGlvbnM6IFByb3h5U2VydmVyT3B0aW9ucyxcbiAgcmVxOiBJbmNvbWluZ01lc3NhZ2UsXG4gIHJlczogU2VydmVyUmVzcG9uc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmF3VXJsID0gcmVxLnVybCA/PyBcIi9cIjtcbiAgY29uc3QgW3BhdGgsIHF1ZXJ5ID0gXCJcIl0gPSByYXdVcmwuc3BsaXQoXCI/XCIpO1xuICBjb25zdCByb3V0ZVBhdGggPSBwYXRoID8/IFwiL1wiO1xuICB0cnkge1xuICAgIGlmIChyZXEubWV0aG9kID09PSBcIkdFVFwiICYmIChyb3V0ZVBhdGggPT09IFwiL2hlYWx0aFwiIHx8IHJvdXRlUGF0aCA9PT0gXCIvXCIpKSB7XG4gICAgICBzZW5kSnNvbihyZXMsIDIwMCwgeyBzdGF0dXM6IFwib2tcIiB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYXBpS2V5ICYmICFpc0F1dGhvcml6ZWQocmVxLCBvcHRpb25zLmFwaUtleSkpIHtcbiAgICAgIHNlbmRKc29uKHJlcywgNDAxLCBlcnJvckJvZHkoXCJpbnZhbGlkIGFwaSBrZXlcIiwgXCJpbnZhbGlkX3JlcXVlc3RfZXJyb3JcIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIiAmJiBNT0RFTFNfUEFUSFMuaGFzKHJvdXRlUGF0aCkpIHtcbiAgICAgIC8vIENvZGV4IGFsd2F5cyBzZW5kcyBgP2NsaWVudF92ZXJzaW9uPeKApmA7IHVzZSB0aGF0IHRvIHBpY2sgaXRzIGxpc3Qgc2hhcGUuXG4gICAgICBjb25zdCB3YW50c0NvZGV4U2hhcGUgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5KS5oYXMoXCJjbGllbnRfdmVyc2lvblwiKTtcbiAgICAgIGF3YWl0IGhhbmRsZU1vZGVscyhiYWNrZW5kLCByZXMsIHdhbnRzQ29kZXhTaGFwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJldHJ5ID0gb3B0aW9ucy5yZXRyeSA/PyBERUZBVUxUX1JFVFJZO1xuICAgIGlmIChyZXEubWV0aG9kID09PSBcIlBPU1RcIiAmJiBSRVNQT05TRVNfUEFUSFMuaGFzKHJvdXRlUGF0aCkpIHtcbiAgICAgIGF3YWl0IGhhbmRsZVJlc3BvbnNlcyhiYWNrZW5kLCByZXEsIHJlcywgcmV0cnkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgUFJPWFlfUEFUSFMuaGFzKHJvdXRlUGF0aCkpIHtcbiAgICAgIGF3YWl0IGhhbmRsZVByb3h5KGJhY2tlbmQsIHJlcSwgcmVzLCByZXRyeSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlbmRKc29uKFxuICAgICAgcmVzLFxuICAgICAgNDA0LFxuICAgICAgZXJyb3JCb2R5KGB1bnN1cHBvcnRlZCByb3V0ZSAke3JlcS5tZXRob2QgPz8gXCI/XCJ9ICR7cm91dGVQYXRofWAsIFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCIpLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKTtcbiAgICBsb2dnZXIuZXJyb3IoXCJyZXF1ZXN0IGZhaWxlZFwiLCB7IHBhdGg6IHJvdXRlUGF0aCwgZXJyb3I6IG1lc3NhZ2UgfSk7XG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHNlbmRKc29uKHJlcywgNTAwLCBlcnJvckJvZHkobWVzc2FnZSwgXCJwcm94eV9lcnJvclwiKSk7XG4gICAgZWxzZSByZXMuZW5kKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBgR0VUIC92MS9tb2RlbHNgOiBzdXJmYWNlIHRoZSBzZXJ2aW5nIGNhdGFsb2d1ZS4gVHdvIHNoYXBlczpcbiAqXG4gKiAgIC0gT3BlbkFJIChkZWZhdWx0KTogYHtvYmplY3Q6XCJsaXN0XCIsIGRhdGE6W3tpZCxvYmplY3QsY3JlYXRlZCxvd25lZF9ieX1dfWAsXG4gKiAgICAgd2hhdCB0aGUgYG9wZW5haWAgU0RLIGFuZCBtb3N0IHRvb2xzIGV4cGVjdC5cbiAqICAgLSBDb2RleCAoYGNvZGV4U2hhcGVgKTogYHttb2RlbHM6W3tzbHVnLCBkaXNwbGF5X25hbWUsIOKApn1dfWAsIHRoZSBDaGF0R1BUXG4gKiAgICAgYmFja2VuZCBzaGFwZSB0aGUgQ29kZXggQ0xJIGRlY29kZXMuIEEgcmVzcG9uc2UgbWlzc2luZyB0aGUgdG9wLWxldmVsXG4gKiAgICAgYG1vZGVsc2AgZmllbGQgbWFrZXMgQ29kZXggbG9nIFwiZmFpbGVkIHRvIGRlY29kZSBtb2RlbHMgcmVzcG9uc2VcIiwgc28gaXRcbiAqICAgICBnZXRzIGl0cyBvd24gZW52ZWxvcGUuIE9ubHkgY2hhdCBlbmRwb2ludHMgYXJlIGFkdmVydGlzZWQgdG8gQ29kZXguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZU1vZGVscyhcbiAgYmFja2VuZDogRGF0YWJyaWNrc0JhY2tlbmQsXG4gIHJlczogU2VydmVyUmVzcG9uc2UsXG4gIGNvZGV4U2hhcGU6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgYmFja2VuZC5tb2RlbHModHJ1ZSk7XG4gIGlmIChjb2RleFNoYXBlKSB7XG4gICAgY29uc3QgbW9kZWxzID0gZW5kcG9pbnRzXG4gICAgICAuZmlsdGVyKChlbmRwb2ludCkgPT4gY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLmNoYXQpXG4gICAgICAubWFwKChlbmRwb2ludCkgPT4gKHtcbiAgICAgICAgc2x1ZzogZW5kcG9pbnQubmFtZSxcbiAgICAgICAgZGlzcGxheV9uYW1lOiBlbmRwb2ludC5kaXNwbGF5TmFtZSA/PyBlbmRwb2ludC5uYW1lLFxuICAgICAgICAuLi4oZW5kcG9pbnQuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBlbmRwb2ludC5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICAvLyBGaWVsZHMgQ29kZXgncyBzdHJpY3QgZGVjb2RlciByZXF1aXJlcyBvbiBldmVyeSBtb2RlbCBlbnRyeS5cbiAgICAgICAgZGVmYXVsdF9yZWFzb25pbmdfbGV2ZWw6IFwibWVkaXVtXCIsXG4gICAgICAgIHN1cHBvcnRlZF9yZWFzb25pbmdfbGV2ZWxzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgc2hlbGxfdHlwZTogXCJzaGVsbF9jb21tYW5kXCIsXG4gICAgICAgIHZpc2liaWxpdHk6IFwibGlzdFwiLFxuICAgICAgICBzdXBwb3J0ZWRfaW5fYXBpOiB0cnVlLFxuICAgICAgfSkpO1xuICAgIHNlbmRKc29uKHJlcywgMjAwLCB7IG1vZGVscyB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZGF0YSA9IGVuZHBvaW50cy5tYXAoKGVuZHBvaW50KSA9PiAoe1xuICAgIGlkOiBlbmRwb2ludC5uYW1lLFxuICAgIG9iamVjdDogXCJtb2RlbFwiLFxuICAgIGNyZWF0ZWQ6IDAsXG4gICAgb3duZWRfYnk6IFwiZGF0YWJyaWNrc1wiLFxuICB9KSk7XG4gIHNlbmRKc29uKHJlcywgMjAwLCB7IG9iamVjdDogXCJsaXN0XCIsIGRhdGEgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcmVxdWVzdCdzIG1vZGVsIGFuZCBmb3J3YXJkIGEgQ2hhdCBDb21wbGV0aW9ucyBib2R5LiBSZXNwb25zZXMtXG4gKiBvbmx5IG1vZGVscyAoQ29kZXgpIGFyZSB0cmFuc2xhdGVkIHRvIGEgUmVzcG9uc2VzIHJlcXVlc3QgYW5kIHBvc3RlZCB0b1xuICogYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgOyBldmVyeXRoaW5nIGVsc2UgZ29lcyB0byBgL2ludm9jYXRpb25zYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUHJveHkoXG4gIGJhY2tlbmQ6IERhdGFicmlja3NCYWNrZW5kLFxuICByZXE6IEluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBTZXJ2ZXJSZXNwb25zZSxcbiAgcmV0cnk6IFJldHJ5Q29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJvZHkgPSBhd2FpdCByZWFkSnNvbkJvZHkocmVxKTtcbiAgY29uc3QgcmVxdWVzdGVkID0gdHlwZW9mIGJvZHkubW9kZWwgPT09IFwic3RyaW5nXCIgPyBib2R5Lm1vZGVsIDogdW5kZWZpbmVkO1xuICBpZiAoIXJlcXVlc3RlZCkge1xuICAgIHNlbmRKc29uKHJlcywgNDAwLCBlcnJvckJvZHkoXCJtaXNzaW5nICdtb2RlbCcgaW4gcmVxdWVzdCBib2R5XCIsIFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGJhY2tlbmQucmVzb2x2ZShyZXF1ZXN0ZWQpO1xuICBib2R5Lm1vZGVsID0gcmVzb2x2ZWQubW9kZWxJZDtcblxuICBpZiAoYmFja2VuZC5pc1Jlc3BvbnNlc09ubHkocmVzb2x2ZWQubW9kZWxJZCkpIHtcbiAgICBhd2FpdCBwcm94eUNoYXRWaWFSZXNwb25zZXMoXG4gICAgICBiYWNrZW5kLFxuICAgICAgYm9keSxcbiAgICAgIHJlcXVlc3RlZCxcbiAgICAgIHJlc29sdmVkLm1vZGVsSWQsXG4gICAgICByZXNvbHZlZC5tYXRjaGVkLFxuICAgICAgcmVzLFxuICAgICAgcmV0cnksXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGlzIHJvdXRlIGZvcndhcmRzIHRoZSBjbGllbnQncyBib2R5IGFzLWlzLCBzbyBhbnl0aGluZyBEYXRhYnJpY2tzIHJlZnVzZXNcbiAgLy8gdG8gcGFyc2UgZmFpbHMgdGhlIHR1cm4uIERyb3AgdGhlIGtub3duIG9mZmVuZGVycyByYXRoZXIgdGhhbiByZWxheWluZyBhXG4gIC8vIDQwMCB0aGUgY2xpZW50IGNhbiBkbyBub3RoaW5nIGFib3V0LlxuICBjb25zdCBkcm9wcGVkID0gb3BlbmFpQ2hhdC5zdHJpcFVuc3VwcG9ydGVkQ2hhdEZpZWxkcyhib2R5LCBleHRyYURyb3BGaWVsZHMoKSk7XG5cbiAgY29uc3Qgd2FudHNTdHJlYW0gPSBib2R5LnN0cmVhbSA9PT0gdHJ1ZTtcbiAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGJhY2tlbmQuYXV0aEhlYWRlcnMoKTtcbiAgaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICBoZWFkZXJzLmFjY2VwdCA9IHdhbnRzU3RyZWFtID8gXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiIDogXCJhcHBsaWNhdGlvbi9qc29uXCI7XG5cbiAgbG9nZ2VyLmluZm8oXCJwcm94eVwiLCB7XG4gICAgcmVxdWVzdGVkLFxuICAgIHJlc29sdmVkOiByZXNvbHZlZC5tb2RlbElkLFxuICAgIG1hdGNoZWQ6IHJlc29sdmVkLm1hdGNoZWQsXG4gICAgdXBzdHJlYW06IFwiaW52b2NhdGlvbnNcIixcbiAgICBzdHJlYW06IHdhbnRzU3RyZWFtLFxuICAgIC4uLihkcm9wcGVkLmxlbmd0aCA+IDAgPyB7IGRyb3BwZWQgfSA6IHt9KSxcbiAgfSk7XG5cbiAgY29uc3QgdXBzdHJlYW0gPSBhd2FpdCB1cHN0cmVhbUZldGNoUmV0cnlpbmcoXG4gICAgYmFja2VuZCxcbiAgICBiYWNrZW5kLmludm9jYXRpb25zVXJsKHJlc29sdmVkLm1vZGVsSWQpLFxuICAgIGhlYWRlcnMsXG4gICAgYm9keSxcbiAgICByZXMsXG4gICAgcmV0cnksXG4gICk7XG5cbiAgcmVzLndyaXRlSGVhZCh1cHN0cmVhbS5zdGF0dXMsIHtcbiAgICBcImNvbnRlbnQtdHlwZVwiOiB1cHN0cmVhbS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICBcIngtcmVzb2x2ZWQtbW9kZWxcIjogcmVzb2x2ZWQubW9kZWxJZCxcbiAgfSk7XG4gIGF3YWl0IHN0cmVhbUJvZHkodXBzdHJlYW0sIHJlcyk7XG59XG5cbi8qKlxuICogQ2hhdCBDb21wbGV0aW9ucyBjbGllbnQg4oaSIFJlc3BvbnNlcy1vbmx5IERhdGFicmlja3MgbW9kZWw6IHRyYW5zbGF0ZSB0aGVcbiAqIHJlcXVlc3QsIFBPU1QgdG8gYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgLCB0cmFuc2xhdGUgdGhlIHJlcGx5IGJhY2suXG4gKiBTdHJlYW1pbmcgaXMgbm90IHRyYW5zbGF0ZWQgeWV0IC0gdGhvc2UgY2xpZW50cyBzaG91bGQgdXNlIGAvdjEvcmVzcG9uc2VzYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJveHlDaGF0VmlhUmVzcG9uc2VzKFxuICBiYWNrZW5kOiBEYXRhYnJpY2tzQmFja2VuZCxcbiAgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHJlcXVlc3RlZDogc3RyaW5nLFxuICBtb2RlbElkOiBzdHJpbmcsXG4gIG1hdGNoZWQ6IGJvb2xlYW4sXG4gIHJlczogU2VydmVyUmVzcG9uc2UsXG4gIHJldHJ5OiBSZXRyeUNvbmZpZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHJlc3BvbnNlcywgc3RyZWFtIH0gPSBjaGF0VG9SZXNwb25zZXNSZXF1ZXN0KGJvZHkpO1xuICByZXNwb25zZXMubW9kZWwgPSBtb2RlbElkO1xuXG4gIGlmIChzdHJlYW0pIHtcbiAgICBzZW5kSnNvbihcbiAgICAgIHJlcyxcbiAgICAgIDQwMCxcbiAgICAgIGVycm9yQm9keShcbiAgICAgICAgYG1vZGVsICR7bW9kZWxJZH0gb25seSBzdXBwb3J0cyB0aGUgUmVzcG9uc2VzIEFQSTsgdXNlIFBPU1QgL3YxL3Jlc3BvbnNlcyBmb3Igc3RyZWFtaW5nYCxcbiAgICAgICAgXCJpbnZhbGlkX3JlcXVlc3RfZXJyb3JcIixcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0gYXdhaXQgYmFja2VuZC5hdXRoSGVhZGVycygpO1xuICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gIGhlYWRlcnMuYWNjZXB0ID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG5cbiAgY29uc3QgdXBzdHJlYW1VcmwgPSBiYWNrZW5kLnJlc3BvbnNlc1VybChtb2RlbElkKTtcbiAgY29uc3QgZm9yd2FyZCA9IHVwc3RyZWFtVXJsLmluY2x1ZGVzKFwiL29wZW4tcmVzcG9uc2VzXCIpXG4gICAgPyBzYW5pdGl6ZU9wZW5SZXNwb25zZXNSZXF1ZXN0KHJlc3BvbnNlcylcbiAgICA6IHJlc3BvbnNlcztcblxuICBsb2dnZXIuaW5mbyhcInByb3h5XCIsIHtcbiAgICByZXF1ZXN0ZWQsXG4gICAgcmVzb2x2ZWQ6IG1vZGVsSWQsXG4gICAgbWF0Y2hlZCxcbiAgICB1cHN0cmVhbTogdXBzdHJlYW1VcmwsXG4gICAgc3RyZWFtOiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3QgdXBzdHJlYW0gPSBhd2FpdCB1cHN0cmVhbUZldGNoUmV0cnlpbmcoYmFja2VuZCwgdXBzdHJlYW1VcmwsIGhlYWRlcnMsIGZvcndhcmQsIHJlcywgcmV0cnkpO1xuXG4gIGlmICghdXBzdHJlYW0ub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgdXBzdHJlYW0udGV4dCgpO1xuICAgIHJlcy53cml0ZUhlYWQodXBzdHJlYW0uc3RhdHVzLCB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0pO1xuICAgIHJlcy5lbmQodGV4dCB8fCBKU09OLnN0cmluZ2lmeShlcnJvckJvZHkoXCJ1cHN0cmVhbSBlcnJvclwiLCBcInByb3h5X2Vycm9yXCIpKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2VKc29uID0gKGF3YWl0IHVwc3RyZWFtLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHNlbmRKc29uKHJlcywgMjAwLCByZXNwb25zZVRvQ2hhdENvbXBsZXRpb24ocmVzcG9uc2VKc29uLCBtb2RlbElkKSk7XG59XG5cbi8qKlxuICogYFBPU1QgL3YxL3Jlc3BvbnNlc2A6IGZvcndhcmQgdGhlIFJlc3BvbnNlcyBib2R5IHRvIERhdGFicmlja3MnIG5hdGl2ZVxuICogUmVzcG9uc2VzIC8gT3BlbiBSZXNwb25zZXMgc3VyZmFjZSAobW9kZWwgc3RheXMgaW4gdGhlIGJvZHk7IFVSTCBpc1xuICogd29ya3NwYWNlLWxldmVsKS4gU3RyZWFtaW5nIGFuZCBub24tc3RyZWFtaW5nIGJvdGggcGFzcyB0aHJvdWdoIGFzLWlzLlxuICpcbiAqIE9wZW4gUmVzcG9uc2VzIChDbGF1ZGUvR2VtaW5pL+KApikgb25seSBhY2NlcHRzIGBmdW5jdGlvbmAgdG9vbHMgYW5kXG4gKiBgaW5wdXRfKmAgY29udGVudCBwYXJ0IHR5cGVzLCBhbmQgcmVqZWN0cyByZXBsYXllZCBDbGF1ZGUgdGhpbmtpbmdcbiAqIGJsb2NrcyDigJQgc28gQ29kZXgncyBidWlsdC1pbiB0b29scywgcHJpb3ItdHVybiBgb3V0cHV0X3RleHRgLCBhbmRcbiAqIGByZWRhY3RlZF90aGlua2luZ2AgLyBgdGhpbmtpbmdgIC8gYHJlYXNvbmluZ2AgcGFydHMgYXJlIHJld3JpdHRlbiBvclxuICogc3RyaXBwZWQgdGhlcmUuIFRoZSBPcGVuQUkgYC9yZXNwb25zZXNgIHBhdGgga2VlcHMgdGhlbSAtIEdQVCBzdXBwb3J0c1xuICogdGhvc2Ugc2hhcGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVSZXNwb25zZXMoXG4gIGJhY2tlbmQ6IERhdGFicmlja3NCYWNrZW5kLFxuICByZXE6IEluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBTZXJ2ZXJSZXNwb25zZSxcbiAgcmV0cnk6IFJldHJ5Q29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJvZHkgPSBhd2FpdCByZWFkSnNvbkJvZHkocmVxKTtcbiAgY29uc3QgcmVxdWVzdGVkID0gdHlwZW9mIGJvZHkubW9kZWwgPT09IFwic3RyaW5nXCIgPyBib2R5Lm1vZGVsIDogdW5kZWZpbmVkO1xuICBpZiAoIXJlcXVlc3RlZCkge1xuICAgIHNlbmRKc29uKHJlcywgNDAwLCBlcnJvckJvZHkoXCJtaXNzaW5nICdtb2RlbCcgaW4gcmVxdWVzdCBib2R5XCIsIFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGJhY2tlbmQucmVzb2x2ZShyZXF1ZXN0ZWQpO1xuICBib2R5Lm1vZGVsID0gcmVzb2x2ZWQubW9kZWxJZDtcblxuICBjb25zdCB1cHN0cmVhbVVybCA9IGJhY2tlbmQucmVzcG9uc2VzVXJsKHJlc29sdmVkLm1vZGVsSWQpO1xuICAvLyBDcm9zcy1wcm92aWRlciBPcGVuIFJlc3BvbnNlcyByZWplY3RzIG5vbi1mdW5jdGlvbiB0b29scyBhbmQgYG91dHB1dF8qYFxuICAvLyBjb250ZW50IHBhcnRzIGluIGBpbnB1dGA7IE9wZW5BSSBgL3Jlc3BvbnNlc2Aga2VlcHMgQ29kZXgncyBuYXRpdmUgc2hhcGVzLlxuICBjb25zdCBmb3J3YXJkID0gdXBzdHJlYW1VcmwuaW5jbHVkZXMoXCIvb3Blbi1yZXNwb25zZXNcIilcbiAgICA/IHNhbml0aXplT3BlblJlc3BvbnNlc1JlcXVlc3QoYm9keSlcbiAgICA6IGJvZHk7XG5cbiAgY29uc3Qgd2FudHNTdHJlYW0gPSBmb3J3YXJkLnN0cmVhbSA9PT0gdHJ1ZTtcbiAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGJhY2tlbmQuYXV0aEhlYWRlcnMoKTtcbiAgaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICBoZWFkZXJzLmFjY2VwdCA9IHdhbnRzU3RyZWFtID8gXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiIDogXCJhcHBsaWNhdGlvbi9qc29uXCI7XG5cbiAgY29uc3Qgc3RyaXBwZWQgPVxuICAgIEFycmF5LmlzQXJyYXkoYm9keS50b29scykgJiZcbiAgICAoIUFycmF5LmlzQXJyYXkoZm9yd2FyZC50b29scykgfHwgZm9yd2FyZC50b29scy5sZW5ndGggIT09IGJvZHkudG9vbHMubGVuZ3RoKTtcblxuICBsb2dnZXIuaW5mbyhcInJlc3BvbnNlc1wiLCB7XG4gICAgcmVxdWVzdGVkLFxuICAgIHJlc29sdmVkOiByZXNvbHZlZC5tb2RlbElkLFxuICAgIG1hdGNoZWQ6IHJlc29sdmVkLm1hdGNoZWQsXG4gICAgdXBzdHJlYW06IHVwc3RyZWFtVXJsLFxuICAgIHN0cmVhbTogd2FudHNTdHJlYW0sXG4gICAgLi4uKHN0cmlwcGVkID8geyBzdHJpcHBlZE5vbkZ1bmN0aW9uVG9vbHM6IHRydWUgfSA6IHt9KSxcbiAgfSk7XG5cbiAgY29uc3QgdXBzdHJlYW0gPSBhd2FpdCB1cHN0cmVhbUZldGNoUmV0cnlpbmcoYmFja2VuZCwgdXBzdHJlYW1VcmwsIGhlYWRlcnMsIGZvcndhcmQsIHJlcywgcmV0cnkpO1xuXG4gIHJlcy53cml0ZUhlYWQodXBzdHJlYW0uc3RhdHVzLCB7XG4gICAgXCJjb250ZW50LXR5cGVcIjogdXBzdHJlYW0uaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgXCJ4LXJlc29sdmVkLW1vZGVsXCI6IHJlc29sdmVkLm1vZGVsSWQsXG4gIH0pO1xuICBhd2FpdCBzdHJlYW1Cb2R5KHVwc3RyZWFtLCByZXMpO1xufVxuXG4vKipcbiAqIFB1bXAgYW4gdXBzdHJlYW0gYGZldGNoYCBSZXNwb25zZSBib2R5IHRvIHRoZSBOb2RlIHJlc3BvbnNlLCBjaHVuayBieSBjaHVuay5cbiAqXG4gKiBBIG1pZC1zdHJlYW0gdXBzdHJlYW0gZmFpbHVyZSBpcyBsb2dnZWQgcmF0aGVyIHRoYW4gdGhyb3duOiB0aGUgc3RhdHVzIGxpbmVcbiAqIGFuZCBzb21lIG51bWJlciBvZiBjaHVua3MgaGF2ZSBhbHJlYWR5IGdvbmUgb3V0LCBzbyB0aGVyZSBpcyBubyB3YXkgbGVmdCB0b1xuICogdHVybiBpdCBpbnRvIGFuIEhUVFAgZXJyb3IgYW5kIHRoZSBvbmx5IGhvbmVzdCBtb3ZlIGlzIHRvIGVuZCB0aGUgcmVzcG9uc2VcbiAqIGFuZCBzYXkgd2h5IGluIHRoZSBsb2cuIFdpdGhvdXQgdGhpcyB0aGUgcmVhZCBsb29wIHJlamVjdGVkIGludG8gdGhlIGNhbGxlcidzXG4gKiBjYXRjaCwgd2hpY2ggZm91bmQgYGhlYWRlcnNTZW50YCBhbmQgZW5kZWQgdGhlIHJlc3BvbnNlIHNpbGVudGx5IC0gbWFraW5nIGFuXG4gKiB1cHN0cmVhbSB0ZWFyZG93biBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgY2xlYW4gZmluaXNoLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdHJlYW1Cb2R5KHVwc3RyZWFtOiBSZXNwb25zZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBib2R5ID0gdXBzdHJlYW0uYm9keTtcbiAgaWYgKCFib2R5KSB7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWFkZXIgPSBib2R5LmdldFJlYWRlcigpO1xuICB0cnkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgICBpZiAodmFsdWUgJiYgIXJlcy53cml0YWJsZUVuZGVkKSByZXMud3JpdGUoQnVmZmVyLmZyb20odmFsdWUpKTtcbiAgICAgIGlmIChyZXMud3JpdGFibGVFbmRlZCkgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBBbiBhYm9ydGVkIHJlcXVlc3QgaXMgdGhlIGV4cGVjdGVkIHNoYXBlIG9mIGEgY2xpZW50IGhhbmdpbmcgdXAsIG5vdCBhXG4gICAgLy8gZmF1bHQgd29ydGggcmVwb3J0aW5nIGF0IGVycm9yIGxldmVsLlxuICAgIGNvbnN0IGFib3J0ZWQgPSByZXMud3JpdGFibGVFbmRlZCB8fCAhcmVzLndyaXRhYmxlO1xuICAgIGxvZ2dlclthYm9ydGVkID8gXCJpbmZvXCIgOiBcImVycm9yXCJdKFwic3RyZWFtIGVuZGVkIGVhcmx5XCIsIHtcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIHJlcy5lbmQoKTtcbiAgfVxufVxuXG4vKiogVHJ1ZSB3aGVuIHRoZSByZXF1ZXN0IGNhcnJpZXMgdGhlIGV4cGVjdGVkIGJlYXJlciB0b2tlbi4gKi9cbmZ1bmN0aW9uIGlzQXV0aG9yaXplZChyZXE6IEluY29taW5nTWVzc2FnZSwgYXBpS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgaGVhZGVyID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcbiAgaWYgKCFoZWFkZXIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGhlYWRlci5yZXBsYWNlKC9eQmVhcmVyXFxzKy9pLCBcIlwiKS50cmltKCkgPT09IGFwaUtleTtcbn1cblxuLyoqXG4gKiBEcmFpbiBhIHJlcXVlc3QgYm9keSBhbmQgcGFyc2UgaXQgYXMgYSBKU09OIG9iamVjdC4gQW4gZW1wdHksIG1hbGZvcm1lZCwgb3JcbiAqIG5vbi1vYmplY3QgYm9keSB5aWVsZHMgYHt9YCwgd2hpY2ggdGhlIGNhbGxlcnMgcmVqZWN0IGFzIGEgbWlzc2luZyBgbW9kZWxgLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkSnNvbkJvZHkocmVxOiBJbmNvbWluZ01lc3NhZ2UpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiByZXEpIHtcbiAgICBjaHVua3MucHVzaChCdWZmZXIuaXNCdWZmZXIoY2h1bmspID8gY2h1bmsgOiBCdWZmZXIuZnJvbShjaHVuayBhcyBVaW50OEFycmF5KSk7XG4gIH1cbiAgcmV0dXJuIGpzb24ucGFyc2VSZWNvcmQoQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKFwidXRmOFwiKSkgPz8ge307XG59XG5cbi8qKiBTZXJpYWxpemUgYW5kIHNlbmQgYSBKU09OIHJlc3BvbnNlLiAqL1xuZnVuY3Rpb24gc2VuZEpzb24ocmVzOiBTZXJ2ZXJSZXNwb25zZSwgc3RhdHVzOiBudW1iZXIsIGJvZHk6IHVua25vd24pOiB2b2lkIHtcbiAgcmVzLndyaXRlSGVhZChzdGF0dXMsIHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSk7XG4gIHJlcy5lbmQoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xufVxuXG4vKiogT3BlbkFJLXNoYXBlZCBlcnJvciBlbnZlbG9wZS4gKi9cbmZ1bmN0aW9uIGVycm9yQm9keShtZXNzYWdlOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IHsgZXJyb3I6IHsgbWVzc2FnZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfSB9IHtcbiAgcmV0dXJuIHsgZXJyb3I6IHsgbWVzc2FnZSwgdHlwZSB9IH07XG59XG4iXX0=
515
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQTBELE1BQU0sV0FBVyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxLQUFLLElBQUksU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUcvQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFFakcsTUFBTSxFQUFFLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLDRCQUE0QixFQUFFLEdBQ3RGLGVBQWUsQ0FBQztBQUVsQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFNUUsNEVBQTRFO0FBQzVFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzFCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsYUFBYTtDQUNkLENBQUMsQ0FBQztBQUVILDJEQUEyRDtBQUMzRCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFD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RUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDOUQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELG9DQUFvQztBQUNwQyxTQUFTLFNBQVMsQ0FBQyxPQUFlLEVBQUUsSUFBWTtJQUM5QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJLWNvbXBhdGlibGUgSFRUUCBwcm94eSBpbiBmcm9udCBvZiBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcuXG4gKlxuICogRGF0YWJyaWNrcyBzZXJ2aW5nIGVuZHBvaW50cyBzcGVhayBPcGVuQUkgd2lyZSBmb3JtYXRzLCBzbyB0aGlzIHNlcnZlciBpcyBhXG4gKiB0aGluIHBhc3MtdGhyb3VnaDogaXQgcmVzb2x2ZXMgdGhlIHJlcXVlc3QncyAocG9zc2libHkgZnV6enkpIGBtb2RlbGAgdG8gYVxuICogcmVhbCBlbmRwb2ludCBpZCB2aWEgdGhlIHtAbGluayBEYXRhYnJpY2tzQmFja2VuZH0sIHN0YW1wcyBhIGZyZXNoIGF1dGhcbiAqIGhlYWRlciwgYW5kIGZvcndhcmRzIHRvIHRoZSByaWdodCBEYXRhYnJpY2tzIFVSTDpcbiAqXG4gKiAgIC0gQ2hhdCBDb21wbGV0aW9ucyDihpIgYC9zZXJ2aW5nLWVuZHBvaW50cy88bmFtZT4vaW52b2NhdGlvbnNgLCBleGNlcHQgZm9yXG4gKiAgICAgUmVzcG9uc2VzLW9ubHkgbW9kZWxzIChDb2RleCkgd2hpY2ggYXJlIHRyYW5zbGF0ZWQgYW5kIHNlbnQgdG9cbiAqICAgICBgL3NlcnZpbmctZW5kcG9pbnRzL3Jlc3BvbnNlc2AuXG4gKiAgIC0gUmVzcG9uc2VzIOKGkiBuYXRpdmUgYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgIChPcGVuQUktZmFtaWx5KSBvclxuICogICAgIGAvc2VydmluZy1lbmRwb2ludHMvb3Blbi1yZXNwb25zZXNgIChDbGF1ZGUvR2VtaW5pL+KApiksIGJvZHkgZm9yd2FyZGVkXG4gKiAgICAgYXMtaXMuIE5vIGNoYXQgcm91bmQtdHJpcC5cbiAqXG4gKiBBbnkgT3BlbkFJLWNvbXBhdGlibGUgdG9vbCAoaVRlcm0sIGVkaXRvcnMsIHRoZSBgb3BlbmFpYCBTREssIENvZGV4IENMSSkgY2FuXG4gKiBwb2ludCBpdHMgYmFzZSBVUkwgYXQgdGhpcyBzZXJ2ZXIgYW5kIHVzZSBsb29zZSBtb2RlbCBuYW1lcy5cbiAqXG4gKiBSb3V0ZXM6XG4gKiAgIC0gYEdFVCAgL2hlYWx0aGAsIGBHRVQgL2AgICAgICAgICAgICBsaXZlbmVzc1xuICogICAtIGBHRVQgIC92MS9tb2RlbHNgLCBgR0VUIC9tb2RlbHNgICAgbGlzdCByZXNvbHZhYmxlIGVuZHBvaW50cy4gRW1pdHMgdGhlXG4gKiAgICAgT3BlbkFJIGB7b2JqZWN0OlwibGlzdFwiLGRhdGE6W+KApl19YCBzaGFwZSBieSBkZWZhdWx0OyB3aGVuIHRoZSByZXF1ZXN0XG4gKiAgICAgbG9va3MgbGlrZSB0aGUgQ29kZXggQ0xJIChhIGBjbGllbnRfdmVyc2lvbmAgcXVlcnkgcGFyYW0sIHdoaWNoIENvZGV4XG4gKiAgICAgYWx3YXlzIHNlbmRzKSBpdCBlbWl0cyBDb2RleCdzIGB7bW9kZWxzOlt7c2x1ZyzigKZ9XX1gIHNoYXBlIGluc3RlYWQsIHNvXG4gKiAgICAgYm90aCBzdGFuZGFyZCBPcGVuQUkgY2xpZW50cyBhbmQgQ29kZXggY2FuIGVudW1lcmF0ZSB0aGUgY2F0YWxvZ3VlLlxuICogICAtIGBQT1NUIC92MS9jaGF0L2NvbXBsZXRpb25zYCAgICAgICAgcHJveHkgKGFsc28gYC9jb21wbGV0aW9uc2AsXG4gKiAgICAgYC92MS9jb21wbGV0aW9uc2AsIGAvdjEvZW1iZWRkaW5nc2AsIGFuZCB0aGUgdW4tcHJlZml4ZWQgdmFyaWFudHMpXG4gKiAgIC0gYFBPU1QgL3YxL3Jlc3BvbnNlc2AgICAgICAgICAgICAgICBPcGVuQUkgUmVzcG9uc2VzIEFQSSwgZm9yd2FyZGVkIHRvXG4gKiAgICAgRGF0YWJyaWNrcycgbmF0aXZlIFJlc3BvbnNlcyAvIE9wZW4gUmVzcG9uc2VzIHN1cmZhY2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZVNlcnZlciwgdHlwZSBJbmNvbWluZ01lc3NhZ2UsIHR5cGUgU2VydmVyLCB0eXBlIFNlcnZlclJlc3BvbnNlIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHsgYXN5bmMgYXMgYXN5bmNVdGlsLCBlcnJvciwganNvbiwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGNsYXNzaWZ5LCBvcGVuYWlDaGF0LCBvcGVuYWlSZXNwb25zZXMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcInVuZGljaVwiO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NCYWNrZW5kIH0gZnJvbSBcIi4vYmFja2VuZC50c1wiO1xuaW1wb3J0IHsgREVGQVVMVF9CSU5EX0hPU1QsIERFRkFVTFRfUE9SVCwgREVGQVVMVF9SRVRSWSwgdHlwZSBSZXRyeUNvbmZpZyB9IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5cbmNvbnN0IHsgY2hhdFRvUmVzcG9uc2VzUmVxdWVzdCwgcmVzcG9uc2VUb0NoYXRDb21wbGV0aW9uLCBzYW5pdGl6ZU9wZW5SZXNwb25zZXNSZXF1ZXN0IH0gPVxuICBvcGVuYWlSZXNwb25zZXM7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtb2RlbC1wcm94eS9zZXJ2ZXJcIik7XG5cbi8qKlxuICogRGlzcGF0Y2hlciBmb3IgZXZlcnkgdXBzdHJlYW0gY2FsbCwgd2l0aCB1bmRpY2kncyBpbmFjdGl2aXR5IHRpbWVvdXRzXG4gKiBESVNBQkxFRCAoYDBgKS5cbiAqXG4gKiBBIHByb3hpZWQgdHVybiBpcyBvbmx5IGFzIGZhc3QgYXMgdGhlIG1vZGVsIGJlaGluZCBpdCwgYW5kIHVuZGljaSdzXG4gKiBkZWZhdWx0cyAoMzAwcyBgaGVhZGVyc1RpbWVvdXRgLCAzMDBzIGBib2R5VGltZW91dGApIGFyZSBib3RoIHdyb25nIGhlcmUuXG4gKiBgYm9keVRpbWVvdXRgIGlzIHRoZSBraWxsZXI6IGl0IG1lYXN1cmVzIHRoZSBnYXAgQkVUV0VFTiBjaHVua3MsIHNvIGEgbW9kZWxcbiAqIHRoYXQgdGhpbmtzIGZvciBhIHdoaWxlIG1pZC1zdHJlYW0gLSBleHRlbmRlZCByZWFzb25pbmcsIGEgbG9uZyB0b29sIHJvdW5kXG4gKiB0cmlwLCBhIHNsb3cgR2VuaWUvU1FMIHN0ZXAgLSB0cmlwcyBpdCBhbmQgdW5kaWNpIHRlYXJzIHRoZSBzb2NrZXQgZG93blxuICogd2l0aCBgVU5EX0VSUl9CT0RZX1RJTUVPVVRgLCB3aGljaCB0aGUgY2xpZW50IHNlZXMgYXMgYSB0cnVuY2F0ZWQgc3RyZWFtLlxuICpcbiAqIFRoZSBwcm94eSBoYXMgbm8gb3BpbmlvbiBvbiBob3cgbG9uZyBhIG1vZGVsIG1heSB0YWtlLCBzbyBpdCBpbXBvc2VzIG5vXG4gKiBkZWFkbGluZTogdGhlIHN0cmVhbSBlbmRzIHdoZW4gdGhlIHVwc3RyZWFtIGVuZHMgaXQsIG9yIHdoZW4gdGhlIGNsaWVudFxuICogaGFuZ3MgdXAgKHNlZSB7QGxpbmsgcmVxdWVzdEFib3J0U2lnbmFsfSkuIENhbGxlcnMgdGhhdCBETyB3YW50IGEgZGVhZGxpbmVcbiAqIHNob3VsZCBzZW5kIG9uZSwgdGhlIHNhbWUgYXMgdGhleSB3b3VsZCB0byBPcGVuQUkuXG4gKi9cbmNvbnN0IHVwc3RyZWFtRGlzcGF0Y2hlciA9IG5ldyBBZ2VudCh7IGhlYWRlcnNUaW1lb3V0OiAwLCBib2R5VGltZW91dDogMCB9KTtcblxuLyoqIFBPU1Qgcm91dGVzIGZvcndhcmRlZCB0byBhIHNlcnZpbmcgZW5kcG9pbnQgKGNoYXQgb3IgUmVzcG9uc2VzLW9ubHkpLiAqL1xuY29uc3QgUFJPWFlfUEFUSFMgPSBuZXcgU2V0KFtcbiAgXCIvdjEvY2hhdC9jb21wbGV0aW9uc1wiLFxuICBcIi9jaGF0L2NvbXBsZXRpb25zXCIsXG4gIFwiL3YxL2NvbXBsZXRpb25zXCIsXG4gIFwiL2NvbXBsZXRpb25zXCIsXG4gIFwiL3YxL2VtYmVkZGluZ3NcIixcbiAgXCIvZW1iZWRkaW5nc1wiLFxuXSk7XG5cbi8qKiBHRVQgcm91dGVzIHRoYXQgbGlzdCB0aGUgcmVzb2x2YWJsZSBtb2RlbCBjYXRhbG9ndWUuICovXG5jb25zdCBNT0RFTFNfUEFUSFMgPSBuZXcgU2V0KFtcIi92MS9tb2RlbHNcIiwgXCIvbW9kZWxzXCJdKTtcblxuLyoqIFBPU1Qgcm91dGVzIHRoYXQgY2FycnkgYW4gT3BlbkFJIFJlc3BvbnNlcyBBUEkgYm9keSAobmF0aXZlIHBhc3N0aHJvdWdoKS4gKi9cbmNvbnN0IFJFU1BPTlNFU19QQVRIUyA9IG5ldyBTZXQoW1wiL3YxL3Jlc3BvbnNlc1wiLCBcIi9yZXNwb25zZXNcIl0pO1xuXG4vKipcbiAqIEV4dHJhIHJlcXVlc3QgZmllbGRzIHRvIHN0cmlwIGJlZm9yZSBmb3J3YXJkaW5nLCBvbiB0b3Agb2ZcbiAqIGBvcGVuYWlDaGF0LlVOU1VQUE9SVEVEX0NIQVRfRklFTERTYC4gQ29tbWEtc2VwYXJhdGVkIGluIGBQUk9YWV9EUk9QX0ZJRUxEU2AuXG4gKlxuICogQW4gZXNjYXBlIGhhdGNoOiB3aGVuIGEgd29ya3NwYWNlIG9yIGEgbmV3IGNsaWVudCB2ZXJzaW9uIHRyaXBzIGEgZmllbGRcbiAqIERhdGFicmlja3MgcmVqZWN0cywgYW4gb3BlcmF0b3IgY2FuIHVuYmxvY2sgdGhlbXNlbHZlcyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mXG4gKiB3YWl0aW5nIG9uIGEgcmVsZWFzZSBvZiB0aGlzIHBhY2thZ2UuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhRHJvcEZpZWxkcygpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAocHJvY2Vzcy5lbnYuUFJPWFlfRFJPUF9GSUVMRFMgPz8gXCJcIilcbiAgICAuc3BsaXQoXCIsXCIpXG4gICAgLm1hcCgoZmllbGQpID0+IGZpZWxkLnRyaW0oKSlcbiAgICAuZmlsdGVyKChmaWVsZCkgPT4gZmllbGQubGVuZ3RoID4gMCk7XG59XG5cbi8qKiBPcHRpb25zIHNoYXJlZCBieSB7QGxpbmsgY3JlYXRlUHJveHlTZXJ2ZXJ9IGFuZCB7QGxpbmsgc3RhcnRQcm94eVNlcnZlcn0uICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5U2VydmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIHNldCwgbG9jYWwgY2xpZW50cyBtdXN0IHByZXNlbnQgdGhpcyB2YWx1ZSBhcyBhIGJlYXJlciB0b2tlblxuICAgKiAoYEF1dGhvcml6YXRpb246IEJlYXJlciA8a2V5PmApLiBVbnNldCBsZWF2ZXMgdGhlIHByb3h5IG9wZW4sIHdoaWNoIGlzIGZpbmVcbiAgICogZm9yIGEgbG9vcGJhY2sgYmluZCBidXQgc2hvdWxkIGJlIHBhaXJlZCB3aXRoIGEga2V5IG9uIGEgd2lkZXIgb25lLlxuICAgKi9cbiAgYXBpS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogUG9saWN5IGZvciBhYnNvcmJpbmcgdXBzdHJlYW0gNDI5cy4gT21pdHRlZCBkZWZhdWx0cyB0byB7QGxpbmtcbiAgICogREVGQVVMVF9SRVRSWX0gKHJldHJ5IG9uKS4gU2VlIHtAbGluayBSZXRyeUNvbmZpZ30uXG4gICAqL1xuICByZXRyeT86IFJldHJ5Q29uZmlnO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHN0YXJ0UHJveHlTZXJ2ZXJ9LCBhZGRpbmcgdGhlIGxpc3RlbiBhZGRyZXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFByb3h5T3B0aW9ucyBleHRlbmRzIFByb3h5U2VydmVyT3B0aW9ucyB7XG4gIGhvc3Q/OiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG59XG5cbi8qKiBCdWlsZCAoYnV0IGRvIG5vdCBzdGFydCkgdGhlIHByb3h5IEhUVFAgc2VydmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3h5U2VydmVyKFxuICBiYWNrZW5kOiBEYXRhYnJpY2tzQmFja2VuZCxcbiAgb3B0aW9uczogUHJveHlTZXJ2ZXJPcHRpb25zID0ge30sXG4pOiBTZXJ2ZXIge1xuICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKHJlcSwgcmVzKSA9PiB7XG4gICAgdm9pZCBoYW5kbGVSZXF1ZXN0KGJhY2tlbmQsIG9wdGlvbnMsIHJlcSwgcmVzKTtcbiAgfSk7XG4gIC8vIE1hdGNoIHRoZSB1cHN0cmVhbSBwb2xpY3kgb24gdGhlIElOQk9VTkQgc2lkZTogbmV2ZXIgY3V0IGEgY2xpZW50IG9mZlxuICAvLyBtaWQtdHVybi4gTm9kZSdzIGRlZmF1bHRzICgzMDBzIGByZXF1ZXN0VGltZW91dGAsIDYwcyBgaGVhZGVyc1RpbWVvdXRgKVxuICAvLyBhcmUgc2l6ZWQgZm9yIG9yZGluYXJ5IHdlYiB0cmFmZmljLCBub3QgZm9yIGhvbGRpbmcgYSBzdHJlYW1lZCBtb2RlbFxuICAvLyByZXNwb25zZSBvcGVuLCBhbmQgYSBjbGllbnQgdGhhdCBoaXRzIG9uZSBnZXRzIGEgZGVhZCBzb2NrZXQgcmF0aGVyIHRoYW5cbiAgLy8gYW4gZXJyb3IgaXQgY2FuIGFjdCBvbi4gYDBgIGRpc2FibGVzIGVhY2g7IHRoZSB0dXJuIG5vdyBlbmRzIHdoZW4gdGhlXG4gIC8vIG1vZGVsIGlzIGRvbmUgb3IgdGhlIGNsaWVudCBkaXNjb25uZWN0cy5cbiAgc2VydmVyLnJlcXVlc3RUaW1lb3V0ID0gMDtcbiAgc2VydmVyLmhlYWRlcnNUaW1lb3V0ID0gMDtcbiAgc2VydmVyLnRpbWVvdXQgPSAwO1xuICByZXR1cm4gc2VydmVyO1xufVxuXG4vKipcbiAqIFNpZ25hbCB0aGF0IGFib3J0cyB3aGVuIHRoZSBjbGllbnQgaGFuZ3MgdXAuXG4gKlxuICogUmVtb3ZpbmcgdGhlIHRpbWVvdXRzIG1lYW5zIG5vdGhpbmcgZWxzZSB3aWxsIGV2ZXIgZW5kIGEgZm9yZ290dGVuIHJlcXVlc3QsXG4gKiBzbyB0aGUgY2xpZW50J3Mgb3duIGRpc2Nvbm5lY3QgYmVjb21lcyB0aGUgb25seSBiYWNrc3RvcCBhZ2FpbnN0IGFuIHVwc3RyZWFtXG4gKiBjYWxsIHJ1bm5pbmcgb24gd2l0aCBubyBvbmUgdG8gcmVjZWl2ZSBpdC4gUGFzc2luZyB0aGlzIHRvIGBmZXRjaGAgaXMgd2hhdFxuICogbWFrZXMgYSBjYW5jZWxsZWQgdHVybiAoQ3RybC1DLCBhIGNsb3NlZCB0YWIsIGEga2lsbGVkIENMSSkgcmVsZWFzZSB0aGVcbiAqIERhdGFicmlja3Mtc2lkZSBzdHJlYW0gaW5zdGVhZCBvZiBsZWFraW5nIGl0IGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBLZXllZCBvZmYgdGhlIFJFU1BPTlNFLCBub3QgdGhlIHJlcXVlc3Q6IGBJbmNvbWluZ01lc3NhZ2VgIGVtaXRzIGBjbG9zZWAgYXNcbiAqIHNvb24gYXMgaXRzIGJvZHkgaGFzIGJlZW4gZnVsbHkgY29uc3VtZWQsIHdoaWNoIG9uIGV2ZXJ5IFBPU1QgaGVyZSBoYXBwZW5zXG4gKiBiZWZvcmUgdGhlIHVwc3RyZWFtIGNhbGwgaXMgZXZlbiBtYWRlIC0gd2F0Y2hpbmcgdGhhdCB3b3VsZCBhYm9ydCBlYWNoIHR1cm5cbiAqIGluc3RhbnRseS4gYFNlcnZlclJlc3BvbnNlYCBlbWl0cyBgY2xvc2VgIHdoZW4gdGhlIHJlc3BvbnNlIGZpbmlzaGVzIG9yIHRoZVxuICogY29ubmVjdGlvbiBkcm9wcywgc28gdGhlIGB3cml0YWJsZUZpbmlzaGVkYCBjaGVjayBzZXBhcmF0ZXMgXCJjbGllbnQgbGVmdFwiXG4gKiBmcm9tIFwid2UgcmVwbGllZFwiLlxuICovXG5mdW5jdGlvbiBjbGllbnRBYm9ydFNpZ25hbChyZXM6IFNlcnZlclJlc3BvbnNlKTogQWJvcnRTaWduYWwge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICByZXMub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICBpZiAoIXJlcy53cml0YWJsZUZpbmlzaGVkKSBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0pO1xuICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG59XG5cbi8qKlxuICogUE9TVCBhIEpTT04gYm9keSB0byBhIHNlcnZpbmcgZW5kcG9pbnQgb24gdGhlIG5vLXRpbWVvdXRcbiAqIHtAbGluayB1cHN0cmVhbURpc3BhdGNoZXJ9LCBjYW5jZWxsZWQgdmlhIGBzaWduYWxgLlxuICpcbiAqIEV2ZXJ5IHVwc3RyZWFtIGNhbGwgZ29lcyB0aHJvdWdoIGhlcmUgc28gdGhlIHRpbWVvdXQgYW5kIGNhbmNlbGxhdGlvbiBwb2xpY3lcbiAqIGlzIHN0YXRlZCBvbmNlLiBgZGlzcGF0Y2hlcmAgaXMgYW4gdW5kaWNpIGV4dGVuc2lvbiB0aGF0IHRoZSBET01cbiAqIGBSZXF1ZXN0SW5pdGAgTm9kZSBjb21waWxlcyBhZ2FpbnN0IGRvZXMgbm90IGRlY2xhcmUsIGhlbmNlIHRoZSBsb2NhbFxuICogaW50ZXJzZWN0aW9uIHR5cGUgcmF0aGVyIHRoYW4gYSBjYXN0IGF0IGVhY2ggY2FsbCBzaXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiB1cHN0cmVhbUZldGNoKFxuICB1cmw6IHN0cmluZyxcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYm9keTogc3RyaW5nLFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCA9IHsgbWV0aG9kOiBcIlBPU1RcIiwgaGVhZGVycywgYm9keSwgc2lnbmFsIH07XG4gIC8vIGBkaXNwYXRjaGVyYCBpcyBhbiB1bmRpY2kgZXh0ZW5zaW9uIHRoZSBET00gYFJlcXVlc3RJbml0YCBkb2Vzbid0IGRlY2xhcmUsXG4gIC8vIGFuZCBpdCBjYW4ndCBzaW1wbHkgYmUgdHlwZWQgb246IGBAdHlwZXMvbm9kZWAgcGlucyBpdHMgb3duIGB1bmRpY2ktdHlwZXNgXG4gIC8vIGNvcHksIHNvIHRoZSBgQWdlbnRgIGZyb20gb3VyIGB1bmRpY2lgIGRlcGVuZGVuY3kgaXMgYSBzdHJ1Y3R1cmFsbHlcbiAgLy8gaWRlbnRpY2FsIGJ1dCBub21pbmFsbHkgZGlmZmVyZW50IHR5cGUgdGhhbiB0aGUgb25lIHRoZSBnbG9iYWwgYGZldGNoYFxuICAvLyBzaWduYXR1cmUgZXhwZWN0cy4gQXR0YWNoaW5nIGl0IHN0cnVjdHVyYWxseSBzaWRlc3RlcHMgYSB2ZXJzaW9uIHNrZXcgdGhhdFxuICAvLyBubyBjYXN0IGV4cHJlc3NlcyBjbGVhbmx5LCBhbmQgYGZldGNoYCByZWFkcyBpdCBhdCBydW50aW1lIGFsbCB0aGUgc2FtZS5cbiAgUmVmbGVjdC5zZXQoaW5pdCwgXCJkaXNwYXRjaGVyXCIsIHVwc3RyZWFtRGlzcGF0Y2hlcik7XG4gIHJldHVybiBmZXRjaCh1cmwsIGluaXQpO1xufVxuXG4vKipcbiAqIERlbGF5IChtcykgYSBgNDI5YCByZXNwb25zZSBhc2tzIHVzIHRvIHdhaXQsIGZyb20gaXRzIGBSZXRyeS1BZnRlcmAgaGVhZGVyLFxuICogb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQvdW5wYXJzZWFibGUuIEhhbmRsZXMgYm90aCBoZWFkZXIgZm9ybXM6IGFuIGludGVnZXJcbiAqIGNvdW50IG9mIHNlY29uZHMsIGFuZCBhbiBIVFRQIGRhdGUgdG8gd2FpdCB1bnRpbCAoY2xhbXBlZCB0byBgPj0gMGApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXRyeUFmdGVyTXMoaGVhZGVyOiBzdHJpbmcgfCBudWxsLCBub3dNczogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFoZWFkZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRyaW1tZWQgPSBoZWFkZXIudHJpbSgpO1xuICBpZiAoL15cXGQrJC8udGVzdCh0cmltbWVkKSkgcmV0dXJuIE51bWJlcih0cmltbWVkKSAqIDEwMDA7XG4gIGNvbnN0IHdoZW4gPSBEYXRlLnBhcnNlKHRyaW1tZWQpO1xuICBpZiAoTnVtYmVyLmlzTmFOKHdoZW4pKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgd2hlbiAtIG5vd01zKTtcbn1cblxuLyoqXG4gKiBCYWNrb2ZmIChtcykgYmVmb3JlIHJldHJ5IGBhdHRlbXB0YCAoMC1iYXNlZCk6IGV4cG9uZW50aWFsIGZyb21cbiAqIGBiYXNlRGVsYXlNc2AsIGNhcHBlZCBhdCBgbWF4RGVsYXlNc2AsIHdpdGggdXAgdG8gKzUwJSBqaXR0ZXIgc28gY29uY3VycmVudFxuICogcmV0cmllcyBmcm9tIG9uZSBhZ2VudCBkb24ndCByZXN5bmNocm9uaXplIGludG8gdGhlIG5leHQgYnVyc3QuIEEgc2VydmVyLXNlbnRcbiAqIGBSZXRyeS1BZnRlcmAgd2lucyBvdXRyaWdodCAoc3RpbGwgY2FwcGVkKSwgc2luY2UgdGhlIHNlcnZlciBrbm93cyBiZXR0ZXJcbiAqIHRoYW4gb3VyIHNjaGVkdWxlIHdoZW4gaXQgd2lsbCBhY2NlcHQgdHJhZmZpYyBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhY2tvZmZEZWxheU1zKFxuICBhdHRlbXB0OiBudW1iZXIsXG4gIHJldHJ5OiBSZXRyeUNvbmZpZyxcbiAgcmV0cnlBZnRlck1zOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGppdHRlcjogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgaWYgKHJldHJ5QWZ0ZXJNcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gTWF0aC5taW4ocmV0cnlBZnRlck1zLCByZXRyeS5tYXhEZWxheU1zKTtcbiAgY29uc3QgZXhwb25lbnRpYWwgPSByZXRyeS5iYXNlRGVsYXlNcyAqIDIgKiogYXR0ZW1wdDtcbiAgY29uc3QgY2FwcGVkID0gTWF0aC5taW4oZXhwb25lbnRpYWwsIHJldHJ5Lm1heERlbGF5TXMpO1xuICByZXR1cm4gTWF0aC5yb3VuZChjYXBwZWQgKiAoMSArIGppdHRlciAqIDAuNSkpO1xufVxuXG4vKipcbiAqIHtAbGluayB1cHN0cmVhbUZldGNofSB3aXRoIGluLXByb3h5IGA0MjlgIGhhbmRsaW5nLiBXaGVuIGByZXRyeS5lbmFibGVkYCwgYVxuICogNDI5IGlzIHJldHJpZWQgdXAgdG8gYHJldHJ5Lm1heFJldHJpZXNgIHRpbWVzIHdpdGgge0BsaW5rIGJhY2tvZmZEZWxheU1zfVxuICogYmFja29mZiBpbnN0ZWFkIG9mIGJlaW5nIHN1cmZhY2VkOyB0aGUgdGhyb3R0bGVkIHJlc3BvbnNlIGJvZHkgaXMgZHJhaW5lZFxuICogZWFjaCB0aW1lIHNvIHRoZSBjb25uZWN0aW9uIGlzIHJlbGVhc2VkLiBUaGUgcmV0cnkgaGFwcGVucyBCRUZPUkUgdGhlIGNhbGxlclxuICogd3JpdGVzIGFueSBzdGF0dXMgbGluZSwgc28gaXQgaXMgdHJhbnNwYXJlbnQgdG8gYm90aCBzdHJlYW1pbmcgYW5kXG4gKiBub24tc3RyZWFtaW5nIHBhdGhzIC0gdGhlIGNsaWVudCBvbmx5IGV2ZXIgc2VlcyB0aGUgZmluYWwgcmVzcG9uc2UuXG4gKlxuICogQmFpbHMgZWFybHkgKHJldHVybmluZyB0aGUgNDI5KSB3aGVuIHJldHJpZXMgYXJlIGV4aGF1c3RlZCwgd2hlbiB0aGUgY2xpZW50XG4gKiBoYXMgaHVuZyB1cCAoYHNpZ25hbC5hYm9ydGVkYCksIG9yIHdoZW4gdGhlIHJlc3BvbnNlIGNhcnJpZXMgbm8gYFJldHJ5LUFmdGVyYFxuICogYW5kIHdlIHdvdWxkIG90aGVyd2lzZSBsb29wIGJsaW5kIHBhc3QgdGhlIGNhcC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBzdHJlYW1GZXRjaFJldHJ5aW5nKFxuICBiYWNrZW5kOiBEYXRhYnJpY2tzQmFja2VuZCxcbiAgdXJsOiBzdHJpbmcsXG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJvZHk6IHVua25vd24sXG4gIHJlczogU2VydmVyUmVzcG9uc2UsXG4gIHJldHJ5OiBSZXRyeUNvbmZpZyxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3Qgc2lnbmFsID0gY2xpZW50QWJvcnRTaWduYWwocmVzKTtcbiAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB1cHN0cmVhbUZldGNoKHVybCwgaGVhZGVycywgcGF5bG9hZCwgc2lnbmFsKTtcbiAgaWYgKCFyZXRyeS5lbmFibGVkKSByZXR1cm4gcmVzcG9uc2U7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5ICYmIGF0dGVtcHQgPCByZXRyeS5tYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCByZXRyeUFmdGVyTXMgPSBwYXJzZVJldHJ5QWZ0ZXJNcyhyZXNwb25zZS5oZWFkZXJzLmdldChcInJldHJ5LWFmdGVyXCIpLCBEYXRlLm5vdygpKTtcbiAgICBjb25zdCBkZWxheU1zID0gYmFja29mZkRlbGF5TXMoYXR0ZW1wdCwgcmV0cnksIHJldHJ5QWZ0ZXJNcywgaml0dGVyRnJhY3Rpb24oKSk7XG4gICAgLy8gUmVsZWFzZSB0aGUgdGhyb3R0bGVkIHJlc3BvbnNlJ3Mgc29ja2V0IGJlZm9yZSB3YWl0aW5nOyBpdHMgYm9keSBpcyBhblxuICAgIC8vIGVycm9yIHBheWxvYWQgd2UgYXJlIGNob29zaW5nIG5vdCB0byByZWxheS5cbiAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSA0Mjk7IGJhY2tpbmcgb2ZmXCIsIHtcbiAgICAgIGF0dGVtcHQ6IGF0dGVtcHQgKyAxLFxuICAgICAgbWF4UmV0cmllczogcmV0cnkubWF4UmV0cmllcyxcbiAgICAgIGRlbGF5TXMsXG4gICAgICAuLi4ocmV0cnlBZnRlck1zICE9PSB1bmRlZmluZWQgPyB7IHJldHJ5QWZ0ZXJNcyB9IDoge30pLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhc3luY1V0aWwuc2xlZXAoZGVsYXlNcywgc2lnbmFsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENsaWVudCBodW5nIHVwIG1pZC13YWl0OiByZXR1cm4gdGhlIGxhc3QgNDI5IHJhdGhlciB0aGFuIGlzc3VlIGFcbiAgICAgIC8vIHJlcXVlc3Qgbm8gb25lIGlzIGxpc3RlbmluZyBmb3IuXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIC8vIEZyZXNoIGF1dGggaGVhZGVyIHBlciBhdHRlbXB0IHNvIGEgbG9uZyBiYWNrb2ZmIGNhbid0IG91dGxpdmUgdGhlIHRva2VuLlxuICAgIGNvbnN0IHJldHJ5SGVhZGVycyA9IHsgLi4uKGF3YWl0IGJhY2tlbmQuYXV0aEhlYWRlcnMoKSksIC4uLmhlYWRlcnMgfTtcbiAgICByZXNwb25zZSA9IGF3YWl0IHVwc3RyZWFtRmV0Y2godXJsLCByZXRyeUhlYWRlcnMsIHBheWxvYWQsIHNpZ25hbCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG4vKipcbiAqIEppdHRlciBmcmFjdGlvbiBpbiBgWzAsIDEpYC4gU3BsaXQgb3V0IHNvIHRlc3RzIGNhbiBzdHViIGRldGVybWluaXNtO1xuICogYE1hdGgucmFuZG9tYCBpcyBmaW5lIGZvciBzcHJlYWRpbmcgcmV0cnkgdGltaW5nLlxuICovXG5mdW5jdGlvbiBqaXR0ZXJGcmFjdGlvbigpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbmQgc3RhcnQgdGhlIHByb3h5LCByZXNvbHZpbmcgb25jZSBpdCBpcyBhY2NlcHRpbmcgY29ubmVjdGlvbnMuXG4gKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgYW5kIGl0cyBiYXNlIFVSTCAod2l0aCB0aGUgYWN0dWFsbHktYm91bmQgcG9ydCwgc28gYVxuICogYHBvcnQ6IDBgIHJlcXVlc3Qgc3VyZmFjZXMgdGhlIE9TLWFzc2lnbmVkIHBvcnQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRQcm94eVNlcnZlcihcbiAgYmFja2VuZDogRGF0YWJyaWNrc0JhY2tlbmQsXG4gIG9wdGlvbnM6IFN0YXJ0UHJveHlPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPHsgc2VydmVyOiBTZXJ2ZXI7IHVybDogc3RyaW5nIH0+IHtcbiAgY29uc3QgaG9zdCA9IG9wdGlvbnMuaG9zdCA/PyBERUZBVUxUX0JJTkRfSE9TVDtcbiAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCA/PyBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVByb3h5U2VydmVyKGJhY2tlbmQsIG9wdGlvbnMpO1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25FcnJvciA9IChlcnI6IEVycm9yKSA9PiByZWplY3QoZXJyKTtcbiAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCwgKCkgPT4ge1xuICAgICAgc2VydmVyLm9mZihcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbiAgY29uc3QgYWRkcmVzcyA9IHNlcnZlci5hZGRyZXNzKCk7XG4gIGNvbnN0IGJvdW5kUG9ydCA9IHR5cGVvZiBhZGRyZXNzID09PSBcIm9iamVjdFwiICYmIGFkZHJlc3MgPyBhZGRyZXNzLnBvcnQgOiBwb3J0O1xuICByZXR1cm4geyBzZXJ2ZXIsIHVybDogYGh0dHA6Ly8ke2hvc3R9OiR7Ym91bmRQb3J0fWAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVxdWVzdChcbiAgYmFja2VuZDogRGF0YWJyaWNrc0JhY2tlbmQsXG4gIG9wdGlvbnM6IFByb3h5U2VydmVyT3B0aW9ucyxcbiAgcmVxOiBJbmNvbWluZ01lc3NhZ2UsXG4gIHJlczogU2VydmVyUmVzcG9uc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmF3VXJsID0gcmVxLnVybCA/PyBcIi9cIjtcbiAgY29uc3QgW3BhdGgsIHF1ZXJ5ID0gXCJcIl0gPSByYXdVcmwuc3BsaXQoXCI/XCIpO1xuICBjb25zdCByb3V0ZVBhdGggPSBwYXRoID8/IFwiL1wiO1xuICB0cnkge1xuICAgIGlmIChyZXEubWV0aG9kID09PSBcIkdFVFwiICYmIChyb3V0ZVBhdGggPT09IFwiL2hlYWx0aFwiIHx8IHJvdXRlUGF0aCA9PT0gXCIvXCIpKSB7XG4gICAgICBzZW5kSnNvbihyZXMsIDIwMCwgeyBzdGF0dXM6IFwib2tcIiB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYXBpS2V5ICYmICFpc0F1dGhvcml6ZWQocmVxLCBvcHRpb25zLmFwaUtleSkpIHtcbiAgICAgIHNlbmRKc29uKHJlcywgNDAxLCBlcnJvckJvZHkoXCJpbnZhbGlkIGFwaSBrZXlcIiwgXCJpbnZhbGlkX3JlcXVlc3RfZXJyb3JcIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIiAmJiBNT0RFTFNfUEFUSFMuaGFzKHJvdXRlUGF0aCkpIHtcbiAgICAgIC8vIENvZGV4IGFsd2F5cyBzZW5kcyBgP2NsaWVudF92ZXJzaW9uPeKApmA7IHVzZSB0aGF0IHRvIHBpY2sgaXRzIGxpc3Qgc2hhcGUuXG4gICAgICBjb25zdCB3YW50c0NvZGV4U2hhcGUgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5KS5oYXMoXCJjbGllbnRfdmVyc2lvblwiKTtcbiAgICAgIGF3YWl0IGhhbmRsZU1vZGVscyhiYWNrZW5kLCByZXMsIHdhbnRzQ29kZXhTaGFwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJldHJ5ID0gb3B0aW9ucy5yZXRyeSA/PyBERUZBVUxUX1JFVFJZO1xuICAgIGlmIChyZXEubWV0aG9kID09PSBcIlBPU1RcIiAmJiBSRVNQT05TRVNfUEFUSFMuaGFzKHJvdXRlUGF0aCkpIHtcbiAgICAgIGF3YWl0IGhhbmRsZVJlc3BvbnNlcyhiYWNrZW5kLCByZXEsIHJlcywgcmV0cnkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgUFJPWFlfUEFUSFMuaGFzKHJvdXRlUGF0aCkpIHtcbiAgICAgIGF3YWl0IGhhbmRsZVByb3h5KGJhY2tlbmQsIHJlcSwgcmVzLCByZXRyeSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlbmRKc29uKFxuICAgICAgcmVzLFxuICAgICAgNDA0LFxuICAgICAgZXJyb3JCb2R5KGB1bnN1cHBvcnRlZCByb3V0ZSAke3JlcS5tZXRob2QgPz8gXCI/XCJ9ICR7cm91dGVQYXRofWAsIFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCIpLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKTtcbiAgICBsb2dnZXIuZXJyb3IoXCJyZXF1ZXN0IGZhaWxlZFwiLCB7IHBhdGg6IHJvdXRlUGF0aCwgZXJyb3I6IG1lc3NhZ2UgfSk7XG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHNlbmRKc29uKHJlcywgNTAwLCBlcnJvckJvZHkobWVzc2FnZSwgXCJwcm94eV9lcnJvclwiKSk7XG4gICAgZWxzZSByZXMuZW5kKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBgR0VUIC92MS9tb2RlbHNgOiBzdXJmYWNlIHRoZSBzZXJ2aW5nIGNhdGFsb2d1ZS4gVHdvIHNoYXBlczpcbiAqXG4gKiAgIC0gT3BlbkFJIChkZWZhdWx0KTogYHtvYmplY3Q6XCJsaXN0XCIsIGRhdGE6W3tpZCxvYmplY3QsY3JlYXRlZCxvd25lZF9ieX1dfWAsXG4gKiAgICAgd2hhdCB0aGUgYG9wZW5haWAgU0RLIGFuZCBtb3N0IHRvb2xzIGV4cGVjdC5cbiAqICAgLSBDb2RleCAoYGNvZGV4U2hhcGVgKTogYHttb2RlbHM6W3tzbHVnLCBkaXNwbGF5X25hbWUsIOKApn1dfWAsIHRoZSBDaGF0R1BUXG4gKiAgICAgYmFja2VuZCBzaGFwZSB0aGUgQ29kZXggQ0xJIGRlY29kZXMuIEEgcmVzcG9uc2UgbWlzc2luZyB0aGUgdG9wLWxldmVsXG4gKiAgICAgYG1vZGVsc2AgZmllbGQgbWFrZXMgQ29kZXggbG9nIFwiZmFpbGVkIHRvIGRlY29kZSBtb2RlbHMgcmVzcG9uc2VcIiwgc28gaXRcbiAqICAgICBnZXRzIGl0cyBvd24gZW52ZWxvcGUuIE9ubHkgY2hhdCBlbmRwb2ludHMgYXJlIGFkdmVydGlzZWQgdG8gQ29kZXguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZU1vZGVscyhcbiAgYmFja2VuZDogRGF0YWJyaWNrc0JhY2tlbmQsXG4gIHJlczogU2VydmVyUmVzcG9uc2UsXG4gIGNvZGV4U2hhcGU6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgYmFja2VuZC5tb2RlbHModHJ1ZSk7XG4gIGlmIChjb2RleFNoYXBlKSB7XG4gICAgY29uc3QgbW9kZWxzID0gZW5kcG9pbnRzXG4gICAgICAuZmlsdGVyKChlbmRwb2ludCkgPT4gY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLmNoYXQpXG4gICAgICAubWFwKChlbmRwb2ludCkgPT4gKHtcbiAgICAgICAgc2x1ZzogZW5kcG9pbnQubmFtZSxcbiAgICAgICAgZGlzcGxheV9uYW1lOiBlbmRwb2ludC5kaXNwbGF5TmFtZSA/PyBlbmRwb2ludC5uYW1lLFxuICAgICAgICAuLi4oZW5kcG9pbnQuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBlbmRwb2ludC5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICAvLyBGaWVsZHMgQ29kZXgncyBzdHJpY3QgZGVjb2RlciByZXF1aXJlcyBvbiBldmVyeSBtb2RlbCBlbnRyeS5cbiAgICAgICAgZGVmYXVsdF9yZWFzb25pbmdfbGV2ZWw6IFwibWVkaXVtXCIsXG4gICAgICAgIHN1cHBvcnRlZF9yZWFzb25pbmdfbGV2ZWxzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgc2hlbGxfdHlwZTogXCJzaGVsbF9jb21tYW5kXCIsXG4gICAgICAgIHZpc2liaWxpdHk6IFwibGlzdFwiLFxuICAgICAgICBzdXBwb3J0ZWRfaW5fYXBpOiB0cnVlLFxuICAgICAgfSkpO1xuICAgIHNlbmRKc29uKHJlcywgMjAwLCB7IG1vZGVscyB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZGF0YSA9IGVuZHBvaW50cy5tYXAoKGVuZHBvaW50KSA9PiAoe1xuICAgIGlkOiBlbmRwb2ludC5uYW1lLFxuICAgIG9iamVjdDogXCJtb2RlbFwiLFxuICAgIGNyZWF0ZWQ6IDAsXG4gICAgb3duZWRfYnk6IFwiZGF0YWJyaWNrc1wiLFxuICB9KSk7XG4gIHNlbmRKc29uKHJlcywgMjAwLCB7IG9iamVjdDogXCJsaXN0XCIsIGRhdGEgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcmVxdWVzdCdzIG1vZGVsIGFuZCBmb3J3YXJkIGEgQ2hhdCBDb21wbGV0aW9ucyBib2R5LiBSZXNwb25zZXMtXG4gKiBvbmx5IG1vZGVscyAoQ29kZXgpIGFyZSB0cmFuc2xhdGVkIHRvIGEgUmVzcG9uc2VzIHJlcXVlc3QgYW5kIHBvc3RlZCB0b1xuICogYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgOyBldmVyeXRoaW5nIGVsc2UgZ29lcyB0byBgL2ludm9jYXRpb25zYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUHJveHkoXG4gIGJhY2tlbmQ6IERhdGFicmlja3NCYWNrZW5kLFxuICByZXE6IEluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBTZXJ2ZXJSZXNwb25zZSxcbiAgcmV0cnk6IFJldHJ5Q29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJvZHkgPSBhd2FpdCByZWFkSnNvbkJvZHkocmVxKTtcbiAgY29uc3QgcmVxdWVzdGVkID0gdHlwZW9mIGJvZHkubW9kZWwgPT09IFwic3RyaW5nXCIgPyBib2R5Lm1vZGVsIDogdW5kZWZpbmVkO1xuICBpZiAoIXJlcXVlc3RlZCkge1xuICAgIHNlbmRKc29uKHJlcywgNDAwLCBlcnJvckJvZHkoXCJtaXNzaW5nICdtb2RlbCcgaW4gcmVxdWVzdCBib2R5XCIsIFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGJhY2tlbmQucmVzb2x2ZShyZXF1ZXN0ZWQpO1xuICBib2R5Lm1vZGVsID0gcmVzb2x2ZWQubW9kZWxJZDtcblxuICBpZiAoYmFja2VuZC5pc1Jlc3BvbnNlc09ubHkocmVzb2x2ZWQubW9kZWxJZCkpIHtcbiAgICBhd2FpdCBwcm94eUNoYXRWaWFSZXNwb25zZXMoXG4gICAgICBiYWNrZW5kLFxuICAgICAgYm9keSxcbiAgICAgIHJlcXVlc3RlZCxcbiAgICAgIHJlc29sdmVkLm1vZGVsSWQsXG4gICAgICByZXNvbHZlZC5tYXRjaGVkLFxuICAgICAgcmVzLFxuICAgICAgcmV0cnksXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGlzIHJvdXRlIGZvcndhcmRzIHRoZSBjbGllbnQncyBib2R5IGFzLWlzLCBzbyBhbnl0aGluZyBEYXRhYnJpY2tzIHJlZnVzZXNcbiAgLy8gdG8gcGFyc2UgZmFpbHMgdGhlIHR1cm4uIERyb3AgdGhlIGtub3duIG9mZmVuZGVycyByYXRoZXIgdGhhbiByZWxheWluZyBhXG4gIC8vIDQwMCB0aGUgY2xpZW50IGNhbiBkbyBub3RoaW5nIGFib3V0LlxuICBjb25zdCBkcm9wcGVkID0gb3BlbmFpQ2hhdC5zdHJpcFVuc3VwcG9ydGVkQ2hhdEZpZWxkcyhib2R5LCBleHRyYURyb3BGaWVsZHMoKSk7XG5cbiAgY29uc3Qgd2FudHNTdHJlYW0gPSBib2R5LnN0cmVhbSA9PT0gdHJ1ZTtcbiAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGJhY2tlbmQuYXV0aEhlYWRlcnMoKTtcbiAgaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICBoZWFkZXJzLmFjY2VwdCA9IHdhbnRzU3RyZWFtID8gXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiIDogXCJhcHBsaWNhdGlvbi9qc29uXCI7XG5cbiAgbG9nZ2VyLmluZm8oXCJwcm94eVwiLCB7XG4gICAgcmVxdWVzdGVkLFxuICAgIHJlc29sdmVkOiByZXNvbHZlZC5tb2RlbElkLFxuICAgIG1hdGNoZWQ6IHJlc29sdmVkLm1hdGNoZWQsXG4gICAgdXBzdHJlYW06IFwiaW52b2NhdGlvbnNcIixcbiAgICBzdHJlYW06IHdhbnRzU3RyZWFtLFxuICAgIC4uLihkcm9wcGVkLmxlbmd0aCA+IDAgPyB7IGRyb3BwZWQgfSA6IHt9KSxcbiAgfSk7XG5cbiAgY29uc3QgdXBzdHJlYW0gPSBhd2FpdCB1cHN0cmVhbUZldGNoUmV0cnlpbmcoXG4gICAgYmFja2VuZCxcbiAgICBiYWNrZW5kLmludm9jYXRpb25zVXJsKHJlc29sdmVkLm1vZGVsSWQpLFxuICAgIGhlYWRlcnMsXG4gICAgYm9keSxcbiAgICByZXMsXG4gICAgcmV0cnksXG4gICk7XG5cbiAgcmVzLndyaXRlSGVhZCh1cHN0cmVhbS5zdGF0dXMsIHtcbiAgICBcImNvbnRlbnQtdHlwZVwiOiB1cHN0cmVhbS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICBcIngtcmVzb2x2ZWQtbW9kZWxcIjogcmVzb2x2ZWQubW9kZWxJZCxcbiAgfSk7XG4gIGF3YWl0IHN0cmVhbUJvZHkodXBzdHJlYW0sIHJlcyk7XG59XG5cbi8qKlxuICogQ2hhdCBDb21wbGV0aW9ucyBjbGllbnQg4oaSIFJlc3BvbnNlcy1vbmx5IERhdGFicmlja3MgbW9kZWw6IHRyYW5zbGF0ZSB0aGVcbiAqIHJlcXVlc3QsIFBPU1QgdG8gYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgLCB0cmFuc2xhdGUgdGhlIHJlcGx5IGJhY2suXG4gKiBTdHJlYW1pbmcgaXMgbm90IHRyYW5zbGF0ZWQgeWV0IC0gdGhvc2UgY2xpZW50cyBzaG91bGQgdXNlIGAvdjEvcmVzcG9uc2VzYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJveHlDaGF0VmlhUmVzcG9uc2VzKFxuICBiYWNrZW5kOiBEYXRhYnJpY2tzQmFja2VuZCxcbiAgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHJlcXVlc3RlZDogc3RyaW5nLFxuICBtb2RlbElkOiBzdHJpbmcsXG4gIG1hdGNoZWQ6IGJvb2xlYW4sXG4gIHJlczogU2VydmVyUmVzcG9uc2UsXG4gIHJldHJ5OiBSZXRyeUNvbmZpZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHJlc3BvbnNlcywgc3RyZWFtIH0gPSBjaGF0VG9SZXNwb25zZXNSZXF1ZXN0KGJvZHkpO1xuICByZXNwb25zZXMubW9kZWwgPSBtb2RlbElkO1xuXG4gIGlmIChzdHJlYW0pIHtcbiAgICBzZW5kSnNvbihcbiAgICAgIHJlcyxcbiAgICAgIDQwMCxcbiAgICAgIGVycm9yQm9keShcbiAgICAgICAgYG1vZGVsICR7bW9kZWxJZH0gb25seSBzdXBwb3J0cyB0aGUgUmVzcG9uc2VzIEFQSTsgdXNlIFBPU1QgL3YxL3Jlc3BvbnNlcyBmb3Igc3RyZWFtaW5nYCxcbiAgICAgICAgXCJpbnZhbGlkX3JlcXVlc3RfZXJyb3JcIixcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0gYXdhaXQgYmFja2VuZC5hdXRoSGVhZGVycygpO1xuICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gIGhlYWRlcnMuYWNjZXB0ID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG5cbiAgY29uc3QgdXBzdHJlYW1VcmwgPSBiYWNrZW5kLnJlc3BvbnNlc1VybChtb2RlbElkKTtcbiAgY29uc3QgZm9yd2FyZCA9IHVwc3RyZWFtVXJsLmluY2x1ZGVzKFwiL29wZW4tcmVzcG9uc2VzXCIpXG4gICAgPyBzYW5pdGl6ZU9wZW5SZXNwb25zZXNSZXF1ZXN0KHJlc3BvbnNlcylcbiAgICA6IHJlc3BvbnNlcztcblxuICBsb2dnZXIuaW5mbyhcInByb3h5XCIsIHtcbiAgICByZXF1ZXN0ZWQsXG4gICAgcmVzb2x2ZWQ6IG1vZGVsSWQsXG4gICAgbWF0Y2hlZCxcbiAgICB1cHN0cmVhbTogdXBzdHJlYW1VcmwsXG4gICAgc3RyZWFtOiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3QgdXBzdHJlYW0gPSBhd2FpdCB1cHN0cmVhbUZldGNoUmV0cnlpbmcoYmFja2VuZCwgdXBzdHJlYW1VcmwsIGhlYWRlcnMsIGZvcndhcmQsIHJlcywgcmV0cnkpO1xuXG4gIGlmICghdXBzdHJlYW0ub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgdXBzdHJlYW0udGV4dCgpO1xuICAgIHJlcy53cml0ZUhlYWQodXBzdHJlYW0uc3RhdHVzLCB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0pO1xuICAgIHJlcy5lbmQodGV4dCB8fCBKU09OLnN0cmluZ2lmeShlcnJvckJvZHkoXCJ1cHN0cmVhbSBlcnJvclwiLCBcInByb3h5X2Vycm9yXCIpKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2VKc29uID0gKGF3YWl0IHVwc3RyZWFtLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHNlbmRKc29uKHJlcywgMjAwLCByZXNwb25zZVRvQ2hhdENvbXBsZXRpb24ocmVzcG9uc2VKc29uLCBtb2RlbElkKSk7XG59XG5cbi8qKlxuICogYFBPU1QgL3YxL3Jlc3BvbnNlc2A6IGZvcndhcmQgdGhlIFJlc3BvbnNlcyBib2R5IHRvIERhdGFicmlja3MnIG5hdGl2ZVxuICogUmVzcG9uc2VzIC8gT3BlbiBSZXNwb25zZXMgc3VyZmFjZSAobW9kZWwgc3RheXMgaW4gdGhlIGJvZHk7IFVSTCBpc1xuICogd29ya3NwYWNlLWxldmVsKS4gU3RyZWFtaW5nIGFuZCBub24tc3RyZWFtaW5nIGJvdGggcGFzcyB0aHJvdWdoIGFzLWlzLlxuICpcbiAqIE9wZW4gUmVzcG9uc2VzIChDbGF1ZGUvR2VtaW5pL+KApikgb25seSBhY2NlcHRzIGBmdW5jdGlvbmAgdG9vbHMgYW5kXG4gKiBgaW5wdXRfKmAgY29udGVudCBwYXJ0IHR5cGVzLCBhbmQgcmVqZWN0cyByZXBsYXllZCBDbGF1ZGUgdGhpbmtpbmdcbiAqIGJsb2NrcyDigJQgc28gQ29kZXgncyBidWlsdC1pbiB0b29scywgcHJpb3ItdHVybiBgb3V0cHV0X3RleHRgLCBhbmRcbiAqIGByZWRhY3RlZF90aGlua2luZ2AgLyBgdGhpbmtpbmdgIC8gYHJlYXNvbmluZ2AgcGFydHMgYXJlIHJld3JpdHRlbiBvclxuICogc3RyaXBwZWQgdGhlcmUuIFRoZSBPcGVuQUkgYC9yZXNwb25zZXNgIHBhdGgga2VlcHMgdGhlbSAtIEdQVCBzdXBwb3J0c1xuICogdGhvc2Ugc2hhcGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVSZXNwb25zZXMoXG4gIGJhY2tlbmQ6IERhdGFicmlja3NCYWNrZW5kLFxuICByZXE6IEluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBTZXJ2ZXJSZXNwb25zZSxcbiAgcmV0cnk6IFJldHJ5Q29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJvZHkgPSBhd2FpdCByZWFkSnNvbkJvZHkocmVxKTtcbiAgY29uc3QgcmVxdWVzdGVkID0gdHlwZW9mIGJvZHkubW9kZWwgPT09IFwic3RyaW5nXCIgPyBib2R5Lm1vZGVsIDogdW5kZWZpbmVkO1xuICBpZiAoIXJlcXVlc3RlZCkge1xuICAgIHNlbmRKc29uKHJlcywgNDAwLCBlcnJvckJvZHkoXCJtaXNzaW5nICdtb2RlbCcgaW4gcmVxdWVzdCBib2R5XCIsIFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGJhY2tlbmQucmVzb2x2ZShyZXF1ZXN0ZWQpO1xuICBib2R5Lm1vZGVsID0gcmVzb2x2ZWQubW9kZWxJZDtcblxuICBjb25zdCB1cHN0cmVhbVVybCA9IGJhY2tlbmQucmVzcG9uc2VzVXJsKHJlc29sdmVkLm1vZGVsSWQpO1xuICAvLyBDcm9zcy1wcm92aWRlciBPcGVuIFJlc3BvbnNlcyByZWplY3RzIG5vbi1mdW5jdGlvbiB0b29scyBhbmQgYG91dHB1dF8qYFxuICAvLyBjb250ZW50IHBhcnRzIGluIGBpbnB1dGA7IE9wZW5BSSBgL3Jlc3BvbnNlc2Aga2VlcHMgQ29kZXgncyBuYXRpdmUgc2hhcGVzLlxuICBjb25zdCBmb3J3YXJkID0gdXBzdHJlYW1VcmwuaW5jbHVkZXMoXCIvb3Blbi1yZXNwb25zZXNcIilcbiAgICA/IHNhbml0aXplT3BlblJlc3BvbnNlc1JlcXVlc3QoYm9keSlcbiAgICA6IGJvZHk7XG5cbiAgY29uc3Qgd2FudHNTdHJlYW0gPSBmb3J3YXJkLnN0cmVhbSA9PT0gdHJ1ZTtcbiAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGJhY2tlbmQuYXV0aEhlYWRlcnMoKTtcbiAgaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICBoZWFkZXJzLmFjY2VwdCA9IHdhbnRzU3RyZWFtID8gXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiIDogXCJhcHBsaWNhdGlvbi9qc29uXCI7XG5cbiAgY29uc3Qgc3RyaXBwZWQgPVxuICAgIEFycmF5LmlzQXJyYXkoYm9keS50b29scykgJiZcbiAgICAoIUFycmF5LmlzQXJyYXkoZm9yd2FyZC50b29scykgfHwgZm9yd2FyZC50b29scy5sZW5ndGggIT09IGJvZHkudG9vbHMubGVuZ3RoKTtcblxuICBsb2dnZXIuaW5mbyhcInJlc3BvbnNlc1wiLCB7XG4gICAgcmVxdWVzdGVkLFxuICAgIHJlc29sdmVkOiByZXNvbHZlZC5tb2RlbElkLFxuICAgIG1hdGNoZWQ6IHJlc29sdmVkLm1hdGNoZWQsXG4gICAgdXBzdHJlYW06IHVwc3RyZWFtVXJsLFxuICAgIHN0cmVhbTogd2FudHNTdHJlYW0sXG4gICAgLi4uKHN0cmlwcGVkID8geyBzdHJpcHBlZE5vbkZ1bmN0aW9uVG9vbHM6IHRydWUgfSA6IHt9KSxcbiAgfSk7XG5cbiAgY29uc3QgdXBzdHJlYW0gPSBhd2FpdCB1cHN0cmVhbUZldGNoUmV0cnlpbmcoYmFja2VuZCwgdXBzdHJlYW1VcmwsIGhlYWRlcnMsIGZvcndhcmQsIHJlcywgcmV0cnkpO1xuXG4gIHJlcy53cml0ZUhlYWQodXBzdHJlYW0uc3RhdHVzLCB7XG4gICAgXCJjb250ZW50LXR5cGVcIjogdXBzdHJlYW0uaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgXCJ4LXJlc29sdmVkLW1vZGVsXCI6IHJlc29sdmVkLm1vZGVsSWQsXG4gIH0pO1xuICBhd2FpdCBzdHJlYW1Cb2R5KHVwc3RyZWFtLCByZXMpO1xufVxuXG4vKipcbiAqIFB1bXAgYW4gdXBzdHJlYW0gYGZldGNoYCBSZXNwb25zZSBib2R5IHRvIHRoZSBOb2RlIHJlc3BvbnNlLCBjaHVuayBieSBjaHVuay5cbiAqXG4gKiBBIG1pZC1zdHJlYW0gdXBzdHJlYW0gZmFpbHVyZSBpcyBsb2dnZWQgcmF0aGVyIHRoYW4gdGhyb3duOiB0aGUgc3RhdHVzIGxpbmVcbiAqIGFuZCBzb21lIG51bWJlciBvZiBjaHVua3MgaGF2ZSBhbHJlYWR5IGdvbmUgb3V0LCBzbyB0aGVyZSBpcyBubyB3YXkgbGVmdCB0b1xuICogdHVybiBpdCBpbnRvIGFuIEhUVFAgZXJyb3IgYW5kIHRoZSBvbmx5IGhvbmVzdCBtb3ZlIGlzIHRvIGVuZCB0aGUgcmVzcG9uc2VcbiAqIGFuZCBzYXkgd2h5IGluIHRoZSBsb2cuIFdpdGhvdXQgdGhpcyB0aGUgcmVhZCBsb29wIHJlamVjdGVkIGludG8gdGhlIGNhbGxlcidzXG4gKiBjYXRjaCwgd2hpY2ggZm91bmQgYGhlYWRlcnNTZW50YCBhbmQgZW5kZWQgdGhlIHJlc3BvbnNlIHNpbGVudGx5IC0gbWFraW5nIGFuXG4gKiB1cHN0cmVhbSB0ZWFyZG93biBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgY2xlYW4gZmluaXNoLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdHJlYW1Cb2R5KHVwc3RyZWFtOiBSZXNwb25zZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBib2R5ID0gdXBzdHJlYW0uYm9keTtcbiAgaWYgKCFib2R5KSB7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWFkZXIgPSBib2R5LmdldFJlYWRlcigpO1xuICB0cnkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgICBpZiAodmFsdWUgJiYgIXJlcy53cml0YWJsZUVuZGVkKSByZXMud3JpdGUoQnVmZmVyLmZyb20odmFsdWUpKTtcbiAgICAgIGlmIChyZXMud3JpdGFibGVFbmRlZCkgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBBbiBhYm9ydGVkIHJlcXVlc3QgaXMgdGhlIGV4cGVjdGVkIHNoYXBlIG9mIGEgY2xpZW50IGhhbmdpbmcgdXAsIG5vdCBhXG4gICAgLy8gZmF1bHQgd29ydGggcmVwb3J0aW5nIGF0IGVycm9yIGxldmVsLlxuICAgIGNvbnN0IGFib3J0ZWQgPSByZXMud3JpdGFibGVFbmRlZCB8fCAhcmVzLndyaXRhYmxlO1xuICAgIGxvZ2dlclthYm9ydGVkID8gXCJpbmZvXCIgOiBcImVycm9yXCJdKFwic3RyZWFtIGVuZGVkIGVhcmx5XCIsIHtcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIHJlcy5lbmQoKTtcbiAgfVxufVxuXG4vKiogVHJ1ZSB3aGVuIHRoZSByZXF1ZXN0IGNhcnJpZXMgdGhlIGV4cGVjdGVkIGJlYXJlciB0b2tlbi4gKi9cbmZ1bmN0aW9uIGlzQXV0aG9yaXplZChyZXE6IEluY29taW5nTWVzc2FnZSwgYXBpS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgaGVhZGVyID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcbiAgaWYgKCFoZWFkZXIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGhlYWRlci5yZXBsYWNlKC9eQmVhcmVyXFxzKy9pLCBcIlwiKS50cmltKCkgPT09IGFwaUtleTtcbn1cblxuLyoqXG4gKiBEcmFpbiBhIHJlcXVlc3QgYm9keSBhbmQgcGFyc2UgaXQgYXMgYSBKU09OIG9iamVjdC4gQW4gZW1wdHksIG1hbGZvcm1lZCwgb3JcbiAqIG5vbi1vYmplY3QgYm9keSB5aWVsZHMgYHt9YCwgd2hpY2ggdGhlIGNhbGxlcnMgcmVqZWN0IGFzIGEgbWlzc2luZyBgbW9kZWxgLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkSnNvbkJvZHkocmVxOiBJbmNvbWluZ01lc3NhZ2UpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiByZXEpIHtcbiAgICBjaHVua3MucHVzaChCdWZmZXIuaXNCdWZmZXIoY2h1bmspID8gY2h1bmsgOiBCdWZmZXIuZnJvbShjaHVuayBhcyBVaW50OEFycmF5KSk7XG4gIH1cbiAgcmV0dXJuIGpzb24ucGFyc2VSZWNvcmQoQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKFwidXRmOFwiKSkgPz8ge307XG59XG5cbi8qKiBTZXJpYWxpemUgYW5kIHNlbmQgYSBKU09OIHJlc3BvbnNlLiAqL1xuZnVuY3Rpb24gc2VuZEpzb24ocmVzOiBTZXJ2ZXJSZXNwb25zZSwgc3RhdHVzOiBudW1iZXIsIGJvZHk6IHVua25vd24pOiB2b2lkIHtcbiAgcmVzLndyaXRlSGVhZChzdGF0dXMsIHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSk7XG4gIHJlcy5lbmQoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xufVxuXG4vKiogT3BlbkFJLXNoYXBlZCBlcnJvciBlbnZlbG9wZS4gKi9cbmZ1bmN0aW9uIGVycm9yQm9keShtZXNzYWdlOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IHsgZXJyb3I6IHsgbWVzc2FnZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfSB9IHtcbiAgcmV0dXJuIHsgZXJyb3I6IHsgbWVzc2FnZSwgdHlwZSB9IH07XG59XG4iXX0=
package/package.json CHANGED
@@ -6,29 +6,29 @@
6
6
  "directory": "packages/cli/model-proxy"
7
7
  },
8
8
  "bin": {
9
- "dbx-tools-model-proxy": "./bin/dbx-tools-model-proxy.mjs",
10
- "dbxt-model-proxy": "./bin/dbx-tools-model-proxy.mjs"
9
+ "dbx-tools-model-proxy": "./lib/bin/dbx-tools-model-proxy.js",
10
+ "dbxt-model-proxy": "./lib/bin/dbx-tools-model-proxy.js"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/node": "^24.6.0",
14
+ "tsx": "^4.23.0",
14
15
  "typescript": "^5.9.3"
15
16
  },
16
17
  "dependencies": {
17
18
  "@clack/prompts": "^1.7.0",
18
19
  "@databricks/sdk-experimental": "^0.17.0",
19
20
  "commander": "^15.0.0",
20
- "tsx": "^4.23.0",
21
21
  "undici": "^7.17.0",
22
- "@dbx-tools/shared-core": "0.4.1",
23
- "@dbx-tools/shared-model": "0.4.1",
24
- "@dbx-tools/model": "0.4.1"
22
+ "@dbx-tools/model": "0.5.1",
23
+ "@dbx-tools/shared-model": "0.5.1",
24
+ "@dbx-tools/shared-core": "0.5.1"
25
25
  },
26
26
  "main": "./lib/index.js",
27
27
  "license": "UNLICENSED",
28
28
  "publishConfig": {
29
29
  "access": "public"
30
30
  },
31
- "version": "0.4.1",
31
+ "version": "0.5.1",
32
32
  "types": "./lib/index.d.ts",
33
33
  "type": "module",
34
34
  "exports": {
package/src/cli.ts CHANGED
@@ -23,9 +23,9 @@ import type { Server } from "node:http";
23
23
  import { classify, type ServingEndpointSummary } from "@dbx-tools/shared-model";
24
24
  import { Command, CommanderError } from "commander";
25
25
 
26
- import { DatabricksBackend, type BackendOptions } from "./backend";
27
- import { DEFAULT_BIND_HOST, DEFAULT_PORT, resolveRetryConfig } from "./defaults";
28
- import { startProxyServer } from "./server";
26
+ import { DatabricksBackend, type BackendOptions } from "./backend.ts";
27
+ import { DEFAULT_BIND_HOST, DEFAULT_PORT, resolveRetryConfig } from "./defaults.ts";
28
+ import { startProxyServer } from "./server.ts";
29
29
 
30
30
  /**
31
31
  * Default terminal client for `chat`, launched via `bunx`. OpenHarness is an
package/src/server.ts CHANGED
@@ -36,8 +36,8 @@ import { async as asyncUtil, error, json, log } from "@dbx-tools/shared-core";
36
36
  import { classify, openaiChat, openaiResponses } from "@dbx-tools/shared-model";
37
37
  import { Agent } from "undici";
38
38
 
39
- import type { DatabricksBackend } from "./backend";
40
- import { DEFAULT_BIND_HOST, DEFAULT_PORT, DEFAULT_RETRY, type RetryConfig } from "./defaults";
39
+ import type { DatabricksBackend } from "./backend.ts";
40
+ import { DEFAULT_BIND_HOST, DEFAULT_PORT, DEFAULT_RETRY, type RetryConfig } from "./defaults.ts";
41
41
 
42
42
  const { chatToResponsesRequest, responseToChatCompletion, sanitizeOpenResponsesRequest } =
43
43
  openaiResponses;
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env node
2
- // GENERATED by projen synth (cli tag) - DO NOT EDIT.
3
- // Regenerated from ./dbx-tools-model-proxy.ts.
4
- // Hand edits are overwritten on the next watch; this file is read-only.
5
-
6
- // Resolved as a bare specifier so Node looks in THIS file's package rather than the
7
- // caller's cwd - the only way a globally installed CLI finds its own tsx.
8
- import { register } from "tsx/esm/api";
9
-
10
- register();
11
- await import(new URL("./dbx-tools-model-proxy.ts", import.meta.url).href);