create-pylon 1.0.4 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -3,24 +3,123 @@
3
3
 
4
4
  // src/index.ts
5
5
  import { Option, program } from "commander";
6
- import consola from "consola";
6
+ import consola2 from "consola";
7
7
  import { input, select, confirm } from "@inquirer/prompts";
8
- import path from "path";
8
+ import path2 from "path";
9
9
  import chalk from "chalk";
10
- import * as fs from "fs";
10
+ import * as fs2 from "fs";
11
11
  import * as telemetry from "@getcronit/pylon-telemetry";
12
12
  import { fileURLToPath } from "url";
13
13
  import { dirname } from "path";
14
- import { detect } from "detect-package-manager";
15
14
  import { spawnSync } from "child_process";
15
+
16
+ // src/detect-pm.ts
17
+ import * as fs from "fs";
18
+ import * as path from "path";
19
+ import process2 from "process";
20
+ import { execSync } from "child_process";
21
+ import consola from "consola";
22
+ function isCommandAvailable(command) {
23
+ try {
24
+ execSync(`${command} --version`, { stdio: "ignore" });
25
+ return true;
26
+ } catch (e) {
27
+ console.error(e);
28
+ return false;
29
+ }
30
+ }
31
+ function isBun() {
32
+ return typeof Bun !== "undefined" && isCommandAvailable("bun");
33
+ }
34
+ function isNpm() {
35
+ return process2.env.npm_execpath?.includes("npm") ?? false;
36
+ }
37
+ function isYarn() {
38
+ return process2.env.npm_execpath?.includes("yarn") ?? false;
39
+ }
40
+ function isDeno() {
41
+ return typeof Deno !== "undefined" && isCommandAvailable("deno");
42
+ }
43
+ function isPnpm() {
44
+ return process2.env.npm_execpath?.includes("pnpm") ?? false;
45
+ }
46
+ function detectByLockFiles(cwd) {
47
+ if (fs.existsSync(path.join(cwd, "bun.lockb"))) {
48
+ return "bun";
49
+ }
50
+ if (fs.existsSync(path.join(cwd, "package-lock.json"))) {
51
+ return "npm";
52
+ }
53
+ if (fs.existsSync(path.join(cwd, "yarn.lock"))) {
54
+ return "yarn";
55
+ }
56
+ if (fs.existsSync(path.join(cwd, "deno.json")) || fs.existsSync(path.join(cwd, "deno.lock"))) {
57
+ return "deno";
58
+ }
59
+ if (fs.existsSync(path.join(cwd, "pnpm-lock.yaml"))) {
60
+ return "pnpm";
61
+ }
62
+ return null;
63
+ }
64
+ function detectPackageManager({
65
+ preferredPm,
66
+ cwd = process2.cwd()
67
+ }) {
68
+ if (preferredPm && isCommandAvailable(preferredPm)) {
69
+ return preferredPm;
70
+ }
71
+ if (isBun()) {
72
+ return "bun";
73
+ }
74
+ if (isNpm()) {
75
+ return "npm";
76
+ }
77
+ if (isPnpm()) {
78
+ return "pnpm";
79
+ }
80
+ if (isDeno()) {
81
+ return "deno";
82
+ }
83
+ if (isYarn()) {
84
+ return "yarn";
85
+ }
86
+ const lockFileDetection = detectByLockFiles(cwd);
87
+ if (lockFileDetection) {
88
+ consola.info(`Detected package manager by lock file: ${lockFileDetection}`);
89
+ if (isCommandAvailable(lockFileDetection)) {
90
+ return lockFileDetection;
91
+ } else {
92
+ consola.warn(`Lock file detected, but ${lockFileDetection} is not installed.`);
93
+ }
94
+ }
95
+ return "unknown";
96
+ }
97
+ function getRunScript(pm) {
98
+ switch (pm) {
99
+ case "bun":
100
+ return "bun";
101
+ case "npm":
102
+ return "npm run";
103
+ case "yarn":
104
+ return "yarn";
105
+ case "pnpm":
106
+ return "pnpm run";
107
+ case "deno":
108
+ return "deno task";
109
+ default:
110
+ throw new Error("Unknown package manager");
111
+ }
112
+ }
113
+
114
+ // src/index.ts
16
115
  var __filename2 = fileURLToPath(import.meta.url);
17
116
  var __dirname2 = dirname(__filename2);
18
117
  var version = (() => {
19
- return JSON.parse(fs.readFileSync(path.join(__dirname2, "..", "package.json"), "utf-8")).version;
118
+ return JSON.parse(fs2.readFileSync(path2.join(__dirname2, "..", "package.json"), "utf-8")).version;
20
119
  })();
