@dbx-tools/shared-core 0.9.121 → 0.9.122

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,6 +9,7 @@ schema packages. Modules are exported as namespaces so call sites stay explicit:
9
9
  import {
10
10
  asyncUtils,
11
11
  brandUtils,
12
+ environmentUtils,
12
13
  errorUtils,
13
14
  hash,
14
15
  http,
@@ -431,3 +432,5 @@ stay in production code without paying formatting cost when disabled.
431
432
  - `functionUtils` - memoization.
432
433
  - `log` - tagged leveled logging.
433
434
  - `brandUtils` - Zod schema, defaults, JSON Schema, and LLM prompt serialization.
435
+ - `environmentUtils` - Databricks App runtime detection from App env vars or the
436
+ Apps container source tree.
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/shared-core";
6
- export const PACKAGE_VERSION = "0.9.121";
6
+ export const PACKAGE_VERSION = "0.9.122";
7
7
  export * as asyncUtils from "./src/async-utils.ts";
8
8
  export * as bindings from "./src/bindings.ts";
9
9
  export * as brandUtils from "./src/brand-utils.ts";
@@ -25,6 +25,7 @@ export * as token from "./src/token.ts";
25
25
  export type { ConcurrentErrorMode, MapConcurrentOptions, PollContext, PollProducer, PollOptions } from "./src/async-utils.ts";
26
26
  export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, defaultBrandContext } from "./src/brand-utils.ts";
27
27
  export type { BrandContext, BrandContextInput, BrandAssetSet } from "./src/brand-utils.ts";
28
+ export { DATABRICKS_APP_SOURCE_ROOT } from "./src/environment-utils.ts";
28
29
  export type { ErrorContext } from "./src/error-utils.ts";
29
30
  export type { ExecutionResult, Executor, ExecutionFailure, RunOptions } from "./src/execution.ts";
30
31
  export type { MemoizeOptions } from "./src/function-utils.ts";
@@ -33,7 +34,7 @@ export type { LogLevel, Logger } from "./src/log.ts";
33
34
  export { MAX_TCP_PORT } from "./src/net.ts";
34
35
  export type { UrlLike, IpVersion, ParsedIp, Cidr, UrlBuilder, ParseEmailsOptions } from "./src/net.ts";
35
36
  export type { Sequence, Container, Collection, OneOrMany, NameLike, NonFunctionKeys, SerializablePrimitive, SerializableValue, ToNumberOptions, ToDateOptions, ToDurationOptions, DeepEqualComparator } from "./src/object.ts";
36
- export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, PostgresEnvironmentNamesSchema, postgresEnvironmentNames, postgresRoleSchema, PostgresOptionsSchema, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema, TcpListenAddressSchema, UnixListenAddressSchema } from "./src/options.ts";
37
+ export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, PostgresEnvironmentNamesSchema, postgresEnvironmentNames, postgresRoleSchema, PostgresOptionsSchema, PostgresConfigOptionsSchema, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema, TcpListenAddressSchema, UnixListenAddressSchema } from "./src/options.ts";
37
38
  export type { DatabricksEnvironmentNames, PostgresEnvironmentNames, PostgresOptions, DatabricksOptions, OptionSerializationFormat, LakebaseOptions, OptionValueMap, ListenScheme, TcpListenAddress, UnixListenAddress, ListenAddress, ListenAddressOptions, ListenAddressInput } from "./src/options.ts";
38
39
  export type { PatternOptions } from "./src/pattern.ts";
39
40
  export type { PredicateFunction, TypePredicateFunction, PredicateInput, Predicate } from "./src/predicate.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-core";
2
- export declare const PACKAGE_VERSION = "0.9.121";
2
+ export declare const PACKAGE_VERSION = "0.9.122";
3
3
  export * as asyncUtils from "./src/async-utils.ts";
4
4
  export * as bindings from "./src/bindings.ts";
5
5
  export * as brandUtils from "./src/brand-utils.ts";
@@ -21,6 +21,7 @@ export * as token from "./src/token.ts";
21
21
  export type { ConcurrentErrorMode, MapConcurrentOptions, PollContext, PollProducer, PollOptions } from "./src/async-utils.ts";
22
22
  export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, defaultBrandContext } from "./src/brand-utils.ts";
23
23
  export type { BrandContext, BrandContextInput, BrandAssetSet } from "./src/brand-utils.ts";
24
+ export { DATABRICKS_APP_SOURCE_ROOT } from "./src/environment-utils.ts";
24
25
  export type { ErrorContext } from "./src/error-utils.ts";
25
26
  export type { ExecutionResult, Executor, ExecutionFailure, RunOptions } from "./src/execution.ts";
26
27
  export type { MemoizeOptions } from "./src/function-utils.ts";
@@ -29,7 +30,7 @@ export type { LogLevel, Logger } from "./src/log.ts";
29
30
  export { MAX_TCP_PORT } from "./src/net.ts";
30
31
  export type { UrlLike, IpVersion, ParsedIp, Cidr, UrlBuilder, ParseEmailsOptions } from "./src/net.ts";
31
32
  export type { Sequence, Container, Collection, OneOrMany, NameLike, NonFunctionKeys, SerializablePrimitive, SerializableValue, ToNumberOptions, ToDateOptions, ToDurationOptions, DeepEqualComparator } from "./src/object.ts";
32
- export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, PostgresEnvironmentNamesSchema, postgresEnvironmentNames, postgresRoleSchema, PostgresOptionsSchema, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema, TcpListenAddressSchema, UnixListenAddressSchema } from "./src/options.ts";
33
+ export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, PostgresEnvironmentNamesSchema, postgresEnvironmentNames, postgresRoleSchema, PostgresOptionsSchema, PostgresConfigOptionsSchema, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema, TcpListenAddressSchema, UnixListenAddressSchema } from "./src/options.ts";
33
34
  export type { DatabricksEnvironmentNames, PostgresEnvironmentNames, PostgresOptions, DatabricksOptions, OptionSerializationFormat, LakebaseOptions, OptionValueMap, ListenScheme, TcpListenAddress, UnixListenAddress, ListenAddress, ListenAddressOptions, ListenAddressInput } from "./src/options.ts";
34
35
  export type { PatternOptions } from "./src/pattern.ts";
35
36
  export type { PredicateFunction, TypePredicateFunction, PredicateInput, Predicate } from "./src/predicate.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/shared-core";
5
- export const PACKAGE_VERSION = "0.9.121";
5
+ export const PACKAGE_VERSION = "0.9.122";
6
6
  export * as asyncUtils from "./src/async-utils.js";
7
7
  export * as bindings from "./src/bindings.js";
8
8
  export * as brandUtils from "./src/brand-utils.js";
@@ -22,7 +22,8 @@ export * as predicate from "./src/predicate.js";
22
22
  export * as stringUtils from "./src/string-utils.js";
23
23
  export * as token from "./src/token.js";
24
24
  export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, defaultBrandContext } from "./src/brand-utils.js";
25
+ export { DATABRICKS_APP_SOURCE_ROOT } from "./src/environment-utils.js";
25
26
  export { MAX_TCP_PORT } from "./src/net.js";
