@decohere/create 0.0.1-dev.23 → 0.0.1-dev.25

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.
Files changed (36) hide show
  1. package/commonjs/src/models/compose.model.js +56 -4
  2. package/commonjs/src/models/dev-container.model.js +29 -2
  3. package/commonjs/src/models/package-json.model.js +11 -6
  4. package/commonjs/src/runner.js +26 -2
  5. package/commonjs/src/webapi/create-api.js +66 -5
  6. package/commonjs/src/webapi/features/auth.feature.js +288 -7
  7. package/commonjs/src/webapi/features/auth0-cli.js +256 -9
  8. package/commonjs/src/webapi/features/database.feature.js +56 -24
  9. package/commonjs/src/webapi/features/postman.feature.js +337 -48
  10. package/commonjs/src/webapi/models/api-package-json.model.js +4 -1
  11. package/commonjs/src/webapi/models/auth-config.model.js +4 -1
  12. package/commonjs/src/webapi/models/controller-source-file.model.js +16 -8
  13. package/commonjs/src/webapi/models/main-source-file.model.js +28 -4
  14. package/es6/src/models/compose.model.js +57 -6
  15. package/es6/src/models/dev-container.model.js +30 -8
  16. package/es6/src/models/package-json.model.js +11 -6
  17. package/es6/src/runner.js +27 -3
  18. package/es6/src/webapi/create-api.js +66 -5
  19. package/es6/src/webapi/features/auth.feature.js +288 -7
  20. package/es6/src/webapi/features/auth0-cli.js +230 -9
  21. package/es6/src/webapi/features/database.feature.js +56 -24
  22. package/es6/src/webapi/features/postman.feature.js +324 -45
  23. package/es6/src/webapi/models/api-package-json.model.js +4 -1
  24. package/es6/src/webapi/models/auth-config.model.js +4 -1
  25. package/es6/src/webapi/models/controller-source-file.model.js +16 -8
  26. package/es6/src/webapi/models/main-source-file.model.js +28 -4
  27. package/package.json +2 -2
  28. package/types/src/models/compose.model.d.ts +27 -2
  29. package/types/src/models/dev-container.model.d.ts +12 -0
  30. package/types/src/models/package-json.model.d.ts +2 -0
  31. package/types/src/webapi/features/auth.feature.d.ts +3 -0
  32. package/types/src/webapi/features/auth0-cli.d.ts +50 -3
  33. package/types/src/webapi/features/postman.feature.d.ts +5 -0
  34. package/types/src/webapi/models/auth-config.model.d.ts +8 -0
  35. package/types/src/webapi/models/controller-source-file.model.d.ts +6 -3
  36. package/types/src/webapi/models/main-source-file.model.d.ts +12 -0
@@ -1,6 +1,20 @@
1
+ import { randomUUID } from "node:crypto";
1
2
  import { pick } from "../../domain/prompt.js";
2
3
  import { WELL_KNOWN_FILES } from "../../models/const.js";
3
4
  import * as auth0Cli from "./auth0-cli.js";