21
120
  function mkdirp(dir) {
22
121
  try {
23
- fs.mkdirSync(dir, { recursive: true });
122
+ fs2.mkdirSync(dir, { recursive: true });
24
123
  } catch (e) {
25
124
  if (e instanceof Error) {
26
125
  if ("code" in e && e.code === "EEXIST")
@@ -47,6 +146,12 @@ var runtimes = [
47
146
  name: "Cloudflare Workers",
48
147
  website: "https://workers.cloudflare.com",
49
148
  templates: ["default"]
149
+ },
150
+ {
151
+ key: "deno",
152
+ name: "Deno",
153
+ website: "https://deno.land",
154
+ templates: ["default"]
50
155
  }
51
156
  ];
52
157
  var templates = [
@@ -71,13 +176,13 @@ var injectVariablesInContent = (content, variables) => {
71
176
  var readdirFilesSyncRecursive = (dir) => {
72
177
  const run = (dir2) => {
73
178
  const result = [];
74
- const files = fs.readdirSync(dir2);
179
+ const files = fs2.readdirSync(dir2);
75
180
  files.forEach((file) => {
76
- const filePath = path.join(dir2, file);
77
- if (fs.statSync(filePath).isDirectory()) {
181
+ const filePath = path2.join(dir2, file);
182
+ if (fs2.statSync(filePath).isDirectory()) {
78
183
  result.push(...run(filePath));
79
184
  }
80
- if (fs.statSync(filePath).isFile()) {
185
+ if (fs2.statSync(filePath).isFile()) {
81
186
  result.push(filePath);
82
187
  }
83
188
  });
@@ -97,65 +202,55 @@ var createTemplate = async (options) => {
97
202
  if (!templateName) {
98
203
  throw new Error(`Invalid template: ${template}`);
99
204
  }
100
- const sharedTemplateDir = path.join(__dirname2, "..", "templates", "shared");
101
- if (!fs.existsSync(sharedTemplateDir)) {
205
+ const sharedTemplateDir = path2.join(__dirname2, "..", "templates", "shared");
206
+ if (!fs2.existsSync(sharedTemplateDir)) {
102
207
  throw new Error(`Shared templates not found: ${sharedTemplateDir}`);
103
208
  }
104
- const templateDir = path.join(__dirname2, "..", "templates", runtime, template);
105
- if (!fs.existsSync(templateDir)) {
209
+ const templateDir = path2.join(__dirname2, "..", "templates", runtime, template);
210
+ if (!fs2.existsSync(templateDir)) {
106
211
  throw new Error(`Template not found: ${templateDir}`);
107
212
  }
108
- const targetDirectoryPath = path.join(process.cwd(), target);
109
- consola.start(`Creating pylon in ${targetDirectoryPath}`);
213
+ const targetDirectoryPath = path2.join(process.cwd(), target);
214
+ consola2.start(`Creating pylon in ${targetDirectoryPath}`);
110
215
  const inject = (content) => {
111
216
  return injectVariablesInContent(content, {
112
217
  __PYLON_NAME__: options.name
113
218
  });
114
219
  };
115
220
  readdirFilesSyncRecursive(sharedTemplateDir).forEach((file) => {
116
- const source = path.join(sharedTemplateDir, file);
117
- let target2 = path.join(targetDirectoryPath, file);
118
- const targetDir = path.dirname(target2);
221
+ const source = path2.join(sharedTemplateDir, file);
222
+ let target2 = path2.join(targetDirectoryPath, file);
223
+ const targetDir = path2.dirname(target2);
119
224
  if (runtime === "cf-workers" && source.includes(".github/workflows/publish.yaml")) {
120
225
  return;
121
226
  }
122
- if (!fs.existsSync(targetDir)) {
123
- fs.mkdirSync(targetDir, { recursive: true });
227
+ if (!fs2.existsSync(targetDir)) {
228
+ fs2.mkdirSync(targetDir, { recursive: true });
124
229
  }
125
230
  if (target2.endsWith(".example")) {
126
231
  target2 = target2.replace(".example", "");
127
232
  }
128
- const injectedContent = inject(fs.readFileSync(source, "utf-8"));
129
- fs.writeFileSync(target2, injectedContent);
233
+ const injectedContent = inject(fs2.readFileSync(source, "utf-8"));
234
+ fs2.writeFileSync(target2, injectedContent);
130
235
  });
131
236
  readdirFilesSyncRecursive(templateDir).forEach((file) => {
132
- const source = path.join(templateDir, file);
133
- let target2 = path.join(targetDirectoryPath, file);
134
- const targetDir = path.dirname(target2);
135
- if (!fs.existsSync(targetDir)) {
136
- fs.mkdirSync(targetDir, { recursive: true });
237
+ const source = path2.join(templateDir, file);
238
+ let target2 = path2.join(targetDirectoryPath, file);
239
+ const targetDir = path2.dirname(target2);
240
+ if (!fs2.existsSync(targetDir)) {
241
+ fs2.mkdirSync(targetDir, { recursive: true });
137
242
  }
138
243
  if (target2.endsWith(".example")) {
139
244
  target2 = target2.replace(".example", "");
140
245
  }
141
- const injectedContent = inject(fs.readFileSync(source, "utf-8"));
142
- fs.writeFileSync(target2, injectedContent);
246
+ const injectedContent = inject(fs2.readFileSync(source, "utf-8"));
247
+ fs2.writeFileSync(target2, injectedContent);
143
248
  });
144
- consola.success(`Pylon created`);
249
+ consola2.success(`Pylon created`);
145
250
  };
146
251
  var installDependencies = async (args) => {
147
- const target = path.resolve(args.target);
148
- console.log("target", target);
149
- if (!args.packageManager) {
150
- args.packageManager = await detect({
151
- cwd: target,
152
- includeGlobalBun: true
153
- });
154
- }
155
- if (!args.packageManager) {
156
- throw new Error("No package manager found");
157
- }
158
- const { packageManager } = args;
252
+ const target = path2.resolve(args.target);
253
+ const packageManager = args.packageManager;
159
254
  let command = "";
160
255
  switch (packageManager) {
161
256
  case "yarn":
@@ -170,10 +265,13 @@ var installDependencies = async (args) => {
170
265
  case "bun":
171
266
  command = "bun install";
172
267
  break;
268
+ case "deno":
269
+ command = "deno install";
270
+ break;
173
271
  default:
174
272
  throw new Error(`Invalid package manager: ${packageManager}`);
175
273
  }
176
- consola.start(`Installing dependencies using ${packageManager}`);
274
+ consola2.start(`Installing dependencies using ${packageManager}`);
177
275
  const proc = spawnSync(command, {
178
276
  cwd: target,
179
277
  shell: true,
@@ -182,12 +280,19 @@ var installDependencies = async (args) => {
182
280
  if (proc.status !== 0) {
183
281
  throw new Error(`Failed to install dependencies`);
184
282
  }
185
- consola.success(`Dependencies installed`);
283
+ consola2.success(`Dependencies installed`);
186
284
  };
187
285
  program.name("create-pylon").version(version).arguments("[target]").addOption(new Option("-i, --install", "Install dependencies")).addOption(new Option("-r, --runtime <runtime>", "Runtime").choices(runtimes.map(({ key }) => key))).addOption(new Option("-t, --template <template>", "Template")).addOption(new Option("-pm, --package-manager <packageManager>", "Package manager")).addOption(new Option("--client", "Enable client generation (https://pylon.cronit.io/docs/integrations/gqty)")).addOption(new Option("--client-path <clientPath>", "Client path")).addOption(new Option("--client-port <clientPort>", "Client port")).action(main);
286
+ var getPreferredPmByRuntime = (runtime) => {
287
+ if (runtime === "bun") {
288
+ return "bun";
289
+ } else if (runtime === "deno") {
290
+ return "deno";
291
+ }
292
+ };
188
293
  async function main(targetDir, options, command) {
189
294
  try {
190
- consola.log(`${command.name()} version ${command.version()}`);
295
+ consola2.log(`${command.name()} version ${command.version()}`);
191
296
  const {
192
297
  install: installArg,
193
298
  runtime: runtimeArg,
@@ -200,7 +305,7 @@ async function main(targetDir, options, command) {
200
305
  let target = "";
201
306
  if (targetDir) {
202
307
  target = targetDir;
203
- consola.success(`Using target directory \u2026 ${target}`);
308
+ consola2.success(`Using target directory \u2026 ${target}`);
204
309
  } else {
205
310
  const answer = await input({
206
311
  message: "Target directory",
@@ -210,9 +315,9 @@ async function main(targetDir, options, command) {
210
315
  }
211
316
  let projectName = "";
212
317
  if (target === ".") {
213
- projectName = path.basename(process.cwd());
318
+ projectName = path2.basename(process.cwd());
214
319
  } else {
215
- projectName = path.basename(target);
320
+ projectName = path2.basename(target);
216
321
  }
217
322
  const runtimeName = runtimeArg || await select({
218
323
  message: "Which runtime would you like to use?",
@@ -240,8 +345,8 @@ async function main(targetDir, options, command) {
240
345
  if (!templateName) {
241
346
  throw new Error("No template selected");
242
347
  }
243
- if (fs.existsSync(target)) {
244
- if (fs.readdirSync(target).length > 0) {
348
+ if (fs2.existsSync(target)) {
349
+ if (fs2.readdirSync(target).length > 0) {
245
350
  const response = await confirm({
246
351
  message: "Directory not empty. Continue?",
247
352
  default: false
@@ -260,10 +365,10 @@ async function main(targetDir, options, command) {
260
365
  template: templateName,
261
366
  target
262
367
  });
263
- let packageManager = packageManagerArg;
264
- if (runtimeName === "bun" && !packageManager) {
265
- packageManager = "bun";
266
- }
368
+ const packageManager = detectPackageManager({
369
+ preferredPm: getPreferredPmByRuntime(runtime.key),
370
+ cwd: target
371
+ });
267
372
  if (install) {
268
373
  await installDependencies({ target, packageManager });
269
374
  }
@@ -282,7 +387,7 @@ async function main(targetDir, options, command) {
282
387
  });
283
388
  clientPath = await input({
284
389
  message: "Path to generate the client to",
285
- default: path.join(clientRoot, "gqty/index.ts"),
390
+ default: path2.join(clientRoot, "gqty/index.ts"),
286
391
  validate: (value) => {
287
392
  if (!value.startsWith(clientRoot === "." ? "" : clientRoot)) {
288
393
  return "Path must start with the client root";
@@ -295,23 +400,32 @@ async function main(targetDir, options, command) {
295
400
  message: "Port of the pylon server to generate the client from",
296
401
  default: "3000"
297
402
  });
298
- consola.start(`Updating pylon dev script to generate client`);
299
- const devScriptPath = path.join(target, "package.json");
300
- const devScript = JSON.parse(fs.readFileSync(devScriptPath, "utf-8"));
301
- devScript.scripts = {
302
- ...devScript.scripts,
303
- dev: devScript.scripts.dev + ` --client --client-port ${clientPort} --client-path ${clientPath}`
403
+ consola2.start(`Updating pylon dev script to generate client`);
404
+ let packagePath;
405
+ let scriptKey;
406
+ if (runtime.key === "deno") {
407
+ packagePath = path2.join(target, "deno.json");
408
+ scriptKey = "tasks";
409
+ } else {
410
+ packagePath = path2.join(target, "package.json");
411
+ scriptKey = "scripts";
412
+ }
413
+ const devScript = JSON.parse(fs2.readFileSync(packagePath, "utf-8"));
414
+ devScript[scriptKey] = {
415
+ ...devScript[scriptKey],
416
+ dev: devScript[scriptKey].dev + ` --client --client-port ${clientPort} --client-path ${clientPath}`
304
417
  };
305
- fs.writeFileSync(devScriptPath, JSON.stringify(devScript, null, 2));
306
- consola.success(`Pylon dev script updated`);
418
+ fs2.writeFileSync(packagePath, JSON.stringify(devScript, null, 2));
419
+ consola2.success(`Pylon dev script updated`);
307
420
  }
421
+ const runScript = getRunScript(packageManager);
308
422
  const message = `
309
423
  \uD83C\uDF89 ${chalk.green.bold("Pylon created successfully.")}
310
424
 
311
425
  \uD83D\uDCBB ${chalk.cyan.bold("Continue Developing")}
312
426
  ${chalk.yellow("Change directories:")} cd ${chalk.blue(target)}
313
- ${chalk.yellow("Start dev server:")} npm run start
314
- ${chalk.yellow("Deploy:")} npm run deploy
427
+ ${chalk.yellow("Start dev server:")} ${runScript} dev
428
+ ${chalk.yellow("Deploy:")} ${runScript} deploy
315
429
 
316
430
  \uD83D\uDCD6 ${chalk.cyan.bold("Explore Documentation")}
317
431
  ${chalk.underline.blue("https://pylon.cronit.io/docs")}
@@ -327,12 +441,12 @@ async function main(targetDir, options, command) {
327
441
  clientPath: clientPath || undefined,
328
442
  clientPort: parseInt(clientPort) || undefined
329
443
  });
330
- consola.box(message);
444
+ consola2.box(message);
331
445
  } catch (e) {
332
- consola.error(e);
446
+ consola2.error(e);
333
447
  }
334
448
  }
335
449
  program.parse();
336
450
 
337
- //# debugId=38EA1869FEC6A23F64756E2164756E21
338
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHtPcHRpb24sIHByb2dyYW0sIHR5cGUgQ29tbWFuZH0gZnJvbSAnY29tbWFuZGVyJ1xuaW1wb3J0IGNvbnNvbGEgZnJvbSAnY29uc29sYSdcbmltcG9ydCB7aW5wdXQsIHNlbGVjdCwgY29uZmlybX0gZnJvbSAnQGlucXVpcmVyL3Byb21wdHMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5cbmltcG9ydCAqIGFzIHRlbGVtZXRyeSBmcm9tICdAZ2V0Y3Jvbml0L3B5bG9uLXRlbGVtZXRyeSdcblxuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICd1cmwnXG5pbXBvcnQge2Rpcm5hbWV9IGZyb20gJ3BhdGgnXG5cbmNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSlcblxuY29uc3QgdmVyc2lvbiA9ICgoKSA9PiB7XG4gIHJldHVybiBKU09OLnBhcnNlKFxuICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAncGFja2FnZS5qc29uJyksICd1dGYtOCcpXG4gICkudmVyc2lvbiBhcyBzdHJpbmdcbn0pKClcblxuZnVuY3Rpb24gbWtkaXJwKGRpcjogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgZnMubWtkaXJTeW5jKGRpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoJ2NvZGUnIGluIGUgJiYgZS5jb2RlID09PSAnRUVYSVNUJykgcmV0dXJuXG4gICAgfVxuICAgIHRocm93IGVcbiAgfVxufVxuXG5jb25zdCBydW50aW1lczoge1xuICBrZXk6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgd2Vic2l0ZTogc3RyaW5nXG4gIHRlbXBsYXRlcz86IHN0cmluZ1tdXG59W10gPSBbXG4gIHtcbiAgICBrZXk6ICdidW4nLFxuICAgIG5hbWU6ICdCdW4uanMnLFxuICAgIHdlYnNpdGU6ICdodHRwczovL2J1bmpzLmRldicsXG4gICAgdGVtcGxhdGVzOiBbJ2RlZmF1bHQnXVxuICB9LFxuICB7XG4gICAga2V5OiAnbm9kZScsXG4gICAgbmFtZTogJ05vZGUuanMnLFxuICAgIHdlYnNpdGU6ICdodHRwczovL25vZGVqcy5vcmcnLFxuICAgIHRlbXBsYXRlczogWydkZWZhdWx0J11cbiAgfSxcbiAge1xuICAgIGtleTogJ2NmLXdvcmtlcnMnLFxuICAgIG5hbWU6ICdDbG91ZGZsYXJlIFdvcmtlcnMnLFxuICAgIHdlYnNpdGU6ICdodHRwczovL3dvcmtlcnMuY2xvdWRmbGFyZS5jb20nLFxuICAgIHRlbXBsYXRlczogWydkZWZhdWx0J11cbiAgfVxuXVxuXG5jb25zdCB0ZW1wbGF0ZXM6IHtcbiAga2V5OiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbn1bXSA9IFtcbiAge1xuICAgIGtleTogJ2RlZmF1bHQnLFxuICAgIG5hbWU6ICdEZWZhdWx0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmF1bHQgdGVtcGxhdGUnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkYXRhYmFzZScsXG4gICAgbmFtZTogJ0RhdGFiYXNlIChQcmlzbWEpJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RlbXBsYXRlIHdpdGggUHJpc21hIE9STSdcbiAgfVxuXVxuXG5jb25zdCBpbmplY3RWYXJpYWJsZXNJbkNvbnRlbnQgPSAoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pID0+IHtcbiAgbGV0IHJlc3VsdCA9IGNvbnRlbnRcblxuICBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlQWxsKGtleSwgdmFsdWUpXG4gIH0pXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuY29uc3QgcmVhZGRpckZpbGVzU3luY1JlY3Vyc2l2ZSA9IChkaXI6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgcnVuID0gKGRpcjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXVxuXG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG5cbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlKVxuXG4gICAgICBpZiAoZnMuc3RhdFN5bmMoZmlsZVBhdGgpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4ucnVuKGZpbGVQYXRoKSlcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBhZGQgZmlsZXNcbiAgICAgIGlmIChmcy5zdGF0U3luYyhmaWxlUGF0aCkuaXNGaWxlKCkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHJldHVybiBydW4oZGlyKS5tYXAoZmlsZSA9PiB7XG4gICAgcmV0dXJuIGZpbGUucmVwbGFjZShkaXIsICcuJylcbiAgfSlcbn1cblxuY29uc3QgY3JlYXRlVGVtcGxhdGUgPSBhc3luYyAob3B0aW9uczoge1xuICBuYW1lOiBzdHJpbmdcbiAgcnVudGltZTogc3RyaW5nXG4gIHRlbXBsYXRlOiBzdHJpbmdcbiAgdGFyZ2V0OiBzdHJpbmdcbn0pID0+IHtcbiAgY29uc3Qge3J1bnRpbWUsIHRlbXBsYXRlLCB0YXJnZXR9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IHJ1bnRpbWVOYW1lID0gcnVudGltZXMuZmluZCgoe2tleX0pID0+IGtleSA9PT0gcnVudGltZSk/Lm5hbWVcbiAgY29uc3QgdGVtcGxhdGVOYW1lID0gdGVtcGxhdGVzLmZpbmQoKHtrZXl9KSA9PiBrZXkgPT09IHRlbXBsYXRlKT8ubmFtZVxuXG4gIGlmICghcnVudGltZU5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcnVudGltZTogJHtydW50aW1lfWApXG4gIH1cblxuICBpZiAoIXRlbXBsYXRlTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZTogJHt0ZW1wbGF0ZX1gKVxuICB9XG5cbiAgLy8gVGhlIHRlbXBsYXRlcyBhcmUgc3RvcmVkIGluIHRoZSBgdGVtcGxhdGVzYCBkaXJlY3RvcnlcbiAgY29uc3Qgc2hhcmVkVGVtcGxhdGVEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAndGVtcGxhdGVzJywgJ3NoYXJlZCcpXG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNoYXJlZFRlbXBsYXRlRGlyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2hhcmVkIHRlbXBsYXRlcyBub3QgZm91bmQ6ICR7c2hhcmVkVGVtcGxhdGVEaXJ9YClcbiAgfVxuXG4gIGNvbnN0IHRlbXBsYXRlRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ3RlbXBsYXRlcycsIHJ1bnRpbWUsIHRlbXBsYXRlKVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZURpcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRlbXBsYXRlIG5vdCBmb3VuZDogJHt0ZW1wbGF0ZURpcn1gKVxuICB9XG5cbiAgLy8gVGhlIHRhcmdldCBkaXJlY3RvcnkgaXMgYWxyZWFkeSBjcmVhdGVkXG4gIGNvbnN0IHRhcmdldERpcmVjdG9yeVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgdGFyZ2V0KVxuXG4gIGNvbnNvbGEuc3RhcnQoYENyZWF0aW5nIHB5bG9uIGluICR7dGFyZ2V0RGlyZWN0b3J5UGF0aH1gKVxuXG4gIGNvbnN0IGluamVjdCA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gaW5qZWN0VmFyaWFibGVzSW5Db250ZW50KGNvbnRlbnQsIHtcbiAgICAgIF9fUFlMT05fTkFNRV9fOiBvcHRpb25zLm5hbWVcbiAgICB9KVxuICB9XG5cbiAgLy8gQ29weSB0aGUgc2hhcmVkIHRlbXBsYXRlIGZpbGVzXG4gIHJlYWRkaXJGaWxlc1N5bmNSZWN1cnNpdmUoc2hhcmVkVGVtcGxhdGVEaXIpLmZvckVhY2goZmlsZSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gcGF0aC5qb2luKHNoYXJlZFRlbXBsYXRlRGlyLCBmaWxlKVxuICAgIGxldCB0YXJnZXQgPSBwYXRoLmpvaW4odGFyZ2V0RGlyZWN0b3J5UGF0aCwgZmlsZSlcblxuICAgIC8vIENyZWF0ZSBmb2xkZXIgcmVjdXJzaXZlbHkgYW5kIGNvcHkgZmlsZVxuXG4gICAgY29uc3QgdGFyZ2V0RGlyID0gcGF0aC5kaXJuYW1lKHRhcmdldClcblxuICAgIC8vIFNraXAgdGhlIC5naXRodWIvd29ya2Zsb3dzIGRpcmVjdG9yeSBmb3IgY2Ytd29ya2VycyBydW50aW1lXG4gICAgaWYgKFxuICAgICAgcnVudGltZSA9PT0gJ2NmLXdvcmtlcnMnICYmXG4gICAgICBzb3VyY2UuaW5jbHVkZXMoJy5naXRodWIvd29ya2Zsb3dzL3B1Ymxpc2gueWFtbCcpXG4gICAgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0RGlyKSkge1xuICAgICAgZnMubWtkaXJTeW5jKHRhcmdldERpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHRhcmdldCBlbmRzIHdpdGggYC5leGFtcGxlYCwgcmVtb3ZlIHRoZSBzdWZmaXguXG4gICAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIGAuZ2l0aWdub3JlLmV4YW1wbGVgIGZpbGVzIGJlY2F1c2UgdGhleSBhcmUgbm90IHB1Ymxpc2hlZCBpblxuICAgIC8vIHRoZSBgY3JlYXRlLXB5bG9uYCBwYWNrYWdlIHdoZW4gbmFtZWQgYC5naXRpZ25vcmVgLlxuICAgIGlmICh0YXJnZXQuZW5kc1dpdGgoJy5leGFtcGxlJykpIHtcbiAgICAgIHRhcmdldCA9IHRhcmdldC5yZXBsYWNlKCcuZXhhbXBsZScsICcnKVxuICAgIH1cblxuICAgIGNvbnN0IGluamVjdGVkQ29udGVudCA9IGluamVjdChmcy5yZWFkRmlsZVN5bmMoc291cmNlLCAndXRmLTgnKSlcblxuICAgIGZzLndyaXRlRmlsZVN5bmModGFyZ2V0LCBpbmplY3RlZENvbnRlbnQpXG4gIH0pXG5cbiAgLy8gQ29weSB0aGUgcnVudGltZSBzcGVjaWZpYyB0ZW1wbGF0ZSBmaWxlc1xuICByZWFkZGlyRmlsZXNTeW5jUmVjdXJzaXZlKHRlbXBsYXRlRGlyKS5mb3JFYWNoKGZpbGUgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbih0ZW1wbGF0ZURpciwgZmlsZSlcbiAgICBsZXQgdGFyZ2V0ID0gcGF0aC5qb2luKHRhcmdldERpcmVjdG9yeVBhdGgsIGZpbGUpXG5cbiAgICAvLyBDcmVhdGUgZm9sZGVyIHJlY3Vyc2l2ZWx5IGFuZCBjb3B5IGZpbGVcbiAgICBjb25zdCB0YXJnZXREaXIgPSBwYXRoLmRpcm5hbWUodGFyZ2V0KVxuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldERpcikpIHtcbiAgICAgIGZzLm1rZGlyU3luYyh0YXJnZXREaXIsIHtyZWN1cnNpdmU6IHRydWV9KVxuICAgIH1cblxuICAgIC8vIElmIHRoZSB0YXJnZXQgZW5kcyB3aXRoIGAuZXhhbXBsZWAsIHJlbW92ZSB0aGUgc3VmZml4LlxuICAgIC8vIFRoaXMgaXMgdXNlZnVsIGZvciBgLmdpdGlnbm9yZS5leGFtcGxlYCBmaWxlcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBwdWJsaXNoZWQgaW5cbiAgICAvLyB0aGUgYGNyZWF0ZS1weWxvbmAgcGFja2FnZSB3aGVuIG5hbWVkIGAuZ2l0aWdub3JlYC5cbiAgICBpZiAodGFyZ2V0LmVuZHNXaXRoKCcuZXhhbXBsZScpKSB7XG4gICAgICB0YXJnZXQgPSB0YXJnZXQucmVwbGFjZSgnLmV4YW1wbGUnLCAnJylcbiAgICB9XG5cbiAgICBjb25zdCBpbmplY3RlZENvbnRlbnQgPSBpbmplY3QoZnMucmVhZEZpbGVTeW5jKHNvdXJjZSwgJ3V0Zi04JykpXG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKHRhcmdldCwgaW5qZWN0ZWRDb250ZW50KVxuICB9KVxuXG4gIGNvbnNvbGEuc3VjY2VzcyhgUHlsb24gY3JlYXRlZGApXG59XG5cbmltcG9ydCB7ZGV0ZWN0fSBmcm9tICdkZXRlY3QtcGFja2FnZS1tYW5hZ2VyJ1xuaW1wb3J0IHtzcGF3blN5bmN9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnXG5cbmNvbnN0IGluc3RhbGxEZXBlbmRlbmNpZXMgPSBhc3luYyAoYXJnczoge1xuICB0YXJnZXQ6IHN0cmluZ1xuICBwYWNrYWdlTWFuYWdlcj86IHN0cmluZ1xufSkgPT4ge1xuICBjb25zdCB0YXJnZXQgPSBwYXRoLnJlc29sdmUoYXJncy50YXJnZXQpXG5cbiAgY29uc29sZS5sb2coJ3RhcmdldCcsIHRhcmdldClcblxuICBpZiAoIWFyZ3MucGFja2FnZU1hbmFnZXIpIHtcbiAgICBhcmdzLnBhY2thZ2VNYW5hZ2VyID0gYXdhaXQgZGV0ZWN0KHtcbiAgICAgIGN3ZDogdGFyZ2V0LFxuICAgICAgaW5jbHVkZUdsb2JhbEJ1bjogdHJ1ZVxuICAgIH0pXG4gIH1cblxuICBpZiAoIWFyZ3MucGFja2FnZU1hbmFnZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHBhY2thZ2UgbWFuYWdlciBmb3VuZCcpXG4gIH1cblxuICAvLyB5YXJuJywgJ25wbScsIG9yICdwbnBtJywgJ2J1bidcbiAgY29uc3Qge3BhY2thZ2VNYW5hZ2VyfSA9IGFyZ3NcblxuICBsZXQgY29tbWFuZCA9ICcnXG5cbiAgc3dpdGNoIChwYWNrYWdlTWFuYWdlcikge1xuICAgIGNhc2UgJ3lhcm4nOlxuICAgICAgY29tbWFuZCA9ICd5YXJuJ1xuICAgICAgYnJlYWtcbiAgICBjYXNlICducG0nOlxuICAgICAgY29tbWFuZCA9ICducG0gaW5zdGFsbCdcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAncG5wbSc6XG4gICAgICBjb21tYW5kID0gJ3BucG0gaW5zdGFsbCdcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnYnVuJzpcbiAgICAgIGNvbW1hbmQgPSAnYnVuIGluc3RhbGwnXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2FnZSBtYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfWApXG4gIH1cblxuICBjb25zb2xhLnN0YXJ0KGBJbnN0YWxsaW5nIGRlcGVuZGVuY2llcyB1c2luZyAke3BhY2thZ2VNYW5hZ2VyfWApXG5cbiAgY29uc3QgcHJvYyA9IHNwYXduU3luYyhjb21tYW5kLCB7XG4gICAgY3dkOiB0YXJnZXQsXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0J1xuICB9KVxuXG4gIGlmIChwcm9jLnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzYClcbiAgfVxuXG4gIGNvbnNvbGEuc3VjY2VzcyhgRGVwZW5kZW5jaWVzIGluc3RhbGxlZGApXG59XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2NyZWF0ZS1weWxvbicpXG4gIC52ZXJzaW9uKHZlcnNpb24pXG4gIC5hcmd1bWVudHMoJ1t0YXJnZXRdJylcbiAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctaSwgLS1pbnN0YWxsJywgJ0luc3RhbGwgZGVwZW5kZW5jaWVzJykpXG4gIC5hZGRPcHRpb24oXG4gICAgbmV3IE9wdGlvbignLXIsIC0tcnVudGltZSA8cnVudGltZT4nLCAnUnVudGltZScpLmNob2ljZXMoXG4gICAgICBydW50aW1lcy5tYXAoKHtrZXl9KSA9PiBrZXkpXG4gICAgKVxuICApXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXQsIC0tdGVtcGxhdGUgPHRlbXBsYXRlPicsICdUZW1wbGF0ZScpKVxuICAuYWRkT3B0aW9uKFxuICAgIG5ldyBPcHRpb24oJy1wbSwgLS1wYWNrYWdlLW1hbmFnZXIgPHBhY2thZ2VNYW5hZ2VyPicsICdQYWNrYWdlIG1hbmFnZXInKVxuICApXG4gIC5hZGRPcHRpb24oXG4gICAgbmV3IE9wdGlvbihcbiAgICAgICctLWNsaWVudCcsXG4gICAgICAnRW5hYmxlIGNsaWVudCBnZW5lcmF0aW9uIChodHRwczovL3B5bG9uLmNyb25pdC5pby9kb2NzL2ludGVncmF0aW9ucy9ncXR5KSdcbiAgICApXG4gIClcbiAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWNsaWVudC1wYXRoIDxjbGllbnRQYXRoPicsICdDbGllbnQgcGF0aCcpKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tY2xpZW50LXBvcnQgPGNsaWVudFBvcnQ+JywgJ0NsaWVudCBwb3J0JykpXG4gIC5hY3Rpb24obWFpbilcblxudHlwZSBBcmdPcHRpb25zID0ge1xuICBpbnN0YWxsOiBib29sZWFuXG4gIHJ1bnRpbWU6IHN0cmluZ1xuICB0ZW1wbGF0ZTogc3RyaW5nXG4gIHBhY2thZ2VNYW5hZ2VyPzogc3RyaW5nXG4gIGNsaWVudD86IGJvb2xlYW5cbiAgY2xpZW50UGF0aD86IHN0cmluZ1xuICBjbGllbnRQb3J0Pzogc3RyaW5nXG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oXG4gIHRhcmdldERpcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBBcmdPcHRpb25zLFxuICBjb21tYW5kOiBDb21tYW5kXG4pIHtcbiAgdHJ5IHtcbiAgICBjb25zb2xhLmxvZyhgJHtjb21tYW5kLm5hbWUoKX0gdmVyc2lvbiAke2NvbW1hbmQudmVyc2lvbigpfWApXG5cbiAgICBjb25zdCB7XG4gICAgICBpbnN0YWxsOiBpbnN0YWxsQXJnLFxuICAgICAgcnVudGltZTogcnVudGltZUFyZyxcbiAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZUFyZyxcbiAgICAgIHBhY2thZ2VNYW5hZ2VyOiBwYWNrYWdlTWFuYWdlckFyZyxcbiAgICAgIGNsaWVudDogY2xpZW50QXJnLFxuICAgICAgY2xpZW50UGF0aDogY2xpZW50UGF0aEFyZyxcbiAgICAgIGNsaWVudFBvcnQ6IGNsaWVudFBvcnRBcmdcbiAgICB9ID0gb3B0aW9uc1xuXG4gICAgbGV0IHRhcmdldCA9ICcnXG5cbiAgICBpZiAodGFyZ2V0RGlyKSB7XG4gICAgICB0YXJnZXQgPSB0YXJnZXREaXJcblxuICAgICAgY29uc29sYS5zdWNjZXNzKGBVc2luZyB0YXJnZXQgZGlyZWN0b3J5IOKApiAke3RhcmdldH1gKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBpbnB1dCh7XG4gICAgICAgIG1lc3NhZ2U6ICdUYXJnZXQgZGlyZWN0b3J5JyxcbiAgICAgICAgZGVmYXVsdDogJ215LXB5bG9uJ1xuICAgICAgfSlcbiAgICAgIHRhcmdldCA9IGFuc3dlclxuICAgIH1cblxuICAgIGxldCBwcm9qZWN0TmFtZSA9ICcnXG5cbiAgICBpZiAodGFyZ2V0ID09PSAnLicpIHtcbiAgICAgIHByb2plY3ROYW1lID0gcGF0aC5iYXNlbmFtZShwcm9jZXNzLmN3ZCgpKVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9qZWN0TmFtZSA9IHBhdGguYmFzZW5hbWUodGFyZ2V0KVxuICAgIH1cblxuICAgIGNvbnN0IHJ1bnRpbWVOYW1lID1cbiAgICAgIHJ1bnRpbWVBcmcgfHxcbiAgICAgIChhd2FpdCBzZWxlY3Qoe1xuICAgICAgICBtZXNzYWdlOiAnV2hpY2ggcnVudGltZSB3b3VsZCB5b3UgbGlrZSB0byB1c2U/JyxcbiAgICAgICAgY2hvaWNlczogcnVudGltZXMubWFwKHJ1bnRpbWUgPT4gKHtcbiAgICAgICAgICBuYW1lOiBgJHtydW50aW1lLm5hbWV9ICgke3J1bnRpbWUud2Vic2l0ZX0pYCxcbiAgICAgICAgICB2YWx1ZTogcnVudGltZS5rZXlcbiAgICAgICAgfSkpLFxuICAgICAgICBkZWZhdWx0OiAwXG4gICAgICB9KSlcblxuICAgIGlmICghcnVudGltZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcnVudGltZSBzZWxlY3RlZCcpXG4gICAgfVxuXG4gICAgY29uc3QgcnVudGltZSA9IHJ1bnRpbWVzLmZpbmQoKHtrZXl9KSA9PiBrZXkgPT09IHJ1bnRpbWVOYW1lKVxuXG4gICAgaWYgKCFydW50aW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcnVudGltZSBzZWxlY3RlZDogJHtydW50aW1lTmFtZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9XG4gICAgICB0ZW1wbGF0ZUFyZyB8fFxuICAgICAgKGF3YWl0IHNlbGVjdCh7XG4gICAgICAgIG1lc3NhZ2U6ICdXaGljaCB0ZW1wbGF0ZSB3b3VsZCB5b3UgbGlrZSB0byB1c2U/JyxcbiAgICAgICAgY2hvaWNlczogdGVtcGxhdGVzXG4gICAgICAgICAgLmZpbHRlcih0ZW1wbGF0ZSA9PiBydW50aW1lLnRlbXBsYXRlcz8uaW5jbHVkZXModGVtcGxhdGUua2V5KSlcbiAgICAgICAgICAubWFwKHRlbXBsYXRlID0+ICh7XG4gICAgICAgICAgICBuYW1lOiB0ZW1wbGF0ZS5uYW1lLFxuICAgICAgICAgICAgdmFsdWU6IHRlbXBsYXRlLmtleVxuICAgICAgICAgIH0pKSxcbiAgICAgICAgZGVmYXVsdDogMFxuICAgICAgfSkpXG5cbiAgICBpZiAoIXRlbXBsYXRlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB0ZW1wbGF0ZSBzZWxlY3RlZCcpXG4gICAgfVxuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGFyZ2V0KSkge1xuICAgICAgaWYgKGZzLnJlYWRkaXJTeW5jKHRhcmdldCkubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgICAgIG1lc3NhZ2U6ICdEaXJlY3Rvcnkgbm90IGVtcHR5LiBDb250aW51ZT8nLFxuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBta2RpcnAodGFyZ2V0KVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbGwgPVxuICAgICAgaW5zdGFsbEFyZyB8fFxuICAgICAgKGF3YWl0IGNvbmZpcm0oe21lc3NhZ2U6ICdXb3VsZCB5b3UgbGlrZSB0byBpbnN0YWxsIGRlcGVuZGVuY2llcz8nfSkpXG5cbiAgICBhd2FpdCBjcmVhdGVUZW1wbGF0ZSh7XG4gICAgICBuYW1lOiBwcm9qZWN0TmFtZSxcbiAgICAgIHJ1bnRpbWU6IHJ1bnRpbWVOYW1lLFxuICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlTmFtZSxcbiAgICAgIHRhcmdldFxuICAgIH0pXG5cbiAgICBsZXQgcGFja2FnZU1hbmFnZXIgPSBwYWNrYWdlTWFuYWdlckFyZ1xuXG4gICAgaWYgKHJ1bnRpbWVOYW1lID09PSAnYnVuJyAmJiAhcGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIHBhY2thZ2VNYW5hZ2VyID0gJ2J1bidcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFsbCkge1xuICAgICAgYXdhaXQgaW5zdGFsbERlcGVuZGVuY2llcyh7dGFyZ2V0LCBwYWNrYWdlTWFuYWdlcn0pXG4gICAgfVxuXG4gICAgY29uc3QgY2xpZW50ID1cbiAgICAgIGNsaWVudEFyZyB8fFxuICAgICAgKGF3YWl0IGNvbmZpcm0oe1xuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICdXb3VsZCB5b3UgbGlrZSB0byBlbmFibGUgY2xpZW50IGdlbmVyYXRpb24/IChodHRwczovL3B5bG9uLmNyb25pdC5pby9kb2NzL2ludGVncmF0aW9ucy9ncXR5KScsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICB9KSlcblxuICAgIGxldCBjbGllbnRSb290OiBzdHJpbmcgPSAnJ1xuICAgIGxldCBjbGllbnRQYXRoOiBzdHJpbmcgPSAnJ1xuICAgIGxldCBjbGllbnRQb3J0OiBzdHJpbmcgPSAnJ1xuXG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgaWYgKCFjbGllbnRQYXRoQXJnKSB7XG4gICAgICAgIGNsaWVudFJvb3QgPSBhd2FpdCBpbnB1dCh7XG4gICAgICAgICAgbWVzc2FnZTogJ1BhdGggdG8gdGhlIHJvb3Qgd2hlcmUgdGhlIGNsaWVudCBzaG91bGQgYmUgZ2VuZXJhdGVkJyxcbiAgICAgICAgICBkZWZhdWx0OiAnLidcbiAgICAgICAgfSlcblxuICAgICAgICBjbGllbnRQYXRoID0gYXdhaXQgaW5wdXQoe1xuICAgICAgICAgIG1lc3NhZ2U6ICdQYXRoIHRvIGdlbmVyYXRlIHRoZSBjbGllbnQgdG8nLFxuICAgICAgICAgIGRlZmF1bHQ6IHBhdGguam9pbihjbGllbnRSb290LCAnZ3F0eS9pbmRleC50cycpLFxuICAgICAgICAgIHZhbGlkYXRlOiB2YWx1ZSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGF0aCBzdGFydHMgd2l0aCB0aGUgY2xpZW50IHJvb3QgKHRha2UgY2FyZSBvZiAuKVxuICAgICAgICAgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKGNsaWVudFJvb3QgPT09ICcuJyA/ICcnIDogY2xpZW50Um9vdCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICdQYXRoIG11c3Qgc3RhcnQgd2l0aCB0aGUgY2xpZW50IHJvb3QnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjbGllbnRQb3J0ID1cbiAgICAgICAgY2xpZW50UG9ydEFyZyB8fFxuICAgICAgICAoYXdhaXQgaW5wdXQoe1xuICAgICAgICAgIG1lc3NhZ2U6ICdQb3J0IG9mIHRoZSBweWxvbiBzZXJ2ZXIgdG8gZ2VuZXJhdGUgdGhlIGNsaWVudCBmcm9tJyxcbiAgICAgICAgICBkZWZhdWx0OiAnMzAwMCdcbiAgICAgICAgfSkpXG5cbiAgICAgIGNvbnNvbGEuc3RhcnQoYFVwZGF0aW5nIHB5bG9uIGRldiBzY3JpcHQgdG8gZ2VuZXJhdGUgY2xpZW50YClcblxuICAgICAgY29uc3QgZGV2U2NyaXB0UGF0aCA9IHBhdGguam9pbih0YXJnZXQsICdwYWNrYWdlLmpzb24nKVxuXG4gICAgICBjb25zdCBkZXZTY3JpcHQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhkZXZTY3JpcHRQYXRoLCAndXRmLTgnKSlcblxuICAgICAgZGV2U2NyaXB0LnNjcmlwdHMgPSB7XG4gICAgICAgIC4uLmRldlNjcmlwdC5zY3JpcHRzLFxuICAgICAgICBkZXY6XG4gICAgICAgICAgZGV2U2NyaXB0LnNjcmlwdHMuZGV2ICtcbiAgICAgICAgICBgIC0tY2xpZW50IC0tY2xpZW50LXBvcnQgJHtjbGllbnRQb3J0fSAtLWNsaWVudC1wYXRoICR7Y2xpZW50UGF0aH1gXG4gICAgICB9XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZGV2U2NyaXB0UGF0aCwgSlNPTi5zdHJpbmdpZnkoZGV2U2NyaXB0LCBudWxsLCAyKSlcblxuICAgICAgY29uc29sYS5zdWNjZXNzKGBQeWxvbiBkZXYgc2NyaXB0IHVwZGF0ZWRgKVxuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgXG7wn46JICR7Y2hhbGsuZ3JlZW4uYm9sZCgnUHlsb24gY3JlYXRlZCBzdWNjZXNzZnVsbHkuJyl9XG5cbvCfkrsgJHtjaGFsay5jeWFuLmJvbGQoJ0NvbnRpbnVlIERldmVsb3BpbmcnKX1cbiAgICAke2NoYWxrLnllbGxvdygnQ2hhbmdlIGRpcmVjdG9yaWVzOicpfSBjZCAke2NoYWxrLmJsdWUodGFyZ2V0KX1cbiAgICAke2NoYWxrLnllbGxvdygnU3RhcnQgZGV2IHNlcnZlcjonKX0gbnBtIHJ1biBzdGFydFxuICAgICR7Y2hhbGsueWVsbG93KCdEZXBsb3k6Jyl9IG5wbSBydW4gZGVwbG95XG5cbvCfk5YgJHtjaGFsay5jeWFuLmJvbGQoJ0V4cGxvcmUgRG9jdW1lbnRhdGlvbicpfVxuICAgICR7Y2hhbGsudW5kZXJsaW5lLmJsdWUoJ2h0dHBzOi8vcHlsb24uY3Jvbml0LmlvL2RvY3MnKX1cblxu8J+SrCAke2NoYWxrLmN5YW4uYm9sZCgnSm9pbiBvdXIgQ29tbXVuaXR5Jyl9XG4gICAgJHtjaGFsay51bmRlcmxpbmUuYmx1ZSgnaHR0cHM6Ly9kaXNjb3JkLmdnL2NiSmprVnJuSGUnKX1cbmBcblxuICAgIGF3YWl0IHRlbGVtZXRyeS5zZW5kQ3JlYXRlRXZlbnQoe1xuICAgICAgbmFtZTogcHJvamVjdE5hbWUsXG4gICAgICBweWxvbkNyZWF0ZVZlcnNpb246IHZlcnNpb24sXG4gICAgICBydW50aW1lOiBydW50aW1lTmFtZSxcbiAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZU5hbWUsXG4gICAgICBjbGllbnRQYXRoOiBjbGllbnRQYXRoIHx8IHVuZGVmaW5lZCxcbiAgICAgIGNsaWVudFBvcnQ6IHBhcnNlSW50KGNsaWVudFBvcnQpIHx8IHVuZGVmaW5lZFxuICAgIH0pXG5cbiAgICBjb25zb2xhLmJveChtZXNzYWdlKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sYS5lcnJvcihlKVxuICB9XG59XG5cbnByb2dyYW0ucGFyc2UoKVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQStNQTtBQUNBO0FBOU1BLElBQU0sY0FBYSxjQUFjLFlBQVksR0FBRztBQUNoRCxJQUFNLGFBQVksUUFBUSxXQUFVO0FBRXBDLElBQU0sV0FBVyxNQUFNO0FBQ3JCLFNBQU8sS0FBSyxNQUNQLGdCQUFhLEtBQUssS0FBSyxZQUFXLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FDckUsRUFBRTtBQUFBLEdBQ0Q7QUFFSCxTQUFT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SUFDWCxDQUFDO0FBRUgsUUFBSSxhQUFxQjtBQUN6QixRQUFJLGFBQXFCO0FBQ3pCLFFBQUksYUFBcUI7QUFFekIsUUFBSSxRQUFRO0FBQ1YsV0FBSyxlQUFlO0FBQ2xCLHFCQUFhLE1BQU0sTUFBTTtBQUFBLFVBQ3ZCLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxRQUNYLENBQUM7QUFFRCxxQkFBYSxNQUFNLE1BQU07QUFBQSxVQUN2QixTQUFTO0FBQUEsVUFDVCxTQUFTLEtBQUssS0FBSyxZQUFZLGVBQWU7QUFBQSxVQUM5QyxVQUFVLFdBQVM7QUFFakIsaUJBQUssTUFBTSxXQUFXLGVBQWUsTUFBTSxLQUFLLFVBQVUsR0FBRztBQUMzRCxxQkFBTztBQUFBLFlBQ1Q7QUFFQSxtQkFBTztBQUFBO0FBQUEsUUFFWCxDQUFDO0FBQUEsTUFDSDtBQUVBLG1CQUNFLGlCQUNDLE1BQU0sTUFBTTtBQUFBLFFBQ1gsU0FBUztBQUFBLFFBQ1QsU0FBUztBQUFBLE1BQ1gsQ0FBQztBQUVILGNBQVEsTUFBTSw4Q0FBOEM7QUFFNUQsWUFBTSxnQkFBZ0IsS0FBSyxLQUFLLFFBQVEsY0FBYztBQUV0RCxZQUFNLFlBQVksS0FBSyxNQUFTLGdCQUFhLGVBQWUsT0FBTyxDQUFDO0FBRXBFLGdCQUFVLFVBQVU7QUFBQSxXQUNmLFVBQVU7QUFBQSxRQUNiLEtBQ0UsVUFBVSxRQUFRLE1BQ2xCLDJCQUEyQiw0QkFBNEI7QUFBQSxNQUMzRDtBQUVBLE1BQUcsaUJBQWMsZUFBZSxLQUFLLFVBQVUsV0FBVyxNQUFNLENBQUMsQ0FBQztBQUVsRSxjQUFRLFFBQVEsMEJBQTBCO0FBQUEsSUFDNUM7QUFFQSxVQUFNLFVBQVU7QUFBQSxlQUNoQixNQUFNLE1BQU0sS0FBSyw2QkFBNkI7QUFBQTtBQUFBLGVBRTlDLE1BQU0sS0FBSyxLQUFLLHFCQUFxQjtBQUFBLE1BQ25DLE1BQU0sT0FBTyxxQkFBcUIsUUFBUSxNQUFNLEtBQUssTUFBTTtBQUFBLE1BQzNELE1BQU0sT0FBTyxtQkFBbUI7QUFBQSxNQUNoQyxNQUFNLE9BQU8sU0FBUztBQUFBO0FBQUEsZUFFeEIsTUFBTSxLQUFLLEtBQUssdUJBQXVCO0FBQUEsTUFDckMsTUFBTSxVQUFVLEtBQUssOEJBQThCO0FBQUE7QUFBQSxlQUVyRCxNQUFNLEtBQUssS0FBSyxvQkFBb0I7QUFBQSxNQUNsQyxNQUFNLFVBQVUsS0FBSywrQkFBK0I7QUFBQTtBQUd0RCxVQUFnQiwwQkFBZ0I7QUFBQSxNQUM5QixNQUFNO0FBQUEsTUFDTixvQkFBb0I7QUFBQSxNQUNwQixTQUFTO0FBQUEsTUFDVCxVQUFVO0FBQUEsTUFDVixZQUFZLGNBQWM7QUFBQSxNQUMxQixZQUFZLFNBQVMsVUFBVSxLQUFLO0FBQUEsSUFDdEMsQ0FBQztBQUVELFlBQVEsSUFBSSxPQUFPO0FBQUEsV0FDWixHQUFQO0FBQ0EsWUFBUSxNQUFNLENBQUM7QUFBQTtBQUFBO0FBSW5CLFFBQVEsTUFBTTsiLAogICJkZWJ1Z0lkIjogIjM4RUExODY5RkVDNkEyM0Y2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
451
+ //# debugId=49FD4AB53F50782964756E2164756E21
452
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9kZXRlY3QtcG0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQge09wdGlvbiwgcHJvZ3JhbSwgdHlwZSBDb21tYW5kfSBmcm9tICdjb21tYW5kZXInXG5pbXBvcnQgY29uc29sYSBmcm9tICdjb25zb2xhJ1xuaW1wb3J0IHtpbnB1dCwgc2VsZWN0LCBjb25maXJtfSBmcm9tICdAaW5xdWlyZXIvcHJvbXB0cydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcydcblxuaW1wb3J0ICogYXMgdGVsZW1ldHJ5IGZyb20gJ0BnZXRjcm9uaXQvcHlsb24tdGVsZW1ldHJ5J1xuXG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ3VybCdcbmltcG9ydCB7ZGlybmFtZX0gZnJvbSAncGF0aCdcblxuY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShfX2ZpbGVuYW1lKVxuXG5jb25zdCB2ZXJzaW9uID0gKCgpID0+IHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdwYWNrYWdlLmpzb24nKSwgJ3V0Zi04JylcbiAgKS52ZXJzaW9uIGFzIHN0cmluZ1xufSkoKVxuXG5mdW5jdGlvbiBta2RpcnAoZGlyOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBmcy5ta2RpclN5bmMoZGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmICgnY29kZScgaW4gZSAmJiBlLmNvZGUgPT09ICdFRVhJU1QnKSByZXR1cm5cbiAgICB9XG4gICAgdGhyb3cgZVxuICB9XG59XG5cbmNvbnN0IHJ1bnRpbWVzOiB7XG4gIGtleTogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICB3ZWJzaXRlOiBzdHJpbmdcbiAgdGVtcGxhdGVzPzogc3RyaW5nW11cbn1bXSA9IFtcbiAge1xuICAgIGtleTogJ2J1bicsXG4gICAgbmFtZTogJ0J1bi5qcycsXG4gICAgd2Vic2l0ZTogJ2h0dHBzOi8vYnVuanMuZGV2JyxcbiAgICB0ZW1wbGF0ZXM6IFsnZGVmYXVsdCddXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdub2RlJyxcbiAgICBuYW1lOiAnTm9kZS5qcycsXG4gICAgd2Vic2l0ZTogJ2h0dHBzOi8vbm9kZWpzLm9yZycsXG4gICAgdGVtcGxhdGVzOiBbJ2RlZmF1bHQnXVxuICB9LFxuICB7XG4gICAga2V5OiAnY2Ytd29ya2VycycsXG4gICAgbmFtZTogJ0Nsb3VkZmxhcmUgV29ya2VycycsXG4gICAgd2Vic2l0ZTogJ2h0dHBzOi8vd29ya2Vycy5jbG91ZGZsYXJlLmNvbScsXG4gICAgdGVtcGxhdGVzOiBbJ2RlZmF1bHQnXVxuICB9LFxuICB7XG4gICAga2V5OiAnZGVubycsXG4gICAgbmFtZTogJ0Rlbm8nLFxuICAgIHdlYnNpdGU6ICdodHRwczovL2Rlbm8ubGFuZCcsXG4gICAgdGVtcGxhdGVzOiBbJ2RlZmF1bHQnXVxuICB9XG5dXG5cbmNvbnN0IHRlbXBsYXRlczoge1xuICBrZXk6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xufVtdID0gW1xuICB7XG4gICAga2V5OiAnZGVmYXVsdCcsXG4gICAgbmFtZTogJ0RlZmF1bHQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVmYXVsdCB0ZW1wbGF0ZSdcbiAgfSxcbiAge1xuICAgIGtleTogJ2RhdGFiYXNlJyxcbiAgICBuYW1lOiAnRGF0YWJhc2UgKFByaXNtYSknLFxuICAgIGRlc2NyaXB0aW9uOiAnVGVtcGxhdGUgd2l0aCBQcmlzbWEgT1JNJ1xuICB9XG5dXG5cbmNvbnN0IGluamVjdFZhcmlhYmxlc0luQ29udGVudCA9IChcbiAgY29udGVudDogc3RyaW5nLFxuICB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbikgPT4ge1xuICBsZXQgcmVzdWx0ID0gY29udGVudFxuXG4gIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoa2V5LCB2YWx1ZSlcbiAgfSlcblxuICByZXR1cm4gcmVzdWx0XG59XG5jb25zdCByZWFkZGlyRmlsZXNTeW5jUmVjdXJzaXZlID0gKGRpcjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBydW4gPSAoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdXG5cbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGRpcilcblxuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIGZpbGUpXG5cbiAgICAgIGlmIChmcy5zdGF0U3luYyhmaWxlUGF0aCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZXN1bHQucHVzaCguLi5ydW4oZmlsZVBhdGgpKVxuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IGFkZCBmaWxlc1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKGZpbGVQYXRoKS5pc0ZpbGUoKSkge1xuICAgICAgICByZXN1bHQucHVzaChmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIHJ1bihkaXIpLm1hcChmaWxlID0+IHtcbiAgICByZXR1cm4gZmlsZS5yZXBsYWNlKGRpciwgJy4nKVxuICB9KVxufVxuXG5jb25zdCBjcmVhdGVUZW1wbGF0ZSA9IGFzeW5jIChvcHRpb25zOiB7XG4gIG5hbWU6IHN0cmluZ1xuICBydW50aW1lOiBzdHJpbmdcbiAgdGVtcGxhdGU6IHN0cmluZ1xuICB0YXJnZXQ6IHN0cmluZ1xufSkgPT4ge1xuICBjb25zdCB7cnVudGltZSwgdGVtcGxhdGUsIHRhcmdldH0gPSBvcHRpb25zXG5cbiAgY29uc3QgcnVudGltZU5hbWUgPSBydW50aW1lcy5maW5kKCh7a2V5fSkgPT4ga2V5ID09PSBydW50aW1lKT8ubmFtZVxuICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZXMuZmluZCgoe2tleX0pID0+IGtleSA9PT0gdGVtcGxhdGUpPy5uYW1lXG5cbiAgaWYgKCFydW50aW1lTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBydW50aW1lOiAke3J1bnRpbWV9YClcbiAgfVxuXG4gIGlmICghdGVtcGxhdGVOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlOiAke3RlbXBsYXRlfWApXG4gIH1cblxuICAvLyBUaGUgdGVtcGxhdGVzIGFyZSBzdG9yZWQgaW4gdGhlIGB0ZW1wbGF0ZXNgIGRpcmVjdG9yeVxuICBjb25zdCBzaGFyZWRUZW1wbGF0ZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICd0ZW1wbGF0ZXMnLCAnc2hhcmVkJylcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2hhcmVkVGVtcGxhdGVEaXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTaGFyZWQgdGVtcGxhdGVzIG5vdCBmb3VuZDogJHtzaGFyZWRUZW1wbGF0ZURpcn1gKVxuICB9XG5cbiAgY29uc3QgdGVtcGxhdGVEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAndGVtcGxhdGVzJywgcnVudGltZSwgdGVtcGxhdGUpXG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlRGlyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGVtcGxhdGUgbm90IGZvdW5kOiAke3RlbXBsYXRlRGlyfWApXG4gIH1cblxuICAvLyBUaGUgdGFyZ2V0IGRpcmVjdG9yeSBpcyBhbHJlYWR5IGNyZWF0ZWRcbiAgY29uc3QgdGFyZ2V0RGlyZWN0b3J5UGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCB0YXJnZXQpXG5cbiAgY29uc29sYS5zdGFydChgQ3JlYXRpbmcgcHlsb24gaW4gJHt0YXJnZXREaXJlY3RvcnlQYXRofWApXG5cbiAgY29uc3QgaW5qZWN0ID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBpbmplY3RWYXJpYWJsZXNJbkNvbnRlbnQoY29udGVudCwge1xuICAgICAgX19QWUxPTl9OQU1FX186IG9wdGlvbnMubmFtZVxuICAgIH0pXG4gIH1cblxuICAvLyBDb3B5IHRoZSBzaGFyZWQgdGVtcGxhdGUgZmlsZXNcbiAgcmVhZGRpckZpbGVzU3luY1JlY3Vyc2l2ZShzaGFyZWRUZW1wbGF0ZURpcikuZm9yRWFjaChmaWxlID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBwYXRoLmpvaW4oc2hhcmVkVGVtcGxhdGVEaXIsIGZpbGUpXG4gICAgbGV0IHRhcmdldCA9IHBhdGguam9pbih0YXJnZXREaXJlY3RvcnlQYXRoLCBmaWxlKVxuXG4gICAgLy8gQ3JlYXRlIGZvbGRlciByZWN1cnNpdmVseSBhbmQgY29weSBmaWxlXG5cbiAgICBjb25zdCB0YXJnZXREaXIgPSBwYXRoLmRpcm5hbWUodGFyZ2V0KVxuXG4gICAgLy8gU2tpcCB0aGUgLmdpdGh1Yi93b3JrZmxvd3MgZGlyZWN0b3J5IGZvciBjZi13b3JrZXJzIHJ1bnRpbWVcbiAgICBpZiAoXG4gICAgICBydW50aW1lID09PSAnY2Ytd29ya2VycycgJiZcbiAgICAgIHNvdXJjZS5pbmNsdWRlcygnLmdpdGh1Yi93b3JrZmxvd3MvcHVibGlzaC55YW1sJylcbiAgICApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXREaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmModGFyZ2V0RGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdGFyZ2V0IGVuZHMgd2l0aCBgLmV4YW1wbGVgLCByZW1vdmUgdGhlIHN1ZmZpeC5cbiAgICAvLyBUaGlzIGlzIHVzZWZ1bCBmb3IgYC5naXRpZ25vcmUuZXhhbXBsZWAgZmlsZXMgYmVjYXVzZSB0aGV5IGFyZSBub3QgcHVibGlzaGVkIGluXG4gICAgLy8gdGhlIGBjcmVhdGUtcHlsb25gIHBhY2thZ2Ugd2hlbiBuYW1lZCBgLmdpdGlnbm9yZWAuXG4gICAgaWYgKHRhcmdldC5lbmRzV2l0aCgnLmV4YW1wbGUnKSkge1xuICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnJlcGxhY2UoJy5leGFtcGxlJywgJycpXG4gICAgfVxuXG4gICAgY29uc3QgaW5qZWN0ZWRDb250ZW50ID0gaW5qZWN0KGZzLnJlYWRGaWxlU3luYyhzb3VyY2UsICd1dGYtOCcpKVxuXG4gICAgZnMud3JpdGVGaWxlU3luYyh0YXJnZXQsIGluamVjdGVkQ29udGVudClcbiAgfSlcblxuICAvLyBDb3B5IHRoZSBydW50aW1lIHNwZWNpZmljIHRlbXBsYXRlIGZpbGVzXG4gIHJlYWRkaXJGaWxlc1N5bmNSZWN1cnNpdmUodGVtcGxhdGVEaXIpLmZvckVhY2goZmlsZSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gcGF0aC5qb2luKHRlbXBsYXRlRGlyLCBmaWxlKVxuICAgIGxldCB0YXJnZXQgPSBwYXRoLmpvaW4odGFyZ2V0RGlyZWN0b3J5UGF0aCwgZmlsZSlcblxuICAgIC8vIENyZWF0ZSBmb2xkZXIgcmVjdXJzaXZlbHkgYW5kIGNvcHkgZmlsZVxuICAgIGNvbnN0IHRhcmdldERpciA9IHBhdGguZGlybmFtZSh0YXJnZXQpXG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0RGlyKSkge1xuICAgICAgZnMubWtkaXJTeW5jKHRhcmdldERpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHRhcmdldCBlbmRzIHdpdGggYC5leGFtcGxlYCwgcmVtb3ZlIHRoZSBzdWZmaXguXG4gICAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIGAuZ2l0aWdub3JlLmV4YW1wbGVgIGZpbGVzIGJlY2F1c2UgdGhleSBhcmUgbm90IHB1Ymxpc2hlZCBpblxuICAgIC8vIHRoZSBgY3JlYXRlLXB5bG9uYCBwYWNrYWdlIHdoZW4gbmFtZWQgYC5naXRpZ25vcmVgLlxuICAgIGlmICh0YXJnZXQuZW5kc1dpdGgoJy5leGFtcGxlJykpIHtcbiAgICAgIHRhcmdldCA9IHRhcmdldC5yZXBsYWNlKCcuZXhhbXBsZScsICcnKVxuICAgIH1cblxuICAgIGNvbnN0IGluamVjdGVkQ29udGVudCA9IGluamVjdChmcy5yZWFkRmlsZVN5bmMoc291cmNlLCAndXRmLTgnKSlcblxuICAgIGZzLndyaXRlRmlsZVN5bmModGFyZ2V0LCBpbmplY3RlZENvbnRlbnQpXG4gIH0pXG5cbiAgY29uc29sYS5zdWNjZXNzKGBQeWxvbiBjcmVhdGVkYClcbn1cblxuaW1wb3J0IHtzcGF3blN5bmN9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnXG5pbXBvcnQge2RldGVjdFBhY2thZ2VNYW5hZ2VyLCBnZXRSdW5TY3JpcHQsIFBhY2thZ2VNYW5hZ2VyfSBmcm9tICcuL2RldGVjdC1wbSdcblxuY29uc3QgaW5zdGFsbERlcGVuZGVuY2llcyA9IGFzeW5jIChhcmdzOiB7XG4gIHRhcmdldDogc3RyaW5nXG4gIHBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlclxufSkgPT4ge1xuICBjb25zdCB0YXJnZXQgPSBwYXRoLnJlc29sdmUoYXJncy50YXJnZXQpXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gYXJncy5wYWNrYWdlTWFuYWdlclxuXG4gIGxldCBjb21tYW5kID0gJydcblxuICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgY2FzZSAneWFybic6XG4gICAgICBjb21tYW5kID0gJ3lhcm4nXG4gICAgICBicmVha1xuICAgIGNhc2UgJ25wbSc6XG4gICAgICBjb21tYW5kID0gJ25wbSBpbnN0YWxsJ1xuICAgICAgYnJlYWtcbiAgICBjYXNlICdwbnBtJzpcbiAgICAgIGNvbW1hbmQgPSAncG5wbSBpbnN0YWxsJ1xuICAgICAgYnJlYWtcbiAgICBjYXNlICdidW4nOlxuICAgICAgY29tbWFuZCA9ICdidW4gaW5zdGFsbCdcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnZGVubyc6XG4gICAgICBjb21tYW5kID0gJ2Rlbm8gaW5zdGFsbCdcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrYWdlIG1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9YClcbiAgfVxuXG4gIGNvbnNvbGEuc3RhcnQoYEluc3RhbGxpbmcgZGVwZW5kZW5jaWVzIHVzaW5nICR7cGFja2FnZU1hbmFnZXJ9YClcblxuICBjb25zdCBwcm9jID0gc3Bhd25TeW5jKGNvbW1hbmQsIHtcbiAgICBjd2Q6IHRhcmdldCxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnXG4gIH0pXG5cbiAgaWYgKHByb2Muc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW5zdGFsbCBkZXBlbmRlbmNpZXNgKVxuICB9XG5cbiAgY29uc29sYS5zdWNjZXNzKGBEZXBlbmRlbmNpZXMgaW5zdGFsbGVkYClcbn1cblxucHJvZ3JhbVxuICAubmFtZSgnY3JlYXRlLXB5bG9uJylcbiAgLnZlcnNpb24odmVyc2lvbilcbiAgLmFyZ3VtZW50cygnW3RhcmdldF0nKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy1pLCAtLWluc3RhbGwnLCAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnKSlcbiAgLmFkZE9wdGlvbihcbiAgICBuZXcgT3B0aW9uKCctciwgLS1ydW50aW1lIDxydW50aW1lPicsICdSdW50aW1lJykuY2hvaWNlcyhcbiAgICAgIHJ1bnRpbWVzLm1hcCgoe2tleX0pID0+IGtleSlcbiAgICApXG4gIClcbiAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctdCwgLS10ZW1wbGF0ZSA8dGVtcGxhdGU+JywgJ1RlbXBsYXRlJykpXG4gIC5hZGRPcHRpb24oXG4gICAgbmV3IE9wdGlvbignLXBtLCAtLXBhY2thZ2UtbWFuYWdlciA8cGFja2FnZU1hbmFnZXI+JywgJ1BhY2thZ2UgbWFuYWdlcicpXG4gIClcbiAgLmFkZE9wdGlvbihcbiAgICBuZXcgT3B0aW9uKFxuICAgICAgJy0tY2xpZW50JyxcbiAgICAgICdFbmFibGUgY2xpZW50IGdlbmVyYXRpb24gKGh0dHBzOi8vcHlsb24uY3Jvbml0LmlvL2RvY3MvaW50ZWdyYXRpb25zL2dxdHkpJ1xuICAgIClcbiAgKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tY2xpZW50LXBhdGggPGNsaWVudFBhdGg+JywgJ0NsaWVudCBwYXRoJykpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1jbGllbnQtcG9ydCA8Y2xpZW50UG9ydD4nLCAnQ2xpZW50IHBvcnQnKSlcbiAgLmFjdGlvbihtYWluKVxuXG50eXBlIEFyZ09wdGlvbnMgPSB7XG4gIGluc3RhbGw6IGJvb2xlYW5cbiAgcnVudGltZTogc3RyaW5nXG4gIHRlbXBsYXRlOiBzdHJpbmdcbiAgcGFja2FnZU1hbmFnZXI/OiBQYWNrYWdlTWFuYWdlclxuICBjbGllbnQ/OiBib29sZWFuXG4gIGNsaWVudFBhdGg/OiBzdHJpbmdcbiAgY2xpZW50UG9ydD86IHN0cmluZ1xufVxuXG5jb25zdCBnZXRQcmVmZXJyZWRQbUJ5UnVudGltZSA9IChcbiAgcnVudGltZTogc3RyaW5nXG4pOiBQYWNrYWdlTWFuYWdlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChydW50aW1lID09PSAnYnVuJykge1xuICAgIHJldHVybiAnYnVuJ1xuICB9IGVsc2UgaWYgKHJ1bnRpbWUgPT09ICdkZW5vJykge1xuICAgIHJldHVybiAnZGVubydcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKFxuICB0YXJnZXREaXI6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogQXJnT3B0aW9ucyxcbiAgY29tbWFuZDogQ29tbWFuZFxuKSB7XG4gIHRyeSB7XG4gICAgY29uc29sYS5sb2coYCR7Y29tbWFuZC5uYW1lKCl9IHZlcnNpb24gJHtjb21tYW5kLnZlcnNpb24oKX1gKVxuXG4gICAgY29uc3Qge1xuICAgICAgaW5zdGFsbDogaW5zdGFsbEFyZyxcbiAgICAgIHJ1bnRpbWU6IHJ1bnRpbWVBcmcsXG4gICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVBcmcsXG4gICAgICBwYWNrYWdlTWFuYWdlcjogcGFja2FnZU1hbmFnZXJBcmcsXG4gICAgICBjbGllbnQ6IGNsaWVudEFyZyxcbiAgICAgIGNsaWVudFBhdGg6IGNsaWVudFBhdGhBcmcsXG4gICAgICBjbGllbnRQb3J0OiBjbGllbnRQb3J0QXJnXG4gICAgfSA9IG9wdGlvbnNcblxuICAgIGxldCB0YXJnZXQgPSAnJ1xuXG4gICAgaWYgKHRhcmdldERpcikge1xuICAgICAgdGFyZ2V0ID0gdGFyZ2V0RGlyXG5cbiAgICAgIGNvbnNvbGEuc3VjY2VzcyhgVXNpbmcgdGFyZ2V0IGRpcmVjdG9yeSDigKYgJHt0YXJnZXR9YClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgaW5wdXQoe1xuICAgICAgICBtZXNzYWdlOiAnVGFyZ2V0IGRpcmVjdG9yeScsXG4gICAgICAgIGRlZmF1bHQ6ICdteS1weWxvbidcbiAgICAgIH0pXG4gICAgICB0YXJnZXQgPSBhbnN3ZXJcbiAgICB9XG5cbiAgICBsZXQgcHJvamVjdE5hbWUgPSAnJ1xuXG4gICAgaWYgKHRhcmdldCA9PT0gJy4nKSB7XG4gICAgICBwcm9qZWN0TmFtZSA9IHBhdGguYmFzZW5hbWUocHJvY2Vzcy5jd2QoKSlcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvamVjdE5hbWUgPSBwYXRoLmJhc2VuYW1lKHRhcmdldClcbiAgICB9XG5cbiAgICBjb25zdCBydW50aW1lTmFtZSA9XG4gICAgICBydW50aW1lQXJnIHx8XG4gICAgICAoYXdhaXQgc2VsZWN0KHtcbiAgICAgICAgbWVzc2FnZTogJ1doaWNoIHJ1bnRpbWUgd291bGQgeW91IGxpa2UgdG8gdXNlPycsXG4gICAgICAgIGNob2ljZXM6IHJ1bnRpbWVzLm1hcChydW50aW1lID0+ICh7XG4gICAgICAgICAgbmFtZTogYCR7cnVudGltZS5uYW1lfSAoJHtydW50aW1lLndlYnNpdGV9KWAsXG4gICAgICAgICAgdmFsdWU6IHJ1bnRpbWUua2V5XG4gICAgICAgIH0pKSxcbiAgICAgICAgZGVmYXVsdDogMFxuICAgICAgfSkpXG5cbiAgICBpZiAoIXJ1bnRpbWVOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJ1bnRpbWUgc2VsZWN0ZWQnKVxuICAgIH1cblxuICAgIGNvbnN0IHJ1bnRpbWUgPSBydW50aW1lcy5maW5kKCh7a2V5fSkgPT4ga2V5ID09PSBydW50aW1lTmFtZSlcblxuICAgIGlmICghcnVudGltZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJ1bnRpbWUgc2VsZWN0ZWQ6ICR7cnVudGltZU5hbWV9YClcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPVxuICAgICAgdGVtcGxhdGVBcmcgfHxcbiAgICAgIChhd2FpdCBzZWxlY3Qoe1xuICAgICAgICBtZXNzYWdlOiAnV2hpY2ggdGVtcGxhdGUgd291bGQgeW91IGxpa2UgdG8gdXNlPycsXG4gICAgICAgIGNob2ljZXM6IHRlbXBsYXRlc1xuICAgICAgICAgIC5maWx0ZXIodGVtcGxhdGUgPT4gcnVudGltZS50ZW1wbGF0ZXM/LmluY2x1ZGVzKHRlbXBsYXRlLmtleSkpXG4gICAgICAgICAgLm1hcCh0ZW1wbGF0ZSA9PiAoe1xuICAgICAgICAgICAgbmFtZTogdGVtcGxhdGUubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiB0ZW1wbGF0ZS5rZXlcbiAgICAgICAgICB9KSksXG4gICAgICAgIGRlZmF1bHQ6IDBcbiAgICAgIH0pKVxuXG4gICAgaWYgKCF0ZW1wbGF0ZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdGVtcGxhdGUgc2VsZWN0ZWQnKVxuICAgIH1cblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHRhcmdldCkpIHtcbiAgICAgIGlmIChmcy5yZWFkZGlyU3luYyh0YXJnZXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgICAgICBtZXNzYWdlOiAnRGlyZWN0b3J5IG5vdCBlbXB0eS4gQ29udGludWU/JyxcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWtkaXJwKHRhcmdldClcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YWxsID1cbiAgICAgIGluc3RhbGxBcmcgfHxcbiAgICAgIChhd2FpdCBjb25maXJtKHttZXNzYWdlOiAnV291bGQgeW91IGxpa2UgdG8gaW5zdGFsbCBkZXBlbmRlbmNpZXM/J30pKVxuXG4gICAgYXdhaXQgY3JlYXRlVGVtcGxhdGUoe1xuICAgICAgbmFtZTogcHJvamVjdE5hbWUsXG4gICAgICBydW50aW1lOiBydW50aW1lTmFtZSxcbiAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZU5hbWUsXG4gICAgICB0YXJnZXRcbiAgICB9KVxuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBkZXRlY3RQYWNrYWdlTWFuYWdlcih7XG4gICAgICBwcmVmZXJyZWRQbTogZ2V0UHJlZmVycmVkUG1CeVJ1bnRpbWUocnVudGltZS5rZXkpLFxuICAgICAgY3dkOiB0YXJnZXRcbiAgICB9KVxuXG4gICAgaWYgKGluc3RhbGwpIHtcbiAgICAgIGF3YWl0IGluc3RhbGxEZXBlbmRlbmNpZXMoe3RhcmdldCwgcGFja2FnZU1hbmFnZXJ9KVxuICAgIH1cblxuICAgIGNvbnN0IGNsaWVudCA9XG4gICAgICBjbGllbnRBcmcgfHxcbiAgICAgIChhd2FpdCBjb25maXJtKHtcbiAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAnV291bGQgeW91IGxpa2UgdG8gZW5hYmxlIGNsaWVudCBnZW5lcmF0aW9uPyAoaHR0cHM6Ly9weWxvbi5jcm9uaXQuaW8vZG9jcy9pbnRlZ3JhdGlvbnMvZ3F0eSknLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgfSkpXG5cbiAgICBsZXQgY2xpZW50Um9vdDogc3RyaW5nID0gJydcbiAgICBsZXQgY2xpZW50UGF0aDogc3RyaW5nID0gJydcbiAgICBsZXQgY2xpZW50UG9ydDogc3RyaW5nID0gJydcblxuICAgIGlmIChjbGllbnQpIHtcbiAgICAgIGlmICghY2xpZW50UGF0aEFyZykge1xuICAgICAgICBjbGllbnRSb290ID0gYXdhaXQgaW5wdXQoe1xuICAgICAgICAgIG1lc3NhZ2U6ICdQYXRoIHRvIHRoZSByb290IHdoZXJlIHRoZSBjbGllbnQgc2hvdWxkIGJlIGdlbmVyYXRlZCcsXG4gICAgICAgICAgZGVmYXVsdDogJy4nXG4gICAgICAgIH0pXG5cbiAgICAgICAgY2xpZW50UGF0aCA9IGF3YWl0IGlucHV0KHtcbiAgICAgICAgICBtZXNzYWdlOiAnUGF0aCB0byBnZW5lcmF0ZSB0aGUgY2xpZW50IHRvJyxcbiAgICAgICAgICBkZWZhdWx0OiBwYXRoLmpvaW4oY2xpZW50Um9vdCwgJ2dxdHkvaW5kZXgudHMnKSxcbiAgICAgICAgICB2YWxpZGF0ZTogdmFsdWUgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggdGhlIGNsaWVudCByb290ICh0YWtlIGNhcmUgb2YgLilcbiAgICAgICAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aChjbGllbnRSb290ID09PSAnLicgPyAnJyA6IGNsaWVudFJvb3QpKSB7XG4gICAgICAgICAgICAgIHJldHVybiAnUGF0aCBtdXN0IHN0YXJ0IHdpdGggdGhlIGNsaWVudCByb290J1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY2xpZW50UG9ydCA9XG4gICAgICAgIGNsaWVudFBvcnRBcmcgfHxcbiAgICAgICAgKGF3YWl0IGlucHV0KHtcbiAgICAgICAgICBtZXNzYWdlOiAnUG9ydCBvZiB0aGUgcHlsb24gc2VydmVyIHRvIGdlbmVyYXRlIHRoZSBjbGllbnQgZnJvbScsXG4gICAgICAgICAgZGVmYXVsdDogJzMwMDAnXG4gICAgICAgIH0pKVxuXG4gICAgICBjb25zb2xhLnN0YXJ0KGBVcGRhdGluZyBweWxvbiBkZXYgc2NyaXB0IHRvIGdlbmVyYXRlIGNsaWVudGApXG5cbiAgICAgIGxldCBwYWNrYWdlUGF0aDogc3RyaW5nXG4gICAgICBsZXQgc2NyaXB0S2V5OiBzdHJpbmdcbiAgICAgIGlmIChydW50aW1lLmtleSA9PT0gJ2Rlbm8nKSB7XG4gICAgICAgIHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgJ2Rlbm8uanNvbicpXG4gICAgICAgIHNjcmlwdEtleSA9ICd0YXNrcydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgJ3BhY2thZ2UuanNvbicpXG4gICAgICAgIHNjcmlwdEtleSA9ICdzY3JpcHRzJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXZTY3JpcHQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlUGF0aCwgJ3V0Zi04JykpXG5cbiAgICAgIGRldlNjcmlwdFtzY3JpcHRLZXldID0ge1xuICAgICAgICAuLi5kZXZTY3JpcHRbc2NyaXB0S2V5XSxcbiAgICAgICAgZGV2OlxuICAgICAgICAgIGRldlNjcmlwdFtzY3JpcHRLZXldLmRldiArXG4gICAgICAgICAgYCAtLWNsaWVudCAtLWNsaWVudC1wb3J0ICR7Y2xpZW50UG9ydH0gLS1jbGllbnQtcGF0aCAke2NsaWVudFBhdGh9YFxuICAgICAgfVxuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VQYXRoLCBKU09OLnN0cmluZ2lmeShkZXZTY3JpcHQsIG51bGwsIDIpKVxuXG4gICAgICBjb25zb2xhLnN1Y2Nlc3MoYFB5bG9uIGRldiBzY3JpcHQgdXBkYXRlZGApXG4gICAgfVxuXG4gICAgY29uc3QgcnVuU2NyaXB0ID0gZ2V0UnVuU2NyaXB0KHBhY2thZ2VNYW5hZ2VyKVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGBcbvCfjokgJHtjaGFsay5ncmVlbi5ib2xkKCdQeWxvbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4nKX1cblxu8J+SuyAke2NoYWxrLmN5YW4uYm9sZCgnQ29udGludWUgRGV2ZWxvcGluZycpfVxuICAgICR7Y2hhbGsueWVsbG93KCdDaGFuZ2UgZGlyZWN0b3JpZXM6Jyl9IGNkICR7Y2hhbGsuYmx1ZSh0YXJnZXQpfVxuICAgICR7Y2hhbGsueWVsbG93KCdTdGFydCBkZXYgc2VydmVyOicpfSAke3J1blNjcmlwdH0gZGV2XG4gICAgJHtjaGFsay55ZWxsb3coJ0RlcGxveTonKX0gJHtydW5TY3JpcHR9IGRlcGxveVxuXG7wn5OWICR7Y2hhbGsuY3lhbi5ib2xkKCdFeHBsb3JlIERvY3VtZW50YXRpb24nKX1cbiAgICAke2NoYWxrLnVuZGVybGluZS5ibHVlKCdodHRwczovL3B5bG9uLmNyb25pdC5pby9kb2NzJyl9XG5cbvCfkqwgJHtjaGFsay5jeWFuLmJvbGQoJ0pvaW4gb3VyIENvbW11bml0eScpfVxuICAgICR7Y2hhbGsudW5kZXJsaW5lLmJsdWUoJ2h0dHBzOi8vZGlzY29yZC5nZy9jYkpqa1ZybkhlJyl9XG5gXG5cbiAgICBhd2FpdCB0ZWxlbWV0cnkuc2VuZENyZWF0ZUV2ZW50KHtcbiAgICAgIG5hbWU6IHByb2plY3ROYW1lLFxuICAgICAgcHlsb25DcmVhdGVWZXJzaW9uOiB2ZXJzaW9uLFxuICAgICAgcnVudGltZTogcnVudGltZU5hbWUsXG4gICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVOYW1lLFxuICAgICAgY2xpZW50UGF0aDogY2xpZW50UGF0aCB8fCB1bmRlZmluZWQsXG4gICAgICBjbGllbnRQb3J0OiBwYXJzZUludChjbGllbnRQb3J0KSB8fCB1bmRlZmluZWRcbiAgICB9KVxuXG4gICAgY29uc29sYS5ib3gobWVzc2FnZSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGEuZXJyb3IoZSlcbiAgfVxufVxuXG5wcm9ncmFtLnBhcnNlKClcbiIsCiAgICAiaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJ1xuaW1wb3J0IHtleGVjU3luY30gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IGNvbnNvbGEgZnJvbSAnY29uc29sYSdcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgY29tbWFuZCBleGlzdHNcbmZ1bmN0aW9uIGlzQ29tbWFuZEF2YWlsYWJsZShjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBleGVjU3luYyhgJHtjb21tYW5kfSAtLXZlcnNpb25gLCB7c3RkaW86ICdpZ25vcmUnfSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihlKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8vIERldGVjdCBCdW5cbmZ1bmN0aW9uIGlzQnVuKCk6IGJvb2xlYW4ge1xuICAvLyBAdHMtaWdub3JlOiBCdW4gbWF5IG5vdCBiZSBkZWZpbmVkXG4gIHJldHVybiB0eXBlb2YgQnVuICE9PSAndW5kZWZpbmVkJyAmJiBpc0NvbW1hbmRBdmFpbGFibGUoJ2J1bicpXG59XG5cbi8vIERldGVjdCBucG1cbmZ1bmN0aW9uIGlzTnBtKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5pbmNsdWRlcygnbnBtJykgPz8gZmFsc2Vcbn1cblxuLy8gRGV0ZWN0IFlhcm5cbmZ1bmN0aW9uIGlzWWFybigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uaW5jbHVkZXMoJ3lhcm4nKSA/PyBmYWxzZVxufVxuXG4vLyBEZXRlY3QgRGVub1xuZnVuY3Rpb24gaXNEZW5vKCk6IGJvb2xlYW4ge1xuICAvLyBAdHMtaWdub3JlOiBEZW5vIG1heSBub3QgYmUgZGVmaW5lZFxuICByZXR1cm4gdHlwZW9mIERlbm8gIT09ICd1bmRlZmluZWQnICYmIGlzQ29tbWFuZEF2YWlsYWJsZSgnZGVubycpXG59XG5cbi8vIERldGVjdCBwbnBtXG5mdW5jdGlvbiBpc1BucG0oKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmluY2x1ZGVzKCdwbnBtJykgPz8gZmFsc2Vcbn1cblxuLy8gRGV0ZWN0IGJhc2VkIG9uIGxvY2sgZmlsZXNcbmZ1bmN0aW9uIGRldGVjdEJ5TG9ja0ZpbGVzKGN3ZDogc3RyaW5nKTogUGFja2FnZU1hbmFnZXIgfCBudWxsIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN3ZCwgJ2J1bi5sb2NrYicpKSkge1xuICAgIHJldHVybiAnYnVuJ1xuICB9XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjd2QsICdwYWNrYWdlLWxvY2suanNvbicpKSkge1xuICAgIHJldHVybiAnbnBtJ1xuICB9XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjd2QsICd5YXJuLmxvY2snKSkpIHtcbiAgICByZXR1cm4gJ3lhcm4nXG4gIH1cbiAgaWYgKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN3ZCwgJ2Rlbm8uanNvbicpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN3ZCwgJ2Rlbm8ubG9jaycpKVxuICApIHtcbiAgICByZXR1cm4gJ2Rlbm8nXG4gIH1cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN3ZCwgJ3BucG0tbG9jay55YW1sJykpKSB7XG4gICAgcmV0dXJuICdwbnBtJ1xuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCB0eXBlIFBhY2thZ2VNYW5hZ2VyID1cbiAgfCAnYnVuJ1xuICB8ICducG0nXG4gIHwgJ3lhcm4nXG4gIHwgJ3BucG0nXG4gIHwgJ2Rlbm8nXG4gIHwgJ3Vua25vd24nXG5cbi8vIE1haW4gZGV0ZWN0aW9uIGZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0UGFja2FnZU1hbmFnZXIoe1xuICBwcmVmZXJyZWRQbSxcbiAgY3dkID0gcHJvY2Vzcy5jd2QoKVxufToge1xuICBwcmVmZXJyZWRQbT86IFBhY2thZ2VNYW5hZ2VyXG4gIGN3ZD86IHN0cmluZ1xufSk6IFBhY2thZ2VNYW5hZ2VyIHtcbiAgLy8gQ2hlY2sgdGhlIHByZWZlcnJlZCBwYWNrYWdlIG1hbmFnZXIgZmlyc3RcbiAgaWYgKHByZWZlcnJlZFBtICYmIGlzQ29tbWFuZEF2YWlsYWJsZShwcmVmZXJyZWRQbSkpIHtcbiAgICByZXR1cm4gcHJlZmVycmVkUG1cbiAgfVxuXG4gIC8vIFByb2NlZWQgd2l0aCBkZXRlY3Rpb24gbG9naWNcbiAgaWYgKGlzQnVuKCkpIHtcbiAgICByZXR1cm4gJ2J1bidcbiAgfVxuICBpZiAoaXNOcG0oKSkge1xuICAgIHJldHVybiAnbnBtJ1xuICB9XG4gIGlmIChpc1BucG0oKSkge1xuICAgIHJldHVybiAncG5wbSdcbiAgfVxuICBpZiAoaXNEZW5vKCkpIHtcbiAgICByZXR1cm4gJ2Rlbm8nXG4gIH1cbiAgaWYgKGlzWWFybigpKSB7XG4gICAgcmV0dXJuICd5YXJuJ1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgdG8gbG9jayBmaWxlIGRldGVjdGlvblxuICBjb25zdCBsb2NrRmlsZURldGVjdGlvbiA9IGRldGVjdEJ5TG9ja0ZpbGVzKGN3ZClcbiAgaWYgKGxvY2tGaWxlRGV0ZWN0aW9uKSB7XG4gICAgY29uc29sYS5pbmZvKGBEZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXIgYnkgbG9jayBmaWxlOiAke2xvY2tGaWxlRGV0ZWN0aW9ufWApXG4gICAgaWYgKGlzQ29tbWFuZEF2YWlsYWJsZShsb2NrRmlsZURldGVjdGlvbikpIHtcbiAgICAgIHJldHVybiBsb2NrRmlsZURldGVjdGlvblxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xhLndhcm4oXG4gICAgICAgIGBMb2NrIGZpbGUgZGV0ZWN0ZWQsIGJ1dCAke2xvY2tGaWxlRGV0ZWN0aW9ufSBpcyBub3QgaW5zdGFsbGVkLmBcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbnR5cGUgUGFja2FnZU1hbmFnZXJTY3JpcHQgPVxuICB8ICdidW4nXG4gIHwgJ25wbSBydW4nXG4gIHwgJ3lhcm4nXG4gIHwgJ3BucG0gcnVuJ1xuICB8ICdkZW5vIHRhc2snXG5cbi8vIFJ1biBzY3JpcHQgZGV0ZWN0aW9uXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVuU2NyaXB0KHBtOiBQYWNrYWdlTWFuYWdlcik6IFBhY2thZ2VNYW5hZ2VyU2NyaXB0IHtcbiAgc3dpdGNoIChwbSkge1xuICAgIGNhc2UgJ2J1bic6XG4gICAgICByZXR1cm4gJ2J1bidcbiAgICBjYXNlICducG0nOlxuICAgICAgcmV0dXJuICducG0gcnVuJ1xuICAgIGNhc2UgJ3lhcm4nOlxuICAgICAgcmV0dXJuICd5YXJuJ1xuICAgIGNhc2UgJ3BucG0nOlxuICAgICAgcmV0dXJuICdwbnBtIHJ1bidcbiAgICBjYXNlICdkZW5vJzpcbiAgICAgIHJldHVybiAnZGVubyB0YXNrJ1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcGFja2FnZSBtYW5hZ2VyJylcbiAgfVxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQXFOQTs7O0FDak9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQSxTQUFTLGtCQUFr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QjtBQUFBLE1BQ25DLE1BQU0sT0FBTyxxQkFBcUIsUUFBUSxNQUFNLEtBQUssTUFBTTtBQUFBLE1BQzNELE1BQU0sT0FBTyxtQkFBbUIsS0FBSztBQUFBLE1BQ3JDLE1BQU0sT0FBTyxTQUFTLEtBQUs7QUFBQTtBQUFBLGVBRTdCLE1BQU0sS0FBSyxLQUFLLHVCQUF1QjtBQUFBLE1BQ3JDLE1BQU0sVUFBVSxLQUFLLDhCQUE4QjtBQUFBO0FBQUEsZUFFckQsTUFBTSxLQUFLLEtBQUssb0JBQW9CO0FBQUEsTUFDbEMsTUFBTSxVQUFVLEtBQUssK0JBQStCO0FBQUE7QUFHdEQsVUFBZ0IsMEJBQWdCO0FBQUEsTUFDOUIsTUFBTTtBQUFBLE1BQ04sb0JBQW9CO0FBQUEsTUFDcEIsU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BQ1YsWUFBWSxjQUFjO0FBQUEsTUFDMUIsWUFBWSxTQUFTLFVBQVUsS0FBSztBQUFBLElBQ3RDLENBQUM7QUFFRCxhQUFRLElBQUksT0FBTztBQUFBLFdBQ1osR0FBUDtBQUNBLGFBQVEsTUFBTSxDQUFDO0FBQUE7QUFBQTtBQUluQixRQUFRLE1BQU07IiwKICAiZGVidWdJZCI6ICI0OUZENEFCNTNGNTA3ODI5NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-pylon",
3
3
  "type": "module",
4
- "version": "1.0.4",
4
+ "version": "1.1.1",
5
5
  "description": "CLI for creating a Pylon",
6
6
  "scripts": {
7
7
  "build": "bun build ./src/index.ts --target=bun --outdir=./dist --sourcemap=inline --packages external"
@@ -20,12 +20,12 @@
20
20
  },
21
21
  "homepage": "https://pylon.cronit.io",
22
22
  "dependencies": {
23
+ "@getcronit/pylon-telemetry": "^1.0.0",
23
24
  "@inquirer/prompts": "^5.4.0",
24
25
  "chalk": "^5.3.0",
25
26
  "commander": "^12.1.0",
26
27
  "consola": "^3.2.3",
27
- "detect-package-manager": "^3.0.2",
28
- "@getcronit/pylon-telemetry": "^1.0.0"
28
+ "hono": "^4"
29
29
  },
30
30
  "engines": {
31
31
  "node": ">=18.0.0"
@@ -0,0 +1,5 @@
1
+ {
2
+ "recommendations": [
3
+ "denoland.vscode-deno"
4
+ ]
5
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "deno.enablePaths": [
3
+ "./"
4
+ ],
5
+ "editor.inlayHints.enabled": "off"
6
+ }
@@ -0,0 +1,12 @@
1
+ FROM denoland/deno
2
+
3
+ EXPOSE 3000
4
+
5
+ WORKDIR /app
6
+
7
+ ADD . /app
8
+
9
+ RUN deno install
10
+ RUN deno task build
11
+
12
+ CMD ["run", "-A", ".pylon/index.js"]
@@ -0,0 +1,15 @@
1
+ {
2
+ "imports": {
3
+ "@getcronit/pylon-dev": "npm:@getcronit/pylon-dev@^1.0.1",
4
+ "@getcronit/pylon": "npm:@getcronit/pylon@^2.2.1"
5
+ },
6
+ "tasks": {
7
+ "dev": "pylon dev -c 'deno run -A .pylon/index.js --config tsconfig.json'",
8
+ "build": "pylon build"
9
+ },
10
+ "compilerOptions": {
11
+ "jsx": "precompile",
12
+ "jsxImportSource": "hono/jsx"
13
+ },
14
+ "nodeModulesDir": "auto"
15
+ }
@@ -0,0 +1,17 @@
1
+ import {app} from '@getcronit/pylon'
2
+
3
+ export const graphql = {
4
+ Query: {
5
+ hello: () => {
6
+ return 'Hello, world!'
7
+ }
8
+ },
9
+ Mutation: {}
10
+ }
11
+
12
+ Deno.serve(
13
+ {
14
+ port: 3000
15
+ },
16
+ app.fetch
17
+ )