26
- export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, PostgresEnvironmentNamesSchema, postgresEnvironmentNames, postgresRoleSchema, PostgresOptionsSchema, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema, TcpListenAddressSchema, UnixListenAddressSchema } from "./src/options.js";
27
+ export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, PostgresEnvironmentNamesSchema, postgresEnvironmentNames, postgresRoleSchema, PostgresOptionsSchema, PostgresConfigOptionsSchema, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema, TcpListenAddressSchema, UnixListenAddressSchema } from "./src/options.js";
27
28
  export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER } from "./src/token.js";
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLGFBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU8vSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzVDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSwwQkFBMEIsRUFBRSw4QkFBOEIsRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUsvVixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTIxXCI7XG5leHBvcnQgKiBhcyBhc3luY1V0aWxzIGZyb20gXCIuL3NyYy9hc3luYy11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZFV0aWxzIGZyb20gXCIuL3NyYy9icmFuZC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZW52aXJvbm1lbnRVdGlscyBmcm9tIFwiLi9zcmMvZW52aXJvbm1lbnQtdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGVycm9yVXRpbHMgZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBleGVjdXRpb24gZnJvbSBcIi4vc3JjL2V4ZWN1dGlvbi50c1wiO1xuZXhwb3J0ICogYXMgZnVuY3Rpb25VdGlscyBmcm9tIFwiLi9zcmMvZnVuY3Rpb24tdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGhhc2ggZnJvbSBcIi4vc3JjL2hhc2gudHNcIjtcbmV4cG9ydCAqIGFzIGh0dHAgZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCAqIGFzIGpzb24gZnJvbSBcIi4vc3JjL2pzb24udHNcIjtcbmV4cG9ydCAqIGFzIGxvZyBmcm9tIFwiLi9zcmMvbG9nLnRzXCI7XG5leHBvcnQgKiBhcyBuZXQgZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0ICogYXMgb2JqZWN0IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCAqIGFzIG9wdGlvbnMgZnJvbSBcIi4vc3JjL29wdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIHBhdHRlcm4gZnJvbSBcIi4vc3JjL3BhdHRlcm4udHNcIjtcbmV4cG9ydCAqIGFzIHByZWRpY2F0ZSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgKiBhcyBzdHJpbmdVdGlscyBmcm9tIFwiLi9zcmMvc3RyaW5nLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyB0b2tlbiBmcm9tIFwiLi9zcmMvdG9rZW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29uY3VycmVudEVycm9yTW9kZSwgTWFwQ29uY3VycmVudE9wdGlvbnMsIFBvbGxDb250ZXh0LCBQb2xsUHJvZHVjZXIsIFBvbGxPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2FzeW5jLXV0aWxzLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0JSQU5EX0FTU0VUUywgQnJhbmRBc3NldFNldFNjaGVtYSwgQnJhbmRDb2xvcnNTY2hlbWEsIEJyYW5kVm9pY2VTY2hlbWEsIEJyYW5kQ29udGV4dFNjaGVtYSwgZGVmYXVsdEJyYW5kQ29udGV4dCB9IGZyb20gXCIuL3NyYy9icmFuZC11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZENvbnRleHQsIEJyYW5kQ29udGV4dElucHV0LCBCcmFuZEFzc2V0U2V0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEVycm9yQ29udGV4dCB9IGZyb20gXCIuL3NyYy9lcnJvci11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFeGVjdXRpb25SZXN1bHQsIEV4ZWN1dG9yLCBFeGVjdXRpb25GYWlsdXJlLCBSdW5PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2V4ZWN1dGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZW1vaXplT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9mdW5jdGlvbi11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBIZWFkZXJMaWtlIH0gZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9nTGV2ZWwsIExvZ2dlciB9IGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCB7IE1BWF9UQ1BfUE9SVCB9IGZyb20gXCIuL3NyYy9uZXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgVXJsTGlrZSwgSXBWZXJzaW9uLCBQYXJzZWRJcCwgQ2lkciwgVXJsQnVpbGRlciwgUGFyc2VFbWFpbHNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZXF1ZW5jZSwgQ29udGFpbmVyLCBDb2xsZWN0aW9uLCBPbmVPck1hbnksIE5hbWVMaWtlLCBOb25GdW5jdGlvbktleXMsIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSwgU2VyaWFsaXphYmxlVmFsdWUsIFRvTnVtYmVyT3B0aW9ucywgVG9EYXRlT3B0aW9ucywgVG9EdXJhdGlvbk9wdGlvbnMsIERlZXBFcXVhbENvbXBhcmF0b3IgfSBmcm9tIFwiLi9zcmMvb2JqZWN0LnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYSwgZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMsIFBvc3RncmVzRW52aXJvbm1lbnROYW1lc1NjaGVtYSwgcG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzLCBwb3N0Z3Jlc1JvbGVTY2hlbWEsIFBvc3RncmVzT3B0aW9uc1NjaGVtYSwgdGNwUG9ydFNjaGVtYSwgdGNwUG9ydE9yWmVyb1NjaGVtYSwgbm9ybWFsaXplZFVybFNjaGVtYSwgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWEsIExha2ViYXNlT3B0aW9uc1NjaGVtYSwgVGNwTGlzdGVuQWRkcmVzc1NjaGVtYSwgVW5peExpc3RlbkFkZHJlc3NTY2hlbWEgfSBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcywgUG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzLCBQb3N0Z3Jlc09wdGlvbnMsIERhdGFicmlja3NPcHRpb25zLCBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0LCBMYWtlYmFzZU9wdGlvbnMsIE9wdGlvblZhbHVlTWFwLCBMaXN0ZW5TY2hlbWUsIFRjcExpc3RlbkFkZHJlc3MsIFVuaXhMaXN0ZW5BZGRyZXNzLCBMaXN0ZW5BZGRyZXNzLCBMaXN0ZW5BZGRyZXNzT3B0aW9ucywgTGlzdGVuQWRkcmVzc0lucHV0IH0gZnJvbSBcIi4vc3JjL29wdGlvbnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGF0dGVybk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQcmVkaWNhdGVGdW5jdGlvbiwgVHlwZVByZWRpY2F0ZUZ1bmN0aW9uLCBQcmVkaWNhdGVJbnB1dCwgUHJlZGljYXRlIH0gZnJvbSBcIi4vc3JjL3ByZWRpY2F0ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb2tlbml6ZU9wdGlvbnMsIEtleU9wdGlvbnMsIElkZW50aWZpZXJPcHRpb25zLCBEZWRlbnRPcHRpb25zLCBEZXNjcmlwdGlvbiB9IGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCB7IEFDQ0VTU19UT0tFTl9IRUFERVIsIFVTRVJfSURfSEVBREVSLCBVU0VSX0VNQUlMX0hFQURFUiB9IGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuIl19
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLGFBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUvSixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU14RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzVDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSwwQkFBMEIsRUFBRSw4QkFBOEIsRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUs1WCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTIyXCI7XG5leHBvcnQgKiBhcyBhc3luY1V0aWxzIGZyb20gXCIuL3NyYy9hc3luYy11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZFV0aWxzIGZyb20gXCIuL3NyYy9icmFuZC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZW52aXJvbm1lbnRVdGlscyBmcm9tIFwiLi9zcmMvZW52aXJvbm1lbnQtdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGVycm9yVXRpbHMgZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBleGVjdXRpb24gZnJvbSBcIi4vc3JjL2V4ZWN1dGlvbi50c1wiO1xuZXhwb3J0ICogYXMgZnVuY3Rpb25VdGlscyBmcm9tIFwiLi9zcmMvZnVuY3Rpb24tdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGhhc2ggZnJvbSBcIi4vc3JjL2hhc2gudHNcIjtcbmV4cG9ydCAqIGFzIGh0dHAgZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCAqIGFzIGpzb24gZnJvbSBcIi4vc3JjL2pzb24udHNcIjtcbmV4cG9ydCAqIGFzIGxvZyBmcm9tIFwiLi9zcmMvbG9nLnRzXCI7XG5leHBvcnQgKiBhcyBuZXQgZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0ICogYXMgb2JqZWN0IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCAqIGFzIG9wdGlvbnMgZnJvbSBcIi4vc3JjL29wdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIHBhdHRlcm4gZnJvbSBcIi4vc3JjL3BhdHRlcm4udHNcIjtcbmV4cG9ydCAqIGFzIHByZWRpY2F0ZSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgKiBhcyBzdHJpbmdVdGlscyBmcm9tIFwiLi9zcmMvc3RyaW5nLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyB0b2tlbiBmcm9tIFwiLi9zcmMvdG9rZW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29uY3VycmVudEVycm9yTW9kZSwgTWFwQ29uY3VycmVudE9wdGlvbnMsIFBvbGxDb250ZXh0LCBQb2xsUHJvZHVjZXIsIFBvbGxPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2FzeW5jLXV0aWxzLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0JSQU5EX0FTU0VUUywgQnJhbmRBc3NldFNldFNjaGVtYSwgQnJhbmRDb2xvcnNTY2hlbWEsIEJyYW5kVm9pY2VTY2hlbWEsIEJyYW5kQ29udGV4dFNjaGVtYSwgZGVmYXVsdEJyYW5kQ29udGV4dCB9IGZyb20gXCIuL3NyYy9icmFuZC11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZENvbnRleHQsIEJyYW5kQ29udGV4dElucHV0LCBCcmFuZEFzc2V0U2V0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgeyBEQVRBQlJJQ0tTX0FQUF9TT1VSQ0VfUk9PVCB9IGZyb20gXCIuL3NyYy9lbnZpcm9ubWVudC11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFcnJvckNvbnRleHQgfSBmcm9tIFwiLi9zcmMvZXJyb3ItdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRXhlY3V0aW9uUmVzdWx0LCBFeGVjdXRvciwgRXhlY3V0aW9uRmFpbHVyZSwgUnVuT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9leGVjdXRpb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgTWVtb2l6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZnVuY3Rpb24tdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgSGVhZGVyTGlrZSB9IGZyb20gXCIuL3NyYy9odHRwLnRzXCI7XG5leHBvcnQgdHlwZSB7IExvZ0xldmVsLCBMb2dnZXIgfSBmcm9tIFwiLi9zcmMvbG9nLnRzXCI7XG5leHBvcnQgeyBNQVhfVENQX1BPUlQgfSBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgdHlwZSB7IFVybExpa2UsIElwVmVyc2lvbiwgUGFyc2VkSXAsIENpZHIsIFVybEJ1aWxkZXIsIFBhcnNlRW1haWxzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9uZXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VxdWVuY2UsIENvbnRhaW5lciwgQ29sbGVjdGlvbiwgT25lT3JNYW55LCBOYW1lTGlrZSwgTm9uRnVuY3Rpb25LZXlzLCBTZXJpYWxpemFibGVQcmltaXRpdmUsIFNlcmlhbGl6YWJsZVZhbHVlLCBUb051bWJlck9wdGlvbnMsIFRvRGF0ZU9wdGlvbnMsIFRvRHVyYXRpb25PcHRpb25zLCBEZWVwRXF1YWxDb21wYXJhdG9yIH0gZnJvbSBcIi4vc3JjL29iamVjdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXNTY2hlbWEsIGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLCBQb3N0Z3Jlc0Vudmlyb25tZW50TmFtZXNTY2hlbWEsIHBvc3RncmVzRW52aXJvbm1lbnROYW1lcywgcG9zdGdyZXNSb2xlU2NoZW1hLCBQb3N0Z3Jlc09wdGlvbnNTY2hlbWEsIFBvc3RncmVzQ29uZmlnT3B0aW9uc1NjaGVtYSwgdGNwUG9ydFNjaGVtYSwgdGNwUG9ydE9yWmVyb1NjaGVtYSwgbm9ybWFsaXplZFVybFNjaGVtYSwgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWEsIExha2ViYXNlT3B0aW9uc1NjaGVtYSwgVGNwTGlzdGVuQWRkcmVzc1NjaGVtYSwgVW5peExpc3RlbkFkZHJlc3NTY2hlbWEgfSBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcywgUG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzLCBQb3N0Z3Jlc09wdGlvbnMsIERhdGFicmlja3NPcHRpb25zLCBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0LCBMYWtlYmFzZU9wdGlvbnMsIE9wdGlvblZhbHVlTWFwLCBMaXN0ZW5TY2hlbWUsIFRjcExpc3RlbkFkZHJlc3MsIFVuaXhMaXN0ZW5BZGRyZXNzLCBMaXN0ZW5BZGRyZXNzLCBMaXN0ZW5BZGRyZXNzT3B0aW9ucywgTGlzdGVuQWRkcmVzc0lucHV0IH0gZnJvbSBcIi4vc3JjL29wdGlvbnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGF0dGVybk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQcmVkaWNhdGVGdW5jdGlvbiwgVHlwZVByZWRpY2F0ZUZ1bmN0aW9uLCBQcmVkaWNhdGVJbnB1dCwgUHJlZGljYXRlIH0gZnJvbSBcIi4vc3JjL3ByZWRpY2F0ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb2tlbml6ZU9wdGlvbnMsIEtleU9wdGlvbnMsIElkZW50aWZpZXJPcHRpb25zLCBEZWRlbnRPcHRpb25zLCBEZXNjcmlwdGlvbiB9IGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCB7IEFDQ0VTU19UT0tFTl9IRUFERVIsIFVTRVJfSURfSEVBREVSLCBVU0VSX0VNQUlMX0hFQURFUiB9IGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuIl19
@@ -1,2 +1,12 @@
1
- /** Detect a Databricks App runtime from its workspace host plus App name or port. */
2
- export declare function isDatabricksAppEnv(source?: Record<string, string | undefined>): boolean;
1
+ /** Databricks Apps container working tree used when App env vars are not yet injected. */
2
+ export declare const DATABRICKS_APP_SOURCE_ROOT = "/app/python/source_code";
3
+ /**
4
+ * Detect a Databricks App runtime from its workspace host plus App name or port,
5
+ * or from the Apps container source tree when those variables are not yet set.
6
+ *
7
+ * `DBX_TOOLS_DATABRICKS_APP_ENV` takes precedence when it contains a recognized
8
+ * boolean value. This lets local tools emulate the deployed runtime (`true`) or
9
+ * lets unusual deployed processes retain local config lookup (`false`). An
10
+ * absent or unrecognized override falls back to structural detection.
11
+ */
12
+ export declare function isDatabricksAppEnv(source?: Record<string, string | undefined>, cwd?: string): boolean;
@@ -1,13 +1,22 @@
1
1
  import { MAX_TCP_PORT } from "./net.js";
2
2
  import { toBoolean } from "./object.js";
3
+ /** Databricks Apps container working tree used when App env vars are not yet injected. */
4
+ export const DATABRICKS_APP_SOURCE_ROOT = "/app/python/source_code";
5
+ function runtimeProcess() {
6
+ return globalThis.process;
7
+ }
3
8
  function runtimeEnvironment() {
4
- return (globalThis.process?.env ?? {});
9
+ return runtimeProcess()?.env ?? {};
5
10
  }
6
- /** Detect a Databricks App runtime from its workspace host plus App name or port. */
7
- export function isDatabricksAppEnv(source = runtimeEnvironment()) {
8
- const override = toBoolean(source.DBX_TOOLS_DATABRICKS_APP_ENV);
9
- if (override !== undefined)
10
- return override;
11
+ function runtimeCwd() {
12
+ return runtimeProcess()?.cwd?.() ?? "";
13
+ }
14
+ function isDatabricksAppSourceTree(cwd) {
15
+ const normalized = cwd.replaceAll("\\", "/").replace(/\/+$/, "");
16
+ return (normalized === DATABRICKS_APP_SOURCE_ROOT ||
17
+ normalized.startsWith(`${DATABRICKS_APP_SOURCE_ROOT}/`));
18
+ }
19
+ function hasDatabricksAppEnv(source) {
11
20
  const name = source.DATABRICKS_APP_NAME?.trim();
12
21
  const host = source.DATABRICKS_HOST?.trim();
13
22
  const port = source.DATABRICKS_APP_PORT?.trim();
@@ -28,4 +37,19 @@ export function isDatabricksAppEnv(source = runtimeEnvironment()) {
28
37
  return false;
29
38
  }
30
39
  }
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW52aXJvbm1lbnQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhDLFNBQVMsa0JBQWtCO0lBQ3pCLE9BQU8sQ0FFSCxVQUdELENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsU0FBNkMsa0JBQWtCLEVBQUU7SUFFakUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2hFLElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEQsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2xGLElBQUksSUFBSSxFQUFFLENBQUM7UUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxVQUFVLEdBQUcsWUFBWTtZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2pHLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTUFYX1RDUF9QT1JUIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5pbXBvcnQgeyB0b0Jvb2xlYW4gfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcblxuZnVuY3Rpb24gcnVudGltZUVudmlyb25tZW50KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gKFxuICAgIChcbiAgICAgIGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gICAgICAgIHByb2Nlc3M/OiB7IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfTtcbiAgICAgIH1cbiAgICApLnByb2Nlc3M/LmVudiA/PyB7fVxuICApO1xufVxuXG4vKiogRGV0ZWN0IGEgRGF0YWJyaWNrcyBBcHAgcnVudGltZSBmcm9tIGl0cyB3b3Jrc3BhY2UgaG9zdCBwbHVzIEFwcCBuYW1lIG9yIHBvcnQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhYnJpY2tzQXBwRW52KFxuICBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gPSBydW50aW1lRW52aXJvbm1lbnQoKSxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBvdmVycmlkZSA9IHRvQm9vbGVhbihzb3VyY2UuREJYX1RPT0xTX0RBVEFCUklDS1NfQVBQX0VOVik7XG4gIGlmIChvdmVycmlkZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gb3ZlcnJpZGU7XG4gIGNvbnN0IG5hbWUgPSBzb3VyY2UuREFUQUJSSUNLU19BUFBfTkFNRT8udHJpbSgpO1xuICBjb25zdCBob3N0ID0gc291cmNlLkRBVEFCUklDS1NfSE9TVD8udHJpbSgpO1xuICBjb25zdCBwb3J0ID0gc291cmNlLkRBVEFCUklDS1NfQVBQX1BPUlQ/LnRyaW0oKTtcbiAgaWYgKCFob3N0IHx8ICghbmFtZSAmJiAhcG9ydCkgfHwgKG5hbWUgJiYgL1xcJFxce1tefV0rXFx9Ly50ZXN0KG5hbWUpKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAocG9ydCkge1xuICAgIGlmICghL15cXGQrJC8udGVzdChwb3J0KSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHBhcnNlZFBvcnQgPSBOdW1iZXIocG9ydCk7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlZFBvcnQpIHx8IHBhcnNlZFBvcnQgPCAxIHx8IHBhcnNlZFBvcnQgPiBNQVhfVENQX1BPUlQpIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoaG9zdCk7XG4gICAgcmV0dXJuICh1cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIiB8fCB1cmwucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpICYmIEJvb2xlYW4odXJsLmhvc3RuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
40
+ /**
41
+ * Detect a Databricks App runtime from its workspace host plus App name or port,
42
+ * or from the Apps container source tree when those variables are not yet set.
43
+ *
44
+ * `DBX_TOOLS_DATABRICKS_APP_ENV` takes precedence when it contains a recognized
45
+ * boolean value. This lets local tools emulate the deployed runtime (`true`) or
46
+ * lets unusual deployed processes retain local config lookup (`false`). An
47
+ * absent or unrecognized override falls back to structural detection.
48
+ */
49
+ export function isDatabricksAppEnv(source = runtimeEnvironment(), cwd = runtimeCwd()) {
50
+ const override = toBoolean(source.DBX_TOOLS_DATABRICKS_APP_ENV);
51
+ if (override !== undefined)
52
+ return override;
53
+ return hasDatabricksAppEnv(source) || isDatabricksAppSourceTree(cwd);
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW52aXJvbm1lbnQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhDLDBGQUEwRjtBQUMxRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyx5QkFBeUIsQ0FBQztBQUVwRSxTQUFTLGNBQWM7SUFFckIsT0FDRSxVQUdELENBQUMsT0FBTyxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVMsa0JBQWtCO0lBQ3pCLE9BQU8sY0FBYyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztBQUNyQyxDQUFDO0FBRUQsU0FBUyxVQUFVO0lBQ2pCLE9BQU8sY0FBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDekMsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQUMsR0FBVztJQUM1QyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sQ0FDTCxVQUFVLEtBQUssMEJBQTBCO1FBQ3pDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRywwQkFBMEIsR0FBRyxDQUFDLENBQ3hELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxNQUEwQztJQUNyRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEQsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2xGLElBQUksSUFBSSxFQUFFLENBQUM7UUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxVQUFVLEdBQUcsWUFBWTtZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2pHLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLFNBQTZDLGtCQUFrQixFQUFFLEVBQ2pFLE1BQWMsVUFBVSxFQUFFO0lBRTFCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDNUMsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTUFYX1RDUF9QT1JUIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5pbXBvcnQgeyB0b0Jvb2xlYW4gfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcblxuLyoqIERhdGFicmlja3MgQXBwcyBjb250YWluZXIgd29ya2luZyB0cmVlIHVzZWQgd2hlbiBBcHAgZW52IHZhcnMgYXJlIG5vdCB5ZXQgaW5qZWN0ZWQuICovXG5leHBvcnQgY29uc3QgREFUQUJSSUNLU19BUFBfU09VUkNFX1JPT1QgPSBcIi9hcHAvcHl0aG9uL3NvdXJjZV9jb2RlXCI7XG5cbmZ1bmN0aW9uIHJ1bnRpbWVQcm9jZXNzKCk6XG4gIHsgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjsgY3dkPzogKCkgPT4gc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gKFxuICAgIGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gICAgICBwcm9jZXNzPzogeyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+OyBjd2Q/OiAoKSA9PiBzdHJpbmcgfTtcbiAgICB9XG4gICkucHJvY2Vzcztcbn1cblxuZnVuY3Rpb24gcnVudGltZUVudmlyb25tZW50KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gcnVudGltZVByb2Nlc3MoKT8uZW52ID8/IHt9O1xufVxuXG5mdW5jdGlvbiBydW50aW1lQ3dkKCk6IHN0cmluZyB7XG4gIHJldHVybiBydW50aW1lUHJvY2VzcygpPy5jd2Q/LigpID8/IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGlzRGF0YWJyaWNrc0FwcFNvdXJjZVRyZWUoY3dkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGN3ZC5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIikucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgcmV0dXJuIChcbiAgICBub3JtYWxpemVkID09PSBEQVRBQlJJQ0tTX0FQUF9TT1VSQ0VfUk9PVCB8fFxuICAgIG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChgJHtEQVRBQlJJQ0tTX0FQUF9TT1VSQ0VfUk9PVH0vYClcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzRGF0YWJyaWNrc0FwcEVudihzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBib29sZWFuIHtcbiAgY29uc3QgbmFtZSA9IHNvdXJjZS5EQVRBQlJJQ0tTX0FQUF9OQU1FPy50cmltKCk7XG4gIGNvbnN0IGhvc3QgPSBzb3VyY2UuREFUQUJSSUNLU19IT1NUPy50cmltKCk7XG4gIGNvbnN0IHBvcnQgPSBzb3VyY2UuREFUQUJSSUNLU19BUFBfUE9SVD8udHJpbSgpO1xuICBpZiAoIWhvc3QgfHwgKCFuYW1lICYmICFwb3J0KSB8fCAobmFtZSAmJiAvXFwkXFx7W159XStcXH0vLnRlc3QobmFtZSkpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChwb3J0KSB7XG4gICAgaWYgKCEvXlxcZCskLy50ZXN0KHBvcnQpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGFyc2VkUG9ydCA9IE51bWJlcihwb3J0KTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFyc2VkUG9ydCkgfHwgcGFyc2VkUG9ydCA8IDEgfHwgcGFyc2VkUG9ydCA+IE1BWF9UQ1BfUE9SVCkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChob3N0KTtcbiAgICByZXR1cm4gKHVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHVybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIikgJiYgQm9vbGVhbih1cmwuaG9zdG5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlY3QgYSBEYXRhYnJpY2tzIEFwcCBydW50aW1lIGZyb20gaXRzIHdvcmtzcGFjZSBob3N0IHBsdXMgQXBwIG5hbWUgb3IgcG9ydCxcbiAqIG9yIGZyb20gdGhlIEFwcHMgY29udGFpbmVyIHNvdXJjZSB0cmVlIHdoZW4gdGhvc2UgdmFyaWFibGVzIGFyZSBub3QgeWV0IHNldC5cbiAqXG4gKiBgREJYX1RPT0xTX0RBVEFCUklDS1NfQVBQX0VOVmAgdGFrZXMgcHJlY2VkZW5jZSB3aGVuIGl0IGNvbnRhaW5zIGEgcmVjb2duaXplZFxuICogYm9vbGVhbiB2YWx1ZS4gVGhpcyBsZXRzIGxvY2FsIHRvb2xzIGVtdWxhdGUgdGhlIGRlcGxveWVkIHJ1bnRpbWUgKGB0cnVlYCkgb3JcbiAqIGxldHMgdW51c3VhbCBkZXBsb3llZCBwcm9jZXNzZXMgcmV0YWluIGxvY2FsIGNvbmZpZyBsb29rdXAgKGBmYWxzZWApLiBBblxuICogYWJzZW50IG9yIHVucmVjb2duaXplZCBvdmVycmlkZSBmYWxscyBiYWNrIHRvIHN0cnVjdHVyYWwgZGV0ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhYnJpY2tzQXBwRW52KFxuICBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gPSBydW50aW1lRW52aXJvbm1lbnQoKSxcbiAgY3dkOiBzdHJpbmcgPSBydW50aW1lQ3dkKCksXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgb3ZlcnJpZGUgPSB0b0Jvb2xlYW4oc291cmNlLkRCWF9UT09MU19EQVRBQlJJQ0tTX0FQUF9FTlYpO1xuICBpZiAob3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG92ZXJyaWRlO1xuICByZXR1cm4gaGFzRGF0YWJyaWNrc0FwcEVudihzb3VyY2UpIHx8IGlzRGF0YWJyaWNrc0FwcFNvdXJjZVRyZWUoY3dkKTtcbn1cbiJdfQ==
@@ -49,6 +49,9 @@ export declare const postgresRoleSchema: z.ZodString;
49
49
  export declare const PostgresOptionsSchema: z.ZodObject<{
50
50
  postgresRole: z.ZodOptional<z.ZodString>;
51
51
  }, z.core.$strict>;
52
+ export declare const PostgresConfigOptionsSchema: z.ZodObject<{
53
+ postgresRole: z.ZodOptional<z.ZodString>;
54
+ }, z.core.$strict>;
52
55
  export type PostgresOptions = z.input<typeof PostgresOptionsSchema>;
53
56
  export declare const tcpPortSchema: z.ZodCoercedNumber<number>;
54
57
  export declare const tcpPortOrZeroSchema: z.ZodCoercedNumber<number>;
@@ -52,6 +52,9 @@ export const PostgresOptionsSchema = z
52
52
  })