5
+ /** Postman OAuth callback URLs (popup + "Authorize using browser"). */ const POSTMAN_CALLBACKS = [
6
+ "https://oauth.pstmn.io/v1/callback",
7
+ "https://oauth.pstmn.io/v1/browser-callback"
8
+ ];
9
+ /** Scopes requested for Auth0 access tokens (OIDC + Hello CASL permissions). */ const POSTMAN_SCOPES = [
10
+ "openid",
11
+ "profile",
12
+ "email",
13
+ "read:Hello",
14
+ "create:Hello",
15
+ "update:Hello",
16
+ "delete:Hello"
17
+ ].join(" ");
4
18
  async function getOptions(_workspace, cliOptions) {
5
19
  if (cliOptions.postmanProvider != null) return {};
6
20
  const choices = [
@@ -10,11 +24,11 @@ async function getOptions(_workspace, cliOptions) {
10
24
  },
11
25
  {
12
26
  label: "local",
13
- description: "write collection + environment files"
27
+ description: "Local View / Native Git files (no API key)"
14
28
  },
15
29
  {
16
30
  label: "api",
17
- description: "write files and upload to Postman.com"
31
+ description: "also upload to Postman.com (needs API key)"
18
32
  }
19
33
  ];
20
34
  const selected = await pick("\n Postman: ", choices, (c)=>`${c.label} — ${c.description}`);
@@ -25,7 +39,6 @@ async function getOptions(_workspace, cliOptions) {
25
39
  if (provider === "local") return {
26
40
  postmanProvider: "local"
27
41
  };
28
- // api: collect API key + workspace selection
29
42
  const apiKey = process.env.POSTMAN_API_KEY ?? await import("../../domain/prompt.js").then((m)=>m.ask("\n Postman API key (app.getpostman.com/settings/me/api-keys): "));
30
43
  const headers = {
31
44
  "X-Api-Key": apiKey,
@@ -78,7 +91,7 @@ async function getOptions(_workspace, cliOptions) {
78
91
  workspaceId
79
92
  };
80
93
  }
81
- function buildCollection(projectName, auth) {
94
+ /** v2.1 JSON — used for Postman.com API upload only. */ function buildCollectionJson(projectName, auth) {
82
95
  const authObj = auth?.auth0Domain ? {
83
96
  type: "oauth2",
84
97
  oauth2: [
@@ -104,9 +117,19 @@ function buildCollection(projectName, auth) {
104
117
  },
105
118
  {
106
119
  key: "scope",
107
- value: "openid profile email",
120
+ value: POSTMAN_SCOPES,
108
121
  type: "string"
109
122
  },
123
+ {
124
+ key: "redirect_uri",
125
+ value: POSTMAN_CALLBACKS[0],
126
+ type: "string"
127
+ },
128
+ {
129
+ key: "useBrowser",
130
+ value: "true",
131
+ type: "boolean"
132
+ },
110
133
  {
111
134
  key: "addTokenTo",
112
135
  value: "header",
@@ -116,13 +139,37 @@ function buildCollection(projectName, auth) {
116
139
  key: "challengeAlgorithm",
117
140
  value: "S256",
118
141
  type: "string"
142
+ },
143
+ {
144
+ key: "client_authentication",
145
+ value: "body",
146
+ type: "string"
147
+ },
148
+ {
149
+ key: "clientSecret",
150
+ value: "",
151
+ type: "string"
152
+ },
153
+ {
154
+ key: "tokenName",
155
+ value: `${projectName} Access Token`,
156
+ type: "string"
119
157
  }
120
158
  ]
121
159
  } : undefined;
160
+ const helloUrl = (path, raw)=>({
161
+ raw: `{{baseUrl}}${raw}`,
162
+ host: [
163
+ "{{baseUrl}}"
164
+ ],
165
+ path: path.split("/").filter(Boolean)
166
+ });
122
167
  return {
123
168
  info: {
169
+ _postman_id: randomUUID(),
124
170
  name: `${projectName} WebAPI`,
125
- schema: "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
171
+ schema: "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
172
+ description: "Open the project root in Postman Local View (not the postman/ folder). " + "Select the Local environment, then Authorization → Get New Access Token (PKCE)."
126
173
  },
127
174
  ...authObj ? {
128
175
  auth: authObj
@@ -130,46 +177,268 @@ function buildCollection(projectName, auth) {
130
177
  item: [
131
178
  {
132
179
  name: "Hello",
133
- request: {
134
- method: "GET",
135
- url: {
136
- raw: "{{baseUrl}}/hello",
137
- host: [
138
- "{{baseUrl}}"
139
- ],
140
- path: [
141
- "hello"
142
- ]
180
+ item: [
181
+ {
182
+ name: "List (anonymous)",
183
+ request: {
184
+ auth: {
185
+ type: "noauth"
186
+ },
187
+ method: "GET",
188
+ url: helloUrl("hello", "/hello")
189
+ }
190
+ },
191
+ {
192
+ name: "Get by id",
193
+ request: {
194
+ method: "GET",
195
+ url: helloUrl("hello/:id", "/hello/:id")
196
+ }
197
+ },
198
+ {
199
+ name: "Create",
200
+ request: {
201
+ method: "POST",
202
+ header: [
203
+ {
204
+ key: "Content-Type",
205
+ value: "application/json"
206
+ }
207
+ ],
208
+ body: {
209
+ mode: "raw",
210
+ raw: '{\n "message": "hello"\n}\n'
211
+ },
212
+ url: helloUrl("hello", "/hello")
213
+ }
214
+ },
215
+ {
216
+ name: "Update",
217
+ request: {
218
+ method: "PUT",
219
+ header: [
220
+ {
221
+ key: "Content-Type",
222
+ value: "application/json"
223
+ }
224
+ ],
225
+ body: {
226
+ mode: "raw",
227
+ raw: '{\n "message": "updated"\n}\n'
228
+ },
229
+ url: helloUrl("hello/:id", "/hello/:id")
230
+ }
231
+ },
232
+ {
233
+ name: "Delete",
234
+ request: {
235
+ method: "DELETE",
236
+ url: helloUrl("hello/:id", "/hello/:id")
237
+ }
143
238
  }
144
- }
239
+ ]
145
240
  }
146
241
  ]
147
242
  };
148
243
  }
149
- function buildEnvironmentYaml(name, auth) {
150
- const auth0Section = auth?.auth0Domain ? [
151
- " - key: auth0Domain",
152
- ` value: ${auth.auth0Domain}`,
153
- " - key: auth0Audience",
154
- ` value: '${auth.auth0Audience ?? ""}'`,
155
- " - key: auth0ClientId",
156
- ` value: '${auth.auth0ClientId ?? ""}'`,
157
- " description: Client ID of the Auth0 SPA application used by Postman for PKCE authentication"
158
- ].join("\n") + "\n" : "";
159
- return `name: ${name}\nvalues:\n - key: baseUrl\n value: 'http://localhost:3000'\n${auth0Section}`;
244
+ function yamlQuote(value) {
245
+ if (/[:#{}[\],&*?|<>=!%@`]/.test(value) || value.includes("\n") || value === "") {
246
+ return JSON.stringify(value);
247
+ }
248
+ return value;
249
+ }
250
+ /** Local View / Native Git environment (YAML). */ function buildEnvironmentYaml(name, auth) {
251
+ const values = [
252
+ {
253
+ key: "baseUrl",
254
+ value: "http://localhost:3000"
255
+ }
256
+ ];
257
+ if (auth?.auth0Domain) {
258
+ values.push({
259
+ key: "auth0Domain",
260
+ value: auth.auth0Domain
261
+ }, {
262
+ key: "auth0Audience",
263
+ value: auth.auth0Audience ?? ""
264
+ }, {
265
+ key: "auth0ClientId",
266
+ value: auth.auth0ClientId ?? ""
267
+ }, {
268
+ key: "authUrl",
269
+ value: `https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`
270
+ }, {
271
+ key: "accessTokenUrl",
272
+ value: `https://${auth.auth0Domain}/oauth/token`
273
+ }, {
274
+ key: "callbackUrl",
275
+ value: POSTMAN_CALLBACKS[0]
276
+ }, {
277
+ key: "scope",
278
+ value: POSTMAN_SCOPES
279
+ });
280
+ }
281
+ const lines = [
282
+ `name: ${yamlQuote(name)}`,
283
+ "values:"
284
+ ];
285
+ for (const v of values){
286
+ lines.push(` - key: ${v.key}`);
287
+ lines.push(` value: ${yamlQuote(v.value)}`);
288
+ lines.push(" enabled: true");
289
+ }
290
+ return `${lines.join("\n")}\n`;
291
+ }
292
+ /** Local View / Native Git collection (v3 multi-file YAML). */ function buildLocalViewFiles(projectName, auth) {
293
+ const collectionDir = `postman/collections/${projectName} WebAPI`;
294
+ const files = [];
295
+ // Postman Local View stores OAuth under auth[].credentials (not the v2.1 oauth2 array).
296
+ // Use concrete https URLs — empty Auth URL yields "Invalid protocol for auth URL".
297
+ const authBlock = auth?.auth0Domain ? [
298
+ "auth:",
299
+ ` - id: ${randomUUID()}`,
300
+ " type: oauth2",
301
+ " name: OAuth 2.0",
302
+ " credentials:",
303
+ " addTokenTo: header",
304
+ " grant_type: authorization_code_with_pkce",
305
+ ` authUrl: https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`,
306
+ ` accessTokenUrl: https://${auth.auth0Domain}/oauth/token`,
307
+ ` clientId: ${yamlQuote(auth.auth0ClientId ?? "")}`,
308
+ ` scope: ${yamlQuote(POSTMAN_SCOPES)}`,
309
+ ` redirect_uri: ${POSTMAN_CALLBACKS[0]}`,
310
+ " useBrowser: true",
311
+ " challengeAlgorithm: S256",
312
+ // SPA public client: Auth0 token endpoint rejects Basic auth (feacft Unauthorized).
313
+ " client_authentication: body",
314
+ ' clientSecret: ""',
315
+ ` tokenName: ${yamlQuote(`${projectName} Access Token`)}`,
316
+ ""
317
+ ].join("\n") : "";
318
+ files.push({
319
+ filePath: `${collectionDir}/.resources/definition.yaml`,
320
+ content: [
321
+ "$kind: collection",
322
+ `name: ${yamlQuote(`${projectName} WebAPI`)}`,
323
+ "schemaVersion: '3.0'",
324
+ "description: >-",
325
+ " Open this project root in Postman Local View (Files → Open folder).",
326
+ " Select the Local environment, then Authorization → Get New Access Token (PKCE).",
327
+ authBlock
328
+ ].filter((l)=>l !== undefined).join("\n").replace(/\n+$/, "\n")
329
+ });
330
+ files.push({
331
+ filePath: `${collectionDir}/Hello/.resources/definition.yaml`,
332
+ content: [
333
+ "$kind: folder",
334
+ "name: Hello",
335
+ "order: 1000",
336
+ ""
337
+ ].join("\n")
338
+ });
339
+ const requests = [
340
+ {
341
+ file: "List (anonymous).request.yaml",
342
+ yaml: [
343
+ "$kind: http-request",
344
+ "name: List (anonymous)",
345
+ "method: GET",
346
+ 'url: "{{baseUrl}}/hello"',
347
+ "auth:",
348
+ " type: noauth",
349
+ "order: 1000",
350
+ ""
351
+ ].join("\n")
352
+ },
353
+ {
354
+ file: "Get by id.request.yaml",
355
+ yaml: [
356
+ "$kind: http-request",
357
+ "name: Get by id",
358
+ "method: GET",
359
+ 'url: "{{baseUrl}}/hello/:id"',
360
+ "order: 2000",
361
+ ""
362
+ ].join("\n")
363
+ },
364
+ {
365
+ file: "Create.request.yaml",
366
+ yaml: [
367
+ "$kind: http-request",
368
+ "name: Create",
369
+ "method: POST",
370
+ 'url: "{{baseUrl}}/hello"',
371
+ "headers:",
372
+ " Content-Type: application/json",
373
+ "body:",
374
+ " type: json",
375
+ " content: |-",
376
+ " {",
377
+ ' "message": "hello"',
378
+ " }",
379
+ "order: 3000",
380
+ ""
381
+ ].join("\n")
382
+ },
383
+ {
384
+ file: "Update.request.yaml",
385
+ yaml: [
386
+ "$kind: http-request",
387
+ "name: Update",
388
+ "method: PUT",
389
+ 'url: "{{baseUrl}}/hello/:id"',
390
+ "headers:",
391
+ " Content-Type: application/json",
392
+ "body:",
393
+ " type: json",
394
+ " content: |-",
395
+ " {",
396
+ ' "message": "updated"',
397
+ " }",
398
+ "order: 4000",
399
+ ""
400
+ ].join("\n")
401
+ },
402
+ {
403
+ file: "Delete.request.yaml",
404
+ yaml: [
405
+ "$kind: http-request",
406
+ "name: Delete",
407
+ "method: DELETE",
408
+ 'url: "{{baseUrl}}/hello/:id"',
409
+ "order: 5000",
410
+ ""
411
+ ].join("\n")
412
+ }
413
+ ];
414
+ for (const r of requests){
415
+ files.push({
416
+ filePath: `${collectionDir}/Hello/${r.file}`,
417
+ content: r.yaml
418
+ });
419
+ }
420
+ return files;
160
421
  }
161
422
  async function scaffold(workspace, options) {
162
- if (options.postmanProvider === "none") return;
423
+ if (options.postmanProvider === "none" || options.postmanProvider == null) return;
163
424
  const authConfigModel = workspace.getModel(WELL_KNOWN_FILES.AUTH_CONFIG);
164
425
  const authCfg = authConfigModel?.config;
165
426
  let spaClientId;
166
- if (options.postmanProvider === "api" && options.apiKey && authCfg?.issuerBaseUrl) {
427
+ if (authCfg?.issuerBaseUrl) {
167
428
  try {
168
- const app = auth0Cli.createSpaApp(`${workspace.name} Postman`, "https://oauth.pstmn.io/v1/callback");
429
+ const app = auth0Cli.ensureSpaApp(`${workspace.name} Postman`, [
430
+ ...POSTMAN_CALLBACKS
431
+ ]);
169
432
  spaClientId = app.client_id;
170
- console.log(" ✓ Auth0 SPA app created for Postman PKCE");
171
- } catch {
172
- console.error(" ✗ Failed to create Auth0 SPA app — continuing without it.");
433
+ console.log(app.reused ? ` ✓ Reusing Auth0 SPA app for Postman PKCE (${spaClientId})` : ` ✓ Auth0 SPA app created for Postman PKCE (${spaClientId})`);
434
+ try {
435
+ auth0Cli.enableConnectionForClient(auth0Cli.DB_CONNECTION_NAME, spaClientId);
436
+ console.log(` ✓ Enabled ${auth0Cli.DB_CONNECTION_NAME} on Postman SPA`);
437
+ } catch (err) {
438
+ console.error(` ✗ Failed to enable DB connection on SPA: ${err instanceof Error ? err.message : err}`);
439
+ }
440
+ } catch (err) {
441
+ console.error(` ✗ Failed to ensure Auth0 SPA app — set auth0ClientId in the environment: ${err instanceof Error ? err.message : err}`);
173
442
  }
174
443
  }
175
444
  const auth0Env = authCfg?.issuerBaseUrl ? {
@@ -178,21 +447,30 @@ async function scaffold(workspace, options) {
178
447
  auth0ClientId: spaClientId
179
448
  } : undefined;
180
449
  const projectName = workspace.name;
181
- const collection = buildCollection(projectName, auth0Env);
182
- const envYaml = buildEnvironmentYaml(`${projectName} — Local`, auth0Env);
450
+ const envName = `${projectName} Local`;
451
+ const localFiles = buildLocalViewFiles(projectName, auth0Env);
452
+ const envYaml = buildEnvironmentYaml(envName, auth0Env);
183
453
  workspace.addFile({
184
454
  files: ()=>[
185
455
  {
186
- filePath: `postman/environments/${projectName} \u2014 Local.environment.yaml`,
187
- content: envYaml
456
+ filePath: ".postman/resources.yaml",
457
+ content: [
458
+ "# Open this project root in Postman (Files → Open folder), not the postman/ subfolder.",
459
+ "# Postman fills workspace.id when you connect Local View.",
460
+ "#",
461
+ "# All resources under postman/ are registered automatically.",
462
+ ""
463
+ ].join("\n")
188
464
  },
189
465
  {
190
- filePath: `postman/collections/${projectName}.postman_collection.json`,
191
- content: `${JSON.stringify(collection, null, 2)}\n`
192
- }
466
+ filePath: `postman/environments/${projectName}-Local.environment.yaml`,
467
+ content: envYaml
468
+ },
469
+ ...localFiles
193
470
  ]
194
471
  });
195
472
  if (options.postmanProvider === "api" && options.apiKey) {
473
+ const collection = buildCollectionJson(projectName, auth0Env);
196
474
  const headers = {
197
475
  "X-Api-Key": options.apiKey,
198
476
  "Content-Type": "application/json"
@@ -209,7 +487,7 @@ async function scaffold(workspace, options) {
209
487
  } else {
210
488
  console.error(" ✗ Failed to upload Postman collection");
211
489
  }
212
- const envVars = [
490
+ const envValues = [
213
491
  {
214
492
  key: "baseUrl",
215
493
  value: "http://localhost:3000",
@@ -238,8 +516,8 @@ async function scaffold(workspace, options) {
238
516
  headers,
239
517
  body: JSON.stringify({
240
518
  environment: {
241
- name: `${projectName} — Local`,
242
- values: envVars
519
+ name: envName,
520
+ values: envValues
243
521
  }
244
522
  })
245
523
  });
@@ -254,5 +532,6 @@ export const PostmanFeature = {
254
532
  getOptions,
255
533
  scaffold
256
534
  };
535
+ export { POSTMAN_CALLBACKS, POSTMAN_SCOPES };
257
536
 
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9wcm9tcHQuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoQ29uZmlnTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL2F1dGgtY29uZmlnLm1vZGVsLmpzXCI7XG5pbXBvcnQgKiBhcyBhdXRoMENsaSBmcm9tIFwiLi9hdXRoMC1jbGkuanNcIjtcblxuZXhwb3J0IHR5cGUgUG9zdG1hbk9wdGlvbnMgPSB7XG5cdHBvc3RtYW5Qcm92aWRlcj86IFwiYXBpXCIgfCBcImxvY2FsXCIgfCBcIm5vbmVcIjtcblx0YXBpS2V5Pzogc3RyaW5nO1xuXHR3b3Jrc3BhY2VJZD86IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnMoXG5cdF93b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBQYXJ0aWFsPFBvc3RtYW5PcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxQb3N0bWFuT3B0aW9ucz4+IHtcblx0aWYgKGNsaU9wdGlvbnMucG9zdG1hblByb3ZpZGVyICE9IG51bGwpIHJldHVybiB7fTtcblxuXHRjb25zdCBjaG9pY2VzID0gW1xuXHRcdHsgbGFiZWw6IFwibm9uZVwiIGFzIGNvbnN0LCBkZXNjcmlwdGlvbjogXCJza2lwXCIgfSxcblx0XHR7IGxhYmVsOiBcImxvY2FsXCIgYXMgY29uc3QsIGRlc2NyaXB0aW9uOiBcIndyaXRlIGNvbGxlY3Rpb24gKyBlbnZpcm9ubWVudCBmaWxlc1wiIH0sXG5cdFx0eyBsYWJlbDogXCJhcGlcIiBhcyBjb25zdCwgZGVzY3JpcHRpb246IFwid3JpdGUgZmlsZXMgYW5kIHVwbG9hZCB0byBQb3N0bWFuLmNvbVwiIH0sXG5cdF07XG5cdGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgcGljayhcblx0XHRcIlxcbiAgUG9zdG1hbjogXCIsXG5cdFx0Y2hvaWNlcyxcblx0XHQoYykgPT4gYCR7Yy5sYWJlbH0g4oCUICR7Yy5kZXNjcmlwdGlvbn1gLFxuXHQpO1xuXHRjb25zdCBwcm92aWRlciA9IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIjtcblxuXHRpZiAocHJvdmlkZXIgPT09IFwibm9uZVwiKSByZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibm9uZVwiIH07XG5cdGlmIChwcm92aWRlciA9PT0gXCJsb2NhbFwiKSByZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibG9jYWxcIiB9O1xuXG5cdC8vIGFwaTogY29sbGVjdCBBUEkga2V5ICsgd29ya3NwYWNlIHNlbGVjdGlvblxuXHRjb25zdCBhcGlLZXkgPVxuXHRcdHByb2Nlc3MuZW52LlBPU1RNQU5fQVBJX0tFWSA/P1xuXHRcdChhd2FpdCBpbXBvcnQoXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCIpLnRoZW4oKG0pID0+XG5cdFx0XHRtLmFzayhcIlxcbiAgUG9zdG1hbiBBUEkga2V5IChhcHAuZ2V0cG9zdG1hbi5jb20vc2V0dGluZ3MvbWUvYXBpLWtleXMpOiBcIiksXG5cdFx0KSk7XG5cblx0Y29uc3QgaGVhZGVycyA9IHsgXCJYLUFwaS1LZXlcIjogYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXHRjb25zdCB3c1JlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vd29ya3NwYWNlc1wiLCB7IGhlYWRlcnMgfSk7XG5cblx0aWYgKCF3c1Jlcy5vaykge1xuXHRcdGNvbnNvbGUuZXJyb3IoXCJcXG4gIFBvc3RtYW4gQVBJIGtleSBpbnZhbGlkIOKAlCBmYWxsaW5nIGJhY2sgdG8gbG9jYWwgZmlsZXMuXCIpO1xuXHRcdHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJsb2NhbFwiIH07XG5cdH1cblxuXHRjb25zdCB7IHdvcmtzcGFjZXMgfSA9IChhd2FpdCB3c1Jlcy5qc29uKCkpIGFzIHtcblx0XHR3b3Jrc3BhY2VzOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuXHR9O1xuXG5cdHR5cGUgV3NDaG9pY2UgPSB7IGxhYmVsOiBzdHJpbmc7IGlkOiBzdHJpbmcgfCBudWxsIH07XG5cdGNvbnN0IHdzQ2hvaWNlczogV3NDaG9pY2VbXSA9IFtcblx0XHR7IGxhYmVsOiBcIjxuZXcgd29ya3NwYWNlPlwiLCBpZDogbnVsbCB9LFxuXHRcdC4uLndvcmtzcGFjZXMubWFwKCh3KSA9PiAoeyBsYWJlbDogYCR7dy5uYW1lfSAoJHt3LnR5cGV9KWAsIGlkOiB3LmlkIH0pKSxcblx0XTtcblxuXHRjb25zdCB3c1BpY2tlZCA9IGF3YWl0IHBpY2soXCJcXG4gIFBvc3RtYW4gd29ya3NwYWNlOiBcIiwgd3NDaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cblx0bGV0IHdvcmtzcGFjZUlkOiBzdHJpbmc7XG5cdGlmICghd3NQaWNrZWQgfHwgd3NQaWNrZWQuaWQgPT09IG51bGwpIHtcblx0XHRjb25zdCB7IGFzayB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiKTtcblx0XHRjb25zdCB3c05hbWUgPSBhd2FpdCBhc2soYCAgV29ya3NwYWNlIG5hbWU6IGApO1xuXHRcdGNvbnN0IGNyZWF0ZVJlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vd29ya3NwYWNlc1wiLCB7XG5cdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0aGVhZGVycyxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgd29ya3NwYWNlOiB7IG5hbWU6IHdzTmFtZSwgdHlwZTogXCJwZXJzb25hbFwiIH0gfSksXG5cdFx0fSk7XG5cdFx0Y29uc3QgeyB3b3Jrc3BhY2U6IHdzIH0gPSAoYXdhaXQgY3JlYXRlUmVzLmpzb24oKSkgYXMgeyB3b3Jrc3BhY2U6IHsgaWQ6IHN0cmluZyB9IH07XG5cdFx0d29ya3NwYWNlSWQgPSB3cy5pZDtcblx0XHRjb25zb2xlLmxvZyhgICDinJMgV29ya3NwYWNlIGNyZWF0ZWQ6ICR7d3NOYW1lfWApO1xuXHR9IGVsc2Uge1xuXHRcdHdvcmtzcGFjZUlkID0gd3NQaWNrZWQuaWQ7XG5cdH1cblxuXHRyZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwiYXBpXCIsIGFwaUtleSwgd29ya3NwYWNlSWQgfTtcbn1cblxudHlwZSBBdXRoMEVudiA9IHtcblx0YXV0aDBEb21haW4/OiBzdHJpbmc7XG5cdGF1dGgwQXVkaWVuY2U/OiBzdHJpbmc7XG5cdGF1dGgwQ2xpZW50SWQ/OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBidWlsZENvbGxlY3Rpb24ocHJvamVjdE5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KTogdW5rbm93biB7XG5cdGNvbnN0IGF1dGhPYmogPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8ge1xuXHRcdFx0XHR0eXBlOiBcIm9hdXRoMlwiLFxuXHRcdFx0XHRvYXV0aDI6IFtcblx0XHRcdFx0XHR7IGtleTogXCJncmFudF90eXBlXCIsIHZhbHVlOiBcImF1dGhvcml6YXRpb25fY29kZV93aXRoX3BrY2VcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGtleTogXCJhdXRoVXJsXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJodHRwczovL3t7YXV0aDBEb21haW59fS9hdXRob3JpemU/YXVkaWVuY2U9e3thdXRoMEF1ZGllbmNlfX1cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRrZXk6IFwiYWNjZXNzVG9rZW5VcmxcIixcblx0XHRcdFx0XHRcdHZhbHVlOiBcImh0dHBzOi8ve3thdXRoMERvbWFpbn19L29hdXRoL3Rva2VuXCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2xpZW50SWRcIiwgdmFsdWU6IFwie3thdXRoMENsaWVudElkfX1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcInNjb3BlXCIsIHZhbHVlOiBcIm9wZW5pZCBwcm9maWxlIGVtYWlsXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJhZGRUb2tlblRvXCIsIHZhbHVlOiBcImhlYWRlclwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2hhbGxlbmdlQWxnb3JpdGhtXCIsIHZhbHVlOiBcIlMyNTZcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdHJldHVybiB7XG5cdFx0aW5mbzoge1xuXHRcdFx0bmFtZTogYCR7cHJvamVjdE5hbWV9IFdlYkFQSWAsXG5cdFx0XHRzY2hlbWE6IFwiaHR0cHM6Ly9zY2hlbWEuZ2V0cG9zdG1hbi5jb20vanNvbi9jb2xsZWN0aW9uL3YyLjEuMC9jb2xsZWN0aW9uLmpzb25cIixcblx0XHR9LFxuXHRcdC4uLihhdXRoT2JqID8geyBhdXRoOiBhdXRoT2JqIH0gOiB7fSksXG5cdFx0aXRlbTogW1xuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkhlbGxvXCIsXG5cdFx0XHRcdHJlcXVlc3Q6IHtcblx0XHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRcdFx0dXJsOiB7IHJhdzogXCJ7e2Jhc2VVcmx9fS9oZWxsb1wiLCBob3N0OiBbXCJ7e2Jhc2VVcmx9fVwiXSwgcGF0aDogW1wiaGVsbG9cIl0gfSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XSxcblx0fTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbnZpcm9ubWVudFlhbWwobmFtZTogc3RyaW5nLCBhdXRoPzogQXV0aDBFbnYpOiBzdHJpbmcge1xuXHRjb25zdCBhdXRoMFNlY3Rpb24gPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8gW1xuXHRcdFx0XHRcIiAgLSBrZXk6IGF1dGgwRG9tYWluXCIsXG5cdFx0XHRcdGAgICAgdmFsdWU6ICR7YXV0aC5hdXRoMERvbWFpbn1gLFxuXHRcdFx0XHRcIiAgLSBrZXk6IGF1dGgwQXVkaWVuY2VcIixcblx0XHRcdFx0YCAgICB2YWx1ZTogJyR7YXV0aC5hdXRoMEF1ZGllbmNlID8/IFwiXCJ9J2AsXG5cdFx0XHRcdFwiICAtIGtleTogYXV0aDBDbGllbnRJZFwiLFxuXHRcdFx0XHRgICAgIHZhbHVlOiAnJHthdXRoLmF1dGgwQ2xpZW50SWQgPz8gXCJcIn0nYCxcblx0XHRcdFx0XCIgICAgZGVzY3JpcHRpb246IENsaWVudCBJRCBvZiB0aGUgQXV0aDAgU1BBIGFwcGxpY2F0aW9uIHVzZWQgYnkgUG9zdG1hbiBmb3IgUEtDRSBhdXRoZW50aWNhdGlvblwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpICsgXCJcXG5cIlxuXHRcdDogXCJcIjtcblxuXHRyZXR1cm4gYG5hbWU6ICR7bmFtZX1cXG52YWx1ZXM6XFxuICAtIGtleTogYmFzZVVybFxcbiAgICB2YWx1ZTogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCdcXG4ke2F1dGgwU2VjdGlvbn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBQb3N0bWFuT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwibm9uZVwiKSByZXR1cm47XG5cblx0Y29uc3QgYXV0aENvbmZpZ01vZGVsID0gd29ya3NwYWNlLmdldE1vZGVsPEF1dGhDb25maWdNb2RlbD4oV0VMTF9LTk9XTl9GSUxFUy5BVVRIX0NPTkZJRyk7XG5cdGNvbnN0IGF1dGhDZmcgPSBhdXRoQ29uZmlnTW9kZWw/LmNvbmZpZztcblxuXHRsZXQgc3BhQ2xpZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwiYXBpXCIgJiYgb3B0aW9ucy5hcGlLZXkgJiYgYXV0aENmZz8uaXNzdWVyQmFzZVVybCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBhcHAgPSBhdXRoMENsaS5jcmVhdGVTcGFBcHAoXG5cdFx0XHRcdGAke3dvcmtzcGFjZS5uYW1lfSBQb3N0bWFuYCxcblx0XHRcdFx0XCJodHRwczovL29hdXRoLnBzdG1uLmlvL3YxL2NhbGxiYWNrXCIsXG5cdFx0XHQpO1xuXHRcdFx0c3BhQ2xpZW50SWQgPSBhcHAuY2xpZW50X2lkO1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBBdXRoMCBTUEEgYXBwIGNyZWF0ZWQgZm9yIFBvc3RtYW4gUEtDRVwiKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gY3JlYXRlIEF1dGgwIFNQQSBhcHAg4oCUIGNvbnRpbnVpbmcgd2l0aG91dCBpdC5cIik7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgYXV0aDBFbnY6IEF1dGgwRW52IHwgdW5kZWZpbmVkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybFxuXHRcdD8ge1xuXHRcdFx0XHRhdXRoMERvbWFpbjogYXV0aENmZy5pc3N1ZXJCYXNlVXJsLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgXCJcIiksXG5cdFx0XHRcdGF1dGgwQXVkaWVuY2U6IGF1dGhDZmcuYXVkaWVuY2UsXG5cdFx0XHRcdGF1dGgwQ2xpZW50SWQ6IHNwYUNsaWVudElkLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHByb2plY3ROYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGNvbGxlY3Rpb24gPSBidWlsZENvbGxlY3Rpb24ocHJvamVjdE5hbWUsIGF1dGgwRW52KTtcblx0Y29uc3QgZW52WWFtbCA9IGJ1aWxkRW52aXJvbm1lbnRZYW1sKGAke3Byb2plY3ROYW1lfSDigJQgTG9jYWxgLCBhdXRoMEVudik7XG5cblx0d29ya3NwYWNlLmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBgcG9zdG1hbi9lbnZpcm9ubWVudHMvJHtwcm9qZWN0TmFtZX0gXFx1MjAxNCBMb2NhbC5lbnZpcm9ubWVudC55YW1sYCxcblx0XHRcdFx0Y29udGVudDogZW52WWFtbCxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBgcG9zdG1hbi9jb2xsZWN0aW9ucy8ke3Byb2plY3ROYW1lfS5wb3N0bWFuX2NvbGxlY3Rpb24uanNvbmAsXG5cdFx0XHRcdGNvbnRlbnQ6IGAke0pTT04uc3RyaW5naWZ5KGNvbGxlY3Rpb24sIG51bGwsIDIpfVxcbmAsXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH0pO1xuXG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJhcGlcIiAmJiBvcHRpb25zLmFwaUtleSkge1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IG9wdGlvbnMuYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXG5cdFx0Y29uc3QgY29sUmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vY29sbGVjdGlvbnM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbGxlY3Rpb24gfSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGNvbFJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGNvbGxlY3Rpb24gdXBsb2FkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gdXBsb2FkIFBvc3RtYW4gY29sbGVjdGlvblwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnZWYXJzID0gW1xuXHRcdFx0eyBrZXk6IFwiYmFzZVVybFwiLCB2YWx1ZTogXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0Li4uKGF1dGgwRW52Py5hdXRoMERvbWFpblxuXHRcdFx0XHQ/IFtcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwRG9tYWluXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMERvbWFpbiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBBdWRpZW5jZVwiLCB2YWx1ZTogYXV0aDBFbnYuYXV0aDBBdWRpZW5jZSA/PyBcIlwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMENsaWVudElkXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMENsaWVudElkID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRdXG5cdFx0XHRcdDogW10pLFxuXHRcdF07XG5cdFx0Y29uc3QgZW52UmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vZW52aXJvbm1lbnRzP3dvcmtzcGFjZT0ke29wdGlvbnMud29ya3NwYWNlSWR9YCxcblx0XHRcdHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdGVudmlyb25tZW50OiB7IG5hbWU6IGAke3Byb2plY3ROYW1lfSDigJQgTG9jYWxgLCB2YWx1ZXM6IGVudlZhcnMgfSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGVudlJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGVudmlyb25tZW50IHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY29uc3QgUG9zdG1hbkZlYXR1cmU6IEZlYXR1cmU8UG9zdG1hbk9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuIl0sIm5hbWVzIjpbInBpY2siLCJXRUxMX0tOT1dOX0ZJTEVTIiwiYXV0aDBDbGkiLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJwb3N0bWFuUHJvdmlkZXIiLCJjaG9pY2VzIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsInNlbGVjdGVkIiwiYyIsInByb3ZpZGVyIiwiYXBpS2V5IiwicHJvY2VzcyIsImVudiIsIlBPU1RNQU5fQVBJX0tFWSIsInRoZW4iLCJtIiwiYXNrIiwiaGVhZGVycyIsIndzUmVzIiwiZmV0Y2giLCJvayIsImNvbnNvbGUiLCJlcnJvciIsIndvcmtzcGFjZXMiLCJqc29uIiwid3NDaG9pY2VzIiwiaWQiLCJtYXAiLCJ3IiwibmFtZSIsInR5cGUiLCJ3c1BpY2tlZCIsIndvcmtzcGFjZUlkIiwid3NOYW1lIiwiY3JlYXRlUmVzIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3b3Jrc3BhY2UiLCJ3cyIsImxvZyIsImJ1aWxkQ29sbGVjdGlvbiIsInByb2plY3ROYW1lIiwiYXV0aCIsImF1dGhPYmoiLCJhdXRoMERvbWFpbiIsIm9hdXRoMiIsImtleSIsInZhbHVlIiwidW5kZWZpbmVkIiwiaW5mbyIsInNjaGVtYSIsIml0ZW0iLCJyZXF1ZXN0IiwidXJsIiwicmF3IiwiaG9zdCIsInBhdGgiLCJidWlsZEVudmlyb25tZW50WWFtbCIsImF1dGgwU2VjdGlvbiIsImF1dGgwQXVkaWVuY2UiLCJhdXRoMENsaWVudElkIiwiam9pbiIsInNjYWZmb2xkIiwib3B0aW9ucyIsImF1dGhDb25maWdNb2RlbCIsImdldE1vZGVsIiwiQVVUSF9DT05GSUciLCJhdXRoQ2ZnIiwiY29uZmlnIiwic3BhQ2xpZW50SWQiLCJpc3N1ZXJCYXNlVXJsIiwiYXBwIiwiY3JlYXRlU3BhQXBwIiwiY2xpZW50X2lkIiwiYXV0aDBFbnYiLCJyZXBsYWNlIiwiYXVkaWVuY2UiLCJjb2xsZWN0aW9uIiwiZW52WWFtbCIsImFkZEZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiY29udGVudCIsImNvbFJlcyIsImVudlZhcnMiLCJlbmFibGVkIiwiZW52UmVzIiwiZW52aXJvbm1lbnQiLCJ2YWx1ZXMiLCJQb3N0bWFuRmVhdHVyZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsSUFBSSxRQUFRLHlCQUF5QjtBQUM5QyxTQUFTQyxnQkFBZ0IsUUFBUSx3QkFBd0I7QUFJekQsWUFBWUMsY0FBYyxpQkFBaUI7QUFRM0MsZUFBZUMsV0FDZEMsVUFBNkIsRUFDN0JDLFVBQW1DO0lBRW5DLElBQUlBLFdBQVdDLGVBQWUsSUFBSSxNQUFNLE9BQU8sQ0FBQztJQUVoRCxNQUFNQyxVQUFVO1FBQ2Y7WUFBRUMsT0FBTztZQUFpQkMsYUFBYTtRQUFPO1FBQzlDO1lBQUVELE9BQU87WUFBa0JDLGFBQWE7UUFBdUM7UUFDL0U7WUFBRUQsT0FBTztZQUFnQkMsYUFBYTtRQUF3QztLQUM5RTtJQUNELE1BQU1DLFdBQVcsTUFBTVYsS0FDdEIsaUJBQ0FPLFNBQ0EsQ0FBQ0ksSUFBTSxHQUFHQSxFQUFFSCxLQUFLLENBQUMsR0FBRyxFQUFFRyxFQUFFRixXQUFXLEVBQUU7SUFFdkMs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
537
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9wcm9tcHQuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoQ29uZmlnTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL2F1dGgtY29uZmlnLm1vZGVsLmpzXCI7XG5pbXBvcnQgKiBhcyBhdXRoMENsaSBmcm9tIFwiLi9hdXRoMC1jbGkuanNcIjtcblxuLyoqIFBvc3RtYW4gT0F1dGggY2FsbGJhY2sgVVJMcyAocG9wdXAgKyBcIkF1dGhvcml6ZSB1c2luZyBicm93c2VyXCIpLiAqL1xuY29uc3QgUE9TVE1BTl9DQUxMQkFDS1MgPSBbXG5cdFwiaHR0cHM6Ly9vYXV0aC5wc3Rtbi5pby92MS9jYWxsYmFja1wiLFxuXHRcImh0dHBzOi8vb2F1dGgucHN0bW4uaW8vdjEvYnJvd3Nlci1jYWxsYmFja1wiLFxuXSBhcyBjb25zdDtcblxuLyoqIFNjb3BlcyByZXF1ZXN0ZWQgZm9yIEF1dGgwIGFjY2VzcyB0b2tlbnMgKE9JREMgKyBIZWxsbyBDQVNMIHBlcm1pc3Npb25zKS4gKi9cbmNvbnN0IFBPU1RNQU5fU0NPUEVTID0gW1xuXHRcIm9wZW5pZFwiLFxuXHRcInByb2ZpbGVcIixcblx0XCJlbWFpbFwiLFxuXHRcInJlYWQ6SGVsbG9cIixcblx0XCJjcmVhdGU6SGVsbG9cIixcblx0XCJ1cGRhdGU6SGVsbG9cIixcblx0XCJkZWxldGU6SGVsbG9cIixcbl0uam9pbihcIiBcIik7XG5cbmV4cG9ydCB0eXBlIFBvc3RtYW5PcHRpb25zID0ge1xuXHRwb3N0bWFuUHJvdmlkZXI/OiBcImFwaVwiIHwgXCJsb2NhbFwiIHwgXCJub25lXCI7XG5cdGFwaUtleT86IHN0cmluZztcblx0d29ya3NwYWNlSWQ/OiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBnZXRPcHRpb25zKFxuXHRfd29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0Y2xpT3B0aW9uczogUGFydGlhbDxQb3N0bWFuT3B0aW9ucz4sXG4pOiBQcm9taXNlPFBhcnRpYWw8UG9zdG1hbk9wdGlvbnM+PiB7XG5cdGlmIChjbGlPcHRpb25zLnBvc3RtYW5Qcm92aWRlciAhPSBudWxsKSByZXR1cm4ge307XG5cblx0Y29uc3QgY2hvaWNlcyA9IFtcblx0XHR7IGxhYmVsOiBcIm5vbmVcIiBhcyBjb25zdCwgZGVzY3JpcHRpb246IFwic2tpcFwiIH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IFwibG9jYWxcIiBhcyBjb25zdCxcblx0XHRcdGRlc2NyaXB0aW9uOiBcIkxvY2FsIFZpZXcgLyBOYXRpdmUgR2l0IGZpbGVzIChubyBBUEkga2V5KVwiLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IFwiYXBpXCIgYXMgY29uc3QsXG5cdFx0XHRkZXNjcmlwdGlvbjogXCJhbHNvIHVwbG9hZCB0byBQb3N0bWFuLmNvbSAobmVlZHMgQVBJIGtleSlcIixcblx0XHR9LFxuXHRdO1xuXHRjb25zdCBzZWxlY3RlZCA9IGF3YWl0IHBpY2soXG5cdFx0XCJcXG4gIFBvc3RtYW46IFwiLFxuXHRcdGNob2ljZXMsXG5cdFx0KGMpID0+IGAke2MubGFiZWx9IOKAlCAke2MuZGVzY3JpcHRpb259YCxcblx0KTtcblx0Y29uc3QgcHJvdmlkZXIgPSBzZWxlY3RlZD8ubGFiZWwgPz8gXCJub25lXCI7XG5cblx0aWYgKHByb3ZpZGVyID09PSBcIm5vbmVcIikgcmV0dXJuIHsgcG9zdG1hblByb3ZpZGVyOiBcIm5vbmVcIiB9O1xuXHRpZiAocHJvdmlkZXIgPT09IFwibG9jYWxcIikgcmV0dXJuIHsgcG9zdG1hblByb3ZpZGVyOiBcImxvY2FsXCIgfTtcblxuXHRjb25zdCBhcGlLZXkgPVxuXHRcdHByb2Nlc3MuZW52LlBPU1RNQU5fQVBJX0tFWSA/P1xuXHRcdChhd2FpdCBpbXBvcnQoXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCIpLnRoZW4oKG0pID0+XG5cdFx0XHRtLmFzayhcIlxcbiAgUG9zdG1hbiBBUEkga2V5IChhcHAuZ2V0cG9zdG1hbi5jb20vc2V0dGluZ3MvbWUvYXBpLWtleXMpOiBcIiksXG5cdFx0KSk7XG5cblx0Y29uc3QgaGVhZGVycyA9IHsgXCJYLUFwaS1LZXlcIjogYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXHRjb25zdCB3c1JlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vd29ya3NwYWNlc1wiLCB7IGhlYWRlcnMgfSk7XG5cblx0aWYgKCF3c1Jlcy5vaykge1xuXHRcdGNvbnNvbGUuZXJyb3IoXCJcXG4gIFBvc3RtYW4gQVBJIGtleSBpbnZhbGlkIOKAlCBmYWxsaW5nIGJhY2sgdG8gbG9jYWwgZmlsZXMuXCIpO1xuXHRcdHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJsb2NhbFwiIH07XG5cdH1cblxuXHRjb25zdCB7IHdvcmtzcGFjZXMgfSA9IChhd2FpdCB3c1Jlcy5qc29uKCkpIGFzIHtcblx0XHR3b3Jrc3BhY2VzOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuXHR9O1xuXG5cdHR5cGUgV3NDaG9pY2UgPSB7IGxhYmVsOiBzdHJpbmc7IGlkOiBzdHJpbmcgfCBudWxsIH07XG5cdGNvbnN0IHdzQ2hvaWNlczogV3NDaG9pY2VbXSA9IFtcblx0XHR7IGxhYmVsOiBcIjxuZXcgd29ya3NwYWNlPlwiLCBpZDogbnVsbCB9LFxuXHRcdC4uLndvcmtzcGFjZXMubWFwKCh3KSA9PiAoeyBsYWJlbDogYCR7dy5uYW1lfSAoJHt3LnR5cGV9KWAsIGlkOiB3LmlkIH0pKSxcblx0XTtcblxuXHRjb25zdCB3c1BpY2tlZCA9IGF3YWl0IHBpY2soXCJcXG4gIFBvc3RtYW4gd29ya3NwYWNlOiBcIiwgd3NDaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cblx0bGV0IHdvcmtzcGFjZUlkOiBzdHJpbmc7XG5cdGlmICghd3NQaWNrZWQgfHwgd3NQaWNrZWQuaWQgPT09IG51bGwpIHtcblx0XHRjb25zdCB7IGFzayB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiKTtcblx0XHRjb25zdCB3c05hbWUgPSBhd2FpdCBhc2soYCAgV29ya3NwYWNlIG5hbWU6IGApO1xuXHRcdGNvbnN0IGNyZWF0ZVJlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vd29ya3NwYWNlc1wiLCB7XG5cdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0aGVhZGVycyxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgd29ya3NwYWNlOiB7IG5hbWU6IHdzTmFtZSwgdHlwZTogXCJwZXJzb25hbFwiIH0gfSksXG5cdFx0fSk7XG5cdFx0Y29uc3QgeyB3b3Jrc3BhY2U6IHdzIH0gPSAoYXdhaXQgY3JlYXRlUmVzLmpzb24oKSkgYXMgeyB3b3Jrc3BhY2U6IHsgaWQ6IHN0cmluZyB9IH07XG5cdFx0d29ya3NwYWNlSWQgPSB3cy5pZDtcblx0XHRjb25zb2xlLmxvZyhgICDinJMgV29ya3NwYWNlIGNyZWF0ZWQ6ICR7d3NOYW1lfWApO1xuXHR9IGVsc2Uge1xuXHRcdHdvcmtzcGFjZUlkID0gd3NQaWNrZWQuaWQ7XG5cdH1cblxuXHRyZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwiYXBpXCIsIGFwaUtleSwgd29ya3NwYWNlSWQgfTtcbn1cblxudHlwZSBBdXRoMEVudiA9IHtcblx0YXV0aDBEb21haW4/OiBzdHJpbmc7XG5cdGF1dGgwQXVkaWVuY2U/OiBzdHJpbmc7XG5cdGF1dGgwQ2xpZW50SWQ/OiBzdHJpbmc7XG59O1xuXG4vKiogdjIuMSBKU09OIOKAlCB1c2VkIGZvciBQb3N0bWFuLmNvbSBBUEkgdXBsb2FkIG9ubHkuICovXG5mdW5jdGlvbiBidWlsZENvbGxlY3Rpb25Kc29uKHByb2plY3ROYW1lOiBzdHJpbmcsIGF1dGg/OiBBdXRoMEVudik6IHVua25vd24ge1xuXHRjb25zdCBhdXRoT2JqID0gYXV0aD8uYXV0aDBEb21haW5cblx0XHQ/IHtcblx0XHRcdFx0dHlwZTogXCJvYXV0aDJcIixcblx0XHRcdFx0b2F1dGgyOiBbXG5cdFx0XHRcdFx0eyBrZXk6IFwiZ3JhbnRfdHlwZVwiLCB2YWx1ZTogXCJhdXRob3JpemF0aW9uX2NvZGVfd2l0aF9wa2NlXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRrZXk6IFwiYXV0aFVybFwiLFxuXHRcdFx0XHRcdFx0dmFsdWU6IFwiaHR0cHM6Ly97e2F1dGgwRG9tYWlufX0vYXV0aG9yaXplP2F1ZGllbmNlPXt7YXV0aDBBdWRpZW5jZX19XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0a2V5OiBcImFjY2Vzc1Rva2VuVXJsXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJodHRwczovL3t7YXV0aDBEb21haW59fS9vYXV0aC90b2tlblwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJzdHJpbmdcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHsga2V5OiBcImNsaWVudElkXCIsIHZhbHVlOiBcInt7YXV0aDBDbGllbnRJZH19XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJzY29wZVwiLCB2YWx1ZTogUE9TVE1BTl9TQ09QRVMsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJyZWRpcmVjdF91cmlcIiwgdmFsdWU6IFBPU1RNQU5fQ0FMTEJBQ0tTWzBdLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwidXNlQnJvd3NlclwiLCB2YWx1ZTogXCJ0cnVlXCIsIHR5cGU6IFwiYm9vbGVhblwiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiYWRkVG9rZW5Ub1wiLCB2YWx1ZTogXCJoZWFkZXJcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcImNoYWxsZW5nZUFsZ29yaXRobVwiLCB2YWx1ZTogXCJTMjU2XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJjbGllbnRfYXV0aGVudGljYXRpb25cIiwgdmFsdWU6IFwiYm9keVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2xpZW50U2VjcmV0XCIsIHZhbHVlOiBcIlwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwidG9rZW5OYW1lXCIsIHZhbHVlOiBgJHtwcm9qZWN0TmFtZX0gQWNjZXNzIFRva2VuYCwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IGhlbGxvVXJsID0gKHBhdGg6IHN0cmluZywgcmF3OiBzdHJpbmcpID0+ICh7XG5cdFx0cmF3OiBge3tiYXNlVXJsfX0ke3Jhd31gLFxuXHRcdGhvc3Q6IFtcInt7YmFzZVVybH19XCJdLFxuXHRcdHBhdGg6IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKSxcblx0fSk7XG5cblx0cmV0dXJuIHtcblx0XHRpbmZvOiB7XG5cdFx0XHRfcG9zdG1hbl9pZDogcmFuZG9tVVVJRCgpLFxuXHRcdFx0bmFtZTogYCR7cHJvamVjdE5hbWV9IFdlYkFQSWAsXG5cdFx0XHRzY2hlbWE6IFwiaHR0cHM6Ly9zY2hlbWEuZ2V0cG9zdG1hbi5jb20vanNvbi9jb2xsZWN0aW9uL3YyLjEuMC9jb2xsZWN0aW9uLmpzb25cIixcblx0XHRcdGRlc2NyaXB0aW9uOlxuXHRcdFx0XHRcIk9wZW4gdGhlIHByb2plY3Qgcm9vdCBpbiBQb3N0bWFuIExvY2FsIFZpZXcgKG5vdCB0aGUgcG9zdG1hbi8gZm9sZGVyKS4gXCIgK1xuXHRcdFx0XHRcIlNlbGVjdCB0aGUgTG9jYWwgZW52aXJvbm1lbnQsIHRoZW4gQXV0aG9yaXphdGlvbiDihpIgR2V0IE5ldyBBY2Nlc3MgVG9rZW4gKFBLQ0UpLlwiLFxuXHRcdH0sXG5cdFx0Li4uKGF1dGhPYmogPyB7IGF1dGg6IGF1dGhPYmogfSA6IHt9KSxcblx0XHRpdGVtOiBbXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiSGVsbG9cIixcblx0XHRcdFx0aXRlbTogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwiTGlzdCAoYW5vbnltb3VzKVwiLFxuXHRcdFx0XHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRcdFx0XHRhdXRoOiB7IHR5cGU6IFwibm9hdXRoXCIgfSxcblx0XHRcdFx0XHRcdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0XHRcdFx0XHR1cmw6IGhlbGxvVXJsKFwiaGVsbG9cIiwgXCIvaGVsbG9cIiksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCJHZXQgYnkgaWRcIixcblx0XHRcdFx0XHRcdHJlcXVlc3Q6IHtcblx0XHRcdFx0XHRcdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0XHRcdFx0XHR1cmw6IGhlbGxvVXJsKFwiaGVsbG8vOmlkXCIsIFwiL2hlbGxvLzppZFwiKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIkNyZWF0ZVwiLFxuXHRcdFx0XHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRcdFx0XHRoZWFkZXI6IFt7IGtleTogXCJDb250ZW50LVR5cGVcIiwgdmFsdWU6IFwiYXBwbGljYXRpb24vanNvblwiIH1dLFxuXHRcdFx0XHRcdFx0XHRib2R5OiB7XG5cdFx0XHRcdFx0XHRcdFx0bW9kZTogXCJyYXdcIixcblx0XHRcdFx0XHRcdFx0XHRyYXc6ICd7XFxuICBcIm1lc3NhZ2VcIjogXCJoZWxsb1wiXFxufVxcbicsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHVybDogaGVsbG9VcmwoXCJoZWxsb1wiLCBcIi9oZWxsb1wiKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIlVwZGF0ZVwiLFxuXHRcdFx0XHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRcdFx0XHRtZXRob2Q6IFwiUFVUXCIsXG5cdFx0XHRcdFx0XHRcdGhlYWRlcjogW3sga2V5OiBcIkNvbnRlbnQtVHlwZVwiLCB2YWx1ZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfV0sXG5cdFx0XHRcdFx0XHRcdGJvZHk6IHtcblx0XHRcdFx0XHRcdFx0XHRtb2RlOiBcInJhd1wiLFxuXHRcdFx0XHRcdFx0XHRcdHJhdzogJ3tcXG4gIFwibWVzc2FnZVwiOiBcInVwZGF0ZWRcIlxcbn1cXG4nLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR1cmw6IGhlbGxvVXJsKFwiaGVsbG8vOmlkXCIsIFwiL2hlbGxvLzppZFwiKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIkRlbGV0ZVwiLFxuXHRcdFx0XHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRcdFx0XHRtZXRob2Q6IFwiREVMRVRFXCIsXG5cdFx0XHRcdFx0XHRcdHVybDogaGVsbG9VcmwoXCJoZWxsby86aWRcIiwgXCIvaGVsbG8vOmlkXCIpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSxcblx0XHRdLFxuXHR9O1xufVxuXG5mdW5jdGlvbiB5YW1sUXVvdGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICgvWzoje31bXFxdLCYqP3w8Pj0hJUBgXS8udGVzdCh2YWx1ZSkgfHwgdmFsdWUuaW5jbHVkZXMoXCJcXG5cIikgfHwgdmFsdWUgPT09IFwiXCIpIHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLyoqIExvY2FsIFZpZXcgLyBOYXRpdmUgR2l0IGVudmlyb25tZW50IChZQU1MKS4gKi9cbmZ1bmN0aW9uIGJ1aWxkRW52aXJvbm1lbnRZYW1sKG5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KTogc3RyaW5nIHtcblx0Y29uc3QgdmFsdWVzOiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+ID0gW1xuXHRcdHsga2V5OiBcImJhc2VVcmxcIiwgdmFsdWU6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwXCIgfSxcblx0XTtcblx0aWYgKGF1dGg/LmF1dGgwRG9tYWluKSB7XG5cdFx0dmFsdWVzLnB1c2goXG5cdFx0XHR7IGtleTogXCJhdXRoMERvbWFpblwiLCB2YWx1ZTogYXV0aC5hdXRoMERvbWFpbiB9LFxuXHRcdFx0eyBrZXk6IFwiYXV0aDBBdWRpZW5jZVwiLCB2YWx1ZTogYXV0aC5hdXRoMEF1ZGllbmNlID8/IFwiXCIgfSxcblx0XHRcdHsga2V5OiBcImF1dGgwQ2xpZW50SWRcIiwgdmFsdWU6IGF1dGguYXV0aDBDbGllbnRJZCA/PyBcIlwiIH0sXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJhdXRoVXJsXCIsXG5cdFx0XHRcdHZhbHVlOiBgaHR0cHM6Ly8ke2F1dGguYXV0aDBEb21haW59L2F1dGhvcml6ZT9hdWRpZW5jZT0ke2F1dGguYXV0aDBBdWRpZW5jZSA/PyBcIlwifWAsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRrZXk6IFwiYWNjZXNzVG9rZW5VcmxcIixcblx0XHRcdFx0dmFsdWU6IGBodHRwczovLyR7YXV0aC5hdXRoMERvbWFpbn0vb2F1dGgvdG9rZW5gLFxuXHRcdFx0fSxcblx0XHRcdHsga2V5OiBcImNhbGxiYWNrVXJsXCIsIHZhbHVlOiBQT1NUTUFOX0NBTExCQUNLU1swXSB9LFxuXHRcdFx0eyBrZXk6IFwic2NvcGVcIiwgdmFsdWU6IFBPU1RNQU5fU0NPUEVTIH0sXG5cdFx0KTtcblx0fVxuXG5cdGNvbnN0IGxpbmVzID0gW2BuYW1lOiAke3lhbWxRdW90ZShuYW1lKX1gLCBcInZhbHVlczpcIl07XG5cdGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpIHtcblx0XHRsaW5lcy5wdXNoKGAgIC0ga2V5OiAke3Yua2V5fWApO1xuXHRcdGxpbmVzLnB1c2goYCAgICB2YWx1ZTogJHt5YW1sUXVvdGUodi52YWx1ZSl9YCk7XG5cdFx0bGluZXMucHVzaChcIiAgICBlbmFibGVkOiB0cnVlXCIpO1xuXHR9XG5cdHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbmA7XG59XG5cbi8qKiBMb2NhbCBWaWV3IC8gTmF0aXZlIEdpdCBjb2xsZWN0aW9uICh2MyBtdWx0aS1maWxlIFlBTUwpLiAqL1xuZnVuY3Rpb24gYnVpbGRMb2NhbFZpZXdGaWxlcyhcblx0cHJvamVjdE5hbWU6IHN0cmluZyxcblx0YXV0aD86IEF1dGgwRW52LFxuKTogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT4ge1xuXHRjb25zdCBjb2xsZWN0aW9uRGlyID0gYHBvc3RtYW4vY29sbGVjdGlvbnMvJHtwcm9qZWN0TmFtZX0gV2ViQVBJYDtcblx0Y29uc3QgZmlsZXM6IEFycmF5PHsgZmlsZVBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0+ID0gW107XG5cblx0Ly8gUG9zdG1hbiBMb2NhbCBWaWV3IHN0b3JlcyBPQXV0aCB1bmRlciBhdXRoW10uY3JlZGVudGlhbHMgKG5vdCB0aGUgdjIuMSBvYXV0aDIgYXJyYXkpLlxuXHQvLyBVc2UgY29uY3JldGUgaHR0cHMgVVJMcyDigJQgZW1wdHkgQXV0aCBVUkwgeWllbGRzIFwiSW52YWxpZCBwcm90b2NvbCBmb3IgYXV0aCBVUkxcIi5cblx0Y29uc3QgYXV0aEJsb2NrID0gYXV0aD8uYXV0aDBEb21haW5cblx0XHQ/IFtcblx0XHRcdFx0XCJhdXRoOlwiLFxuXHRcdFx0XHRgICAtIGlkOiAke3JhbmRvbVVVSUQoKX1gLFxuXHRcdFx0XHRcIiAgICB0eXBlOiBvYXV0aDJcIixcblx0XHRcdFx0XCIgICAgbmFtZTogT0F1dGggMi4wXCIsXG5cdFx0XHRcdFwiICAgIGNyZWRlbnRpYWxzOlwiLFxuXHRcdFx0XHRcIiAgICAgIGFkZFRva2VuVG86IGhlYWRlclwiLFxuXHRcdFx0XHRcIiAgICAgIGdyYW50X3R5cGU6IGF1dGhvcml6YXRpb25fY29kZV93aXRoX3BrY2VcIixcblx0XHRcdFx0YCAgICAgIGF1dGhVcmw6IGh0dHBzOi8vJHthdXRoLmF1dGgwRG9tYWlufS9hdXRob3JpemU/YXVkaWVuY2U9JHthdXRoLmF1dGgwQXVkaWVuY2UgPz8gXCJcIn1gLFxuXHRcdFx0XHRgICAgICAgYWNjZXNzVG9rZW5Vcmw6IGh0dHBzOi8vJHthdXRoLmF1dGgwRG9tYWlufS9vYXV0aC90b2tlbmAsXG5cdFx0XHRcdGAgICAgICBjbGllbnRJZDogJHt5YW1sUXVvdGUoYXV0aC5hdXRoMENsaWVudElkID8/IFwiXCIpfWAsXG5cdFx0XHRcdGAgICAgICBzY29wZTogJHt5YW1sUXVvdGUoUE9TVE1BTl9TQ09QRVMpfWAsXG5cdFx0XHRcdGAgICAgICByZWRpcmVjdF91cmk6ICR7UE9TVE1BTl9DQUxMQkFDS1NbMF19YCxcblx0XHRcdFx0XCIgICAgICB1c2VCcm93c2VyOiB0cnVlXCIsXG5cdFx0XHRcdFwiICAgICAgY2hhbGxlbmdlQWxnb3JpdGhtOiBTMjU2XCIsXG5cdFx0XHRcdC8vIFNQQSBwdWJsaWMgY2xpZW50OiBBdXRoMCB0b2tlbiBlbmRwb2ludCByZWplY3RzIEJhc2ljIGF1dGggKGZlYWNmdCBVbmF1dGhvcml6ZWQpLlxuXHRcdFx0XHRcIiAgICAgIGNsaWVudF9hdXRoZW50aWNhdGlvbjogYm9keVwiLFxuXHRcdFx0XHQnICAgICAgY2xpZW50U2VjcmV0OiBcIlwiJyxcblx0XHRcdFx0YCAgICAgIHRva2VuTmFtZTogJHt5YW1sUXVvdGUoYCR7cHJvamVjdE5hbWV9IEFjY2VzcyBUb2tlbmApfWAsXG5cdFx0XHRcdFwiXCIsXG5cdFx0XHRdLmpvaW4oXCJcXG5cIilcblx0XHQ6IFwiXCI7XG5cblx0ZmlsZXMucHVzaCh7XG5cdFx0ZmlsZVBhdGg6IGAke2NvbGxlY3Rpb25EaXJ9Ly5yZXNvdXJjZXMvZGVmaW5pdGlvbi55YW1sYCxcblx0XHRjb250ZW50OiBbXG5cdFx0XHRcIiRraW5kOiBjb2xsZWN0aW9uXCIsXG5cdFx0XHRgbmFtZTogJHt5YW1sUXVvdGUoYCR7cHJvamVjdE5hbWV9IFdlYkFQSWApfWAsXG5cdFx0XHRcInNjaGVtYVZlcnNpb246ICczLjAnXCIsXG5cdFx0XHRcImRlc2NyaXB0aW9uOiA+LVwiLFxuXHRcdFx0XCIgIE9wZW4gdGhpcyBwcm9qZWN0IHJvb3QgaW4gUG9zdG1hbiBMb2NhbCBWaWV3IChGaWxlcyDihpIgT3BlbiBmb2xkZXIpLlwiLFxuXHRcdFx0XCIgIFNlbGVjdCB0aGUgTG9jYWwgZW52aXJvbm1lbnQsIHRoZW4gQXV0aG9yaXphdGlvbiDihpIgR2V0IE5ldyBBY2Nlc3MgVG9rZW4gKFBLQ0UpLlwiLFxuXHRcdFx0YXV0aEJsb2NrLFxuXHRcdF1cblx0XHRcdC5maWx0ZXIoKGwpID0+IGwgIT09IHVuZGVmaW5lZClcblx0XHRcdC5qb2luKFwiXFxuXCIpXG5cdFx0XHQucmVwbGFjZSgvXFxuKyQvLCBcIlxcblwiKSxcblx0fSk7XG5cblx0ZmlsZXMucHVzaCh7XG5cdFx0ZmlsZVBhdGg6IGAke2NvbGxlY3Rpb25EaXJ9L0hlbGxvLy5yZXNvdXJjZXMvZGVmaW5pdGlvbi55YW1sYCxcblx0XHRjb250ZW50OiBbXCIka2luZDogZm9sZGVyXCIsIFwibmFtZTogSGVsbG9cIiwgXCJvcmRlcjogMTAwMFwiLCBcIlwiXS5qb2luKFwiXFxuXCIpLFxuXHR9KTtcblxuXHRjb25zdCByZXF1ZXN0czogQXJyYXk8e1xuXHRcdGZpbGU6IHN0cmluZztcblx0XHR5YW1sOiBzdHJpbmc7XG5cdH0+ID0gW1xuXHRcdHtcblx0XHRcdGZpbGU6IFwiTGlzdCAoYW5vbnltb3VzKS5yZXF1ZXN0LnlhbWxcIixcblx0XHRcdHlhbWw6IFtcblx0XHRcdFx0XCIka2luZDogaHR0cC1yZXF1ZXN0XCIsXG5cdFx0XHRcdFwibmFtZTogTGlzdCAoYW5vbnltb3VzKVwiLFxuXHRcdFx0XHRcIm1ldGhvZDogR0VUXCIsXG5cdFx0XHRcdCd1cmw6IFwie3tiYXNlVXJsfX0vaGVsbG9cIicsXG5cdFx0XHRcdFwiYXV0aDpcIixcblx0XHRcdFx0XCIgIHR5cGU6IG5vYXV0aFwiLFxuXHRcdFx0XHRcIm9yZGVyOiAxMDAwXCIsXG5cdFx0XHRcdFwiXCIsXG5cdFx0XHRdLmpvaW4oXCJcXG5cIiksXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRmaWxlOiBcIkdldCBieSBpZC5yZXF1ZXN0LnlhbWxcIixcblx0XHRcdHlhbWw6IFtcblx0XHRcdFx0XCIka2luZDogaHR0cC1yZXF1ZXN0XCIsXG5cdFx0XHRcdFwibmFtZTogR2V0IGJ5IGlkXCIsXG5cdFx0XHRcdFwibWV0aG9kOiBHRVRcIixcblx0XHRcdFx0J3VybDogXCJ7e2Jhc2VVcmx9fS9oZWxsby86aWRcIicsXG5cdFx0XHRcdFwib3JkZXI6IDIwMDBcIixcblx0XHRcdFx0XCJcIixcblx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGZpbGU6IFwiQ3JlYXRlLnJlcXVlc3QueWFtbFwiLFxuXHRcdFx0eWFtbDogW1xuXHRcdFx0XHRcIiRraW5kOiBodHRwLXJlcXVlc3RcIixcblx0XHRcdFx0XCJuYW1lOiBDcmVhdGVcIixcblx0XHRcdFx0XCJtZXRob2Q6IFBPU1RcIixcblx0XHRcdFx0J3VybDogXCJ7e2Jhc2VVcmx9fS9oZWxsb1wiJyxcblx0XHRcdFx0XCJoZWFkZXJzOlwiLFxuXHRcdFx0XHRcIiAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFwiYm9keTpcIixcblx0XHRcdFx0XCIgIHR5cGU6IGpzb25cIixcblx0XHRcdFx0XCIgIGNvbnRlbnQ6IHwtXCIsXG5cdFx0XHRcdFwiICAgIHtcIixcblx0XHRcdFx0JyAgICAgIFwibWVzc2FnZVwiOiBcImhlbGxvXCInLFxuXHRcdFx0XHRcIiAgICB9XCIsXG5cdFx0XHRcdFwib3JkZXI6IDMwMDBcIixcblx0XHRcdFx0XCJcIixcblx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGZpbGU6IFwiVXBkYXRlLnJlcXVlc3QueWFtbFwiLFxuXHRcdFx0eWFtbDogW1xuXHRcdFx0XHRcIiRraW5kOiBodHRwLXJlcXVlc3RcIixcblx0XHRcdFx0XCJuYW1lOiBVcGRhdGVcIixcblx0XHRcdFx0XCJtZXRob2Q6IFBVVFwiLFxuXHRcdFx0XHQndXJsOiBcInt7YmFzZVVybH19L2hlbGxvLzppZFwiJyxcblx0XHRcdFx0XCJoZWFkZXJzOlwiLFxuXHRcdFx0XHRcIiAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFwiYm9keTpcIixcblx0XHRcdFx0XCIgIHR5cGU6IGpzb25cIixcblx0XHRcdFx0XCIgIGNvbnRlbnQ6IHwtXCIsXG5cdFx0XHRcdFwiICAgIHtcIixcblx0XHRcdFx0JyAgICAgIFwibWVzc2FnZVwiOiBcInVwZGF0ZWRcIicsXG5cdFx0XHRcdFwiICAgIH1cIixcblx0XHRcdFx0XCJvcmRlcjogNDAwMFwiLFxuXHRcdFx0XHRcIlwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0ZmlsZTogXCJEZWxldGUucmVxdWVzdC55YW1sXCIsXG5cdFx0XHR5YW1sOiBbXG5cdFx0XHRcdFwiJGtpbmQ6IGh0dHAtcmVxdWVzdFwiLFxuXHRcdFx0XHRcIm5hbWU6IERlbGV0ZVwiLFxuXHRcdFx0XHRcIm1ldGhvZDogREVMRVRFXCIsXG5cdFx0XHRcdCd1cmw6IFwie3tiYXNlVXJsfX0vaGVsbG8vOmlkXCInLFxuXHRcdFx0XHRcIm9yZGVyOiA1MDAwXCIsXG5cdFx0XHRcdFwiXCIsXG5cdFx0XHRdLmpvaW4oXCJcXG5cIiksXG5cdFx0fSxcblx0XTtcblxuXHRmb3IgKGNvbnN0IHIgb2YgcmVxdWVzdHMpIHtcblx0XHRmaWxlcy5wdXNoKHtcblx0XHRcdGZpbGVQYXRoOiBgJHtjb2xsZWN0aW9uRGlyfS9IZWxsby8ke3IuZmlsZX1gLFxuXHRcdFx0Y29udGVudDogci55YW1sLFxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIGZpbGVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBQb3N0bWFuT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwibm9uZVwiIHx8IG9wdGlvbnMucG9zdG1hblByb3ZpZGVyID09IG51bGwpIHJldHVybjtcblxuXHRjb25zdCBhdXRoQ29uZmlnTW9kZWwgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8QXV0aENvbmZpZ01vZGVsPihXRUxMX0tOT1dOX0ZJTEVTLkFVVEhfQ09ORklHKTtcblx0Y29uc3QgYXV0aENmZyA9IGF1dGhDb25maWdNb2RlbD8uY29uZmlnO1xuXG5cdGxldCBzcGFDbGllbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdGlmIChhdXRoQ2ZnPy5pc3N1ZXJCYXNlVXJsKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGFwcCA9IGF1dGgwQ2xpLmVuc3VyZVNwYUFwcChgJHt3b3Jrc3BhY2UubmFtZX0gUG9zdG1hbmAsIFsuLi5QT1NUTUFOX0NBTExCQUNLU10pO1xuXHRcdFx0c3BhQ2xpZW50SWQgPSBhcHAuY2xpZW50X2lkO1xuXHRcdFx0Y29uc29sZS5sb2coXG5cdFx0XHRcdGFwcC5yZXVzZWRcblx0XHRcdFx0XHQ/IGAgIOKckyBSZXVzaW5nIEF1dGgwIFNQQSBhcHAgZm9yIFBvc3RtYW4gUEtDRSAoJHtzcGFDbGllbnRJZH0pYFxuXHRcdFx0XHRcdDogYCAg4pyTIEF1dGgwIFNQQSBhcHAgY3JlYXRlZCBmb3IgUG9zdG1hbiBQS0NFICgke3NwYUNsaWVudElkfSlgLFxuXHRcdFx0KTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF1dGgwQ2xpLmVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQoYXV0aDBDbGkuREJfQ09OTkVDVElPTl9OQU1FLCBzcGFDbGllbnRJZCk7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGAgIOKckyBFbmFibGVkICR7YXV0aDBDbGkuREJfQ09OTkVDVElPTl9OQU1FfSBvbiBQb3N0bWFuIFNQQWApO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcdFx0YCAg4pyXIEZhaWxlZCB0byBlbmFibGUgREIgY29ubmVjdGlvbiBvbiBTUEE6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycn1gLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0YCAg4pyXIEZhaWxlZCB0byBlbnN1cmUgQXV0aDAgU1BBIGFwcCDigJQgc2V0IGF1dGgwQ2xpZW50SWQgaW4gdGhlIGVudmlyb25tZW50OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnJ9YCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgYXV0aDBFbnY6IEF1dGgwRW52IHwgdW5kZWZpbmVkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybFxuXHRcdD8ge1xuXHRcdFx0XHRhdXRoMERvbWFpbjogYXV0aENmZy5pc3N1ZXJCYXNlVXJsLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgXCJcIiksXG5cdFx0XHRcdGF1dGgwQXVkaWVuY2U6IGF1dGhDZmcuYXVkaWVuY2UsXG5cdFx0XHRcdGF1dGgwQ2xpZW50SWQ6IHNwYUNsaWVudElkLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHByb2plY3ROYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGVudk5hbWUgPSBgJHtwcm9qZWN0TmFtZX0gTG9jYWxgO1xuXHRjb25zdCBsb2NhbEZpbGVzID0gYnVpbGRMb2NhbFZpZXdGaWxlcyhwcm9qZWN0TmFtZSwgYXV0aDBFbnYpO1xuXHRjb25zdCBlbnZZYW1sID0gYnVpbGRFbnZpcm9ubWVudFlhbWwoZW52TmFtZSwgYXV0aDBFbnYpO1xuXG5cdHdvcmtzcGFjZS5hZGRGaWxlKHtcblx0XHRmaWxlczogKCkgPT4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCIucG9zdG1hbi9yZXNvdXJjZXMueWFtbFwiLFxuXHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XCIjIE9wZW4gdGhpcyBwcm9qZWN0IHJvb3QgaW4gUG9zdG1hbiAoRmlsZXMg4oaSIE9wZW4gZm9sZGVyKSwgbm90IHRoZSBwb3N0bWFuLyBzdWJmb2xkZXIuXCIsXG5cdFx0XHRcdFx0XCIjIFBvc3RtYW4gZmlsbHMgd29ya3NwYWNlLmlkIHdoZW4geW91IGNvbm5lY3QgTG9jYWwgVmlldy5cIixcblx0XHRcdFx0XHRcIiNcIixcblx0XHRcdFx0XHRcIiMgQWxsIHJlc291cmNlcyB1bmRlciBwb3N0bWFuLyBhcmUgcmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5LlwiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBgcG9zdG1hbi9lbnZpcm9ubWVudHMvJHtwcm9qZWN0TmFtZX0tTG9jYWwuZW52aXJvbm1lbnQueWFtbGAsXG5cdFx0XHRcdGNvbnRlbnQ6IGVudllhbWwsXG5cdFx0XHR9LFxuXHRcdFx0Li4ubG9jYWxGaWxlcyxcblx0XHRdLFxuXHR9KTtcblxuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwiYXBpXCIgJiYgb3B0aW9ucy5hcGlLZXkpIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uID0gYnVpbGRDb2xsZWN0aW9uSnNvbihwcm9qZWN0TmFtZSwgYXV0aDBFbnYpO1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IG9wdGlvbnMuYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXG5cdFx0Y29uc3QgY29sUmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vY29sbGVjdGlvbnM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbGxlY3Rpb24gfSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGNvbFJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGNvbGxlY3Rpb24gdXBsb2FkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gdXBsb2FkIFBvc3RtYW4gY29sbGVjdGlvblwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnZWYWx1ZXMgPSBbXG5cdFx0XHR7IGtleTogXCJiYXNlVXJsXCIsIHZhbHVlOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHQuLi4oYXV0aDBFbnY/LmF1dGgwRG9tYWluXG5cdFx0XHRcdD8gW1xuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBEb21haW5cIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwRG9tYWluLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMEF1ZGllbmNlXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMEF1ZGllbmNlID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwQ2xpZW50SWRcIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwQ2xpZW50SWQgPz8gXCJcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdF1cblx0XHRcdFx0OiBbXSksXG5cdFx0XTtcblx0XHRjb25zdCBlbnZSZXMgPSBhd2FpdCBmZXRjaChcblx0XHRcdGBodHRwczovL2FwaS5nZXRwb3N0bWFuLmNvbS9lbnZpcm9ubWVudHM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0ZW52aXJvbm1lbnQ6IHsgbmFtZTogZW52TmFtZSwgdmFsdWVzOiBlbnZWYWx1ZXMgfSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGVudlJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGVudmlyb25tZW50IHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY29uc3QgUG9zdG1hbkZlYXR1cmU6IEZlYXR1cmU8UG9zdG1hbk9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuZXhwb3J0IHsgUE9TVE1BTl9DQUxMQkFDS1MsIFBPU1RNQU5fU0NPUEVTIH07XG4iXSwibmFtZXMiOlsicmFuZG9tVVVJRCIsInBpY2siLCJXRUxMX0tOT1dOX0ZJTEVTIiwiYXV0aDBDbGkiLCJQT1NUTUFOX0NBTExCQUNLUyIsIlBPU1RNQU5fU0NPUEVTIiwiam9pbiIsImdldE9wdGlvbnMiLCJfd29ya3NwYWNlIiwiY2xpT3B0aW9ucyIsInBvc3RtYW5Qcm92aWRlciIsImNob2ljZXMiLCJsYWJlbCIsImRlc2NyaXB0aW9uIiwic2VsZWN0ZWQiLCJjIiwicHJvdmlkZXIiLCJhcGlLZXkiLCJwcm9jZXNzIiwiZW52IiwiUE9TVE1BTl9BUElfS0VZIiwidGhlbiIsIm0iLCJhc2siLCJoZWFkZXJzIiwid3NSZXMiLCJmZXRjaCIsIm9rIiwiY29uc29sZSIsImVycm9yIiwid29ya3NwYWNlcyIsImpzb24iLCJ3c0Nob2ljZXMiLCJpZCIsIm1hcCIsInciLCJuYW1lIiwidHlwZSIsIndzUGlja2VkIiwid29ya3NwYWNlSWQiLCJ3c05hbWUiLCJjcmVhdGVSZXMiLCJtZXRob2QiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsIndvcmtzcGFjZSIsIndzIiwibG9nIiwiYnVpbGRDb2xsZWN0aW9uSnNvbiIsInByb2plY3ROYW1lIiwiYXV0aCIsImF1dGhPYmoiLCJhdXRoMERvbWFpbiIsIm9hdXRoMiIsImtleSIsInZhbHVlIiwidW5kZWZpbmVkIiwiaGVsbG9VcmwiLCJwYXRoIiwicmF3IiwiaG9zdCIsInNwbGl0IiwiZmlsdGVyIiwiQm9vbGVhbiIsImluZm8iLCJfcG9zdG1hbl9pZCIsInNjaGVtYSIsIml0ZW0iLCJyZXF1ZXN0IiwidXJsIiwiaGVhZGVyIiwibW9kZSIsInlhbWxRdW90ZSIsInRlc3QiLCJpbmNsdWRlcyIsImJ1aWxkRW52aXJvbm1lbnRZYW1sIiwidmFsdWVzIiwicHVzaCIsImF1dGgwQXVkaWVuY2UiLCJhdXRoMENsaWVudElkIiwibGluZXMiLCJ2IiwiYnVpbGRMb2NhbFZpZXdGaWxlcyIsImNvbGxlY3Rpb25EaXIiLCJmaWxlcyIsImF1dGhCbG9jayIsImZpbGVQYXRoIiwiY29udGVudCIsImwiLCJyZXBsYWNlIiwicmVxdWVzdHMiLCJmaWxlIiwieWFtbCIsInIiLCJzY2FmZm9sZCIsIm9wdGlvbnMiLCJhdXRoQ29uZmlnTW9kZWwiLCJnZXRNb2RlbCIsIkFVVEhfQ09ORklHIiwiYXV0aENmZyIsImNvbmZpZyIsInNwYUNsaWVudElkIiwiaXNzdWVyQmFzZVVybCIsImFwcCIsImVuc3VyZVNwYUFwcCIsImNsaWVudF9pZCIsInJldXNlZCIsImVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQiLCJEQl9DT05ORUNUSU9OX05BTUUiLCJlcnIiLCJFcnJvciIsIm1lc3NhZ2UiLCJhdXRoMEVudiIsImF1ZGllbmNlIiwiZW52TmFtZSIsImxvY2FsRmlsZXMiLCJlbnZZYW1sIiwiYWRkRmlsZSIsImNvbGxlY3Rpb24iLCJjb2xSZXMiLCJlbnZWYWx1ZXMiLCJlbmFibGVkIiwiZW52UmVzIiwiZW52aXJvbm1lbnQiLCJQb3N0bWFuRmVhdHVyZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxRQUFRLGNBQWM7QUFDekMsU0FBU0MsSUFBSSxRQUFRLHlCQUF5QjtBQUM5QyxTQUFTQyxnQkFBZ0IsUUFBUSx3QkFBd0I7QUFJekQsWUFBWUMsY0FBYyxpQkFBaUI7QUFFM0MscUVBQXFFLEdBQ3JFLE1BQU1DLG9CQUFvQjtJQUN6QjtJQUNBO0NBQ0E7QUFFRCw4RUFBOEUsR0FDOUUsTUFBTUMsaUJBQWlCO0lBQ3RCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0NBQ0EsQ0FBQ0MsSUFBSSxDQUFDO0FBUVAsZUFBZUMsV0FDZEMsVUFBNkIsRUFDN0JDLFVBQW1DO0lBRW5DLElBQUlBLFdBQVdDLGVBQWUsSUFBSSxNQUFNLE9BQU8sQ0FBQztJQUVoRCxNQUFNQyxVQUFVO1FBQ2Y7WUFBRUMsT0FBTztZQUFpQkMsYUFBYTtRQUFPO1FBQzlDO1lBQ0NELE9BQU87WUFDUEMsYUFBYTtRQUNkO1FBQ0E7WUFDQ0Qs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
@@ -31,6 +31,9 @@ import { CREATE_VERSION } from "../../version.js";
31
31
  version: "0.0.1",
32
32
  type: "module",
33
33
  main: "src/main.ts",
34
+ scripts: {
35
+ lint: "biome check --write ."
36
+ },
34
37
  dependencies: {
35
38
  ...this._dependencies
36
39
  }
@@ -49,4 +52,4 @@ import { CREATE_VERSION } from "../../version.js";
49
52
  }
50
53
  }
51
54
 
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hcGktcGFja2FnZS1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5pbXBvcnQgeyBDUkVBVEVfVkVSU0lPTiB9IGZyb20gXCIuLi8uLi92ZXJzaW9uLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgYHByb2plY3RzL2FwaS9wYWNrYWdlLmpzb25gLlxuICpcbiAqIFN0YXJ0cyB3aXRoIHRoZSBjb3JlIGNvcnRleCArIGNydWNpYmxlIGRlcHMuIEZlYXR1cmVzIGNhbiBjYWxsXG4gKiBgYWRkRGVwZW5kZW5jeWAgLyBgYWRkRGV2RGVwZW5kZW5jeWAgdG8gZXh0ZW5kLlxuICovXG5leHBvcnQgY2xhc3MgQXBpUGFja2FnZUpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuQVBJX1BBQ0tBR0VfSlNPTjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9kZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHByaXZhdGUgcmVhZG9ubHkgX2RldkRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb2plY3ROYW1lOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9jcnVjaWJsZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGFkZERlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZERldkRlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXZEZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgcGtnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcblx0XHRcdG5hbWU6IGBAJHt0aGlzLnByb2plY3ROYW1lfS9hcGlgLFxuXHRcdFx0dmVyc2lvbjogXCIwLjAuMVwiLFxuXHRcdFx0dHlwZTogXCJtb2R1bGVcIixcblx0XHRcdG1haW46IFwic3JjL21haW4udHNcIixcblx0XHRcdGRlcGVuZGVuY2llczogeyAuLi50aGlzLl9kZXBlbmRlbmNpZXMgfSxcblx0XHR9O1xuXHRcdGlmIChPYmplY3Qua2V5cyh0aGlzLl9kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdHBrZy5kZXZEZXBlbmRlbmNpZXMgPSB7IC4uLnRoaXMuX2RldkRlcGVuZGVuY2llcyB9O1xuXHRcdH1cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJwYWNrYWdlLmpzb25cIixcblx0XHRcdFx0Y29udGVudDogSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIldFTExfS05PV05fRklMRVMiLCJDUkVBVEVfVkVSU0lPTiIsIkFwaVBhY2thZ2VKc29uIiwia2V5IiwiQVBJX1BBQ0tBR0VfSlNPTiIsIl9kZXBlbmRlbmNpZXMiLCJfZGV2RGVwZW5kZW5jaWVzIiwicHJvamVjdE5hbWUiLCJhZGREZXBlbmRlbmN5IiwibmFtZSIsInZlcnNpb24iLCJhZGREZXZEZXBlbmRlbmN5IiwiZmlsZXMiLCJwa2ciLCJ0eXBlIiwibWFpbiIsImRlcGVuZGVuY2llcyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJkZXZEZXBlbmRlbmNpZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSx3QkFBd0I7QUFFekQsU0FBU0MsY0FBYyxRQUFRLG1CQUFtQjtBQUVsRDs7Ozs7Q0FLQyxHQUNELE9BQU8sTUFBTUM7O0lBQ0lDLE1BQU1ILGlCQUFpQkksZ0JBQWdCLENBQUM7SUFFdkNDLGNBQXNDO0lBQ3RDQyxtQkFBMkMsQ0FBQyxFQUFFO0lBRS9ELFlBQW1CLEFBQWlCQyxXQUFtQixDQUFFO2FBQXJCQSxjQUFBQTtRQUNuQyxJQUFJLENBQUNGLGFBQWEsR0FBRztZQUNwQixvQkFBb0JKO1lBQ3BCLHNCQUFzQkE7UUFDdkI7SUFDRDtJQUVPTyxjQUFjQyxJQUFZLEVBQUVDLE9BQWUsRUFBUTtRQUN6RCxJQUFJLENBQUNMLGFBQWEsQ0FBQ0ksS0FBSyxHQUFHQztRQUMzQixPQUFPLElBQUk7SUFDWjtJQUVPQyxpQkFBaUJGLElBQVksRUFBRUMsT0FBZSxFQUFRO1FBQzVELElBQUksQ0FBQ0osZ0JBQWdCLENBQUNHLEtBQUssR0FBR0M7UUFDOUIsT0FBTyxJQUFJO0lBQ1o7SUFFT0UsUUFBc0I7UUFDNUIsTUFBTUMsTUFBK0I7WUFDcENKLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDRixXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2hDRyxTQUFTO1lBQ1RJLE1BQU07WUFDTkMsTUFBTTtZQUNOQyxjQUFjO2dCQUFFLEdBQUcsSUFBSSxDQUFDWCxhQUFhO1lBQUM7UUFDdkM7UUFDQSxJQUFJWSxPQUFPQyxJQUFJLENBQUMsSUFBSSxDQUFDWixnQkFBZ0IsRUFBRWEsTUFBTSxHQUFHLEdBQUc7WUFDbEROLElBQUlPLGVBQWUsR0FBRztnQkFBRSxHQUFHLElBQUksQ0FBQ2QsZ0JBQWdCO1lBQUM7UUFDbEQ7UUFDQSxPQUFPO1lBQ047Z0JBQ0NlLFVBQVU7Z0JBQ1ZDLFNBQVNDLEtBQUtDLFNBQVMsQ0FBQ1gsS0FBSyxNQUFNO1lBQ3BDO1NBQ0E7SUFDRjtBQUNEIn0=
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hcGktcGFja2FnZS1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5pbXBvcnQgeyBDUkVBVEVfVkVSU0lPTiB9IGZyb20gXCIuLi8uLi92ZXJzaW9uLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgYHByb2plY3RzL2FwaS9wYWNrYWdlLmpzb25gLlxuICpcbiAqIFN0YXJ0cyB3aXRoIHRoZSBjb3JlIGNvcnRleCArIGNydWNpYmxlIGRlcHMuIEZlYXR1cmVzIGNhbiBjYWxsXG4gKiBgYWRkRGVwZW5kZW5jeWAgLyBgYWRkRGV2RGVwZW5kZW5jeWAgdG8gZXh0ZW5kLlxuICovXG5leHBvcnQgY2xhc3MgQXBpUGFja2FnZUpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuQVBJX1BBQ0tBR0VfSlNPTjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9kZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHByaXZhdGUgcmVhZG9ubHkgX2RldkRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb2plY3ROYW1lOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9jcnVjaWJsZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGFkZERlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZERldkRlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXZEZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgcGtnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcblx0XHRcdG5hbWU6IGBAJHt0aGlzLnByb2plY3ROYW1lfS9hcGlgLFxuXHRcdFx0dmVyc2lvbjogXCIwLjAuMVwiLFxuXHRcdFx0dHlwZTogXCJtb2R1bGVcIixcblx0XHRcdG1haW46IFwic3JjL21haW4udHNcIixcblx0XHRcdHNjcmlwdHM6IHtcblx0XHRcdFx0bGludDogXCJiaW9tZSBjaGVjayAtLXdyaXRlIC5cIixcblx0XHRcdH0sXG5cdFx0XHRkZXBlbmRlbmNpZXM6IHsgLi4udGhpcy5fZGVwZW5kZW5jaWVzIH0sXG5cdFx0fTtcblx0XHRpZiAoT2JqZWN0LmtleXModGhpcy5fZGV2RGVwZW5kZW5jaWVzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRwa2cuZGV2RGVwZW5kZW5jaWVzID0geyAuLi50aGlzLl9kZXZEZXBlbmRlbmNpZXMgfTtcblx0XHR9XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwicGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMiksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiQ1JFQVRFX1ZFUlNJT04iLCJBcGlQYWNrYWdlSnNvbiIsImtleSIsIkFQSV9QQUNLQUdFX0pTT04iLCJfZGVwZW5kZW5jaWVzIiwiX2RldkRlcGVuZGVuY2llcyIsInByb2plY3ROYW1lIiwiYWRkRGVwZW5kZW5jeSIsIm5hbWUiLCJ2ZXJzaW9uIiwiYWRkRGV2RGVwZW5kZW5jeSIsImZpbGVzIiwicGtnIiwidHlwZSIsIm1haW4iLCJzY3JpcHRzIiwibGludCIsImRlcGVuZGVuY2llcyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJkZXZEZXBlbmRlbmNpZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSx3QkFBd0I7QUFFekQsU0FBU0MsY0FBYyxRQUFRLG1CQUFtQjtBQUVsRDs7Ozs7Q0FLQyxHQUNELE9BQU8sTUFBTUM7O0lBQ0lDLE1BQU1ILGlCQUFpQkksZ0JBQWdCLENBQUM7SUFFdkNDLGNBQXNDO0lBQ3RDQyxtQkFBMkMsQ0FBQyxFQUFFO0lBRS9ELFlBQW1CLEFBQWlCQyxXQUFtQixDQUFFO2FBQXJCQSxjQUFBQTtRQUNuQyxJQUFJLENBQUNGLGFBQWEsR0FBRztZQUNwQixvQkFBb0JKO1lBQ3BCLHNCQUFzQkE7UUFDdkI7SUFDRDtJQUVPTyxjQUFjQyxJQUFZLEVBQUVDLE9BQWUsRUFBUTtRQUN6RCxJQUFJLENBQUNMLGFBQWEsQ0FBQ0ksS0FBSyxHQUFHQztRQUMzQixPQUFPLElBQUk7SUFDWjtJQUVPQyxpQkFBaUJGLElBQVksRUFBRUMsT0FBZSxFQUFRO1FBQzVELElBQUksQ0FBQ0osZ0JBQWdCLENBQUNHLEtBQUssR0FBR0M7UUFDOUIsT0FBTyxJQUFJO0lBQ1o7SUFFT0UsUUFBc0I7UUFDNUIsTUFBTUMsTUFBK0I7WUFDcENKLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDRixXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2hDRyxTQUFTO1lBQ1RJLE1BQU07WUFDTkMsTUFBTTtZQUNOQyxTQUFTO2dCQUNSQyxNQUFNO1lBQ1A7WUFDQUMsY0FBYztnQkFBRSxHQUFHLElBQUksQ0FBQ2IsYUFBYTtZQUFDO1FBQ3ZDO1FBQ0EsSUFBSWMsT0FBT0MsSUFBSSxDQUFDLElBQUksQ0FBQ2QsZ0JBQWdCLEVBQUVlLE1BQU0sR0FBRyxHQUFHO1lBQ2xEUixJQUFJUyxlQUFlLEdBQUc7Z0JBQUUsR0FBRyxJQUFJLENBQUNoQixnQkFBZ0I7WUFBQztRQUNsRDtRQUNBLE9BQU87WUFDTjtnQkFDQ2lCLFVBQVU7Z0JBQ1ZDLFNBQVNDLEtBQUtDLFNBQVMsQ0FBQ2IsS0FBSyxNQUFNO1lBQ3BDO1NBQ0E7SUFDRjtBQUNEIn0=
@@ -11,9 +11,12 @@ import { WELL_KNOWN_FILES } from "../../models/const.js";
11
11
  constructor(config){
12
12
  this.config = config;
13
13
  }
14
+ setAdminUser(adminUser) {
15
+ this.config.adminUser = adminUser;
16
+ }
14
17
  files() {
15
18
  return [];
16
19
  }
17
20
  }
18
21
 
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hdXRoLWNvbmZpZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBBdXRoQ29uZmlnID0ge1xuXHRpc3N1ZXJCYXNlVXJsOiBzdHJpbmc7XG5cdGF1ZGllbmNlOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIERhdGEtY2FycmllciBtb2RlbCBmb3IgYXV0aCBjb25maWd1cmF0aW9uLlxuICpcbiAqIFJlZ2lzdGVyZWQgYnkgQXV0aEZlYXR1cmUgd2hlbiBhdXRoMCBpcyBjb25maWd1cmVkLiBPdGhlciBmZWF0dXJlcyAoZS5nLlxuICogUG9zdG1hbkZlYXR1cmUpIHJldHJpZXZlIGl0IHZpYSB3b3Jrc3BhY2UuZ2V0TW9kZWwoV0VMTF9LTk9XTl9GSUxFUy5BVVRIX0NPTkZJRykuXG4gKiBQcm9kdWNlcyBubyBmaWxlcyDigJQgZXhpc3RzIHNvbGVseSBzbyBmZWF0dXJlcyBjYW4gY29tbXVuaWNhdGUgYXV0aCBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQXV0aENvbmZpZ01vZGVsIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkFVVEhfQ09ORklHO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBBdXRoQ29uZmlnKSB7fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdHJldHVybiBbXTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIldFTExfS05PV05fRklMRVMiLCJBdXRoQ29uZmlnTW9kZWwiLCJrZXkiLCJBVVRIX0NPTkZJRyIsImNvbmZpZyIsImZpbGVzIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSx3QkFBd0I7QUFRekQ7Ozs7OztDQU1DLEdBQ0QsT0FBTyxNQUFNQzs7SUFDSUMsTUFBTUYsaUJBQWlCRyxXQUFXLENBQUM7SUFFbkQsWUFBbUIsQUFBZ0JDLE1BQWtCLENBQUU7YUFBcEJBLFNBQUFBO0lBQXFCO0lBRWpEQyxRQUFzQjtRQUM1QixPQUFPLEVBQUU7SUFDVjtBQUNEIn0=
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hdXRoLWNvbmZpZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBBZG1pblVzZXJDb25maWcgPSB7XG5cdHN1Yjogc3RyaW5nO1xuXHRlbWFpbDogc3RyaW5nO1xuXHRwYXNzd29yZDogc3RyaW5nO1xuXHR1c2VybmFtZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQXV0aENvbmZpZyA9IHtcblx0aXNzdWVyQmFzZVVybDogc3RyaW5nO1xuXHRhdWRpZW5jZTogc3RyaW5nO1xuXHRhZG1pblVzZXI/OiBBZG1pblVzZXJDb25maWc7XG59O1xuXG4vKipcbiAqIERhdGEtY2FycmllciBtb2RlbCBmb3IgYXV0aCBjb25maWd1cmF0aW9uLlxuICpcbiAqIFJlZ2lzdGVyZWQgYnkgQXV0aEZlYXR1cmUgd2hlbiBhdXRoMCBpcyBjb25maWd1cmVkLiBPdGhlciBmZWF0dXJlcyAoZS5nLlxuICogUG9zdG1hbkZlYXR1cmUpIHJldHJpZXZlIGl0IHZpYSB3b3Jrc3BhY2UuZ2V0TW9kZWwoV0VMTF9LTk9XTl9GSUxFUy5BVVRIX0NPTkZJRykuXG4gKiBQcm9kdWNlcyBubyBmaWxlcyDigJQgZXhpc3RzIHNvbGVseSBzbyBmZWF0dXJlcyBjYW4gY29tbXVuaWNhdGUgYXV0aCBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQXV0aENvbmZpZ01vZGVsIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkFVVEhfQ09ORklHO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBBdXRoQ29uZmlnKSB7fVxuXG5cdHB1YmxpYyBzZXRBZG1pblVzZXIoYWRtaW5Vc2VyOiBBZG1pblVzZXJDb25maWcpOiB2b2lkIHtcblx0XHR0aGlzLmNvbmZpZy5hZG1pblVzZXIgPSBhZG1pblVzZXI7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRyZXR1cm4gW107XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiQXV0aENvbmZpZ01vZGVsIiwia2V5IiwiQVVUSF9DT05GSUciLCJjb25maWciLCJzZXRBZG1pblVzZXIiLCJhZG1pblVzZXIiLCJmaWxlcyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsZ0JBQWdCLFFBQVEsd0JBQXdCO0FBZ0J6RDs7Ozs7O0NBTUMsR0FDRCxPQUFPLE1BQU1DOztJQUNJQyxNQUFNRixpQkFBaUJHLFdBQVcsQ0FBQztJQUVuRCxZQUFtQixBQUFnQkMsTUFBa0IsQ0FBRTthQUFwQkEsU0FBQUE7SUFBcUI7SUFFakRDLGFBQWFDLFNBQTBCLEVBQVE7UUFDckQsSUFBSSxDQUFDRixNQUFNLENBQUNFLFNBQVMsR0FBR0E7SUFDekI7SUFFT0MsUUFBc0I7UUFDNUIsT0FBTyxFQUFFO0lBQ1Y7QUFDRCJ9