@dbx-tools/shared-core 0.9.40 → 0.9.46

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.
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Browser-safe option primitives shared across dbx-tools packages.
3
+ *
4
+ * @module
5
+ */
6
+ import { z } from "zod";
7
+ import { isLoopbackHost, urlBuilder } from "./net.js";
8
+ import { isRecord, toBoolean } from "./object.js";
9
+ import { parseList, toIdentifierWithOptions, toSlug } from "./string-utils.js";
10
+ const environmentName = (name, description) => z.literal(name).default(name).describe(description);
11
+ export const DatabricksEnvironmentNamesSchema = z
12
+ .object({
13
+ profile: environmentName("DATABRICKS_CONFIG_PROFILE", "Databricks CLI profile environment."),
14
+ host: environmentName("DATABRICKS_HOST", "Databricks host environment."),
15
+ accountId: environmentName("DATABRICKS_ACCOUNT_ID", "Databricks account ID environment."),
16
+ workspaceId: environmentName("DATABRICKS_WORKSPACE_ID", "Databricks workspace ID environment."),
17
+ configFile: environmentName("DATABRICKS_CONFIG_FILE", "Databricks CLI config file environment."),
18
+ clientId: environmentName("DATABRICKS_CLIENT_ID", "Databricks OAuth client ID environment."),
19
+ clientSecret: environmentName("DATABRICKS_CLIENT_SECRET", "Databricks OAuth client secret environment."),
20
+ accessToken: environmentName("DATABRICKS_TOKEN", "Databricks access token environment."),
21
+ groupId: environmentName("DATABRICKS_GROUP_ID", "Databricks group ID environment."),
22
+ authType: environmentName("DATABRICKS_AUTH_TYPE", "Databricks auth type environment."),
23
+ appName: environmentName("DATABRICKS_APP_NAME", "Databricks App name environment."),
24
+ appPort: environmentName("DATABRICKS_APP_PORT", "Databricks App port environment."),
25
+ lakebaseEndpoint: environmentName("LAKEBASE_ENDPOINT", "Lakebase endpoint environment."),
26
+ })
27
+ .strict()
28
+ .describe("Canonical Databricks CLI, SDK, Apps, and Lakebase environment names.");
29
+ /** Canonical Databricks environment names derived from the owning schema. */
30
+ export const databricksEnvironmentNames = Object.freeze(DatabricksEnvironmentNamesSchema.parse({}));
31
+ /** Highest valid TCP port number. */
32
+ export const MAX_TCP_PORT = 65_535;
33
+ export const tcpPortSchema = z.coerce
34
+ .number()
35
+ .int()
36
+ .min(1)
37
+ .max(MAX_TCP_PORT)
38
+ .describe("TCP port from 1 through 65535.");
39
+ export const tcpPortOrZeroSchema = z.coerce
40
+ .number()
41
+ .int()
42
+ .min(0)
43
+ .max(MAX_TCP_PORT)
44
+ .describe("TCP port from 0 through 65535, where zero requests automatic allocation.");
45
+ export const normalizedUrlSchema = z
46
+ .string()
47
+ .trim()
48
+ .min(1)
49
+ .refine((value) => urlBuilder(value) !== undefined, {
50
+ message: "Expected a valid URL or host.",
51
+ })
52
+ .overwrite(normalizeUrl)
53
+ .describe("URL normalized through the shared URL builder.");
54
+ const databricksText = (description) => z.string().trim().min(1).optional().describe(description);
55
+ const databricksOptionMeta = (env, flag = true) => ({
56
+ env,
57
+ flag,
58
+ helpDefault: false,
59
+ });
60
+ export const DatabricksOptionsSchema = z
61
+ .object({
62
+ profile: databricksText("Databricks CLI profile.").meta(databricksOptionMeta(databricksEnvironmentNames.profile)),
63
+ host: normalizedUrlSchema
64
+ .optional()
65
+ .describe("Databricks host.")
66
+ .meta(databricksOptionMeta(databricksEnvironmentNames.host, false)),
67
+ accountId: databricksText("Databricks account ID.").meta(databricksOptionMeta(databricksEnvironmentNames.accountId, false)),
68
+ workspaceId: databricksText("Databricks workspace ID.").meta(databricksOptionMeta(databricksEnvironmentNames.workspaceId, false)),
69
+ configFile: databricksText("Databricks CLI config file.").meta(databricksOptionMeta(databricksEnvironmentNames.configFile, false)),
70
+ clientId: databricksText("Databricks OAuth client ID.").meta(databricksOptionMeta(databricksEnvironmentNames.clientId, false)),
71
+ clientSecret: databricksText("Databricks OAuth client secret.").meta(databricksOptionMeta(databricksEnvironmentNames.clientSecret, false)),
72
+ accessToken: databricksText("Databricks access token.").meta(databricksOptionMeta(databricksEnvironmentNames.accessToken, false)),
73
+ groupId: databricksText("Databricks group ID.").meta(databricksOptionMeta(databricksEnvironmentNames.groupId, false)),
74
+ authType: databricksText("Databricks authentication type.").meta(databricksOptionMeta(databricksEnvironmentNames.authType, false)),
75
+ appName: databricksText("Databricks App name.").meta(databricksOptionMeta(databricksEnvironmentNames.appName, false)),
76
+ appPort: tcpPortSchema
77
+ .optional()
78
+ .describe("Databricks App port.")
79
+ .meta(databricksOptionMeta(databricksEnvironmentNames.appPort, false)),
80
+ lakebaseEndpoint: databricksText("Lakebase endpoint.").meta(databricksOptionMeta(databricksEnvironmentNames.lakebaseEndpoint, false)),
81
+ })
82
+ .strict()
83
+ .describe("Common Databricks CLI, SDK, Apps, and Lakebase options.");
84
+ /** Serialize complete parsed options as JSON keyed by flags or environment names. */
85
+ export function serializeOpts(schema, values, format) {
86
+ return JSON.stringify(serializedOpts(schema, values, format), null, 2);
87
+ }
88
+ /** Serialize complete parsed options as a process environment map. */
89
+ export function serializeOptsEnvironment(schema, values) {
90
+ return Object.fromEntries(Object.entries(serializedOpts(schema, values, "env")).map(([key, value]) => [
91
+ key,
92
+ environmentOptionValue(value),
93
+ ]));
94
+ }
95
+ /** Namespace a reusable option schema so composed CLI flags render as `--<namespace>-<field>`. */
96
+ export function namespaceOpts(schema, prefix) {
97
+ const shape = Object.fromEntries(Object.entries(schema.shape).map(([key, field]) => [namespacedOptionKey(prefix, key), field]));
98
+ return z.object(shape).strict();
99
+ }
100
+ /** Parse namespaced option values back through their owning schema. */
101
+ export function unnamespaceOpts(schema, values, prefix) {
102
+ const source = values;
103
+ return schema.parse(Object.fromEntries(Object.keys(schema.shape).map((key) => [key, source[namespacedOptionKey(prefix, key)]])));
104
+ }
105
+ function namespacedOptionKey(prefix, key) {
106
+ return `${prefix}${key.charAt(0).toUpperCase()}${key.slice(1)}`;
107
+ }
108
+ function serializedOpts(schema, values, format) {
109
+ const parsed = schema.parse(values);
110
+ const entries = optionProperties(schema).flatMap((property) => {
111
+ if (format === "flag" && property.flag === false)
112
+ return [];
113
+ const key = format === "flag"
114
+ ? `--${toSlug(property.key)}`
115
+ : (optionEnvironmentNames(property.key, property.env)[0] ?? "");
116
+ if (!key)
117
+ return [];
118
+ const value = parsed[property.key];
119
+ return value === undefined ? [] : [[key, serializedOptionValue(value)]];
120
+ });
121
+ return Object.fromEntries(entries);
122
+ }
123
+ const optionalText = (description, env) => z.string().trim().min(1).optional().describe(description).meta({ env, flag: false });
124
+ export const LakebaseOptionsSchema = z
125
+ .object({
126
+ lakebaseEndpoint: optionalText("Lakebase project, resource path, host, or URL.", databricksEnvironmentNames.lakebaseEndpoint),
127
+ })
128
+ .strict()
129
+ .describe("Common Lakebase options.");
130
+ /** Parse only supplied flag and environment values through an owning Zod object schema. */
131
+ export function parseOpts(schema, flags = null, environment = null) {
132
+ const configured = optionValues(schema, flags, environment);
133
+ const parsed = schema.parse(configured);
134
+ return Object.fromEntries(Object.keys(configured).map((key) => [key, parsed[key]]));
135
+ }
136
+ /** Build a transport-aware listener schema. Bare addresses use the configured default scheme. */
137
+ export function listenAddressSchema(options) {
138
+ const defaults = {
139
+ scheme: "tcp",
140
+ host: options.host ?? "localhost",
141
+ port: options.port,
142
+ };
143
+ const allowed = new Set(options.schemes ?? ["tcp"]);
144
+ const schema = z
145
+ .preprocess((value) => parseListenAddress(value, defaults, options.scheme ?? "tcp"), z.discriminatedUnion("scheme", [
146
+ z
147
+ .object({
148
+ scheme: z.literal("tcp"),
149
+ host: z.string().trim().toLowerCase().min(1).default(defaults.host),
150
+ port: tcpPortOrZeroSchema.default(defaults.port),
151
+ })
152
+ .strict(),
153
+ z
154
+ .object({
155
+ scheme: z.literal("unix"),
156
+ path: z.string().trim().min(1),
157
+ })
158
+ .strict(),
159
+ ]))
160
+ .refine((address) => allowed.has(address.scheme), "Listener scheme is not allowed.")
161
+ .refine((address) => address.scheme !== "tcp" || !options.loopback || isLoopbackHost(address.host), "Listener host must be loopback.")
162
+ .describe("TCP or Unix-domain listener address.");
163
+ return options.withDefault === false ? schema : schema.default(defaults);
164
+ }
165
+ /** Render a listener address as a `tcp://` or `unix://` URL. */
166
+ export function formatListenAddress(address) {
167
+ if (address.scheme === "unix") {
168
+ return `unix://${address.path.startsWith("/") ? "" : "/"}${address.path}`;
169
+ }
170
+ const host = address.host.includes(":") ? `[${address.host}]` : address.host;
171
+ return `tcp://${host}:${address.port}`;
172
+ }
173
+ function parseListenAddress(value, defaults, defaultScheme) {
174
+ if (isRecord(value) && value.scheme === undefined) {
175
+ if (typeof value.host === "string" && value.port !== undefined) {
176
+ return { ...value, scheme: "tcp" };
177
+ }
178
+ if (typeof value.path === "string") {
179
+ return { ...value, scheme: "unix" };
180
+ }
181
+ }
182
+ if (typeof value === "number") {
183
+ return defaultScheme === "tcp"
184
+ ? { scheme: "tcp", host: defaults.host, port: value }
185
+ : { scheme: "unix", path: String(value) };
186
+ }
187
+ if (typeof value !== "string")
188
+ return value;
189
+ const text = value.trim();
190
+ if (text.startsWith("unix://")) {
191
+ const path = text.slice("unix://".length);
192
+ return { scheme: "unix", path: path.startsWith("/") ? path : `/${path}` };
193
+ }
194
+ const tcp = text.startsWith("tcp://") ? text.slice("tcp://".length) : text;
195
+ if (defaultScheme === "unix" && !text.startsWith("tcp://")) {
196
+ return { scheme: "unix", path: text };
197
+ }
198
+ if (/^\d+$/.test(tcp))
199
+ return { scheme: "tcp", host: defaults.host, port: tcp };
200
+ if (/^:\d+$/.test(tcp)) {
201
+ return { scheme: "tcp", host: defaults.host, port: tcp.slice(1) };
202
+ }
203
+ const bracketed = tcp.match(/^\[([^\]]+)\](?::(\d+))?$/);
204
+ if (bracketed) {
205
+ return {
206
+ scheme: "tcp",
207
+ host: bracketed[1],
208
+ port: bracketed[2] ?? defaults.port,
209
+ };
210
+ }
211
+ const separator = tcp.lastIndexOf(":");
212
+ if (separator > 0 && !tcp.slice(0, separator).includes(":")) {
213
+ return {
214
+ scheme: "tcp",
215
+ host: tcp.slice(0, separator),
216
+ port: tcp.slice(separator + 1),
217
+ };
218
+ }
219
+ return { scheme: "tcp", host: tcp || defaults.host, port: defaults.port };
220
+ }
221
+ function optionProperties(schema) {
222
+ const document = z.toJSONSchema(schema);
223
+ if (!isRecord(document.properties))
224
+ return [];
225
+ return Object.entries(document.properties).flatMap(([key, value]) => {
226
+ if (!isRecord(value))
227
+ return [];
228
+ return [
229
+ {
230
+ key,
231
+ type: typeof value.type === "string" ? value.type : undefined,
232
+ env: typeof value.env === "string" || Array.isArray(value.env)
233
+ ? value.env
234
+ : undefined,
235
+ flag: typeof value.flag === "boolean" ? value.flag : undefined,
236
+ },
237
+ ];
238
+ });
239
+ }
240
+ function serializedOptionValue(value) {
241
+ if (isRecord(value) && value.scheme === "tcp") {
242
+ if (typeof value.host === "string" && typeof value.port === "number") {
243
+ return formatListenAddress({ scheme: "tcp", host: value.host, port: value.port });
244
+ }
245
+ }
246
+ if (isRecord(value) && value.scheme === "unix" && typeof value.path === "string") {
247
+ return formatListenAddress({ scheme: "unix", path: value.path });
248
+ }
249
+ return value;
250
+ }
251
+ function environmentOptionValue(value) {
252
+ if (Array.isArray(value))
253
+ return value.map(String).join(",");
254
+ if (typeof value === "object" && value !== null)
255
+ return JSON.stringify(value);
256
+ return String(value);
257
+ }
258
+ function optionValues(schema, values, environment) {
259
+ const document = z.toJSONSchema(schema);
260
+ const properties = isRecord(document.properties) ? document.properties : {};
261
+ const configured = {};
262
+ for (const [key, property] of Object.entries(properties)) {
263
+ if (!isRecord(property))
264
+ continue;
265
+ const explicit = firstOptionValue(values, [key, `--${toSlug(key)}`]);
266
+ if (explicit !== undefined) {
267
+ configured[key] = optionEnvironmentValue(property.type, explicit);
268
+ continue;
269
+ }
270
+ const names = optionEnvironmentNames(key, property.env);
271
+ const sourced = firstOptionValue(environment, names);
272
+ if (sourced === undefined)
273
+ continue;
274
+ configured[key] = optionEnvironmentValue(property.type, sourced);
275
+ }
276
+ return configured;
277
+ }
278
+ function optionEnvironmentNames(key, configured) {
279
+ if (typeof configured === "string")
280
+ return [configured];
281
+ if (Array.isArray(configured)) {
282
+ return configured.filter((value) => typeof value === "string");
283
+ }
284
+ return [toIdentifierWithOptions({ delimiter: "_" }, key).toUpperCase()];
285
+ }
286
+ function optionEnvironmentValue(type, value) {
287
+ if (type === "boolean")
288
+ return toBoolean(value) ?? value;
289
+ if (type === "array" && typeof value === "string")
290
+ return parseList(value);
291
+ return value;
292
+ }
293
+ function firstOptionValue(source, keys) {
294
+ if (!source)
295
+ return undefined;
296
+ for (const key of keys) {
297
+ const value = source[key];
298
+ if (value !== undefined && value !== null && value !== "")
299
+ return value;
300
+ }
301
+ return undefined;
302
+ }
303
+ function normalizeUrl(value) {
304
+ const url = urlBuilder(value);
305
+ if (!url)
306
+ return value;
307
+ const normalized = url.toString();
308
+ return url.pathname === "/" && !url.search && !url.hash ? normalized.slice(0, -1) : normalized;
309
+ }
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0UsTUFBTSxlQUFlLEdBQUcsQ0FBbUIsSUFBTyxFQUFFLFdBQW1CLEVBQUUsRUFBRSxDQUN6RSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQztLQUM5QyxNQUFNLENBQUM7SUFDTixPQUFPLEVBQUUsZUFBZSxDQUFDLDJCQUEyQixFQUFFLHFDQUFxQyxDQUFDO0lBQzVGLElBQUksRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7SUFDeEUsU0FBUyxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxvQ0FBb0MsQ0FBQztJQUN6RixXQUFXLEVBQUUsZUFBZSxDQUFDLHlCQUF5QixFQUFFLHNDQUFzQyxDQUFDO0lBQy9GLFVBQVUsRUFBRSxlQUFlLENBQ3pCLHdCQUF3QixFQUN4Qix5Q0FBeUMsQ0FDMUM7SUFDRCxRQUFRLEVBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFLHlDQUF5QyxDQUFDO0lBQzVGLFlBQVksRUFBRSxlQUFlLENBQzNCLDBCQUEwQixFQUMxQiw2Q0FBNkMsQ0FDOUM7SUFDRCxXQUFXLEVBQUUsZUFBZSxD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QUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRSxJQUFJLGFBQWEsS0FBSyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2hGLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLEdB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LE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE1BQXNCLEVBQUUsSUFBdUI7SUFDdkUsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFFLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYTtJQUNqQyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEMsT0FBTyxHQUFHLENBQUMsUUFBUSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDakcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3Nlci1zYWZlIG9wdGlvbiBwcmltaXRpdmVzIHNoYXJlZCBhY3Jvc3MgZGJ4LXRvb2xzIHBhY2thZ2VzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgaXNMb29wYmFja0hvc3QsIHVybEJ1aWxkZXIgfSBmcm9tIFwiLi9uZXQudHNcIjtcbmltcG9ydCB7IGlzUmVjb3JkLCB0b0Jvb2xlYW4gfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcbmltcG9ydCB7IHBhcnNlTGlzdCwgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMsIHRvU2x1ZyB9IGZyb20gXCIuL3N0cmluZy11dGlscy50c1wiO1xuXG5jb25zdCBlbnZpcm9ubWVudE5hbWUgPSA8VCBleHRlbmRzIHN0cmluZz4obmFtZTogVCwgZGVzY3JpcHRpb246IHN0cmluZykgPT5cbiAgei5saXRlcmFsKG5hbWUpLmRlZmF1bHQobmFtZSkuZGVzY3JpYmUoZGVzY3JpcHRpb24pO1xuXG5leHBvcnQgY29uc3QgRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHByb2ZpbGU6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEVcIiwgXCJEYXRhYnJpY2tzIENMSSBwcm9maWxlIGVudmlyb25tZW50LlwiKSxcbiAgICBob3N0OiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0hPU1RcIiwgXCJEYXRhYnJpY2tzIGhvc3QgZW52aXJvbm1lbnQuXCIpLFxuICAgIGFjY291bnRJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BQ0NPVU5UX0lEXCIsIFwiRGF0YWJyaWNrcyBhY2NvdW50IElEIGVudmlyb25tZW50LlwiKSxcbiAgICB3b3Jrc3BhY2VJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19XT1JLU1BBQ0VfSURcIiwgXCJEYXRhYnJpY2tzIHdvcmtzcGFjZSBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgY29uZmlnRmlsZTogZW52aXJvbm1lbnROYW1lKFxuICAgICAgXCJEQVRBQlJJQ0tTX0NPTkZJR19GSUxFXCIsXG4gICAgICBcIkRhdGFicmlja3MgQ0xJIGNvbmZpZyBmaWxlIGVudmlyb25tZW50LlwiLFxuICAgICksXG4gICAgY2xpZW50SWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQ0xJRU5UX0lEXCIsIFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGNsaWVudFNlY3JldDogZW52aXJvbm1lbnROYW1lKFxuICAgICAgXCJEQVRBQlJJQ0tTX0NMSUVOVF9TRUNSRVRcIixcbiAgICAgIFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgc2VjcmV0IGVudmlyb25tZW50LlwiLFxuICAgICksXG4gICAgYWNjZXNzVG9rZW46IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfVE9LRU5cIiwgXCJEYXRhYnJpY2tzIGFjY2VzcyB0b2tlbiBlbnZpcm9ubWVudC5cIiksXG4gICAgZ3JvdXBJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19HUk9VUF9JRFwiLCBcIkRhdGFicmlja3MgZ3JvdXAgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGF1dGhUeXBlOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0FVVEhfVFlQRVwiLCBcIkRhdGFicmlja3MgYXV0aCB0eXBlIGVudmlyb25tZW50LlwiKSxcbiAgICBhcHBOYW1lOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0FQUF9OQU1FXCIsIFwiRGF0YWJyaWNrcyBBcHAgbmFtZSBlbnZpcm9ubWVudC5cIiksXG4gICAgYXBwUG9ydDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BUFBfUE9SVFwiLCBcIkRhdGFicmlja3MgQXBwIHBvcnQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGxha2ViYXNlRW5kcG9pbnQ6IGVudmlyb25tZW50TmFtZShcIkxBS0VCQVNFX0VORFBPSU5UXCIsIFwiTGFrZWJhc2UgZW5kcG9pbnQgZW52aXJvbm1lbnQuXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiQ2Fub25pY2FsIERhdGFicmlja3MgQ0xJLCBTREssIEFwcHMsIGFuZCBMYWtlYmFzZSBlbnZpcm9ubWVudCBuYW1lcy5cIik7XG5cbmV4cG9ydCB0eXBlIERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzID0gei5vdXRwdXQ8dHlwZW9mIERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hPjtcblxuLyoqIENhbm9uaWNhbCBEYXRhYnJpY2tzIGVudmlyb25tZW50IG5hbWVzIGRlcml2ZWQgZnJvbSB0aGUgb3duaW5nIHNjaGVtYS4gKi9cbmV4cG9ydCBjb25zdCBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcyA9IE9iamVjdC5mcmVlemUoRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXNTY2hlbWEucGFyc2Uoe30pKTtcblxuLyoqIEhpZ2hlc3QgdmFsaWQgVENQIHBvcnQgbnVtYmVyLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9UQ1BfUE9SVCA9IDY1XzUzNTtcblxuZXhwb3J0IGNvbnN0IHRjcFBvcnRTY2hlbWEgPSB6LmNvZXJjZVxuICAubnVtYmVyPG51bWJlcj4oKVxuICAuaW50KClcbiAgLm1pbigxKVxuICAubWF4KE1BWF9UQ1BfUE9SVClcbiAgLmRlc2NyaWJlKFwiVENQIHBvcnQgZnJvbSAxIHRocm91Z2ggNjU1MzUuXCIpO1xuXG5leHBvcnQgY29uc3QgdGNwUG9ydE9yWmVyb1NjaGVtYSA9IHouY29lcmNlXG4gIC5udW1iZXI8bnVtYmVyPigpXG4gIC5pbnQoKVxuICAubWluKDApXG4gIC5tYXgoTUFYX1RDUF9QT1JUKVxuICAuZGVzY3JpYmUoXCJUQ1AgcG9ydCBmcm9tIDAgdGhyb3VnaCA2NTUzNSwgd2hlcmUgemVybyByZXF1ZXN0cyBhdXRvbWF0aWMgYWxsb2NhdGlvbi5cIik7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVkVXJsU2NoZW1hID0gelxuICAuc3RyaW5nKClcbiAgLnRyaW0oKVxuICAubWluKDEpXG4gIC5yZWZpbmUoKHZhbHVlKSA9PiB1cmxCdWlsZGVyKHZhbHVlKSAhPT0gdW5kZWZpbmVkLCB7XG4gICAgbWVzc2FnZTogXCJFeHBlY3RlZCBhIHZhbGlkIFVSTCBvciBob3N0LlwiLFxuICB9KVxuICAub3ZlcndyaXRlKG5vcm1hbGl6ZVVybClcbiAgLmRlc2NyaWJlKFwiVVJMIG5vcm1hbGl6ZWQgdGhyb3VnaCB0aGUgc2hhcmVkIFVSTCBidWlsZGVyLlwiKTtcblxuY29uc3QgZGF0YWJyaWNrc1RleHQgPSAoZGVzY3JpcHRpb246IHN0cmluZykgPT5cbiAgei5zdHJpbmcoKS50cmltKCkubWluKDEpLm9wdGlvbmFsKCkuZGVzY3JpYmUoZGVzY3JpcHRpb24pO1xuY29uc3QgZGF0YWJyaWNrc09wdGlvbk1ldGEgPSAoZW52OiBzdHJpbmcsIGZsYWcgPSB0cnVlKSA9PiAoe1xuICBlbnYsXG4gIGZsYWcsXG4gIGhlbHBEZWZhdWx0OiBmYWxzZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHByb2ZpbGU6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBDTEkgcHJvZmlsZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLnByb2ZpbGUpLFxuICAgICksXG4gICAgaG9zdDogbm9ybWFsaXplZFVybFNjaGVtYVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkRhdGFicmlja3MgaG9zdC5cIilcbiAgICAgIC5tZXRhKGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmhvc3QsIGZhbHNlKSksXG4gICAgYWNjb3VudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYWNjb3VudCBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFjY291bnRJZCwgZmFsc2UpLFxuICAgICksXG4gICAgd29ya3NwYWNlSWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyB3b3Jrc3BhY2UgSUQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy53b3Jrc3BhY2VJZCwgZmFsc2UpLFxuICAgICksXG4gICAgY29uZmlnRmlsZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIENMSSBjb25maWcgZmlsZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmNvbmZpZ0ZpbGUsIGZhbHNlKSxcbiAgICApLFxuICAgIGNsaWVudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IElELlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY2xpZW50SWQsIGZhbHNlKSxcbiAgICApLFxuICAgIGNsaWVudFNlY3JldDogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIE9BdXRoIGNsaWVudCBzZWNyZXQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5jbGllbnRTZWNyZXQsIGZhbHNlKSxcbiAgICApLFxuICAgIGFjY2Vzc1Rva2VuOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYWNjZXNzIHRva2VuLlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYWNjZXNzVG9rZW4sIGZhbHNlKSxcbiAgICApLFxuICAgIGdyb3VwSWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBncm91cCBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmdyb3VwSWQsIGZhbHNlKSxcbiAgICApLFxuICAgIGF1dGhUeXBlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYXV0aGVudGljYXRpb24gdHlwZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmF1dGhUeXBlLCBmYWxzZSksXG4gICAgKSxcbiAgICBhcHBOYW1lOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQXBwIG5hbWUuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hcHBOYW1lLCBmYWxzZSksXG4gICAgKSxcbiAgICBhcHBQb3J0OiB0Y3BQb3J0U2NoZW1hXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBBcHAgcG9ydC5cIilcbiAgICAgIC5tZXRhKGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFwcFBvcnQsIGZhbHNlKSksXG4gICAgbGFrZWJhc2VFbmRwb2ludDogZGF0YWJyaWNrc1RleHQoXCJMYWtlYmFzZSBlbmRwb2ludC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmxha2ViYXNlRW5kcG9pbnQsIGZhbHNlKSxcbiAgICApLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiQ29tbW9uIERhdGFicmlja3MgQ0xJLCBTREssIEFwcHMsIGFuZCBMYWtlYmFzZSBvcHRpb25zLlwiKTtcblxuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc09wdGlvbnMgPSB6LmlucHV0PHR5cGVvZiBEYXRhYnJpY2tzT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBLZXkgZm9ybWF0IGVtaXR0ZWQgYnkge0BsaW5rIHNlcmlhbGl6ZU9wdHN9LiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uU2VyaWFsaXphdGlvbkZvcm1hdCA9IFwiZmxhZ1wiIHwgXCJlbnZcIjtcblxuLyoqIE5hbWVzcGFjZSBldmVyeSBvcHRpb24gZmllbGQgd2hpbGUgcmV0YWluaW5nIGl0cyBvd25pbmcgWm9kIGZpZWxkIHNjaGVtYXMuICovXG5leHBvcnQgdHlwZSBOYW1lc3BhY2VkT3B0aW9uU2hhcGU8VCBleHRlbmRzIHouWm9kUmF3U2hhcGUsIFByZWZpeCBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgVCBhcyBLZXkgZXh0ZW5kcyBzdHJpbmcgPyBgJHtQcmVmaXh9JHtDYXBpdGFsaXplPEtleT59YCA6IG5ldmVyXTogVFtLZXldO1xufTtcblxuaW50ZXJmYWNlIE9wdGlvblByb3BlcnR5IHtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudj86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBmbGFnPzogYm9vbGVhbjtcbn1cblxuLyoqIFNlcmlhbGl6ZSBjb21wbGV0ZSBwYXJzZWQgb3B0aW9ucyBhcyBKU09OIGtleWVkIGJ5IGZsYWdzIG9yIGVudmlyb25tZW50IG5hbWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZU9wdHM8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICB2YWx1ZXM6IHouaW5wdXQ8ei5ab2RPYmplY3Q8VD4+LFxuICBmb3JtYXQ6IE9wdGlvblNlcmlhbGl6YXRpb25Gb3JtYXQsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZE9wdHMoc2NoZW1hLCB2YWx1ZXMsIGZvcm1hdCksIG51bGwsIDIpO1xufVxuXG4vKiogU2VyaWFsaXplIGNvbXBsZXRlIHBhcnNlZCBvcHRpb25zIGFzIGEgcHJvY2VzcyBlbnZpcm9ubWVudCBtYXAuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplT3B0c0Vudmlyb25tZW50PFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+Pixcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhzZXJpYWxpemVkT3B0cyhzY2hlbWEsIHZhbHVlcywgXCJlbnZcIikpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICBrZXksXG4gICAgICBlbnZpcm9ubWVudE9wdGlvblZhbHVlKHZhbHVlKSxcbiAgICBdKSxcbiAgKTtcbn1cblxuLyoqIE5hbWVzcGFjZSBhIHJldXNhYmxlIG9wdGlvbiBzY2hlbWEgc28gY29tcG9zZWQgQ0xJIGZsYWdzIHJlbmRlciBhcyBgLS08bmFtZXNwYWNlPi08ZmllbGQ+YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lc3BhY2VPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlLCBQcmVmaXggZXh0ZW5kcyBzdHJpbmc+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICBwcmVmaXg6IFByZWZpeCxcbik6IHouWm9kT2JqZWN0PE5hbWVzcGFjZWRPcHRpb25TaGFwZTxULCBQcmVmaXg+PiB7XG4gIGNvbnN0IHNoYXBlID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHNjaGVtYS5zaGFwZSkubWFwKChba2V5LCBmaWVsZF0pID0+IFtuYW1lc3BhY2VkT3B0aW9uS2V5KHByZWZpeCwga2V5KSwgZmllbGRdKSxcbiAgKTtcbiAgcmV0dXJuIHoub2JqZWN0KHNoYXBlKS5zdHJpY3QoKSBhcyB6LlpvZE9iamVjdDxOYW1lc3BhY2VkT3B0aW9uU2hhcGU8VCwgUHJlZml4Pj47XG59XG5cbi8qKiBQYXJzZSBuYW1lc3BhY2VkIG9wdGlvbiB2YWx1ZXMgYmFjayB0aHJvdWdoIHRoZWlyIG93bmluZyBzY2hlbWEuICovXG5leHBvcnQgZnVuY3Rpb24gdW5uYW1lc3BhY2VPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiBvYmplY3QsXG4gIHByZWZpeDogc3RyaW5nLFxuKTogei5vdXRwdXQ8ei5ab2RPYmplY3Q8VD4+IHtcbiAgY29uc3Qgc291cmNlID0gdmFsdWVzIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgcmV0dXJuIHNjaGVtYS5wYXJzZShcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3Qua2V5cyhzY2hlbWEuc2hhcGUpLm1hcCgoa2V5KSA9PiBba2V5LCBzb3VyY2VbbmFtZXNwYWNlZE9wdGlvbktleShwcmVmaXgsIGtleSldXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gbmFtZXNwYWNlZE9wdGlvbktleShwcmVmaXg6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cHJlZml4fSR7a2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7a2V5LnNsaWNlKDEpfWA7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWRPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+PixcbiAgZm9ybWF0OiBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0LFxuKTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKHZhbHVlcykgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBjb25zdCBlbnRyaWVzID0gb3B0aW9uUHJvcGVydGllcyhzY2hlbWEpLmZsYXRNYXAoKHByb3BlcnR5KSA9PiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gXCJmbGFnXCIgJiYgcHJvcGVydHkuZmxhZyA9PT0gZmFsc2UpIHJldHVybiBbXTtcbiAgICBjb25zdCBrZXkgPVxuICAgICAgZm9ybWF0ID09PSBcImZsYWdcIlxuICAgICAgICA/IGAtLSR7dG9TbHVnKHByb3BlcnR5LmtleSl9YFxuICAgICAgICA6IChvcHRpb25FbnZpcm9ubWVudE5hbWVzKHByb3BlcnR5LmtleSwgcHJvcGVydHkuZW52KVswXSA/PyBcIlwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW3Byb3BlcnR5LmtleV07XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBbXSA6IFtba2V5LCBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWUpXSBhcyBjb25zdF07XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufVxuXG5jb25zdCBvcHRpb25hbFRleHQgPSAoZGVzY3JpcHRpb246IHN0cmluZywgZW52OiBzdHJpbmcpID0+XG4gIHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5vcHRpb25hbCgpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKS5tZXRhKHsgZW52LCBmbGFnOiBmYWxzZSB9KTtcblxuZXhwb3J0IGNvbnN0IExha2ViYXNlT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgbGFrZWJhc2VFbmRwb2ludDogb3B0aW9uYWxUZXh0KFxuICAgICAgXCJMYWtlYmFzZSBwcm9qZWN0LCByZXNvdXJjZSBwYXRoLCBob3N0LCBvciBVUkwuXCIsXG4gICAgICBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50LFxuICAgICksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDb21tb24gTGFrZWJhc2Ugb3B0aW9ucy5cIik7XG5cbmV4cG9ydCB0eXBlIExha2ViYXNlT3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIExha2ViYXNlT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBFeHBsaWNpdCBvcHRpb24gdmFsdWVzIG9yIGVudmlyb25tZW50IGVudHJpZXMgY29uc3VtZWQgYnkgb3B0aW9uIHBhcnNpbmcgaGVscGVycy4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvblZhbHVlTWFwID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgbnVsbDtcblxuLyoqIFBhcnNlIG9ubHkgc3VwcGxpZWQgZmxhZyBhbmQgZW52aXJvbm1lbnQgdmFsdWVzIHRocm91Z2ggYW4gb3duaW5nIFpvZCBvYmplY3Qgc2NoZW1hLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3B0czxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIGZsYWdzOiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4gIGVudmlyb25tZW50OiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4pOiBQYXJ0aWFsPHoub3V0cHV0PHouWm9kT2JqZWN0PFQ+Pj4ge1xuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9uVmFsdWVzKHNjaGVtYSwgZmxhZ3MsIGVudmlyb25tZW50KTtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKGNvbmZpZ3VyZWQpO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5rZXlzKGNvbmZpZ3VyZWQpLm1hcCgoa2V5KSA9PiBba2V5LCBwYXJzZWRba2V5IGFzIGtleW9mIHR5cGVvZiBwYXJzZWRdXSksXG4gICkgYXMgUGFydGlhbDx6Lm91dHB1dDx6LlpvZE9iamVjdDxUPj4+O1xufVxuXG4vKiogU3VwcG9ydGVkIGxpc3RlbmVyIHRyYW5zcG9ydCBzY2hlbWVzLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuU2NoZW1lID0gXCJ0Y3BcIiB8IFwidW5peFwiO1xuXG4vKiogVENQIGxpc3RlbmVyIHJldHVybmVkIGJ5IHtAbGluayBsaXN0ZW5BZGRyZXNzU2NoZW1hfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGNwTGlzdGVuQWRkcmVzcyB7XG4gIHJlYWRvbmx5IHNjaGVtZTogXCJ0Y3BcIjtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG59XG5cbi8qKiBVbml4LWRvbWFpbiBsaXN0ZW5lciByZXR1cm5lZCBieSB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaXhMaXN0ZW5BZGRyZXNzIHtcbiAgcmVhZG9ubHkgc2NoZW1lOiBcInVuaXhcIjtcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKiogVHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIGFkZHJlc3MuICovXG5leHBvcnQgdHlwZSBMaXN0ZW5BZGRyZXNzID0gVGNwTGlzdGVuQWRkcmVzcyB8IFVuaXhMaXN0ZW5BZGRyZXNzO1xuXG4vKiogRGVmYXVsdHMgYW5kIHZhbGlkYXRpb24gcG9saWN5IGZvciB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbkFkZHJlc3NPcHRpb25zIHtcbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBsb29wYmFjaz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNjaGVtZT86IExpc3RlblNjaGVtZTtcbiAgcmVhZG9ubHkgc2NoZW1lcz86IHJlYWRvbmx5IExpc3RlblNjaGVtZVtdO1xuICByZWFkb25seSB3aXRoRGVmYXVsdD86IGJvb2xlYW47XG59XG5cbi8qKiBSYXcgbGlzdGVuZXIgaW5wdXQgYWNjZXB0ZWQgYmVmb3JlIHRyYW5zcG9ydC1hd2FyZSBub3JtYWxpemF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuQWRkcmVzc0lucHV0ID0gTGlzdGVuQWRkcmVzcyB8IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zICYge1xuICAgIHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl07XG4gICAgcmVhZG9ubHkgd2l0aERlZmF1bHQ6IGZhbHNlO1xuICB9LFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl0gfSxcbik6IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU8TGlzdGVuQWRkcmVzcywgdW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHdpdGhEZWZhdWx0OiBmYWxzZSB9LFxuKTogei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMsXG4pOiB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+PjtcblxuLyoqIEJ1aWxkIGEgdHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIHNjaGVtYS4gQmFyZSBhZGRyZXNzZXMgdXNlIHRoZSBjb25maWd1cmVkIGRlZmF1bHQgc2NoZW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zLFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+IHwgei5ab2REZWZhdWx0PHouWm9kVHlwZTxMaXN0ZW5BZGRyZXNzLCB1bmtub3duPj4ge1xuICBjb25zdCBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyA9IHtcbiAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgaG9zdDogb3B0aW9ucy5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICB9O1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldDxMaXN0ZW5TY2hlbWU+KG9wdGlvbnMuc2NoZW1lcyA/PyBbXCJ0Y3BcIl0pO1xuICBjb25zdCBzY2hlbWEgPSB6XG4gICAgLnByZXByb2Nlc3MoXG4gICAgICAodmFsdWUpID0+IHBhcnNlTGlzdGVuQWRkcmVzcyh2YWx1ZSwgZGVmYXVsdHMsIG9wdGlvbnMuc2NoZW1lID8/IFwidGNwXCIpLFxuICAgICAgei5kaXNjcmltaW5hdGVkVW5pb24oXCJzY2hlbWVcIiwgW1xuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICBzY2hlbWU6IHoubGl0ZXJhbChcInRjcFwiKSxcbiAgICAgICAgICAgIGhvc3Q6IHouc3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCkubWluKDEpLmRlZmF1bHQoZGVmYXVsdHMuaG9zdCksXG4gICAgICAgICAgICBwb3J0OiB0Y3BQb3J0T3JaZXJvU2NoZW1hLmRlZmF1bHQoZGVmYXVsdHMucG9ydCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc3RyaWN0KCksXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHNjaGVtZTogei5saXRlcmFsKFwidW5peFwiKSxcbiAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkudHJpbSgpLm1pbigxKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zdHJpY3QoKSxcbiAgICAgIF0pLFxuICAgIClcbiAgICAucmVmaW5lKChhZGRyZXNzKSA9PiBhbGxvd2VkLmhhcyhhZGRyZXNzLnNjaGVtZSksIFwiTGlzdGVuZXIgc2NoZW1lIGlzIG5vdCBhbGxvd2VkLlwiKVxuICAgIC5yZWZpbmUoXG4gICAgICAoYWRkcmVzcykgPT4gYWRkcmVzcy5zY2hlbWUgIT09IFwidGNwXCIgfHwgIW9wdGlvbnMubG9vcGJhY2sgfHwgaXNMb29wYmFja0hvc3QoYWRkcmVzcy5ob3N0KSxcbiAgICAgIFwiTGlzdGVuZXIgaG9zdCBtdXN0IGJlIGxvb3BiYWNrLlwiLFxuICAgIClcbiAgICAuZGVzY3JpYmUoXCJUQ1Agb3IgVW5peC1kb21haW4gbGlzdGVuZXIgYWRkcmVzcy5cIikgYXMgei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9ucy53aXRoRGVmYXVsdCA9PT0gZmFsc2UgPyBzY2hlbWEgOiBzY2hlbWEuZGVmYXVsdChkZWZhdWx0cyk7XG59XG5cbi8qKiBSZW5kZXIgYSBsaXN0ZW5lciBhZGRyZXNzIGFzIGEgYHRjcDovL2Agb3IgYHVuaXg6Ly9gIFVSTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRMaXN0ZW5BZGRyZXNzKGFkZHJlc3M6IExpc3RlbkFkZHJlc3MpOiBzdHJpbmcge1xuICBpZiAoYWRkcmVzcy5zY2hlbWUgPT09IFwidW5peFwiKSB7XG4gICAgcmV0dXJuIGB1bml4Oi8vJHthZGRyZXNzLnBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCJ9JHthZGRyZXNzLnBhdGh9YDtcbiAgfVxuICBjb25zdCBob3N0ID0gYWRkcmVzcy5ob3N0LmluY2x1ZGVzKFwiOlwiKSA/IGBbJHthZGRyZXNzLmhvc3R9XWAgOiBhZGRyZXNzLmhvc3Q7XG4gIHJldHVybiBgdGNwOi8vJHtob3N0fToke2FkZHJlc3MucG9ydH1gO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpc3RlbkFkZHJlc3MoXG4gIHZhbHVlOiB1bmtub3duLFxuICBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyxcbiAgZGVmYXVsdFNjaGVtZTogTGlzdGVuU2NoZW1lLFxuKTogdW5rbm93biB7XG4gIGlmIChpc1JlY29yZCh2YWx1ZSkgJiYgdmFsdWUuc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyAuLi52YWx1ZSwgc2NoZW1lOiBcInRjcFwiIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUucGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgLi4udmFsdWUsIHNjaGVtZTogXCJ1bml4XCIgfTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBkZWZhdWx0U2NoZW1lID09PSBcInRjcFwiXG4gICAgICA/IHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB2YWx1ZSB9XG4gICAgICA6IHsgc2NoZW1lOiBcInVuaXhcIiwgcGF0aDogU3RyaW5nKHZhbHVlKSB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgdGV4dCA9IHZhbHVlLnRyaW0oKTtcbiAgaWYgKHRleHQuc3RhcnRzV2l0aChcInVuaXg6Ly9cIikpIHtcbiAgICBjb25zdCBwYXRoID0gdGV4dC5zbGljZShcInVuaXg6Ly9cIi5sZW5ndGgpO1xuICAgIHJldHVybiB7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YCB9O1xuICB9XG4gIGNvbnN0IHRjcCA9IHRleHQuc3RhcnRzV2l0aChcInRjcDovL1wiKSA/IHRleHQuc2xpY2UoXCJ0Y3A6Ly9cIi5sZW5ndGgpIDogdGV4dDtcbiAgaWYgKGRlZmF1bHRTY2hlbWUgPT09IFwidW5peFwiICYmICF0ZXh0LnN0YXJ0c1dpdGgoXCJ0Y3A6Ly9cIikpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB0ZXh0IH07XG4gIH1cbiAgaWYgKC9eXFxkKyQvLnRlc3QodGNwKSkgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB0Y3AgfTtcbiAgaWYgKC9eOlxcZCskLy50ZXN0KHRjcCkpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IGRlZmF1bHRzLmhvc3QsIHBvcnQ6IHRjcC5zbGljZSgxKSB9O1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IHRjcC5tYXRjaCgvXlxcWyhbXlxcXV0rKVxcXSg/OjooXFxkKykpPyQvKTtcbiAgaWYgKGJyYWNrZXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgICBob3N0OiBicmFja2V0ZWRbMV0sXG4gICAgICBwb3J0OiBicmFja2V0ZWRbMl0gPz8gZGVmYXVsdHMucG9ydCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHNlcGFyYXRvciA9IHRjcC5sYXN0SW5kZXhPZihcIjpcIik7XG4gIGlmIChzZXBhcmF0b3IgPiAwICYmICF0Y3Auc2xpY2UoMCwgc2VwYXJhdG9yKS5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1lOiBcInRjcFwiLFxuICAgICAgaG9zdDogdGNwLnNsaWNlKDAsIHNlcGFyYXRvciksXG4gICAgICBwb3J0OiB0Y3Auc2xpY2Uoc2VwYXJhdG9yICsgMSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IHRjcCB8fCBkZWZhdWx0cy5ob3N0LCBwb3J0OiBkZWZhdWx0cy5wb3J0IH07XG59XG5cbmZ1bmN0aW9uIG9wdGlvblByb3BlcnRpZXMoc2NoZW1hOiB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPik6IE9wdGlvblByb3BlcnR5W10ge1xuICBjb25zdCBkb2N1bWVudCA9IHoudG9KU09OU2NoZW1hKHNjaGVtYSk7XG4gIGlmICghaXNSZWNvcmQoZG9jdW1lbnQucHJvcGVydGllcykpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50LnByb3BlcnRpZXMpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0eXBlOiB0eXBlb2YgdmFsdWUudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIGVudjpcbiAgICAgICAgICB0eXBlb2YgdmFsdWUuZW52ID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUuZW52KVxuICAgICAgICAgICAgPyAodmFsdWUuZW52IGFzIHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGZsYWc6IHR5cGVvZiB2YWx1ZS5mbGFnID09PSBcImJvb2xlYW5cIiA/IHZhbHVlLmZsYWcgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKGlzUmVjb3JkKHZhbHVlKSAmJiB2YWx1ZS5zY2hlbWUgPT09IFwidGNwXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlLnBvcnQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBmb3JtYXRMaXN0ZW5BZGRyZXNzKHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB2YWx1ZS5ob3N0LCBwb3J0OiB2YWx1ZS5wb3J0IH0pO1xuICAgIH1cbiAgfVxuICBpZiAoaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLnNjaGVtZSA9PT0gXCJ1bml4XCIgJiYgdHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZm9ybWF0TGlzdGVuQWRkcmVzcyh7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHZhbHVlLnBhdGggfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBlbnZpcm9ubWVudE9wdGlvblZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKFN0cmluZykuam9pbihcIixcIik7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25WYWx1ZXM8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICB2YWx1ZXM6IE9wdGlvblZhbHVlTWFwLFxuICBlbnZpcm9ubWVudDogT3B0aW9uVmFsdWVNYXAsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGRvY3VtZW50ID0gei50b0pTT05TY2hlbWEoc2NoZW1hKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGlzUmVjb3JkKGRvY3VtZW50LnByb3BlcnRpZXMpID8gZG9jdW1lbnQucHJvcGVydGllcyA6IHt9O1xuICBjb25zdCBjb25maWd1cmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHByb3BlcnR5XSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgIGlmICghaXNSZWNvcmQocHJvcGVydHkpKSBjb250aW51ZTtcbiAgICBjb25zdCBleHBsaWNpdCA9IGZpcnN0T3B0aW9uVmFsdWUodmFsdWVzLCBba2V5LCBgLS0ke3RvU2x1ZyhrZXkpfWBdKTtcbiAgICBpZiAoZXhwbGljaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlndXJlZFtrZXldID0gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZShwcm9wZXJ0eS50eXBlLCBleHBsaWNpdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZXMgPSBvcHRpb25FbnZpcm9ubWVudE5hbWVzKGtleSwgcHJvcGVydHkuZW52KTtcbiAgICBjb25zdCBzb3VyY2VkID0gZmlyc3RPcHRpb25WYWx1ZShlbnZpcm9ubWVudCwgbmFtZXMpO1xuICAgIGlmIChzb3VyY2VkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbmZpZ3VyZWRba2V5XSA9IG9wdGlvbkVudmlyb25tZW50VmFsdWUocHJvcGVydHkudHlwZSwgc291cmNlZCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZ3VyZWQ7XG59XG5cbmZ1bmN0aW9uIG9wdGlvbkVudmlyb25tZW50TmFtZXMoa2V5OiBzdHJpbmcsIGNvbmZpZ3VyZWQ6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFtjb25maWd1cmVkXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlndXJlZCkpIHtcbiAgICByZXR1cm4gY29uZmlndXJlZC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIik7XG4gIH1cbiAgcmV0dXJuIFt0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IGRlbGltaXRlcjogXCJfXCIgfSwga2V5KS50b1VwcGVyQ2FzZSgpXTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZSh0eXBlOiB1bmtub3duLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0b0Jvb2xlYW4odmFsdWUpID8/IHZhbHVlO1xuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHBhcnNlTGlzdCh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZmlyc3RPcHRpb25WYWx1ZShzb3VyY2U6IE9wdGlvblZhbHVlTWFwLCBrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IFwiXCIpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVVcmwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IHVybEJ1aWxkZXIodmFsdWUpO1xuICBpZiAoIXVybCkgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBub3JtYWxpemVkID0gdXJsLnRvU3RyaW5nKCk7XG4gIHJldHVybiB1cmwucGF0aG5hbWUgPT09IFwiL1wiICYmICF1cmwuc2VhcmNoICYmICF1cmwuaGFzaCA/IG5vcm1hbGl6ZWQuc2xpY2UoMCwgLTEpIDogbm9ybWFsaXplZDtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"root":["../src/async-utils.ts","../src/brand-utils.ts","../src/environment-utils.ts","../src/error-utils.ts","../src/execution.ts","../src/function-utils.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/pattern.ts","../src/predicate.ts","../src/string-utils.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/async-utils.ts","../src/bindings.ts","../src/brand-utils.ts","../src/environment-utils.ts","../src/error-utils.ts","../src/execution.ts","../src/function-utils.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/options.ts","../src/pattern.ts","../src/predicate.ts","../src/string-utils.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -19,7 +19,6 @@
19
19
  "projen": "projen"
20
20
  },