53
53
  .strict()
54
54
  .describe("Shared PostgreSQL session options.");
55
+ export const PostgresConfigOptionsSchema = PostgresOptionsSchema.safeExtend({
56
+ postgresRole: PostgresOptionsSchema.shape.postgresRole.meta({ env: "POSTGRES_ROLE" }),
57
+ }).describe("PostgreSQL options resolved through scoped configuration.");
55
58
  export const tcpPortSchema = z.coerce
56
59
  .number()
57
60
  .int()
@@ -319,4 +322,4 @@ function normalizeUrl(value) {
319
322
  const normalized = url.toString();
320
323
  return url.pathname === "/" && !url.search && !url.hash ? normalized.slice(0, -1) : normalized;
321
324
  }
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEMsTUFBTSxlQUFlLEdBQUcsQ0FBbUIsSUFBTyxFQUFFLFdBQW1CLEVBQUUsRUFBRSxDQUN6RSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQztLQUM5QyxNQUFNLENBQUM7SUFDTixPQUFPLEVBQUUsZUFBZSxDQUFDLDJCQUEyQixFQUFFLHFDQUFxQyxDQUFDO0lBQzVGLElBQUksRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7SUFDeEUsU0FBUyxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxvQ0FBb0MsQ0FBQztJQUN6RixXQUFXLEVBQUUsZUFBZSxDQUFDLHlCQUF5QixFQUFFLHNDQUFzQyxDQUFDO0lBQy9GLFVBQVUsRUFBRSxlQUFlLENBQ3pCLHdCQUF3QixFQUN4Qix5Q0FBeUMsQ0FDMUM7SUFDRCxRQUFRLEVBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFLHlDQUF5QyxDQUFDO0lBQzVGLFlBQVksRUFBRSxlQUFlLENB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L0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNFLElBQUksYUFBYSxLQUFLLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDaEYsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQ3pELElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxPQUFPO1lBQ0wsTUFBTSxF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Q0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsTUFBc0IsRUFBRSxJQUF1QjtJQUN2RSxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzlCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFhO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQyxPQUFPLEdBQUcsQ0FBQyxRQUFRLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUNqRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgb3B0aW9uIHByaW1pdGl2ZXMgc2hhcmVkIGFjcm9zcyBkYngtdG9vbHMgcGFja2FnZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBpc0xvb3BiYWNrSG9zdCwgTUFYX1RDUF9QT1JULCB1cmxCdWlsZGVyIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5pbXBvcnQgeyBpc1JlY29yZCwgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5pbXBvcnQgeyBwYXJzZUxpc3QsIHRvSWRlbnRpZmllcldpdGhPcHRpb25zLCB0b1NsdWcgfSBmcm9tIFwiLi9zdHJpbmctdXRpbHMudHNcIjtcblxuZXhwb3J0IHsgTUFYX1RDUF9QT1JUIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5cbmNvbnN0IGVudmlyb25tZW50TmFtZSA9IDxUIGV4dGVuZHMgc3RyaW5nPihuYW1lOiBULCBkZXNjcmlwdGlvbjogc3RyaW5nKSA9PlxuICB6LmxpdGVyYWwobmFtZSkuZGVmYXVsdChuYW1lKS5kZXNjcmliZShkZXNjcmlwdGlvbik7XG5cbmV4cG9ydCBjb25zdCBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgcHJvZmlsZTogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19DT05GSUdfUFJPRklMRVwiLCBcIkRhdGFicmlja3MgQ0xJIHByb2ZpbGUgZW52aXJvbm1lbnQuXCIpLFxuICAgIGhvc3Q6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfSE9TVFwiLCBcIkRhdGFicmlja3MgaG9zdCBlbnZpcm9ubWVudC5cIiksXG4gICAgYWNjb3VudElkOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0FDQ09VTlRfSURcIiwgXCJEYXRhYnJpY2tzIGFjY291bnQgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIHdvcmtzcGFjZUlkOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX1dPUktTUEFDRV9JRFwiLCBcIkRhdGFicmlja3Mgd29ya3NwYWNlIElEIGVudmlyb25tZW50LlwiKSxcbiAgICBjb25maWdGaWxlOiBlbnZpcm9ubWVudE5hbWUoXG4gICAgICBcIkRBVEFCUklDS1NfQ09ORklHX0ZJTEVcIixcbiAgICAgIFwiRGF0YWJyaWNrcyBDTEkgY29uZmlnIGZpbGUgZW52aXJvbm1lbnQuXCIsXG4gICAgKSxcbiAgICBjbGllbnRJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19DTElFTlRfSURcIiwgXCJEYXRhYnJpY2tzIE9BdXRoIGNsaWVudCBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgY2xpZW50U2VjcmV0OiBlbnZpcm9ubWVudE5hbWUoXG4gICAgICBcIkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVFwiLFxuICAgICAgXCJEYXRhYnJpY2tzIE9BdXRoIGNsaWVudCBzZWNyZXQgZW52aXJvbm1lbnQuXCIsXG4gICAgKSxcbiAgICBhY2Nlc3NUb2tlbjogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19UT0tFTlwiLCBcIkRhdGFicmlja3MgYWNjZXNzIHRva2VuIGVudmlyb25tZW50LlwiKSxcbiAgICBncm91cElkOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0dST1VQX0lEXCIsIFwiRGF0YWJyaWNrcyBncm91cCBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgYXV0aFR5cGU6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQVVUSF9UWVBFXCIsIFwiRGF0YWJyaWNrcyBhdXRoIHR5cGUgZW52aXJvbm1lbnQuXCIpLFxuICAgIGFwcE5hbWU6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQVBQX05BTUVcIiwgXCJEYXRhYnJpY2tzIEFwcCBuYW1lIGVudmlyb25tZW50LlwiKSxcbiAgICBhcHBQb3J0OiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0FQUF9QT1JUXCIsIFwiRGF0YWJyaWNrcyBBcHAgcG9ydCBlbnZpcm9ubWVudC5cIiksXG4gICAgbGFrZWJhc2VFbmRwb2ludDogZW52aXJvbm1lbnROYW1lKFwiTEFLRUJBU0VfRU5EUE9JTlRcIiwgXCJMYWtlYmFzZSBlbmRwb2ludCBlbnZpcm9ubWVudC5cIiksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDYW5vbmljYWwgRGF0YWJyaWNrcyBDTEksIFNESywgQXBwcywgYW5kIExha2ViYXNlIGVudmlyb25tZW50IG5hbWVzLlwiKTtcblxuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMgPSB6Lm91dHB1dDx0eXBlb2YgRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXNTY2hlbWE+O1xuXG4vKiogQ2Fub25pY2FsIERhdGFicmlja3MgZW52aXJvbm1lbnQgbmFtZXMgZGVyaXZlZCBmcm9tIHRoZSBvd25pbmcgc2NoZW1hLiAqL1xuZXhwb3J0IGNvbnN0IGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzID0gT2JqZWN0LmZyZWV6ZShEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYS5wYXJzZSh7fSkpO1xuXG5leHBvcnQgY29uc3QgUG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwb3N0Z3Jlc1JvbGU6IGVudmlyb25tZW50TmFtZShcbiAgICAgIFwiREJYX1RPT0xTX1BPU1RHUkVTX1JPTEVcIixcbiAgICAgIFwiUG9zdGdyZVNRTCBhc3N1bWVkLXJvbGUgZW52aXJvbm1lbnQuXCIsXG4gICAgKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIkNhbm9uaWNhbCBkYngtdG9vbHMgUG9zdGdyZVNRTCBlbnZpcm9ubWVudCBuYW1lcy5cIik7XG5cbmV4cG9ydCB0eXBlIFBvc3RncmVzRW52aXJvbm1lbnROYW1lcyA9IHoub3V0cHV0PHR5cGVvZiBQb3N0Z3Jlc0Vudmlyb25tZW50TmFtZXNTY2hlbWE+O1xuXG4vKiogQ2Fub25pY2FsIFBvc3RncmVTUUwgZW52aXJvbm1lbnQgbmFtZXMgZGVyaXZlZCBmcm9tIHRoZSBvd25pbmcgc2NoZW1hLiAqL1xuZXhwb3J0IGNvbnN0IHBvc3RncmVzRW52aXJvbm1lbnROYW1lcyA9IE9iamVjdC5mcmVlemUoUG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzU2NoZW1hLnBhcnNlKHt9KSk7XG5cbmV4cG9ydCBjb25zdCBwb3N0Z3Jlc1JvbGVTY2hlbWEgPSB6XG4gIC5zdHJpbmcoKVxuICAudHJpbSgpXG4gIC5taW4oMSlcbiAgLnJlZ2V4KFxuICAgIC9eW0EtWmEtejAtOS5fQCstXXsxLDI1NX0kLyxcbiAgICBcIlBvc3RncmVTUUwgcm9sZSBtdXN0IGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBkb3QsIHVuZGVyc2NvcmUsIGF0LCBwbHVzLCBvciBoeXBoZW4uXCIsXG4gIClcbiAgLmRlc2NyaWJlKFwiUG9zdGdyZVNRTCByb2xlIGFzc3VtZWQgYWZ0ZXIgYXV0aGVudGljYXRpb24uXCIpO1xuXG5leHBvcnQgY29uc3QgUG9zdGdyZXNPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwb3N0Z3Jlc1JvbGU6IHBvc3RncmVzUm9sZVNjaGVtYVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIlBvc3RncmVTUUwgcm9sZSBhc3N1bWVkIGFmdGVyIGF1dGhlbnRpY2F0aW9uLlwiKVxuICAgICAgLm1ldGEoeyBlbnY6IHBvc3RncmVzRW52aXJvbm1lbnROYW1lcy5wb3N0Z3Jlc1JvbGUgfSksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJTaGFyZWQgUG9zdGdyZVNRTCBzZXNzaW9uIG9wdGlvbnMuXCIpO1xuXG5leHBvcnQgdHlwZSBQb3N0Z3Jlc09wdGlvbnMgPSB6LmlucHV0PHR5cGVvZiBQb3N0Z3Jlc09wdGlvbnNTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgdGNwUG9ydFNjaGVtYSA9IHouY29lcmNlXG4gIC5udW1iZXI8bnVtYmVyPigpXG4gIC5pbnQoKVxuICAubWluKDEpXG4gIC5tYXgoTUFYX1RDUF9QT1JUKVxuICAuZGVzY3JpYmUoXCJUQ1AgcG9ydCBmcm9tIDEgdGhyb3VnaCA2NTUzNS5cIik7XG5cbmV4cG9ydCBjb25zdCB0Y3BQb3J0T3JaZXJvU2NoZW1hID0gei5jb2VyY2VcbiAgLm51bWJlcjxudW1iZXI+KClcbiAgLmludCgpXG4gIC5taW4oMClcbiAgLm1heChNQVhfVENQX1BPUlQpXG4gIC5kZXNjcmliZShcIlRDUCBwb3J0IGZyb20gMCB0aHJvdWdoIDY1NTM1LCB3aGVyZSB6ZXJvIHJlcXVlc3RzIGF1dG9tYXRpYyBhbGxvY2F0aW9uLlwiKTtcblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZWRVcmxTY2hlbWEgPSB6XG4gIC5zdHJpbmcoKVxuICAudHJpbSgpXG4gIC5taW4oMSlcbiAgLnJlZmluZSgodmFsdWUpID0+IHVybEJ1aWxkZXIodmFsdWUpICE9PSB1bmRlZmluZWQsIHtcbiAgICBtZXNzYWdlOiBcIkV4cGVjdGVkIGEgdmFsaWQgVVJMIG9yIGhvc3QuXCIsXG4gIH0pXG4gIC5vdmVyd3JpdGUobm9ybWFsaXplVXJsKVxuICAuZGVzY3JpYmUoXCJVUkwgbm9ybWFsaXplZCB0aHJvdWdoIHRoZSBzaGFyZWQgVVJMIGJ1aWxkZXIuXCIpO1xuXG5jb25zdCBkYXRhYnJpY2tzVGV4dCA9IChkZXNjcmlwdGlvbjogc3RyaW5nKSA9PlxuICB6LnN0cmluZygpLnRyaW0oKS5taW4oMSkub3B0aW9uYWwoKS5kZXNjcmliZShkZXNjcmlwdGlvbik7XG5jb25zdCBkYXRhYnJpY2tzT3B0aW9uTWV0YSA9IChlbnY6IHN0cmluZywgZmxhZyA9IHRydWUpID0+ICh7XG4gIGVudixcbiAgZmxhZyxcbiAgaGVscERlZmF1bHQ6IGZhbHNlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBEYXRhYnJpY2tzT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgcHJvZmlsZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIENMSSBwcm9maWxlLlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMucHJvZmlsZSksXG4gICAgKSxcbiAgICBob3N0OiBub3JtYWxpemVkVXJsU2NoZW1hXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBob3N0LlwiKVxuICAgICAgLm1ldGEoZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuaG9zdCwgZmFsc2UpKSxcbiAgICBhY2NvdW50SWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBhY2NvdW50IElELlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYWNjb3VudElkLCBmYWxzZSksXG4gICAgKSxcbiAgICB3b3Jrc3BhY2VJZDogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIHdvcmtzcGFjZSBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLndvcmtzcGFjZUlkLCBmYWxzZSksXG4gICAgKSxcbiAgICBjb25maWdGaWxlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQ0xJIGNvbmZpZyBmaWxlLlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY29uZmlnRmlsZSwgZmFsc2UpLFxuICAgICksXG4gICAgY2xpZW50SWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgSUQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5jbGllbnRJZCwgZmFsc2UpLFxuICAgICksXG4gICAgY2xpZW50U2VjcmV0OiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IHNlY3JldC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmNsaWVudFNlY3JldCwgZmFsc2UpLFxuICAgICksXG4gICAgYWNjZXNzVG9rZW46IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBhY2Nlc3MgdG9rZW4uXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hY2Nlc3NUb2tlbiwgZmFsc2UpLFxuICAgICksXG4gICAgZ3JvdXBJZDogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIGdyb3VwIElELlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuZ3JvdXBJZCwgZmFsc2UpLFxuICAgICksXG4gICAgYXV0aFR5cGU6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbiB0eXBlLlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYXV0aFR5cGUsIGZhbHNlKSxcbiAgICApLFxuICAgIGFwcE5hbWU6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBBcHAgbmFtZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFwcE5hbWUsIGZhbHNlKSxcbiAgICApLFxuICAgIGFwcFBvcnQ6IHRjcFBvcnRTY2hlbWFcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIEFwcCBwb3J0LlwiKVxuICAgICAgLm1ldGEoZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYXBwUG9ydCwgZmFsc2UpKSxcbiAgICBsYWtlYmFzZUVuZHBvaW50OiBkYXRhYnJpY2tzVGV4dChcIkxha2ViYXNlIGVuZHBvaW50LlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMubGFrZWJhc2VFbmRwb2ludCwgZmFsc2UpLFxuICAgICksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDb21tb24gRGF0YWJyaWNrcyBDTEksIFNESywgQXBwcywgYW5kIExha2ViYXNlIG9wdGlvbnMuXCIpO1xuXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzT3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIERhdGFicmlja3NPcHRpb25zU2NoZW1hPjtcblxuLyoqIEtleSBmb3JtYXQgdXNlZCB3aGVuIHNlcmlhbGl6aW5nIHBhcnNlZCBvcHRpb25zLiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uU2VyaWFsaXphdGlvbkZvcm1hdCA9IFwiZmxhZ1wiIHwgXCJlbnZcIjtcblxuaW50ZXJmYWNlIE9wdGlvblByb3BlcnR5IHtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudj86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBmbGFnPzogYm9vbGVhbjtcbn1cblxuLyoqIFNlcmlhbGl6ZSBjb21wbGV0ZSBwYXJzZWQgb3B0aW9ucyBhcyBhIHByb2Nlc3MgZW52aXJvbm1lbnQgbWFwLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZU9wdHNFbnZpcm9ubWVudDxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIHZhbHVlczogei5pbnB1dDx6LlpvZE9iamVjdDxUPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoc2VyaWFsaXplZE9wdHMoc2NoZW1hLCB2YWx1ZXMsIFwiZW52XCIpKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25WYWx1ZSh2YWx1ZSksXG4gICAgXSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWRPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+PixcbiAgZm9ybWF0OiBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0LFxuKTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKHZhbHVlcykgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBjb25zdCBlbnRyaWVzID0gb3B0aW9uUHJvcGVydGllcyhzY2hlbWEpLmZsYXRNYXAoKHByb3BlcnR5KSA9PiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gXCJmbGFnXCIgJiYgcHJvcGVydHkuZmxhZyA9PT0gZmFsc2UpIHJldHVybiBbXTtcbiAgICBjb25zdCBrZXkgPVxuICAgICAgZm9ybWF0ID09PSBcImZsYWdcIlxuICAgICAgICA/IGAtLSR7dG9TbHVnKHByb3BlcnR5LmtleSl9YFxuICAgICAgICA6IChvcHRpb25FbnZpcm9ubWVudE5hbWVzKHByb3BlcnR5LmtleSwgcHJvcGVydHkuZW52KVswXSA/PyBcIlwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW3Byb3BlcnR5LmtleV07XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBbXSA6IFtba2V5LCBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWUpXSBhcyBjb25zdF07XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufVxuXG5jb25zdCBvcHRpb25hbFRleHQgPSAoZGVzY3JpcHRpb246IHN0cmluZywgZW52OiBzdHJpbmcpID0+XG4gIHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5vcHRpb25hbCgpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKS5tZXRhKHsgZW52LCBmbGFnOiBmYWxzZSB9KTtcblxuZXhwb3J0IGNvbnN0IExha2ViYXNlT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgbGFrZWJhc2VFbmRwb2ludDogb3B0aW9uYWxUZXh0KFxuICAgICAgXCJMYWtlYmFzZSBwcm9qZWN0LCByZXNvdXJjZSBwYXRoLCBob3N0LCBvciBVUkwuXCIsXG4gICAgICBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50LFxuICAgICksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDb21tb24gTGFrZWJhc2Ugb3B0aW9ucy5cIik7XG5cbmV4cG9ydCB0eXBlIExha2ViYXNlT3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIExha2ViYXNlT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBFeHBsaWNpdCBvcHRpb24gdmFsdWVzIG9yIGVudmlyb25tZW50IGVudHJpZXMgY29uc3VtZWQgYnkgb3B0aW9uIHBhcnNpbmcgaGVscGVycy4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvblZhbHVlTWFwID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgbnVsbDtcblxuLyoqIFBhcnNlIG9ubHkgc3VwcGxpZWQgZmxhZyBhbmQgZW52aXJvbm1lbnQgdmFsdWVzIHRocm91Z2ggYW4gb3duaW5nIFpvZCBvYmplY3Qgc2NoZW1hLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3B0czxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIGZsYWdzOiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4gIGVudmlyb25tZW50OiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4pOiBQYXJ0aWFsPHoub3V0cHV0PHouWm9kT2JqZWN0PFQ+Pj4ge1xuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9uVmFsdWVzKHNjaGVtYSwgZmxhZ3MsIGVudmlyb25tZW50KTtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKGNvbmZpZ3VyZWQpO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5rZXlzKGNvbmZpZ3VyZWQpLm1hcCgoa2V5KSA9PiBba2V5LCBwYXJzZWRba2V5IGFzIGtleW9mIHR5cGVvZiBwYXJzZWRdXSksXG4gICkgYXMgUGFydGlhbDx6Lm91dHB1dDx6LlpvZE9iamVjdDxUPj4+O1xufVxuXG4vKiogU3VwcG9ydGVkIGxpc3RlbmVyIHRyYW5zcG9ydCBzY2hlbWVzLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuU2NoZW1lID0gXCJ0Y3BcIiB8IFwidW5peFwiO1xuXG5leHBvcnQgY29uc3QgVGNwTGlzdGVuQWRkcmVzc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgc2NoZW1lOiB6LmxpdGVyYWwoXCJ0Y3BcIiksXG4gICAgaG9zdDogei5zdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKS5taW4oMSksXG4gICAgcG9ydDogdGNwUG9ydE9yWmVyb1NjaGVtYSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIlRDUCBsaXN0ZW5lciBhZGRyZXNzLlwiKTtcblxuZXhwb3J0IGNvbnN0IFVuaXhMaXN0ZW5BZGRyZXNzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBzY2hlbWU6IHoubGl0ZXJhbChcInVuaXhcIiksXG4gICAgcGF0aDogei5zdHJpbmcoKS50cmltKCkubWluKDEpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiVW5peC1kb21haW4gbGlzdGVuZXIgYWRkcmVzcy5cIik7XG5cbi8qKiBUQ1AgbGlzdGVuZXIgcmV0dXJuZWQgYnkge0BsaW5rIGxpc3RlbkFkZHJlc3NTY2hlbWF9LiAqL1xuZXhwb3J0IHR5cGUgVGNwTGlzdGVuQWRkcmVzcyA9IHoub3V0cHV0PHR5cGVvZiBUY3BMaXN0ZW5BZGRyZXNzU2NoZW1hPjtcbi8qKiBVbml4LWRvbWFpbiBsaXN0ZW5lciByZXR1cm5lZCBieSB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgdHlwZSBVbml4TGlzdGVuQWRkcmVzcyA9IHoub3V0cHV0PHR5cGVvZiBVbml4TGlzdGVuQWRkcmVzc1NjaGVtYT47XG4vKiogVHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIGFkZHJlc3MuICovXG5leHBvcnQgdHlwZSBMaXN0ZW5BZGRyZXNzID0gVGNwTGlzdGVuQWRkcmVzcyB8IFVuaXhMaXN0ZW5BZGRyZXNzO1xuXG4vKiogRGVmYXVsdHMgYW5kIHZhbGlkYXRpb24gcG9saWN5IGZvciB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbkFkZHJlc3NPcHRpb25zIHtcbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBsb29wYmFjaz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNjaGVtZT86IExpc3RlblNjaGVtZTtcbiAgcmVhZG9ubHkgc2NoZW1lcz86IHJlYWRvbmx5IExpc3RlblNjaGVtZVtdO1xuICByZWFkb25seSB3aXRoRGVmYXVsdD86IGJvb2xlYW47XG59XG5cbi8qKiBSYXcgbGlzdGVuZXIgaW5wdXQgYWNjZXB0ZWQgYmVmb3JlIHRyYW5zcG9ydC1hd2FyZSBub3JtYWxpemF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuQWRkcmVzc0lucHV0ID0gTGlzdGVuQWRkcmVzcyB8IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zICYge1xuICAgIHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl07XG4gICAgcmVhZG9ubHkgd2l0aERlZmF1bHQ6IGZhbHNlO1xuICB9LFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl0gfSxcbik6IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU8TGlzdGVuQWRkcmVzcywgdW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHdpdGhEZWZhdWx0OiBmYWxzZSB9LFxuKTogei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMsXG4pOiB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+PjtcblxuLyoqIEJ1aWxkIGEgdHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIHNjaGVtYS4gQmFyZSBhZGRyZXNzZXMgdXNlIHRoZSBjb25maWd1cmVkIGRlZmF1bHQgc2NoZW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zLFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+IHwgei5ab2REZWZhdWx0PHouWm9kVHlwZTxMaXN0ZW5BZGRyZXNzLCB1bmtub3duPj4ge1xuICBjb25zdCBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyA9IHtcbiAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgaG9zdDogb3B0aW9ucy5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICB9O1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldDxMaXN0ZW5TY2hlbWU+KG9wdGlvbnMuc2NoZW1lcyA/PyBbXCJ0Y3BcIl0pO1xuICBjb25zdCBzY2hlbWEgPSB6XG4gICAgLnByZXByb2Nlc3MoXG4gICAgICAodmFsdWUpID0+IHBhcnNlTGlzdGVuQWRkcmVzcyh2YWx1ZSwgZGVmYXVsdHMsIG9wdGlvbnMuc2NoZW1lID8/IFwidGNwXCIpLFxuICAgICAgei5kaXNjcmltaW5hdGVkVW5pb24oXCJzY2hlbWVcIiwgW1xuICAgICAgICBUY3BMaXN0ZW5BZGRyZXNzU2NoZW1hLmV4dGVuZCh7XG4gICAgICAgICAgaG9zdDogVGNwTGlzdGVuQWRkcmVzc1NjaGVtYS5zaGFwZS5ob3N0LmRlZmF1bHQoZGVmYXVsdHMuaG9zdCksXG4gICAgICAgICAgcG9ydDogVGNwTGlzdGVuQWRkcmVzc1NjaGVtYS5zaGFwZS5wb3J0LmRlZmF1bHQoZGVmYXVsdHMucG9ydCksXG4gICAgICAgIH0pLFxuICAgICAgICBVbml4TGlzdGVuQWRkcmVzc1NjaGVtYSxcbiAgICAgIF0pLFxuICAgIClcbiAgICAucmVmaW5lKChhZGRyZXNzKSA9PiBhbGxvd2VkLmhhcyhhZGRyZXNzLnNjaGVtZSksIFwiTGlzdGVuZXIgc2NoZW1lIGlzIG5vdCBhbGxvd2VkLlwiKVxuICAgIC5yZWZpbmUoXG4gICAgICAoYWRkcmVzcykgPT4gYWRkcmVzcy5zY2hlbWUgIT09IFwidGNwXCIgfHwgIW9wdGlvbnMubG9vcGJhY2sgfHwgaXNMb29wYmFja0hvc3QoYWRkcmVzcy5ob3N0KSxcbiAgICAgIFwiTGlzdGVuZXIgaG9zdCBtdXN0IGJlIGxvb3BiYWNrLlwiLFxuICAgIClcbiAgICAuZGVzY3JpYmUoXCJUQ1Agb3IgVW5peC1kb21haW4gbGlzdGVuZXIgYWRkcmVzcy5cIikgYXMgei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9ucy53aXRoRGVmYXVsdCA9PT0gZmFsc2UgPyBzY2hlbWEgOiBzY2hlbWEuZGVmYXVsdChkZWZhdWx0cyk7XG59XG5cbi8qKiBSZW5kZXIgYSBsaXN0ZW5lciBhZGRyZXNzIGFzIGEgYHRjcDovL2Agb3IgYHVuaXg6Ly9gIFVSTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRMaXN0ZW5BZGRyZXNzKGFkZHJlc3M6IExpc3RlbkFkZHJlc3MpOiBzdHJpbmcge1xuICBpZiAoYWRkcmVzcy5zY2hlbWUgPT09IFwidW5peFwiKSB7XG4gICAgcmV0dXJuIGB1bml4Oi8vJHthZGRyZXNzLnBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCJ9JHthZGRyZXNzLnBhdGh9YDtcbiAgfVxuICBjb25zdCBob3N0ID0gYWRkcmVzcy5ob3N0LmluY2x1ZGVzKFwiOlwiKSA/IGBbJHthZGRyZXNzLmhvc3R9XWAgOiBhZGRyZXNzLmhvc3Q7XG4gIHJldHVybiBgdGNwOi8vJHtob3N0fToke2FkZHJlc3MucG9ydH1gO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpc3RlbkFkZHJlc3MoXG4gIHZhbHVlOiB1bmtub3duLFxuICBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyxcbiAgZGVmYXVsdFNjaGVtZTogTGlzdGVuU2NoZW1lLFxuKTogdW5rbm93biB7XG4gIGlmIChpc1JlY29yZCh2YWx1ZSkgJiYgdmFsdWUuc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyAuLi52YWx1ZSwgc2NoZW1lOiBcInRjcFwiIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUucGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgLi4udmFsdWUsIHNjaGVtZTogXCJ1bml4XCIgfTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBkZWZhdWx0U2NoZW1lID09PSBcInRjcFwiXG4gICAgICA/IHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB2YWx1ZSB9XG4gICAgICA6IHsgc2NoZW1lOiBcInVuaXhcIiwgcGF0aDogU3RyaW5nKHZhbHVlKSB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgdGV4dCA9IHZhbHVlLnRyaW0oKTtcbiAgaWYgKHRleHQuc3RhcnRzV2l0aChcInVuaXg6Ly9cIikpIHtcbiAgICBjb25zdCBwYXRoID0gdGV4dC5zbGljZShcInVuaXg6Ly9cIi5sZW5ndGgpO1xuICAgIHJldHVybiB7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YCB9O1xuICB9XG4gIGNvbnN0IHRjcCA9IHRleHQuc3RhcnRzV2l0aChcInRjcDovL1wiKSA/IHRleHQuc2xpY2UoXCJ0Y3A6Ly9cIi5sZW5ndGgpIDogdGV4dDtcbiAgaWYgKGRlZmF1bHRTY2hlbWUgPT09IFwidW5peFwiICYmICF0ZXh0LnN0YXJ0c1dpdGgoXCJ0Y3A6Ly9cIikpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB0ZXh0IH07XG4gIH1cbiAgaWYgKC9eXFxkKyQvLnRlc3QodGNwKSkgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB0Y3AgfTtcbiAgaWYgKC9eOlxcZCskLy50ZXN0KHRjcCkpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IGRlZmF1bHRzLmhvc3QsIHBvcnQ6IHRjcC5zbGljZSgxKSB9O1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IHRjcC5tYXRjaCgvXlxcWyhbXlxcXV0rKVxcXSg/OjooXFxkKykpPyQvKTtcbiAgaWYgKGJyYWNrZXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgICBob3N0OiBicmFja2V0ZWRbMV0sXG4gICAgICBwb3J0OiBicmFja2V0ZWRbMl0gPz8gZGVmYXVsdHMucG9ydCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHNlcGFyYXRvciA9IHRjcC5sYXN0SW5kZXhPZihcIjpcIik7XG4gIGlmIChzZXBhcmF0b3IgPiAwICYmICF0Y3Auc2xpY2UoMCwgc2VwYXJhdG9yKS5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1lOiBcInRjcFwiLFxuICAgICAgaG9zdDogdGNwLnNsaWNlKDAsIHNlcGFyYXRvciksXG4gICAgICBwb3J0OiB0Y3Auc2xpY2Uoc2VwYXJhdG9yICsgMSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IHRjcCB8fCBkZWZhdWx0cy5ob3N0LCBwb3J0OiBkZWZhdWx0cy5wb3J0IH07XG59XG5cbmZ1bmN0aW9uIG9wdGlvblByb3BlcnRpZXMoc2NoZW1hOiB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPik6IE9wdGlvblByb3BlcnR5W10ge1xuICBjb25zdCBkb2N1bWVudCA9IHoudG9KU09OU2NoZW1hKHNjaGVtYSk7XG4gIGlmICghaXNSZWNvcmQoZG9jdW1lbnQucHJvcGVydGllcykpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50LnByb3BlcnRpZXMpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0eXBlOiB0eXBlb2YgdmFsdWUudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIGVudjpcbiAgICAgICAgICB0eXBlb2YgdmFsdWUuZW52ID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUuZW52KVxuICAgICAgICAgICAgPyAodmFsdWUuZW52IGFzIHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGZsYWc6IHR5cGVvZiB2YWx1ZS5mbGFnID09PSBcImJvb2xlYW5cIiA/IHZhbHVlLmZsYWcgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKGlzUmVjb3JkKHZhbHVlKSAmJiB2YWx1ZS5zY2hlbWUgPT09IFwidGNwXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlLnBvcnQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBmb3JtYXRMaXN0ZW5BZGRyZXNzKHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB2YWx1ZS5ob3N0LCBwb3J0OiB2YWx1ZS5wb3J0IH0pO1xuICAgIH1cbiAgfVxuICBpZiAoaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLnNjaGVtZSA9PT0gXCJ1bml4XCIgJiYgdHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZm9ybWF0TGlzdGVuQWRkcmVzcyh7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHZhbHVlLnBhdGggfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBlbnZpcm9ubWVudE9wdGlvblZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKFN0cmluZykuam9pbihcIixcIik7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25WYWx1ZXM8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICB2YWx1ZXM6IE9wdGlvblZhbHVlTWFwLFxuICBlbnZpcm9ubWVudDogT3B0aW9uVmFsdWVNYXAsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGRvY3VtZW50ID0gei50b0pTT05TY2hlbWEoc2NoZW1hKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGlzUmVjb3JkKGRvY3VtZW50LnByb3BlcnRpZXMpID8gZG9jdW1lbnQucHJvcGVydGllcyA6IHt9O1xuICBjb25zdCBjb25maWd1cmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHByb3BlcnR5XSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgIGlmICghaXNSZWNvcmQocHJvcGVydHkpKSBjb250aW51ZTtcbiAgICBjb25zdCBleHBsaWNpdCA9IGZpcnN0T3B0aW9uVmFsdWUodmFsdWVzLCBba2V5LCBgLS0ke3RvU2x1ZyhrZXkpfWBdKTtcbiAgICBpZiAoZXhwbGljaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlndXJlZFtrZXldID0gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZShwcm9wZXJ0eS50eXBlLCBleHBsaWNpdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZXMgPSBvcHRpb25FbnZpcm9ubWVudE5hbWVzKGtleSwgcHJvcGVydHkuZW52KTtcbiAgICBjb25zdCBzb3VyY2VkID0gZmlyc3RPcHRpb25WYWx1ZShlbnZpcm9ubWVudCwgbmFtZXMpO1xuICAgIGlmIChzb3VyY2VkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbmZpZ3VyZWRba2V5XSA9IG9wdGlvbkVudmlyb25tZW50VmFsdWUocHJvcGVydHkudHlwZSwgc291cmNlZCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZ3VyZWQ7XG59XG5cbmZ1bmN0aW9uIG9wdGlvbkVudmlyb25tZW50TmFtZXMoa2V5OiBzdHJpbmcsIGNvbmZpZ3VyZWQ6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFtjb25maWd1cmVkXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlndXJlZCkpIHtcbiAgICByZXR1cm4gY29uZmlndXJlZC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIik7XG4gIH1cbiAgcmV0dXJuIFt0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IGRlbGltaXRlcjogXCJfXCIgfSwga2V5KS50b1VwcGVyQ2FzZSgpXTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZSh0eXBlOiB1bmtub3duLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0b0Jvb2xlYW4odmFsdWUpID8/IHZhbHVlO1xuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHBhcnNlTGlzdCh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZmlyc3RPcHRpb25WYWx1ZShzb3VyY2U6IE9wdGlvblZhbHVlTWFwLCBrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IFwiXCIpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVVcmwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IHVybEJ1aWxkZXIodmFsdWUpO1xuICBpZiAoIXVybCkgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBub3JtYWxpemVkID0gdXJsLnRvU3RyaW5nKCk7XG4gIHJldHVybiB1cmwucGF0aG5hbWUgPT09IFwiL1wiICYmICF1cmwuc2VhcmNoICYmICF1cmwuaGFzaCA/IG5vcm1hbGl6ZWQuc2xpY2UoMCwgLTEpIDogbm9ybWFsaXplZDtcbn1cbiJdfQ==
325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEMsTUFBTSxlQUFlLEdBQUcsQ0FBbUIsSUFBTyxFQUFFLFdBQW1CLEVBQUUsRUFBRSxDQUN6RSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQztLQUM5QyxNQUFNLENBQUM7SUFDTixPQUFPLEVBQUUsZUFBZSxDQUFDLDJCQUEyQixFQUFFLHFDQUFxQyxDQUFDO0lBQzVGLElBQUksRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7SUFDeEUsU0FBUyxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxvQ0FBb0MsQ0FBQztJQUN6RixXQUFXLEVBQUUsZUFBZSxDQUFDLHlCQUF5QixFQUFFLHNDQUFzQyxDQUFDO0lBQy9GLFVBQVUsRUFBRSxlQUFlLENBQ3pCLHdCQUF3QixFQUN4Qix5Q0FBeUMsQ0FDMUM7SUFDRCxRQUFRLEVBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFLHlDQUF5QyxDQUFDO0lBQzVGLFlBQVksRUFBRSxlQUFlLENB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Q0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNFLElBQUksYUFBYSxLQUFLLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDaEYsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFF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QWM7SUFDM0QsSUFBSSxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUN6RCxJQUFJLElBQUksS0FBSyxPQUFPLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNFLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsTUFBc0IsRUFBRSxJQUF1QjtJQUN2RSxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzlCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFhO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQyxPQUFPLEdBQUcsQ0FBQyxRQUFRLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUNqRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgb3B0aW9uIHByaW1pdGl2ZXMgc2hhcmVkIGFjcm9zcyBkYngtdG9vbHMgcGFja2FnZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBpc0xvb3BiYWNrSG9zdCwgTUFYX1RDUF9QT1JULCB1cmxCdWlsZGVyIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5pbXBvcnQgeyBpc1JlY29yZCwgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5pbXBvcnQgeyBwYXJzZUxpc3QsIHRvSWRlbnRpZmllcldpdGhPcHRpb25zLCB0b1NsdWcgfSBmcm9tIFwiLi9zdHJpbmctdXRpbHMudHNcIjtcblxuZXhwb3J0IHsgTUFYX1RDUF9QT1JUIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5cbmNvbnN0IGVudmlyb25tZW50TmFtZSA9IDxUIGV4dGVuZHMgc3RyaW5nPihuYW1lOiBULCBkZXNjcmlwdGlvbjogc3RyaW5nKSA9PlxuICB6LmxpdGVyYWwobmFtZSkuZGVmYXVsdChuYW1lKS5kZXNjcmliZShkZXNjcmlwdGlvbik7XG5cbmV4cG9ydCBjb25zdCBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgcHJvZmlsZTogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19DT05GSUdfUFJPRklMRVwiLCBcIkRhdGFicmlja3MgQ0xJIHByb2ZpbGUgZW52aXJvbm1lbnQuXCIpLFxuICAgIGhvc3Q6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfSE9TVFwiLCBcIkRhdGFicmlja3MgaG9zdCBlbnZpcm9ubWVudC5cIiksXG4gICAgYWNjb3VudElkOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0FDQ09VTlRfSURcIiwgXCJEYXRhYnJpY2tzIGFjY291bnQgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIHdvcmtzcGFjZUlkOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX1dPUktTUEFDRV9JRFwiLCBcIkRhdGFicmlja3Mgd29ya3NwYWNlIElEIGVudmlyb25tZW50LlwiKSxcbiAgICBjb25maWdGaWxlOiBlbnZpcm9ubWVudE5hbWUoXG4gICAgICBcIkRBVEFCUklDS1NfQ09ORklHX0ZJTEVcIixcbiAgICAgIFwiRGF0YWJyaWNrcyBDTEkgY29uZmlnIGZpbGUgZW52aXJvbm1lbnQuXCIsXG4gICAgKSxcbiAgICBjbGllbnRJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19DTElFTlRfSURcIiwgXCJEYXRhYnJpY2tzIE9BdXRoIGNsaWVudCBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgY2xpZW50U2VjcmV0OiBlbnZpcm9ubWVudE5hbWUoXG4gICAgICBcIkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVFwiLFxuICAgICAgXCJEYXRhYnJpY2tzIE9BdXRoIGNsaWVudCBzZWNyZXQgZW52aXJvbm1lbnQuXCIsXG4gICAgKSxcbiAgICBhY2Nlc3NUb2tlbjogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19UT0tFTlwiLCBcIkRhdGFicmlja3MgYWNjZXNzIHRva2VuIGVudmlyb25tZW50LlwiKSxcbiAgICBncm91cElkOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0dST1VQX0lEXCIsIFwiRGF0YWJyaWNrcyBncm91cCBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgYXV0aFR5cGU6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQVVUSF9UWVBFXCIsIFwiRGF0YWJyaWNrcyBhdXRoIHR5cGUgZW52aXJvbm1lbnQuXCIpLFxuICAgIGFwcE5hbWU6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQVBQX05BTUVcIiwgXCJEYXRhYnJpY2tzIEFwcCBuYW1lIGVudmlyb25tZW50LlwiKSxcbiAgICBhcHBQb3J0OiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0FQUF9QT1JUXCIsIFwiRGF0YWJyaWNrcyBBcHAgcG9ydCBlbnZpcm9ubWVudC5cIiksXG4gICAgbGFrZWJhc2VFbmRwb2ludDogZW52aXJvbm1lbnROYW1lKFwiTEFLRUJBU0VfRU5EUE9JTlRcIiwgXCJMYWtlYmFzZSBlbmRwb2ludCBlbnZpcm9ubWVudC5cIiksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDYW5vbmljYWwgRGF0YWJyaWNrcyBDTEksIFNESywgQXBwcywgYW5kIExha2ViYXNlIGVudmlyb25tZW50IG5hbWVzLlwiKTtcblxuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMgPSB6Lm91dHB1dDx0eXBlb2YgRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXNTY2hlbWE+O1xuXG4vKiogQ2Fub25pY2FsIERhdGFicmlja3MgZW52aXJvbm1lbnQgbmFtZXMgZGVyaXZlZCBmcm9tIHRoZSBvd25pbmcgc2NoZW1hLiAqL1xuZXhwb3J0IGNvbnN0IGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzID0gT2JqZWN0LmZyZWV6ZShEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYS5wYXJzZSh7fSkpO1xuXG5leHBvcnQgY29uc3QgUG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwb3N0Z3Jlc1JvbGU6IGVudmlyb25tZW50TmFtZShcbiAgICAgIFwiREJYX1RPT0xTX1BPU1RHUkVTX1JPTEVcIixcbiAgICAgIFwiUG9zdGdyZVNRTCBhc3N1bWVkLXJvbGUgZW52aXJvbm1lbnQuXCIsXG4gICAgKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIkNhbm9uaWNhbCBkYngtdG9vbHMgUG9zdGdyZVNRTCBlbnZpcm9ubWVudCBuYW1lcy5cIik7XG5cbmV4cG9ydCB0eXBlIFBvc3RncmVzRW52aXJvbm1lbnROYW1lcyA9IHoub3V0cHV0PHR5cGVvZiBQb3N0Z3Jlc0Vudmlyb25tZW50TmFtZXNTY2hlbWE+O1xuXG4vKiogQ2Fub25pY2FsIFBvc3RncmVTUUwgZW52aXJvbm1lbnQgbmFtZXMgZGVyaXZlZCBmcm9tIHRoZSBvd25pbmcgc2NoZW1hLiAqL1xuZXhwb3J0IGNvbnN0IHBvc3RncmVzRW52aXJvbm1lbnROYW1lcyA9IE9iamVjdC5mcmVlemUoUG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzU2NoZW1hLnBhcnNlKHt9KSk7XG5cbmV4cG9ydCBjb25zdCBwb3N0Z3Jlc1JvbGVTY2hlbWEgPSB6XG4gIC5zdHJpbmcoKVxuICAudHJpbSgpXG4gIC5taW4oMSlcbiAgLnJlZ2V4KFxuICAgIC9eW0EtWmEtejAtOS5fQCstXXsxLDI1NX0kLyxcbiAgICBcIlBvc3RncmVTUUwgcm9sZSBtdXN0IGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBkb3QsIHVuZGVyc2NvcmUsIGF0LCBwbHVzLCBvciBoeXBoZW4uXCIsXG4gIClcbiAgLmRlc2NyaWJlKFwiUG9zdGdyZVNRTCByb2xlIGFzc3VtZWQgYWZ0ZXIgYXV0aGVudGljYXRpb24uXCIpO1xuXG5leHBvcnQgY29uc3QgUG9zdGdyZXNPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwb3N0Z3Jlc1JvbGU6IHBvc3RncmVzUm9sZVNjaGVtYVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIlBvc3RncmVTUUwgcm9sZSBhc3N1bWVkIGFmdGVyIGF1dGhlbnRpY2F0aW9uLlwiKVxuICAgICAgLm1ldGEoeyBlbnY6IHBvc3RncmVzRW52aXJvbm1lbnROYW1lcy5wb3N0Z3Jlc1JvbGUgfSksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJTaGFyZWQgUG9zdGdyZVNRTCBzZXNzaW9uIG9wdGlvbnMuXCIpO1xuXG5leHBvcnQgY29uc3QgUG9zdGdyZXNDb25maWdPcHRpb25zU2NoZW1hID0gUG9zdGdyZXNPcHRpb25zU2NoZW1hLnNhZmVFeHRlbmQoe1xuICBwb3N0Z3Jlc1JvbGU6IFBvc3RncmVzT3B0aW9uc1NjaGVtYS5zaGFwZS5wb3N0Z3Jlc1JvbGUubWV0YSh7IGVudjogXCJQT1NUR1JFU19ST0xFXCIgfSksXG59KS5kZXNjcmliZShcIlBvc3RncmVTUUwgb3B0aW9ucyByZXNvbHZlZCB0aHJvdWdoIHNjb3BlZCBjb25maWd1cmF0aW9uLlwiKTtcblxuZXhwb3J0IHR5cGUgUG9zdGdyZXNPcHRpb25zID0gei5pbnB1dDx0eXBlb2YgUG9zdGdyZXNPcHRpb25zU2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IHRjcFBvcnRTY2hlbWEgPSB6LmNvZXJjZVxuICAubnVtYmVyPG51bWJlcj4oKVxuICAuaW50KClcbiAgLm1pbigxKVxuICAubWF4KE1BWF9UQ1BfUE9SVClcbiAgLmRlc2NyaWJlKFwiVENQIHBvcnQgZnJvbSAxIHRocm91Z2ggNjU1MzUuXCIpO1xuXG5leHBvcnQgY29uc3QgdGNwUG9ydE9yWmVyb1NjaGVtYSA9IHouY29lcmNlXG4gIC5udW1iZXI8bnVtYmVyPigpXG4gIC5pbnQoKVxuICAubWluKDApXG4gIC5tYXgoTUFYX1RDUF9QT1JUKVxuICAuZGVzY3JpYmUoXCJUQ1AgcG9ydCBmcm9tIDAgdGhyb3VnaCA2NTUzNSwgd2hlcmUgemVybyByZXF1ZXN0cyBhdXRvbWF0aWMgYWxsb2NhdGlvbi5cIik7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVkVXJsU2NoZW1hID0gelxuICAuc3RyaW5nKClcbiAgLnRyaW0oKVxuICAubWluKDEpXG4gIC5yZWZpbmUoKHZhbHVlKSA9PiB1cmxCdWlsZGVyKHZhbHVlKSAhPT0gdW5kZWZpbmVkLCB7XG4gICAgbWVzc2FnZTogXCJFeHBlY3RlZCBhIHZhbGlkIFVSTCBvciBob3N0LlwiLFxuICB9KVxuICAub3ZlcndyaXRlKG5vcm1hbGl6ZVVybClcbiAgLmRlc2NyaWJlKFwiVVJMIG5vcm1hbGl6ZWQgdGhyb3VnaCB0aGUgc2hhcmVkIFVSTCBidWlsZGVyLlwiKTtcblxuY29uc3QgZGF0YWJyaWNrc1RleHQgPSAoZGVzY3JpcHRpb246IHN0cmluZykgPT5cbiAgei5zdHJpbmcoKS50cmltKCkubWluKDEpLm9wdGlvbmFsKCkuZGVzY3JpYmUoZGVzY3JpcHRpb24pO1xuY29uc3QgZGF0YWJyaWNrc09wdGlvbk1ldGEgPSAoZW52OiBzdHJpbmcsIGZsYWcgPSB0cnVlKSA9PiAoe1xuICBlbnYsXG4gIGZsYWcsXG4gIGhlbHBEZWZhdWx0OiBmYWxzZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHByb2ZpbGU6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBDTEkgcHJvZmlsZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLnByb2ZpbGUpLFxuICAgICksXG4gICAgaG9zdDogbm9ybWFsaXplZFVybFNjaGVtYVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkRhdGFicmlja3MgaG9zdC5cIilcbiAgICAgIC5tZXRhKGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmhvc3QsIGZhbHNlKSksXG4gICAgYWNjb3VudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYWNjb3VudCBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFjY291bnRJZCwgZmFsc2UpLFxuICAgICksXG4gICAgd29ya3NwYWNlSWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyB3b3Jrc3BhY2UgSUQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy53b3Jrc3BhY2VJZCwgZmFsc2UpLFxuICAgICksXG4gICAgY29uZmlnRmlsZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIENMSSBjb25maWcgZmlsZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmNvbmZpZ0ZpbGUsIGZhbHNlKSxcbiAgICApLFxuICAgIGNsaWVudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IElELlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY2xpZW50SWQsIGZhbHNlKSxcbiAgICApLFxuICAgIGNsaWVudFNlY3JldDogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIE9BdXRoIGNsaWVudCBzZWNyZXQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5jbGllbnRTZWNyZXQsIGZhbHNlKSxcbiAgICApLFxuICAgIGFjY2Vzc1Rva2VuOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYWNjZXNzIHRva2VuLlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYWNjZXNzVG9rZW4sIGZhbHNlKSxcbiAgICApLFxuICAgIGdyb3VwSWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBncm91cCBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmdyb3VwSWQsIGZhbHNlKSxcbiAgICApLFxuICAgIGF1dGhUeXBlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYXV0aGVudGljYXRpb24gdHlwZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmF1dGhUeXBlLCBmYWxzZSksXG4gICAgKSxcbiAgICBhcHBOYW1lOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQXBwIG5hbWUuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hcHBOYW1lLCBmYWxzZSksXG4gICAgKSxcbiAgICBhcHBQb3J0OiB0Y3BQb3J0U2NoZW1hXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBBcHAgcG9ydC5cIilcbiAgICAgIC5tZXRhKGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFwcFBvcnQsIGZhbHNlKSksXG4gICAgbGFrZWJhc2VFbmRwb2ludDogZGF0YWJyaWNrc1RleHQoXCJMYWtlYmFzZSBlbmRwb2ludC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmxha2ViYXNlRW5kcG9pbnQsIGZhbHNlKSxcbiAgICApLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiQ29tbW9uIERhdGFicmlja3MgQ0xJLCBTREssIEFwcHMsIGFuZCBMYWtlYmFzZSBvcHRpb25zLlwiKTtcblxuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc09wdGlvbnMgPSB6LmlucHV0PHR5cGVvZiBEYXRhYnJpY2tzT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBLZXkgZm9ybWF0IHVzZWQgd2hlbiBzZXJpYWxpemluZyBwYXJzZWQgb3B0aW9ucy4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvblNlcmlhbGl6YXRpb25Gb3JtYXQgPSBcImZsYWdcIiB8IFwiZW52XCI7XG5cbmludGVyZmFjZSBPcHRpb25Qcm9wZXJ0eSB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICByZWFkb25seSBlbnY/OiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZmxhZz86IGJvb2xlYW47XG59XG5cbi8qKiBTZXJpYWxpemUgY29tcGxldGUgcGFyc2VkIG9wdGlvbnMgYXMgYSBwcm9jZXNzIGVudmlyb25tZW50IG1hcC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVPcHRzRW52aXJvbm1lbnQ8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICB2YWx1ZXM6IHouaW5wdXQ8ei5ab2RPYmplY3Q8VD4+LFxuKTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHNlcmlhbGl6ZWRPcHRzKHNjaGVtYSwgdmFsdWVzLCBcImVudlwiKSkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgIGtleSxcbiAgICAgIGVudmlyb25tZW50T3B0aW9uVmFsdWUodmFsdWUpLFxuICAgIF0pLFxuICApO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkT3B0czxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIHZhbHVlczogei5pbnB1dDx6LlpvZE9iamVjdDxUPj4sXG4gIGZvcm1hdDogT3B0aW9uU2VyaWFsaXphdGlvbkZvcm1hdCxcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5wYXJzZSh2YWx1ZXMpIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgY29uc3QgZW50cmllcyA9IG9wdGlvblByb3BlcnRpZXMoc2NoZW1hKS5mbGF0TWFwKChwcm9wZXJ0eSkgPT4ge1xuICAgIGlmIChmb3JtYXQgPT09IFwiZmxhZ1wiICYmIHByb3BlcnR5LmZsYWcgPT09IGZhbHNlKSByZXR1cm4gW107XG4gICAgY29uc3Qga2V5ID1cbiAgICAgIGZvcm1hdCA9PT0gXCJmbGFnXCJcbiAgICAgICAgPyBgLS0ke3RvU2x1Zyhwcm9wZXJ0eS5rZXkpfWBcbiAgICAgICAgOiAob3B0aW9uRW52aXJvbm1lbnROYW1lcyhwcm9wZXJ0eS5rZXksIHByb3BlcnR5LmVudilbMF0gPz8gXCJcIik7XG4gICAgaWYgKCFrZXkpIHJldHVybiBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlZFtwcm9wZXJ0eS5rZXldO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gW10gOiBbW2tleSwgc2VyaWFsaXplZE9wdGlvblZhbHVlKHZhbHVlKV0gYXMgY29uc3RdO1xuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcbn1cblxuY29uc3Qgb3B0aW9uYWxUZXh0ID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIGVudjogc3RyaW5nKSA9PlxuICB6LnN0cmluZygpLnRyaW0oKS5taW4oMSkub3B0aW9uYWwoKS5kZXNjcmliZShkZXNjcmlwdGlvbikubWV0YSh7IGVudiwgZmxhZzogZmFsc2UgfSk7XG5cbmV4cG9ydCBjb25zdCBMYWtlYmFzZU9wdGlvbnNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGxha2ViYXNlRW5kcG9pbnQ6IG9wdGlvbmFsVGV4dChcbiAgICAgIFwiTGFrZWJhc2UgcHJvamVjdCwgcmVzb3VyY2UgcGF0aCwgaG9zdCwgb3IgVVJMLlwiLFxuICAgICAgZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMubGFrZWJhc2VFbmRwb2ludCxcbiAgICApLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiQ29tbW9uIExha2ViYXNlIG9wdGlvbnMuXCIpO1xuXG5leHBvcnQgdHlwZSBMYWtlYmFzZU9wdGlvbnMgPSB6LmlucHV0PHR5cGVvZiBMYWtlYmFzZU9wdGlvbnNTY2hlbWE+O1xuXG4vKiogRXhwbGljaXQgb3B0aW9uIHZhbHVlcyBvciBlbnZpcm9ubWVudCBlbnRyaWVzIGNvbnN1bWVkIGJ5IG9wdGlvbiBwYXJzaW5nIGhlbHBlcnMuICovXG5leHBvcnQgdHlwZSBPcHRpb25WYWx1ZU1hcCA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IG51bGw7XG5cbi8qKiBQYXJzZSBvbmx5IHN1cHBsaWVkIGZsYWcgYW5kIGVudmlyb25tZW50IHZhbHVlcyB0aHJvdWdoIGFuIG93bmluZyBab2Qgb2JqZWN0IHNjaGVtYS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9wdHM8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICBmbGFnczogT3B0aW9uVmFsdWVNYXAgPSBudWxsLFxuICBlbnZpcm9ubWVudDogT3B0aW9uVmFsdWVNYXAgPSBudWxsLFxuKTogUGFydGlhbDx6Lm91dHB1dDx6LlpvZE9iamVjdDxUPj4+IHtcbiAgY29uc3QgY29uZmlndXJlZCA9IG9wdGlvblZhbHVlcyhzY2hlbWEsIGZsYWdzLCBlbnZpcm9ubWVudCk7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5wYXJzZShjb25maWd1cmVkKTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3Qua2V5cyhjb25maWd1cmVkKS5tYXAoKGtleSkgPT4gW2tleSwgcGFyc2VkW2tleSBhcyBrZXlvZiB0eXBlb2YgcGFyc2VkXV0pLFxuICApIGFzIFBhcnRpYWw8ei5vdXRwdXQ8ei5ab2RPYmplY3Q8VD4+Pjtcbn1cblxuLyoqIFN1cHBvcnRlZCBsaXN0ZW5lciB0cmFuc3BvcnQgc2NoZW1lcy4gKi9cbmV4cG9ydCB0eXBlIExpc3RlblNjaGVtZSA9IFwidGNwXCIgfCBcInVuaXhcIjtcblxuZXhwb3J0IGNvbnN0IFRjcExpc3RlbkFkZHJlc3NTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHNjaGVtZTogei5saXRlcmFsKFwidGNwXCIpLFxuICAgIGhvc3Q6IHouc3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCkubWluKDEpLFxuICAgIHBvcnQ6IHRjcFBvcnRPclplcm9TY2hlbWEsXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJUQ1AgbGlzdGVuZXIgYWRkcmVzcy5cIik7XG5cbmV4cG9ydCBjb25zdCBVbml4TGlzdGVuQWRkcmVzc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgc2NoZW1lOiB6LmxpdGVyYWwoXCJ1bml4XCIpLFxuICAgIHBhdGg6IHouc3RyaW5nKCkudHJpbSgpLm1pbigxKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIlVuaXgtZG9tYWluIGxpc3RlbmVyIGFkZHJlc3MuXCIpO1xuXG4vKiogVENQIGxpc3RlbmVyIHJldHVybmVkIGJ5IHtAbGluayBsaXN0ZW5BZGRyZXNzU2NoZW1hfS4gKi9cbmV4cG9ydCB0eXBlIFRjcExpc3RlbkFkZHJlc3MgPSB6Lm91dHB1dDx0eXBlb2YgVGNwTGlzdGVuQWRkcmVzc1NjaGVtYT47XG4vKiogVW5peC1kb21haW4gbGlzdGVuZXIgcmV0dXJuZWQgYnkge0BsaW5rIGxpc3RlbkFkZHJlc3NTY2hlbWF9LiAqL1xuZXhwb3J0IHR5cGUgVW5peExpc3RlbkFkZHJlc3MgPSB6Lm91dHB1dDx0eXBlb2YgVW5peExpc3RlbkFkZHJlc3NTY2hlbWE+O1xuLyoqIFRyYW5zcG9ydC1hd2FyZSBsaXN0ZW5lciBhZGRyZXNzLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuQWRkcmVzcyA9IFRjcExpc3RlbkFkZHJlc3MgfCBVbml4TGlzdGVuQWRkcmVzcztcblxuLyoqIERlZmF1bHRzIGFuZCB2YWxpZGF0aW9uIHBvbGljeSBmb3Ige0BsaW5rIGxpc3RlbkFkZHJlc3NTY2hlbWF9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0ZW5BZGRyZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgcmVhZG9ubHkgbG9vcGJhY2s/OiBib29sZWFuO1xuICByZWFkb25seSBzY2hlbWU/OiBMaXN0ZW5TY2hlbWU7XG4gIHJlYWRvbmx5IHNjaGVtZXM/OiByZWFkb25seSBMaXN0ZW5TY2hlbWVbXTtcbiAgcmVhZG9ubHkgd2l0aERlZmF1bHQ/OiBib29sZWFuO1xufVxuXG4vKiogUmF3IGxpc3RlbmVyIGlucHV0IGFjY2VwdGVkIGJlZm9yZSB0cmFuc3BvcnQtYXdhcmUgbm9ybWFsaXphdGlvbi4gKi9cbmV4cG9ydCB0eXBlIExpc3RlbkFkZHJlc3NJbnB1dCA9IExpc3RlbkFkZHJlc3MgfCBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW5BZGRyZXNzU2NoZW1hKFxuICBvcHRpb25zOiBMaXN0ZW5BZGRyZXNzT3B0aW9ucyAmIHtcbiAgICByZWFkb25seSBzY2hlbWVzOiByZWFkb25seSBbXCJ0Y3BcIiwgXCJ1bml4XCJdO1xuICAgIHJlYWRvbmx5IHdpdGhEZWZhdWx0OiBmYWxzZTtcbiAgfSxcbik6IHouWm9kVHlwZTxMaXN0ZW5BZGRyZXNzLCB1bmtub3duPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zICYgeyByZWFkb25seSBzY2hlbWVzOiByZWFkb25seSBbXCJ0Y3BcIiwgXCJ1bml4XCJdIH0sXG4pOiB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zICYgeyByZWFkb25seSB3aXRoRGVmYXVsdDogZmFsc2UgfSxcbik6IHouWm9kVHlwZTxUY3BMaXN0ZW5BZGRyZXNzLCB1bmtub3duPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zLFxuKTogei5ab2REZWZhdWx0PHouWm9kVHlwZTxUY3BMaXN0ZW5BZGRyZXNzLCB1bmtub3duPj47XG5cbi8qKiBCdWlsZCBhIHRyYW5zcG9ydC1hd2FyZSBsaXN0ZW5lciBzY2hlbWEuIEJhcmUgYWRkcmVzc2VzIHVzZSB0aGUgY29uZmlndXJlZCBkZWZhdWx0IHNjaGVtZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW5BZGRyZXNzU2NoZW1hKFxuICBvcHRpb25zOiBMaXN0ZW5BZGRyZXNzT3B0aW9ucyxcbik6IHouWm9kVHlwZTxMaXN0ZW5BZGRyZXNzLCB1bmtub3duPiB8IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU8TGlzdGVuQWRkcmVzcywgdW5rbm93bj4+IHtcbiAgY29uc3QgZGVmYXVsdHM6IFRjcExpc3RlbkFkZHJlc3MgPSB7XG4gICAgc2NoZW1lOiBcInRjcFwiLFxuICAgIGhvc3Q6IG9wdGlvbnMuaG9zdCA/PyBcImxvY2FsaG9zdFwiLFxuICAgIHBvcnQ6IG9wdGlvbnMucG9ydCxcbiAgfTtcbiAgY29uc3QgYWxsb3dlZCA9IG5ldyBTZXQ8TGlzdGVuU2NoZW1lPihvcHRpb25zLnNjaGVtZXMgPz8gW1widGNwXCJdKTtcbiAgY29uc3Qgc2NoZW1hID0gelxuICAgIC5wcmVwcm9jZXNzKFxuICAgICAgKHZhbHVlKSA9PiBwYXJzZUxpc3RlbkFkZHJlc3ModmFsdWUsIGRlZmF1bHRzLCBvcHRpb25zLnNjaGVtZSA/PyBcInRjcFwiKSxcbiAgICAgIHouZGlzY3JpbWluYXRlZFVuaW9uKFwic2NoZW1lXCIsIFtcbiAgICAgICAgVGNwTGlzdGVuQWRkcmVzc1NjaGVtYS5leHRlbmQoe1xuICAgICAgICAgIGhvc3Q6IFRjcExpc3RlbkFkZHJlc3NTY2hlbWEuc2hhcGUuaG9zdC5kZWZhdWx0KGRlZmF1bHRzLmhvc3QpLFxuICAgICAgICAgIHBvcnQ6IFRjcExpc3RlbkFkZHJlc3NTY2hlbWEuc2hhcGUucG9ydC5kZWZhdWx0KGRlZmF1bHRzLnBvcnQpLFxuICAgICAgICB9KSxcbiAgICAgICAgVW5peExpc3RlbkFkZHJlc3NTY2hlbWEsXG4gICAgICBdKSxcbiAgICApXG4gICAgLnJlZmluZSgoYWRkcmVzcykgPT4gYWxsb3dlZC5oYXMoYWRkcmVzcy5zY2hlbWUpLCBcIkxpc3RlbmVyIHNjaGVtZSBpcyBub3QgYWxsb3dlZC5cIilcbiAgICAucmVmaW5lKFxuICAgICAgKGFkZHJlc3MpID0+IGFkZHJlc3Muc2NoZW1lICE9PSBcInRjcFwiIHx8ICFvcHRpb25zLmxvb3BiYWNrIHx8IGlzTG9vcGJhY2tIb3N0KGFkZHJlc3MuaG9zdCksXG4gICAgICBcIkxpc3RlbmVyIGhvc3QgbXVzdCBiZSBsb29wYmFjay5cIixcbiAgICApXG4gICAgLmRlc2NyaWJlKFwiVENQIG9yIFVuaXgtZG9tYWluIGxpc3RlbmVyIGFkZHJlc3MuXCIpIGFzIHouWm9kVHlwZTxMaXN0ZW5BZGRyZXNzLCB1bmtub3duPjtcbiAgcmV0dXJuIG9wdGlvbnMud2l0aERlZmF1bHQgPT09IGZhbHNlID8gc2NoZW1hIDogc2NoZW1hLmRlZmF1bHQoZGVmYXVsdHMpO1xufVxuXG4vKiogUmVuZGVyIGEgbGlzdGVuZXIgYWRkcmVzcyBhcyBhIGB0Y3A6Ly9gIG9yIGB1bml4Oi8vYCBVUkwuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TGlzdGVuQWRkcmVzcyhhZGRyZXNzOiBMaXN0ZW5BZGRyZXNzKTogc3RyaW5nIHtcbiAgaWYgKGFkZHJlc3Muc2NoZW1lID09PSBcInVuaXhcIikge1xuICAgIHJldHVybiBgdW5peDovLyR7YWRkcmVzcy5wYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wifSR7YWRkcmVzcy5wYXRofWA7XG4gIH1cbiAgY29uc3QgaG9zdCA9IGFkZHJlc3MuaG9zdC5pbmNsdWRlcyhcIjpcIikgPyBgWyR7YWRkcmVzcy5ob3N0fV1gIDogYWRkcmVzcy5ob3N0O1xuICByZXR1cm4gYHRjcDovLyR7aG9zdH06JHthZGRyZXNzLnBvcnR9YDtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaXN0ZW5BZGRyZXNzKFxuICB2YWx1ZTogdW5rbm93bixcbiAgZGVmYXVsdHM6IFRjcExpc3RlbkFkZHJlc3MsXG4gIGRlZmF1bHRTY2hlbWU6IExpc3RlblNjaGVtZSxcbik6IHVua25vd24ge1xuICBpZiAoaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLnNjaGVtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZS5ob3N0ID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHsgLi4udmFsdWUsIHNjaGVtZTogXCJ0Y3BcIiB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IC4uLnZhbHVlLCBzY2hlbWU6IFwidW5peFwiIH07XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gZGVmYXVsdFNjaGVtZSA9PT0gXCJ0Y3BcIlxuICAgICAgPyB7IHNjaGVtZTogXCJ0Y3BcIiwgaG9zdDogZGVmYXVsdHMuaG9zdCwgcG9ydDogdmFsdWUgfVxuICAgICAgOiB7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IFN0cmluZyh2YWx1ZSkgfTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHRleHQgPSB2YWx1ZS50cmltKCk7XG4gIGlmICh0ZXh0LnN0YXJ0c1dpdGgoXCJ1bml4Oi8vXCIpKSB7XG4gICAgY29uc3QgcGF0aCA9IHRleHQuc2xpY2UoXCJ1bml4Oi8vXCIubGVuZ3RoKTtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWAgfTtcbiAgfVxuICBjb25zdCB0Y3AgPSB0ZXh0LnN0YXJ0c1dpdGgoXCJ0Y3A6Ly9cIikgPyB0ZXh0LnNsaWNlKFwidGNwOi8vXCIubGVuZ3RoKSA6IHRleHQ7XG4gIGlmIChkZWZhdWx0U2NoZW1lID09PSBcInVuaXhcIiAmJiAhdGV4dC5zdGFydHNXaXRoKFwidGNwOi8vXCIpKSB7XG4gICAgcmV0dXJuIHsgc2NoZW1lOiBcInVuaXhcIiwgcGF0aDogdGV4dCB9O1xuICB9XG4gIGlmICgvXlxcZCskLy50ZXN0KHRjcCkpIHJldHVybiB7IHNjaGVtZTogXCJ0Y3BcIiwgaG9zdDogZGVmYXVsdHMuaG9zdCwgcG9ydDogdGNwIH07XG4gIGlmICgvXjpcXGQrJC8udGVzdCh0Y3ApKSB7XG4gICAgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB0Y3Auc2xpY2UoMSkgfTtcbiAgfVxuICBjb25zdCBicmFja2V0ZWQgPSB0Y3AubWF0Y2goL15cXFsoW15cXF1dKylcXF0oPzo6KFxcZCspKT8kLyk7XG4gIGlmIChicmFja2V0ZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1lOiBcInRjcFwiLFxuICAgICAgaG9zdDogYnJhY2tldGVkWzFdLFxuICAgICAgcG9ydDogYnJhY2tldGVkWzJdID8/IGRlZmF1bHRzLnBvcnQsXG4gICAgfTtcbiAgfVxuICBjb25zdCBzZXBhcmF0b3IgPSB0Y3AubGFzdEluZGV4T2YoXCI6XCIpO1xuICBpZiAoc2VwYXJhdG9yID4gMCAmJiAhdGNwLnNsaWNlKDAsIHNlcGFyYXRvcikuaW5jbHVkZXMoXCI6XCIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtZTogXCJ0Y3BcIixcbiAgICAgIGhvc3Q6IHRjcC5zbGljZSgwLCBzZXBhcmF0b3IpLFxuICAgICAgcG9ydDogdGNwLnNsaWNlKHNlcGFyYXRvciArIDEpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB0Y3AgfHwgZGVmYXVsdHMuaG9zdCwgcG9ydDogZGVmYXVsdHMucG9ydCB9O1xufVxuXG5mdW5jdGlvbiBvcHRpb25Qcm9wZXJ0aWVzKHNjaGVtYTogei5ab2RPYmplY3Q8ei5ab2RSYXdTaGFwZT4pOiBPcHRpb25Qcm9wZXJ0eVtdIHtcbiAgY29uc3QgZG9jdW1lbnQgPSB6LnRvSlNPTlNjaGVtYShzY2hlbWEpO1xuICBpZiAoIWlzUmVjb3JkKGRvY3VtZW50LnByb3BlcnRpZXMpKSByZXR1cm4gW107XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhkb2N1bWVudC5wcm9wZXJ0aWVzKS5mbGF0TWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGtleSxcbiAgICAgICAgdHlwZTogdHlwZW9mIHZhbHVlLnR5cGUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS50eXBlIDogdW5kZWZpbmVkLFxuICAgICAgICBlbnY6XG4gICAgICAgICAgdHlwZW9mIHZhbHVlLmVudiA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlLmVudilcbiAgICAgICAgICAgID8gKHZhbHVlLmVudiBhcyBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBmbGFnOiB0eXBlb2YgdmFsdWUuZmxhZyA9PT0gXCJib29sZWFuXCIgPyB2YWx1ZS5mbGFnIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICBdO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplZE9wdGlvblZhbHVlKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChpc1JlY29yZCh2YWx1ZSkgJiYgdmFsdWUuc2NoZW1lID09PSBcInRjcFwiKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZS5ob3N0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZS5wb3J0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gZm9ybWF0TGlzdGVuQWRkcmVzcyh7IHNjaGVtZTogXCJ0Y3BcIiwgaG9zdDogdmFsdWUuaG9zdCwgcG9ydDogdmFsdWUucG9ydCB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzUmVjb3JkKHZhbHVlKSAmJiB2YWx1ZS5zY2hlbWUgPT09IFwidW5peFwiICYmIHR5cGVvZiB2YWx1ZS5wYXRoID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGZvcm1hdExpc3RlbkFkZHJlc3MoeyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB2YWx1ZS5wYXRoIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZW52aXJvbm1lbnRPcHRpb25WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcChTdHJpbmcpLmpvaW4oXCIsXCIpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uVmFsdWVzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiBPcHRpb25WYWx1ZU1hcCxcbiAgZW52aXJvbm1lbnQ6IE9wdGlvblZhbHVlTWFwLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBkb2N1bWVudCA9IHoudG9KU09OU2NoZW1hKHNjaGVtYSk7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBpc1JlY29yZChkb2N1bWVudC5wcm9wZXJ0aWVzKSA/IGRvY3VtZW50LnByb3BlcnRpZXMgOiB7fTtcbiAgY29uc3QgY29uZmlndXJlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCBwcm9wZXJ0eV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykpIHtcbiAgICBpZiAoIWlzUmVjb3JkKHByb3BlcnR5KSkgY29udGludWU7XG4gICAgY29uc3QgZXhwbGljaXQgPSBmaXJzdE9wdGlvblZhbHVlKHZhbHVlcywgW2tleSwgYC0tJHt0b1NsdWcoa2V5KX1gXSk7XG4gICAgaWYgKGV4cGxpY2l0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZ3VyZWRba2V5XSA9IG9wdGlvbkVudmlyb25tZW50VmFsdWUocHJvcGVydHkudHlwZSwgZXhwbGljaXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWVzID0gb3B0aW9uRW52aXJvbm1lbnROYW1lcyhrZXksIHByb3BlcnR5LmVudik7XG4gICAgY29uc3Qgc291cmNlZCA9IGZpcnN0T3B0aW9uVmFsdWUoZW52aXJvbm1lbnQsIG5hbWVzKTtcbiAgICBpZiAoc291cmNlZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25maWd1cmVkW2tleV0gPSBvcHRpb25FbnZpcm9ubWVudFZhbHVlKHByb3BlcnR5LnR5cGUsIHNvdXJjZWQpO1xuICB9XG4gIHJldHVybiBjb25maWd1cmVkO1xufVxuXG5mdW5jdGlvbiBvcHRpb25FbnZpcm9ubWVudE5hbWVzKGtleTogc3RyaW5nLCBjb25maWd1cmVkOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIGNvbmZpZ3VyZWQgPT09IFwic3RyaW5nXCIpIHJldHVybiBbY29uZmlndXJlZF07XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZ3VyZWQpKSB7XG4gICAgcmV0dXJuIGNvbmZpZ3VyZWQuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpO1xuICB9XG4gIHJldHVybiBbdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoeyBkZWxpbWl0ZXI6IFwiX1wiIH0sIGtleSkudG9VcHBlckNhc2UoKV07XG59XG5cbmZ1bmN0aW9uIG9wdGlvbkVudmlyb25tZW50VmFsdWUodHlwZTogdW5rbm93biwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHR5cGUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdG9Cb29sZWFuKHZhbHVlKSA/PyB2YWx1ZTtcbiAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIiAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiBwYXJzZUxpc3QodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGZpcnN0T3B0aW9uVmFsdWUoc291cmNlOiBPcHRpb25WYWx1ZU1hcCwga2V5czogcmVhZG9ubHkgc3RyaW5nW10pOiB1bmtub3duIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSBcIlwiKSByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVXJsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB1cmwgPSB1cmxCdWlsZGVyKHZhbHVlKTtcbiAgaWYgKCF1cmwpIHJldHVybiB2YWx1ZTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHVybC50b1N0cmluZygpO1xuICByZXR1cm4gdXJsLnBhdGhuYW1lID09PSBcIi9cIiAmJiAhdXJsLnNlYXJjaCAmJiAhdXJsLmhhc2ggPyBub3JtYWxpemVkLnNsaWNlKDAsIC0xKSA6IG5vcm1hbGl6ZWQ7XG59XG4iXX0=
package/package.json CHANGED
@@ -114,7 +114,7 @@
114
114
  "./package.json": "./package.json"
