obsidian-dev-utils 86.0.0 → 86.1.0

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.
@@ -36,6 +36,20 @@ export interface ExecOptions {
36
36
  * A current working folder for the command execution.
37
37
  */
38
38
  readonly cwd?: string;
39
+ /**
40
+ * Additional environment variables for the child process, merged over the inherited environment.
41
+ *
42
+ * @default `{}`
43
+ */
44
+ readonly env?: NodeJS.ProcessEnv;
45
+ /**
46
+ * If `true`, attaches the child process's stdio directly to the terminal (`stdio: 'inherit'`) instead
47
+ * of capturing it. Use for long-running or interactive commands such as dev servers and watch mode.
48
+ * Because the output is not captured, the resolved stdout is an empty string.
49
+ *
50
+ * @default `false`
51
+ */
52
+ readonly isInteractive?: boolean;
39
53
  /**
40
54
  * If `true`, suppresses the output of the command.
41
55
  *
@@ -94,6 +94,8 @@ function execString(params) {
94
94
  } = params;
95
95
  const {
96
96
  cwd = process.cwd(),
97
+ env,
98
+ isInteractive = false,
97
99
  isQuiet: quiet = false,
98
100
  shouldIgnoreExitCode: ignoreExitCode = false,
99
101
  shouldIncludeDetails = false,
@@ -104,36 +106,48 @@ function execString(params) {
104
106
  const child = spawnViaShell(normalizeOptionalProperties({
105
107
  command,
106
108
  cwd,
109
+ env,
110
+ isInteractive,
107
111
  rawArgs
108
112
  }));
109
113
  let stdout = "";
110
114
  let stderr = "";
111
- child.stdin.write(stdin);
112
- child.stdin.end();
113
- child.stdout.on("data", (data) => {
114
- if (!quiet) {
115
- process.stdout.write(data);
116
- }
117
- stdout += data.toString("utf-8");
118
- });
119
- child.stdout.on("end", () => {
120
- stdout = trimEnd({
121
- str: stdout,
122
- suffix: "\n"
115
+ if (!isInteractive) {
116
+ const {
117
+ stderr: childStderr,
118
+ stdin: childStdin,
119
+ stdout: childStdout
120
+ } = child;
121
+ assertNonNullable(childStdin, "Child process stdin is not available");
122
+ assertNonNullable(childStdout, "Child process stdout is not available");
123
+ assertNonNullable(childStderr, "Child process stderr is not available");
124
+ childStdin.write(stdin);
125
+ childStdin.end();
126
+ childStdout.on("data", (data) => {
127
+ if (!quiet) {
128
+ process.stdout.write(data);
129
+ }
130
+ stdout += data.toString("utf-8");
123
131
  });
124
- });
125
- child.stderr.on("data", (data) => {
126
- if (!quiet) {
127
- process.stderr.write(data);
128
- }
129
- stderr += data.toString("utf-8");
130
- });
131
- child.stderr.on("end", () => {
132
- stderr = trimEnd({
133
- str: stderr,
134
- suffix: "\n"
132
+ childStdout.on("end", () => {
133
+ stdout = trimEnd({
134
+ str: stdout,
135
+ suffix: "\n"
136
+ });
135
137
  });
136
- });
138
+ childStderr.on("data", (data) => {
139
+ if (!quiet) {
140
+ process.stderr.write(data);
141
+ }
142
+ stderr += data.toString("utf-8");
143
+ });
144
+ childStderr.on("end", () => {
145
+ stderr = trimEnd({
146
+ str: stderr,
147
+ suffix: "\n"
148
+ });
149
+ });
150
+ }
137
151
  child.on("close", (exitCode, exitSignal) => {
138
152
  if (exitCode !== 0 && !ignoreExitCode) {
139
153
  reject(new Error(`Command failed with exit code ${exitCode ? String(exitCode) : "(null)"}
@@ -245,7 +259,12 @@ function isExecArg(part) {
245
259
  return typeof part === "object" && "batchedArgs" in part;
246
260
  }
247
261
  function spawnViaShell(params) {
248
- const { command, cwd, rawArgs } = params;
262
+ const { command, cwd, env: extraEnv, isInteractive = false, rawArgs } = params;
263
+ const env = {
264
+ ...CHILD_ENV,
265
+ ...extraEnv
266
+ };
267
+ const stdio = isInteractive ? "inherit" : "pipe";
249
268
  if (process.platform === "win32" && command.includes("\n")) {
250
269
  if (!rawArgs) {
251
270
  throw new Error("Commands containing newlines cannot be executed through cmd.exe on Windows. Pass an argument array instead of a string.");
@@ -254,16 +273,16 @@ function spawnViaShell(params) {
254
273
  assertNonNullable(program, "Command array must not be empty");
255
274
  return spawn(program, args, {
256
275
  cwd,
257
- env: CHILD_ENV,
258
- stdio: "pipe"
276
+ env,
277
+ stdio
259
278
  });
260
279
  }
261
280
  const shellCommand = process.platform === "win32" ? cmdEscapeCommandLine(command) : command;
262
281
  return spawn(shellCommand, [], {
263
282
  cwd,
264
- env: CHILD_ENV,
283
+ env,
265
284
  shell: true,
266
- stdio: "pipe"
285
+ stdio
267
286
  });
268
287
  }
269
288
  export {
@@ -271,4 +290,4 @@ export {
271
290
  buildChildEnv,
272
291
  exec
273
292
  };
274
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9leGVjLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGV4ZWN1dGluZyBjb21tYW5kcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2Vzc1dpdGhvdXROdWxsU3RyZWFtcyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IHRyaW1FbmQgfSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBjbWRFc2NhcGVDb21tYW5kTGluZSxcbiAgdG9Db21tYW5kTGluZVxufSBmcm9tICcuL2NsaS11dGlscy50cyc7XG5cbi8qKlxuICogQSBjb21tYW5kIHBhcnQ6IGVpdGhlciBhIHBsYWluIHN0cmluZyBvciBhbiB7QGxpbmsgRXhlY0FyZ30gd2l0aCBiYXRjaGVkIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tbWFuZFBhcnQgPSBFeGVjQXJnIHwgc3RyaW5nO1xuXG4vKipcbiAqIEEgY29tbWFuZCBhcmd1bWVudCB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBhcmdzIHRvIGJlIGJhdGNoZWQuXG4gKiBJZiB0aGUgZXhwYW5kZWQgY29tbWFuZCBleGNlZWRzIHRoZSBwbGF0Zm9ybSdzIG1heCBjb21tYW5kIGxlbmd0aCxcbiAqIHRoZSBiYXRjaGVkIGFyZ3MgYXJlIHNwbGl0IGludG8gc2VxdWVudGlhbCBleGVjdXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNBcmcge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBiYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZWRBcmdzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZXhlY30gdGhhdCByZXR1cm4gZGV0YWlsZWQgcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjRGV0YWlsZWRPcHRpb25zIGV4dGVuZHMgRXhlY09wdGlvbnMge1xuICAvKipcbiAgICogTXVzdCBiZSBgdHJ1ZWAgdG8gcmVjZWl2ZSBkZXRhaWxlZCByZXN1bHRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZXhlY3V0aW5nIGEgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgZm9yIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZD86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBzdXBwcmVzc2VzIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzUXVpZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRocm93cyBhbiBlcnJvciBpZiB0aGUgY29tbWFuZCBmYWlscy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGYWlsSWZDYWxsZWRGcm9tT3V0c2lkZVJvb3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGlnbm9yZXMgdGhlIGV4aXQgY29kZSBvZiB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSWdub3JlRXhpdENvZGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBgZmFsc2VgLCBvbmx5IHJldHVybnMgdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZURldGFpbHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBpbnB1dCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IHN0ZGluPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcmVzdWx0IG9mIHtAbGluayBleGVjfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjUmVzdWx0IHtcbiAgLyoqXG4gICAqIEFuIGV4aXQgY29kZSBvZiB0aGUgY29tbWFuZC4gQSB2YWx1ZSBvZiBgbnVsbGAgaW5kaWNhdGVzIHRoYXQgdGhlIHByb2Nlc3MgZGlkIG5vdCBleGl0IG5vcm1hbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdENvZGU6IG51bGwgfCBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgc2lnbmFsIHRoYXQgY2F1c2VkIHRoZSBwcm9jZXNzIHRvIGJlIHRlcm1pbmF0ZWQuIEEgdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyB0aGF0IG5vIHNpZ25hbCB3YXMgcmVjZWl2ZWQuXG4gICAqL1xuICByZWFkb25seSBleGl0U2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdGFuZGFyZCBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBleGVjfSB0aGF0IHJldHVybiBvbmx5IHN0ZG91dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjU2ltcGxlT3B0aW9ucyBleHRlbmRzIEV4ZWNPcHRpb25zIHtcbiAgLyoqXG4gICAqIE11c3QgYmUgYGZhbHNlYCBvciBvbWl0dGVkIHRvIHJlY2VpdmUgb25seSBzdGRvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVEZXRhaWxzPzogZmFsc2U7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV4ZWNTdHJpbmd9LlxuICovXG5pbnRlcmZhY2UgRXhlY1N0cmluZ1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zPzogRXhlY09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBhcmd1bWVudCBhcnJheSAoaWYgYXZhaWxhYmxlKSwgdXNlZCBieSB0aGUgUG93ZXJTaGVsbFxuICAgKiBmYWxsYmFjayBwYXRoIHRvIHF1b3RlIGFyZ3VtZW50cyB3aXRoIFBvd2VyU2hlbGwtbmF0aXZlIHNpbmdsZSBxdW90ZXMuXG4gICAqL1xuICByZWFkb25seSByYXdBcmdzPzogc3RyaW5nW107XG59XG4vKipcbiAqIEFwcGVuZHMgYSBzaW5nbGUgYG5vZGVgIENMSSBvcHRpb24gdG8gYSBgTk9ERV9PUFRJT05TYCBzdHJpbmcsIHByZXNlcnZpbmcgYW55IG9wdGlvbnMgYWxyZWFkeSBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ05vZGVPcHRpb25zIC0gVGhlIGN1cnJlbnQgYE5PREVfT1BUSU9OU2AgdmFsdWUgKGUuZy4gYHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OU2ApLCBpZiBhbnkuXG4gKiBAcGFyYW0gb3B0aW9uIC0gVGhlIGBub2RlYCBDTEkgb3B0aW9uIHRvIGFwcGVuZCAoZS5nLiBgLS1sb2NhbHN0b3JhZ2UtZmlsZT06bWVtb3J5OmApLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGBOT0RFX09QVElPTlNgIHN0cmluZy4gSWYgYG9wdGlvbmAgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kTm9kZU9wdGlvbihleGlzdGluZ05vZGVPcHRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IChleGlzdGluZ05vZGVPcHRpb25zID8/ICcnKS50cmltKCk7XG4gIGlmICh0cmltbWVkID09PSAnJykge1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cbiAgaWYgKHRyaW1tZWQuc3BsaXQoL1xccysvKS5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgcmV0dXJuIHRyaW1tZWQ7XG4gIH1cbiAgcmV0dXJuIGAke3RyaW1tZWR9ICR7b3B0aW9ufWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzOiB0aGUgcGFyZW50IGVudmlyb25tZW50IHBsdXMgYERFQlVHX0NPTE9SU2AsIGFuZCBcdTIwMTQgd2hlblxuICogdGhlIHJ1bm5pbmcgYG5vZGVgIHN1cHBvcnRzIGl0IFx1MjAxNCB7QGxpbmsgTE9DQUxfU1RPUkFHRV9OT0RFX09QVElPTn0gYXBwZW5kZWQgdG8gYE5PREVfT1BUSU9OU2AuXG4gKlxuICogVGhlIHN1cHBvcnQgY2hlY2sgZ3VhcmRzIGFnYWluc3Qgb2xkZXIgYG5vZGVgICg8IDIyKTogcGFzc2luZyBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWFcbiAqIGBOT0RFX09QVElPTlNgIG1ha2VzIGl0IGV4aXQgYmVmb3JlIHJ1bm5pbmcsIHdoaWNoIHdvdWxkIGJyZWFrIGV2ZXJ5IHNwYXduZWQgdG9vbC5cbiAqXG4gKiBAcGFyYW0gYmFzZUVudiAtIFRoZSBwYXJlbnQgZW52aXJvbm1lbnQgdG8gZXh0ZW5kICh0eXBpY2FsbHkgYHByb2Nlc3MuZW52YCkuXG4gKiBAcGFyYW0gYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzIC0gVGhlIGBub2RlYCBvcHRpb25zIGFjY2VwdGVkIHZpYSBgTk9ERV9PUFRJT05TYCAodHlwaWNhbGx5IGBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFnc2ApLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkRW52KGJhc2VFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBhbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3M6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgREVCVUdfQ09MT1JTOiAnMScsXG4gICAgLi4uYmFzZUVudlxuICB9O1xuICBpZiAoYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzLmhhcygnLS1sb2NhbHN0b3JhZ2UtZmlsZScpKSB7XG4gICAgZW52WydOT0RFX09QVElPTlMnXSA9IGFwcGVuZE5vZGVPcHRpb24oYmFzZUVudlsnTk9ERV9PUFRJT05TJ10sIExPQ0FMX1NUT1JBR0VfTk9ERV9PUFRJT04pO1xuICB9XG4gIHJldHVybiBlbnY7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUgYW5kIHN0ZGVyci5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9ucz86IEV4ZWNTaW1wbGVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+O1xuLyoqXG4gKiBFeGVjdXRlcyBhIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBleGVjdXRlLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBleGVjdXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggRXhlY1Jlc3VsdCBvYmplY3QuXG4gKiAgICAgICAgICBUaGUgRXhlY1Jlc3VsdCBvYmplY3QgY29udGFpbnMgdGhlIGV4aXQgY29kZSwgZXhpdCBzaWduYWwsIHN0ZGVyciwgYW5kIHN0ZG91dC5cbiAqIEB0aHJvd3MgSWYgdGhlIGNvbW1hbmQgZmFpbHMgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgaWdub3JlRXhpdENvZGUgaXMgYGZhbHNlYC5cbiAqICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4aXQgY29kZSBhbmQgc3RkZXJyLlxuICogICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBleGVjdXRpb24gYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGB0cnVlYCxcbiAqICAgICAgICAgdGhlIGVycm9yIGlzIHJlc29sdmVkIHdpdGggdGhlIHN0ZG91dCBhbmQgc3RkZXJyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhjb21tYW5kOiBDb21tYW5kUGFydFtdIHwgc3RyaW5nLCBvcHRpb25zOiBFeGVjRGV0YWlsZWRPcHRpb25zKTogUHJvbWlzZTxFeGVjUmVzdWx0Pjtcbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgb3IgYW4gRXhlY1Jlc3VsdCBvYmplY3QuXG4gKiAgICAgICAgICBUaGUgRXhlY1Jlc3VsdCBvYmplY3QgY29udGFpbnMgdGhlIGV4aXQgY29kZSwgZXhpdCBzaWduYWwsIHN0ZGVyciwgYW5kIHN0ZG91dC5cbiAqIEB0aHJvd3MgSWYgdGhlIGNvbW1hbmQgZmFpbHMgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgaWdub3JlRXhpdENvZGUgaXMgYGZhbHNlYC5cbiAqICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4aXQgY29kZSBhbmQgc3RkZXJyLlxuICogICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBleGVjdXRpb24gYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGB0cnVlYCxcbiAqICAgICAgICAgdGhlIGVycm9yIGlzIHJlc29sdmVkIHdpdGggdGhlIHN0ZG91dCBhbmQgc3RkZXJyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhjb21tYW5kOiBDb21tYW5kUGFydFtdIHwgc3RyaW5nLCBvcHRpb25zOiBFeGVjT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFeGVjUmVzdWx0IHwgc3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbW1hbmQpKSB7XG4gICAgY29uc3QgYmF0Y2hSZXN1bHQgPSBoYW5kbGVCYXRjaGVkQ29tbWFuZChjb21tYW5kLCBvcHRpb25zKTtcbiAgICBpZiAoYmF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBiYXRjaFJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IGNvbW1hbmQuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gdHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKTtcbiAgICBjb25zdCBjb21tYW5kTGluZSA9IHRvQ29tbWFuZExpbmUoYXJncyk7XG5cbiAgICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICAgIGlmIChjb21tYW5kTGluZS5sZW5ndGggPiBtYXhDb21tYW5kTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhjb21tYW5kTGluZS5sZW5ndGgpfSBjaGFycywgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhlY1N0cmluZyh7XG4gICAgICBjb21tYW5kOiBjb21tYW5kTGluZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICByYXdBcmdzOiBhcmdzXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICBpZiAoY29tbWFuZC5sZW5ndGggPiBtYXhDb21tYW5kTGVuZ3RoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhjb21tYW5kLmxlbmd0aCl9IGNoYXJzLCBtYXggJHtTdHJpbmcobWF4Q29tbWFuZExlbmd0aCl9IG9uICR7cHJvY2Vzcy5wbGF0Zm9ybX0pLiBDb25zaWRlciBzcGxpdHRpbmcgaW50byBzbWFsbGVyIGJhdGNoZXMgb3IgdXNlIEV4ZWNBcmcuYFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZXhlY1N0cmluZyh7XG4gICAgY29tbWFuZCxcbiAgICBvcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgc2luZ2xlIHN0cmluZyBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gZXhlY1N0cmluZyhwYXJhbXM6IEV4ZWNTdHJpbmdQYXJhbXMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGNvbW1hbmQsXG4gICAgb3B0aW9ucyA9IHt9LFxuICAgIHJhd0FyZ3NcbiAgfSA9IHBhcmFtcztcbiAgY29uc3Qge1xuICAgIGN3ZCA9IHByb2Nlc3MuY3dkKCksXG4gICAgaXNRdWlldDogcXVpZXQgPSBmYWxzZSxcbiAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogaWdub3JlRXhpdENvZGUgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRGV0YWlscyA9IGZhbHNlLFxuICAgIHN0ZGluID0gJydcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignRXhlYycpKGBFeGVjdXRpbmcgY29tbWFuZDogJHtjb21tYW5kfWApO1xuXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3blZpYVNoZWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTcGF3blZpYVNoZWxsUGFyYW1zPih7XG4gICAgICBjb21tYW5kLFxuICAgICAgY3dkLFxuICAgICAgcmF3QXJnc1xuICAgIH0pKTtcblxuICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICBsZXQgc3RkZXJyID0gJyc7XG5cbiAgICBjaGlsZC5zdGRpbi53cml0ZShzdGRpbik7XG4gICAgY2hpbGQuc3RkaW4uZW5kKCk7XG5cbiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgfVxuICAgICAgc3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5zdGRvdXQub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIHN0ZG91dCA9IHRyaW1FbmQoe1xuICAgICAgICBzdHI6IHN0ZG91dCxcbiAgICAgICAgc3VmZml4OiAnXFxuJ1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGRhdGEpO1xuICAgICAgfVxuICAgICAgc3RkZXJyICs9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5zdGRlcnIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIHN0ZGVyciA9IHRyaW1FbmQoe1xuICAgICAgICBzdHI6IHN0ZGVycixcbiAgICAgICAgc3VmZml4OiAnXFxuJ1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbignY2xvc2UnLCAoZXhpdENvZGUsIGV4aXRTaWduYWwpID0+IHtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCAmJiAhaWdub3JlRXhpdENvZGUpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZSA/IFN0cmluZyhleGl0Q29kZSkgOiAnKG51bGwpJ31cXG4ke3N0ZGVycn1gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoe1xuICAgICAgICBleGl0Q29kZSxcbiAgICAgICAgZXhpdFNpZ25hbCxcbiAgICAgICAgc3RkZXJyLFxuICAgICAgICBzdGRvdXRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2hpbGQub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgaWYgKCFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXNob3VsZEluY2x1ZGVEZXRhaWxzKSB7XG4gICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgZXhpdENvZGU6IG51bGwsXG4gICAgICAgIGV4aXRTaWduYWw6IG51bGwsXG4gICAgICAgIHN0ZGVycixcbiAgICAgICAgc3Rkb3V0XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQSBgbm9kZWAgQ0xJIG9wdGlvbiAocGFzc2VkIHZpYSBgTk9ERV9PUFRJT05TYCkgdGhhdCBwcm92aWRlcyBhbiBpbi1tZW1vcnkgYGxvY2FsU3RvcmFnZWAgdG8gZXZlcnlcbiAqIHNwYXduZWQgYG5vZGVgIHByb2Nlc3MuIE5vZGUgMjIrIGV4cG9zZXMgYW4gZXhwZXJpbWVudGFsIFdlYiBTdG9yYWdlIGBsb2NhbFN0b3JhZ2VgLCBidXQgYWNjZXNzaW5nIGl0XG4gKiB3aXRob3V0IGAtLWxvY2Fsc3RvcmFnZS1maWxlYCBlbWl0cyBhbiBgRXhwZXJpbWVudGFsV2FybmluZ2AgYW5kIGxlYXZlcyBgbG9jYWxTdG9yYWdlYCB1bmF2YWlsYWJsZS5cbiAqIFBvaW50aW5nIGl0IGF0IHRoZSBzcGVjaWFsIGA6bWVtb3J5OmAgZGF0YWJhc2UgZ2l2ZXMgZWFjaCBwcm9jZXNzIGEgd29ya2luZywgbm9uLXBlcnNpc3RlbnRcbiAqIGBsb2NhbFN0b3JhZ2VgIChubyBmaWxlIG9uIGRpc2ssIG5vIHN0YXRlIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcykgXHUyMDE0IG1hdGNoaW5nIHRoZSByZWFsIE9ic2lkaWFuXG4gKiAoRWxlY3Ryb24pIHJ1bnRpbWUgYW5kIHNpbGVuY2luZyB0aGUgd2FybmluZyBieSBhZGRyZXNzaW5nIGl0cyByb290IGNhdXNlIHJhdGhlciB0aGFuIHN1cHByZXNzaW5nIGl0LlxuICpcbiAqIEl0IGlzIGFwcGxpZWQgb25seSB3aGVuIHRoZSBydW5uaW5nIGBub2RlYCBhY3R1YWxseSBzdXBwb3J0cyBpdCAoc2VlIHtAbGluayBidWlsZENoaWxkRW52fSk6IHBhc3NpbmdcbiAqIGFuIG9wdGlvbiBgbm9kZWAgZG9lcyBub3QgcmVjb2duaXplIHZpYSBgTk9ERV9PUFRJT05TYCBtYWtlcyBpdCByZWZ1c2UgdG8gc3RhcnQsIHNvIGFuIG9sZGVyIGBub2RlYFxuICogKDwgMjIpIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQuXG4gKi9cbmNvbnN0IExPQ0FMX1NUT1JBR0VfTk9ERV9PUFRJT04gPSAnLS1sb2NhbHN0b3JhZ2UtZmlsZT06bWVtb3J5Oic7XG5cbi8qKlxuICogRGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIHRvIGNoaWxkIHByb2Nlc3Nlcy5cbiAqL1xuY29uc3QgQ0hJTERfRU5WID0gYnVpbGRDaGlsZEVudihwcm9jZXNzLmVudiwgcHJvY2Vzcy5hbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3MpO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjdXRlQmF0Y2hlc30uXG4gKi9cbmludGVyZmFjZSBFeGVjdXRlQmF0Y2hlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYmFzZSBjb21tYW5kIHdpdGhvdXQgYmF0Y2hlZCBhcmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUNvbW1hbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhdGNoZXMgb2YgYXJncy5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZXM6IHN0cmluZ1tdW107XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBFeGVjT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc3Bhd25WaWFTaGVsbH0uXG4gKi9cbmludGVyZmFjZSBTcGF3blZpYVNoZWxsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIGFyZ3VtZW50IGFycmF5IChpZiBhdmFpbGFibGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGJhdGNoZWQgY29tbWFuZHMgc2VxdWVudGlhbGx5IGFuZCBjb25jYXRlbmF0ZXMgc3Rkb3V0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGJhdGNoZWQgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29uY2F0ZW5hdGVkIHJlc3VsdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUJhdGNoZXMocGFyYW1zOiBFeGVjdXRlQmF0Y2hlc1BhcmFtcyk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBjb25zdCB7IGJhc2VDb21tYW5kLCBiYXRjaGVzLCBvcHRpb25zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBiYXRjaCBvZiBiYXRjaGVzKSB7XG4gICAgY29uc3QgYmF0Y2hDb21tYW5kID0gYCR7YmFzZUNvbW1hbmR9ICR7YmF0Y2guam9pbignICcpfWA7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY1N0cmluZyh7XG4gICAgICBjb21tYW5kOiBiYXRjaENvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucy5zaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgIHJldHVybiB7IGV4aXRDb2RlOiAwLCBleGl0U2lnbmFsOiBudWxsLCBzdGRlcnI6ICcnLCBzdGRvdXQ6IHJlc3VsdHMuam9pbignXFxuJykgfTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIG1heCBjb21tYW5kIGxpbmUgbGVuZ3RoLlxuICpcbiAqIEByZXR1cm5zIFRoZSBtYXggY29tbWFuZCBsZW5ndGggaW4gY2hhcmFjdGVycy5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF4Q29tbWFuZExlbmd0aCgpOiBudW1iZXIge1xuICBjb25zdCBXSU5ET1dTX01BWF9DT01NQU5EX0xFTkdUSCA9IDgxOTE7XG4gIGNvbnN0IFVOSVhfTUFYX0NPTU1BTkRfTEVOR1RIID0gMTMxMDcyO1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFdJTkRPV1NfTUFYX0NPTU1BTkRfTEVOR1RIIDogVU5JWF9NQVhfQ09NTUFORF9MRU5HVEg7XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIGNvbW1hbmQgYXJyYXkgdGhhdCBtYXkgY29udGFpbiBhbiB7QGxpbmsgRXhlY0FyZ30uXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSBpZiBiYXRjaGluZyBpcyBuZWVkZWQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBjb21tYW5kXG4gKiBoYXMgbm8gRXhlY0FyZyBhbmQgc2hvdWxkIGJlIHByb2Nlc3NlZCBub3JtYWxseS5cbiAqXG4gKiBAcGFyYW0gcGFydHMgLSBUaGUgY29tbWFuZCBwYXJ0cy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGV4ZWMgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSBpZiBiYXRjaGluZyBpcyBoYW5kbGVkLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlQmF0Y2hlZENvbW1hbmQocGFydHM6IENvbW1hbmRQYXJ0W10sIG9wdGlvbnM6IEV4ZWNPcHRpb25zKTogUHJvbWlzZTxFeGVjUmVzdWx0IHwgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4ZWNBcmdzID0gcGFydHMuZmlsdGVyKGlzRXhlY0FyZyk7XG4gIGlmIChleGVjQXJncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChleGVjQXJncy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignT25seSBvbmUgRXhlY0FyZyB3aXRoIGJhdGNoZWRBcmdzIGlzIGFsbG93ZWQgcGVyIGNvbW1hbmQnKSk7XG4gIH1cblxuICBjb25zdCBleGVjQXJnID0gZXhlY0FyZ3NbMF07XG4gIGFzc2VydE5vbk51bGxhYmxlKGV4ZWNBcmcpO1xuICBjb25zdCBzdGF0aWNQYXJ0cyA9IHBhcnRzLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+IHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJyk7XG4gIGNvbnN0IGJhc2VDb21tYW5kID0gdG9Db21tYW5kTGluZShzdGF0aWNQYXJ0cyk7XG4gIGNvbnN0IG1heENvbW1hbmRMZW5ndGggPSBnZXRNYXhDb21tYW5kTGVuZ3RoKCk7XG5cbiAgLy8gVHJ5IGV4cGFuZGluZyBhbGwgYXJncyBpbmxpbmVcbiAgY29uc3QgZnVsbENvbW1hbmQgPSBgJHtiYXNlQ29tbWFuZH0gJHtleGVjQXJnLmJhdGNoZWRBcmdzLmpvaW4oJyAnKX1gO1xuICBpZiAoZnVsbENvbW1hbmQubGVuZ3RoIDw9IG1heENvbW1hbmRMZW5ndGgpIHtcbiAgICByZXR1cm4gZXhlY1N0cmluZyh7XG4gICAgICBjb21tYW5kOiBmdWxsQ29tbWFuZCxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNwbGl0IGludG8gYmF0Y2hlc1xuICBjb25zdCBiYXRjaGVzOiBzdHJpbmdbXVtdID0gW107XG4gIGxldCBjdXJyZW50QmF0Y2g6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBhcmcgb2YgZXhlY0FyZy5iYXRjaGVkQXJncykge1xuICAgIGNvbnN0IHRlbnRhdGl2ZSA9IGAke2Jhc2VDb21tYW5kfSAke1suLi5jdXJyZW50QmF0Y2gsIGFyZ10uam9pbignICcpfWA7XG4gICAgaWYgKHRlbnRhdGl2ZS5sZW5ndGggPiBtYXhDb21tYW5kTGVuZ3RoKSB7XG4gICAgICBpZiAoY3VycmVudEJhdGNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBzcGxpdCBjb21tYW5kIGludG8gYmF0Y2hlczogYSBzaW5nbGUgYXJndW1lbnQgKCR7U3RyaW5nKGFyZy5sZW5ndGgpfSBjaGFycykgcGx1cyB0aGUgYmFzZSBjb21tYW5kICgke1N0cmluZyhiYXNlQ29tbWFuZC5sZW5ndGgpfSBjaGFycykgZXhjZWVkcyB0aGUgbWF4IGNvbW1hbmQgbGVuZ3RoICgke1N0cmluZyhtYXhDb21tYW5kTGVuZ3RoKX0pLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBiYXRjaGVzLnB1c2goY3VycmVudEJhdGNoKTtcbiAgICAgIGN1cnJlbnRCYXRjaCA9IFthcmddO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50QmF0Y2gucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWx3YXlzIHRydWUgYWZ0ZXIgdGhlIGxvb3A7IGJhdGNoZWRBcmdzIGlzIG5vbi1lbXB0eSBhdCB0aGlzIHBvaW50LiAqL1xuICBpZiAoY3VycmVudEJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIGJhdGNoZXMucHVzaChjdXJyZW50QmF0Y2gpO1xuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVCYXRjaGVzKHtcbiAgICBiYXNlQ29tbWFuZCxcbiAgICBiYXRjaGVzLFxuICAgIG9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgY29tbWFuZCBwYXJ0IGlzIGFuIHtAbGluayBFeGVjQXJnfS5cbiAqXG4gKiBAcGFyYW0gcGFydCAtIFRoZSBjb21tYW5kIHBhcnQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwYXJ0IGlzIGFuIEV4ZWNBcmcuXG4gKi9cbmZ1bmN0aW9uIGlzRXhlY0FyZyhwYXJ0OiBDb21tYW5kUGFydCk6IHBhcnQgaXMgRXhlY0FyZyB7XG4gIHJldHVybiB0eXBlb2YgcGFydCA9PT0gJ29iamVjdCcgJiYgJ2JhdGNoZWRBcmdzJyBpbiBwYXJ0O1xufVxuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgdmlhIHRoZSBhcHByb3ByaWF0ZSBzaGVsbC5cbiAqXG4gKiBPbiBXaW5kb3dzLCBpZiB0aGUgY29tbWFuZCBjb250YWlucyBuZXdsaW5lcyAod2hpY2ggYGNtZC5leGVgIGNhbm5vdCBoYW5kbGUpXG4gKiBhbmQgdGhlIHJhdyBhcmdzIGFycmF5IGlzIGF2YWlsYWJsZSwgc3Bhd25zIHRoZSBwcm9jZXNzIGRpcmVjdGx5IHdpdGhvdXRcbiAqIGFueSBzaGVsbCBcdTIwMTQgcGFzc2luZyBhcmdzIHZpYSBgQ3JlYXRlUHJvY2Vzc2AsIHdoaWNoIGF2b2lkcyBhbGwgcXVvdGluZyBpc3N1ZXMuXG4gKlxuICogT24gV2luZG93cyAoY21kLmV4ZSBwYXRoKSwgYXBwbGllcyBgXmAtZXNjYXBpbmcgZm9yIGNtZCBtZXRhY2hhcmFjdGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHNwYXduaW5nIHRoZSBjaGlsZCBwcm9jZXNzLlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3Bhd25WaWFTaGVsbChwYXJhbXM6IFNwYXduVmlhU2hlbGxQYXJhbXMpOiBDaGlsZFByb2Nlc3NXaXRob3V0TnVsbFN0cmVhbXMge1xuICBjb25zdCB7IGNvbW1hbmQsIGN3ZCwgcmF3QXJncyB9ID0gcGFyYW1zO1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJiBjb21tYW5kLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgIGlmICghcmF3QXJncykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21tYW5kcyBjb250YWluaW5nIG5ld2xpbmVzIGNhbm5vdCBiZSBleGVjdXRlZCB0aHJvdWdoIGNtZC5leGUgb24gV2luZG93cy4gUGFzcyBhbiBhcmd1bWVudCBhcnJheSBpbnN0ZWFkIG9mIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICBjb25zdCBbcHJvZ3JhbSwgLi4uYXJnc10gPSByYXdBcmdzO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHByb2dyYW0sICdDb21tYW5kIGFycmF5IG11c3Qgbm90IGJlIGVtcHR5Jyk7XG4gICAgcmV0dXJuIHNwYXduKHByb2dyYW0sIGFyZ3MsIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudjogQ0hJTERfRU5WLFxuICAgICAgc3RkaW86ICdwaXBlJ1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc2hlbGxDb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IGNtZEVzY2FwZUNvbW1hbmRMaW5lKGNvbW1hbmQpIDogY29tbWFuZDtcbiAgcmV0dXJuIHNwYXduKHNoZWxsQ29tbWFuZCwgW10sIHtcbiAgICBjd2QsXG4gICAgZW52OiBDSElMRF9FTlYsXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdwaXBlJ1xuICB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsU0FBUyxhQUFhO0FBQ3RCLE9BQU8sYUFBYTtBQUVwQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLG1DQUFtQztBQUM1QyxTQUFTLGVBQWU7QUFDeEIsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUEwSUEsU0FBUyxpQkFBaUIscUJBQXlDLFFBQXdCO0FBQ2hHLFFBQU0sV0FBVyx1QkFBdUIsSUFBSSxLQUFLO0FBQ2pELE1BQUksWUFBWSxJQUFJO0FBQ2xCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxR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LGFBQVcsT0FBTyxRQUFRLGFBQWE7QUFDckMsVUFBTSxZQUFZLEdBQUcsV0FBVyxJQUFJLENBQUMsR0FBRyxjQUFjLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQztBQUNwRSxRQUFJLFVBQVUsU0FBUyxrQkFBa0I7QUFDdkMsVUFBSSxhQUFhLFdBQVcsR0FBRztBQUM3QixlQUFPLFFBQVE7QUFBQSxVQUNiLElBQUk7QUFBQSxZQUNGLHlEQUF5RCxPQUFPLElBQUksTUFBTSxDQUFDLGtDQUFrQyxPQUFPLFlBQVksTUFBTSxDQUFDLDJDQUEyQyxPQUFPLGdCQUFnQixDQUFDO0FBQUEsVUFDNU07QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUNBLGNBQVEsS0FBSyxZQUFZO0FBQ3pCLHFCQUFlLENBQUMsR0FBRztBQUFBLElBQ3JCLE9BQU87QUFDTCxtQkFBYSxLQUFLLEdBQUc7QUFBQSxJQUN2QjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLGFBQWEsU0FBUyxHQUFHO0FBRTNCLFlBQVEsS0FBSyxZQUFZO0FBQUEsRUFDM0I7QUFFQSxTQUFPLGVBQWU7QUFBQSxJQUNwQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFRQSxTQUFTLFVBQVUsTUFBb0M7QUFDckQsU0FBTyxPQUFPLFNBQVMsWUFBWSxpQkFBaUI7QUFDdEQ7QUFjQSxTQUFTLGNBQWMsUUFBNkQ7QUFDbEYsUUFBTSxFQUFFLFNBQVMsS0FBSyxRQUFRLElBQUk7QUFDbEMsTUFBSSxRQUFRLGFBQWEsV0FBVyxRQUFRLFNBQVMsSUFBSSxHQUFHO0FBQzFELFFBQUksQ0FBQyxTQUFTO0FBQ1osWUFBTSxJQUFJLE1BQU0seUhBQXlIO0FBQUEsSUFDM0k7QUFDQSxVQUFNLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSTtBQUMzQixzQkFBa0IsU0FBUyxpQ0FBaUM7QUFDNUQsV0FBTyxNQUFNLFNBQVMsTUFBTTtBQUFBLE1BQzFCO0FBQUEsTUFDQSxLQUFLO0FBQUEsTUFDTCxPQUFPO0FBQUEsSUFDVCxDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sZUFBZSxRQUFRLGFBQWEsVUFBVSxxQkFBcUIsT0FBTyxJQUFJO0FBQ3BGLFNBQU8sTUFBTSxjQUFjLENBQUMsR0FBRztBQUFBLElBQzdCO0FBQUEsSUFDQSxLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsRUFDVCxDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbIm1heENvbW1hbmRMZW5ndGgiXQp9Cg==
293
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9leGVjLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGV4ZWN1dGluZyBjb21tYW5kcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IHRyaW1FbmQgfSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBjbWRFc2NhcGVDb21tYW5kTGluZSxcbiAgdG9Db21tYW5kTGluZVxufSBmcm9tICcuL2NsaS11dGlscy50cyc7XG5cbi8qKlxuICogQSBjb21tYW5kIHBhcnQ6IGVpdGhlciBhIHBsYWluIHN0cmluZyBvciBhbiB7QGxpbmsgRXhlY0FyZ30gd2l0aCBiYXRjaGVkIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tbWFuZFBhcnQgPSBFeGVjQXJnIHwgc3RyaW5nO1xuXG4vKipcbiAqIEEgY29tbWFuZCBhcmd1bWVudCB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBhcmdzIHRvIGJlIGJhdGNoZWQuXG4gKiBJZiB0aGUgZXhwYW5kZWQgY29tbWFuZCBleGNlZWRzIHRoZSBwbGF0Zm9ybSdzIG1heCBjb21tYW5kIGxlbmd0aCxcbiAqIHRoZSBiYXRjaGVkIGFyZ3MgYXJlIHNwbGl0IGludG8gc2VxdWVudGlhbCBleGVjdXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNBcmcge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBiYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZWRBcmdzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZXhlY30gdGhhdCByZXR1cm4gZGV0YWlsZWQgcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjRGV0YWlsZWRPcHRpb25zIGV4dGVuZHMgRXhlY09wdGlvbnMge1xuICAvKipcbiAgICogTXVzdCBiZSBgdHJ1ZWAgdG8gcmVjZWl2ZSBkZXRhaWxlZCByZXN1bHRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZXhlY3V0aW5nIGEgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgZm9yIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBjaGlsZCBwcm9jZXNzLCBtZXJnZWQgb3ZlciB0aGUgaW5oZXJpdGVkIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBge31gXG4gICAqL1xuICByZWFkb25seSBlbnY/OiBOb2RlSlMuUHJvY2Vzc0VudjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBhdHRhY2hlcyB0aGUgY2hpbGQgcHJvY2VzcydzIHN0ZGlvIGRpcmVjdGx5IHRvIHRoZSB0ZXJtaW5hbCAoYHN0ZGlvOiAnaW5oZXJpdCdgKSBpbnN0ZWFkXG4gICAqIG9mIGNhcHR1cmluZyBpdC4gVXNlIGZvciBsb25nLXJ1bm5pbmcgb3IgaW50ZXJhY3RpdmUgY29tbWFuZHMgc3VjaCBhcyBkZXYgc2VydmVycyBhbmQgd2F0Y2ggbW9kZS5cbiAgICogQmVjYXVzZSB0aGUgb3V0cHV0IGlzIG5vdCBjYXB0dXJlZCwgdGhlIHJlc29sdmVkIHN0ZG91dCBpcyBhbiBlbXB0eSBzdHJpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHN1cHByZXNzZXMgdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNRdWlldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjb21tYW5kIGZhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZhaWxJZkNhbGxlZEZyb21PdXRzaWRlUm9vdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgaWdub3JlcyB0aGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJZ25vcmVFeGl0Q29kZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGBmYWxzZWAsIG9ubHkgcmV0dXJucyB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGlucHV0IHRvIGJlIHBhc3NlZCB0byB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgc3RkaW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByZXN1bHQgb2Yge0BsaW5rIGV4ZWN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNSZXN1bHQge1xuICAvKipcbiAgICogQW4gZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLiBBIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvY2VzcyBkaWQgbm90IGV4aXQgbm9ybWFsbHkuXG4gICAqL1xuICByZWFkb25seSBleGl0Q29kZTogbnVsbCB8IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzaWduYWwgdGhhdCBjYXVzZWQgdGhlIHByb2Nlc3MgdG8gYmUgdGVybWluYXRlZC4gQSB2YWx1ZSBvZiBgbnVsbGAgaW5kaWNhdGVzIHRoYXQgbm8gc2lnbmFsIHdhcyByZWNlaXZlZC5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzdGFuZGFyZCBlcnJvciBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0YW5kYXJkIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGV4ZWN9IHRoYXQgcmV0dXJuIG9ubHkgc3Rkb3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNTaW1wbGVPcHRpb25zIGV4dGVuZHMgRXhlY09wdGlvbnMge1xuICAvKipcbiAgICogTXVzdCBiZSBgZmFsc2VgIG9yIG9taXR0ZWQgdG8gcmVjZWl2ZSBvbmx5IHN0ZG91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZURldGFpbHM/OiBmYWxzZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZXhlY1N0cmluZ30uXG4gKi9cbmludGVyZmFjZSBFeGVjU3RyaW5nUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHN0cmluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGV4ZWMgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM/OiBFeGVjT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIGFyZ3VtZW50IGFycmF5IChpZiBhdmFpbGFibGUpLCB1c2VkIGJ5IHRoZSBQb3dlclNoZWxsXG4gICAqIGZhbGxiYWNrIHBhdGggdG8gcXVvdGUgYXJndW1lbnRzIHdpdGggUG93ZXJTaGVsbC1uYXRpdmUgc2luZ2xlIHF1b3Rlcy5cbiAgICovXG4gIHJlYWRvbmx5IHJhd0FyZ3M/OiBzdHJpbmdbXTtcbn1cbi8qKlxuICogQXBwZW5kcyBhIHNpbmdsZSBgbm9kZWAgQ0xJIG9wdGlvbiB0byBhIGBOT0RFX09QVElPTlNgIHN0cmluZywgcHJlc2VydmluZyBhbnkgb3B0aW9ucyBhbHJlYWR5IHByZXNlbnQuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nTm9kZU9wdGlvbnMgLSBUaGUgY3VycmVudCBgTk9ERV9PUFRJT05TYCB2YWx1ZSAoZS5nLiBgcHJvY2Vzcy5lbnYuTk9ERV9PUFRJT05TYCksIGlmIGFueS5cbiAqIEBwYXJhbSBvcHRpb24gLSBUaGUgYG5vZGVgIENMSSBvcHRpb24gdG8gYXBwZW5kIChlLmcuIGAtLWxvY2Fsc3RvcmFnZS1maWxlPTptZW1vcnk6YCkuXG4gKiBAcmV0dXJucyBUaGUgY29tYmluZWQgYE5PREVfT1BUSU9OU2Agc3RyaW5nLiBJZiBgb3B0aW9uYCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmROb2RlT3B0aW9uKGV4aXN0aW5nTm9kZU9wdGlvbnM6IHN0cmluZyB8IHVuZGVmaW5lZCwgb3B0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gKGV4aXN0aW5nTm9kZU9wdGlvbnMgPz8gJycpLnRyaW0oKTtcbiAgaWYgKHRyaW1tZWQgPT09ICcnKSB7XG4gICAgcmV0dXJuIG9wdGlvbjtcbiAgfVxuICBpZiAodHJpbW1lZC5zcGxpdCgvXFxzKy8pLmluY2x1ZGVzKG9wdGlvbikpIHtcbiAgICByZXR1cm4gdHJpbW1lZDtcbiAgfVxuICByZXR1cm4gYCR7dHJpbW1lZH0gJHtvcHRpb259YDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGVudmlyb25tZW50IGZvciBjaGlsZCBwcm9jZXNzZXM6IHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgcGx1cyBgREVCVUdfQ09MT1JTYCwgYW5kIFx1MjAxNCB3aGVuXG4gKiB0aGUgcnVubmluZyBgbm9kZWAgc3VwcG9ydHMgaXQgXHUyMDE0IHtAbGluayBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OfSBhcHBlbmRlZCB0byBgTk9ERV9PUFRJT05TYC5cbiAqXG4gKiBUaGUgc3VwcG9ydCBjaGVjayBndWFyZHMgYWdhaW5zdCBvbGRlciBgbm9kZWAgKDwgMjIpOiBwYXNzaW5nIGFuIG9wdGlvbiBgbm9kZWAgZG9lcyBub3QgcmVjb2duaXplIHZpYVxuICogYE5PREVfT1BUSU9OU2AgbWFrZXMgaXQgZXhpdCBiZWZvcmUgcnVubmluZywgd2hpY2ggd291bGQgYnJlYWsgZXZlcnkgc3Bhd25lZCB0b29sLlxuICpcbiAqIEBwYXJhbSBiYXNlRW52IC0gVGhlIHBhcmVudCBlbnZpcm9ubWVudCB0byBleHRlbmQgKHR5cGljYWxseSBgcHJvY2Vzcy5lbnZgKS5cbiAqIEBwYXJhbSBhbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3MgLSBUaGUgYG5vZGVgIG9wdGlvbnMgYWNjZXB0ZWQgdmlhIGBOT0RFX09QVElPTlNgICh0eXBpY2FsbHkgYHByb2Nlc3MuYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzYCkuXG4gKiBAcmV0dXJucyBUaGUgZW52aXJvbm1lbnQgdG8gcGFzcyB0byBzcGF3bmVkIGNoaWxkIHByb2Nlc3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2hpbGRFbnYoYmFzZUVudjogTm9kZUpTLlByb2Nlc3NFbnYsIGFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFnczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IE5vZGVKUy5Qcm9jZXNzRW52IHtcbiAgY29uc3QgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHtcbiAgICBERUJVR19DT0xPUlM6ICcxJyxcbiAgICAuLi5iYXNlRW52XG4gIH07XG4gIGlmIChhbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3MuaGFzKCctLWxvY2Fsc3RvcmFnZS1maWxlJykpIHtcbiAgICBlbnZbJ05PREVfT1BUSU9OUyddID0gYXBwZW5kTm9kZU9wdGlvbihiYXNlRW52WydOT0RFX09QVElPTlMnXSwgTE9DQUxfU1RPUkFHRV9OT0RFX09QVElPTik7XG4gIH1cbiAgcmV0dXJuIGVudjtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBleGVjdXRlLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBleGVjdXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZC5cbiAqIEB0aHJvd3MgSWYgdGhlIGNvbW1hbmQgZmFpbHMgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgaWdub3JlRXhpdENvZGUgaXMgYGZhbHNlYC5cbiAqICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4aXQgY29kZSBhbmQgc3RkZXJyLlxuICogICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBleGVjdXRpb24gYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGB0cnVlYCxcbiAqICAgICAgICAgdGhlIGVycm9yIGlzIHJlc29sdmVkIHdpdGggdGhlIHN0ZG91dCBhbmQgc3RkZXJyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlYyhjb21tYW5kOiBDb21tYW5kUGFydFtdIHwgc3RyaW5nLCBvcHRpb25zPzogRXhlY1NpbXBsZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBFeGVjUmVzdWx0IG9iamVjdC5cbiAqICAgICAgICAgIFRoZSBFeGVjUmVzdWx0IG9iamVjdCBjb250YWlucyB0aGUgZXhpdCBjb2RlLCBleGl0IHNpZ25hbCwgc3RkZXJyLCBhbmQgc3Rkb3V0LlxuICogQHRocm93cyBJZiB0aGUgY29tbWFuZCBmYWlscyB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgZmFsc2VgLlxuICogICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRlcyB0aGUgZXhpdCBjb2RlIGFuZCBzdGRlcnIuXG4gKiAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBhbmQgaWdub3JlRXhpdENvZGUgaXMgYHRydWVgLFxuICogICAgICAgICB0aGUgZXJyb3IgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjKGNvbW1hbmQ6IENvbW1hbmRQYXJ0W10gfCBzdHJpbmcsIG9wdGlvbnM6IEV4ZWNEZXRhaWxlZE9wdGlvbnMpOiBQcm9taXNlPEV4ZWNSZXN1bHQ+O1xuLyoqXG4gKiBFeGVjdXRlcyBhIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBleGVjdXRlLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBleGVjdXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCBvciBhbiBFeGVjUmVzdWx0IG9iamVjdC5cbiAqICAgICAgICAgIFRoZSBFeGVjUmVzdWx0IG9iamVjdCBjb250YWlucyB0aGUgZXhpdCBjb2RlLCBleGl0IHNpZ25hbCwgc3RkZXJyLCBhbmQgc3Rkb3V0LlxuICogQHRocm93cyBJZiB0aGUgY29tbWFuZCBmYWlscyB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgZmFsc2VgLlxuICogICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRlcyB0aGUgZXhpdCBjb2RlIGFuZCBzdGRlcnIuXG4gKiAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBhbmQgaWdub3JlRXhpdENvZGUgaXMgYHRydWVgLFxuICogICAgICAgICB0aGUgZXJyb3IgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjKGNvbW1hbmQ6IENvbW1hbmRQYXJ0W10gfCBzdHJpbmcsIG9wdGlvbnM6IEV4ZWNPcHRpb25zID0ge30pOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29tbWFuZCkpIHtcbiAgICBjb25zdCBiYXRjaFJlc3VsdCA9IGhhbmRsZUJhdGNoZWRDb21tYW5kKGNvbW1hbmQsIG9wdGlvbnMpO1xuICAgIGlmIChiYXRjaFJlc3VsdCkge1xuICAgICAgcmV0dXJuIGJhdGNoUmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gY29tbWFuZC5maWx0ZXIoKHBhcnQpOiBwYXJ0IGlzIHN0cmluZyA9PiB0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpO1xuICAgIGNvbnN0IGNvbW1hbmRMaW5lID0gdG9Db21tYW5kTGluZShhcmdzKTtcblxuICAgIGNvbnN0IG1heENvbW1hbmRMZW5ndGggPSBnZXRNYXhDb21tYW5kTGVuZ3RoKCk7XG4gICAgaWYgKGNvbW1hbmRMaW5lLmxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGgpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgKCR7U3RyaW5nKGNvbW1hbmRMaW5lLmxlbmd0aCl9IGNoYXJzLCBtYXggJHtTdHJpbmcobWF4Q29tbWFuZExlbmd0aCl9IG9uICR7cHJvY2Vzcy5wbGF0Zm9ybX0pLiBDb25zaWRlciBzcGxpdHRpbmcgaW50byBzbWFsbGVyIGJhdGNoZXMgb3IgdXNlIEV4ZWNBcmcuYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQ6IGNvbW1hbmRMaW5lLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHJhd0FyZ3M6IGFyZ3NcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG1heENvbW1hbmRMZW5ndGggPSBnZXRNYXhDb21tYW5kTGVuZ3RoKCk7XG4gIGlmIChjb21tYW5kLmxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICBuZXcgRXJyb3IoXG4gICAgICAgIGBDb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgKCR7U3RyaW5nKGNvbW1hbmQubGVuZ3RoKX0gY2hhcnMsIG1heCAke1N0cmluZyhtYXhDb21tYW5kTGVuZ3RoKX0gb24gJHtwcm9jZXNzLnBsYXRmb3JtfSkuIENvbnNpZGVyIHNwbGl0dGluZyBpbnRvIHNtYWxsZXIgYmF0Y2hlcyBvciB1c2UgRXhlY0FyZy5gXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBleGVjU3RyaW5nKHtcbiAgICBjb21tYW5kLFxuICAgIG9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBzaW5nbGUgc3RyaW5nIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBleGVjU3RyaW5nKHBhcmFtczogRXhlY1N0cmluZ1BhcmFtcyk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBvcHRpb25zID0ge30sXG4gICAgcmF3QXJnc1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCB7XG4gICAgY3dkID0gcHJvY2Vzcy5jd2QoKSxcbiAgICBlbnYsXG4gICAgaXNJbnRlcmFjdGl2ZSA9IGZhbHNlLFxuICAgIGlzUXVpZXQ6IHF1aWV0ID0gZmFsc2UsXG4gICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IGlnbm9yZUV4aXRDb2RlID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZURldGFpbHMgPSBmYWxzZSxcbiAgICBzdGRpbiA9ICcnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ0V4ZWMnKShgRXhlY3V0aW5nIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcblxuICAgIGNvbnN0IGNoaWxkID0gc3Bhd25WaWFTaGVsbChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U3Bhd25WaWFTaGVsbFBhcmFtcz4oe1xuICAgICAgY29tbWFuZCxcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGlzSW50ZXJhY3RpdmUsXG4gICAgICByYXdBcmdzXG4gICAgfSkpO1xuXG4gICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgIGxldCBzdGRlcnIgPSAnJztcblxuICAgIC8vIEluIGludGVyYWN0aXZlIG1vZGUgdGhlIGNoaWxkJ3Mgc3RkaW8gaXMgaW5oZXJpdGVkIGJ5IHRoZSB0ZXJtaW5hbCwgc28gdGhlcmUgYXJlIG5vIHN0cmVhbXMgdG8gcmVhZCBhbmQgbm90aGluZyBpcyBjYXB0dXJlZC5cbiAgICBpZiAoIWlzSW50ZXJhY3RpdmUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3RkZXJyOiBjaGlsZFN0ZGVycixcbiAgICAgICAgc3RkaW46IGNoaWxkU3RkaW4sXG4gICAgICAgIHN0ZG91dDogY2hpbGRTdGRvdXRcbiAgICAgIH0gPSBjaGlsZDtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKGNoaWxkU3RkaW4sICdDaGlsZCBwcm9jZXNzIHN0ZGluIGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKGNoaWxkU3Rkb3V0LCAnQ2hpbGQgcHJvY2VzcyBzdGRvdXQgaXMgbm90IGF2YWlsYWJsZScpO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoY2hpbGRTdGRlcnIsICdDaGlsZCBwcm9jZXNzIHN0ZGVyciBpcyBub3QgYXZhaWxhYmxlJyk7XG5cbiAgICAgIGNoaWxkU3RkaW4ud3JpdGUoc3RkaW4pO1xuICAgICAgY2hpbGRTdGRpbi5lbmQoKTtcblxuICAgICAgY2hpbGRTdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzdGRvdXQgKz0gZGF0YS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZFN0ZG91dC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBzdGRvdXQgPSB0cmltRW5kKHtcbiAgICAgICAgICBzdHI6IHN0ZG91dCxcbiAgICAgICAgICBzdWZmaXg6ICdcXG4nXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkU3RkZXJyLm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RkZXJyICs9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRlcnIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgc3RkZXJyID0gdHJpbUVuZCh7XG4gICAgICAgICAgc3RyOiBzdGRlcnIsXG4gICAgICAgICAgc3VmZml4OiAnXFxuJ1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoaWxkLm9uKCdjbG9zZScsIChleGl0Q29kZSwgZXhpdFNpZ25hbCkgPT4ge1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21tYW5kIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2V4aXRDb2RlID8gU3RyaW5nKGV4aXRDb2RlKSA6ICcobnVsbCknfVxcbiR7c3RkZXJyfWApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXNob3VsZEluY2x1ZGVEZXRhaWxzKSB7XG4gICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGV4aXRDb2RlLFxuICAgICAgICBleGl0U2lnbmFsLFxuICAgICAgICBzdGRlcnIsXG4gICAgICAgIHN0ZG91dFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBpZiAoIWlnbm9yZUV4aXRDb2RlKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghc2hvdWxkSW5jbHVkZURldGFpbHMpIHtcbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoe1xuICAgICAgICBleGl0Q29kZTogbnVsbCxcbiAgICAgICAgZXhpdFNpZ25hbDogbnVsbCxcbiAgICAgICAgc3RkZXJyLFxuICAgICAgICBzdGRvdXRcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBIGBub2RlYCBDTEkgb3B0aW9uIChwYXNzZWQgdmlhIGBOT0RFX09QVElPTlNgKSB0aGF0IHByb3ZpZGVzIGFuIGluLW1lbW9yeSBgbG9jYWxTdG9yYWdlYCB0byBldmVyeVxuICogc3Bhd25lZCBgbm9kZWAgcHJvY2Vzcy4gTm9kZSAyMisgZXhwb3NlcyBhbiBleHBlcmltZW50YWwgV2ViIFN0b3JhZ2UgYGxvY2FsU3RvcmFnZWAsIGJ1dCBhY2Nlc3NpbmcgaXRcbiAqIHdpdGhvdXQgYC0tbG9jYWxzdG9yYWdlLWZpbGVgIGVtaXRzIGFuIGBFeHBlcmltZW50YWxXYXJuaW5nYCBhbmQgbGVhdmVzIGBsb2NhbFN0b3JhZ2VgIHVuYXZhaWxhYmxlLlxuICogUG9pbnRpbmcgaXQgYXQgdGhlIHNwZWNpYWwgYDptZW1vcnk6YCBkYXRhYmFzZSBnaXZlcyBlYWNoIHByb2Nlc3MgYSB3b3JraW5nLCBub24tcGVyc2lzdGVudFxuICogYGxvY2FsU3RvcmFnZWAgKG5vIGZpbGUgb24gZGlzaywgbm8gc3RhdGUgc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzKSBcdTIwMTQgbWF0Y2hpbmcgdGhlIHJlYWwgT2JzaWRpYW5cbiAqIChFbGVjdHJvbikgcnVudGltZSBhbmQgc2lsZW5jaW5nIHRoZSB3YXJuaW5nIGJ5IGFkZHJlc3NpbmcgaXRzIHJvb3QgY2F1c2UgcmF0aGVyIHRoYW4gc3VwcHJlc3NpbmcgaXQuXG4gKlxuICogSXQgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhlIHJ1bm5pbmcgYG5vZGVgIGFjdHVhbGx5IHN1cHBvcnRzIGl0IChzZWUge0BsaW5rIGJ1aWxkQ2hpbGRFbnZ9KTogcGFzc2luZ1xuICogYW4gb3B0aW9uIGBub2RlYCBkb2VzIG5vdCByZWNvZ25pemUgdmlhIGBOT0RFX09QVElPTlNgIG1ha2VzIGl0IHJlZnVzZSB0byBzdGFydCwgc28gYW4gb2xkZXIgYG5vZGVgXG4gKiAoPCAyMikgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZC5cbiAqL1xuY29uc3QgTE9DQUxfU1RPUkFHRV9OT0RFX09QVElPTiA9ICctLWxvY2Fsc3RvcmFnZS1maWxlPTptZW1vcnk6JztcblxuLyoqXG4gKiBEZWZhdWx0IGVudmlyb25tZW50IHZhcmlhYmxlcyBwYXNzZWQgdG8gY2hpbGQgcHJvY2Vzc2VzLlxuICovXG5jb25zdCBDSElMRF9FTlYgPSBidWlsZENoaWxkRW52KHByb2Nlc3MuZW52LCBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFncyk7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV4ZWN1dGVCYXRjaGVzfS5cbiAqL1xuaW50ZXJmYWNlIEV4ZWN1dGVCYXRjaGVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlIGNvbW1hbmQgd2l0aG91dCBiYXRjaGVkIGFyZ3MuXG4gICAqL1xuICByZWFkb25seSBiYXNlQ29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYmF0Y2hlcyBvZiBhcmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmF0Y2hlczogc3RyaW5nW11bXTtcblxuICAvKipcbiAgICogVGhlIGV4ZWMgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IEV4ZWNPcHRpb25zO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzcGF3blZpYVNoZWxsfS5cbiAqL1xuaW50ZXJmYWNlIFNwYXduVmlhU2hlbGxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgc3RyaW5nIHRvIGV4ZWN1dGUuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBtZXJnZWQgb3ZlciB0aGUgaW5oZXJpdGVkIGNoaWxkIGVudmlyb25tZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogTm9kZUpTLlByb2Nlc3NFbnY7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgYXR0YWNoZXMgdGhlIGNoaWxkJ3Mgc3RkaW8gdG8gdGhlIHRlcm1pbmFsIGluc3RlYWQgb2YgcGlwaW5nIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbnRlcmFjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBhcmd1bWVudCBhcnJheSAoaWYgYXZhaWxhYmxlKS5cbiAgICovXG4gIHJlYWRvbmx5IHJhd0FyZ3M/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBiYXRjaGVkIGNvbW1hbmRzIHNlcXVlbnRpYWxseSBhbmQgY29uY2F0ZW5hdGVzIHN0ZG91dC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBiYXRjaGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbmNhdGVuYXRlZCByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVCYXRjaGVzKHBhcmFtczogRXhlY3V0ZUJhdGNoZXNQYXJhbXMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHtcbiAgY29uc3QgeyBiYXNlQ29tbWFuZCwgYmF0Y2hlcywgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgYmF0Y2ggb2YgYmF0Y2hlcykge1xuICAgIGNvbnN0IGJhdGNoQ29tbWFuZCA9IGAke2Jhc2VDb21tYW5kfSAke2JhdGNoLmpvaW4oJyAnKX1gO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWNTdHJpbmcoe1xuICAgICAgY29tbWFuZDogYmF0Y2hDb21tYW5kLFxuICAgICAgb3B0aW9uc1xuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2hvdWxkSW5jbHVkZURldGFpbHMpIHtcbiAgICByZXR1cm4geyBleGl0Q29kZTogMCwgZXhpdFNpZ25hbDogbnVsbCwgc3RkZXJyOiAnJywgc3Rkb3V0OiByZXN1bHRzLmpvaW4oJ1xcbicpIH07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBtYXggY29tbWFuZCBsaW5lIGxlbmd0aC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbWF4IGNvbW1hbmQgbGVuZ3RoIGluIGNoYXJhY3RlcnMuXG4gKi9cbmZ1bmN0aW9uIGdldE1heENvbW1hbmRMZW5ndGgoKTogbnVtYmVyIHtcbiAgY29uc3QgV0lORE9XU19NQVhfQ09NTUFORF9MRU5HVEggPSA4MTkxO1xuICBjb25zdCBVTklYX01BWF9DT01NQU5EX0xFTkdUSCA9IDEzMTA3MjtcbiAgcmV0dXJuIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBXSU5ET1dTX01BWF9DT01NQU5EX0xFTkdUSCA6IFVOSVhfTUFYX0NPTU1BTkRfTEVOR1RIO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBjb21tYW5kIGFycmF5IHRoYXQgbWF5IGNvbnRhaW4gYW4ge0BsaW5rIEV4ZWNBcmd9LlxuICogUmV0dXJucyBhIFByb21pc2UgaWYgYmF0Y2hpbmcgaXMgbmVlZGVkLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgY29tbWFuZFxuICogaGFzIG5vIEV4ZWNBcmcgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQgbm9ybWFsbHkuXG4gKlxuICogQHBhcmFtIHBhcnRzIC0gVGhlIGNvbW1hbmQgcGFydHMuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBleGVjIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIFByb21pc2UgaWYgYmF0Y2hpbmcgaXMgaGFuZGxlZCwgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUJhdGNoZWRDb21tYW5kKHBhcnRzOiBDb21tYW5kUGFydFtdLCBvcHRpb25zOiBFeGVjT3B0aW9ucyk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBleGVjQXJncyA9IHBhcnRzLmZpbHRlcihpc0V4ZWNBcmcpO1xuICBpZiAoZXhlY0FyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoZXhlY0FyZ3MubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ09ubHkgb25lIEV4ZWNBcmcgd2l0aCBiYXRjaGVkQXJncyBpcyBhbGxvd2VkIHBlciBjb21tYW5kJykpO1xuICB9XG5cbiAgY29uc3QgZXhlY0FyZyA9IGV4ZWNBcmdzWzBdO1xuICBhc3NlcnROb25OdWxsYWJsZShleGVjQXJnKTtcbiAgY29uc3Qgc3RhdGljUGFydHMgPSBwYXJ0cy5maWx0ZXIoKHBhcnQpOiBwYXJ0IGlzIHN0cmluZyA9PiB0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpO1xuICBjb25zdCBiYXNlQ29tbWFuZCA9IHRvQ29tbWFuZExpbmUoc3RhdGljUGFydHMpO1xuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuXG4gIC8vIFRyeSBleHBhbmRpbmcgYWxsIGFyZ3MgaW5saW5lXG4gIGNvbnN0IGZ1bGxDb21tYW5kID0gYCR7YmFzZUNvbW1hbmR9ICR7ZXhlY0FyZy5iYXRjaGVkQXJncy5qb2luKCcgJyl9YDtcbiAgaWYgKGZ1bGxDb21tYW5kLmxlbmd0aCA8PSBtYXhDb21tYW5kTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGV4ZWNTdHJpbmcoe1xuICAgICAgY29tbWFuZDogZnVsbENvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG4gIH1cblxuICAvLyBTcGxpdCBpbnRvIGJhdGNoZXNcbiAgY29uc3QgYmF0Y2hlczogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgY3VycmVudEJhdGNoOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgYXJnIG9mIGV4ZWNBcmcuYmF0Y2hlZEFyZ3MpIHtcbiAgICBjb25zdCB0ZW50YXRpdmUgPSBgJHtiYXNlQ29tbWFuZH0gJHtbLi4uY3VycmVudEJhdGNoLCBhcmddLmpvaW4oJyAnKX1gO1xuICAgIGlmICh0ZW50YXRpdmUubGVuZ3RoID4gbWF4Q29tbWFuZExlbmd0aCkge1xuICAgICAgaWYgKGN1cnJlbnRCYXRjaC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3Qgc3BsaXQgY29tbWFuZCBpbnRvIGJhdGNoZXM6IGEgc2luZ2xlIGFyZ3VtZW50ICgke1N0cmluZyhhcmcubGVuZ3RoKX0gY2hhcnMpIHBsdXMgdGhlIGJhc2UgY29tbWFuZCAoJHtTdHJpbmcoYmFzZUNvbW1hbmQubGVuZ3RoKX0gY2hhcnMpIGV4Y2VlZHMgdGhlIG1heCBjb21tYW5kIGxlbmd0aCAoJHtTdHJpbmcobWF4Q29tbWFuZExlbmd0aCl9KS5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYmF0Y2hlcy5wdXNoKGN1cnJlbnRCYXRjaCk7XG4gICAgICBjdXJyZW50QmF0Y2ggPSBbYXJnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudEJhdGNoLnB1c2goYXJnKTtcbiAgICB9XG4gIH1cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsd2F5cyB0cnVlIGFmdGVyIHRoZSBsb29wOyBiYXRjaGVkQXJncyBpcyBub24tZW1wdHkgYXQgdGhpcyBwb2ludC4gKi9cbiAgaWYgKGN1cnJlbnRCYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICBiYXRjaGVzLnB1c2goY3VycmVudEJhdGNoKTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlQmF0Y2hlcyh7XG4gICAgYmFzZUNvbW1hbmQsXG4gICAgYmF0Y2hlcyxcbiAgICBvcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGNvbW1hbmQgcGFydCBpcyBhbiB7QGxpbmsgRXhlY0FyZ30uXG4gKlxuICogQHBhcmFtIHBhcnQgLSBUaGUgY29tbWFuZCBwYXJ0IHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcGFydCBpcyBhbiBFeGVjQXJnLlxuICovXG5mdW5jdGlvbiBpc0V4ZWNBcmcocGFydDogQ29tbWFuZFBhcnQpOiBwYXJ0IGlzIEV4ZWNBcmcge1xuICByZXR1cm4gdHlwZW9mIHBhcnQgPT09ICdvYmplY3QnICYmICdiYXRjaGVkQXJncycgaW4gcGFydDtcbn1cblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIHZpYSB0aGUgYXBwcm9wcmlhdGUgc2hlbGwuXG4gKlxuICogT24gV2luZG93cywgaWYgdGhlIGNvbW1hbmQgY29udGFpbnMgbmV3bGluZXMgKHdoaWNoIGBjbWQuZXhlYCBjYW5ub3QgaGFuZGxlKVxuICogYW5kIHRoZSByYXcgYXJncyBhcnJheSBpcyBhdmFpbGFibGUsIHNwYXducyB0aGUgcHJvY2VzcyBkaXJlY3RseSB3aXRob3V0XG4gKiBhbnkgc2hlbGwgXHUyMDE0IHBhc3NpbmcgYXJncyB2aWEgYENyZWF0ZVByb2Nlc3NgLCB3aGljaCBhdm9pZHMgYWxsIHF1b3RpbmcgaXNzdWVzLlxuICpcbiAqIE9uIFdpbmRvd3MgKGNtZC5leGUgcGF0aCksIGFwcGxpZXMgYF5gLWVzY2FwaW5nIGZvciBjbWQgbWV0YWNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBzcGF3bmluZyB0aGUgY2hpbGQgcHJvY2Vzcy5cbiAqIEByZXR1cm5zIFRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIHNwYXduVmlhU2hlbGwocGFyYW1zOiBTcGF3blZpYVNoZWxsUGFyYW1zKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgeyBjb21tYW5kLCBjd2QsIGVudjogZXh0cmFFbnYsIGlzSW50ZXJhY3RpdmUgPSBmYWxzZSwgcmF3QXJncyB9ID0gcGFyYW1zO1xuICBjb25zdCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52ID0ge1xuICAgIC4uLkNISUxEX0VOVixcbiAgICAuLi5leHRyYUVudlxuICB9O1xuICBjb25zdCBzdGRpbzogJ2luaGVyaXQnIHwgJ3BpcGUnID0gaXNJbnRlcmFjdGl2ZSA/ICdpbmhlcml0JyA6ICdwaXBlJztcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgY29tbWFuZC5pbmNsdWRlcygnXFxuJykpIHtcbiAgICBpZiAoIXJhd0FyZ3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29tbWFuZHMgY29udGFpbmluZyBuZXdsaW5lcyBjYW5ub3QgYmUgZXhlY3V0ZWQgdGhyb3VnaCBjbWQuZXhlIG9uIFdpbmRvd3MuIFBhc3MgYW4gYXJndW1lbnQgYXJyYXkgaW5zdGVhZCBvZiBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgY29uc3QgW3Byb2dyYW0sIC4uLmFyZ3NdID0gcmF3QXJncztcbiAgICBhc3NlcnROb25OdWxsYWJsZShwcm9ncmFtLCAnQ29tbWFuZCBhcnJheSBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICAgIHJldHVybiBzcGF3bihwcm9ncmFtLCBhcmdzLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzdGRpb1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc2hlbGxDb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IGNtZEVzY2FwZUNvbW1hbmRMaW5lKGNvbW1hbmQpIDogY29tbWFuZDtcbiAgcmV0dXJuIHNwYXduKHNoZWxsQ29tbWFuZCwgW10sIHtcbiAgICBjd2QsXG4gICAgZW52LFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvXG4gIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLGFBQWE7QUFDdEIsT0FBTyxhQUFhO0FBRXBCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsZUFBZTtBQUN4QixTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQTBKQSxTQUFTLGlCQUFpQixxQkFBeUMsUUFBd0I7QUFDaEcsUUFBTSxXQUFXLHVCQUF1QixJQUFJLEtBQUs7QUFDakQsTUFBSSxZQUFZLElBQUk7QUFDbEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLFFBQVEsTUFBTSxLQUFLLEVBQUUsU0FBUyxNQUFNLEdBQUc7QUFDekMsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLEdBQUcsT0FBTyxJQUFJLE1BQU07QUFDN0I7QUFhTyxTQUFTLGNBQWMsU0FBNEIsNkJBQXFFO0FBQzdILFFBQU0sTUFBeUI7QUFBQSxJQUM3QixjQUFjO0FBQUEsSUFDZCxHQUFHO0FBQUEsRUFDTDtBQUNBLE1BQUksNEJBQTRCLElBQUkscUJBQXFCLEdBQUc7QUFD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QVEsYUFBYTtBQUNyQyxVQUFNLFlBQVksR0FBRyxXQUFXLElBQUksQ0FBQyxHQUFHLGNBQWMsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDO0FBQ3BFLFFBQUksVUFBVSxTQUFTLGtCQUFrQjtBQUN2QyxVQUFJLGFBQWEsV0FBVyxHQUFHO0FBQzdCLGVBQU8sUUFBUTtBQUFBLFVBQ2IsSUFBSTtBQUFBLFlBQ0YseURBQXlELE9BQU8sSUFBSSxNQUFNLENBQUMsa0NBQWtDLE9BQU8sWUFBWSxNQUFNLENBQUMsMkNBQTJDLE9BQU8sZ0JBQWdCLENBQUM7QUFBQSxVQUM1TTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQ0EsY0FBUSxLQUFLLFlBQVk7QUFDekIscUJBQWUsQ0FBQyxHQUFHO0FBQUEsSUFDckIsT0FBTztBQUNMLG1CQUFhLEtBQUssR0FBRztBQUFBLElBQ3ZCO0FBQUEsRUFDRjtBQUVBLE1BQUksYUFBYSxTQUFTLEdBQUc7QUFFM0IsWUFBUSxLQUFLLFlBQVk7QUFBQSxFQUMzQjtBQUVBLFNBQU8sZUFBZTtBQUFBLElBQ3BCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFDSDtBQVFBLFNBQVMsVUFBVSxNQUFvQztBQUNyRCxTQUFPLE9BQU8sU0FBUyxZQUFZLGlCQUFpQjtBQUN0RDtBQWNBLFNBQVMsY0FBYyxRQUEyQztBQUNoRSxRQUFNLEVBQUUsU0FBUyxLQUFLLEtBQUssVUFBVSxnQkFBZ0IsT0FBTyxRQUFRLElBQUk7QUFDeEUsUUFBTSxNQUF5QjtBQUFBLElBQzdCLEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxFQUNMO0FBQ0EsUUFBTSxRQUE0QixnQkFBZ0IsWUFBWTtBQUM5RCxNQUFJLFFBQVEsYUFBYSxXQUFXLFFBQVEsU0FBUyxJQUFJLEdBQUc7QUFDMUQsUUFBSSxDQUFDLFNBQVM7QUFDWixZQUFNLElBQUksTUFBTSx5SEFBeUg7QUFBQSxJQUMzSTtBQUNBLFVBQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJO0FBQzNCLHNCQUFrQixTQUFTLGlDQUFpQztBQUM1RCxXQUFPLE1BQU0sU0FBUyxNQUFNO0FBQUEsTUFDMUI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFFQSxRQUFNLGVBQWUsUUFBUSxhQUFhLFVBQVUscUJBQXFCLE9BQU8sSUFBSTtBQUNwRixTQUFPLE1BQU0sY0FBYyxDQUFDLEdBQUc7QUFBQSxJQUM3QjtBQUFBLElBQ0E7QUFBQSxJQUNBLE9BQU87QUFBQSxJQUNQO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbIm1heENvbW1hbmRMZW5ndGgiXQp9Cg==
@@ -26,6 +26,8 @@ export declare enum ObsidianDevUtilsRepoPaths {
26
26
  AnyPath = "**",
27
27
  /** Any TypeScript file. */
28
28
  AnyTs = "*.ts",
29
+ /** Astro configuration file (documentation site) at the repo root. */
30
+ AstroConfigTs = "astro.config.ts",
29
31
  /** CommonJS folder. */
30
32
  Cjs = "cjs",
31
33
  /** CommonJS file extension. */
@@ -46,6 +48,10 @@ export declare enum ObsidianDevUtilsRepoPaths {
46
48
  DjsExtension = ".d.js",
47
49
  /** ESM TypeScript declaration file extension. */
48
50
  DmtsExtension = ".d.mts",
51
+ /** Documentation site folder (Astro + Starlight API-docs sub-project). */
52
+ Docs = "docs",
53
+ /** Build output folder of the documentation site. */
54
+ DocsDist = "docs/dist",
49
55
  /** Dprint configuration file. */
50
56
  DprintJson = "dprint.json",
51
57
  /** TypeScript declaration file extension. */
@@ -30,6 +30,7 @@ var ObsidianDevUtilsRepoPaths = /* @__PURE__ */ ((ObsidianDevUtilsRepoPaths2) =>
30
30
  ObsidianDevUtilsRepoPaths2["AnyMjs"] = "*.mjs";
31
31
  ObsidianDevUtilsRepoPaths2["AnyPath"] = "**";
32
32
  ObsidianDevUtilsRepoPaths2["AnyTs"] = "*.ts";
33
+ ObsidianDevUtilsRepoPaths2["AstroConfigTs"] = "astro.config.ts";
33
34
  ObsidianDevUtilsRepoPaths2["Cjs"] = "cjs";
34
35
  ObsidianDevUtilsRepoPaths2["CjsExtension"] = ".cjs";
35
36
  ObsidianDevUtilsRepoPaths2["CurrentFolder"] = ".";
@@ -40,6 +41,8 @@ var ObsidianDevUtilsRepoPaths = /* @__PURE__ */ ((ObsidianDevUtilsRepoPaths2) =>
40
41
  ObsidianDevUtilsRepoPaths2["DistTemplates"] = "dist/templates";
41
42
  ObsidianDevUtilsRepoPaths2["DjsExtension"] = ".d.js";
42
43
  ObsidianDevUtilsRepoPaths2["DmtsExtension"] = ".d.mts";
44
+ ObsidianDevUtilsRepoPaths2["Docs"] = "docs";
45
+ ObsidianDevUtilsRepoPaths2["DocsDist"] = "docs/dist";
43
46
  ObsidianDevUtilsRepoPaths2["DprintJson"] = "dprint.json";
44
47
  ObsidianDevUtilsRepoPaths2["DtsExtension"] = ".d.ts";
45
48
  ObsidianDevUtilsRepoPaths2["EslintConfigMts"] = "eslint.config.mts";
@@ -76,4 +79,4 @@ var ObsidianDevUtilsRepoPaths = /* @__PURE__ */ ((ObsidianDevUtilsRepoPaths2) =>
76
79
  export {
77
80
  ObsidianDevUtilsRepoPaths
78
81
  };
79
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYW4gZW51bWVyYXRpb24gb2YgY29tbW9uIGZpbGUgcGF0aHMgYW5kIHBhdHRlcm5zIHVzZWQgaW4gdGhlIE9ic2lkaWFuIGRldmVsb3BtZW50IHV0aWxpdGllcyByZXBvc2l0b3J5LlxuICogVGhlc2UgcGF0aHMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgYnVpbGQgcHJvY2VzcyBhbmQgb3RoZXIgdXRpbGl0aWVzLCBlbnN1cmluZyBjb25zaXN0ZW5jeSBhbmQgcmVkdWNpbmcgdGhlIGxpa2VsaWhvb2RcbiAqIG9mIGVycm9ycyBkdWUgdG8gaGFyZGNvZGVkIHN0cmluZ3MuXG4gKi9cblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBjb21tb24gZmlsZSBwYXRocyBhbmQgcGF0dGVybnMgdXNlZCBpbiB0aGUgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBlbnVtIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMge1xuICAvKiogQW55IGZpbGUgb3IgZm9sZGVyLiAqL1xuICBBbnkgPSAnKicsXG5cbiAgLyoqIENvbW1vbkpTIGZpbGUuICovXG4gIEFueUNqcyA9ICcqLmNqcycsXG5cbiAgLyoqIENvbW1vbkpTIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZS4gKi9cbiAgQW55RGN0cyA9ICcqLmQuY3RzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZS4gKi9cbiAgQW55RG10cyA9ICcqLmQubXRzJyxcblxuICAvKiogVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlLiAqL1xuICBBbnlEdHMgPSAnKi5kLnRzJyxcblxuICAvKiogRVNNIEphdmFTY3JpcHQgZmlsZS4gKi9cbiAgQW55TWpzID0gJyoubWpzJyxcblxuICAvKiogQW55IHBhdGggcmVjdXJzaXZlbHkuICovXG4gIEFueVBhdGggPSAnKionLFxuXG4gIC8qKiBBbnkgVHlwZVNjcmlwdCBmaWxlLiAqL1xuICBBbnlUcyA9ICcqLnRzJyxcblxuICAvKiogQ29tbW9uSlMgZm9sZGVyLiAqL1xuICBDanMgPSAnY2pzJyxcblxuICAvKiogQ29tbW9uSlMgZmlsZSBleHRlbnNpb24uICovXG4gIENqc0V4dGVuc2lvbiA9ICcuY2pzJyxcblxuICAvKiogQ3VycmVudCBmb2xkZXIuICovXG4gIEN1cnJlbnRGb2xkZXIgPSAnLicsXG5cbiAgLyoqIERhdGF2aWV3IHR5cGVzLiAqL1xuICBEYXRhdmlld1R5cGVzID0gJ3NyYy9vYnNpZGlhbi9AdHlwZXMvZGF0YXZpZXcvKionLFxuXG4gIC8qKiBDb21tb25KUyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBEY3RzRXh0ZW5zaW9uID0gJy5kLmN0cycsXG5cbiAgLyoqIERpc3RyaWJ1dGlvbiBmb2xkZXIuICovXG4gIERpc3QgPSAnZGlzdCcsXG5cbiAgLyoqIEEgcGF0aCB0byB0aGUgYGxpYmAgZm9sZGVyIHdpdGhpbiB0aGUge0BsaW5rIERpc3R9IGZvbGRlci4gKi9cbiAgRGlzdExpYiA9ICdkaXN0L2xpYicsXG5cbiAgLyoqIEEgcGF0aCB0byB0aGUgYHRlbXBsYXRlc2AgZm9sZGVyIHdpdGhpbiB0aGUge0BsaW5rIERpc3R9IGZvbGRlciwgaG9sZGluZyB0aGUgY29uc3VtZXItZmFjaW5nIHRlbXBsYXRlcy4gKi9cbiAgRGlzdFRlbXBsYXRlcyA9ICdkaXN0L3RlbXBsYXRlcycsXG5cbiAgLyoqIFRyYW5zcGlsZWQgVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlIGV4dGVuc2lvbi4gKi9cbiAgRGpzRXh0ZW5zaW9uID0gJy5kLmpzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBleHRlbnNpb24uICovXG4gIERtdHNFeHRlbnNpb24gPSAnLmQubXRzJyxcblxuICAvKiogRHByaW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgRHByaW50SnNvbiA9ICdkcHJpbnQuanNvbicsXG5cbiAgLyoqIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBleHRlbnNpb24uICovXG4gIER0c0V4dGVuc2lvbiA9ICcuZC50cycsXG5cbiAgLyoqIEVTTSBUeXBlU2NyaXB0IEVTTGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIEVzbGludENvbmZpZ010cyA9ICdlc2xpbnQuY29uZmlnLm10cycsXG5cbiAgLyoqIEVTTSBKYXZhU2NyaXB0IGZvbGRlci4gKi9cbiAgRXNtID0gJ2VzbScsXG5cbiAgLyoqIEdlbmVyYXRlZC1kdXJpbmctYnVpbGQgQ29tbW9uSlMgZmlsZS4gKi9cbiAgR2VuZXJhdGVkRHVyaW5nQnVpbGRDanMgPSAnZ2VuZXJhdGVkLWR1cmluZy1idWlsZC5janMnLFxuXG4gIC8qKiBHZW5lcmF0ZWQtZHVyaW5nLWJ1aWxkIEVTTSBKYXZhU2NyaXB0IGZpbGUuICovXG4gIEdlbmVyYXRlZER1cmluZ0J1aWxkTWpzID0gJ2dlbmVyYXRlZC1kdXJpbmctYnVpbGQubWpzJyxcblxuICAvKiogQ29tbW9uSlMgSmF2YVNjcmlwdCBpbmRleCBmaWxlLiAqL1xuICBJbmRleENqcyA9ICdpbmRleC5janMnLFxuXG4gIC8qKiBDb21tb25KUyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgaW5kZXggZmlsZS4gKi9cbiAgSW5kZXhEY3RzID0gJ2luZGV4LmQuY3RzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBpbmRleCBmaWxlLiAqL1xuICBJbmRleERtdHMgPSAnaW5kZXguZC5tdHMnLFxuXG4gIC8qKiBFU00gSmF2YVNjcmlwdCBpbmRleCBmaWxlLiAqL1xuICBJbmRleE1qcyA9ICdpbmRleC5tanMnLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGluZGV4IGZpbGUuICovXG4gIEluZGV4VHMgPSAnaW5kZXgudHMnLFxuXG4gIC8qKiBKYXZhU2NyaXB0IGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBKc0V4dGVuc2lvbiA9ICcuanMnLFxuXG4gIC8qKiBFU00gTWFya2Rvd25saW50IENMSTIgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBNYXJrZG93bmxpbnRDbGkyQ29uZmlnTWpzID0gJy5tYXJrZG93bmxpbnQtY2xpMi5tanMnLFxuXG4gIC8qKiBNYXJrZG93bmxpbnQgQ0xJMiBjb25maWd1cmF0aW9uIHNjaGVtYSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludFR5cGVzTWFya2Rvd25saW50Q2xpMkNvbmZpZ1NjaGVtYUR0cyA9ICdzcmMvc2NyaXB0LXV0aWxzL2xpbnRlcnMvbWFya2Rvd25saW50LXR5cGVzL0B0eXBlcy9tYXJrZG93bmxpbnQtY2xpMi1jb25maWctc2NoZW1hLmQudHMnLFxuXG4gIC8qKiBHZW5lcmF0ZWQgZmxhdCByZS1leHBvcnQgYmFycmVsIGZpbGUuICovXG4gIE1lcmdlZFRzID0gJ19fbWVyZ2VkLnRzJyxcblxuICAvKiogRVNNIEphdmFTY3JpcHQgZmlsZSBleHRlbnNpb24uICovXG4gIE1qc0V4dGVuc2lvbiA9ICcubWpzJyxcblxuICAvKiogTm9kZSBtb2R1bGVzIGZvbGRlci4gKi9cbiAgTm9kZU1vZHVsZXMgPSAnbm9kZV9tb2R1bGVzJyxcblxuICAvKiogUGFja2FnZSBKU09OIGZpbGUuICovXG4gIFBhY2thZ2VKc29uID0gJ3BhY2thZ2UuanNvbicsXG5cbiAgLyoqIFJvb3QgZm9sZGVyLiAqL1xuICBSb290Rm9sZGVyID0gJy8nLFxuXG4gIC8qKiBTY3JpcHRzIGZvbGRlci4gKi9cbiAgU2NyaXB0cyA9ICdzY3JpcHRzJyxcblxuICAvKiogU2NyaXB0VXRpbHMgZm9sZGVyLiAqL1xuICBTY3JpcHRVdGlscyA9ICdzY3JpcHQtdXRpbHMnLFxuXG4gIC8qKiBTb3VyY2UgZm9sZGVyLiAqL1xuICBTcmMgPSAnc3JjJyxcblxuICAvKiogU3R5bGVzIGZvbGRlci4gKi9cbiAgU3R5bGVzID0gJ3N0eWxlcycsXG5cbiAgLyoqIFN0eWxlcyBDU1MgZmlsZS4gKi9cbiAgU3R5bGVzQ3NzID0gJ3N0eWxlcy5jc3MnLFxuXG4gIC8qKiBUZW1wbGF0ZXMgZm9sZGVyLiAqL1xuICBUZW1wbGF0ZXMgPSAndGVtcGxhdGVzJyxcblxuICAvKiogVGVzdCBoZWxwZXJzIGZvbGRlci4gKi9cbiAgVGVzdEhlbHBlcnMgPSAndGVzdC1oZWxwZXJzJyxcblxuICAvKiogVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIFRzQ29uZmlnSnNvbiA9ICd0c2NvbmZpZy5qc29uJyxcblxuICAvKiogVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCB2YWxpZGF0ZXMgdGhlIGdlbmVyYXRlZCBDb21tb25KUyBkZWNsYXJhdGlvbnMuICovXG4gIFRzQ29uZmlnVmFsaWRhdGVEZWNsYXJhdGlvbnNDanNKc29uID0gJ3RzY29uZmlnLnZhbGlkYXRlLWRlY2xhcmF0aW9ucy1janMuanNvbicsXG5cbiAgLyoqIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgdmFsaWRhdGVzIHRoZSBnZW5lcmF0ZWQgRVNNIGRlY2xhcmF0aW9ucy4gKi9cbiAgVHNDb25maWdWYWxpZGF0ZURlY2xhcmF0aW9uc0pzb24gPSAndHNjb25maWcudmFsaWRhdGUtZGVjbGFyYXRpb25zLmpzb24nLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBUc0V4dGVuc2lvbiA9ICcudHMnLFxuXG4gIC8qKiBUeXBlcyBmb2xkZXIuICovXG4gIFR5cGVzID0gJ0B0eXBlcydcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV08sSUFBSyw0QkFBTCxrQkFBS0EsK0JBQUw7QUFFTCxFQUFBQSwyQkFBQSxTQUFNO0FBR04sRUFBQUEsMkJBQUEsWUFBUztBQUdULEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxhQUFVO0FBR1YsRUFBQUEsMkJBQUEsWUFBUztBQUdULEVBQUFBLDJCQUFBLFlBQVM7QUFHVCxFQUFBQSwyQkFBQSxhQUFVO0FBR1YsRUFBQUEsMkJBQUEsV0FBUTtBQUdSLEVBQUFBLDJCQUFBLFNBQU07QUFHTixFQUFBQSwyQkFBQSxrQkFBZTtBQUdmLEVBQUFBLDJCQUFBLG1CQUFnQjtBQUdoQixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsbUJBQWdCO0FBR2hCLEVBQUFBLDJCQUFBLFVBQU87QUFHUCxFQUFBQSwyQkFBQSxhQUFVO0FBR1YsRUFBQUEsMkJBQUEsbUJBQWdCO0FBR2hCLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEsbUJBQWdCO0FBR2hCLEVBQUFBLDJCQUFBLGdCQUFhO0FBR2IsRUFBQUEsMkJBQUEsa0JBQWU7QUFHZixFQUFBQSwyQkFBQSxxQkFBa0I7QUFHbEIsRUFBQUEsMkJBQUEsU0FBTTtBQUdOLEVBQUFBLDJCQUFBLDZCQUEwQjtBQUcxQixFQUFBQSwyQkFBQSw2QkFBMEI7QUFHMUIsRUFBQUEsMkJBQUEsY0FBVztBQUdYLEVBQUFBLDJCQUFBLGVBQVk7QUFHWixFQUFBQSwyQkFBQSxlQUFZO0FBR1osRUFBQUEsMkJBQUEsY0FBVztBQUdYLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLCtCQUE0QjtBQUc1QixFQUFBQSwyQkFBQSxzREFBbUQ7QUFHbkQsRUFBQUEsMkJBQUEsY0FBVztBQUdYLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEsaUJBQWM7QUFHZCxFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLGdCQUFhO0FBR2IsRUFBQUEsMkJBQUEsYUFBVTtBQUdWLEVBQUFBLDJCQUFBLGlCQUFjO0FBR2QsRUFBQUEsMkJBQUEsU0FBTTtBQUdOLEVBQUFBLDJCQUFBLFlBQVM7QUFHVCxFQUFBQSwyQkFBQSxlQUFZO0FBR1osRUFBQUEsMkJBQUEsZUFBWTtBQUdaLEVBQUFBLDJCQUFBLGlCQUFjO0FBR2QsRUFBQUEsMkJBQUEsa0JBQWU7QUFHZixFQUFBQSwyQkFBQSx5Q0FBc0M7QUFHdEMsRUFBQUEsMkJBQUEsc0NBQW1DO0FBR25DLEVBQUFBLDJCQUFBLGlCQUFjO0FBR2QsRUFBQUEsMkJBQUEsV0FBUTtBQWxKRSxTQUFBQTtBQUFBLEdBQUE7IiwKICAibmFtZXMiOiBbIk9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMiXQp9Cg==
82
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYW4gZW51bWVyYXRpb24gb2YgY29tbW9uIGZpbGUgcGF0aHMgYW5kIHBhdHRlcm5zIHVzZWQgaW4gdGhlIE9ic2lkaWFuIGRldmVsb3BtZW50IHV0aWxpdGllcyByZXBvc2l0b3J5LlxuICogVGhlc2UgcGF0aHMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgYnVpbGQgcHJvY2VzcyBhbmQgb3RoZXIgdXRpbGl0aWVzLCBlbnN1cmluZyBjb25zaXN0ZW5jeSBhbmQgcmVkdWNpbmcgdGhlIGxpa2VsaWhvb2RcbiAqIG9mIGVycm9ycyBkdWUgdG8gaGFyZGNvZGVkIHN0cmluZ3MuXG4gKi9cblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBjb21tb24gZmlsZSBwYXRocyBhbmQgcGF0dGVybnMgdXNlZCBpbiB0aGUgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBlbnVtIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMge1xuICAvKiogQW55IGZpbGUgb3IgZm9sZGVyLiAqL1xuICBBbnkgPSAnKicsXG5cbiAgLyoqIENvbW1vbkpTIGZpbGUuICovXG4gIEFueUNqcyA9ICcqLmNqcycsXG5cbiAgLyoqIENvbW1vbkpTIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZS4gKi9cbiAgQW55RGN0cyA9ICcqLmQuY3RzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZS4gKi9cbiAgQW55RG10cyA9ICcqLmQubXRzJyxcblxuICAvKiogVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlLiAqL1xuICBBbnlEdHMgPSAnKi5kLnRzJyxcblxuICAvKiogRVNNIEphdmFTY3JpcHQgZmlsZS4gKi9cbiAgQW55TWpzID0gJyoubWpzJyxcblxuICAvKiogQW55IHBhdGggcmVjdXJzaXZlbHkuICovXG4gIEFueVBhdGggPSAnKionLFxuXG4gIC8qKiBBbnkgVHlwZVNjcmlwdCBmaWxlLiAqL1xuICBBbnlUcyA9ICcqLnRzJyxcblxuICAvKiogQXN0cm8gY29uZmlndXJhdGlvbiBmaWxlIChkb2N1bWVudGF0aW9uIHNpdGUpIGF0IHRoZSByZXBvIHJvb3QuICovXG4gIEFzdHJvQ29uZmlnVHMgPSAnYXN0cm8uY29uZmlnLnRzJyxcblxuICAvKiogQ29tbW9uSlMgZm9sZGVyLiAqL1xuICBDanMgPSAnY2pzJyxcblxuICAvKiogQ29tbW9uSlMgZmlsZSBleHRlbnNpb24uICovXG4gIENqc0V4dGVuc2lvbiA9ICcuY2pzJyxcblxuICAvKiogQ3VycmVudCBmb2xkZXIuICovXG4gIEN1cnJlbnRGb2xkZXIgPSAnLicsXG5cbiAgLyoqIERhdGF2aWV3IHR5cGVzLiAqL1xuICBEYXRhdmlld1R5cGVzID0gJ3NyYy9vYnNpZGlhbi9AdHlwZXMvZGF0YXZpZXcvKionLFxuXG4gIC8qKiBDb21tb25KUyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBEY3RzRXh0ZW5zaW9uID0gJy5kLmN0cycsXG5cbiAgLyoqIERpc3RyaWJ1dGlvbiBmb2xkZXIuICovXG4gIERpc3QgPSAnZGlzdCcsXG5cbiAgLyoqIEEgcGF0aCB0byB0aGUgYGxpYmAgZm9sZGVyIHdpdGhpbiB0aGUge0BsaW5rIERpc3R9IGZvbGRlci4gKi9cbiAgRGlzdExpYiA9ICdkaXN0L2xpYicsXG5cbiAgLyoqIEEgcGF0aCB0byB0aGUgYHRlbXBsYXRlc2AgZm9sZGVyIHdpdGhpbiB0aGUge0BsaW5rIERpc3R9IGZvbGRlciwgaG9sZGluZyB0aGUgY29uc3VtZXItZmFjaW5nIHRlbXBsYXRlcy4gKi9cbiAgRGlzdFRlbXBsYXRlcyA9ICdkaXN0L3RlbXBsYXRlcycsXG5cbiAgLyoqIFRyYW5zcGlsZWQgVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlIGV4dGVuc2lvbi4gKi9cbiAgRGpzRXh0ZW5zaW9uID0gJy5kLmpzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBleHRlbnNpb24uICovXG4gIERtdHNFeHRlbnNpb24gPSAnLmQubXRzJyxcblxuICAvKiogRG9jdW1lbnRhdGlvbiBzaXRlIGZvbGRlciAoQXN0cm8gKyBTdGFybGlnaHQgQVBJLWRvY3Mgc3ViLXByb2plY3QpLiAqL1xuICBEb2NzID0gJ2RvY3MnLFxuXG4gIC8qKiBCdWlsZCBvdXRwdXQgZm9sZGVyIG9mIHRoZSBkb2N1bWVudGF0aW9uIHNpdGUuICovXG4gIERvY3NEaXN0ID0gJ2RvY3MvZGlzdCcsXG5cbiAgLyoqIERwcmludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIERwcmludEpzb24gPSAnZHByaW50Lmpzb24nLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBEdHNFeHRlbnNpb24gPSAnLmQudHMnLFxuXG4gIC8qKiBFU00gVHlwZVNjcmlwdCBFU0xpbnQgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBFc2xpbnRDb25maWdNdHMgPSAnZXNsaW50LmNvbmZpZy5tdHMnLFxuXG4gIC8qKiBFU00gSmF2YVNjcmlwdCBmb2xkZXIuICovXG4gIEVzbSA9ICdlc20nLFxuXG4gIC8qKiBHZW5lcmF0ZWQtZHVyaW5nLWJ1aWxkIENvbW1vbkpTIGZpbGUuICovXG4gIEdlbmVyYXRlZER1cmluZ0J1aWxkQ2pzID0gJ2dlbmVyYXRlZC1kdXJpbmctYnVpbGQuY2pzJyxcblxuICAvKiogR2VuZXJhdGVkLWR1cmluZy1idWlsZCBFU00gSmF2YVNjcmlwdCBmaWxlLiAqL1xuICBHZW5lcmF0ZWREdXJpbmdCdWlsZE1qcyA9ICdnZW5lcmF0ZWQtZHVyaW5nLWJ1aWxkLm1qcycsXG5cbiAgLyoqIENvbW1vbkpTIEphdmFTY3JpcHQgaW5kZXggZmlsZS4gKi9cbiAgSW5kZXhDanMgPSAnaW5kZXguY2pzJyxcblxuICAvKiogQ29tbW9uSlMgVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlIGluZGV4IGZpbGUuICovXG4gIEluZGV4RGN0cyA9ICdpbmRleC5kLmN0cycsXG5cbiAgLyoqIEVTTSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgaW5kZXggZmlsZS4gKi9cbiAgSW5kZXhEbXRzID0gJ2luZGV4LmQubXRzJyxcblxuICAvKiogRVNNIEphdmFTY3JpcHQgaW5kZXggZmlsZS4gKi9cbiAgSW5kZXhNanMgPSAnaW5kZXgubWpzJyxcblxuICAvKiogVHlwZVNjcmlwdCBpbmRleCBmaWxlLiAqL1xuICBJbmRleFRzID0gJ2luZGV4LnRzJyxcblxuICAvKiogSmF2YVNjcmlwdCBmaWxlIGV4dGVuc2lvbi4gKi9cbiAgSnNFeHRlbnNpb24gPSAnLmpzJyxcblxuICAvKiogRVNNIE1hcmtkb3dubGludCBDTEkyIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgTWFya2Rvd25saW50Q2xpMkNvbmZpZ01qcyA9ICcubWFya2Rvd25saW50LWNsaTIubWpzJyxcblxuICAvKiogTWFya2Rvd25saW50IENMSTIgY29uZmlndXJhdGlvbiBzY2hlbWEgVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlLiAqL1xuICBNYXJrZG93bmxpbnRUeXBlc01hcmtkb3dubGludENsaTJDb25maWdTY2hlbWFEdHMgPSAnc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL21hcmtkb3dubGludC10eXBlcy9AdHlwZXMvbWFya2Rvd25saW50LWNsaTItY29uZmlnLXNjaGVtYS5kLnRzJyxcblxuICAvKiogR2VuZXJhdGVkIGZsYXQgcmUtZXhwb3J0IGJhcnJlbCBmaWxlLiAqL1xuICBNZXJnZWRUcyA9ICdfX21lcmdlZC50cycsXG5cbiAgLyoqIEVTTSBKYXZhU2NyaXB0IGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBNanNFeHRlbnNpb24gPSAnLm1qcycsXG5cbiAgLyoqIE5vZGUgbW9kdWxlcyBmb2xkZXIuICovXG4gIE5vZGVNb2R1bGVzID0gJ25vZGVfbW9kdWxlcycsXG5cbiAgLyoqIFBhY2thZ2UgSlNPTiBmaWxlLiAqL1xuICBQYWNrYWdlSnNvbiA9ICdwYWNrYWdlLmpzb24nLFxuXG4gIC8qKiBSb290IGZvbGRlci4gKi9cbiAgUm9vdEZvbGRlciA9ICcvJyxcblxuICAvKiogU2NyaXB0cyBmb2xkZXIuICovXG4gIFNjcmlwdHMgPSAnc2NyaXB0cycsXG5cbiAgLyoqIFNjcmlwdFV0aWxzIGZvbGRlci4gKi9cbiAgU2NyaXB0VXRpbHMgPSAnc2NyaXB0LXV0aWxzJyxcblxuICAvKiogU291cmNlIGZvbGRlci4gKi9cbiAgU3JjID0gJ3NyYycsXG5cbiAgLyoqIFN0eWxlcyBmb2xkZXIuICovXG4gIFN0eWxlcyA9ICdzdHlsZXMnLFxuXG4gIC8qKiBTdHlsZXMgQ1NTIGZpbGUuICovXG4gIFN0eWxlc0NzcyA9ICdzdHlsZXMuY3NzJyxcblxuICAvKiogVGVtcGxhdGVzIGZvbGRlci4gKi9cbiAgVGVtcGxhdGVzID0gJ3RlbXBsYXRlcycsXG5cbiAgLyoqIFRlc3QgaGVscGVycyBmb2xkZXIuICovXG4gIFRlc3RIZWxwZXJzID0gJ3Rlc3QtaGVscGVycycsXG5cbiAgLyoqIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBUc0NvbmZpZ0pzb24gPSAndHNjb25maWcuanNvbicsXG5cbiAgLyoqIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgdmFsaWRhdGVzIHRoZSBnZW5lcmF0ZWQgQ29tbW9uSlMgZGVjbGFyYXRpb25zLiAqL1xuICBUc0NvbmZpZ1ZhbGlkYXRlRGVjbGFyYXRpb25zQ2pzSnNvbiA9ICd0c2NvbmZpZy52YWxpZGF0ZS1kZWNsYXJhdGlvbnMtY2pzLmpzb24nLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IHZhbGlkYXRlcyB0aGUgZ2VuZXJhdGVkIEVTTSBkZWNsYXJhdGlvbnMuICovXG4gIFRzQ29uZmlnVmFsaWRhdGVEZWNsYXJhdGlvbnNKc29uID0gJ3RzY29uZmlnLnZhbGlkYXRlLWRlY2xhcmF0aW9ucy5qc29uJyxcblxuICAvKiogVHlwZVNjcmlwdCBmaWxlIGV4dGVuc2lvbi4gKi9cbiAgVHNFeHRlbnNpb24gPSAnLnRzJyxcblxuICAvKiogVHlwZXMgZm9sZGVyLiAqL1xuICBUeXBlcyA9ICdAdHlwZXMnXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdPLElBQUssNEJBQUwsa0JBQUtBLCtCQUFMO0FBRUwsRUFBQUEsMkJBQUEsU0FBTTtBQUdOLEVBQUFBLDJCQUFBLFlBQVM7QUFHVCxFQUFBQSwyQkFBQSxhQUFVO0FBR1YsRUFBQUEsMkJBQUEsYUFBVTtBQUdWLEVBQUFBLDJCQUFBLFlBQVM7QUFHVCxFQUFBQSwyQkFBQSxZQUFTO0FBR1QsRUFBQUEsMkJBQUEsYUFBVTtBQUdWLEVBQUFBLDJCQUFBLFdBQVE7QUFHUixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsU0FBTTtBQUdOLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEsbUJBQWdCO0FBR2hCLEVBQUFBLDJCQUFBLG1CQUFnQjtBQUdoQixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsVUFBTztBQUdQLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsa0JBQWU7QUFHZixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsVUFBTztBQUdQLEVBQUFBLDJCQUFBLGNBQVc7QUFHWCxFQUFBQSwyQkFBQSxnQkFBYTtBQUdiLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEscUJBQWtCO0FBR2xCLEVBQUFBLDJCQUFBLFNBQU07QUFHTixFQUFBQSwyQkFBQSw2QkFBMEI7QUFHMUIsRUFBQUEsMkJBQUEsNkJBQTBCO0FBRzFCLEVBQUFBLDJCQUFBLGNBQVc7QUFHWCxFQUFBQSwyQkFBQSxlQUFZO0FBR1osRUFBQUEsMkJBQUEsZUFBWTtBQUdaLEVBQUFBLDJCQUFBLGNBQVc7QUFHWCxFQUFBQSwyQkFBQSxhQUFVO0FBR1YsRUFBQUEsMkJBQUEsaUJBQWM7QUFHZCxFQUFBQSwyQkFBQSwrQkFBNEI7QUFHNUIsRUFBQUEsMkJBQUEsc0RBQW1EO0FBR25ELEVBQUFBLDJCQUFBLGNBQVc7QUFHWCxFQUFBQSwyQkFBQSxrQkFBZTtBQUdmLEVBQUFBLDJCQUFBLGlCQUFjO0FBR2QsRUFBQUEsMkJBQUEsaUJBQWM7QUFHZCxFQUFBQSwyQkFBQSxnQkFBYTtBQUdiLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLFNBQU07QUFHTixFQUFBQSwyQkFBQSxZQUFTO0FBR1QsRUFBQUEsMkJBQUEsZUFBWTtBQUdaLEVBQUFBLDJCQUFBLGVBQVk7QUFHWixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEseUNBQXNDO0FBR3RDLEVBQUFBLDJCQUFBLHNDQUFtQztBQUduQyxFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLFdBQVE7QUEzSkUsU0FBQUE7QUFBQSxHQUFBOyIsCiAgIm5hbWVzIjogWyJPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIl0KfQo=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "86.0.0",
3
+ "version": "86.1.0",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development.",
5
5
  "keywords": [
6
6
  "obsidian"
@@ -623,6 +623,9 @@
623
623
  "build:types": "jiti scripts/build-types.ts",
624
624
  "build:validate-declarations": "jiti scripts/build-validate-declarations.ts",
625
625
  "commit": "jiti scripts/commit.ts",
626
+ "docs:build": "jiti scripts/docs-build.ts",
627
+ "docs:dev": "jiti scripts/docs-dev.ts",
628
+ "docs:preview": "jiti scripts/docs-preview.ts",
626
629
  "find-overexposed": "jiti scripts/find-overexposed.ts",
627
630
  "find-overexposed:fix": "jiti scripts/find-overexposed-fix.ts",
628
631
  "format": "jiti scripts/format.ts",
@@ -717,30 +720,41 @@
717
720
  "svelte-preprocess": "^6.0.5",
718
721
  "type-fest": "^5.8.0",
719
722
  "typescript": "6.0.3",
720
- "typescript-eslint": "^8.63.0",
721
- "unist-util-visit": "^5.1.0"
723
+ "typescript-eslint": "^8.63.0"
722
724
  },
723
725
  "devDependencies": {
726
+ "@astrojs/check": "^0.9.9",
727
+ "@astrojs/starlight": "^0.41.3",
724
728
  "@commitlint/cli": "^21.2.1",
725
729
  "@commitlint/config-conventional": "^21.2.0",
726
730
  "@commitlint/types": "^21.2.0",
727
731
  "@jest/globals": "^30.4.1",
732
+ "@resvg/resvg-js": "^2.6.2",
728
733
  "@total-typescript/ts-reset": "^0.6.1",
729
734
  "@types/adm-zip": "^0.5.8",
730
735
  "@typescript-eslint/rule-tester": "^8.63.0",
731
736
  "@vitest/coverage-v8": "^4.1.10",
732
737
  "@vitest/runner": "^4.1.10",
738
+ "astro": "^7.0.8",
733
739
  "better-typescript-lib": "^2.12.0",
734
740
  "czg": "^1.13.1",
735
741
  "dedent": "^1.7.2",
736
742
  "eslint-plugin-n": "^18.2.2",
743
+ "gray-matter": "^4.0.3",
744
+ "hast-util-from-html": "^2.0.3",
745
+ "hastscript": "^9.0.1",
737
746
  "husky": "^9.1.7",
738
747
  "jsdom": "^29.1.1",
739
748
  "moment": "^2.30.1",
740
749
  "nano-staged": "^1.0.2",
741
750
  "obsidian-integration-testing": "^8.1.0",
742
751
  "obsidian-test-mocks": "^3.6.0",
752
+ "satori": "^0.26.0",
753
+ "starlight-package-managers": "^0.12.0",
743
754
  "ts-declaration-location": "^1.0.7",
755
+ "ts-morph": "^28.0.0",
756
+ "typedoc-plugin-mdn-links": "^5.1.1",
757
+ "unist-util-visit": "^5.1.0",
744
758
  "vitest": "^4.1.10",
745
759
  "yaml": "^2.9.0"
746
760
  },