21
21
  "devDependencies": {
22
- "@dbx-tools/test-polyglot": "^0.9.40",
23
22
  "typescript": "^5.9.3"
24
23
  },
25
24
  "dependencies": {
@@ -40,6 +39,10 @@
40
39
  "types": "./lib/src/async-utils.d.ts",
41
40
  "default": "./lib/src/async-utils.js"
42
41
  },
42
+ "./bindings": {
43
+ "types": "./lib/src/bindings.d.ts",
44
+ "default": "./lib/src/bindings.js"
45
+ },
43
46
  "./brand-utils": {
44
47
  "types": "./lib/src/brand-utils.d.ts",
45
48
  "default": "./lib/src/brand-utils.js"
@@ -84,6 +87,10 @@
84
87
  "types": "./lib/src/object.d.ts",
85
88
  "default": "./lib/src/object.js"
86
89
  },
90
+ "./options": {
91
+ "types": "./lib/src/options.d.ts",
92
+ "default": "./lib/src/options.js"
93
+ },
87
94
  "./pattern": {
88
95
  "types": "./lib/src/pattern.d.ts",
89
96
  "default": "./lib/src/pattern.js"
@@ -103,7 +110,7 @@
103
110
  "./package.json": "./package.json"
104
111
  }
105
112
  },
