@qodalis/cli-string 0.0.1 → 0.0.2

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.
@@ -1,26 +1,539 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { DefaultLibraryAuthor, ObjectDescriber, } from '@qodalis/cli-core';
2
+ import { CliForegroundColor, DefaultLibraryAuthor, } from '@qodalis/cli-core';
3
3
  import * as _ from 'lodash';
4
+ import { LIBRARY_VERSION } from '../version';
4
5
  import * as i0 from "@angular/core";
6
+ const lodash = _.default || _;
7
+ /**
8
+ * Helper to create a simple string transform subcommand
9
+ */
10
+ function stringTransform(command, description, transform, options) {
11
+ return {
12
+ command,
13
+ aliases: options?.aliases,
14
+ description,
15
+ allowUnlistedCommands: true,
16
+ valueRequired: true,
17
+ processCommand: async (cmd, context) => {
18
+ const text = (cmd.value || cmd.data || '');
19
+ const result = transform(text);
20
+ context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
21
+ context.process.output(result);
22
+ },
23
+ writeDescription: (context) => {
24
+ const { writer } = context;
25
+ writer.writeln(description);
26
+ writer.writeln();
27
+ writer.writeln('📋 Usage:');
28
+ writer.writeln(` ${writer.wrapInColor(`string ${command} <text>`, CliForegroundColor.Cyan)}`);
29
+ if (options?.example) {
30
+ writer.writeln();
31
+ writer.writeln('📝 Examples:');
32
+ writer.writeln(` string ${command} ${options.example.input.padEnd(20)} ${writer.wrapInColor(`# → ${options.example.output}`, CliForegroundColor.Green)}`);
33
+ }
34
+ },
35
+ };
36
+ }
5
37
  export class CliStringCommandProcessor {
6
38
  constructor() {
7
39
  this.command = 'string';
8
- this.description = 'String commands';
40
+ this.aliases = ['str'];
41
+ this.description = 'String manipulation commands';
9
42
  this.author = DefaultLibraryAuthor;
43
+ this.version = LIBRARY_VERSION;
10
44
  this.processors = [];
11
- this.processors = ObjectDescriber.describe(_.default, {
12
- filter: ({ args }) => {
13
- const skip = args.length === 0 || args[0] !== 'string';
14
- return !skip;
45
+ this.metadata = {
46
+ icon: '🔤',
47
+ };
48
+ this.processors = [
49
+ // -- Case conversions --
50
+ stringTransform('upper', 'Convert to UPPERCASE', (t) => t.toUpperCase(), {
51
+ aliases: ['uppercase', 'toUpper'],
52
+ example: { input: 'hello world', output: 'HELLO WORLD' },
53
+ }),
54
+ stringTransform('lower', 'Convert to lowercase', (t) => t.toLowerCase(), {
55
+ aliases: ['lowercase', 'toLower'],
56
+ example: { input: 'HELLO WORLD', output: 'hello world' },
57
+ }),
58
+ stringTransform('capitalize', 'Capitalize the first letter', (t) => lodash.capitalize(t), {
59
+ aliases: ['cap'],
60
+ example: { input: 'hello world', output: 'Hello world' },
61
+ }),
62
+ stringTransform('camelCase', 'Convert to camelCase', (t) => lodash.camelCase(t), {
63
+ aliases: ['camel'],
64
+ example: { input: 'hello world', output: 'helloWorld' },
65
+ }),
66
+ stringTransform('kebabCase', 'Convert to kebab-case', (t) => lodash.kebabCase(t), {
67
+ aliases: ['kebab'],
68
+ example: { input: 'Hello World', output: 'hello-world' },
69
+ }),
70
+ stringTransform('snakeCase', 'Convert to snake_case', (t) => lodash.snakeCase(t), {
71
+ aliases: ['snake'],
72
+ example: { input: 'Hello World', output: 'hello_world' },
73
+ }),
74
+ stringTransform('startCase', 'Convert to Start Case', (t) => lodash.startCase(t), {
75
+ aliases: ['title', 'titleCase'],
76
+ example: { input: 'hello-world', output: 'Hello World' },
77
+ }),
78
+ // -- Trimming --
79
+ stringTransform('trim', 'Remove whitespace from both ends', (t) => t.trim(), {
80
+ example: { input: '" hello "', output: 'hello' },
81
+ }),
82
+ stringTransform('trimStart', 'Remove whitespace from the start', (t) => t.trimStart(), {
83
+ aliases: ['ltrim'],
84
+ example: { input: '" hello"', output: 'hello' },
85
+ }),
86
+ stringTransform('trimEnd', 'Remove whitespace from the end', (t) => t.trimEnd(), {
87
+ aliases: ['rtrim'],
88
+ example: { input: '"hello "', output: 'hello' },
89
+ }),
90
+ // -- Transform --
91
+ stringTransform('reverse', 'Reverse a string', (t) => [...t].reverse().join(''), {
92
+ aliases: ['rev'],
93
+ example: { input: 'Hello', output: 'olleH' },
94
+ }),
95
+ stringTransform('slug', 'Convert to URL-friendly slug', (t) => t.toLowerCase()
96
+ .normalize('NFD')
97
+ .replace(/[\u0300-\u036f]/g, '')
98
+ .replace(/[^a-z0-9]+/g, '-')
99
+ .replace(/^-|-$/g, ''), {
100
+ aliases: ['slugify'],
101
+ example: { input: '"Hello World!"', output: 'hello-world' },
102
+ }),
103
+ stringTransform('escape', 'Escape HTML entities', (t) => lodash.escape(t), {
104
+ aliases: ['escapeHtml'],
105
+ example: { input: '"<b>hi</b>"', output: '&lt;b&gt;hi&lt;/b&gt;' },
106
+ }),
107
+ stringTransform('unescape', 'Unescape HTML entities', (t) => lodash.unescape(t), {
108
+ aliases: ['unescapeHtml'],
109
+ example: { input: '"&lt;b&gt;"', output: '<b>' },
110
+ }),
111
+ // -- Repeat --
112
+ {
113
+ command: 'repeat',
114
+ description: 'Repeat a string N times',
115
+ allowUnlistedCommands: true,
116
+ valueRequired: true,
117
+ parameters: [
118
+ {
119
+ name: 'count',
120
+ aliases: ['n'],
121
+ description: 'Number of repetitions (default: 2)',
122
+ type: 'number',
123
+ required: false,
124
+ },
125
+ {
126
+ name: 'separator',
127
+ aliases: ['sep'],
128
+ description: 'Separator between repetitions (default: none)',
129
+ type: 'string',
130
+ required: false,
131
+ },
132
+ ],
133
+ processCommand: async (command, context) => {
134
+ const text = (command.value || command.data || '');
135
+ const count = Math.min(parseInt(command.args['count'] || command.args['n']) || 2, 1000);
136
+ const sep = command.args['separator'] || command.args['sep'] || '';
137
+ const result = Array(count).fill(text).join(sep);
138
+ context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
139
+ context.process.output(result);
140
+ },
141
+ writeDescription: (context) => {
142
+ const { writer } = context;
143
+ writer.writeln('Repeat a string multiple times');
144
+ writer.writeln();
145
+ writer.writeln('📋 Usage:');
146
+ writer.writeln(` ${writer.wrapInColor('string repeat <text> [--count=N] [--sep=S]', CliForegroundColor.Cyan)}`);
147
+ writer.writeln();
148
+ writer.writeln('📝 Examples:');
149
+ writer.writeln(` string repeat ha --count=3 ${writer.wrapInColor('# → hahaha', CliForegroundColor.Green)}`);
150
+ writer.writeln(` string repeat ab --n=3 --sep=- ${writer.wrapInColor('# → ab-ab-ab', CliForegroundColor.Green)}`);
151
+ },
152
+ },
153
+ // -- Replace --
154
+ {
155
+ command: 'replace',
156
+ description: 'Replace occurrences in a string',
157
+ allowUnlistedCommands: true,
158
+ valueRequired: true,
159
+ parameters: [
160
+ {
161
+ name: 'find',
162
+ aliases: ['f'],
163
+ description: 'Text to find',
164
+ type: 'string',
165
+ required: true,
166
+ },
167
+ {
168
+ name: 'with',
169
+ aliases: ['w'],
170
+ description: 'Replacement text',
171
+ type: 'string',
172
+ required: true,
173
+ },
174
+ ],
175
+ processCommand: async (command, context) => {
176
+ const text = (command.value || command.data || '');
177
+ const find = command.args['find'] || command.args['f'] || '';
178
+ const replacement = command.args['with'] || command.args['w'] || '';
179
+ if (!find) {
180
+ context.writer.writeError('--find is required');
181
+ context.process.exit(-1);
182
+ return;
183
+ }
184
+ const result = text.split(find).join(replacement);
185
+ context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
186
+ context.process.output(result);
187
+ },
188
+ writeDescription: (context) => {
189
+ const { writer } = context;
190
+ writer.writeln('Replace all occurrences of a substring');
191
+ writer.writeln();
192
+ writer.writeln('📋 Usage:');
193
+ writer.writeln(` ${writer.wrapInColor('string replace <text> --find=<search> --with=<replacement>', CliForegroundColor.Cyan)}`);
194
+ writer.writeln();
195
+ writer.writeln('📝 Examples:');
196
+ writer.writeln(` string replace "hello world" --find=world --with=there`);
197
+ writer.writeln(` ${writer.wrapInColor('# → hello there', CliForegroundColor.Green)}`);
198
+ },
199
+ },
200
+ // -- Truncate --
201
+ {
202
+ command: 'truncate',
203
+ aliases: ['trunc'],
204
+ description: 'Truncate a string to a max length',
205
+ allowUnlistedCommands: true,
206
+ valueRequired: true,
207
+ parameters: [
208
+ {
209
+ name: 'length',
210
+ aliases: ['l'],
211
+ description: 'Maximum length (default: 30)',
212
+ type: 'number',
213
+ required: false,
214
+ },
215
+ {
216
+ name: 'suffix',
217
+ description: 'Omission suffix (default: ...)',
218
+ type: 'string',
219
+ required: false,
220
+ },
221
+ ],
222
+ processCommand: async (command, context) => {
223
+ const text = (command.value || command.data || '');
224
+ const length = parseInt(command.args['length'] || command.args['l']) || 30;
225
+ const suffix = command.args['suffix'] ?? '...';
226
+ const result = text.length > length
227
+ ? text.substring(0, length - suffix.length) + suffix
228
+ : text;
229
+ context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
230
+ context.process.output(result);
231
+ },
232
+ writeDescription: (context) => {
233
+ const { writer } = context;
234
+ writer.writeln('Truncate a string to a maximum length with an ellipsis');
235
+ writer.writeln();
236
+ writer.writeln('📋 Usage:');
237
+ writer.writeln(` ${writer.wrapInColor('string truncate <text> [--length=N] [--suffix=S]', CliForegroundColor.Cyan)}`);
238
+ },
239
+ },
240
+ // -- Pad --
241
+ {
242
+ command: 'pad',
243
+ description: 'Pad a string to a target length',
244
+ allowUnlistedCommands: true,
245
+ valueRequired: true,
246
+ parameters: [
247
+ {
248
+ name: 'length',
249
+ aliases: ['l'],
250
+ description: 'Target length',
251
+ type: 'number',
252
+ required: true,
253
+ },
254
+ {
255
+ name: 'char',
256
+ aliases: ['c'],
257
+ description: 'Padding character (default: space)',
258
+ type: 'string',
259
+ required: false,
260
+ },
261
+ {
262
+ name: 'side',
263
+ description: 'Pad side: left, right, both (default: both)',
264
+ type: 'string',
265
+ required: false,
266
+ },
267
+ ],
268
+ processCommand: async (command, context) => {
269
+ const text = (command.value || command.data || '');
270
+ const length = parseInt(command.args['length'] || command.args['l']);
271
+ const char = command.args['char'] || command.args['c'] || ' ';
272
+ const side = command.args['side'] || 'both';
273
+ if (isNaN(length)) {
274
+ context.writer.writeError('--length is required');
275
+ context.process.exit(-1);
276
+ return;
277
+ }
278
+ let result;
279
+ switch (side) {
280
+ case 'left':
281
+ case 'start':
282
+ result = text.padStart(length, char);
283
+ break;
284
+ case 'right':
285
+ case 'end':
286
+ result = text.padEnd(length, char);
287
+ break;
288
+ default:
289
+ result = lodash.pad(text, length, char);
290
+ break;
291
+ }
292
+ context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}"${result}"`);
293
+ context.process.output(result);
294
+ },
295
+ writeDescription: (context) => {
296
+ const { writer } = context;
297
+ writer.writeln('Pad a string to a target length');
298
+ writer.writeln();
299
+ writer.writeln('📋 Usage:');
300
+ writer.writeln(` ${writer.wrapInColor('string pad <text> --length=N [--char=C] [--side=left|right|both]', CliForegroundColor.Cyan)}`);
301
+ writer.writeln();
302
+ writer.writeln('📝 Examples:');
303
+ writer.writeln(` string pad hello --length=10 --char=. --side=right`);
304
+ writer.writeln(` ${writer.wrapInColor('# → "hello....."', CliForegroundColor.Green)}`);
305
+ },
306
+ },
307
+ // -- Split --
308
+ {
309
+ command: 'split',
310
+ description: 'Split a string by a delimiter',
311
+ allowUnlistedCommands: true,
312
+ valueRequired: true,
313
+ parameters: [
314
+ {
315
+ name: 'by',
316
+ aliases: ['d', 'delimiter'],
317
+ description: 'Delimiter to split by (default: space)',
318
+ type: 'string',
319
+ required: false,
320
+ },
321
+ ],
322
+ processCommand: async (command, context) => {
323
+ const text = (command.value || command.data || '');
324
+ const delimiter = command.args['by'] || command.args['d'] || command.args['delimiter'] || ' ';
325
+ const parts = text.split(delimiter);
326
+ const { writer } = context;
327
+ parts.forEach((part, i) => {
328
+ writer.writeln(` ${writer.wrapInColor(String(i).padStart(3), CliForegroundColor.Yellow)} ${part}`);
329
+ });
330
+ context.process.output(parts);
331
+ },
332
+ writeDescription: (context) => {
333
+ const { writer } = context;
334
+ writer.writeln('Split a string into parts by a delimiter');
335
+ writer.writeln();
336
+ writer.writeln('📋 Usage:');
337
+ writer.writeln(` ${writer.wrapInColor('string split <text> [--by=<delimiter>]', CliForegroundColor.Cyan)}`);
338
+ writer.writeln();
339
+ writer.writeln('📝 Examples:');
340
+ writer.writeln(` string split "a,b,c" --by=, ${writer.wrapInColor('# → a b c', CliForegroundColor.Green)}`);
341
+ },
342
+ },
343
+ // -- Words --
344
+ {
345
+ command: 'words',
346
+ description: 'Split a string into words',
347
+ allowUnlistedCommands: true,
348
+ valueRequired: true,
349
+ processCommand: async (command, context) => {
350
+ const text = (command.value || command.data || '');
351
+ const words = lodash.words(text);
352
+ const { writer } = context;
353
+ writer.writeln(`${writer.wrapInColor(`${words.length} words:`, CliForegroundColor.Yellow)} ${words.join(', ')}`);
354
+ context.process.output(words);
355
+ },
356
+ writeDescription: (context) => {
357
+ const { writer } = context;
358
+ writer.writeln('Split a string into its component words');
359
+ writer.writeln();
360
+ writer.writeln('📋 Usage:');
361
+ writer.writeln(` ${writer.wrapInColor('string words <text>', CliForegroundColor.Cyan)}`);
362
+ writer.writeln();
363
+ writer.writeln('📝 Examples:');
364
+ writer.writeln(` string words "helloWorld" ${writer.wrapInColor('# → hello, World', CliForegroundColor.Green)}`);
365
+ writer.writeln(` string words "foo-bar_baz" ${writer.wrapInColor('# → foo, bar, baz', CliForegroundColor.Green)}`);
366
+ },
367
+ },
368
+ // -- Analysis --
369
+ {
370
+ command: 'length',
371
+ aliases: ['len'],
372
+ description: 'Get the length of a string',
373
+ allowUnlistedCommands: true,
374
+ valueRequired: true,
375
+ processCommand: async (command, context) => {
376
+ const text = (command.value || command.data || '');
377
+ context.writer.writeln(`${context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${text.length}`);
378
+ context.process.output(text.length);
379
+ },
380
+ writeDescription: (context) => {
381
+ const { writer } = context;
382
+ writer.writeln('Get the character count of a string');
383
+ writer.writeln();
384
+ writer.writeln('📋 Usage:');
385
+ writer.writeln(` ${writer.wrapInColor('string length <text>', CliForegroundColor.Cyan)}`);
386
+ },
387
+ },
388
+ {
389
+ command: 'wc',
390
+ aliases: ['wordcount', 'count'],
391
+ description: 'Count lines, words, characters, and bytes',
392
+ allowUnlistedCommands: true,
393
+ valueRequired: true,
394
+ processCommand: async (command, context) => {
395
+ const text = (command.value || command.data || '');
396
+ const { writer } = context;
397
+ const lines = text.split(/\r?\n/).length;
398
+ const wordCount = text.trim() ? text.trim().split(/\s+/).length : 0;
399
+ const chars = text.length;
400
+ const bytes = new TextEncoder().encode(text).length;
401
+ writer.writeln(` ${writer.wrapInColor('Lines:', CliForegroundColor.Cyan)} ${lines}`);
402
+ writer.writeln(` ${writer.wrapInColor('Words:', CliForegroundColor.Cyan)} ${wordCount}`);
403
+ writer.writeln(` ${writer.wrapInColor('Characters:', CliForegroundColor.Cyan)} ${chars}`);
404
+ writer.writeln(` ${writer.wrapInColor('Bytes:', CliForegroundColor.Cyan)} ${bytes}`);
405
+ context.process.output({ lines, words: wordCount, chars, bytes });
406
+ },
407
+ writeDescription: (context) => {
408
+ const { writer } = context;
409
+ writer.writeln('Count lines, words, characters, and bytes in text');
410
+ writer.writeln();
411
+ writer.writeln('📋 Usage:');
412
+ writer.writeln(` ${writer.wrapInColor('string wc <text>', CliForegroundColor.Cyan)}`);
413
+ },
414
+ },
415
+ {
416
+ command: 'includes',
417
+ aliases: ['contains', 'has'],
418
+ description: 'Check if a string contains a substring',
419
+ allowUnlistedCommands: true,
420
+ valueRequired: true,
421
+ parameters: [
422
+ {
423
+ name: 'find',
424
+ aliases: ['f'],
425
+ description: 'Substring to search for',
426
+ type: 'string',
427
+ required: true,
428
+ },
429
+ ],
430
+ processCommand: async (command, context) => {
431
+ const text = (command.value || command.data || '');
432
+ const find = command.args['find'] || command.args['f'] || '';
433
+ const result = text.includes(find);
434
+ const { writer } = context;
435
+ if (result) {
436
+ writer.writeSuccess(`"${find}" found in string`);
437
+ }
438
+ else {
439
+ writer.writeError(`"${find}" not found in string`);
440
+ }
441
+ context.process.output(result);
442
+ },
443
+ writeDescription: (context) => {
444
+ const { writer } = context;
445
+ writer.writeln('Check if a string contains a given substring');
446
+ writer.writeln();
447
+ writer.writeln('📋 Usage:');
448
+ writer.writeln(` ${writer.wrapInColor('string includes <text> --find=<substring>', CliForegroundColor.Cyan)}`);
449
+ },
450
+ },
451
+ {
452
+ command: 'startsWith',
453
+ description: 'Check if a string starts with a prefix',
454
+ allowUnlistedCommands: true,
455
+ valueRequired: true,
456
+ parameters: [
457
+ {
458
+ name: 'find',
459
+ aliases: ['f'],
460
+ description: 'Prefix to check',
461
+ type: 'string',
462
+ required: true,
463
+ },
464
+ ],
465
+ processCommand: async (command, context) => {
466
+ const text = (command.value || command.data || '');
467
+ const find = command.args['find'] || command.args['f'] || '';
468
+ const result = text.startsWith(find);
469
+ const { writer } = context;
470
+ writer.writeln(`${writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
471
+ context.process.output(result);
472
+ },
473
+ writeDescription: (context) => {
474
+ const { writer } = context;
475
+ writer.writeln('Check if a string starts with a given prefix');
476
+ writer.writeln();
477
+ writer.writeln('📋 Usage:');
478
+ writer.writeln(` ${writer.wrapInColor('string startsWith <text> --find=<prefix>', CliForegroundColor.Cyan)}`);
479
+ },
480
+ },
481
+ {
482
+ command: 'endsWith',
483
+ description: 'Check if a string ends with a suffix',
484
+ allowUnlistedCommands: true,
485
+ valueRequired: true,
486
+ parameters: [
487
+ {
488
+ name: 'find',
489
+ aliases: ['f'],
490
+ description: 'Suffix to check',
491
+ type: 'string',
492
+ required: true,
493
+ },
494
+ ],
495
+ processCommand: async (command, context) => {
496
+ const text = (command.value || command.data || '');
497
+ const find = command.args['find'] || command.args['f'] || '';
498
+ const result = text.endsWith(find);
499
+ const { writer } = context;
500
+ writer.writeln(`${writer.wrapInColor('Result: ', CliForegroundColor.Yellow)}${result}`);
501
+ context.process.output(result);
502
+ },
503
+ writeDescription: (context) => {
504
+ const { writer } = context;
505
+ writer.writeln('Check if a string ends with a given suffix');
506
+ writer.writeln();
507
+ writer.writeln('📋 Usage:');
508
+ writer.writeln(` ${writer.wrapInColor('string endsWith <text> --find=<suffix>', CliForegroundColor.Cyan)}`);
509
+ },
15
510
  },
16
- });
511
+ ];
17
512
  }
18
513
  async processCommand(command, context) {
19
514
  context.executor.showHelp(command, context);
20
515
  }
21
516
  writeDescription(context) {
22
- context.writer.writeln("Provides string commands using lodash's string functions");
23
- context.writer.writeln('Documentation: https://lodash.com/docs');
517
+ const { writer } = context;
518
+ writer.writeln('String manipulation and analysis commands');
519
+ writer.writeln();
520
+ writer.writeln(writer.wrapInColor('🔠 Case Conversions:', CliForegroundColor.Yellow));
521
+ writer.writeln(` ${writer.wrapInColor('string upper', CliForegroundColor.Cyan)} / ${writer.wrapInColor('lower', CliForegroundColor.Cyan)} / ${writer.wrapInColor('capitalize', CliForegroundColor.Cyan)}`);
522
+ writer.writeln(` ${writer.wrapInColor('string camelCase', CliForegroundColor.Cyan)} / ${writer.wrapInColor('kebabCase', CliForegroundColor.Cyan)} / ${writer.wrapInColor('snakeCase', CliForegroundColor.Cyan)} / ${writer.wrapInColor('startCase', CliForegroundColor.Cyan)}`);
523
+ writer.writeln();
524
+ writer.writeln(writer.wrapInColor('🔧 Transform:', CliForegroundColor.Yellow));
525
+ writer.writeln(` ${writer.wrapInColor('string reverse', CliForegroundColor.Cyan)} / ${writer.wrapInColor('trim', CliForegroundColor.Cyan)} / ${writer.wrapInColor('slug', CliForegroundColor.Cyan)} / ${writer.wrapInColor('repeat', CliForegroundColor.Cyan)} / ${writer.wrapInColor('replace', CliForegroundColor.Cyan)} / ${writer.wrapInColor('truncate', CliForegroundColor.Cyan)}`);
526
+ writer.writeln(` ${writer.wrapInColor('string pad', CliForegroundColor.Cyan)} / ${writer.wrapInColor('escape', CliForegroundColor.Cyan)} / ${writer.wrapInColor('unescape', CliForegroundColor.Cyan)}`);
527
+ writer.writeln();
528
+ writer.writeln(writer.wrapInColor('🔍 Analysis:', CliForegroundColor.Yellow));
529
+ writer.writeln(` ${writer.wrapInColor('string length', CliForegroundColor.Cyan)} / ${writer.wrapInColor('wc', CliForegroundColor.Cyan)} / ${writer.wrapInColor('includes', CliForegroundColor.Cyan)} / ${writer.wrapInColor('startsWith', CliForegroundColor.Cyan)} / ${writer.wrapInColor('endsWith', CliForegroundColor.Cyan)}`);
530
+ writer.writeln(` ${writer.wrapInColor('string split', CliForegroundColor.Cyan)} / ${writer.wrapInColor('words', CliForegroundColor.Cyan)}`);
531
+ writer.writeln();
532
+ writer.writeln('📝 Examples:');
533
+ writer.writeln(` string camelCase "hello world" ${writer.wrapInColor('# → helloWorld', CliForegroundColor.Green)}`);
534
+ writer.writeln(` string reverse Hello ${writer.wrapInColor('# → olleH', CliForegroundColor.Green)}`);
535
+ writer.writeln(` string slug "Hello World!" ${writer.wrapInColor('# → hello-world', CliForegroundColor.Green)}`);
536
+ writer.writeln(` string wc "some text here" ${writer.wrapInColor('# word/char counts', CliForegroundColor.Green)}`);
24
537
  }
25
538
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliStringCommandProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
26
539
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliStringCommandProcessor }); }
@@ -28,4 +541,4 @@ export class CliStringCommandProcessor {
28
541
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliStringCommandProcessor, decorators: [{
29
542
  type: Injectable
30
543
  }], ctorParameters: function () { return []; } });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXN0cmluZy1jb21tYW5kLXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmluZy9zcmMvbGliL3Byb2Nlc3NvcnMvY2xpLXN0cmluZy1jb21tYW5kLXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFFSCxvQkFBb0IsRUFHcEIsZUFBZSxHQUNsQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDOztBQUc1QixNQUFNLE9BQU8seUJBQXlCO0lBU2xDO1FBUkEsWUFBTyxHQUFHLFFBQVEsQ0FBQztRQUVuQixnQkFBVyxHQUFHLGlCQUFpQixDQUFDO1FBRWhDLFdBQU0sR0FBRyxvQkFBb0IsQ0FBQztRQUU5QixlQUFVLEdBQXdDLEVBQUUsQ0FBQztRQUdqRCxJQUFJLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUUsQ0FBUyxDQUFDLE9BQU8sRUFBRTtZQUMzRCxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7Z0JBQ2pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUM7Z0JBQ3ZELE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDakIsQ0FBQztTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUNoQixPQUEwQixFQUMxQixPQUE2QjtRQUU3QixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQTZCO1FBQzFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNsQiwwREFBMEQsQ0FDN0QsQ0FBQztRQUNGLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDckUsQ0FBQzsrR0E5QlEseUJBQXlCO21IQUF6Qix5QkFBeUI7OzRGQUF6Qix5QkFBeUI7a0JBRHJDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENsaVByb2Nlc3NDb21tYW5kLFxuICAgIERlZmF1bHRMaWJyYXJ5QXV0aG9yLFxuICAgIElDbGlDb21tYW5kUHJvY2Vzc29yLFxuICAgIElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgIE9iamVjdERlc2NyaWJlcixcbn0gZnJvbSAnQHFvZGFsaXMvY2xpLWNvcmUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ2xpU3RyaW5nQ29tbWFuZFByb2Nlc3NvciBpbXBsZW1lbnRzIElDbGlDb21tYW5kUHJvY2Vzc29yIHtcbiAgICBjb21tYW5kID0gJ3N0cmluZyc7XG5cbiAgICBkZXNjcmlwdGlvbiA9ICdTdHJpbmcgY29tbWFuZHMnO1xuXG4gICAgYXV0aG9yID0gRGVmYXVsdExpYnJhcnlBdXRob3I7XG5cbiAgICBwcm9jZXNzb3JzPzogSUNsaUNvbW1hbmRQcm9jZXNzb3JbXSB8IHVuZGVmaW5lZCA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc29ycyA9IE9iamVjdERlc2NyaWJlci5kZXNjcmliZSgoXyBhcyBhbnkpLmRlZmF1bHQsIHtcbiAgICAgICAgICAgIGZpbHRlcjogKHsgYXJncyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2tpcCA9IGFyZ3MubGVuZ3RoID09PSAwIHx8IGFyZ3NbMF0gIT09ICdzdHJpbmcnO1xuICAgICAgICAgICAgICAgIHJldHVybiAhc2tpcDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3NDb21tYW5kKFxuICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnRleHQuZXhlY3V0b3Iuc2hvd0hlbHAoY29tbWFuZCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgd3JpdGVEZXNjcmlwdGlvbihjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgXCJQcm92aWRlcyBzdHJpbmcgY29tbWFuZHMgdXNpbmcgbG9kYXNoJ3Mgc3RyaW5nIGZ1bmN0aW9uc1wiLFxuICAgICAgICApO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCdEb2N1bWVudGF0aW9uOiBodHRwczovL2xvZGFzaC5jb20vZG9jcycpO1xuICAgIH1cbn1cbiJdfQ==
