@dbx-tools/appkit 0.9.65 → 0.9.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
6
- export const PACKAGE_VERSION = "0.9.65";
6
+ export const PACKAGE_VERSION = "0.9.68";
7
7
  export * as appkit from "./src/appkit.ts";
8
8
  export * as brandContext from "./src/brand-context.ts";
9
9
  export * as bundle from "./src/bundle.ts";
@@ -17,8 +17,10 @@ export * as pgaddress from "./src/pgaddress.ts";
17
17
  export * as pluginExecution from "./src/plugin-execution.ts";
18
18
  export * as pluginRegistry from "./src/plugin-registry.ts";
19
19
  export * as provision from "./src/provision.ts";
20
+ export * as requestTags from "./src/request-tags.ts";
20
21
  export * as toolProvider from "./src/tool-provider.ts";
21
22
  export * as toolkitEntries from "./src/toolkit-entries.ts";
23
+ export { isDatabricksAppEnv } from "./src/appkit.ts";
22
24
  export type { AutoConfigureMode, CreateAppConfig, ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.ts";
23
25
  export { bundleAppResourceSchema, flattenAppYamlEnv, flattenAppEnv, getBundlePath } from "./src/bundle.ts";
24
26
  export type { BundleValidateJson, ConfigFile, ConfigMapValue, ConfigSource, ResolveConfigValueOptions } from "./src/bundle.ts";
@@ -35,4 +37,5 @@ export { SSL_MODES } from "./src/pgaddress.ts";
35
37
  export type { SslMode, ParsedAddress, LakebaseConnectionInputs } from "./src/pgaddress.ts";
36
38
  export type { RunPluginExecutionOptions } from "./src/plugin-execution.ts";
37
39
  export type { PluginContextLike } from "./src/plugin-registry.ts";
40
+ export type { RequestTagValue } from "./src/request-tags.ts";
38
41
  export { ToolRegistryPlugin } from "./src/tool-provider.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
2
- export declare const PACKAGE_VERSION = "0.9.65";
2
+ export declare const PACKAGE_VERSION = "0.9.68";
3
3
  export * as appkit from "./src/appkit.ts";
4
4
  export * as brandContext from "./src/brand-context.ts";
5
5
  export * as bundle from "./src/bundle.ts";
@@ -13,8 +13,10 @@ export * as pgaddress from "./src/pgaddress.ts";
13
13
  export * as pluginExecution from "./src/plugin-execution.ts";
14
14
  export * as pluginRegistry from "./src/plugin-registry.ts";
15
15
  export * as provision from "./src/provision.ts";
16
+ export * as requestTags from "./src/request-tags.ts";
16
17
  export * as toolProvider from "./src/tool-provider.ts";
17
18
  export * as toolkitEntries from "./src/toolkit-entries.ts";
19
+ export { isDatabricksAppEnv } from "./src/appkit.ts";
18
20
  export type { AutoConfigureMode, CreateAppConfig, ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.ts";
19
21
  export { bundleAppResourceSchema, flattenAppYamlEnv, flattenAppEnv, getBundlePath } from "./src/bundle.ts";
20
22
  export type { BundleValidateJson, ConfigFile, ConfigMapValue, ConfigSource, ResolveConfigValueOptions } from "./src/bundle.ts";
@@ -31,4 +33,5 @@ export { SSL_MODES } from "./src/pgaddress.ts";
31
33
  export type { SslMode, ParsedAddress, LakebaseConnectionInputs } from "./src/pgaddress.ts";
32
34
  export type { RunPluginExecutionOptions } from "./src/plugin-execution.ts";
33
35
  export type { PluginContextLike } from "./src/plugin-registry.ts";
36
+ export type { RequestTagValue } from "./src/request-tags.ts";
34
37
  export { ToolRegistryPlugin } from "./src/tool-provider.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
5
- export const PACKAGE_VERSION = "0.9.65";
5
+ export const PACKAGE_VERSION = "0.9.68";
6
6
  export * as appkit from "./src/appkit.js";
7
7
  export * as brandContext from "./src/brand-context.js";
8
8
  export * as bundle from "./src/bundle.js";
@@ -16,12 +16,14 @@ export * as pgaddress from "./src/pgaddress.js";
16
16
  export * as pluginExecution from "./src/plugin-execution.js";
17
17
  export * as pluginRegistry from "./src/plugin-registry.js";
18
18
  export * as provision from "./src/provision.js";
19
+ export * as requestTags from "./src/request-tags.js";
19
20
  export * as toolProvider from "./src/tool-provider.js";
20
21
  export * as toolkitEntries from "./src/toolkit-entries.js";
22
+ export { isDatabricksAppEnv } from "./src/appkit.js";
21
23
  export { bundleAppResourceSchema, flattenAppYamlEnv, flattenAppEnv, getBundlePath } from "./src/bundle.js";
22
24
  export { AppKitChildProcess } from "./src/child-process.js";
23
25
  export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER, IDENTITY_MODES, DEFAULT_IDENTITY_MODE } from "./src/identity.js";
24
26
  export { LifecycleBridgePlugin, lifecycleBridge } from "./src/interceptor.js";
25
27
  export { SSL_MODES } from "./src/pgaddress.js";
26
28
  export { ToolRegistryPlugin } from "./src/tool-provider.js";
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssZUFBZSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFFM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxJLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUk5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjY1XCI7XG5leHBvcnQgKiBhcyBhcHBraXQgZnJvbSBcIi4vc3JjL2FwcGtpdC50c1wiO1xuZXhwb3J0ICogYXMgYnJhbmRDb250ZXh0IGZyb20gXCIuL3NyYy9icmFuZC1jb250ZXh0LnRzXCI7XG5leHBvcnQgKiBhcyBidW5kbGUgZnJvbSBcIi4vc3JjL2J1bmRsZS50c1wiO1xuZXhwb3J0ICogYXMgY2hpbGRQcm9jZXNzIGZyb20gXCIuL3NyYy9jaGlsZC1wcm9jZXNzLnRzXCI7XG5leHBvcnQgKiBhcyBkYXRhYnJpY2tzIGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIGludGVyY2VwdG9yIGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2VSZXNvbHZlciBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCAqIGFzIG1pZ3JhdGlvbiBmcm9tIFwiLi9zcmMvbWlncmF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBwZ2FkZHJlc3MgZnJvbSBcIi4vc3JjL3BnYWRkcmVzcy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luRXhlY3V0aW9uIGZyb20gXCIuL3NyYy9wbHVnaW4tZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW5SZWdpc3RyeSBmcm9tIFwiLi9zcmMvcGx1Z2luLXJlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgKiBhcyBwcm92aXNpb24gZnJvbSBcIi4vc3JjL3Byb3Zpc2lvbi50c1wiO1xuZXhwb3J0ICogYXMgdG9vbFByb3ZpZGVyIGZyb20gXCIuL3NyYy90b29sLXByb3ZpZGVyLnRzXCI7XG5leHBvcnQgKiBhcyB0b29sa2l0RW50cmllcyBmcm9tIFwiLi9zcmMvdG9vbGtpdC1lbnRyaWVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dG9Db25maWd1cmVNb2RlLCBDcmVhdGVBcHBDb25maWcsIEV4ZWN1dGlvbkNvbnRleHRMaWtlLCBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIi4vc3JjL2FwcGtpdC50c1wiO1xuZXhwb3J0IHsgYnVuZGxlQXBwUmVzb3VyY2VTY2hlbWEsIGZsYXR0ZW5BcHBZYW1sRW52LCBmbGF0dGVuQXBwRW52LCBnZXRCdW5kbGVQYXRoIH0gZnJvbSBcIi4vc3JjL2J1bmRsZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdW5kbGVWYWxpZGF0ZUpzb24sIENvbmZpZ0ZpbGUsIENvbmZpZ01hcFZhbHVlLCBDb25maWdTb3VyY2UsIFJlc29sdmVDb25maWdWYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgeyBBcHBLaXRDaGlsZFByb2Nlc3MgfSBmcm9tIFwiLi9zcmMvY2hpbGQtcHJvY2Vzcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBcHBLaXRTcGF3bkFyZ3MsIEFwcEtpdENoaWxkUHJvY2Vzc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2hpbGQtcHJvY2Vzcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBDb250ZXh0TGlrZSB9IGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLnRzXCI7XG5leHBvcnQgeyBBQ0NFU1NfVE9LRU5fSEVBREVSLCBVU0VSX0lEX0hFQURFUiwgVVNFUl9FTUFJTF9IRUFERVIsIElERU5USVRZX01PREVTLCBERUZBVUxUX0lERU5USVRZX01PREUgfSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgSWRlbnRpdHlNb2RlLCBIZWFkZXJCZWFyaW5nIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgeyBMaWZlY3ljbGVCcmlkZ2VQbHVnaW4sIGxpZmVjeWNsZUJyaWRnZSB9IGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBMaWZlY3ljbGVFdmVudCwgTGlmZWN5Y2xlSGFuZGxlciwgUmVzb2x2ZWRBcHBFbnYsIEJpbmRhYmxlUHJvY2VzcywgSW50ZXJjZXB0b3JDb250ZXh0LCBJbnRlcmNlcHRvciwgSW50ZXJjZXB0b3JSdW50aW1lIH0gZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgdHlwZSB7IExha2ViYXNlUmVzb2x2ZXJJbnB1dHMsIExha2ViYXNlQ29ubmVjdGlvbiB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1yZXNvbHZlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBPd25lcnNoaXBNaWdyYXRpb25FcnJvck9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbWlncmF0aW9uLnRzXCI7XG5leHBvcnQgeyBTU0xfTU9ERVMgfSBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNzbE1vZGUsIFBhcnNlZEFkZHJlc3MsIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyB9IGZyb20gXCIuL3NyYy9wZ2FkZHJlc3MudHNcIjtcbmV4cG9ydCB0eXBlIHsgUnVuUGx1Z2luRXhlY3V0aW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9wbHVnaW4tZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFBsdWdpbkNvbnRleHRMaWtlIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi1yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHsgVG9vbFJlZ2lzdHJ5UGx1Z2luIH0gZnJvbSBcIi4vc3JjL3Rvb2wtcHJvdmlkZXIudHNcIjtcbiJdfQ==
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssZUFBZSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEksT0FBTyxFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSTlFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUsvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNjhcIjtcbmV4cG9ydCAqIGFzIGFwcGtpdCBmcm9tIFwiLi9zcmMvYXBwa2l0LnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZENvbnRleHQgZnJvbSBcIi4vc3JjL2JyYW5kLWNvbnRleHQudHNcIjtcbmV4cG9ydCAqIGFzIGJ1bmRsZSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgKiBhcyBjaGlsZFByb2Nlc3MgZnJvbSBcIi4vc3JjL2NoaWxkLXByb2Nlc3MudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3MgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MudHNcIjtcbmV4cG9ydCAqIGFzIGlkZW50aXR5IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0ICogYXMgaW50ZXJjZXB0b3IgZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVJlc29sdmVyIGZyb20gXCIuL3NyYy9sYWtlYmFzZS1yZXNvbHZlci50c1wiO1xuZXhwb3J0ICogYXMgbWlncmF0aW9uIGZyb20gXCIuL3NyYy9taWdyYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBnYWRkcmVzcyBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW5FeGVjdXRpb24gZnJvbSBcIi4vc3JjL3BsdWdpbi1leGVjdXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpblJlZ2lzdHJ5IGZyb20gXCIuL3NyYy9wbHVnaW4tcmVnaXN0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHByb3Zpc2lvbiBmcm9tIFwiLi9zcmMvcHJvdmlzaW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXF1ZXN0VGFncyBmcm9tIFwiLi9zcmMvcmVxdWVzdC10YWdzLnRzXCI7XG5leHBvcnQgKiBhcyB0b29sUHJvdmlkZXIgZnJvbSBcIi4vc3JjL3Rvb2wtcHJvdmlkZXIudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2xraXRFbnRyaWVzIGZyb20gXCIuL3NyYy90b29sa2l0LWVudHJpZXMudHNcIjtcbmV4cG9ydCB7IGlzRGF0YWJyaWNrc0FwcEVudiB9IGZyb20gXCIuL3NyYy9hcHBraXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXV0b0NvbmZpZ3VyZU1vZGUsIENyZWF0ZUFwcENvbmZpZywgRXhlY3V0aW9uQ29udGV4dExpa2UsIFdvcmtzcGFjZUNsaWVudExpa2UgfSBmcm9tIFwiLi9zcmMvYXBwa2l0LnRzXCI7XG5leHBvcnQgeyBidW5kbGVBcHBSZXNvdXJjZVNjaGVtYSwgZmxhdHRlbkFwcFlhbWxFbnYsIGZsYXR0ZW5BcHBFbnYsIGdldEJ1bmRsZVBhdGggfSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1bmRsZVZhbGlkYXRlSnNvbiwgQ29uZmlnRmlsZSwgQ29uZmlnTWFwVmFsdWUsIENvbmZpZ1NvdXJjZSwgUmVzb2x2ZUNvbmZpZ1ZhbHVlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9idW5kbGUudHNcIjtcbmV4cG9ydCB7IEFwcEtpdENoaWxkUHJvY2VzcyB9IGZyb20gXCIuL3NyYy9jaGlsZC1wcm9jZXNzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFwcEtpdFNwYXduQXJncywgQXBwS2l0Q2hpbGRQcm9jZXNzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9jaGlsZC1wcm9jZXNzLnRzXCI7XG5leHBvcnQgdHlwZSB7IENvbnRleHRMaWtlIH0gZnJvbSBcIi4vc3JjL2RhdGFicmlja3MudHNcIjtcbmV4cG9ydCB7IEFDQ0VTU19UT0tFTl9IRUFERVIsIFVTRVJfSURfSEVBREVSLCBVU0VSX0VNQUlMX0hFQURFUiwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBJZGVudGl0eU1vZGUsIEhlYWRlckJlYXJpbmcgfSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCB7IExpZmVjeWNsZUJyaWRnZVBsdWdpbiwgbGlmZWN5Y2xlQnJpZGdlIH0gZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgdHlwZSB7IExpZmVjeWNsZUV2ZW50LCBMaWZlY3ljbGVIYW5kbGVyLCBSZXNvbHZlZEFwcEVudiwgQmluZGFibGVQcm9jZXNzLCBJbnRlcmNlcHRvckNvbnRleHQsIEludGVyY2VwdG9yLCBJbnRlcmNlcHRvclJ1bnRpbWUgfSBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VSZXNvbHZlcklucHV0cywgTGFrZWJhc2VDb25uZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IE93bmVyc2hpcE1pZ3JhdGlvbkVycm9yT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9taWdyYXRpb24udHNcIjtcbmV4cG9ydCB7IFNTTF9NT0RFUyB9IGZyb20gXCIuL3NyYy9wZ2FkZHJlc3MudHNcIjtcbmV4cG9ydCB0eXBlIHsgU3NsTW9kZSwgUGFyc2VkQWRkcmVzcywgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIH0gZnJvbSBcIi4vc3JjL3BnYWRkcmVzcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBSdW5QbHVnaW5FeGVjdXRpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi1leGVjdXRpb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgUGx1Z2luQ29udGV4dExpa2UgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLXJlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlcXVlc3RUYWdWYWx1ZSB9IGZyb20gXCIuL3NyYy9yZXF1ZXN0LXRhZ3MudHNcIjtcbmV4cG9ydCB7IFRvb2xSZWdpc3RyeVBsdWdpbiB9IGZyb20gXCIuL3NyYy90b29sLXByb3ZpZGVyLnRzXCI7XG4iXX0=
@@ -28,8 +28,11 @@
28
28
  */
29
29
  import { createApp as appkitCreateApp, getExecutionContext } from "@databricks/appkit";
30
30
  import type { PluginMap } from "@databricks/appkit/dist/shared/src/plugin";
31
+ import { environmentUtils } from "@dbx-tools/shared-core";
31
32
  import { type Interceptor } from "./interceptor.ts";
32
33
  import { type LakebaseConnection } from "./lakebase-resolver.ts";
34
+ /** Detect whether the current process is running as a deployed Databricks App. */
35
+ export declare const isDatabricksAppEnv: typeof environmentUtils.isDatabricksAppEnv;
33
36
  type AppKitCreateAppConfig = NonNullable<Parameters<typeof appkitCreateApp>[0]>;
34
37
  type AppKitPlugins = NonNullable<AppKitCreateAppConfig["plugins"]>;
35
38
  /**
package/lib/src/appkit.js CHANGED
@@ -28,7 +28,7 @@
28
28
  */
29
29
  import { createApp as appkitCreateApp, getExecutionContext, InitializationError, } from "@databricks/appkit";
30
30
  import { profile as authProfile } from "@dbx-tools/auth";
31
- import { asyncUtils, log } from "@dbx-tools/shared-core";
31
+ import { asyncUtils, environmentUtils, log } from "@dbx-tools/shared-core";
32
32
  import { resolveAutoConfigurePolicy } from "./_auto-configure.js";
33
33
  import { createSoftPersistentStorage } from "./_cache-storage.js";
34
34
  import { loadBrandContext } from "./brand-context.js";
@@ -36,6 +36,8 @@ import { createInterceptorContext, lifecycleBridge, } from "./interceptor.js";
36
36
  import { applyLakebaseEnv } from "./lakebase-resolver.js";
37
37
  import { provisionCacheSchema } from "./provision.js";
38
38
  const logger = log.logger("appkit");
39
+ /** Detect whether the current process is running as a deployed Databricks App. */
40
+ export const isDatabricksAppEnv = environmentUtils.isDatabricksAppEnv;
39
41
  const LAKEBASE_PLUGIN = "lakebase";
40
42
  /**
41
43
  * Upper bound on boot-time auto-configuration. It runs as the service principal
@@ -320,4 +322,4 @@ export async function ensureInitialized() {
320
322
  await createApp({ plugins: [], autoConfigure: false });
321
323
  logger.debug("ensureInitialized: bare AppKit initialization complete");
322
324
  }
323
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwa2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUgsT0FBTyxFQUNMLFNBQVMsSUFBSSxlQUFlLEVBQzVCLG1CQUFtQixFQUNuQixtQkFBbUIsR0FDcEIsTUFBTSxvQkFBb0IsQ0FBQztBQUk1QixPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUNMLHdCQUF3QixFQUd4QixlQUFlLEdBRWhCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUEyQixNQUFNLHdCQUF3QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUE4Q3BDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQztBQUVuQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUM7QUFFOUMsU0FBUyxVQUFVLENBQ2pCLE1BQXNDLEVBQ3RDLElBQVk7SUFFWixPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMs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QyxDQUFDLENBQUM7SUFDM0QsTUFBTSxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sQ0FBQyxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcnVudGltZSBnbHVlOiB0aGUgYXV0by1jb25maWd1cmluZyBgY3JlYXRlQXBwYCBkcm9wLWluLCBwbHVzIHRoZVxuICogcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgaGVscGVycyBhbmQgdHlwZXMgZGVyaXZlZCBmcm9tIGl0LlxuICpcbiAqIGBjcmVhdGVBcHBgIHJ1bnMgZGJ4LXRvb2xzIGF1dG8tY29uZmlndXJhdGlvbiwgdGhlbiBkZWxlZ2F0ZXMgdG8gQXBwS2l0J3Mgb3duXG4gKiBgY3JlYXRlQXBwYCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhbmQgdGhlIHNhbWUgdHlwZWQgcGx1Z2luLWV4cG9ydCBtYXAuXG4gKiBEcm9wIGl0IGluIGFzIGEgb25lLWZvci1vbmUgcmVwbGFjZW1lbnQ6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGxha2ViYXNlLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuY3JlYXRlQXBwKHsgcGx1Z2luczogW3NlcnZlcigpLCBsYWtlYmFzZSgpXSB9KTtcbiAqIGBgYFxuICpcbiAqIEF1dG8tY29uZmlndXJhdGlvbiBydW5zIEJFRk9SRSBkZWxlZ2F0aW5nIHNvIHBsdWdpbnMgc2VlIGEgZnVsbHkgcG9wdWxhdGVkXG4gKiBgcHJvY2Vzcy5lbnZgIGR1cmluZyB0aGVpciBzeW5jaHJvbm91cyBgc2V0dXAoKWAuIExha2ViYXNlIFBvc3RncmVzIHJlc29sdXRpb25cbiAqIHJ1bnMgd2hlbiBhIG5hdGl2ZSBgbGFrZWJhc2VgIG9yIGBkYXRhYmFzZWAgcGx1Z2luIGlzIHByZXNlbnQsIG9yIHdoZW5cbiAqIHtAbGluayBBdXRvQ29uZmlndXJlTW9kZX0gaXMgc2V0IGV4cGxpY2l0bHkgb24gdGhlIGNvbmZpZyBvYmplY3QuXG4gKlxuICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgaXMgQXBwS2l0J3Mgb3duIGFjY2Vzc29yIGZvciB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2VcbiAqIGNsaWVudCArIHJlcXVlc3QgbWV0YWRhdGE7IHRoZSB3cmFwcGVycyBoZXJlIG1ha2UgaXQgc2FmZSB0byBjYWxsIG91dHNpZGUgYVxuICogcmVxdWVzdCBzY29wZSAoe0BsaW5rIHRyeUdldEV4ZWN1dGlvbkNvbnRleHR9KSBhbmQgdG8gbGF6aWx5IGJvb3QgYSBiYXJlIGFwcFxuICogKHtAbGluayBlbnN1cmVJbml0aWFsaXplZH0pLCBhbmQgcmUtZXhwb3J0IHRoZSBkZXJpdmVkIHR5cGVzIHNvIGFkZC1vblxuICogcGFja2FnZXMgY2FuIHR5cGUgYSBjb250ZXh0IC8gY2xpZW50IHdpdGhvdXQgcmUtZGVyaXZpbmcgdGhlbSBpbmxpbmUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGNyZWF0ZUFwcCBhcyBhcHBraXRDcmVhdGVBcHAsXG4gIGdldEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluaXRpYWxpemF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbi8vIEFwcEtpdCdzIHJvb3QgYmFycmVsIHJlLWV4cG9ydHMgYFBsdWdpbkRhdGFgIGJ1dCBub3QgYFBsdWdpbk1hcGA7IHRoZSBwYWNrYWdlXG4vLyBwdWJsaXNoZXMgdGhpcyBzdWJwYXRoIGZvciBleGFjdGx5IHRoYXQgdHlwZS5cbmltcG9ydCB0eXBlIHsgUGx1Z2luTWFwIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9kaXN0L3NoYXJlZC9zcmMvcGx1Z2luXCI7XG5pbXBvcnQgeyBwcm9maWxlIGFzIGF1dGhQcm9maWxlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aFwiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuaW1wb3J0IHsgcmVzb2x2ZUF1dG9Db25maWd1cmVQb2xpY3kgfSBmcm9tIFwiLi9fYXV0by1jb25maWd1cmUudHNcIjtcbmltcG9ydCB7IGNyZWF0ZVNvZnRQZXJzaXN0ZW50U3RvcmFnZSB9IGZyb20gXCIuL19jYWNoZS1zdG9yYWdlLnRzXCI7XG5pbXBvcnQgeyBsb2FkQnJhbmRDb250ZXh0IH0gZnJvbSBcIi4vYnJhbmQtY29udGV4dC50c1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlSW50ZXJjZXB0b3JDb250ZXh0LFxuICB0eXBlIEludGVyY2VwdG9yLFxuICB0eXBlIEludGVyY2VwdG9yUnVudGltZSxcbiAgbGlmZWN5Y2xlQnJpZGdlLFxuICB0eXBlIFJlc29sdmVkQXBwRW52LFxufSBmcm9tIFwiLi9pbnRlcmNlcHRvci50c1wiO1xuaW1wb3J0IHsgYXBwbHlMYWtlYmFzZUVudiwgdHlwZSBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9sYWtlYmFzZS1yZXNvbHZlci50c1wiO1xuaW1wb3J0IHsgcHJvdmlzaW9uQ2FjaGVTY2hlbWEgfSBmcm9tIFwiLi9wcm92aXNpb24udHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdFwiKTtcblxudHlwZSBBcHBLaXRDcmVhdGVBcHBDb25maWcgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPHR5cGVvZiBhcHBraXRDcmVhdGVBcHA+WzBdPjtcbnR5cGUgQXBwS2l0UGx1Z2lucyA9IE5vbk51bGxhYmxlPEFwcEtpdENyZWF0ZUFwcENvbmZpZ1tcInBsdWdpbnNcIl0+O1xuXG4vKipcbiAqIFdoYXQgYXV0by1jb25maWd1cmF0aW9uIGRvZXMgYmVmb3JlIEFwcEtpdCBib290cy5cbiAqXG4gKiAtIGBcInByb3Zpc2lvblwiYDogcmVzb2x2ZSB0aGUgTGFrZWJhc2UgY29ubmVjdGlvbiBpbnRvIGBwcm9jZXNzLmVudmAsIHRoZW5cbiAqICAgZ3JhbnQgdGhlIEFwcEtpdCBjYWNoZSBzY2hlbWEgdG8gdGhlIGNvbm5lY3Rpbmcgcm9sZS5cbiAqIC0gYFwiZW52XCJgOiByZXNvbHZlIHRoZSBMYWtlYmFzZSBjb25uZWN0aW9uIGludG8gYHByb2Nlc3MuZW52YCBvbmx5LlxuICpcbiAqIE9taXQgaXQgdG8gcmVzb2x2ZSBkYXRhYmFzZSBlbnZpcm9ubWVudCB3aGVuIGEgbmF0aXZlIGBsYWtlYmFzZWAgb3JcbiAqIGBkYXRhYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQuIEltcGxpY2l0IGNhY2hlLXNjaGVtYSBncmFudHMgcmVtYWluIGdhdGVkIG9uXG4gKiBgbGFrZWJhc2VgOyBgZGF0YWJhc2VgIG93bnMgaXRzIG93biBwb29sIGFuZCBkb2VzIG5vdCBicm9hZGVuIGdyYW50cy4gU2V0IHRoZVxuICogbW9kZSBleHBsaWNpdGx5IHRvIHJ1biByZWdhcmRsZXNzIG9mIHRoZSBwbHVnaW4gbGlzdCwgb3IgcGFzcyBgZmFsc2VgIHRvIHNraXBcbiAqIGF1dG8tY29uZmlndXJhdGlvbiBlbnRpcmVseS5cbiAqXG4gKiBTZXQgaXQgRVhQTElDSVRMWSBvbiBhbiBhcHAgdGhhdCBoYXMgbm8gYGxha2ViYXNlKClgIHBsdWdpbiBidXQgc3RpbGwgd2FudHNcbiAqIEFwcEtpdCdzIFBFUlNJU1RFTlQgY2FjaGUuIEFwcEtpdCBwaWNrcyBMYWtlYmFzZSBmb3IgYENhY2hlTWFuYWdlcmAgb25seSB3aGVuXG4gKiBgY3JlYXRlTGFrZWJhc2VQb29sKClgIGNhbiBidWlsZCBhIHBvb2wsIGFuZCB0aGF0IHJlYWRzIGBMQUtFQkFTRV9FTkRQT0lOVGAgL1xuICogYFBHSE9TVGAgLyBgUEdEQVRBQkFTRWAgc3RyYWlnaHQgZnJvbSBgcHJvY2Vzcy5lbnZgIC0gc28gd2l0aG91dCB0aGlzIHN0ZXAgdGhlXG4gKiBjYWNoZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIGluLW1lbW9yeSwgYW5kIGFueXRoaW5nIGl0IGhvbGRzIChhIHNlc3Npb25cbiAqIHNpZ25pbmcga2V5LCBhIG9uZS10aW1lIGNvZGUpIGlzIGxvc3Qgb24gcmVzdGFydC4gYFwiZW52XCJgIGlzIHRoZSByaWdodCBtb2RlXG4gKiB0aGVyZTogdGhlIGFwcCBTUCBjYW5ub3QgZ3JhbnQgb24gdGhlIGNhY2hlIHNjaGVtYSBhbnl3YXkuXG4gKi9cbmV4cG9ydCB0eXBlIEF1dG9Db25maWd1cmVNb2RlID0gXCJlbnZcIiB8IFwicHJvdmlzaW9uXCI7XG5cbi8qKiBBcHBLaXQncyBgY3JlYXRlQXBwYCBjb25maWcgcGx1cyB0aGUgZGJ4LXRvb2xzIGF1dG8tY29uZmlndXJhdGlvbiBzd2l0Y2guICovXG5leHBvcnQgdHlwZSBDcmVhdGVBcHBDb25maWc8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnMgPSBBcHBLaXRQbHVnaW5zPiA9IE9taXQ8XG4gIEFwcEtpdENyZWF0ZUFwcENvbmZpZyxcbiAgXCJwbHVnaW5zXCIgfCBcIm9uUGx1Z2luc1JlYWR5XCJcbj4gJiB7XG4gIHBsdWdpbnM/OiBUO1xuICBvblBsdWdpbnNSZWFkeT86IChhcHBraXQ6IFBsdWdpbk1hcDxUPikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIC8qKiBBdXRvLWNvbmZpZ3VyYXRpb24gdG8gcnVuIGJlZm9yZSBBcHBLaXQgYm9vdHMuIERlZmF1bHRzIHRvIGBcInByb3Zpc2lvblwiYC4gKi9cbiAgYXV0b0NvbmZpZ3VyZT86IEF1dG9Db25maWd1cmVNb2RlIHwgZmFsc2U7XG4gIC8qKlxuICAgKiBPbmUgb3IgbWFueSB7QGxpbmsgSW50ZXJjZXB0b3J9cyBoYW5kZWQgYW4ge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gb25jZVxuICAgKiBhdXRvLWNvbmZpZ3VyYXRpb24gaGFzIGNvbXB1dGVkIHRoZSBlbnYuIEVhY2ggcmVjZWl2ZXMgdGhlIHJlc29sdmVkIGVudiwgYW5cbiAgICogQXBwS2l0LWxpZmVjeWNsZSBob29rLCBhbmQgYGJpbmRQcm9jZXNzYCBmb3IgY29uY3VycmVudGx5LXN0eWxlIHN1cGVydmlzaW9uIC1cbiAgICogc2VlIGAuL2ludGVyY2VwdG9yYC4gVGhlIHR1bm5lbCBpcyB0aGUgcHJpbWFyeSBjb25zdW1lci5cbiAgICovXG4gIGludGVyY2VwdG9yPzogSW50ZXJjZXB0b3IgfCBJbnRlcmNlcHRvcltdO1xufTtcblxuY29uc3QgTEFLRUJBU0VfUExVR0lOID0gXCJsYWtlYmFzZVwiO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIGJvb3QtdGltZSBhdXRvLWNvbmZpZ3VyYXRpb24uIEl0IHJ1bnMgYXMgdGhlIHNlcnZpY2UgcHJpbmNpcGFsXG4gKiBiZWZvcmUgYW55IHBsdWdpbiBpcyBjb25zdHJ1Y3RlZCwgc28gaXQgc2l0cyBvdXRzaWRlIEFwcEtpdCdzIGludGVyY2VwdG9yXG4gKiBjaGFpbiBhbmQgaW5oZXJpdHMgbm8gdGltZW91dCwgcmV0cnksIG9yIHRlbGVtZXRyeSBmcm9tIGl0LiBUaGUgYnVkZ2V0IGNvdmVyc1xuICogdGhlIHJlc29sdmVyJ3Mgb3duIHdvcnN0IGNhc2UgKGNyZWF0ZSBhIHByb2plY3QsIHRoZW4gd2FpdCBmb3IgaXRzIGVuZHBvaW50KVxuICogcGx1cyB0aGUgY2FjaGUtc2NoZW1hIGdyYW50cy5cbiAqL1xuY29uc3QgQVVUT19DT05GSUdVUkVfVElNRU9VVF9NUyA9IDExICogNjBfMDAwO1xuXG5mdW5jdGlvbiB1c2VzUGx1Z2luPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zPihcbiAgY29uZmlnOiBDcmVhdGVBcHBDb25maWc8VD4gfCB1bmRlZmluZWQsXG4gIG5hbWU6IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihjb25maWc/LnBsdWdpbnM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKSk7XG59XG5cbi8qKiBQbHVnaW4gbmFtZXMgZm9yIGJvb3QgbG9ncyAob3JkZXIgcHJlc2VydmVkKS4gKi9cbmZ1bmN0aW9uIHBsdWdpbk5hbWVzKGNvbmZpZzogQ3JlYXRlQXBwQ29uZmlnIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICByZXR1cm4gKGNvbmZpZz8ucGx1Z2lucyA/PyBbXSkubWFwKChlbnRyeSkgPT4gZW50cnkubmFtZSk7XG59XG5cbi8qKlxuICogUnVuIGVuYWJsZWQgYXV0by1jb25maWd1cmF0aW9uIHN0ZXBzIHdpdGhvdXQgY2FsbGluZyBBcHBLaXQncyBgY3JlYXRlQXBwYC5cbiAqXG4gKiBMYWtlYmFzZSBQb3N0Z3JlcyByZXNvbHZlcyB3aGVuIHtAbGluayBDcmVhdGVBcHBDb25maWcuYXV0b0NvbmZpZ3VyZX0gaXMgc2V0XG4gKiBleHBsaWNpdGx5IG9yIGEgbmF0aXZlIGBsYWtlYmFzZWAvYGRhdGFiYXNlYCBwbHVnaW4gaXMgbGlzdGVkIGluXG4gKiBgY29uZmlnLnBsdWdpbnNgLiBgc2lnbmFsYCBjYW5jZWxzIHRoZSByZXNvbHV0aW9uOyBpdCBpcyBjb21iaW5lZCB3aXRoIGFuXG4gKiBpbnRlcm5hbCBib290IHRpbWVvdXQgZWl0aGVyIHdheS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogLy8gUG9wdWxhdGUgUEdIT1NUIC8gUEdEQVRBQkFTRSAvIExBS0VCQVNFX0VORFBPSU5UIHdpdGhvdXQgYm9vdGluZyBBcHBLaXQuXG4gKiBhd2FpdCBhcHBraXQuYXV0b0NvbmZpZ3VyZSh7IGF1dG9Db25maWd1cmU6IFwiZW52XCIgfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRvQ29uZmlndXJlPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zPihcbiAgY29uZmlnPzogQ3JlYXRlQXBwQ29uZmlnPFQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGJ1bmRsZVByb2ZpbGUgPSBhcHBseURlZmF1bHRQcm9maWxlKCk7XG4gIGNvbnN0IHBsdWdpbnMgPSBwbHVnaW5OYW1lcyhjb25maWcpO1xuICBjb25zdCBwb2xpY3kgPSByZXNvbHZlQXV0b0NvbmZpZ3VyZVBvbGljeShwbHVnaW5zLCBjb25maWc/LmF1dG9Db25maWd1cmUpO1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiBzdGFydFwiLCB7XG4gICAgLi4ucG9saWN5LFxuICAgIHBsdWdpbnMsXG4gICAgdGltZW91dE1zOiBBVVRPX0NPTkZJR1VSRV9USU1FT1VUX01TLFxuICAgIGNhbGxlclNpZ25hbDogQm9vbGVhbihzaWduYWwpLFxuICB9KTtcblxuICBpZiAoIXBvbGljeS5zaG91bGRSZXNvbHZlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZTogc2tpcFwiLCB7IC4uLnBvbGljeSwgcGx1Z2lucyB9KTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGF1dG9Db25maWd1cmU6IHBvbGljeS5tb2RlLFxuICAgICAgbGFrZWJhc2VQbHVnaW5QcmVzZW50OiBwb2xpY3kubGFrZWJhc2VQbHVnaW5QcmVzZW50LFxuICAgICAgZGF0YWJhc2VQbHVnaW5QcmVzZW50OiBwb2xpY3kuZGF0YWJhc2VQbHVnaW5QcmVzZW50LFxuICAgICAgcHJvdmlzaW9uZWQ6IGZhbHNlLFxuICAgICAgc2tpcHBlZFJlYXNvbjogcG9saWN5LnNraXBwZWRSZWFzb24sXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGFzeW5jVXRpbHMudGllQWJvcnRTaWduYWwoY29udHJvbGxlciwgc2lnbmFsKTtcbiAgYXN5bmNVdGlscy50aWVBYm9ydFNpZ25hbChjb250cm9sbGVyLCBBYm9ydFNpZ25hbC50aW1lb3V0KEFVVE9fQ09ORklHVVJFX1RJTUVPVVRfTVMpKTtcblxuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiByZXNvbHZlIGxha2ViYXNlXCIsIHtcbiAgICBwcm92aXNpb246IHBvbGljeS5wcm92aXNpb24sXG4gICAgbW9kZTogcG9saWN5Lm1vZGUsXG4gIH0pO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGF1dG9Db25maWd1cmVMYWtlYmFzZShwb2xpY3kucHJvdmlzaW9uLCBjb250cm9sbGVyLnNpZ25hbCwgYnVuZGxlUHJvZmlsZSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmU6IGRvbmVcIiwge1xuICAgIG1vZGU6IHBvbGljeS5tb2RlLFxuICAgIGxha2ViYXNlUGx1Z2luUHJlc2VudDogcG9saWN5Lmxha2ViYXNlUGx1Z2luUHJlc2VudCxcbiAgICBkYXRhYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5kYXRhYmFzZVBsdWdpblByZXNlbnQsXG4gICAgcHJvdmlzaW9uZWQ6IHBvbGljeS5wcm92aXNpb24sXG4gICAgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSxcbiAgfSk7XG4gIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgIGF1dG9Db25maWd1cmU6IHBvbGljeS5tb2RlLFxuICAgIGxha2ViYXNlUGx1Z2luUHJlc2VudDogcG9saWN5Lmxha2ViYXNlUGx1Z2luUHJlc2VudCxcbiAgICBkYXRhYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5kYXRhYmFzZVBsdWdpblByZXNlbnQsXG4gICAgcHJvdmlzaW9uZWQ6IHBvbGljeS5wcm92aXNpb24sXG4gIH0pO1xuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBMYWtlYmFzZSBQb3N0Z3JlcyBjb25uZWN0aW9uIGluZm8sIHdyaXRlIHRoZSByZXNvbHZlZCB2YWx1ZXMgdG9cbiAqIGBwcm9jZXNzLmVudmAsIGFuZCByZXR1cm4gdGhlIHJlY29yZC4gVXNlZCBieSB7QGxpbmsgYXV0b0NvbmZpZ3VyZX07IGNhbGxcbiAqIHtAbGluayBhcHBseUxha2ViYXNlRW52fSBkaXJlY3RseSB3aGVuIGZpbmVyIGNvbnRyb2wgaXMgbmVlZGVkIChhIGRpZmZlcmVudFxuICogYGF1dG9DcmVhdGVgIHBvbGljeSwgb3IgYSBjYWxsZXIgdGhhdCB3YW50cyB0aGUgZW52IHdpdGhvdXQgYm9vdGluZyBBcHBLaXQpLlxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRvQ29uZmlndXJlTGFrZWJhc2UoXG4gIHByb3Zpc2lvbjogYm9vbGVhbixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgYnVuZGxlUHJvZmlsZT86IHN0cmluZyxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uPiB7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogYXBwbHlMYWtlYmFzZUVudlwiKTtcbiAgY29uc3QgeyByZXNvbHZlZCwgdXNlciB9ID0gYXdhaXQgYXBwbHlMYWtlYmFzZUVudih7IGJ1bmRsZVByb2ZpbGUgfSwgc2lnbmFsKTtcbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBlbnYgYXBwbGllZFwiLCB7XG4gICAgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSxcbiAgICB1c2VyLFxuICAgIGVudjoge1xuICAgICAgTEFLRUJBU0VfRU5EUE9JTlQ6IHByb2Nlc3MuZW52LkxBS0VCQVNFX0VORFBPSU5ULFxuICAgICAgUEdIT1NUOiBwcm9jZXNzLmVudi5QR0hPU1QsXG4gICAgICBQR1BPUlQ6IHByb2Nlc3MuZW52LlBHUE9SVCxcbiAgICAgIFBHREFUQUJBU0U6IHByb2Nlc3MuZW52LlBHREFUQUJBU0UsXG4gICAgICBQR1VTRVI6IHByb2Nlc3MuZW52LlBHVVNFUixcbiAgICAgIFBHU1NMTU9ERTogcHJvY2Vzcy5lbnYuUEdTU0xNT0RFLFxuICAgIH0sXG4gIH0pO1xuICBsb2dnZXIuaW5mbyhcImVudiB1cGRhdGVkXCIsIHsgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSwgdXNlciB9KTtcbiAgaWYgKHByb3Zpc2lvbikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogcHJvdmlzaW9uQ2FjaGVTY2hlbWFcIiwgeyB1c2VyIH0pO1xuICAgIGF3YWl0IHByb3Zpc2lvbkNhY2hlU2NoZW1hKHVzZXIsIGxvZ2dlcik7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBwcm92aXNpb25DYWNoZVNjaGVtYSBkb25lXCIpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogc2tpcCBwcm92aXNpb24gKG1vZGU9ZW52KVwiKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGVmYXVsdFByb2ZpbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlndXJlZCA9IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEU/LnRyaW0oKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhdXRoUHJvZmlsZS5yZXNvbHZlUHJvZmlsZShjb25maWd1cmVkID8geyBwcm9maWxlOiBjb25maWd1cmVkIH0gOiB7fSk7XG4gIGlmICghcmVzb2x2ZWQpIHtcbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19DT05GSUdfUFJPRklMRTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEUgPSByZXNvbHZlZC5uYW1lO1xuICByZXR1cm4gcmVzb2x2ZWQubmFtZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBjcmVhdGVBcHBgIHNob3VsZCBpbmplY3Qgc29mdC1mYWlsIExha2ViYXNlIGNhY2hlIHN0b3JhZ2UuXG4gKlxuICogU2tpcHMgd2hlbiB0aGUgY2FsbGVyIGRpc2FibGVkIHRoZSBjYWNoZSwgYWxyZWFkeSBzdXBwbGllZCBhIHN0b3JhZ2VcbiAqIGJhY2tlbmQgKGluY2x1ZGluZyBpbi1tZW1vcnkpLCBvciBMYWtlYmFzZSBpcyBub3QgaW4gcGxheS5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkSW5qZWN0U29mdFBlcnNpc3RlbnRDYWNoZShcbiAgY29uZmlnOiBDcmVhdGVBcHBDb25maWcgfCB1bmRlZmluZWQsXG4gIGxha2ViYXNlOiBMYWtlYmFzZUNvbm5lY3Rpb24gfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgY2FjaGUgPSBjb25maWc/LmNhY2hlO1xuICBpZiAoY2FjaGU/LmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjYWNoZT8uc3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gQm9vbGVhbihsYWtlYmFzZSkgfHwgdXNlc1BsdWdpbihjb25maWcsIExBS0VCQVNFX1BMVUdJTik7XG59XG5cbmZ1bmN0aW9uIHJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihyZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIHByb2plY3Q6IHJlc29sdmVkLnByb2plY3QsXG4gICAgYnJhbmNoOiByZXNvbHZlZC5icmFuY2gsXG4gICAgZW5kcG9pbnQ6IHJlc29sdmVkLmVuZHBvaW50LFxuICAgIGRhdGFiYXNlOiByZXNvbHZlZC5kYXRhYmFzZSxcbiAgICBob3N0OiByZXNvbHZlZC5ob3N0LFxuICAgIHBvcnQ6IHJlc29sdmVkLnBvcnQsXG4gICAgc3NsTW9kZTogcmVzb2x2ZWQuc3NsTW9kZSxcbiAgfTtcbn1cblxuLyoqIEJ1aWxkIHRoZSB7QGxpbmsgUmVzb2x2ZWRBcHBFbnZ9IGludGVyY2VwdG9ycyByZWFkLCBmcm9tIHRoZSBhdXRvLWNvbmZpZyByZXN1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlZEFwcEVudihsYWtlYmFzZTogTGFrZWJhc2VDb25uZWN0aW9uIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRBcHBFbnYge1xuICByZXR1cm4ge1xuICAgIC4uLihsYWtlYmFzZSA/IHsgbGFrZWJhc2UgfSA6IHt9KSxcbiAgICAuLi4ocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUID8geyBkYXRhYnJpY2tzSG9zdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBOb3JtYWxpemUgdGhlIGBpbnRlcmNlcHRvcj86IEludGVyY2VwdG9yIHwgSW50ZXJjZXB0b3JbXWAgb3B0aW9uIHRvIGFuIGFycmF5LiAqL1xuZnVuY3Rpb24gaW50ZXJjZXB0b3JMaXN0KGludGVyY2VwdG9yOiBDcmVhdGVBcHBDb25maWdbXCJpbnRlcmNlcHRvclwiXSk6IEludGVyY2VwdG9yW10ge1xuICBpZiAoIWludGVyY2VwdG9yKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGludGVyY2VwdG9yKSA/IGludGVyY2VwdG9yIDogW2ludGVyY2VwdG9yXTtcbn1cblxuLyoqXG4gKiBBdXRvLWNvbmZpZ3VyaW5nIGRyb3AtaW4gZm9yIEFwcEtpdCdzIGBjcmVhdGVBcHBgOiBzYW1lIGNvbmZpZywgc2FtZSB0eXBlZFxuICogcGx1Z2luLWV4cG9ydCBtYXAsIHdpdGgge0BsaW5rIGF1dG9Db25maWd1cmV9IHJ1biBmaXJzdC5cbiAqXG4gKiBXaGVuIHtAbGluayBDcmVhdGVBcHBDb25maWcuaW50ZXJjZXB0b3J9cyBhcmUgZ2l2ZW4sIGVhY2ggaXMgaW52b2tlZCB3aXRoIGFuXG4gKiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBBRlRFUiBhdXRvLWNvbmZpZ3VyYXRpb24gY29tcHV0ZXMgdGhlIGVudiBhbmQgQkVGT1JFXG4gKiBBcHBLaXQgYm9vdHMgLSBzbyBhbiBpbnRlcmNlcHRvciBjYW4gcmVhZCB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiwgcmVnaXN0ZXJcbiAqIGxpZmVjeWNsZSBoYW5kbGVycywgYW5kIGBiaW5kUHJvY2Vzc2AgYSBjaGlsZC4gQSBoaWRkZW4ge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX1cbiAqIHBsdWdpbiBpcyBpbmplY3RlZCBzbyB0aG9zZSBgb25MaWZlY3ljbGVgIGhhbmRsZXJzIGZpcmUgb24gdGhlIGdlbnVpbmUgQXBwS2l0XG4gKiBldmVudHM7IGl0IGhhcyBubyBleHBvcnRzLCBzbyB0aGUgcmV0dXJuZWQge0BsaW5rIFBsdWdpbk1hcH0gaXMgdW5jaGFuZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogY29uc3QgYXBwID0gYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtzZXJ2ZXIoKSwgbGFrZWJhc2UoKV0gfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBcHA8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc/OiBDcmVhdGVBcHBDb25maWc8VD4sXG4pOiBQcm9taXNlPFBsdWdpbk1hcDxUPj4ge1xuICBjb25zdCBwbHVnaW5zID0gcGx1Z2luTmFtZXMoY29uZmlnKTtcbiAgY29uc3QgaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0b3JMaXN0KGNvbmZpZz8uaW50ZXJjZXB0b3IpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IHN0YXJ0XCIsIHtcbiAgICBwbHVnaW5zLFxuICAgIHBsdWdpbkNvdW50OiBwbHVnaW5zLmxlbmd0aCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICAgIGF1dG9Db25maWd1cmU6IGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSA/PyBcIihkZWZhdWx0KVwiLFxuICAgIGhhc09uUGx1Z2luc1JlYWR5OiB0eXBlb2YgY29uZmlnPy5vblBsdWdpbnNSZWFkeSA9PT0gXCJmdW5jdGlvblwiLFxuICB9KTtcblxuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGF1dG9Db25maWd1cmVcIik7XG4gIGNvbnN0IGJyYW5kQ29udGV4dCA9IGF3YWl0IGxvYWRCcmFuZENvbnRleHQoKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBicmFuZCBjb250ZXh0IGxvYWRlZFwiLCB7IG5hbWU6IGJyYW5kQ29udGV4dC5uYW1lIH0pO1xuICBjb25zdCBsYWtlYmFzZSA9IGF3YWl0IGF1dG9Db25maWd1cmUoY29uZmlnKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBhdXRvQ29uZmlndXJlIHJldHVybmVkXCIsIHtcbiAgICBsYWtlYmFzZTogbGFrZWJhc2UgPyByZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24obGFrZWJhc2UpIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBhcHBDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuICBkZWxldGUgYXBwQ29uZmlnLmF1dG9Db25maWd1cmU7XG4gIGRlbGV0ZSBhcHBDb25maWcuaW50ZXJjZXB0b3I7XG5cbiAgaWYgKHNob3VsZEluamVjdFNvZnRQZXJzaXN0ZW50Q2FjaGUoY29uZmlnLCBsYWtlYmFzZSkpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGluamVjdCBzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgc3RvcmFnZVwiKTtcbiAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgY3JlYXRlU29mdFBlcnNpc3RlbnRTdG9yYWdlKGNvbmZpZz8uY2FjaGUpO1xuICAgIGlmIChzdG9yYWdlKSB7XG4gICAgICBhcHBDb25maWcuY2FjaGUgPSB7IC4uLmNvbmZpZz8uY2FjaGUsIHN0b3JhZ2UgfTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogc29mdCBwZXJzaXN0ZW50IGNhY2hlIHN0b3JhZ2UgcmVhZHlcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogc29mdCBwZXJzaXN0ZW50IGNhY2hlIHN0b3JhZ2UgdW5hdmFpbGFibGVcIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IG5vIGludGVyY2VwdG9yczsgZGVsZWdhdGluZyB0byBBcHBLaXQgY3JlYXRlQXBwXCIsIHtcbiAgICAgIHBsdWdpbnM6IHBsdWdpbk5hbWVzKGFwcENvbmZpZyksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwa2l0Q3JlYXRlQXBwPFQ+KGFwcENvbmZpZyk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBBcHBLaXQgY3JlYXRlQXBwIHJldHVybmVkXCIsIHtcbiAgICAgIGV4cG9ydEtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCA/PyB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBjb250ZXh0IGZyb20gdGhlIGNvbXB1dGVkIGVudiwgcnVuIGVhY2ggaW50ZXJjZXB0b3IgKHRoZXkgcmVnaXN0ZXJcbiAgLy8gbGlmZWN5Y2xlIGhhbmRsZXJzICsgYmluZCBwcm9jZXNzZXMpLCB0aGVuIGluamVjdCB0aGUgYnJpZGdlIHRoYXQgcmVsYXlzIHRoZVxuICAvLyBSRUFMIEFwcEtpdCBsaWZlY3ljbGUgaW50byBgcnVudGltZS5lbWl0TGlmZWN5Y2xlYCBkdXJpbmcgaXRzIGBzZXR1cCgpYC5cbiAgY29uc3QgZW52ID0gcmVzb2x2ZWRBcHBFbnYobGFrZWJhc2UpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGludGVyY2VwdG9yIGNvbnRleHRcIiwge1xuICAgIGhhc0xha2ViYXNlOiBCb29sZWFuKGVudi5sYWtlYmFzZSksXG4gICAgZGF0YWJyaWNrc0hvc3Q6IGVudi5kYXRhYnJpY2tzSG9zdCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICB9KTtcbiAgY29uc3QgcnVudGltZTogSW50ZXJjZXB0b3JSdW50aW1lID0gY3JlYXRlSW50ZXJjZXB0b3JDb250ZXh0KGVudik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJjZXB0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBydW4gaW50ZXJjZXB0b3JcIiwgeyBpbmRleDogaSwgb2Y6IGludGVyY2VwdG9ycy5sZW5ndGggfSk7XG4gICAgYXdhaXQgaW50ZXJjZXB0b3JzW2ldIShydW50aW1lLmNvbnRleHQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogaW50ZXJjZXB0b3IgZG9uZVwiLCB7IGluZGV4OiBpIH0pO1xuICB9XG4gIC8vIEFwcGVuZCB0aGUgYnJpZGdlIHRvIHRoZSBwbHVnaW5zIHR1cGxlLiBJdCBpcyBoaWRkZW4gYW5kIGV4cG9ydHMgbm90aGluZywgc29cbiAgLy8gdGhlIHJldHVybmVkIG1hcCBzdGlsbCBtYXRjaGVzIGBQbHVnaW5NYXA8VD5gOyB0aGUgY2FzdCAodGhyb3VnaCBgdW5rbm93bmApIGlzXG4gIC8vIG9ubHkgYmVjYXVzZSBhcHBlbmRpbmcgd2lkZW5zIHRoZSB0dXBsZSB0eXBlIGJleW9uZCBgVGAuXG4gIGFwcENvbmZpZy5wbHVnaW5zID0gWy4uLihhcHBDb25maWcucGx1Z2lucyA/PyBbXSksIGxpZmVjeWNsZUJyaWRnZSh7IHJ1bnRpbWUgfSldIGFzIHVua25vd24gYXMgVDtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBsaWZlY3ljbGUgYnJpZGdlIGluamVjdGVkOyBkZWxlZ2F0aW5nIHRvIEFwcEtpdCBjcmVhdGVBcHBcIiwge1xuICAgIHBsdWdpbnM6IHBsdWdpbk5hbWVzKGFwcENvbmZpZyksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBraXRDcmVhdGVBcHA8VD4oYXBwQ29uZmlnKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBBcHBLaXQgY3JlYXRlQXBwIHJldHVybmVkXCIsIHtcbiAgICBleHBvcnRLZXlzOiBPYmplY3Qua2V5cyhyZXN1bHQgPz8ge30pLFxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgQXBwS2l0IHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHJldHVybmVkIGJ5IGBnZXRFeGVjdXRpb25Db250ZXh0KClgXG4gKiAtIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgcGx1cyB0aGUgc3Vycm91bmRpbmcgcmVxdWVzdCBtZXRhZGF0YS5cbiAqIERlcml2ZWQgZnJvbSBBcHBLaXQncyBvd24gcmV0dXJuIHR5cGUgc28gaXQgdHJhY2tzIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiwgYW5kXG4gKiByZS1leHBvcnRlZCBoZXJlIHNvIGFkZC1vbiBwYWNrYWdlcyBjYW4gdHlwZSBhIGNvbnRleHQgcGFyYW1ldGVyIHdpdGhvdXQgZWFjaFxuICogcmUtZGVyaXZpbmcgdGhlIHNhbWUgYFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+YCBpbmxpbmUuXG4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGlvbkNvbnRleHRMaWtlID0gUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RXhlY3V0aW9uQ29udGV4dD47XG5cbi8qKlxuICogVGhlIGF1dGgtc2NvcGVkIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudCBjYXJyaWVkIG9uIGFuXG4gKiBgRXhlY3V0aW9uQ29udGV4dExpa2VgIChgZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudGApLiBUeXBlZCBzdHJ1Y3R1cmFsbHlcbiAqIG9mZiBBcHBLaXQgc28gY29uc3VtZXJzIGRvbid0IHRha2UgYSBkaXJlY3QgYEBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxgXG4gKiBkZXBlbmRlbmN5IC0gdGhlIGRlcCBmbG93cyBpbiB0cmFuc2l0aXZlbHkgdGhyb3VnaCBgQGRhdGFicmlja3MvYXBwa2l0YC5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IEV4ZWN1dGlvbkNvbnRleHRMaWtlW1wiY2xpZW50XCJdO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IEFwcEtpdCBleGVjdXRpb24gY29udGV4dCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBBcHBLaXQgaXNuJ3RcbiAqIGluaXRpYWxpemVkIChvdXRzaWRlIGEgcmVxdWVzdCBzY29wZSkuIFN3YWxsb3dzIEFwcEtpdCdzXG4gKiB7QGxpbmsgSW5pdGlhbGl6YXRpb25FcnJvcn07IGFueSBvdGhlciBlcnJvciBwcm9wYWdhdGVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqXG4gKiAvLyBPQk8tc2NvcGVkIGluc2lkZSBhIHJlcXVlc3QsIHNlcnZpY2UgcHJpbmNpcGFsIGZyb20gYSBDTEkgb3Igc2NyaXB0LlxuICogY29uc3QgY2xpZW50ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50ID8/IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpOiBFeGVjdXRpb25Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGlmIChjdHg/LmNsaWVudCkge1xuICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBJbml0aWFsaXphdGlvbkVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIGJhcmUgQXBwS2l0IGFwcCAobm8gcGx1Z2lucykgd2hlbiBub25lIGlzIHJ1bm5pbmcgeWV0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAqIGNvbnN0IGNsaWVudCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZW5zdXJlSW5pdGlhbGl6ZWQ6IGFscmVhZHkgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImVuc3VyZUluaXRpYWxpemVkOiBib290aW5nIGJhcmUgQXBwS2l0IGFwcFwiKTtcbiAgYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW10sIGF1dG9Db25maWd1cmU6IGZhbHNlIH0pO1xuICBsb2dnZXIuZGVidWcoXCJlbnN1cmVJbml0aWFsaXplZDogYmFyZSBBcHBLaXQgaW5pdGlhbGl6YXRpb24gY29tcGxldGVcIik7XG59XG4iXX0=
325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwa2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUgsT0FBTyxFQUNMLFNBQVMsSUFBSSxlQUFlLEVBQzVCLG1CQUFtQixFQUNuQixtQkFBbUIsR0FDcEIsTUFBTSxvQkFBb0IsQ0FBQztBQUk1QixPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUNMLHdCQUF3QixFQUd4QixlQUFlLEdBRWhCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUEyQixNQUFNLHdCQUF3QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFcEMsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDO0FBOEN0RSxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFFbkM7Ozs7OztHQU1HO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBRTlDLFNBQVMsVUFBVSxDQUNqQixNQUFzQyxFQUN0QyxJQUFZO0lBRVosT0FBTyxPQUFPLENBQUMsTUFB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QUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3ZELE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RCxNQUFNLENBQUMsS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHJ1bnRpbWUgZ2x1ZTogdGhlIGF1dG8tY29uZmlndXJpbmcgYGNyZWF0ZUFwcGAgZHJvcC1pbiwgcGx1cyB0aGVcbiAqIHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IGhlbHBlcnMgYW5kIHR5cGVzIGRlcml2ZWQgZnJvbSBpdC5cbiAqXG4gKiBgY3JlYXRlQXBwYCBydW5zIGRieC10b29scyBhdXRvLWNvbmZpZ3VyYXRpb24sIHRoZW4gZGVsZWdhdGVzIHRvIEFwcEtpdCdzIG93blxuICogYGNyZWF0ZUFwcGAgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgYW5kIHRoZSBzYW1lIHR5cGVkIHBsdWdpbi1leHBvcnQgbWFwLlxuICogRHJvcCBpdCBpbiBhcyBhIG9uZS1mb3Itb25lIHJlcGxhY2VtZW50OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtzZXJ2ZXIoKSwgbGFrZWJhc2UoKV0gfSk7XG4gKiBgYGBcbiAqXG4gKiBBdXRvLWNvbmZpZ3VyYXRpb24gcnVucyBCRUZPUkUgZGVsZWdhdGluZyBzbyBwbHVnaW5zIHNlZSBhIGZ1bGx5IHBvcHVsYXRlZFxuICogYHByb2Nlc3MuZW52YCBkdXJpbmcgdGhlaXIgc3luY2hyb25vdXMgYHNldHVwKClgLiBMYWtlYmFzZSBQb3N0Z3JlcyByZXNvbHV0aW9uXG4gKiBydW5zIHdoZW4gYSBuYXRpdmUgYGxha2ViYXNlYCBvciBgZGF0YWJhc2VgIHBsdWdpbiBpcyBwcmVzZW50LCBvciB3aGVuXG4gKiB7QGxpbmsgQXV0b0NvbmZpZ3VyZU1vZGV9IGlzIHNldCBleHBsaWNpdGx5IG9uIHRoZSBjb25maWcgb2JqZWN0LlxuICpcbiAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIGlzIEFwcEtpdCdzIG93biBhY2Nlc3NvciBmb3IgdGhlIE9CTy1zY29wZWQgd29ya3NwYWNlXG4gKiBjbGllbnQgKyByZXF1ZXN0IG1ldGFkYXRhOyB0aGUgd3JhcHBlcnMgaGVyZSBtYWtlIGl0IHNhZmUgdG8gY2FsbCBvdXRzaWRlIGFcbiAqIHJlcXVlc3Qgc2NvcGUgKHtAbGluayB0cnlHZXRFeGVjdXRpb25Db250ZXh0fSkgYW5kIHRvIGxhemlseSBib290IGEgYmFyZSBhcHBcbiAqICh7QGxpbmsgZW5zdXJlSW5pdGlhbGl6ZWR9KSwgYW5kIHJlLWV4cG9ydCB0aGUgZGVyaXZlZCB0eXBlcyBzbyBhZGQtb25cbiAqIHBhY2thZ2VzIGNhbiB0eXBlIGEgY29udGV4dCAvIGNsaWVudCB3aXRob3V0IHJlLWRlcml2aW5nIHRoZW0gaW5saW5lLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVBcHAgYXMgYXBwa2l0Q3JlYXRlQXBwLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBJbml0aWFsaXphdGlvbkVycm9yLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4vLyBBcHBLaXQncyByb290IGJhcnJlbCByZS1leHBvcnRzIGBQbHVnaW5EYXRhYCBidXQgbm90IGBQbHVnaW5NYXBgOyB0aGUgcGFja2FnZVxuLy8gcHVibGlzaGVzIHRoaXMgc3VicGF0aCBmb3IgZXhhY3RseSB0aGF0IHR5cGUuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hcCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvZGlzdC9zaGFyZWQvc3JjL3BsdWdpblwiO1xuaW1wb3J0IHsgcHJvZmlsZSBhcyBhdXRoUHJvZmlsZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2F1dGhcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMsIGVudmlyb25tZW50VXRpbHMsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB7IHJlc29sdmVBdXRvQ29uZmlndXJlUG9saWN5IH0gZnJvbSBcIi4vX2F1dG8tY29uZmlndXJlLnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVTb2Z0UGVyc2lzdGVudFN0b3JhZ2UgfSBmcm9tIFwiLi9fY2FjaGUtc3RvcmFnZS50c1wiO1xuaW1wb3J0IHsgbG9hZEJyYW5kQ29udGV4dCB9IGZyb20gXCIuL2JyYW5kLWNvbnRleHQudHNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUludGVyY2VwdG9yQ29udGV4dCxcbiAgdHlwZSBJbnRlcmNlcHRvcixcbiAgdHlwZSBJbnRlcmNlcHRvclJ1bnRpbWUsXG4gIGxpZmVjeWNsZUJyaWRnZSxcbiAgdHlwZSBSZXNvbHZlZEFwcEVudixcbn0gZnJvbSBcIi4vaW50ZXJjZXB0b3IudHNcIjtcbmltcG9ydCB7IGFwcGx5TGFrZWJhc2VFbnYsIHR5cGUgTGFrZWJhc2VDb25uZWN0aW9uIH0gZnJvbSBcIi4vbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmltcG9ydCB7IHByb3Zpc2lvbkNhY2hlU2NoZW1hIH0gZnJvbSBcIi4vcHJvdmlzaW9uLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXRcIik7XG5cbi8qKiBEZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBwcm9jZXNzIGlzIHJ1bm5pbmcgYXMgYSBkZXBsb3llZCBEYXRhYnJpY2tzIEFwcC4gKi9cbmV4cG9ydCBjb25zdCBpc0RhdGFicmlja3NBcHBFbnYgPSBlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudjtcblxudHlwZSBBcHBLaXRDcmVhdGVBcHBDb25maWcgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPHR5cGVvZiBhcHBraXRDcmVhdGVBcHA+WzBdPjtcbnR5cGUgQXBwS2l0UGx1Z2lucyA9IE5vbk51bGxhYmxlPEFwcEtpdENyZWF0ZUFwcENvbmZpZ1tcInBsdWdpbnNcIl0+O1xuXG4vKipcbiAqIFdoYXQgYXV0by1jb25maWd1cmF0aW9uIGRvZXMgYmVmb3JlIEFwcEtpdCBib290cy5cbiAqXG4gKiAtIGBcInByb3Zpc2lvblwiYDogcmVzb2x2ZSB0aGUgTGFrZWJhc2UgY29ubmVjdGlvbiBpbnRvIGBwcm9jZXNzLmVudmAsIHRoZW5cbiAqICAgZ3JhbnQgdGhlIEFwcEtpdCBjYWNoZSBzY2hlbWEgdG8gdGhlIGNvbm5lY3Rpbmcgcm9sZS5cbiAqIC0gYFwiZW52XCJgOiByZXNvbHZlIHRoZSBMYWtlYmFzZSBjb25uZWN0aW9uIGludG8gYHByb2Nlc3MuZW52YCBvbmx5LlxuICpcbiAqIE9taXQgaXQgdG8gcmVzb2x2ZSBkYXRhYmFzZSBlbnZpcm9ubWVudCB3aGVuIGEgbmF0aXZlIGBsYWtlYmFzZWAgb3JcbiAqIGBkYXRhYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQuIEltcGxpY2l0IGNhY2hlLXNjaGVtYSBncmFudHMgcmVtYWluIGdhdGVkIG9uXG4gKiBgbGFrZWJhc2VgOyBgZGF0YWJhc2VgIG93bnMgaXRzIG93biBwb29sIGFuZCBkb2VzIG5vdCBicm9hZGVuIGdyYW50cy4gU2V0IHRoZVxuICogbW9kZSBleHBsaWNpdGx5IHRvIHJ1biByZWdhcmRsZXNzIG9mIHRoZSBwbHVnaW4gbGlzdCwgb3IgcGFzcyBgZmFsc2VgIHRvIHNraXBcbiAqIGF1dG8tY29uZmlndXJhdGlvbiBlbnRpcmVseS5cbiAqXG4gKiBTZXQgaXQgRVhQTElDSVRMWSBvbiBhbiBhcHAgdGhhdCBoYXMgbm8gYGxha2ViYXNlKClgIHBsdWdpbiBidXQgc3RpbGwgd2FudHNcbiAqIEFwcEtpdCdzIFBFUlNJU1RFTlQgY2FjaGUuIEFwcEtpdCBwaWNrcyBMYWtlYmFzZSBmb3IgYENhY2hlTWFuYWdlcmAgb25seSB3aGVuXG4gKiBgY3JlYXRlTGFrZWJhc2VQb29sKClgIGNhbiBidWlsZCBhIHBvb2wsIGFuZCB0aGF0IHJlYWRzIGBMQUtFQkFTRV9FTkRQT0lOVGAgL1xuICogYFBHSE9TVGAgLyBgUEdEQVRBQkFTRWAgc3RyYWlnaHQgZnJvbSBgcHJvY2Vzcy5lbnZgIC0gc28gd2l0aG91dCB0aGlzIHN0ZXAgdGhlXG4gKiBjYWNoZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIGluLW1lbW9yeSwgYW5kIGFueXRoaW5nIGl0IGhvbGRzIChhIHNlc3Npb25cbiAqIHNpZ25pbmcga2V5LCBhIG9uZS10aW1lIGNvZGUpIGlzIGxvc3Qgb24gcmVzdGFydC4gYFwiZW52XCJgIGlzIHRoZSByaWdodCBtb2RlXG4gKiB0aGVyZTogdGhlIGFwcCBTUCBjYW5ub3QgZ3JhbnQgb24gdGhlIGNhY2hlIHNjaGVtYSBhbnl3YXkuXG4gKi9cbmV4cG9ydCB0eXBlIEF1dG9Db25maWd1cmVNb2RlID0gXCJlbnZcIiB8IFwicHJvdmlzaW9uXCI7XG5cbi8qKiBBcHBLaXQncyBgY3JlYXRlQXBwYCBjb25maWcgcGx1cyB0aGUgZGJ4LXRvb2xzIGF1dG8tY29uZmlndXJhdGlvbiBzd2l0Y2guICovXG5leHBvcnQgdHlwZSBDcmVhdGVBcHBDb25maWc8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnMgPSBBcHBLaXRQbHVnaW5zPiA9IE9taXQ8XG4gIEFwcEtpdENyZWF0ZUFwcENvbmZpZyxcbiAgXCJwbHVnaW5zXCIgfCBcIm9uUGx1Z2luc1JlYWR5XCJcbj4gJiB7XG4gIHBsdWdpbnM/OiBUO1xuICBvblBsdWdpbnNSZWFkeT86IChhcHBraXQ6IFBsdWdpbk1hcDxUPikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIC8qKiBBdXRvLWNvbmZpZ3VyYXRpb24gdG8gcnVuIGJlZm9yZSBBcHBLaXQgYm9vdHMuIERlZmF1bHRzIHRvIGBcInByb3Zpc2lvblwiYC4gKi9cbiAgYXV0b0NvbmZpZ3VyZT86IEF1dG9Db25maWd1cmVNb2RlIHwgZmFsc2U7XG4gIC8qKlxuICAgKiBPbmUgb3IgbWFueSB7QGxpbmsgSW50ZXJjZXB0b3J9cyBoYW5kZWQgYW4ge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gb25jZVxuICAgKiBhdXRvLWNvbmZpZ3VyYXRpb24gaGFzIGNvbXB1dGVkIHRoZSBlbnYuIEVhY2ggcmVjZWl2ZXMgdGhlIHJlc29sdmVkIGVudiwgYW5cbiAgICogQXBwS2l0LWxpZmVjeWNsZSBob29rLCBhbmQgYGJpbmRQcm9jZXNzYCBmb3IgY29uY3VycmVudGx5LXN0eWxlIHN1cGVydmlzaW9uIC1cbiAgICogc2VlIGAuL2ludGVyY2VwdG9yYC4gVGhlIHR1bm5lbCBpcyB0aGUgcHJpbWFyeSBjb25zdW1lci5cbiAgICovXG4gIGludGVyY2VwdG9yPzogSW50ZXJjZXB0b3IgfCBJbnRlcmNlcHRvcltdO1xufTtcblxuY29uc3QgTEFLRUJBU0VfUExVR0lOID0gXCJsYWtlYmFzZVwiO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIGJvb3QtdGltZSBhdXRvLWNvbmZpZ3VyYXRpb24uIEl0IHJ1bnMgYXMgdGhlIHNlcnZpY2UgcHJpbmNpcGFsXG4gKiBiZWZvcmUgYW55IHBsdWdpbiBpcyBjb25zdHJ1Y3RlZCwgc28gaXQgc2l0cyBvdXRzaWRlIEFwcEtpdCdzIGludGVyY2VwdG9yXG4gKiBjaGFpbiBhbmQgaW5oZXJpdHMgbm8gdGltZW91dCwgcmV0cnksIG9yIHRlbGVtZXRyeSBmcm9tIGl0LiBUaGUgYnVkZ2V0IGNvdmVyc1xuICogdGhlIHJlc29sdmVyJ3Mgb3duIHdvcnN0IGNhc2UgKGNyZWF0ZSBhIHByb2plY3QsIHRoZW4gd2FpdCBmb3IgaXRzIGVuZHBvaW50KVxuICogcGx1cyB0aGUgY2FjaGUtc2NoZW1hIGdyYW50cy5cbiAqL1xuY29uc3QgQVVUT19DT05GSUdVUkVfVElNRU9VVF9NUyA9IDExICogNjBfMDAwO1xuXG5mdW5jdGlvbiB1c2VzUGx1Z2luPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zPihcbiAgY29uZmlnOiBDcmVhdGVBcHBDb25maWc8VD4gfCB1bmRlZmluZWQsXG4gIG5hbWU6IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihjb25maWc/LnBsdWdpbnM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKSk7XG59XG5cbi8qKiBQbHVnaW4gbmFtZXMgZm9yIGJvb3QgbG9ncyAob3JkZXIgcHJlc2VydmVkKS4gKi9cbmZ1bmN0aW9uIHBsdWdpbk5hbWVzKGNvbmZpZzogQ3JlYXRlQXBwQ29uZmlnIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICByZXR1cm4gKGNvbmZpZz8ucGx1Z2lucyA/PyBbXSkubWFwKChlbnRyeSkgPT4gZW50cnkubmFtZSk7XG59XG5cbi8qKlxuICogUnVuIGVuYWJsZWQgYXV0by1jb25maWd1cmF0aW9uIHN0ZXBzIHdpdGhvdXQgY2FsbGluZyBBcHBLaXQncyBgY3JlYXRlQXBwYC5cbiAqXG4gKiBMYWtlYmFzZSBQb3N0Z3JlcyByZXNvbHZlcyB3aGVuIHtAbGluayBDcmVhdGVBcHBDb25maWcuYXV0b0NvbmZpZ3VyZX0gaXMgc2V0XG4gKiBleHBsaWNpdGx5IG9yIGEgbmF0aXZlIGBsYWtlYmFzZWAvYGRhdGFiYXNlYCBwbHVnaW4gaXMgbGlzdGVkIGluXG4gKiBgY29uZmlnLnBsdWdpbnNgLiBgc2lnbmFsYCBjYW5jZWxzIHRoZSByZXNvbHV0aW9uOyBpdCBpcyBjb21iaW5lZCB3aXRoIGFuXG4gKiBpbnRlcm5hbCBib290IHRpbWVvdXQgZWl0aGVyIHdheS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogLy8gUG9wdWxhdGUgUEdIT1NUIC8gUEdEQVRBQkFTRSAvIExBS0VCQVNFX0VORFBPSU5UIHdpdGhvdXQgYm9vdGluZyBBcHBLaXQuXG4gKiBhd2FpdCBhcHBraXQuYXV0b0NvbmZpZ3VyZSh7IGF1dG9Db25maWd1cmU6IFwiZW52XCIgfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRvQ29uZmlndXJlPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zPihcbiAgY29uZmlnPzogQ3JlYXRlQXBwQ29uZmlnPFQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGJ1bmRsZVByb2ZpbGUgPSBhcHBseURlZmF1bHRQcm9maWxlKCk7XG4gIGNvbnN0IHBsdWdpbnMgPSBwbHVnaW5OYW1lcyhjb25maWcpO1xuICBjb25zdCBwb2xpY3kgPSByZXNvbHZlQXV0b0NvbmZpZ3VyZVBvbGljeShwbHVnaW5zLCBjb25maWc/LmF1dG9Db25maWd1cmUpO1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiBzdGFydFwiLCB7XG4gICAgLi4ucG9saWN5LFxuICAgIHBsdWdpbnMsXG4gICAgdGltZW91dE1zOiBBVVRPX0NPTkZJR1VSRV9USU1FT1VUX01TLFxuICAgIGNhbGxlclNpZ25hbDogQm9vbGVhbihzaWduYWwpLFxuICB9KTtcblxuICBpZiAoIXBvbGljeS5zaG91bGRSZXNvbHZlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZTogc2tpcFwiLCB7IC4uLnBvbGljeSwgcGx1Z2lucyB9KTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGF1dG9Db25maWd1cmU6IHBvbGljeS5tb2RlLFxuICAgICAgbGFrZWJhc2VQbHVnaW5QcmVzZW50OiBwb2xpY3kubGFrZWJhc2VQbHVnaW5QcmVzZW50LFxuICAgICAgZGF0YWJhc2VQbHVnaW5QcmVzZW50OiBwb2xpY3kuZGF0YWJhc2VQbHVnaW5QcmVzZW50LFxuICAgICAgcHJvdmlzaW9uZWQ6IGZhbHNlLFxuICAgICAgc2tpcHBlZFJlYXNvbjogcG9saWN5LnNraXBwZWRSZWFzb24sXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGFzeW5jVXRpbHMudGllQWJvcnRTaWduYWwoY29udHJvbGxlciwgc2lnbmFsKTtcbiAgYXN5bmNVdGlscy50aWVBYm9ydFNpZ25hbChjb250cm9sbGVyLCBBYm9ydFNpZ25hbC50aW1lb3V0KEFVVE9fQ09ORklHVVJFX1RJTUVPVVRfTVMpKTtcblxuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiByZXNvbHZlIGxha2ViYXNlXCIsIHtcbiAgICBwcm92aXNpb246IHBvbGljeS5wcm92aXNpb24sXG4gICAgbW9kZTogcG9saWN5Lm1vZGUsXG4gIH0pO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGF1dG9Db25maWd1cmVMYWtlYmFzZShwb2xpY3kucHJvdmlzaW9uLCBjb250cm9sbGVyLnNpZ25hbCwgYnVuZGxlUHJvZmlsZSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmU6IGRvbmVcIiwge1xuICAgIG1vZGU6IHBvbGljeS5tb2RlLFxuICAgIGxha2ViYXNlUGx1Z2luUHJlc2VudDogcG9saWN5Lmxha2ViYXNlUGx1Z2luUHJlc2VudCxcbiAgICBkYXRhYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5kYXRhYmFzZVBsdWdpblByZXNlbnQsXG4gICAgcHJvdmlzaW9uZWQ6IHBvbGljeS5wcm92aXNpb24sXG4gICAgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSxcbiAgfSk7XG4gIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgIGF1dG9Db25maWd1cmU6IHBvbGljeS5tb2RlLFxuICAgIGxha2ViYXNlUGx1Z2luUHJlc2VudDogcG9saWN5Lmxha2ViYXNlUGx1Z2luUHJlc2VudCxcbiAgICBkYXRhYmFzZVBsdWdpblByZXNlbnQ6IHBvbGljeS5kYXRhYmFzZVBsdWdpblByZXNlbnQsXG4gICAgcHJvdmlzaW9uZWQ6IHBvbGljeS5wcm92aXNpb24sXG4gIH0pO1xuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBMYWtlYmFzZSBQb3N0Z3JlcyBjb25uZWN0aW9uIGluZm8sIHdyaXRlIHRoZSByZXNvbHZlZCB2YWx1ZXMgdG9cbiAqIGBwcm9jZXNzLmVudmAsIGFuZCByZXR1cm4gdGhlIHJlY29yZC4gVXNlZCBieSB7QGxpbmsgYXV0b0NvbmZpZ3VyZX07IGNhbGxcbiAqIHtAbGluayBhcHBseUxha2ViYXNlRW52fSBkaXJlY3RseSB3aGVuIGZpbmVyIGNvbnRyb2wgaXMgbmVlZGVkIChhIGRpZmZlcmVudFxuICogYGF1dG9DcmVhdGVgIHBvbGljeSwgb3IgYSBjYWxsZXIgdGhhdCB3YW50cyB0aGUgZW52IHdpdGhvdXQgYm9vdGluZyBBcHBLaXQpLlxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRvQ29uZmlndXJlTGFrZWJhc2UoXG4gIHByb3Zpc2lvbjogYm9vbGVhbixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgYnVuZGxlUHJvZmlsZT86IHN0cmluZyxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uPiB7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogYXBwbHlMYWtlYmFzZUVudlwiKTtcbiAgY29uc3QgeyByZXNvbHZlZCwgdXNlciB9ID0gYXdhaXQgYXBwbHlMYWtlYmFzZUVudih7IGJ1bmRsZVByb2ZpbGUgfSwgc2lnbmFsKTtcbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBlbnYgYXBwbGllZFwiLCB7XG4gICAgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSxcbiAgICB1c2VyLFxuICAgIGVudjoge1xuICAgICAgTEFLRUJBU0VfRU5EUE9JTlQ6IHByb2Nlc3MuZW52LkxBS0VCQVNFX0VORFBPSU5ULFxuICAgICAgUEdIT1NUOiBwcm9jZXNzLmVudi5QR0hPU1QsXG4gICAgICBQR1BPUlQ6IHByb2Nlc3MuZW52LlBHUE9SVCxcbiAgICAgIFBHREFUQUJBU0U6IHByb2Nlc3MuZW52LlBHREFUQUJBU0UsXG4gICAgICBQR1VTRVI6IHByb2Nlc3MuZW52LlBHVVNFUixcbiAgICAgIFBHU1NMTU9ERTogcHJvY2Vzcy5lbnYuUEdTU0xNT0RFLFxuICAgIH0sXG4gIH0pO1xuICBsb2dnZXIuaW5mbyhcImVudiB1cGRhdGVkXCIsIHsgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSwgdXNlciB9KTtcbiAgaWYgKHByb3Zpc2lvbikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogcHJvdmlzaW9uQ2FjaGVTY2hlbWFcIiwgeyB1c2VyIH0pO1xuICAgIGF3YWl0IHByb3Zpc2lvbkNhY2hlU2NoZW1hKHVzZXIsIGxvZ2dlcik7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBwcm92aXNpb25DYWNoZVNjaGVtYSBkb25lXCIpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogc2tpcCBwcm92aXNpb24gKG1vZGU9ZW52KVwiKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGVmYXVsdFByb2ZpbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlndXJlZCA9IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEU/LnRyaW0oKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhdXRoUHJvZmlsZS5yZXNvbHZlUHJvZmlsZShjb25maWd1cmVkID8geyBwcm9maWxlOiBjb25maWd1cmVkIH0gOiB7fSk7XG4gIGlmICghcmVzb2x2ZWQpIHtcbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19DT05GSUdfUFJPRklMRTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEUgPSByZXNvbHZlZC5uYW1lO1xuICByZXR1cm4gcmVzb2x2ZWQubmFtZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBjcmVhdGVBcHBgIHNob3VsZCBpbmplY3Qgc29mdC1mYWlsIExha2ViYXNlIGNhY2hlIHN0b3JhZ2UuXG4gKlxuICogU2tpcHMgd2hlbiB0aGUgY2FsbGVyIGRpc2FibGVkIHRoZSBjYWNoZSwgYWxyZWFkeSBzdXBwbGllZCBhIHN0b3JhZ2VcbiAqIGJhY2tlbmQgKGluY2x1ZGluZyBpbi1tZW1vcnkpLCBvciBMYWtlYmFzZSBpcyBub3QgaW4gcGxheS5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkSW5qZWN0U29mdFBlcnNpc3RlbnRDYWNoZShcbiAgY29uZmlnOiBDcmVhdGVBcHBDb25maWcgfCB1bmRlZmluZWQsXG4gIGxha2ViYXNlOiBMYWtlYmFzZUNvbm5lY3Rpb24gfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgY2FjaGUgPSBjb25maWc/LmNhY2hlO1xuICBpZiAoY2FjaGU/LmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjYWNoZT8uc3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gQm9vbGVhbihsYWtlYmFzZSkgfHwgdXNlc1BsdWdpbihjb25maWcsIExBS0VCQVNFX1BMVUdJTik7XG59XG5cbmZ1bmN0aW9uIHJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihyZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIHByb2plY3Q6IHJlc29sdmVkLnByb2plY3QsXG4gICAgYnJhbmNoOiByZXNvbHZlZC5icmFuY2gsXG4gICAgZW5kcG9pbnQ6IHJlc29sdmVkLmVuZHBvaW50LFxuICAgIGRhdGFiYXNlOiByZXNvbHZlZC5kYXRhYmFzZSxcbiAgICBob3N0OiByZXNvbHZlZC5ob3N0LFxuICAgIHBvcnQ6IHJlc29sdmVkLnBvcnQsXG4gICAgc3NsTW9kZTogcmVzb2x2ZWQuc3NsTW9kZSxcbiAgfTtcbn1cblxuLyoqIEJ1aWxkIHRoZSB7QGxpbmsgUmVzb2x2ZWRBcHBFbnZ9IGludGVyY2VwdG9ycyByZWFkLCBmcm9tIHRoZSBhdXRvLWNvbmZpZyByZXN1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlZEFwcEVudihsYWtlYmFzZTogTGFrZWJhc2VDb25uZWN0aW9uIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRBcHBFbnYge1xuICByZXR1cm4ge1xuICAgIC4uLihsYWtlYmFzZSA/IHsgbGFrZWJhc2UgfSA6IHt9KSxcbiAgICAuLi4ocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUID8geyBkYXRhYnJpY2tzSG9zdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBOb3JtYWxpemUgdGhlIGBpbnRlcmNlcHRvcj86IEludGVyY2VwdG9yIHwgSW50ZXJjZXB0b3JbXWAgb3B0aW9uIHRvIGFuIGFycmF5LiAqL1xuZnVuY3Rpb24gaW50ZXJjZXB0b3JMaXN0KGludGVyY2VwdG9yOiBDcmVhdGVBcHBDb25maWdbXCJpbnRlcmNlcHRvclwiXSk6IEludGVyY2VwdG9yW10ge1xuICBpZiAoIWludGVyY2VwdG9yKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGludGVyY2VwdG9yKSA/IGludGVyY2VwdG9yIDogW2ludGVyY2VwdG9yXTtcbn1cblxuLyoqXG4gKiBBdXRvLWNvbmZpZ3VyaW5nIGRyb3AtaW4gZm9yIEFwcEtpdCdzIGBjcmVhdGVBcHBgOiBzYW1lIGNvbmZpZywgc2FtZSB0eXBlZFxuICogcGx1Z2luLWV4cG9ydCBtYXAsIHdpdGgge0BsaW5rIGF1dG9Db25maWd1cmV9IHJ1biBmaXJzdC5cbiAqXG4gKiBXaGVuIHtAbGluayBDcmVhdGVBcHBDb25maWcuaW50ZXJjZXB0b3J9cyBhcmUgZ2l2ZW4sIGVhY2ggaXMgaW52b2tlZCB3aXRoIGFuXG4gKiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBBRlRFUiBhdXRvLWNvbmZpZ3VyYXRpb24gY29tcHV0ZXMgdGhlIGVudiBhbmQgQkVGT1JFXG4gKiBBcHBLaXQgYm9vdHMgLSBzbyBhbiBpbnRlcmNlcHRvciBjYW4gcmVhZCB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiwgcmVnaXN0ZXJcbiAqIGxpZmVjeWNsZSBoYW5kbGVycywgYW5kIGBiaW5kUHJvY2Vzc2AgYSBjaGlsZC4gQSBoaWRkZW4ge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX1cbiAqIHBsdWdpbiBpcyBpbmplY3RlZCBzbyB0aG9zZSBgb25MaWZlY3ljbGVgIGhhbmRsZXJzIGZpcmUgb24gdGhlIGdlbnVpbmUgQXBwS2l0XG4gKiBldmVudHM7IGl0IGhhcyBubyBleHBvcnRzLCBzbyB0aGUgcmV0dXJuZWQge0BsaW5rIFBsdWdpbk1hcH0gaXMgdW5jaGFuZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogY29uc3QgYXBwID0gYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtzZXJ2ZXIoKSwgbGFrZWJhc2UoKV0gfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBcHA8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc/OiBDcmVhdGVBcHBDb25maWc8VD4sXG4pOiBQcm9taXNlPFBsdWdpbk1hcDxUPj4ge1xuICBjb25zdCBwbHVnaW5zID0gcGx1Z2luTmFtZXMoY29uZmlnKTtcbiAgY29uc3QgaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0b3JMaXN0KGNvbmZpZz8uaW50ZXJjZXB0b3IpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IHN0YXJ0XCIsIHtcbiAgICBwbHVnaW5zLFxuICAgIHBsdWdpbkNvdW50OiBwbHVnaW5zLmxlbmd0aCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICAgIGF1dG9Db25maWd1cmU6IGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSA/PyBcIihkZWZhdWx0KVwiLFxuICAgIGhhc09uUGx1Z2luc1JlYWR5OiB0eXBlb2YgY29uZmlnPy5vblBsdWdpbnNSZWFkeSA9PT0gXCJmdW5jdGlvblwiLFxuICB9KTtcblxuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGF1dG9Db25maWd1cmVcIik7XG4gIGNvbnN0IGJyYW5kQ29udGV4dCA9IGF3YWl0IGxvYWRCcmFuZENvbnRleHQoKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBicmFuZCBjb250ZXh0IGxvYWRlZFwiLCB7IG5hbWU6IGJyYW5kQ29udGV4dC5uYW1lIH0pO1xuICBjb25zdCBsYWtlYmFzZSA9IGF3YWl0IGF1dG9Db25maWd1cmUoY29uZmlnKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBhdXRvQ29uZmlndXJlIHJldHVybmVkXCIsIHtcbiAgICBsYWtlYmFzZTogbGFrZWJhc2UgPyByZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24obGFrZWJhc2UpIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBhcHBDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuICBkZWxldGUgYXBwQ29uZmlnLmF1dG9Db25maWd1cmU7XG4gIGRlbGV0ZSBhcHBDb25maWcuaW50ZXJjZXB0b3I7XG5cbiAgaWYgKHNob3VsZEluamVjdFNvZnRQZXJzaXN0ZW50Q2FjaGUoY29uZmlnLCBsYWtlYmFzZSkpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGluamVjdCBzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgc3RvcmFnZVwiKTtcbiAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgY3JlYXRlU29mdFBlcnNpc3RlbnRTdG9yYWdlKGNvbmZpZz8uY2FjaGUpO1xuICAgIGlmIChzdG9yYWdlKSB7XG4gICAgICBhcHBDb25maWcuY2FjaGUgPSB7IC4uLmNvbmZpZz8uY2FjaGUsIHN0b3JhZ2UgfTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogc29mdCBwZXJzaXN0ZW50IGNhY2hlIHN0b3JhZ2UgcmVhZHlcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogc29mdCBwZXJzaXN0ZW50IGNhY2hlIHN0b3JhZ2UgdW5hdmFpbGFibGVcIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IG5vIGludGVyY2VwdG9yczsgZGVsZWdhdGluZyB0byBBcHBLaXQgY3JlYXRlQXBwXCIsIHtcbiAgICAgIHBsdWdpbnM6IHBsdWdpbk5hbWVzKGFwcENvbmZpZyksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwa2l0Q3JlYXRlQXBwPFQ+KGFwcENvbmZpZyk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBBcHBLaXQgY3JlYXRlQXBwIHJldHVybmVkXCIsIHtcbiAgICAgIGV4cG9ydEtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCA/PyB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBjb250ZXh0IGZyb20gdGhlIGNvbXB1dGVkIGVudiwgcnVuIGVhY2ggaW50ZXJjZXB0b3IgKHRoZXkgcmVnaXN0ZXJcbiAgLy8gbGlmZWN5Y2xlIGhhbmRsZXJzICsgYmluZCBwcm9jZXNzZXMpLCB0aGVuIGluamVjdCB0aGUgYnJpZGdlIHRoYXQgcmVsYXlzIHRoZVxuICAvLyBSRUFMIEFwcEtpdCBsaWZlY3ljbGUgaW50byBgcnVudGltZS5lbWl0TGlmZWN5Y2xlYCBkdXJpbmcgaXRzIGBzZXR1cCgpYC5cbiAgY29uc3QgZW52ID0gcmVzb2x2ZWRBcHBFbnYobGFrZWJhc2UpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGludGVyY2VwdG9yIGNvbnRleHRcIiwge1xuICAgIGhhc0xha2ViYXNlOiBCb29sZWFuKGVudi5sYWtlYmFzZSksXG4gICAgZGF0YWJyaWNrc0hvc3Q6IGVudi5kYXRhYnJpY2tzSG9zdCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICB9KTtcbiAgY29uc3QgcnVudGltZTogSW50ZXJjZXB0b3JSdW50aW1lID0gY3JlYXRlSW50ZXJjZXB0b3JDb250ZXh0KGVudik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJjZXB0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBydW4gaW50ZXJjZXB0b3JcIiwgeyBpbmRleDogaSwgb2Y6IGludGVyY2VwdG9ycy5sZW5ndGggfSk7XG4gICAgYXdhaXQgaW50ZXJjZXB0b3JzW2ldIShydW50aW1lLmNvbnRleHQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogaW50ZXJjZXB0b3IgZG9uZVwiLCB7IGluZGV4OiBpIH0pO1xuICB9XG4gIC8vIEFwcGVuZCB0aGUgYnJpZGdlIHRvIHRoZSBwbHVnaW5zIHR1cGxlLiBJdCBpcyBoaWRkZW4gYW5kIGV4cG9ydHMgbm90aGluZywgc29cbiAgLy8gdGhlIHJldHVybmVkIG1hcCBzdGlsbCBtYXRjaGVzIGBQbHVnaW5NYXA8VD5gOyB0aGUgY2FzdCAodGhyb3VnaCBgdW5rbm93bmApIGlzXG4gIC8vIG9ubHkgYmVjYXVzZSBhcHBlbmRpbmcgd2lkZW5zIHRoZSB0dXBsZSB0eXBlIGJleW9uZCBgVGAuXG4gIGFwcENvbmZpZy5wbHVnaW5zID0gWy4uLihhcHBDb25maWcucGx1Z2lucyA/PyBbXSksIGxpZmVjeWNsZUJyaWRnZSh7IHJ1bnRpbWUgfSldIGFzIHVua25vd24gYXMgVDtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBsaWZlY3ljbGUgYnJpZGdlIGluamVjdGVkOyBkZWxlZ2F0aW5nIHRvIEFwcEtpdCBjcmVhdGVBcHBcIiwge1xuICAgIHBsdWdpbnM6IHBsdWdpbk5hbWVzKGFwcENvbmZpZyksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBraXRDcmVhdGVBcHA8VD4oYXBwQ29uZmlnKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBBcHBLaXQgY3JlYXRlQXBwIHJldHVybmVkXCIsIHtcbiAgICBleHBvcnRLZXlzOiBPYmplY3Qua2V5cyhyZXN1bHQgPz8ge30pLFxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgQXBwS2l0IHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHJldHVybmVkIGJ5IGBnZXRFeGVjdXRpb25Db250ZXh0KClgXG4gKiAtIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgcGx1cyB0aGUgc3Vycm91bmRpbmcgcmVxdWVzdCBtZXRhZGF0YS5cbiAqIERlcml2ZWQgZnJvbSBBcHBLaXQncyBvd24gcmV0dXJuIHR5cGUgc28gaXQgdHJhY2tzIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiwgYW5kXG4gKiByZS1leHBvcnRlZCBoZXJlIHNvIGFkZC1vbiBwYWNrYWdlcyBjYW4gdHlwZSBhIGNvbnRleHQgcGFyYW1ldGVyIHdpdGhvdXQgZWFjaFxuICogcmUtZGVyaXZpbmcgdGhlIHNhbWUgYFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+YCBpbmxpbmUuXG4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGlvbkNvbnRleHRMaWtlID0gUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RXhlY3V0aW9uQ29udGV4dD47XG5cbi8qKlxuICogVGhlIGF1dGgtc2NvcGVkIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudCBjYXJyaWVkIG9uIGFuXG4gKiBgRXhlY3V0aW9uQ29udGV4dExpa2VgIChgZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudGApLiBUeXBlZCBzdHJ1Y3R1cmFsbHlcbiAqIG9mZiBBcHBLaXQgc28gY29uc3VtZXJzIGRvbid0IHRha2UgYSBkaXJlY3QgYEBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxgXG4gKiBkZXBlbmRlbmN5IC0gdGhlIGRlcCBmbG93cyBpbiB0cmFuc2l0aXZlbHkgdGhyb3VnaCBgQGRhdGFicmlja3MvYXBwa2l0YC5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IEV4ZWN1dGlvbkNvbnRleHRMaWtlW1wiY2xpZW50XCJdO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IEFwcEtpdCBleGVjdXRpb24gY29udGV4dCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBBcHBLaXQgaXNuJ3RcbiAqIGluaXRpYWxpemVkIChvdXRzaWRlIGEgcmVxdWVzdCBzY29wZSkuIFN3YWxsb3dzIEFwcEtpdCdzXG4gKiB7QGxpbmsgSW5pdGlhbGl6YXRpb25FcnJvcn07IGFueSBvdGhlciBlcnJvciBwcm9wYWdhdGVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqXG4gKiAvLyBPQk8tc2NvcGVkIGluc2lkZSBhIHJlcXVlc3QsIHNlcnZpY2UgcHJpbmNpcGFsIGZyb20gYSBDTEkgb3Igc2NyaXB0LlxuICogY29uc3QgY2xpZW50ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50ID8/IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpOiBFeGVjdXRpb25Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGlmIChjdHg/LmNsaWVudCkge1xuICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBJbml0aWFsaXphdGlvbkVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIGJhcmUgQXBwS2l0IGFwcCAobm8gcGx1Z2lucykgd2hlbiBub25lIGlzIHJ1bm5pbmcgeWV0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAqIGNvbnN0IGNsaWVudCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZW5zdXJlSW5pdGlhbGl6ZWQ6IGFscmVhZHkgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImVuc3VyZUluaXRpYWxpemVkOiBib290aW5nIGJhcmUgQXBwS2l0IGFwcFwiKTtcbiAgYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW10sIGF1dG9Db25maWd1cmU6IGZhbHNlIH0pO1xuICBsb2dnZXIuZGVidWcoXCJlbnN1cmVJbml0aWFsaXplZDogYmFyZSBBcHBLaXQgaW5pdGlhbGl6YXRpb24gY29tcGxldGVcIik7XG59XG4iXX0=
@@ -0,0 +1,9 @@
1
+ /** In-process request tags shared by AppKit plugins. */
2
+ /** Primitive values supported by the request tag store. */
3
+ export type RequestTagValue = string | number | boolean;
4
+ /** Inject one tag into an in-process request context. */
5
+ export declare function injectRequestTag(request: object, name: string, value: RequestTagValue): void;
6
+ /** Inject multiple tags into an in-process request context. */
7
+ export declare function injectRequestTags(request: object, tags: Readonly<Record<string, RequestTagValue | undefined>>): void;
8
+ /** Read a snapshot of tags injected by AppKit plugins for one request. */
9
+ export declare function getRequestTags(request: object): Readonly<Record<string, RequestTagValue>>;
@@ -0,0 +1,28 @@
1
+ /** In-process request tags shared by AppKit plugins. */
2
+ const STORE_KEY = Symbol.for("@dbx-tools/appkit/request-tags");
3
+ const globalStore = globalThis;
4
+ const store = (globalStore[STORE_KEY] ??= new WeakMap());
5
+ /** Inject one tag into an in-process request context. */
6
+ export function injectRequestTag(request, name, value) {
7
+ const normalized = name.trim();
8
+ if (!normalized)
9
+ return;
10
+ let tags = store.get(request);
11
+ if (!tags) {
12
+ tags = new Map();
13
+ store.set(request, tags);
14
+ }
15
+ tags.set(normalized, value);
16
+ }
17
+ /** Inject multiple tags into an in-process request context. */
18
+ export function injectRequestTags(request, tags) {
19
+ for (const [name, value] of Object.entries(tags)) {
20
+ if (value !== undefined)
21
+ injectRequestTag(request, name, value);
22
+ }
23
+ }
24
+ /** Read a snapshot of tags injected by AppKit plugins for one request. */
25
+ export function getRequestTags(request) {
26
+ return Object.fromEntries(store.get(request) ?? []);
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC10YWdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlcXVlc3QtdGFncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3REFBd0Q7QUFPeEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQy9ELE1BQU0sV0FBVyxHQUFHLFVBRW5CLENBQUM7QUFDRixNQUFNLEtBQUssR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLE9BQU8sRUFBeUIsQ0FBQyxDQUFDO0FBRWhGLHlEQUF5RDtBQUN6RCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLElBQVksRUFBRSxLQUFzQjtJQUNwRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0IsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPO0lBQ3hCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsSUFBSSxHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO1FBQzFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBZSxFQUNmLElBQTJEO0lBRTNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDakQsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsQ0FBQztBQUNILENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsTUFBTSxVQUFVLGNBQWMsQ0FBQyxPQUFlO0lBQzVDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogSW4tcHJvY2VzcyByZXF1ZXN0IHRhZ3Mgc2hhcmVkIGJ5IEFwcEtpdCBwbHVnaW5zLiAqL1xuXG4vKiogUHJpbWl0aXZlIHZhbHVlcyBzdXBwb3J0ZWQgYnkgdGhlIHJlcXVlc3QgdGFnIHN0b3JlLiAqL1xuZXhwb3J0IHR5cGUgUmVxdWVzdFRhZ1ZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxudHlwZSBSZXF1ZXN0VGFnTWFwID0gTWFwPHN0cmluZywgUmVxdWVzdFRhZ1ZhbHVlPjtcblxuY29uc3QgU1RPUkVfS0VZID0gU3ltYm9sLmZvcihcIkBkYngtdG9vbHMvYXBwa2l0L3JlcXVlc3QtdGFnc1wiKTtcbmNvbnN0IGdsb2JhbFN0b3JlID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgW1NUT1JFX0tFWV0/OiBXZWFrTWFwPG9iamVjdCwgUmVxdWVzdFRhZ01hcD47XG59O1xuY29uc3Qgc3RvcmUgPSAoZ2xvYmFsU3RvcmVbU1RPUkVfS0VZXSA/Pz0gbmV3IFdlYWtNYXA8b2JqZWN0LCBSZXF1ZXN0VGFnTWFwPigpKTtcblxuLyoqIEluamVjdCBvbmUgdGFnIGludG8gYW4gaW4tcHJvY2VzcyByZXF1ZXN0IGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0UmVxdWVzdFRhZyhyZXF1ZXN0OiBvYmplY3QsIG5hbWU6IHN0cmluZywgdmFsdWU6IFJlcXVlc3RUYWdWYWx1ZSk6IHZvaWQge1xuICBjb25zdCBub3JtYWxpemVkID0gbmFtZS50cmltKCk7XG4gIGlmICghbm9ybWFsaXplZCkgcmV0dXJuO1xuICBsZXQgdGFncyA9IHN0b3JlLmdldChyZXF1ZXN0KTtcbiAgaWYgKCF0YWdzKSB7XG4gICAgdGFncyA9IG5ldyBNYXA8c3RyaW5nLCBSZXF1ZXN0VGFnVmFsdWU+KCk7XG4gICAgc3RvcmUuc2V0KHJlcXVlc3QsIHRhZ3MpO1xuICB9XG4gIHRhZ3Muc2V0KG5vcm1hbGl6ZWQsIHZhbHVlKTtcbn1cblxuLyoqIEluamVjdCBtdWx0aXBsZSB0YWdzIGludG8gYW4gaW4tcHJvY2VzcyByZXF1ZXN0IGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0UmVxdWVzdFRhZ3MoXG4gIHJlcXVlc3Q6IG9iamVjdCxcbiAgdGFnczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVxdWVzdFRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj4sXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIGluamVjdFJlcXVlc3RUYWcocmVxdWVzdCwgbmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKiBSZWFkIGEgc25hcHNob3Qgb2YgdGFncyBpbmplY3RlZCBieSBBcHBLaXQgcGx1Z2lucyBmb3Igb25lIHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVxdWVzdFRhZ3MocmVxdWVzdDogb2JqZWN0KTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVxdWVzdFRhZ1ZhbHVlPj4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHN0b3JlLmdldChyZXF1ZXN0KSA/PyBbXSk7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"root":["../src/_auto-configure.ts","../src/_cache-storage.ts","../src/appkit.ts","../src/brand-context.ts","../src/bundle.ts","../src/child-process.ts","../src/databricks.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/migration.ts","../src/pgaddress.ts","../src/plugin-execution.ts","../src/plugin-registry.ts","../src/provision.ts","../src/tool-provider.ts","../src/toolkit-entries.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/_auto-configure.ts","../src/_cache-storage.ts","../src/appkit.ts","../src/brand-context.ts","../src/bundle.ts","../src/child-process.ts","../src/databricks.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/migration.ts","../src/pgaddress.ts","../src/plugin-execution.ts","../src/plugin-registry.ts","../src/provision.ts","../src/request-tags.ts","../src/tool-provider.ts","../src/toolkit-entries.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@databricks/appkit": "0.81.0",
23
- "@dbx-tools/projen": "^0.9.65",
23
+ "@dbx-tools/projen": "^0.9.68",
24
24
  "@types/node": "^24.6.0",
25
25
  "typescript": "^5.9.3",
26
26
  "vitest": "3.2.4"
@@ -30,11 +30,11 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@databricks/sdk-experimental": "^0.17.0",
33
- "@dbx-tools/auth": "^0.9.65",
34
- "@dbx-tools/core": "^0.9.65",
35
- "@dbx-tools/lakebase": "^0.9.65",
36
- "@dbx-tools/postgres": "^0.9.65",
37
- "@dbx-tools/shared-core": "^0.9.65",
33
+ "@dbx-tools/auth": "^0.9.68",
34
+ "@dbx-tools/core": "^0.9.68",
35
+ "@dbx-tools/lakebase": "^0.9.68",
36
+ "@dbx-tools/postgres": "^0.9.68",
37
+ "@dbx-tools/shared-core": "^0.9.68",
38
38
  "zod": "4.3.6"
39
39
  },
40
40
  "main": "./lib/index.js",
@@ -100,6 +100,10 @@
100
100
  "types": "./lib/src/provision.d.ts",
101
101
  "default": "./lib/src/provision.js"
102
102
  },
103
+ "./request-tags": {
104
+ "types": "./lib/src/request-tags.d.ts",
105
+ "default": "./lib/src/request-tags.js"
106
+ },
103
107
  "./tool-provider": {
104
108
  "types": "./lib/src/tool-provider.d.ts",
105
109
  "default": "./lib/src/tool-provider.js"
@@ -111,7 +115,7 @@
111
115
  "./package.json": "./package.json"
112
116
  }
113
117
  },