115
115
  }
116
116
  },
117
- "version": "0.9.121",
117
+ "version": "0.9.122",
118
118
  "types": "./lib/index.d.ts",
119
119
  "dbxToolsConfig": {
120
120
  "tags": [
@@ -1,22 +1,35 @@
1
1
  import { MAX_TCP_PORT } from "./net.ts";
2
2
  import { toBoolean } from "./object.ts";
3
3
 
4
+ /** Databricks Apps container working tree used when App env vars are not yet injected. */
5
+ export const DATABRICKS_APP_SOURCE_ROOT = "/app/python/source_code";
6
+
7
+ function runtimeProcess():
8
+ { env?: Record<string, string | undefined>; cwd?: () => string } | undefined {
9
+ return (
10
+ globalThis as typeof globalThis & {
11
+ process?: { env?: Record<string, string | undefined>; cwd?: () => string };
12
+ }
13
+ ).process;
14
+ }
15
+
4
16
  function runtimeEnvironment(): Record<string, string | undefined> {
17
+ return runtimeProcess()?.env ?? {};
18
+ }
19
+
20
+ function runtimeCwd(): string {
21
+ return runtimeProcess()?.cwd?.() ?? "";
22
+ }
23
+
24
+ function isDatabricksAppSourceTree(cwd: string): boolean {
25
+ const normalized = cwd.replaceAll("\\", "/").replace(/\/+$/, "");
5
26
  return (
6
- (
7
- globalThis as typeof globalThis & {
8
- process?: { env?: Record<string, string | undefined> };
9
- }
10
- ).process?.env ?? {}
27
+ normalized === DATABRICKS_APP_SOURCE_ROOT ||
28
+ normalized.startsWith(`${DATABRICKS_APP_SOURCE_ROOT}/`)
11
29
  );
12
30
  }
13
31
 
14
- /** Detect a Databricks App runtime from its workspace host plus App name or port. */
15
- export function isDatabricksAppEnv(
16
- source: Record<string, string | undefined> = runtimeEnvironment(),
17
- ): boolean {
18
- const override = toBoolean(source.DBX_TOOLS_DATABRICKS_APP_ENV);
19
- if (override !== undefined) return override;
32
+ function hasDatabricksAppEnv(source: Record<string, string | undefined>): boolean {
20
33
  const name = source.DATABRICKS_APP_NAME?.trim();
21
34
  const host = source.DATABRICKS_HOST?.trim();
22
35
  const port = source.DATABRICKS_APP_PORT?.trim();
@@ -33,3 +46,21 @@ export function isDatabricksAppEnv(
33
46
  return false;
34
47
  }
35
48
  }
49
+
50
+ /**
51
+ * Detect a Databricks App runtime from its workspace host plus App name or port,
52
+ * or from the Apps container source tree when those variables are not yet set.
53
+ *
54
+ * `DBX_TOOLS_DATABRICKS_APP_ENV` takes precedence when it contains a recognized
55
+ * boolean value. This lets local tools emulate the deployed runtime (`true`) or
56
+ * lets unusual deployed processes retain local config lookup (`false`). An
57
+ * absent or unrecognized override falls back to structural detection.
58
+ */
59
+ export function isDatabricksAppEnv(
60
+ source: Record<string, string | undefined> = runtimeEnvironment(),
61
+ cwd: string = runtimeCwd(),
62
+ ): boolean {
63
+ const override = toBoolean(source.DBX_TOOLS_DATABRICKS_APP_ENV);
64
+ if (override !== undefined) return override;
65
+ return hasDatabricksAppEnv(source) || isDatabricksAppSourceTree(cwd);
66
+ }
package/src/options.ts CHANGED
@@ -79,6 +79,10 @@ export const PostgresOptionsSchema = z
79
79
  .strict()
80
80
  .describe("Shared PostgreSQL session options.");
81
81
 
82
+ export const PostgresConfigOptionsSchema = PostgresOptionsSchema.safeExtend({
83
+ postgresRole: PostgresOptionsSchema.shape.postgresRole.meta({ env: "POSTGRES_ROLE" }),
84
+ }).describe("PostgreSQL options resolved through scoped configuration.");
85
+
82
86
  export type PostgresOptions = z.input<typeof PostgresOptionsSchema>;
83
87
 
84
88
  export const tcpPortSchema = z.coerce