544
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXN0cmluZy1jb21tYW5kLXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmluZy9zcmMvbGliL3Byb2Nlc3NvcnMvY2xpLXN0cmluZy1jb21tYW5kLXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDSCxrQkFBa0IsRUFHbEIsb0JBQW9CLEdBR3ZCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFN0MsTUFBTSxNQUFNLEdBQUksQ0FBUyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7QUFFdkM7O0dBRUc7QUFDSCxTQUFTLGVBQWUsQ0FDcEIsT0FBZSxFQUNmLFdBQW1CLEVBQ25CLFNBQW1DLEVBQ25DLE9BR0M7SUFFRCxPQUFPO1FBQ0gsT0FBTztRQUNQLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTztRQUN6QixXQUFXO1FBQ1gscUJBQXFCLEVBQUUsSUFBSTtRQUMzQixhQUFhLEVBQUUsSUFBSTtRQUNuQixjQUFjLEVBQUUsS0FBSyxFQUNqQixHQUFzQixFQUN0QixPQUE2QixFQUMvQixFQUFFO1lBQ0EsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFXLENBQUM7WUFDckQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNsQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FDbEYs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LEVBQUUsQ0FBQyxDQUFDO1FBQzVILE1BQU0sQ0FBQyxPQUFPLENBQUMsMENBQTBDLE1BQU0sQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25JLENBQUM7K0dBam9CUSx5QkFBeUI7bUhBQXpCLHlCQUF5Qjs7NEZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ2xpRm9yZWdyb3VuZENvbG9yLFxuICAgIENsaVByb2Nlc3NDb21tYW5kLFxuICAgIENsaVByb2Nlc3Nvck1ldGFkYXRhLFxuICAgIERlZmF1bHRMaWJyYXJ5QXV0aG9yLFxuICAgIElDbGlDb21tYW5kUHJvY2Vzc29yLFxuICAgIElDbGlFeGVjdXRpb25Db250ZXh0LFxufSBmcm9tICdAcW9kYWxpcy9jbGktY29yZSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBMSUJSQVJZX1ZFUlNJT04gfSBmcm9tICcuLi92ZXJzaW9uJztcblxuY29uc3QgbG9kYXNoID0gKF8gYXMgYW55KS5kZWZhdWx0IHx8IF87XG5cbi8qKlxuICogSGVscGVyIHRvIGNyZWF0ZSBhIHNpbXBsZSBzdHJpbmcgdHJhbnNmb3JtIHN1YmNvbW1hbmRcbiAqL1xuZnVuY3Rpb24gc3RyaW5nVHJhbnNmb3JtKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHRyYW5zZm9ybTogKHRleHQ6IHN0cmluZykgPT4gc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICAgIGFsaWFzZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgZXhhbXBsZT86IHsgaW5wdXQ6IHN0cmluZzsgb3V0cHV0OiBzdHJpbmcgfTtcbiAgICB9LFxuKTogSUNsaUNvbW1hbmRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGFsaWFzZXM6IG9wdGlvbnM/LmFsaWFzZXMsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgIHZhbHVlUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICBjbWQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjbWQudmFsdWUgfHwgY21kLmRhdGEgfHwgJycpIGFzIHN0cmluZztcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zZm9ybSh0ZXh0KTtcbiAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgYCR7Y29udGV4dC53cml0ZXIud3JhcEluQ29sb3IoJ1Jlc3VsdDogJywgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyl9JHtyZXN1bHR9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHJlc3VsdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVsbihkZXNjcmlwdGlvbik7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk4sgVXNhZ2U6Jyk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcihgc3RyaW5nICR7Y29tbWFuZH0gPHRleHQ+YCwgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmV4YW1wbGUpIHtcbiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OdIEV4YW1wbGVzOicpO1xuICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICBgICBzdHJpbmcgJHtjb21tYW5kfSAke29wdGlvbnMuZXhhbXBsZS5pbnB1dC5wYWRFbmQoMjApfSAke3dyaXRlci53cmFwSW5Db2xvcihgIyDihpIgJHtvcHRpb25zLmV4YW1wbGUub3V0cHV0fWAsIENsaUZvcmVncm91bmRDb2xvci5HcmVlbil9YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDbGlTdHJpbmdDb21tYW5kUHJvY2Vzc29yIGltcGxlbWVudHMgSUNsaUNvbW1hbmRQcm9jZXNzb3Ige1xuICAgIGNvbW1hbmQgPSAnc3RyaW5nJztcblxuICAgIGFsaWFzZXMgPSBbJ3N0ciddO1xuXG4gICAgZGVzY3JpcHRpb24gPSAnU3RyaW5nIG1hbmlwdWxhdGlvbiBjb21tYW5kcyc7XG5cbiAgICBhdXRob3IgPSBEZWZhdWx0TGlicmFyeUF1dGhvcjtcblxuICAgIHZlcnNpb24gPSBMSUJSQVJZX1ZFUlNJT047XG5cbiAgICBwcm9jZXNzb3JzPzogSUNsaUNvbW1hbmRQcm9jZXNzb3JbXSA9IFtdO1xuXG4gICAgbWV0YWRhdGE/OiBDbGlQcm9jZXNzb3JNZXRhZGF0YSA9IHtcbiAgICAgICAgaWNvbjogJ/CflKQnLFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzb3JzID0gW1xuICAgICAgICAgICAgLy8gLS0gQ2FzZSBjb252ZXJzaW9ucyAtLVxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCd1cHBlcicsICdDb252ZXJ0IHRvIFVQUEVSQ0FTRScsICh0KSA9PiB0LnRvVXBwZXJDYXNlKCksIHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ3VwcGVyY2FzZScsICd0b1VwcGVyJ10sXG4gICAgICAgICAgICAgICAgZXhhbXBsZTogeyBpbnB1dDogJ2hlbGxvIHdvcmxkJywgb3V0cHV0OiAnSEVMTE8gV09STEQnIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN0cmluZ1RyYW5zZm9ybSgnbG93ZXInLCAnQ29udmVydCB0byBsb3dlcmNhc2UnLCAodCkgPT4gdC50b0xvd2VyQ2FzZSgpLCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlczogWydsb3dlcmNhc2UnLCAndG9Mb3dlciddLFxuICAgICAgICAgICAgICAgIGV4YW1wbGU6IHsgaW5wdXQ6ICdIRUxMTyBXT1JMRCcsIG91dHB1dDogJ2hlbGxvIHdvcmxkJyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdHJpbmdUcmFuc2Zvcm0oJ2NhcGl0YWxpemUnLCAnQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyJywgKHQpID0+IGxvZGFzaC5jYXBpdGFsaXplKHQpLCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlczogWydjYXAnXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnaGVsbG8gd29ybGQnLCBvdXRwdXQ6ICdIZWxsbyB3b3JsZCcgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCdjYW1lbENhc2UnLCAnQ29udmVydCB0byBjYW1lbENhc2UnLCAodCkgPT4gbG9kYXNoLmNhbWVsQ2FzZSh0KSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnY2FtZWwnXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnaGVsbG8gd29ybGQnLCBvdXRwdXQ6ICdoZWxsb1dvcmxkJyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdHJpbmdUcmFuc2Zvcm0oJ2tlYmFiQ2FzZScsICdDb252ZXJ0IHRvIGtlYmFiLWNhc2UnLCAodCkgPT4gbG9kYXNoLmtlYmFiQ2FzZSh0KSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsna2ViYWInXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnSGVsbG8gV29ybGQnLCBvdXRwdXQ6ICdoZWxsby13b3JsZCcgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCdzbmFrZUNhc2UnLCAnQ29udmVydCB0byBzbmFrZV9jYXNlJywgKHQpID0+IGxvZGFzaC5zbmFrZUNhc2UodCksIHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ3NuYWtlJ10sXG4gICAgICAgICAgICAgICAgZXhhbXBsZTogeyBpbnB1dDogJ0hlbGxvIFdvcmxkJywgb3V0cHV0OiAnaGVsbG9fd29ybGQnIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN0cmluZ1RyYW5zZm9ybSgnc3RhcnRDYXNlJywgJ0NvbnZlcnQgdG8gU3RhcnQgQ2FzZScsICh0KSA9PiBsb2Rhc2guc3RhcnRDYXNlKHQpLCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlczogWyd0aXRsZScsICd0aXRsZUNhc2UnXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnaGVsbG8td29ybGQnLCBvdXRwdXQ6ICdIZWxsbyBXb3JsZCcgfSxcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAvLyAtLSBUcmltbWluZyAtLVxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCd0cmltJywgJ1JlbW92ZSB3aGl0ZXNwYWNlIGZyb20gYm90aCBlbmRzJywgKHQpID0+IHQudHJpbSgpLCB7XG4gICAgICAgICAgICAgICAgZXhhbXBsZTogeyBpbnB1dDogJ1wiICBoZWxsbyAgXCInLCBvdXRwdXQ6ICdoZWxsbycgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCd0cmltU3RhcnQnLCAnUmVtb3ZlIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3RhcnQnLCAodCkgPT4gdC50cmltU3RhcnQoKSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnbHRyaW0nXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnXCIgIGhlbGxvXCInLCBvdXRwdXQ6ICdoZWxsbycgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCd0cmltRW5kJywgJ1JlbW92ZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCcsICh0KSA9PiB0LnRyaW1FbmQoKSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsncnRyaW0nXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnXCJoZWxsbyAgXCInLCBvdXRwdXQ6ICdoZWxsbycgfSxcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAvLyAtLSBUcmFuc2Zvcm0gLS1cbiAgICAgICAgICAgIHN0cmluZ1RyYW5zZm9ybSgncmV2ZXJzZScsICdSZXZlcnNlIGEgc3RyaW5nJywgKHQpID0+IFsuLi50XS5yZXZlcnNlKCkuam9pbignJyksIHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ3JldiddLFxuICAgICAgICAgICAgICAgIGV4YW1wbGU6IHsgaW5wdXQ6ICdIZWxsbycsIG91dHB1dDogJ29sbGVIJyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdHJpbmdUcmFuc2Zvcm0oJ3NsdWcnLCAnQ29udmVydCB0byBVUkwtZnJpZW5kbHkgc2x1ZycsICh0KSA9PlxuICAgICAgICAgICAgICAgIHQudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL14tfC0kL2csICcnKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnc2x1Z2lmeSddLFxuICAgICAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnXCJIZWxsbyBXb3JsZCFcIicsIG91dHB1dDogJ2hlbGxvLXdvcmxkJyB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RyaW5nVHJhbnNmb3JtKCdlc2NhcGUnLCAnRXNjYXBlIEhUTUwgZW50aXRpZXMnLCAodCkgPT4gbG9kYXNoLmVzY2FwZSh0KSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZXNjYXBlSHRtbCddLFxuICAgICAgICAgICAgICAgIGV4YW1wbGU6IHsgaW5wdXQ6ICdcIjxiPmhpPC9iPlwiJywgb3V0cHV0OiAnJmx0O2ImZ3Q7aGkmbHQ7L2ImZ3Q7JyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdHJpbmdUcmFuc2Zvcm0oJ3VuZXNjYXBlJywgJ1VuZXNjYXBlIEhUTUwgZW50aXRpZXMnLCAodCkgPT4gbG9kYXNoLnVuZXNjYXBlKHQpLCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlczogWyd1bmVzY2FwZUh0bWwnXSxcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB7IGlucHV0OiAnXCImbHQ7YiZndDtcIicsIG91dHB1dDogJzxiPicgfSxcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAvLyAtLSBSZXBlYXQgLS1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAncmVwZWF0JyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlcGVhdCBhIHN0cmluZyBOIHRpbWVzJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb3VudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ24nXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIHJlcGV0aXRpb25zIChkZWZhdWx0OiAyKScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NlcGFyYXRvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ3NlcCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTZXBhcmF0b3IgYmV0d2VlbiByZXBldGl0aW9ucyAoZGVmYXVsdDogbm9uZSknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoY29tbWFuZC52YWx1ZSB8fCBjb21tYW5kLmRhdGEgfHwgJycpIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBNYXRoLm1pbihwYXJzZUludChjb21tYW5kLmFyZ3NbJ2NvdW50J10gfHwgY29tbWFuZC5hcmdzWyduJ10pIHx8IDIsIDEwMDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXAgPSBjb21tYW5kLmFyZ3NbJ3NlcGFyYXRvciddIHx8IGNvbW1hbmQuYXJnc1snc2VwJ10gfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEFycmF5KGNvdW50KS5maWxsKHRleHQpLmpvaW4oc2VwKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2NvbnRleHQud3JpdGVyLndyYXBJbkNvbG9yKCdSZXN1bHQ6ICcsIENsaUZvcmVncm91bmRDb2xvci5ZZWxsb3cpfSR7cmVzdWx0fWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ1JlcGVhdCBhIHN0cmluZyBtdWx0aXBsZSB0aW1lcycpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHJlcGVhdCA8dGV4dD4gWy0tY291bnQ9Tl0gWy0tc2VwPVNdJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OdIEV4YW1wbGVzOicpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgIHN0cmluZyByZXBlYXQgaGEgLS1jb3VudD0zICAgICAgICAke3dyaXRlci53cmFwSW5Db2xvcignIyDihpIgaGFoYWhhJywgQ2xpRm9yZWdyb3VuZENvbG9yLkdyZWVuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgIHN0cmluZyByZXBlYXQgYWIgLS1uPTMgLS1zZXA9LSAgICAke3dyaXRlci53cmFwSW5Db2xvcignIyDihpIgYWItYWItYWInLCBDbGlGb3JlZ3JvdW5kQ29sb3IuR3JlZW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIC0tIFJlcGxhY2UgLS1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAncmVwbGFjZScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXBsYWNlIG9jY3VycmVuY2VzIGluIGEgc3RyaW5nJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUZXh0IHRvIGZpbmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3dpdGgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlczogWyd3J10sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlcGxhY2VtZW50IHRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjb21tYW5kLnZhbHVlIHx8IGNvbW1hbmQuZGF0YSB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kID0gY29tbWFuZC5hcmdzWydmaW5kJ10gfHwgY29tbWFuZC5hcmdzWydmJ10gfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gY29tbWFuZC5hcmdzWyd3aXRoJ10gfHwgY29tbWFuZC5hcmdzWyd3J10gfHwgJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZUVycm9yKCctLWZpbmQgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQuc3BsaXQoZmluZCkuam9pbihyZXBsYWNlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtjb250ZXh0LndyaXRlci53cmFwSW5Db2xvcignUmVzdWx0OiAnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0ke3Jlc3VsdH1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3cml0ZURlc2NyaXB0aW9uOiAoY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCdSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBhIHN1YnN0cmluZycpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHJlcGxhY2UgPHRleHQ+IC0tZmluZD08c2VhcmNoPiAtLXdpdGg9PHJlcGxhY2VtZW50PicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TnSBFeGFtcGxlczonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICBzdHJpbmcgcmVwbGFjZSBcImhlbGxvIHdvcmxkXCIgLS1maW5kPXdvcmxkIC0td2l0aD10aGVyZWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJyMg4oaSIGhlbGxvIHRoZXJlJywgQ2xpRm9yZWdyb3VuZENvbG9yLkdyZWVuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyAtLSBUcnVuY2F0ZSAtLVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICd0cnVuY2F0ZScsXG4gICAgICAgICAgICAgICAgYWxpYXNlczogWyd0cnVuYyddLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVHJ1bmNhdGUgYSBzdHJpbmcgdG8gYSBtYXggbGVuZ3RoJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsZW5ndGgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlczogWydsJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ01heGltdW0gbGVuZ3RoIChkZWZhdWx0OiAzMCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzdWZmaXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPbWlzc2lvbiBzdWZmaXggKGRlZmF1bHQ6IC4uLiknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoY29tbWFuZC52YWx1ZSB8fCBjb21tYW5kLmRhdGEgfHwgJycpIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQoY29tbWFuZC5hcmdzWydsZW5ndGgnXSB8fCBjb21tYW5kLmFyZ3NbJ2wnXSkgfHwgMzA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGNvbW1hbmQuYXJnc1snc3VmZml4J10gPz8gJy4uLic7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQubGVuZ3RoID4gbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRleHQuc3Vic3RyaW5nKDAsIGxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpICsgc3VmZml4XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtjb250ZXh0LndyaXRlci53cmFwSW5Db2xvcignUmVzdWx0OiAnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0ke3Jlc3VsdH1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3cml0ZURlc2NyaXB0aW9uOiAoY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCdUcnVuY2F0ZSBhIHN0cmluZyB0byBhIG1heGltdW0gbGVuZ3RoIHdpdGggYW4gZWxsaXBzaXMnKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk4sgVXNhZ2U6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyB0cnVuY2F0ZSA8dGV4dD4gWy0tbGVuZ3RoPU5dIFstLXN1ZmZpeD1TXScsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyAtLSBQYWQgLS1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAncGFkJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1BhZCBhIHN0cmluZyB0byBhIHRhcmdldCBsZW5ndGgnLFxuICAgICAgICAgICAgICAgIGFsbG93VW5saXN0ZWRDb21tYW5kczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2xlbmd0aCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ2wnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGFyZ2V0IGxlbmd0aCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY2hhcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ2MnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUGFkZGluZyBjaGFyYWN0ZXIgKGRlZmF1bHQ6IHNwYWNlKScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NpZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdQYWQgc2lkZTogbGVmdCwgcmlnaHQsIGJvdGggKGRlZmF1bHQ6IGJvdGgpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNvbW1hbmQudmFsdWUgfHwgY29tbWFuZC5kYXRhIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KGNvbW1hbmQuYXJnc1snbGVuZ3RoJ10gfHwgY29tbWFuZC5hcmdzWydsJ10pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyID0gY29tbWFuZC5hcmdzWydjaGFyJ10gfHwgY29tbWFuZC5hcmdzWydjJ10gfHwgJyAnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWRlID0gY29tbWFuZC5hcmdzWydzaWRlJ10gfHwgJ2JvdGgnO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZUVycm9yKCctLWxlbmd0aCBpcyByZXF1aXJlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZXNzLmV4aXQoLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRleHQucGFkU3RhcnQobGVuZ3RoLCBjaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGV4dC5wYWRFbmQobGVuZ3RoLCBjaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbG9kYXNoLnBhZCh0ZXh0LCBsZW5ndGgsIGNoYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2NvbnRleHQud3JpdGVyLndyYXBJbkNvbG9yKCdSZXN1bHQ6ICcsIENsaUZvcmVncm91bmRDb2xvci5ZZWxsb3cpfVwiJHtyZXN1bHR9XCJgLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3cml0ZURlc2NyaXB0aW9uOiAoY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCdQYWQgYSBzdHJpbmcgdG8gYSB0YXJnZXQgbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OLIFVzYWdlOicpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzdHJpbmcgcGFkIDx0ZXh0PiAtLWxlbmd0aD1OIFstLWNoYXI9Q10gWy0tc2lkZT1sZWZ0fHJpZ2h0fGJvdGhdJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OdIEV4YW1wbGVzOicpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgIHN0cmluZyBwYWQgaGVsbG8gLS1sZW5ndGg9MTAgLS1jaGFyPS4gLS1zaWRlPXJpZ2h0YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignIyDihpIgXCJoZWxsby4uLi4uXCInLCBDbGlGb3JlZ3JvdW5kQ29sb3IuR3JlZW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIC0tIFNwbGl0IC0tXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ3NwbGl0JyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NwbGl0IGEgc3RyaW5nIGJ5IGEgZGVsaW1pdGVyJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdieScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ2QnLCAnZGVsaW1pdGVyJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0RlbGltaXRlciB0byBzcGxpdCBieSAoZGVmYXVsdDogc3BhY2UpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNvbW1hbmQudmFsdWUgfHwgY29tbWFuZC5kYXRhIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGltaXRlciA9IGNvbW1hbmQuYXJnc1snYnknXSB8fCBjb21tYW5kLmFyZ3NbJ2QnXSB8fCBjb21tYW5kLmFyZ3NbJ2RlbGltaXRlciddIHx8ICcgJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSB0ZXh0LnNwbGl0KGRlbGltaXRlcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLmZvckVhY2goKHBhcnQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKFN0cmluZyhpKS5wYWRTdGFydCgzKSwgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyl9ICAke3BhcnR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHBhcnRzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ1NwbGl0IGEgc3RyaW5nIGludG8gcGFydHMgYnkgYSBkZWxpbWl0ZXInKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk4sgVXNhZ2U6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyBzcGxpdCA8dGV4dD4gWy0tYnk9PGRlbGltaXRlcj5dJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OdIEV4YW1wbGVzOicpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgIHN0cmluZyBzcGxpdCBcImEsYixjXCIgLS1ieT0sICAgICAgJHt3cml0ZXIud3JhcEluQ29sb3IoJyMg4oaSIGEgIGIgIGMnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuR3JlZW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIC0tIFdvcmRzIC0tXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ3dvcmRzJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NwbGl0IGEgc3RyaW5nIGludG8gd29yZHMnLFxuICAgICAgICAgICAgICAgIGFsbG93VW5saXN0ZWRDb21tYW5kczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjb21tYW5kLnZhbHVlIHx8IGNvbW1hbmQuZGF0YSB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3Jkczogc3RyaW5nW10gPSBsb2Rhc2gud29yZHModGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7d3JpdGVyLndyYXBJbkNvbG9yKGAke3dvcmRzLmxlbmd0aH0gd29yZHM6YCwgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyl9ICR7d29yZHMuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHdvcmRzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ1NwbGl0IGEgc3RyaW5nIGludG8gaXRzIGNvbXBvbmVudCB3b3JkcycpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHdvcmRzIDx0ZXh0PicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TnSBFeGFtcGxlczonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICBzdHJpbmcgd29yZHMgXCJoZWxsb1dvcmxkXCIgICAgICAgICAke3dyaXRlci53cmFwSW5Db2xvcignIyDihpIgaGVsbG8sIFdvcmxkJywgQ2xpRm9yZWdyb3VuZENvbG9yLkdyZWVuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgIHN0cmluZyB3b3JkcyBcImZvby1iYXJfYmF6XCIgICAgICAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCcjIOKGkiBmb28sIGJhciwgYmF6JywgQ2xpRm9yZWdyb3VuZENvbG9yLkdyZWVuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyAtLSBBbmFseXNpcyAtLVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdsZW5ndGgnLFxuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnbGVuJ10sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdHZXQgdGhlIGxlbmd0aCBvZiBhIHN0cmluZycsXG4gICAgICAgICAgICAgICAgYWxsb3dVbmxpc3RlZENvbW1hbmRzOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNvbW1hbmQudmFsdWUgfHwgY29tbWFuZC5kYXRhIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtjb250ZXh0LndyaXRlci53cmFwSW5Db2xvcignUmVzdWx0OiAnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0ke3RleHQubGVuZ3RofWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQodGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JpdGVEZXNjcmlwdGlvbjogKGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbignR2V0IHRoZSBjaGFyYWN0ZXIgY291bnQgb2YgYSBzdHJpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk4sgVXNhZ2U6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyBsZW5ndGggPHRleHQ+JywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ3djJyxcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ3dvcmRjb3VudCcsICdjb3VudCddLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ291bnQgbGluZXMsIHdvcmRzLCBjaGFyYWN0ZXJzLCBhbmQgYnl0ZXMnLFxuICAgICAgICAgICAgICAgIGFsbG93VW5saXN0ZWRDb21tYW5kczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjb21tYW5kLnZhbHVlIHx8IGNvbW1hbmQuZGF0YSB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoL1xccj9cXG4vKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRDb3VudCA9IHRleHQudHJpbSgpID8gdGV4dC50cmltKCkuc3BsaXQoL1xccysvKS5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFycyA9IHRleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignTGluZXM6JywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAgICAgICAke2xpbmVzfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ1dvcmRzOicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gICAgICAgJHt3b3JkQ291bnR9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignQ2hhcmFjdGVyczonLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9ICAke2NoYXJzfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ0J5dGVzOicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gICAgICAgJHtieXRlc31gLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQoeyBsaW5lcywgd29yZHM6IHdvcmRDb3VudCwgY2hhcnMsIGJ5dGVzIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JpdGVEZXNjcmlwdGlvbjogKGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbignQ291bnQgbGluZXMsIHdvcmRzLCBjaGFyYWN0ZXJzLCBhbmQgYnl0ZXMgaW4gdGV4dCcpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHdjIDx0ZXh0PicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdpbmNsdWRlcycsXG4gICAgICAgICAgICAgICAgYWxpYXNlczogWydjb250YWlucycsICdoYXMnXSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGEgc3Vic3RyaW5nJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTdWJzdHJpbmcgdG8gc2VhcmNoIGZvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNvbW1hbmQudmFsdWUgfHwgY29tbWFuZC5kYXRhIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmQgPSBjb21tYW5kLmFyZ3NbJ2ZpbmQnXSB8fCBjb21tYW5kLmFyZ3NbJ2YnXSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGV4dC5pbmNsdWRlcyhmaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3VjY2VzcyhgXCIke2ZpbmR9XCIgZm91bmQgaW4gc3RyaW5nYCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFcnJvcihgXCIke2ZpbmR9XCIgbm90IGZvdW5kIGluIHN0cmluZ2ApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ0NoZWNrIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGEgZ2l2ZW4gc3Vic3RyaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKCfwn5OLIFVzYWdlOicpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzdHJpbmcgaW5jbHVkZXMgPHRleHQ+IC0tZmluZD08c3Vic3RyaW5nPicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdzdGFydHNXaXRoJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgcHJlZml4JyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdQcmVmaXggdG8gY2hlY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjb21tYW5kLnZhbHVlIHx8IGNvbW1hbmQuZGF0YSB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kID0gY29tbWFuZC5hcmdzWydmaW5kJ10gfHwgY29tbWFuZC5hcmdzWydmJ10gfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQuc3RhcnRzV2l0aChmaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHt3cml0ZXIud3JhcEluQ29sb3IoJ1Jlc3VsdDogJywgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyl9JHtyZXN1bHR9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZXNzLm91dHB1dChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JpdGVEZXNjcmlwdGlvbjogKGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbignQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggYSBnaXZlbiBwcmVmaXgnKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk4sgVXNhZ2U6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyBzdGFydHNXaXRoIDx0ZXh0PiAtLWZpbmQ9PHByZWZpeD4nLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAnZW5kc1dpdGgnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgaWYgYSBzdHJpbmcgZW5kcyB3aXRoIGEgc3VmZml4JyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTdWZmaXggdG8gY2hlY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjb21tYW5kLnZhbHVlIHx8IGNvbW1hbmQuZGF0YSB8fCAnJykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kID0gY29tbWFuZC5hcmdzWydmaW5kJ10gfHwgY29tbWFuZC5hcmdzWydmJ10gfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRleHQuZW5kc1dpdGgoZmluZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7d3JpdGVyLndyYXBJbkNvbG9yKCdSZXN1bHQ6ICcsIENsaUZvcmVncm91bmRDb2xvci5ZZWxsb3cpfSR7cmVzdWx0fWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oJ0NoZWNrIGlmIGEgc3RyaW5nIGVuZHMgd2l0aCBhIGdpdmVuIHN1ZmZpeCcpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIGVuZHNXaXRoIDx0ZXh0PiAtLWZpbmQ9PHN1ZmZpeD4nLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzQ29tbWFuZChcbiAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb250ZXh0LmV4ZWN1dG9yLnNob3dIZWxwKGNvbW1hbmQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHdyaXRlRGVzY3JpcHRpb24oY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKCdTdHJpbmcgbWFuaXB1bGF0aW9uIGFuZCBhbmFseXNpcyBjb21tYW5kcycpO1xuICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgIHdyaXRlci53cmFwSW5Db2xvcign8J+UoCBDYXNlIENvbnZlcnNpb25zOicsIENsaUZvcmVncm91bmRDb2xvci5ZZWxsb3cpLFxuICAgICAgICApO1xuICAgICAgICB3cml0ZXIud3JpdGVsbihgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHVwcGVyJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCdsb3dlcicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gLyAke3dyaXRlci53cmFwSW5Db2xvcignY2FwaXRhbGl6ZScsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyBjYW1lbENhc2UnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC8gJHt3cml0ZXIud3JhcEluQ29sb3IoJ2tlYmFiQ2FzZScsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gLyAke3dyaXRlci53cmFwSW5Db2xvcignc25ha2VDYXNlJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzdGFydENhc2UnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9YCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgd3JpdGVyLndyYXBJbkNvbG9yKCfwn5SnIFRyYW5zZm9ybTonLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KSxcbiAgICAgICAgKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0cmluZyByZXZlcnNlJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCd0cmltJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzbHVnJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCdyZXBlYXQnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC8gJHt3cml0ZXIud3JhcEluQ29sb3IoJ3JlcGxhY2UnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC8gJHt3cml0ZXIud3JhcEluQ29sb3IoJ3RydW5jYXRlJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWApO1xuICAgICAgICB3cml0ZXIud3JpdGVsbihgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHBhZCcsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gLyAke3dyaXRlci53cmFwSW5Db2xvcignZXNjYXBlJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCd1bmVzY2FwZScsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICB3cml0ZXIud3JhcEluQ29sb3IoJ/CflI0gQW5hbHlzaXM6JywgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyksXG4gICAgICAgICk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzdHJpbmcgbGVuZ3RoJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCd3YycsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gLyAke3dyaXRlci53cmFwSW5Db2xvcignaW5jbHVkZXMnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC8gJHt3cml0ZXIud3JhcEluQ29sb3IoJ3N0YXJ0c1dpdGgnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC8gJHt3cml0ZXIud3JhcEluQ29sb3IoJ2VuZHNXaXRoJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfWApO1xuICAgICAgICB3cml0ZXIud3JpdGVsbihgICAke3dyaXRlci53cmFwSW5Db2xvcignc3RyaW5nIHNwbGl0JywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAvICR7d3JpdGVyLndyYXBJbkNvbG9yKCd3b3JkcycsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX1gKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oJ/Cfk50gRXhhbXBsZXM6Jyk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgIHN0cmluZyBjYW1lbENhc2UgXCJoZWxsbyB3b3JsZFwiICAgICAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCcjIOKGkiBoZWxsb1dvcmxkJywgQ2xpRm9yZWdyb3VuZENvbG9yLkdyZWVuKX1gKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYCAgc3RyaW5nIHJldmVyc2UgSGVsbG8gICAgICAgICAgICAgICAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCcjIOKGkiBvbGxlSCcsIENsaUZvcmVncm91bmRDb2xvci5HcmVlbil9YCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgIHN0cmluZyBzbHVnIFwiSGVsbG8gV29ybGQhXCIgICAgICAgICAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCcjIOKGkiBoZWxsby13b3JsZCcsIENsaUZvcmVncm91bmRDb2xvci5HcmVlbil9YCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgIHN0cmluZyB3YyBcInNvbWUgdGV4dCBoZXJlXCIgICAgICAgICAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCcjIHdvcmQvY2hhciBjb3VudHMnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuR3JlZW4pfWApO1xuICAgIH1cbn1cbiJdfQ==