114
- "version": "0.9.65",
118
+ "version": "0.9.68",
115
119
  "types": "./lib/index.d.ts",
116
120
  "dbxToolsConfig": {
117
121
  "tags": [
@@ -176,6 +180,10 @@
176
180
  "types": "./lib/src/provision.d.ts",
177
181
  "default": "./lib/src/provision.js"
178
182
  },
183
+ "./request-tags": {
184
+ "types": "./lib/src/request-tags.d.ts",
185
+ "default": "./lib/src/request-tags.js"
186
+ },
179
187
  "./tool-provider": {
180
188
  "types": "./lib/src/tool-provider.d.ts",
181
189
  "default": "./lib/src/tool-provider.js"
package/src/appkit.ts CHANGED
@@ -36,7 +36,7 @@ import {
36
36
  // publishes this subpath for exactly that type.
37
37
  import type { PluginMap } from "@databricks/appkit/dist/shared/src/plugin";
38
38
  import { profile as authProfile } from "@dbx-tools/auth";
39
- import { asyncUtils, log } from "@dbx-tools/shared-core";
39
+ import { asyncUtils, environmentUtils, log } from "@dbx-tools/shared-core";
40
40
 
41
41
  import { resolveAutoConfigurePolicy } from "./_auto-configure.ts";
42
42
  import { createSoftPersistentStorage } from "./_cache-storage.ts";
@@ -53,6 +53,9 @@ import { provisionCacheSchema } from "./provision.ts";
53
53
 
54
54
  const logger = log.logger("appkit");
55
55
 
56
+ /** Detect whether the current process is running as a deployed Databricks App. */
57
+ export const isDatabricksAppEnv = environmentUtils.isDatabricksAppEnv;
58
+
56
59
  type AppKitCreateAppConfig = NonNullable<Parameters<typeof appkitCreateApp>[0]>;
57
60
  type AppKitPlugins = NonNullable<AppKitCreateAppConfig["plugins"]>;
58
61
 
@@ -0,0 +1,39 @@
1
+ /** In-process request tags shared by AppKit plugins. */
2
+
3
+ /** Primitive values supported by the request tag store. */
4
+ export type RequestTagValue = string | number | boolean;
5
+
6
+ type RequestTagMap = Map<string, RequestTagValue>;
7
+
8
+ const STORE_KEY = Symbol.for("@dbx-tools/appkit/request-tags");
9
+ const globalStore = globalThis as typeof globalThis & {
10
+ [STORE_KEY]?: WeakMap<object, RequestTagMap>;
11
+ };
12
+ const store = (globalStore[STORE_KEY] ??= new WeakMap<object, RequestTagMap>());
13
+
14
+ /** Inject one tag into an in-process request context. */
15
+ export function injectRequestTag(request: object, name: string, value: RequestTagValue): void {
16
+ const normalized = name.trim();
17
+ if (!normalized) return;
18
+ let tags = store.get(request);
19
+ if (!tags) {
20
+ tags = new Map<string, RequestTagValue>();
21
+ store.set(request, tags);
22
+ }
23
+ tags.set(normalized, value);
24
+ }
25
+
26
+ /** Inject multiple tags into an in-process request context. */
27
+ export function injectRequestTags(
28
+ request: object,
29
+ tags: Readonly<Record<string, RequestTagValue | undefined>>,
30
+ ): void {
31
+ for (const [name, value] of Object.entries(tags)) {
32
+ if (value !== undefined) injectRequestTag(request, name, value);
33
+ }
34
+ }
35
+
36
+ /** Read a snapshot of tags injected by AppKit plugins for one request. */
37
+ export function getRequestTags(request: object): Readonly<Record<string, RequestTagValue>> {
38
+ return Object.fromEntries(store.get(request) ?? []);
39
+ }