106
- "version": "0.9.40",
113
+ "version": "0.9.46",
107
114
  "types": "./lib/index.d.ts",
108
115
  "dbxToolsConfig": {
109
116
  "tags": [
@@ -120,6 +127,10 @@
120
127
  "types": "./lib/src/async-utils.d.ts",
121
128
  "default": "./lib/src/async-utils.js"
122
129
  },
130
+ "./bindings": {
131
+ "types": "./lib/src/bindings.d.ts",
132
+ "default": "./lib/src/bindings.js"
133
+ },
123
134
  "./brand-utils": {
124
135
  "types": "./lib/src/brand-utils.d.ts",
125
136
  "default": "./lib/src/brand-utils.js"
@@ -164,6 +175,10 @@
164
175
  "types": "./lib/src/object.d.ts",
165
176
  "default": "./lib/src/object.js"
166
177
  },
178
+ "./options": {
179
+ "types": "./lib/src/options.d.ts",
180
+ "default": "./lib/src/options.js"
181
+ },
167
182
  "./pattern": {
168
183
  "types": "./lib/src/pattern.d.ts",
169
184
  "default": "./lib/src/pattern.js"
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Binding-safe access to the shared logging threshold.
3
+ *
4
+ * @module
5
+ */
6
+
7
+ import { activeLevel, isLevelEnabled, type LogLevel } from "./log.ts";
8
+
9
+ /** Return the active logging threshold. */
10
+ export function logActiveLevel(): LogLevel {
11
+ return activeLevel();
12
+ }
13
+
14
+ /** Return whether the current logging threshold enables `level`. */
15
+ export function logLevelEnabled(level: LogLevel): boolean {
16
+ return isLevelEnabled(level);
17
+ }
@@ -1,13 +1,14 @@
1
1
  import { toBoolean } from "./object.ts";
2
-
3
- const MAX_TCP_PORT = 65_535;
2
+ import { MAX_TCP_PORT } from "./options.ts";
4
3
 
5
4
  function runtimeEnvironment(): Record<string, string | undefined> {
6
5
  return (
7
- globalThis as typeof globalThis & {
8
- process?: { env?: Record<string, string | undefined> };
9
- }
10
- ).process?.env ?? {};
6
+ (
7
+ globalThis as typeof globalThis & {
8
+ process?: { env?: Record<string, string | undefined> };
9
+ }
10
+ ).process?.env ?? {}
11
+ );
11
12
  }
12
13
 
13
14
  /** Detect a Databricks App runtime from its required name, host, and port. */
package/src/log.ts CHANGED
@@ -319,7 +319,7 @@ function parseLogLevel(raw: unknown): LogLevel | undefined {
319
319
  }
320
320
 
321
321
  /** Active threshold from `process.env.LOG_LEVEL`, default {@link DEFAULT_LEVEL}. */
322
- function activeLevel(): LogLevel {
322
+ export function activeLevel(): LogLevel {
323
323
  return parseLogLevel(globalProcess?.env?.LOG_LEVEL) ?? DEFAULT_LEVEL;
324
324
  }
325
325