css-to-tailwind-react 0.2.2 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,18 +6,22 @@ class TailwindMapper {
6
6
  constructor(config) {
7
7
  this.config = config;
8
8
  this.spacingScale = this.buildSpacingScale();
9
+ this.maxWidthScale = this.buildMaxWidthScale();
10
+ this.fontSizeScale = this.buildFontSizeScale();
11
+ this.lineHeightScale = this.buildLineHeightScale();
12
+ this.letterSpacingScale = this.buildLetterSpacingScale();
13
+ this.zIndexScale = this.buildZIndexScale();
14
+ this.opacityScale = this.buildOpacityScale();
9
15
  }
10
16
  buildSpacingScale() {
11
17
  const scale = new Map();
12
18
  const spacing = this.config.theme?.spacing || {};
13
19
  Object.entries(spacing).forEach(([key, value]) => {
14
- // Convert rem to pixels for comparison (assuming 1rem = 16px)
15
20
  const remMatch = value.match(/([\d.]+)rem/);
16
21
  if (remMatch) {
17
22
  const pixels = parseFloat(remMatch[1]) * 16;
18
23
  scale.set(Math.round(pixels), key);
19
24
  }
20
- // Also handle pixel values
21
25
  const pxMatch = value.match(/([\d.]+)px/);
22
26
  if (pxMatch) {
23
27
  scale.set(Math.round(parseFloat(pxMatch[1])), key);
@@ -25,12 +29,114 @@ class TailwindMapper {
25
29
  });
26
30
  return scale;
27
31
  }
32
+ buildMaxWidthScale() {
33
+ const scale = new Map();
34
+ const maxWidth = this.config.theme?.maxWidth || {};
35
+ Object.entries(maxWidth).forEach(([key, value]) => {
36
+ if (typeof value === 'string') {
37
+ scale.set(value, key);
38
+ }
39
+ });
40
+ scale.set('100%', 'full');
41
+ scale.set('min-content', 'min');
42
+ scale.set('max-content', 'max');
43
+ scale.set('fit-content', 'fit');
44
+ return scale;
45
+ }
46
+ buildFontSizeScale() {
47
+ const scale = new Map();
48
+ const fontSize = this.config.theme?.fontSize || {};
49
+ Object.entries(fontSize).forEach(([key, value]) => {
50
+ if (typeof value === 'string') {
51
+ const remMatch = value.match(/([\d.]+)rem/);
52
+ if (remMatch) {
53
+ scale.set(Math.round(parseFloat(remMatch[1]) * 16), key);
54
+ }
55
+ const pxMatch = value.match(/([\d.]+)px/);
56
+ if (pxMatch) {
57
+ scale.set(Math.round(parseFloat(pxMatch[1])), key);
58
+ }
59
+ }
60
+ else if (Array.isArray(value) && typeof value[0] === 'string') {
61
+ const remMatch = value[0].match(/([\d.]+)rem/);
62
+ if (remMatch) {
63
+ scale.set(Math.round(parseFloat(remMatch[1]) * 16), key);
64
+ }
65
+ const pxMatch = value[0].match(/([\d.]+)px/);
66
+ if (pxMatch) {
67
+ scale.set(Math.round(parseFloat(pxMatch[1])), key);
68
+ }
69
+ }
70
+ });
71
+ return scale;
72
+ }
73
+ buildLineHeightScale() {
74
+ const scale = new Map();
75
+ const lineHeight = this.config.theme?.lineHeight || {};
76
+ Object.entries(lineHeight).forEach(([key, value]) => {
77
+ if (typeof value === 'string') {
78
+ scale.set(value, key);
79
+ }
80
+ });
81
+ scale.set('1', 'none');
82
+ scale.set('1.25', 'tight');
83
+ scale.set('1.375', 'snug');
84
+ scale.set('1.5', 'normal');
85
+ scale.set('1.625', 'relaxed');
86
+ scale.set('2', 'loose');
87
+ return scale;
88
+ }
89
+ buildLetterSpacingScale() {
90
+ const scale = new Map();
91
+ const letterSpacing = this.config.theme?.letterSpacing || {};
92
+ Object.entries(letterSpacing).forEach(([key, value]) => {
93
+ if (typeof value === 'string') {
94
+ scale.set(value, key);
95
+ }
96
+ });
97
+ return scale;
98
+ }
99
+ buildZIndexScale() {
100
+ const scale = new Map();
101
+ const zIndex = this.config.theme?.zIndex || {};
102
+ Object.entries(zIndex).forEach(([key, value]) => {
103
+ if (typeof value === 'string') {
104
+ const num = parseInt(value, 10);
105
+ if (!isNaN(num)) {
106
+ scale.set(num, key);
107
+ }
108
+ }
109
+ });
110
+ scale.set(0, '0');
111
+ scale.set(10, '10');
112
+ scale.set(20, '20');
113
+ scale.set(30, '30');
114
+ scale.set(40, '40');
115
+ scale.set(50, '50');
116
+ return scale;
117
+ }
118
+ buildOpacityScale() {
119
+ const scale = new Map();
120
+ const opacity = this.config.theme?.opacity || {};
121
+ Object.entries(opacity).forEach(([key, value]) => {
122
+ if (typeof value === 'string' || typeof value === 'number') {
123
+ const num = typeof value === 'string' ? parseFloat(value) : value;
124
+ if (!isNaN(num)) {
125
+ scale.set(Math.round(num * 100), key);
126
+ }
127
+ }
128
+ });
129
+ for (let i = 0; i <= 100; i += 5) {
130
+ if (!scale.has(i)) {
131
+ scale.set(i, String(i));
132
+ }
133
+ }
134
+ return scale;
135
+ }
28
136
  pxToSpacing(px) {
29
- // Try exact match first
30
137
  if (this.spacingScale.has(px)) {
31
138
  return this.spacingScale.get(px);
32
139
  }
33
- // Find closest match
34
140
  let closestKey = null;
35
141
  let closestDiff = Infinity;
36
142
  this.spacingScale.forEach((_, key) => {
@@ -40,7 +146,6 @@ class TailwindMapper {
40
146
  closestDiff = diff;
41
147
  }
42
148
  });
43
- // Only accept if within reasonable tolerance (20%)
44
149
  if (closestKey !== null && closestDiff / px < 0.2) {
45
150
  return this.spacingScale.get(closestKey) || null;
46
151
  }
@@ -51,79 +156,275 @@ class TailwindMapper {
51
156
  if (pxMatch) {
52
157
  return parseFloat(pxMatch[1]);
53
158
  }
54
- // Handle rem values
55
159
  const remMatch = value.match(/^([\d.]+)rem$/);
56
160
  if (remMatch) {
57
161
  return parseFloat(remMatch[1]) * 16;
58
162
  }
59
163
  return null;
60
164
  }
165
+ parseSpacingValue(value) {
166
+ const px = this.extractPx(value);
167
+ const spacingKey = px !== null ? this.pxToSpacing(px) : null;
168
+ return {
169
+ value,
170
+ px,
171
+ spacingKey
172
+ };
173
+ }
174
+ buildSpacingUtility(prefix, parsed) {
175
+ if (parsed.spacingKey) {
176
+ return `${prefix}-${parsed.spacingKey}`;
177
+ }
178
+ return `${prefix}-[${parsed.value}]`;
179
+ }
180
+ tokenizeValue(value) {
181
+ const tokens = [];
182
+ let current = '';
183
+ let parenDepth = 0;
184
+ let inFunction = false;
185
+ for (let i = 0; i < value.length; i++) {
186
+ const char = value[i];
187
+ if (char === '(') {
188
+ parenDepth++;
189
+ inFunction = true;
190
+ current += char;
191
+ }
192
+ else if (char === ')') {
193
+ parenDepth--;
194
+ current += char;
195
+ if (parenDepth === 0) {
196
+ inFunction = false;
197
+ }
198
+ }
199
+ else if (char === ' ' && parenDepth === 0) {
200
+ if (current.trim()) {
201
+ tokens.push(current.trim());
202
+ }
203
+ current = '';
204
+ }
205
+ else {
206
+ current += char;
207
+ }
208
+ }
209
+ if (current.trim()) {
210
+ tokens.push(current.trim());
211
+ }
212
+ return tokens;
213
+ }
61
214
  convertProperty(property, value) {
62
215
  const normalizedProp = property.toLowerCase().trim();
63
216
  const normalizedValue = value.toLowerCase().trim();
64
217
  logger_1.logger.verbose(`Converting: ${normalizedProp}: ${normalizedValue}`);
65
- // Display properties
66
218
  if (normalizedProp === 'display') {
67
219
  return this.convertDisplay(normalizedValue);
68
220
  }
69
- // Position properties
70
221
  if (normalizedProp === 'position') {
71
222
  return { className: normalizedValue, skipped: false };
72
223
  }
73
- // Margin properties
74
224
  if (normalizedProp.startsWith('margin')) {
75
225
  return this.convertMargin(normalizedProp, normalizedValue);
76
226
  }
77
- // Padding properties
78
227
  if (normalizedProp.startsWith('padding')) {
79
228
  return this.convertPadding(normalizedProp, normalizedValue);
80
229
  }
81
- // Font properties
230
+ if (normalizedProp === 'max-width' || normalizedProp === 'min-width') {
231
+ return this.convertDimensionConstraint(normalizedProp, normalizedValue);
232
+ }
233
+ if (normalizedProp === 'max-height' || normalizedProp === 'min-height') {
234
+ return this.convertDimensionConstraint(normalizedProp, normalizedValue);
235
+ }
236
+ if (normalizedProp === 'width') {
237
+ return this.convertWidth(normalizedValue);
238
+ }
239
+ if (normalizedProp === 'height') {
240
+ return this.convertHeight(normalizedValue);
241
+ }
82
242
  if (normalizedProp === 'font-weight') {
83
243
  return this.convertFontWeight(normalizedValue);
84
244
  }
85
245
  if (normalizedProp === 'font-size') {
86
246
  return this.convertFontSize(normalizedValue);
87
247
  }
88
- // Text properties
89
248
  if (normalizedProp === 'text-align') {
90
249
  return { className: `text-${normalizedValue}`, skipped: false };
91
250
  }
92
- // Flexbox properties
251
+ if (normalizedProp === 'text-decoration') {
252
+ return this.convertTextDecoration(normalizedValue);
253
+ }
254
+ if (normalizedProp === 'text-transform') {
255
+ return this.convertTextTransform(normalizedValue);
256
+ }
257
+ if (normalizedProp === 'letter-spacing') {
258
+ return this.convertLetterSpacing(normalizedValue);
259
+ }
260
+ if (normalizedProp === 'line-height') {
261
+ return this.convertLineHeight(normalizedValue);
262
+ }
93
263
  if (normalizedProp.startsWith('flex') ||
94
264
  normalizedProp.startsWith('justify') ||
95
265
  normalizedProp.startsWith('align')) {
96
266
  return this.convertFlexbox(normalizedProp, normalizedValue);
97
267
  }
98
- // Gap properties
99
268
  if (normalizedProp === 'gap') {
100
269
  return this.convertGap(normalizedValue);
101
270
  }
102
- // Width and Height
103
- if (normalizedProp === 'width') {
104
- return this.convertWidth(normalizedValue);
105
- }
106
- if (normalizedProp === 'height') {
107
- return this.convertHeight(normalizedValue);
108
- }
109
- // Colors
110
271
  if (normalizedProp === 'background-color') {
111
272
  return this.convertBackgroundColor(normalizedValue);
112
273
  }
113
274
  if (normalizedProp === 'color') {
114
275
  return this.convertTextColor(normalizedValue);
115
276
  }
116
- // Border radius
117
277
  if (normalizedProp === 'border-radius') {
118
278
  return this.convertBorderRadius(normalizedValue);
119
279
  }
120
- // Unsupported properties
280
+ if (normalizedProp.startsWith('border')) {
281
+ return this.convertBorder(normalizedProp, normalizedValue);
282
+ }
283
+ if (normalizedProp === 'aspect-ratio') {
284
+ return this.convertAspectRatio(normalizedValue);
285
+ }
286
+ if (normalizedProp === 'overflow' || normalizedProp === 'overflow-x' || normalizedProp === 'overflow-y') {
287
+ return this.convertOverflow(normalizedProp, normalizedValue);
288
+ }
289
+ if (normalizedProp === 'object-fit') {
290
+ return this.convertObjectFit(normalizedValue);
291
+ }
292
+ if (normalizedProp === 'object-position') {
293
+ return this.convertObjectPosition(normalizedValue);
294
+ }
295
+ if (normalizedProp === 'opacity') {
296
+ return this.convertOpacity(normalizedValue);
297
+ }
298
+ if (normalizedProp === 'word-break') {
299
+ return this.convertWordBreak(normalizedValue);
300
+ }
301
+ if (normalizedProp === 'z-index') {
302
+ return this.convertZIndex(normalizedValue);
303
+ }
121
304
  return {
122
305
  className: null,
123
306
  skipped: true,
124
307
  reason: `Unsupported property: ${property}`
125
308
  };
126
309
  }
310
+ convertPropertyWithMultiple(property, value) {
311
+ const normalizedProp = property.toLowerCase().trim();
312
+ const normalizedValue = value.toLowerCase().trim();
313
+ if (normalizedProp === 'margin' || normalizedProp === 'padding') {
314
+ return this.convertSpacingShorthand(normalizedProp, normalizedValue);
315
+ }
316
+ if (normalizedProp === 'border') {
317
+ return this.convertBorderShorthand(normalizedValue);
318
+ }
319
+ if (normalizedProp.startsWith('border-') &&
320
+ ['border-top', 'border-right', 'border-bottom', 'border-left'].includes(normalizedProp)) {
321
+ return this.convertDirectionalBorderShorthand(normalizedProp, normalizedValue);
322
+ }
323
+ if (normalizedProp === 'flex') {
324
+ return this.convertFlexShorthand(normalizedValue);
325
+ }
326
+ const result = this.convertProperty(property, value);
327
+ return {
328
+ classes: result.className ? [result.className] : [],
329
+ warnings: result.reason ? [result.reason] : [],
330
+ cssProperties: result.className ? [property] : []
331
+ };
332
+ }
333
+ convertSpacingShorthand(prop, value) {
334
+ const tokens = this.tokenizeValue(value);
335
+ const classes = [];
336
+ const warnings = [];
337
+ const cssProperties = [];
338
+ const prefix = prop === 'margin' ? 'm' : 'p';
339
+ const propPrefix = prop === 'margin' ? 'margin' : 'padding';
340
+ if (tokens.length === 0) {
341
+ return { classes, warnings: ['Empty spacing value'], cssProperties };
342
+ }
343
+ const parsedTokens = tokens.map(t => this.parseSpacingValue(t));
344
+ if (tokens.length === 1) {
345
+ const parsed = parsedTokens[0];
346
+ if (parsed.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
347
+ classes.push(this.buildSpacingUtility(prefix, parsed));
348
+ cssProperties.push(prop);
349
+ }
350
+ else {
351
+ warnings.push(`Invalid ${prop} value: ${tokens[0]}`);
352
+ }
353
+ }
354
+ else if (tokens.length === 2) {
355
+ const [vertical, horizontal] = parsedTokens;
356
+ if (vertical.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
357
+ classes.push(this.buildSpacingUtility(`${prefix}y`, vertical));
358
+ cssProperties.push(`${propPrefix}-y`);
359
+ }
360
+ else {
361
+ warnings.push(`Invalid ${prop} vertical value: ${tokens[0]}`);
362
+ }
363
+ if (horizontal.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[1])) {
364
+ classes.push(this.buildSpacingUtility(`${prefix}x`, horizontal));
365
+ cssProperties.push(`${propPrefix}-x`);
366
+ }
367
+ else {
368
+ warnings.push(`Invalid ${prop} horizontal value: ${tokens[1]}`);
369
+ }
370
+ }
371
+ else if (tokens.length === 3) {
372
+ const [top, horizontal, bottom] = parsedTokens;
373
+ if (top.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
374
+ classes.push(this.buildSpacingUtility(`${prefix}t`, top));
375
+ cssProperties.push(`${propPrefix}-top`);
376
+ }
377
+ else {
378
+ warnings.push(`Invalid ${prop}-top value: ${tokens[0]}`);
379
+ }
380
+ if (horizontal.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[1])) {
381
+ classes.push(this.buildSpacingUtility(`${prefix}x`, horizontal));
382
+ cssProperties.push(`${propPrefix}-x`);
383
+ }
384
+ else {
385
+ warnings.push(`Invalid ${prop} horizontal value: ${tokens[1]}`);
386
+ }
387
+ if (bottom.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[2])) {
388
+ classes.push(this.buildSpacingUtility(`${prefix}b`, bottom));
389
+ cssProperties.push(`${propPrefix}-bottom`);
390
+ }
391
+ else {
392
+ warnings.push(`Invalid ${prop}-bottom value: ${tokens[2]}`);
393
+ }
394
+ }
395
+ else if (tokens.length >= 4) {
396
+ const [top, right, bottom, left] = parsedTokens;
397
+ if (top.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
398
+ classes.push(this.buildSpacingUtility(`${prefix}t`, top));
399
+ cssProperties.push(`${propPrefix}-top`);
400
+ }
401
+ else {
402
+ warnings.push(`Invalid ${prop}-top value: ${tokens[0]}`);
403
+ }
404
+ if (right.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[1])) {
405
+ classes.push(this.buildSpacingUtility(`${prefix}r`, right));
406
+ cssProperties.push(`${propPrefix}-right`);
407
+ }
408
+ else {
409
+ warnings.push(`Invalid ${prop}-right value: ${tokens[1]}`);
410
+ }
411
+ if (bottom.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[2])) {
412
+ classes.push(this.buildSpacingUtility(`${prefix}b`, bottom));
413
+ cssProperties.push(`${propPrefix}-bottom`);
414
+ }
415
+ else {
416
+ warnings.push(`Invalid ${prop}-bottom value: ${tokens[2]}`);
417
+ }
418
+ if (left.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[3])) {
419
+ classes.push(this.buildSpacingUtility(`${prefix}l`, left));
420
+ cssProperties.push(`${propPrefix}-left`);
421
+ }
422
+ else {
423
+ warnings.push(`Invalid ${prop}-left value: ${tokens[3]}`);
424
+ }
425
+ }
426
+ return { classes, warnings, cssProperties };
427
+ }
127
428
  convertDisplay(value) {
128
429
  const displayMap = {
129
430
  'flex': 'flex',
@@ -131,10 +432,14 @@ class TailwindMapper {
131
432
  'inline': 'inline',
132
433
  'inline-block': 'inline-block',
133
434
  'grid': 'grid',
435
+ 'inline-flex': 'inline-flex',
436
+ 'inline-grid': 'inline-grid',
134
437
  'none': 'hidden',
135
438
  'contents': 'contents',
136
439
  'table': 'table',
137
- 'table-cell': 'table-cell'
440
+ 'table-cell': 'table-cell',
441
+ 'table-row': 'table-row',
442
+ 'flow-root': 'flow-root'
138
443
  };
139
444
  if (displayMap[value]) {
140
445
  return { className: displayMap[value], skipped: false };
@@ -142,14 +447,6 @@ class TailwindMapper {
142
447
  return { className: null, skipped: true, reason: `Unknown display value: ${value}` };
143
448
  }
144
449
  convertMargin(prop, value) {
145
- const px = this.extractPx(value);
146
- if (px === null) {
147
- return { className: null, skipped: true, reason: `Non-pixel margin value: ${value}` };
148
- }
149
- const spacing = this.pxToSpacing(px);
150
- if (!spacing) {
151
- return { className: null, skipped: true, reason: `No matching spacing for: ${value}` };
152
- }
153
450
  const sideMap = {
154
451
  'margin': 'm',
155
452
  'margin-top': 'mt',
@@ -160,17 +457,26 @@ class TailwindMapper {
160
457
  'margin-y': 'my'
161
458
  };
162
459
  const prefix = sideMap[prop] || 'm';
163
- return { className: `${prefix}-${spacing}`, skipped: false };
164
- }
165
- convertPadding(prop, value) {
166
- const px = this.extractPx(value);
460
+ const isNegative = value.startsWith('-');
461
+ const absoluteValue = isNegative ? value.slice(1) : value;
462
+ const px = this.extractPx(absoluteValue);
463
+ if (value === 'auto') {
464
+ return { className: `${prefix}-auto`, skipped: false };
465
+ }
167
466
  if (px === null) {
168
- return { className: null, skipped: true, reason: `Non-pixel padding value: ${value}` };
467
+ if (/^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
468
+ return { className: `${prefix}-[${value}]`, skipped: false };
469
+ }
470
+ return { className: null, skipped: true, reason: `Non-pixel margin value: ${value}` };
169
471
  }
170
472
  const spacing = this.pxToSpacing(px);
171
473
  if (!spacing) {
172
- return { className: null, skipped: true, reason: `No matching spacing for: ${value}` };
474
+ return { className: `${prefix}-[${value}]`, skipped: false };
173
475
  }
476
+ return { className: isNegative ? `-${prefix}-${spacing}` : `${prefix}-${spacing}`, skipped: false };
477
+ }
478
+ convertPadding(prop, value) {
479
+ const px = this.extractPx(value);
174
480
  const sideMap = {
175
481
  'padding': 'p',
176
482
  'padding-top': 'pt',
@@ -181,8 +487,68 @@ class TailwindMapper {
181
487
  'padding-y': 'py'
182
488
  };
183
489
  const prefix = sideMap[prop] || 'p';
490
+ if (px === null) {
491
+ if (/^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
492
+ return { className: `${prefix}-[${value}]`, skipped: false };
493
+ }
494
+ return { className: null, skipped: true, reason: `Non-pixel padding value: ${value}` };
495
+ }
496
+ const spacing = this.pxToSpacing(px);
497
+ if (!spacing) {
498
+ return { className: `${prefix}-[${value}]`, skipped: false };
499
+ }
184
500
  return { className: `${prefix}-${spacing}`, skipped: false };
185
501
  }
502
+ convertDimensionConstraint(prop, value) {
503
+ const prefixMap = {
504
+ 'max-width': 'max-w',
505
+ 'min-width': 'min-w',
506
+ 'max-height': 'max-h',
507
+ 'min-height': 'min-h'
508
+ };
509
+ const prefix = prefixMap[prop];
510
+ if (value === '100%') {
511
+ return { className: `${prefix}-full`, skipped: false };
512
+ }
513
+ if (value === '0' || value === '0px') {
514
+ return { className: `${prefix}-0`, skipped: false };
515
+ }
516
+ if (value === 'none') {
517
+ return { className: `${prefix}-none`, skipped: false };
518
+ }
519
+ if (prop === 'max-width') {
520
+ if (value === 'min-content') {
521
+ return { className: 'max-w-min', skipped: false };
522
+ }
523
+ if (value === 'max-content') {
524
+ return { className: 'max-w-max', skipped: false };
525
+ }
526
+ if (value === 'fit-content') {
527
+ return { className: 'max-w-fit', skipped: false };
528
+ }
529
+ const maxWProseSizes = {
530
+ '65ch': 'prose',
531
+ '80ch': 'prose-lg'
532
+ };
533
+ if (maxWProseSizes[value]) {
534
+ return { className: `max-w-${maxWProseSizes[value]}`, skipped: false };
535
+ }
536
+ if (this.maxWidthScale.has(value)) {
537
+ return { className: `max-w-${this.maxWidthScale.get(value)}`, skipped: false };
538
+ }
539
+ }
540
+ const px = this.extractPx(value);
541
+ if (px !== null) {
542
+ const spacing = this.pxToSpacing(px);
543
+ if (spacing) {
544
+ return { className: `${prefix}-${spacing}`, skipped: false };
545
+ }
546
+ }
547
+ if (/^\d+(\.\d+)?(px|rem|em|%|ch|vw|vh)?$/.test(value)) {
548
+ return { className: `${prefix}-[${value}]`, skipped: false };
549
+ }
550
+ return { className: null, skipped: true, reason: `Complex ${prop} value: ${value}` };
551
+ }
186
552
  convertFontWeight(value) {
187
553
  const weightMap = {
188
554
  '100': 'font-thin',
@@ -205,29 +571,86 @@ class TailwindMapper {
205
571
  convertFontSize(value) {
206
572
  const px = this.extractPx(value);
207
573
  if (px !== null) {
208
- // Map common font sizes
209
- const sizeMap = {
210
- 12: 'text-xs',
211
- 14: 'text-sm',
212
- 16: 'text-base',
213
- 18: 'text-lg',
214
- 20: 'text-xl',
215
- 24: 'text-2xl',
216
- 30: 'text-3xl',
217
- 36: 'text-4xl',
218
- 48: 'text-5xl'
219
- };
220
- const closest = Object.keys(sizeMap)
221
- .map(Number)
222
- .reduce((prev, curr) => Math.abs(curr - px) < Math.abs(prev - px) ? curr : prev);
223
- if (Math.abs(closest - px) / px < 0.15) {
224
- return { className: sizeMap[closest], skipped: false };
574
+ if (this.fontSizeScale.has(px)) {
575
+ return { className: `text-${this.fontSizeScale.get(px)}`, skipped: false };
225
576
  }
577
+ return { className: `text-[${value}]`, skipped: false };
578
+ }
579
+ if (/^\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
580
+ return { className: `text-[${value}]`, skipped: false };
226
581
  }
227
582
  return { className: null, skipped: true, reason: `Non-standard font-size: ${value}` };
228
583
  }
584
+ convertTextDecoration(value) {
585
+ const decorationMap = {
586
+ 'underline': 'underline',
587
+ 'line-through': 'line-through',
588
+ 'none': 'no-underline',
589
+ 'no-underline': 'no-underline'
590
+ };
591
+ if (decorationMap[value]) {
592
+ return { className: decorationMap[value], skipped: false };
593
+ }
594
+ logger_1.logger.warn(`Unsupported text-decoration value: ${value}`);
595
+ return { className: null, skipped: true, reason: `Unsupported text-decoration: ${value}` };
596
+ }
597
+ convertTextTransform(value) {
598
+ const transformMap = {
599
+ 'uppercase': 'uppercase',
600
+ 'lowercase': 'lowercase',
601
+ 'capitalize': 'capitalize',
602
+ 'none': 'normal-case',
603
+ 'initial': 'normal-case'
604
+ };
605
+ if (transformMap[value]) {
606
+ return { className: transformMap[value], skipped: false };
607
+ }
608
+ return { className: null, skipped: true, reason: `Unknown text-transform: ${value}` };
609
+ }
610
+ convertLetterSpacing(value) {
611
+ if (this.letterSpacingScale.has(value)) {
612
+ return { className: `tracking-${this.letterSpacingScale.get(value)}`, skipped: false };
613
+ }
614
+ const knownMappings = {
615
+ '-0.025em': 'tight',
616
+ '-0.05em': 'tighter',
617
+ '0.025em': 'wide',
618
+ '0.05em': 'wider',
619
+ '0.1em': 'widest',
620
+ '0em': 'normal'
621
+ };
622
+ if (knownMappings[value]) {
623
+ return { className: `tracking-${knownMappings[value]}`, skipped: false };
624
+ }
625
+ if (/^-?\d+(\.\d+)?(em|px|rem)?$/.test(value)) {
626
+ return { className: `tracking-[${value}]`, skipped: false };
627
+ }
628
+ return { className: null, skipped: true, reason: `Unknown letter-spacing: ${value}` };
629
+ }
630
+ convertLineHeight(value) {
631
+ if (this.lineHeightScale.has(value)) {
632
+ return { className: `leading-${this.lineHeightScale.get(value)}`, skipped: false };
633
+ }
634
+ const knownMappings = {
635
+ '1': 'none',
636
+ '1.25': 'tight',
637
+ '1.375': 'snug',
638
+ '1.5': 'normal',
639
+ '1.625': 'relaxed',
640
+ '2': 'loose'
641
+ };
642
+ if (knownMappings[value]) {
643
+ return { className: `leading-${knownMappings[value]}`, skipped: false };
644
+ }
645
+ if (/^\d+(\.\d+)?$/.test(value)) {
646
+ return { className: `leading-[${value}]`, skipped: false };
647
+ }
648
+ if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
649
+ return { className: `leading-[${value}]`, skipped: false };
650
+ }
651
+ return { className: null, skipped: true, reason: `Unknown line-height: ${value}` };
652
+ }
229
653
  convertFlexbox(prop, value) {
230
- // Flex direction
231
654
  if (prop === 'flex-direction') {
232
655
  const dirMap = {
233
656
  'row': 'flex-row',
@@ -237,7 +660,6 @@ class TailwindMapper {
237
660
  };
238
661
  return { className: dirMap[value] || null, skipped: !dirMap[value] };
239
662
  }
240
- // Flex wrap
241
663
  if (prop === 'flex-wrap') {
242
664
  const wrapMap = {
243
665
  'wrap': 'flex-wrap',
@@ -246,7 +668,6 @@ class TailwindMapper {
246
668
  };
247
669
  return { className: wrapMap[value] || null, skipped: !wrapMap[value] };
248
670
  }
249
- // Justify content
250
671
  if (prop === 'justify-content') {
251
672
  const justifyMap = {
252
673
  'flex-start': 'justify-start',
@@ -258,7 +679,6 @@ class TailwindMapper {
258
679
  };
259
680
  return { className: justifyMap[value] || null, skipped: !justifyMap[value] };
260
681
  }
261
- // Align items
262
682
  if (prop === 'align-items') {
263
683
  const alignMap = {
264
684
  'flex-start': 'items-start',
@@ -269,21 +689,138 @@ class TailwindMapper {
269
689
  };
270
690
  return { className: alignMap[value] || null, skipped: !alignMap[value] };
271
691
  }
692
+ if (prop === 'align-content') {
693
+ const alignMap = {
694
+ 'flex-start': 'content-start',
695
+ 'flex-end': 'content-end',
696
+ 'center': 'content-center',
697
+ 'space-between': 'content-between',
698
+ 'space-around': 'content-around',
699
+ 'stretch': 'content-stretch'
700
+ };
701
+ return { className: alignMap[value] || null, skipped: !alignMap[value] };
702
+ }
703
+ if (prop === 'align-self') {
704
+ const alignSelfMap = {
705
+ 'auto': 'self-auto',
706
+ 'flex-start': 'self-start',
707
+ 'flex-end': 'self-end',
708
+ 'center': 'self-center',
709
+ 'stretch': 'self-stretch',
710
+ 'baseline': 'self-baseline'
711
+ };
712
+ return { className: alignSelfMap[value] || null, skipped: !alignSelfMap[value] };
713
+ }
714
+ if (prop === 'flex-grow') {
715
+ if (value === '0') {
716
+ return { className: 'grow-0', skipped: false };
717
+ }
718
+ if (value === '1') {
719
+ return { className: 'grow', skipped: false };
720
+ }
721
+ return { className: `grow-[${value}]`, skipped: false };
722
+ }
723
+ if (prop === 'flex-shrink') {
724
+ if (value === '0') {
725
+ return { className: 'shrink-0', skipped: false };
726
+ }
727
+ if (value === '1') {
728
+ return { className: 'shrink', skipped: false };
729
+ }
730
+ return { className: `shrink-[${value}]`, skipped: false };
731
+ }
732
+ if (prop === 'flex-basis') {
733
+ if (value === 'auto') {
734
+ return { className: 'basis-auto', skipped: false };
735
+ }
736
+ if (value === '0' || value === '0px') {
737
+ return { className: 'basis-0', skipped: false };
738
+ }
739
+ const px = this.extractPx(value);
740
+ if (px !== null) {
741
+ const spacing = this.pxToSpacing(px);
742
+ if (spacing) {
743
+ return { className: `basis-${spacing}`, skipped: false };
744
+ }
745
+ }
746
+ if (/^\d+(\.\d+)?(px|rem|em|%|vw|vh)?$/.test(value)) {
747
+ return { className: `basis-[${value}]`, skipped: false };
748
+ }
749
+ }
272
750
  return { className: null, skipped: true, reason: `Unsupported flexbox property: ${prop}` };
273
751
  }
752
+ convertFlexShorthand(value) {
753
+ const classes = [];
754
+ const warnings = [];
755
+ const cssProperties = [];
756
+ if (value === '1') {
757
+ classes.push('flex-1');
758
+ cssProperties.push('flex');
759
+ return { classes, warnings, cssProperties };
760
+ }
761
+ if (value === 'auto') {
762
+ classes.push('flex-auto');
763
+ cssProperties.push('flex');
764
+ return { classes, warnings, cssProperties };
765
+ }
766
+ if (value === 'none') {
767
+ classes.push('flex-none');
768
+ cssProperties.push('flex');
769
+ return { classes, warnings, cssProperties };
770
+ }
771
+ if (value === 'initial') {
772
+ classes.push('flex-initial');
773
+ cssProperties.push('flex');
774
+ return { classes, warnings, cssProperties };
775
+ }
776
+ const tokens = this.tokenizeValue(value);
777
+ if (tokens.length === 3) {
778
+ const [grow, shrink, basis] = tokens;
779
+ if (grow === '1' && shrink === '1' && basis === '0%') {
780
+ classes.push('flex-1');
781
+ cssProperties.push('flex');
782
+ }
783
+ else if (grow === '1' && shrink === '1' && basis === 'auto') {
784
+ classes.push('flex-auto');
785
+ cssProperties.push('flex');
786
+ }
787
+ else if (grow === '0' && shrink === '1' && basis === 'auto') {
788
+ classes.push('flex-initial');
789
+ cssProperties.push('flex');
790
+ }
791
+ else if (grow === '0' && shrink === '0' && basis === 'auto') {
792
+ classes.push('flex-none');
793
+ cssProperties.push('flex');
794
+ }
795
+ else {
796
+ classes.push(`flex-[${value}]`);
797
+ cssProperties.push('flex');
798
+ }
799
+ return { classes, warnings, cssProperties };
800
+ }
801
+ if (tokens.length === 1 || tokens.length === 2) {
802
+ classes.push(`flex-[${value}]`);
803
+ cssProperties.push('flex');
804
+ return { classes, warnings, cssProperties };
805
+ }
806
+ warnings.push(`Complex flex shorthand: ${value}`);
807
+ return { classes, warnings, cssProperties };
808
+ }
274
809
  convertGap(value) {
275
810
  const px = this.extractPx(value);
276
811
  if (px === null) {
812
+ if (/^\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
813
+ return { className: `gap-[${value}]`, skipped: false };
814
+ }
277
815
  return { className: null, skipped: true, reason: `Non-pixel gap value: ${value}` };
278
816
  }
279
817
  const spacing = this.pxToSpacing(px);
280
818
  if (!spacing) {
281
- return { className: null, skipped: true, reason: `No matching spacing for: ${value}` };
819
+ return { className: `gap-[${value}]`, skipped: false };
282
820
  }
283
821
  return { className: `gap-${spacing}`, skipped: false };
284
822
  }
285
823
  convertWidth(value) {
286
- // Handle percentage values
287
824
  if (value === '100%') {
288
825
  return { className: 'w-full', skipped: false };
289
826
  }
@@ -302,27 +839,53 @@ class TailwindMapper {
302
839
  if (value === '75%') {
303
840
  return { className: 'w-3/4', skipped: false };
304
841
  }
305
- // Handle pixel values
842
+ if (value === 'auto') {
843
+ return { className: 'w-auto', skipped: false };
844
+ }
845
+ if (value === 'fit-content') {
846
+ return { className: 'w-fit', skipped: false };
847
+ }
848
+ if (value === 'min-content') {
849
+ return { className: 'w-min', skipped: false };
850
+ }
851
+ if (value === 'max-content') {
852
+ return { className: 'w-max', skipped: false };
853
+ }
306
854
  const px = this.extractPx(value);
307
855
  if (px !== null) {
308
856
  const spacing = this.pxToSpacing(px);
309
857
  if (spacing) {
310
858
  return { className: `w-${spacing}`, skipped: false };
311
859
  }
312
- // Try arbitrary values for larger sizes
860
+ return { className: `w-[${value}]`, skipped: false };
861
+ }
862
+ if (/^\d+(\.\d+)?(px|rem|em|%|vw)?$/.test(value)) {
313
863
  return { className: `w-[${value}]`, skipped: false };
314
864
  }
315
865
  return { className: null, skipped: true, reason: `Complex width value: ${value}` };
316
866
  }
317
867
  convertHeight(value) {
318
- // Handle percentage values
319
868
  if (value === '100%') {
320
869
  return { className: 'h-full', skipped: false };
321
870
  }
322
871
  if (value === '50%') {
323
872
  return { className: 'h-1/2', skipped: false };
324
873
  }
325
- // Handle pixel values
874
+ if (value === 'auto') {
875
+ return { className: 'h-auto', skipped: false };
876
+ }
877
+ if (value === 'fit-content') {
878
+ return { className: 'h-fit', skipped: false };
879
+ }
880
+ if (value === 'min-content') {
881
+ return { className: 'h-min', skipped: false };
882
+ }
883
+ if (value === 'max-content') {
884
+ return { className: 'h-max', skipped: false };
885
+ }
886
+ if (value === '100vh') {
887
+ return { className: 'h-screen', skipped: false };
888
+ }
326
889
  const px = this.extractPx(value);
327
890
  if (px !== null) {
328
891
  const spacing = this.pxToSpacing(px);
@@ -331,10 +894,12 @@ class TailwindMapper {
331
894
  }
332
895
  return { className: `h-[${value}]`, skipped: false };
333
896
  }
897
+ if (/^\d+(\.\d+)?(px|rem|em|%|vh)?$/.test(value)) {
898
+ return { className: `h-[${value}]`, skipped: false };
899
+ }
334
900
  return { className: null, skipped: true, reason: `Complex height value: ${value}` };
335
901
  }
336
902
  convertBackgroundColor(value) {
337
- // Handle named colors and hex
338
903
  const colorMap = {
339
904
  'transparent': 'bg-transparent',
340
905
  'white': 'bg-white',
@@ -347,11 +912,9 @@ class TailwindMapper {
347
912
  if (colorMap[value]) {
348
913
  return { className: colorMap[value], skipped: false };
349
914
  }
350
- // Handle hex colors - use arbitrary values
351
915
  if (value.startsWith('#')) {
352
916
  return { className: `bg-[${value}]`, skipped: false };
353
917
  }
354
- // Handle rgb/rgba
355
918
  if (value.startsWith('rgb')) {
356
919
  return { className: `bg-[${value}]`, skipped: false };
357
920
  }
@@ -381,13 +944,14 @@ class TailwindMapper {
381
944
  convertBorderRadius(value) {
382
945
  const px = this.extractPx(value);
383
946
  if (px === null) {
384
- // Handle named values
385
947
  if (value === '50%') {
386
948
  return { className: 'rounded-full', skipped: false };
387
949
  }
950
+ if (/^\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
951
+ return { className: `rounded-[${value}]`, skipped: false };
952
+ }
388
953
  return { className: null, skipped: true, reason: `Complex border-radius: ${value}` };
389
954
  }
390
- // Map to Tailwind radius scale
391
955
  const radiusMap = {
392
956
  0: 'rounded-none',
393
957
  2: 'rounded-sm',
@@ -404,25 +968,374 @@ class TailwindMapper {
404
968
  if (Math.abs(closest - px) / (px || 1) < 0.2) {
405
969
  return { className: radiusMap[closest], skipped: false };
406
970
  }
407
- // Use arbitrary value
408
971
  return { className: `rounded-[${value}]`, skipped: false };
409
972
  }
973
+ convertBorder(prop, value) {
974
+ if (prop === 'border-width') {
975
+ const widthMap = {
976
+ '0': 'border-0',
977
+ '1px': 'border',
978
+ '2px': 'border-2',
979
+ '4px': 'border-4',
980
+ '8px': 'border-8'
981
+ };
982
+ if (widthMap[value]) {
983
+ return { className: widthMap[value], skipped: false };
984
+ }
985
+ if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
986
+ return { className: `border-[${value}]`, skipped: false };
987
+ }
988
+ return { className: null, skipped: true, reason: `Unknown border-width: ${value}` };
989
+ }
990
+ if (prop === 'border-style') {
991
+ const styleMap = {
992
+ 'solid': '',
993
+ 'dashed': 'border-dashed',
994
+ 'dotted': 'border-dotted',
995
+ 'double': 'border-double',
996
+ 'hidden': 'border-hidden',
997
+ 'none': 'border-none'
998
+ };
999
+ if (value === 'solid') {
1000
+ return { className: null, skipped: false };
1001
+ }
1002
+ if (styleMap[value]) {
1003
+ return { className: styleMap[value], skipped: false };
1004
+ }
1005
+ return { className: null, skipped: true, reason: `Unknown border-style: ${value}` };
1006
+ }
1007
+ if (prop === 'border-color') {
1008
+ if (value.startsWith('#')) {
1009
+ return { className: `border-[${value}]`, skipped: false };
1010
+ }
1011
+ if (value.startsWith('rgb')) {
1012
+ return { className: `border-[${value}]`, skipped: false };
1013
+ }
1014
+ const colorMap = {
1015
+ 'transparent': 'border-transparent',
1016
+ 'white': 'border-white',
1017
+ 'black': 'border-black',
1018
+ 'red': 'border-red-500',
1019
+ 'blue': 'border-blue-500',
1020
+ 'green': 'border-green-500',
1021
+ 'gray': 'border-gray-500'
1022
+ };
1023
+ if (colorMap[value]) {
1024
+ return { className: colorMap[value], skipped: false };
1025
+ }
1026
+ return { className: `border-${value}`, skipped: false };
1027
+ }
1028
+ if (prop === 'border-top-width' || prop === 'border-right-width' ||
1029
+ prop === 'border-bottom-width' || prop === 'border-left-width') {
1030
+ const sideMap = {
1031
+ 'border-top-width': 'border-t',
1032
+ 'border-right-width': 'border-r',
1033
+ 'border-bottom-width': 'border-b',
1034
+ 'border-left-width': 'border-l'
1035
+ };
1036
+ const prefix = sideMap[prop];
1037
+ const widthMap = {
1038
+ '0': `${prefix}-0`,
1039
+ '1px': prefix,
1040
+ '2px': `${prefix}-2`,
1041
+ '4px': `${prefix}-4`,
1042
+ '8px': `${prefix}-8`
1043
+ };
1044
+ if (widthMap[value]) {
1045
+ return { className: widthMap[value], skipped: false };
1046
+ }
1047
+ if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
1048
+ return { className: `${prefix}-[${value}]`, skipped: false };
1049
+ }
1050
+ return { className: null, skipped: true, reason: `Unknown ${prop}: ${value}` };
1051
+ }
1052
+ return { className: null, skipped: true, reason: `Unknown border property: ${prop}` };
1053
+ }
1054
+ convertBorderShorthand(value) {
1055
+ const classes = [];
1056
+ const warnings = [];
1057
+ const cssProperties = [];
1058
+ const tokens = this.tokenizeValue(value);
1059
+ let width = null;
1060
+ let style = null;
1061
+ let color = null;
1062
+ for (const token of tokens) {
1063
+ if (/^\d+(\.\d+)?(px|rem|em|thin|medium|thick)?$/.test(token) ||
1064
+ token === 'thin' || token === 'medium' || token === 'thick') {
1065
+ width = token;
1066
+ }
1067
+ else if (['solid', 'dashed', 'dotted', 'double', 'hidden', 'none', 'groove', 'ridge', 'inset', 'outset'].includes(token)) {
1068
+ style = token;
1069
+ }
1070
+ else {
1071
+ color = token;
1072
+ }
1073
+ }
1074
+ if (width) {
1075
+ const widthMap = {
1076
+ '0': 'border-0',
1077
+ '1px': 'border',
1078
+ '2px': 'border-2',
1079
+ '4px': 'border-4',
1080
+ '8px': 'border-8',
1081
+ 'thin': 'border',
1082
+ 'medium': 'border-2',
1083
+ 'thick': 'border-4'
1084
+ };
1085
+ if (widthMap[width]) {
1086
+ classes.push(widthMap[width]);
1087
+ }
1088
+ else {
1089
+ classes.push(`border-[${width}]`);
1090
+ }
1091
+ cssProperties.push('border-width');
1092
+ }
1093
+ if (style && style !== 'solid') {
1094
+ const styleMap = {
1095
+ 'dashed': 'border-dashed',
1096
+ 'dotted': 'border-dotted',
1097
+ 'double': 'border-double',
1098
+ 'hidden': 'border-hidden',
1099
+ 'none': 'border-none'
1100
+ };
1101
+ if (styleMap[style]) {
1102
+ classes.push(styleMap[style]);
1103
+ cssProperties.push('border-style');
1104
+ }
1105
+ else {
1106
+ warnings.push(`Unsupported border-style: ${style}`);
1107
+ }
1108
+ }
1109
+ if (color) {
1110
+ if (color.startsWith('#')) {
1111
+ classes.push(`border-[${color}]`);
1112
+ }
1113
+ else if (color.startsWith('rgb')) {
1114
+ classes.push(`border-[${color}]`);
1115
+ }
1116
+ else {
1117
+ const colorMap = {
1118
+ 'transparent': 'border-transparent',
1119
+ 'white': 'border-white',
1120
+ 'black': 'border-black'
1121
+ };
1122
+ if (colorMap[color]) {
1123
+ classes.push(colorMap[color]);
1124
+ }
1125
+ else {
1126
+ classes.push(`border-${color}`);
1127
+ }
1128
+ }
1129
+ cssProperties.push('border-color');
1130
+ }
1131
+ return { classes, warnings, cssProperties };
1132
+ }
1133
+ convertDirectionalBorderShorthand(prop, value) {
1134
+ const classes = [];
1135
+ const warnings = [];
1136
+ const cssProperties = [];
1137
+ const sideMap = {
1138
+ 'border-top': { prefix: 'border-t', widthProp: 'border-top-width', colorProp: 'border-top-color' },
1139
+ 'border-right': { prefix: 'border-r', widthProp: 'border-right-width', colorProp: 'border-right-color' },
1140
+ 'border-bottom': { prefix: 'border-b', widthProp: 'border-bottom-width', colorProp: 'border-bottom-color' },
1141
+ 'border-left': { prefix: 'border-l', widthProp: 'border-left-width', colorProp: 'border-left-color' }
1142
+ };
1143
+ const side = sideMap[prop];
1144
+ if (!side) {
1145
+ return { classes, warnings: [`Unknown directional border: ${prop}`], cssProperties };
1146
+ }
1147
+ const tokens = this.tokenizeValue(value);
1148
+ let width = null;
1149
+ let style = null;
1150
+ let color = null;
1151
+ for (const token of tokens) {
1152
+ if (/^\d+(\.\d+)?(px|rem|em|thin|medium|thick)?$/.test(token) ||
1153
+ token === 'thin' || token === 'medium' || token === 'thick') {
1154
+ width = token;
1155
+ }
1156
+ else if (['solid', 'dashed', 'dotted', 'double', 'hidden', 'none'].includes(token)) {
1157
+ style = token;
1158
+ }
1159
+ else {
1160
+ color = token;
1161
+ }
1162
+ }
1163
+ if (width) {
1164
+ const widthMap = {
1165
+ '0': `${side.prefix}-0`,
1166
+ '1px': side.prefix,
1167
+ '2px': `${side.prefix}-2`,
1168
+ '4px': `${side.prefix}-4`,
1169
+ '8px': `${side.prefix}-8`
1170
+ };
1171
+ if (widthMap[width]) {
1172
+ classes.push(widthMap[width]);
1173
+ }
1174
+ else {
1175
+ classes.push(`${side.prefix}-[${width}]`);
1176
+ }
1177
+ cssProperties.push(side.widthProp);
1178
+ }
1179
+ if (style && style !== 'solid') {
1180
+ warnings.push(`Border style '${style}' for ${prop} applies to all borders`);
1181
+ }
1182
+ if (color) {
1183
+ if (color.startsWith('#')) {
1184
+ classes.push(`${side.prefix}-[${color}]`);
1185
+ }
1186
+ else if (color.startsWith('rgb')) {
1187
+ classes.push(`${side.prefix}-[${color}]`);
1188
+ }
1189
+ else {
1190
+ classes.push(`${side.prefix}-${color}`);
1191
+ }
1192
+ cssProperties.push(side.colorProp);
1193
+ }
1194
+ return { classes, warnings, cssProperties };
1195
+ }
1196
+ convertAspectRatio(value) {
1197
+ const ratioMap = {
1198
+ '1/1': 'aspect-square',
1199
+ '16/9': 'aspect-video',
1200
+ '4/3': 'aspect-[4/3]',
1201
+ '3/4': 'aspect-[3/4]',
1202
+ '2/3': 'aspect-[2/3]',
1203
+ '3/2': 'aspect-[3/2]',
1204
+ '1/2': 'aspect-[1/2]',
1205
+ '2/1': 'aspect-[2/1]',
1206
+ 'auto': 'aspect-auto'
1207
+ };
1208
+ if (ratioMap[value]) {
1209
+ return { className: ratioMap[value], skipped: false };
1210
+ }
1211
+ if (/^\d+(\.\d+)?$/.test(value)) {
1212
+ return { className: `aspect-[${value}]`, skipped: false };
1213
+ }
1214
+ if (/^\d+\/\d+$/.test(value)) {
1215
+ return { className: `aspect-[${value}]`, skipped: false };
1216
+ }
1217
+ return { className: null, skipped: true, reason: `Unknown aspect-ratio: ${value}` };
1218
+ }
1219
+ convertOverflow(prop, value) {
1220
+ const prefixMap = {
1221
+ 'overflow': 'overflow',
1222
+ 'overflow-x': 'overflow-x',
1223
+ 'overflow-y': 'overflow-y'
1224
+ };
1225
+ const prefix = prefixMap[prop];
1226
+ const valueMap = {
1227
+ 'auto': `${prefix}-auto`,
1228
+ 'hidden': `${prefix}-hidden`,
1229
+ 'visible': `${prefix}-visible`,
1230
+ 'scroll': `${prefix}-scroll`,
1231
+ 'clip': `${prefix}-clip`
1232
+ };
1233
+ if (valueMap[value]) {
1234
+ return { className: valueMap[value], skipped: false };
1235
+ }
1236
+ return { className: null, skipped: true, reason: `Unknown overflow value: ${value}` };
1237
+ }
1238
+ convertObjectFit(value) {
1239
+ const fitMap = {
1240
+ 'contain': 'object-contain',
1241
+ 'cover': 'object-cover',
1242
+ 'fill': 'object-fill',
1243
+ 'none': 'object-none',
1244
+ 'scale-down': 'object-scale-down'
1245
+ };
1246
+ if (fitMap[value]) {
1247
+ return { className: fitMap[value], skipped: false };
1248
+ }
1249
+ return { className: null, skipped: true, reason: `Unknown object-fit: ${value}` };
1250
+ }
1251
+ convertObjectPosition(value) {
1252
+ const positionMap = {
1253
+ 'center': 'object-center',
1254
+ 'top': 'object-top',
1255
+ 'bottom': 'object-bottom',
1256
+ 'left': 'object-left',
1257
+ 'right': 'object-right',
1258
+ 'center center': 'object-center',
1259
+ 'center top': 'object-top',
1260
+ 'center bottom': 'object-bottom',
1261
+ 'left center': 'object-left',
1262
+ 'right center': 'object-right',
1263
+ 'left top': 'object-left-top',
1264
+ 'right top': 'object-right-top',
1265
+ 'left bottom': 'object-left-bottom',
1266
+ 'right bottom': 'object-right-bottom'
1267
+ };
1268
+ if (positionMap[value]) {
1269
+ return { className: positionMap[value], skipped: false };
1270
+ }
1271
+ if (/^\d+(\.\d+)?(%|px|rem|em)?(\s+\d+(\.\d+)?(%|px|rem|em)?)?$/.test(value)) {
1272
+ return { className: `object-[${value}]`, skipped: false };
1273
+ }
1274
+ return { className: null, skipped: true, reason: `Unknown object-position: ${value}` };
1275
+ }
1276
+ convertOpacity(value) {
1277
+ const numValue = parseFloat(value);
1278
+ if (isNaN(numValue)) {
1279
+ return { className: null, skipped: true, reason: `Invalid opacity value: ${value}` };
1280
+ }
1281
+ const percentValue = Math.round(numValue * 100);
1282
+ if (this.opacityScale.has(percentValue)) {
1283
+ return { className: `opacity-${this.opacityScale.get(percentValue)}`, skipped: false };
1284
+ }
1285
+ return { className: `opacity-[${value}]`, skipped: false };
1286
+ }
1287
+ convertWordBreak(value) {
1288
+ const breakMap = {
1289
+ 'normal': 'break-normal',
1290
+ 'break-all': 'break-all',
1291
+ 'break-word': 'break-words',
1292
+ 'keep-all': 'break-keep'
1293
+ };
1294
+ if (breakMap[value]) {
1295
+ return { className: breakMap[value], skipped: false };
1296
+ }
1297
+ return { className: null, skipped: true, reason: `Unknown word-break: ${value}` };
1298
+ }
1299
+ convertZIndex(value) {
1300
+ const numValue = parseInt(value, 10);
1301
+ if (isNaN(numValue)) {
1302
+ if (value === 'auto') {
1303
+ return { className: 'z-auto', skipped: false };
1304
+ }
1305
+ return { className: null, skipped: true, reason: `Invalid z-index value: ${value}` };
1306
+ }
1307
+ if (this.zIndexScale.has(numValue)) {
1308
+ return { className: `z-${this.zIndexScale.get(numValue)}`, skipped: false };
1309
+ }
1310
+ return { className: `z-[${value}]`, skipped: false };
1311
+ }
410
1312
  convertMultiple(properties) {
411
1313
  const classes = [];
412
1314
  const warnings = [];
413
1315
  properties.forEach(({ property, value }) => {
414
- const result = this.convertProperty(property, value);
415
- if (result.skipped) {
416
- warnings.push(result.reason || `Skipped: ${property}: ${value}`);
417
- logger_1.logger.verbose(`Skipped: ${property}: ${value} - ${result.reason}`);
1316
+ const multiResult = this.convertPropertyWithMultiple(property, value);
1317
+ classes.push(...multiResult.classes);
1318
+ warnings.push(...multiResult.warnings);
1319
+ if (multiResult.classes.length === 0 && multiResult.warnings.length === 0) {
1320
+ const result = this.convertProperty(property, value);
1321
+ if (result.skipped) {
1322
+ warnings.push(result.reason || `Skipped: ${property}: ${value}`);
1323
+ logger_1.logger.verbose(`Skipped: ${property}: ${value} - ${result.reason}`);
1324
+ }
1325
+ else if (result.className) {
1326
+ classes.push(result.className);
1327
+ logger_1.logger.verbose(`Converted: ${property}: ${value} → ${result.className}`);
1328
+ }
418
1329
  }
419
- else if (result.className) {
420
- classes.push(result.className);
421
- logger_1.logger.verbose(`Converted: ${property}: ${value} → ${result.className}`);
1330
+ else {
1331
+ if (multiResult.classes.length > 0) {
1332
+ logger_1.logger.verbose(`Converted: ${property}: ${value} → ${multiResult.classes.join(', ')}`);
1333
+ }
1334
+ multiResult.warnings.forEach(w => logger_1.logger.verbose(`Warning: ${w}`));
422
1335
  }
423
1336
  });
424
1337
  return { classes, warnings };
425
1338
  }
426
1339
  }
427
1340
  exports.TailwindMapper = TailwindMapper;
428
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmRNYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFpbHdpbmRNYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXdDO0FBYXhDLE1BQWEsY0FBYztJQUl6QixZQUFZLE1BQXNCO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBRWpELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMvQyw4REFBOEQ7WUFDOUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1QyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzVDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBRUQsMkJBQTJCO1lBQzNCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFD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Q3RCLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxLQUFLLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUF5QjtRQUN2QyxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFDN0IsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBRTlCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXJELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksWUFBWSxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDakUsZUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLFFBQVEsS0FBSyxLQUFLLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDdEUsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQy9CLGVBQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxRQUFRLEtBQUssS0FBSyxNQUFNLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBNWZELHdDQTRmQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhaWx3aW5kQ29uZmlnIH0gZnJvbSAnLi91dGlscy9jb25maWcnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIENTU1Byb3BlcnR5IHtcbiAgcHJvcGVydHk6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzaW9uUmVzdWx0IHtcbiAgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBza2lwcGVkOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBUYWlsd2luZE1hcHBlciB7XG4gIHByaXZhdGUgY29uZmlnOiBUYWlsd2luZENvbmZpZztcbiAgcHJpdmF0ZSBzcGFjaW5nU2NhbGU6IE1hcDxudW1iZXIsIHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBUYWlsd2luZENvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuc3BhY2luZ1NjYWxlID0gdGhpcy5idWlsZFNwYWNpbmdTY2FsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNwYWNpbmdTY2FsZSgpOiBNYXA8bnVtYmVyLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuY29uZmlnLnRoZW1lPy5zcGFjaW5nIHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMoc3BhY2luZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAvLyBDb252ZXJ0IHJlbSB0byBwaXhlbHMgZm9yIGNvbXBhcmlzb24gKGFzc3VtaW5nIDFyZW0gPSAxNnB4KVxuICAgICAgY29uc3QgcmVtTWF0Y2ggPSB2YWx1ZS5tYXRjaCgvKFtcXGQuXSspcmVtLyk7XG4gICAgICBpZiAocmVtTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gcGFyc2VGbG9hdChyZW1NYXRjaFsxXSkgKiAxNjtcbiAgICAgICAgc2NhbGUuc2V0KE1hdGgucm91bmQocGl4ZWxzKSwga2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8gQWxzbyBoYW5kbGUgcGl4ZWwgdmFsdWVzXG4gICAgICBjb25zdCBweE1hdGNoID0gdmFsdWUubWF0Y2goLyhbXFxkLl0rKXB4Lyk7XG4gICAgICBpZiAocHhNYXRjaCkge1xuICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwYXJzZUZsb2F0KHB4TWF0Y2hbMV0pKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgcHhUb1NwYWNpbmcocHg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIFRyeSBleGFjdCBtYXRjaCBmaXJzdFxuICAgIGlmICh0aGlzLnNwYWNpbmdTY2FsZS5oYXMocHgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGFjaW5nU2NhbGUuZ2V0KHB4KSE7XG4gICAgfVxuXG4gICAgLy8gRmluZCBjbG9zZXN0IG1hdGNoXG4gICAgbGV0IGNsb3Nlc3RLZXk6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjbG9zZXN0RGlmZjogbnVtYmVyID0gSW5maW5pdHk7XG4gICAgXG4gICAgdGhpcy5zcGFjaW5nU2NhbGUuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoa2V5IC0gcHgpO1xuICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0RGlmZikge1xuICAgICAgICBjbG9zZXN0S2V5ID0ga2V5O1xuICAgICAgICBjbG9zZXN0RGlmZiA9IGRpZmY7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBPbmx5IGFjY2VwdCBpZiB3aXRoaW4gcmVhc29uYWJsZSB0b2xlcmFuY2UgKDIwJSlcbiAgICBpZiAoY2xvc2VzdEtleSAhPT0gbnVsbCAmJiBjbG9zZXN0RGlmZiAvIHB4IDwgMC4yKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGFjaW5nU2NhbGUuZ2V0KGNsb3Nlc3RLZXkpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RQeCh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgcHhNYXRjaCA9IHZhbHVlLm1hdGNoKC9eKFtcXGQuXSspcHgkLyk7XG4gICAgaWYgKHB4TWF0Y2gpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHB4TWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSByZW0gdmFsdWVzXG4gICAgY29uc3QgcmVtTWF0Y2ggPSB2YWx1ZS5tYXRjaCgvXihbXFxkLl0rKXJlbSQvKTtcbiAgICBpZiAocmVtTWF0Y2gpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHJlbU1hdGNoWzFdKSAqIDE2O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29udmVydFByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBub3JtYWxpemVkUHJvcCA9IHByb3BlcnR5LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgbG9nZ2VyLnZlcmJvc2UoYENvbnZlcnRpbmc6ICR7bm9ybWFsaXplZFByb3B9OiAke25vcm1hbGl6ZWRWYWx1ZX1gKTtcblxuICAgIC8vIERpc3BsYXkgcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2Rpc3BsYXknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RGlzcGxheShub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFBvc2l0aW9uIHByb3BlcnRpZXNcbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdwb3NpdGlvbicpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbm9ybWFsaXplZFZhbHVlLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIE1hcmdpbiBwcm9wZXJ0aWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ21hcmdpbicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0TWFyZ2luKG5vcm1hbGl6ZWRQcm9wLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFBhZGRpbmcgcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdwYWRkaW5nJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRQYWRkaW5nKG5vcm1hbGl6ZWRQcm9wLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEZvbnQgcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2ZvbnQtd2VpZ2h0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZvbnRXZWlnaHQobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdmb250LXNpemUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Rm9udFNpemUobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBUZXh0IHByb3BlcnRpZXNcbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICd0ZXh0LWFsaWduJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdGV4dC0ke25vcm1hbGl6ZWRWYWx1ZX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIEZsZXhib3ggcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdmbGV4JykgfHwgXG4gICAgICAgIG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ2p1c3RpZnknKSB8fCBcbiAgICAgICAgbm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgnYWxpZ24nKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZsZXhib3gobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gR2FwIHByb3BlcnRpZXNcbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdnYXAnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0R2FwKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gV2lkdGggYW5kIEhlaWdodFxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3dpZHRoJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFdpZHRoKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnaGVpZ2h0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlaWdodChub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIENvbG9yc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2JhY2tncm91bmQtY29sb3InKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0QmFja2dyb3VuZENvbG9yKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnY29sb3InKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VGV4dENvbG9yKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQm9yZGVyIHJhZGl1c1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2JvcmRlci1yYWRpdXMnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Qm9yZGVyUmFkaXVzKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gVW5zdXBwb3J0ZWQgcHJvcGVydGllc1xuICAgIHJldHVybiB7XG4gICAgICBjbGFzc05hbWU6IG51bGwsXG4gICAgICBza2lwcGVkOiB0cnVlLFxuICAgICAgcmVhc29uOiBgVW5zdXBwb3J0ZWQgcHJvcGVydHk6ICR7cHJvcGVydHl9YFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREaXNwbGF5KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBkaXNwbGF5TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2ZsZXgnOiAnZmxleCcsXG4gICAgICAnYmxvY2snOiAnYmxvY2snLFxuICAgICAgJ2lubGluZSc6ICdpbmxpbmUnLFxuICAgICAgJ2lubGluZS1ibG9jayc6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgJ2dyaWQnOiAnZ3JpZCcsXG4gICAgICAnbm9uZSc6ICdoaWRkZW4nLFxuICAgICAgJ2NvbnRlbnRzJzogJ2NvbnRlbnRzJyxcbiAgICAgICd0YWJsZSc6ICd0YWJsZScsXG4gICAgICAndGFibGUtY2VsbCc6ICd0YWJsZS1jZWxsJ1xuICAgIH07XG5cbiAgICBpZiAoZGlzcGxheU1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogZGlzcGxheU1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGRpc3BsYXkgdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0TWFyZ2luKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tcGl4ZWwgbWFyZ2luIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgaWYgKCFzcGFjaW5nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vIG1hdGNoaW5nIHNwYWNpbmcgZm9yOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWRlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ21hcmdpbic6ICdtJyxcbiAgICAgICdtYXJnaW4tdG9wJzogJ210JyxcbiAgICAgICdtYXJnaW4tcmlnaHQnOiAnbXInLFxuICAgICAgJ21hcmdpbi1ib3R0b20nOiAnbWInLFxuICAgICAgJ21hcmdpbi1sZWZ0JzogJ21sJyxcbiAgICAgICdtYXJnaW4teCc6ICdteCcsXG4gICAgICAnbWFyZ2luLXknOiAnbXknXG4gICAgfTtcblxuICAgIGNvbnN0IHByZWZpeCA9IHNpZGVNYXBbcHJvcF0gfHwgJ20nO1xuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFBhZGRpbmcocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vbi1waXhlbCBwYWRkaW5nIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgaWYgKCFzcGFjaW5nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vIG1hdGNoaW5nIHNwYWNpbmcgZm9yOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWRlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3BhZGRpbmcnOiAncCcsXG4gICAgICAncGFkZGluZy10b3AnOiAncHQnLFxuICAgICAgJ3BhZGRpbmctcmlnaHQnOiAncHInLFxuICAgICAgJ3BhZGRpbmctYm90dG9tJzogJ3BiJyxcbiAgICAgICdwYWRkaW5nLWxlZnQnOiAncGwnLFxuICAgICAgJ3BhZGRpbmcteCc6ICdweCcsXG4gICAgICAncGFkZGluZy15JzogJ3B5J1xuICAgIH07XG5cbiAgICBjb25zdCBwcmVmaXggPSBzaWRlTWFwW3Byb3BdIHx8ICdwJztcbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGb250V2VpZ2h0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCB3ZWlnaHRNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnMTAwJzogJ2ZvbnQtdGhpbicsXG4gICAgICAnMjAwJzogJ2ZvbnQtZXh0cmFsaWdodCcsXG4gICAgICAnMzAwJzogJ2ZvbnQtbGlnaHQnLFxuICAgICAgJzQwMCc6ICdmb250LW5vcm1hbCcsXG4gICAgICAnNTAwJzogJ2ZvbnQtbWVkaXVtJyxcbiAgICAgICc2MDAnOiAnZm9udC1zZW1pYm9sZCcsXG4gICAgICAnNzAwJzogJ2ZvbnQtYm9sZCcsXG4gICAgICAnODAwJzogJ2ZvbnQtZXh0cmFib2xkJyxcbiAgICAgICc5MDAnOiAnZm9udC1ibGFjaycsXG4gICAgICAnbm9ybWFsJzogJ2ZvbnQtbm9ybWFsJyxcbiAgICAgICdib2xkJzogJ2ZvbnQtYm9sZCdcbiAgICB9O1xuXG4gICAgaWYgKHdlaWdodE1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogd2VpZ2h0TWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gZm9udC13ZWlnaHQ6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Rm9udFNpemUodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCAhPT0gbnVsbCkge1xuICAgICAgLy8gTWFwIGNvbW1vbiBmb250IHNpemVzXG4gICAgICBjb25zdCBzaXplTWFwOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAgICAgICAxMjogJ3RleHQteHMnLFxuICAgICAgICAxNDogJ3RleHQtc20nLFxuICAgICAgICAxNjogJ3RleHQtYmFzZScsXG4gICAgICAgIDE4OiAndGV4dC1sZycsXG4gICAgICAgIDIwOiAndGV4dC14bCcsXG4gICAgICAgIDI0OiAndGV4dC0yeGwnLFxuICAgICAgICAzMDogJ3RleHQtM3hsJyxcbiAgICAgICAgMzY6ICd0ZXh0LTR4bCcsXG4gICAgICAgIDQ4OiAndGV4dC01eGwnXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjbG9zZXN0ID0gT2JqZWN0LmtleXMoc2l6ZU1hcClcbiAgICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IFxuICAgICAgICAgIE1hdGguYWJzKGN1cnIgLSBweCkgPCBNYXRoLmFicyhwcmV2IC0gcHgpID8gY3VyciA6IHByZXZcbiAgICAgICAgKTtcblxuICAgICAgaWYgKE1hdGguYWJzKGNsb3Nlc3QgLSBweCkgLyBweCA8IDAuMTUpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBzaXplTWFwW2Nsb3Nlc3RdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgTm9uLXN0YW5kYXJkIGZvbnQtc2l6ZTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGbGV4Ym94KHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIC8vIEZsZXggZGlyZWN0aW9uXG4gICAgaWYgKHByb3AgPT09ICdmbGV4LWRpcmVjdGlvbicpIHtcbiAgICAgIGNvbnN0IGRpck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3Jvdyc6ICdmbGV4LXJvdycsXG4gICAgICAgICdyb3ctcmV2ZXJzZSc6ICdmbGV4LXJvdy1yZXZlcnNlJyxcbiAgICAgICAgJ2NvbHVtbic6ICdmbGV4LWNvbCcsXG4gICAgICAgICdjb2x1bW4tcmV2ZXJzZSc6ICdmbGV4LWNvbC1yZXZlcnNlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogZGlyTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhZGlyTWFwW3ZhbHVlXSB9O1xuICAgIH1cblxuICAgIC8vIEZsZXggd3JhcFxuICAgIGlmIChwcm9wID09PSAnZmxleC13cmFwJykge1xuICAgICAgY29uc3Qgd3JhcE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3dyYXAnOiAnZmxleC13cmFwJyxcbiAgICAgICAgJ25vd3JhcCc6ICdmbGV4LW5vd3JhcCcsXG4gICAgICAgICd3cmFwLXJldmVyc2UnOiAnZmxleC13cmFwLXJldmVyc2UnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiB3cmFwTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhd3JhcE1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICAvLyBKdXN0aWZ5IGNvbnRlbnRcbiAgICBpZiAocHJvcCA9PT0gJ2p1c3RpZnktY29udGVudCcpIHtcbiAgICAgIGNvbnN0IGp1c3RpZnlNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ2p1c3RpZnktc3RhcnQnLFxuICAgICAgICAnZmxleC1lbmQnOiAnanVzdGlmeS1lbmQnLFxuICAgICAgICAnY2VudGVyJzogJ2p1c3RpZnktY2VudGVyJyxcbiAgICAgICAgJ3NwYWNlLWJldHdlZW4nOiAnanVzdGlmeS1iZXR3ZWVuJyxcbiAgICAgICAgJ3NwYWNlLWFyb3VuZCc6ICdqdXN0aWZ5LWFyb3VuZCcsXG4gICAgICAgICdzcGFjZS1ldmVubHknOiAnanVzdGlmeS1ldmVubHknXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBqdXN0aWZ5TWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhanVzdGlmeU1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICAvLyBBbGlnbiBpdGVtc1xuICAgIGlmIChwcm9wID09PSAnYWxpZ24taXRlbXMnKSB7XG4gICAgICBjb25zdCBhbGlnbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ2ZsZXgtc3RhcnQnOiAnaXRlbXMtc3RhcnQnLFxuICAgICAgICAnZmxleC1lbmQnOiAnaXRlbXMtZW5kJyxcbiAgICAgICAgJ2NlbnRlcic6ICdpdGVtcy1jZW50ZXInLFxuICAgICAgICAnYmFzZWxpbmUnOiAnaXRlbXMtYmFzZWxpbmUnLFxuICAgICAgICAnc3RyZXRjaCc6ICdpdGVtcy1zdHJldGNoJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYWxpZ25NYXBbdmFsdWVdIHx8IG51bGwsIHNraXBwZWQ6ICFhbGlnbk1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVuc3VwcG9ydGVkIGZsZXhib3ggcHJvcGVydHk6ICR7cHJvcH1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRHYXAodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tcGl4ZWwgZ2FwIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgaWYgKCFzcGFjaW5nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vIG1hdGNoaW5nIHNwYWNpbmcgZm9yOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGBnYXAtJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRXaWR0aCh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgLy8gSGFuZGxlIHBlcmNlbnRhZ2UgdmFsdWVzXG4gICAgaWYgKHZhbHVlID09PSAnMTAwJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctZnVsbCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzUwJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMS8yJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnMzMuMzMzJScgfHwgdmFsdWUgPT09ICczMy4zMyUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTEvMycsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzY2LjY2NiUnIHx8IHZhbHVlID09PSAnNjYuNjclJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0yLzMnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICcyNSUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTEvNCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzc1JScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMy80Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcGl4ZWwgdmFsdWVzXG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgICBpZiAoc3BhY2luZykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB3LSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgLy8gVHJ5IGFyYml0cmFyeSB2YWx1ZXMgZm9yIGxhcmdlciBzaXplc1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdy1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggd2lkdGggdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGVpZ2h0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICAvLyBIYW5kbGUgcGVyY2VudGFnZSB2YWx1ZXNcbiAgICBpZiAodmFsdWUgPT09ICcxMDAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC1mdWxsJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnNTAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC0xLzInLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwaXhlbCB2YWx1ZXNcbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBpZiAocHggIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICAgIGlmIChzcGFjaW5nKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGgtJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBoLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgQ29tcGxleCBoZWlnaHQgdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICAvLyBIYW5kbGUgbmFtZWQgY29sb3JzIGFuZCBoZXhcbiAgICBjb25zdCBjb2xvck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICd0cmFuc3BhcmVudCc6ICdiZy10cmFuc3BhcmVudCcsXG4gICAgICAnd2hpdGUnOiAnYmctd2hpdGUnLFxuICAgICAgJ2JsYWNrJzogJ2JnLWJsYWNrJyxcbiAgICAgICdyZWQnOiAnYmctcmVkLTUwMCcsXG4gICAgICAnYmx1ZSc6ICdiZy1ibHVlLTUwMCcsXG4gICAgICAnZ3JlZW4nOiAnYmctZ3JlZW4tNTAwJyxcbiAgICAgICdncmF5JzogJ2JnLWdyYXktNTAwJ1xuICAgIH07XG5cbiAgICBpZiAoY29sb3JNYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGNvbG9yTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaGV4IGNvbG9ycyAtIHVzZSBhcmJpdHJhcnkgdmFsdWVzXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHJnYi9yZ2JhXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBiZy1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggYmFja2dyb3VuZC1jb2xvcjogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRUZXh0Q29sb3IodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGNvbG9yTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3RyYW5zcGFyZW50JzogJ3RleHQtdHJhbnNwYXJlbnQnLFxuICAgICAgJ3doaXRlJzogJ3RleHQtd2hpdGUnLFxuICAgICAgJ2JsYWNrJzogJ3RleHQtYmxhY2snLFxuICAgICAgJ3JlZCc6ICd0ZXh0LXJlZC01MDAnLFxuICAgICAgJ2JsdWUnOiAndGV4dC1ibHVlLTUwMCcsXG4gICAgICAnZ3JlZW4nOiAndGV4dC1ncmVlbi01MDAnLFxuICAgICAgJ2dyYXknOiAndGV4dC1ncmF5LTUwMCdcbiAgICB9O1xuXG4gICAgaWYgKGNvbG9yTWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBjb2xvck1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdGV4dC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgncmdiJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGNvbG9yOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEJvcmRlclJhZGl1cyh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgXG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICAvLyBIYW5kbGUgbmFtZWQgdmFsdWVzXG4gICAgICBpZiAodmFsdWUgPT09ICc1MCUnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3JvdW5kZWQtZnVsbCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggYm9yZGVyLXJhZGl1czogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgLy8gTWFwIHRvIFRhaWx3aW5kIHJhZGl1cyBzY2FsZVxuICAgIGNvbnN0IHJhZGl1c01hcDogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgICAgIDA6ICdyb3VuZGVkLW5vbmUnLFxuICAgICAgMjogJ3JvdW5kZWQtc20nLFxuICAgICAgNDogJ3JvdW5kZWQnLFxuICAgICAgNjogJ3JvdW5kZWQtbWQnLFxuICAgICAgODogJ3JvdW5kZWQtbGcnLFxuICAgICAgMTI6ICdyb3VuZGVkLXhsJyxcbiAgICAgIDE2OiAncm91bmRlZC0yeGwnLFxuICAgICAgMjQ6ICdyb3VuZGVkLTN4bCdcbiAgICB9O1xuXG4gICAgY29uc3QgY2xvc2VzdCA9IE9iamVjdC5rZXlzKHJhZGl1c01hcClcbiAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgLnJlZHVjZSgocHJldiwgY3VycikgPT4gXG4gICAgICAgIE1hdGguYWJzKGN1cnIgLSBweCkgPCBNYXRoLmFicyhwcmV2IC0gcHgpID8gY3VyciA6IHByZXZcbiAgICAgICk7XG5cbiAgICBpZiAoTWF0aC5hYnMoY2xvc2VzdCAtIHB4KSAvIChweCB8fCAxKSA8IDAuMikge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiByYWRpdXNNYXBbY2xvc2VzdF0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIGFyYml0cmFyeSB2YWx1ZVxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHJvdW5kZWQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBjb252ZXJ0TXVsdGlwbGUocHJvcGVydGllczogQ1NTUHJvcGVydHlbXSk6IHsgY2xhc3Nlczogc3RyaW5nW107IHdhcm5pbmdzOiBzdHJpbmdbXSB9IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKCh7IHByb3BlcnR5LCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnZlcnRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0LnNraXBwZWQpIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChyZXN1bHQucmVhc29uIHx8IGBTa2lwcGVkOiAke3Byb3BlcnR5fTogJHt2YWx1ZX1gKTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFNraXBwZWQ6ICR7cHJvcGVydHl9OiAke3ZhbHVlfSAtICR7cmVzdWx0LnJlYXNvbn1gKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmNsYXNzTmFtZSkge1xuICAgICAgICBjbGFzc2VzLnB1c2gocmVzdWx0LmNsYXNzTmFtZSk7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBDb252ZXJ0ZWQ6ICR7cHJvcGVydHl9OiAke3ZhbHVlfSDihpIgJHtyZXN1bHQuY2xhc3NOYW1lfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MgfTtcbiAgfVxufVxuIl19
1341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmRNYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFpbHdpbmRNYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXdDO0FBeUJ4QyxNQUFhLGNBQWM7SUFVekIsWUFBWSxNQUFzQjtRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBRWpELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVDLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxNQUFN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QixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksWUFBWSxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztvQkFDakUsZUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLFFBQVEsS0FBSyxLQUFLLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3RFLENBQUM7cUJBQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUMvQixlQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsUUFBUSxLQUFLLEtBQUssTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNuQyxlQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsUUFBUSxLQUFLLEtBQUssTUFBTSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3pGLENBQUM7Z0JBQ0QsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBOWhERCx3Q0E4aERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFpbHdpbmRDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUHJvcGVydHkge1xuICBwcm9wZXJ0eTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnNpb25SZXN1bHQge1xuICBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7XG4gIHNraXBwZWQ6IGJvb2xlYW47XG4gIHJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aUNvbnZlcnNpb25SZXN1bHQge1xuICBjbGFzc2VzOiBzdHJpbmdbXTtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICBjc3NQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFBhcnNlZFNwYWNpbmdWYWx1ZSB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHB4OiBudW1iZXIgfCBudWxsO1xuICBzcGFjaW5nS2V5OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgVGFpbHdpbmRNYXBwZXIge1xuICBwcml2YXRlIGNvbmZpZzogVGFpbHdpbmRDb25maWc7XG4gIHByaXZhdGUgc3BhY2luZ1NjYWxlOiBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuICBwcml2YXRlIG1heFdpZHRoU2NhbGU6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgZm9udFNpemVTY2FsZTogTWFwPG51bWJlciwgc3RyaW5nPjtcbiAgcHJpdmF0ZSBsaW5lSGVpZ2h0U2NhbGU6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgbGV0dGVyU3BhY2luZ1NjYWxlOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBwcml2YXRlIHpJbmRleFNjYWxlOiBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuICBwcml2YXRlIG9wYWNpdHlTY2FsZTogTWFwPG51bWJlciwgc3RyaW5nPjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFRhaWx3aW5kQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5zcGFjaW5nU2NhbGUgPSB0aGlzLmJ1aWxkU3BhY2luZ1NjYWxlKCk7XG4gICAgdGhpcy5tYXhXaWR0aFNjYWxlID0gdGhpcy5idWlsZE1heFdpZHRoU2NhbGUoKTtcbiAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSB0aGlzLmJ1aWxkRm9udFNpemVTY2FsZSgpO1xuICAgIHRoaXMubGluZUhlaWdodFNjYWxlID0gdGhpcy5idWlsZExpbmVIZWlnaHRTY2FsZSgpO1xuICAgIHRoaXMubGV0dGVyU3BhY2luZ1NjYWxlID0gdGhpcy5idWlsZExldHRlclNwYWNpbmdTY2FsZSgpO1xuICAgIHRoaXMuekluZGV4U2NhbGUgPSB0aGlzLmJ1aWxkWkluZGV4U2NhbGUoKTtcbiAgICB0aGlzLm9wYWNpdHlTY2FsZSA9IHRoaXMuYnVpbGRPcGFjaXR5U2NhbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTcGFjaW5nU2NhbGUoKTogTWFwPG51bWJlciwgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NhbGUgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLmNvbmZpZy50aGVtZT8uc3BhY2luZyB8fCB7fTtcblxuICAgIE9iamVjdC5lbnRyaWVzKHNwYWNpbmcpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgcmVtTWF0Y2ggPSB2YWx1ZS5tYXRjaCgvKFtcXGQuXSspcmVtLyk7XG4gICAgICBpZiAocmVtTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gcGFyc2VGbG9hdChyZW1NYXRjaFsxXSkgKiAxNjtcbiAgICAgICAgc2NhbGUuc2V0KE1hdGgucm91bmQocGl4ZWxzKSwga2V5KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHhNYXRjaCA9IHZhbHVlLm1hdGNoKC8oW1xcZC5dKylweC8pO1xuICAgICAgaWYgKHB4TWF0Y2gpIHtcbiAgICAgICAgc2NhbGUuc2V0KE1hdGgucm91bmQocGFyc2VGbG9hdChweE1hdGNoWzFdKSksIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTWF4V2lkdGhTY2FsZSgpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgbWF4V2lkdGggPSB0aGlzLmNvbmZpZy50aGVtZT8ubWF4V2lkdGggfHwge307XG5cbiAgICBPYmplY3QuZW50cmllcyhtYXhXaWR0aCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzY2FsZS5zZXQodmFsdWUsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzY2FsZS5zZXQoJzEwMCUnLCAnZnVsbCcpO1xuICAgIHNjYWxlLnNldCgnbWluLWNvbnRlbnQnLCAnbWluJyk7XG4gICAgc2NhbGUuc2V0KCdtYXgtY29udGVudCcsICdtYXgnKTtcbiAgICBzY2FsZS5zZXQoJ2ZpdC1jb250ZW50JywgJ2ZpdCcpO1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvbnRTaXplU2NhbGUoKTogTWFwPG51bWJlciwgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NhbGUgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5jb25maWcudGhlbWU/LmZvbnRTaXplIHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMoZm9udFNpemUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgcmVtTWF0Y2ggPSB2YWx1ZS5tYXRjaCgvKFtcXGQuXSspcmVtLyk7XG4gICAgICAgIGlmIChyZW1NYXRjaCkge1xuICAgICAgICAgIHNjYWxlLnNldChNYXRoLnJvdW5kKHBhcnNlRmxvYXQocmVtTWF0Y2hbMV0pICogMTYpLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB4TWF0Y2ggPSB2YWx1ZS5tYXRjaCgvKFtcXGQuXSspcHgvKTtcbiAgICAgICAgaWYgKHB4TWF0Y2gpIHtcbiAgICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwYXJzZUZsb2F0KHB4TWF0Y2hbMV0pKSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB0eXBlb2YgdmFsdWVbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHJlbU1hdGNoID0gdmFsdWVbMF0ubWF0Y2goLyhbXFxkLl0rKXJlbS8pO1xuICAgICAgICBpZiAocmVtTWF0Y2gpIHtcbiAgICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwYXJzZUZsb2F0KHJlbU1hdGNoWzFdKSAqIDE2KSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBweE1hdGNoID0gdmFsdWVbMF0ubWF0Y2goLyhbXFxkLl0rKXB4Lyk7XG4gICAgICAgIGlmIChweE1hdGNoKSB7XG4gICAgICAgICAgc2NhbGUuc2V0KE1hdGgucm91bmQocGFyc2VGbG9hdChweE1hdGNoWzFdKSksIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMaW5lSGVpZ2h0U2NhbGUoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NhbGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGNvbnN0IGxpbmVIZWlnaHQgPSB0aGlzLmNvbmZpZy50aGVtZT8ubGluZUhlaWdodCB8fCB7fTtcblxuICAgIE9iamVjdC5lbnRyaWVzKGxpbmVIZWlnaHQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2NhbGUuc2V0KHZhbHVlLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2NhbGUuc2V0KCcxJywgJ25vbmUnKTtcbiAgICBzY2FsZS5zZXQoJzEuMjUnLCAndGlnaHQnKTtcbiAgICBzY2FsZS5zZXQoJzEuMzc1JywgJ3NudWcnKTtcbiAgICBzY2FsZS5zZXQoJzEuNScsICdub3JtYWwnKTtcbiAgICBzY2FsZS5zZXQoJzEuNjI1JywgJ3JlbGF4ZWQnKTtcbiAgICBzY2FsZS5zZXQoJzInLCAnbG9vc2UnKTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMZXR0ZXJTcGFjaW5nU2NhbGUoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NhbGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGNvbnN0IGxldHRlclNwYWNpbmcgPSB0aGlzLmNvbmZpZy50aGVtZT8ubGV0dGVyU3BhY2luZyB8fCB7fTtcblxuICAgIE9iamVjdC5lbnRyaWVzKGxldHRlclNwYWNpbmcpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2NhbGUuc2V0KHZhbHVlLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFpJbmRleFNjYWxlKCk6IE1hcDxudW1iZXIsIHN0cmluZz4ge1xuICAgIGNvbnN0IHNjYWxlID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBjb25zdCB6SW5kZXggPSB0aGlzLmNvbmZpZy50aGVtZT8uekluZGV4IHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMoekluZGV4KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4obnVtKSkge1xuICAgICAgICAgIHNjYWxlLnNldChudW0sIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNjYWxlLnNldCgwLCAnMCcpO1xuICAgIHNjYWxlLnNldCgxMCwgJzEwJyk7XG4gICAgc2NhbGUuc2V0KDIwLCAnMjAnKTtcbiAgICBzY2FsZS5zZXQoMzAsICczMCcpO1xuICAgIHNjYWxlLnNldCg0MCwgJzQwJyk7XG4gICAgc2NhbGUuc2V0KDUwLCAnNTAnKTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPcGFjaXR5U2NhbGUoKTogTWFwPG51bWJlciwgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NhbGUgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICAgIGNvbnN0IG9wYWNpdHkgPSB0aGlzLmNvbmZpZy50aGVtZT8ub3BhY2l0eSB8fCB7fTtcblxuICAgIE9iamVjdC5lbnRyaWVzKG9wYWNpdHkpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBudW0gPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XG4gICAgICAgICAgc2NhbGUuc2V0KE1hdGgucm91bmQobnVtICogMTAwKSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTAwOyBpICs9IDUpIHtcbiAgICAgIGlmICghc2NhbGUuaGFzKGkpKSB7XG4gICAgICAgIHNjYWxlLnNldChpLCBTdHJpbmcoaSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgcHhUb1NwYWNpbmcocHg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnNwYWNpbmdTY2FsZS5oYXMocHgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGFjaW5nU2NhbGUuZ2V0KHB4KSE7XG4gICAgfVxuXG4gICAgbGV0IGNsb3Nlc3RLZXk6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjbG9zZXN0RGlmZjogbnVtYmVyID0gSW5maW5pdHk7XG4gICAgXG4gICAgdGhpcy5zcGFjaW5nU2NhbGUuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoa2V5IC0gcHgpO1xuICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0RGlmZikge1xuICAgICAgICBjbG9zZXN0S2V5ID0ga2V5O1xuICAgICAgICBjbG9zZXN0RGlmZiA9IGRpZmY7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoY2xvc2VzdEtleSAhPT0gbnVsbCAmJiBjbG9zZXN0RGlmZiAvIHB4IDwgMC4yKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGFjaW5nU2NhbGUuZ2V0KGNsb3Nlc3RLZXkpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RQeCh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgcHhNYXRjaCA9IHZhbHVlLm1hdGNoKC9eKFtcXGQuXSspcHgkLyk7XG4gICAgaWYgKHB4TWF0Y2gpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHB4TWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbU1hdGNoID0gdmFsdWUubWF0Y2goL14oW1xcZC5dKylyZW0kLyk7XG4gICAgaWYgKHJlbU1hdGNoKSB7XG4gICAgICByZXR1cm4gcGFyc2VGbG9hdChyZW1NYXRjaFsxXSkgKiAxNjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VTcGFjaW5nVmFsdWUodmFsdWU6IHN0cmluZyk6IFBhcnNlZFNwYWNpbmdWYWx1ZSB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgY29uc3Qgc3BhY2luZ0tleSA9IHB4ICE9PSBudWxsID8gdGhpcy5weFRvU3BhY2luZyhweCkgOiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlLFxuICAgICAgcHgsXG4gICAgICBzcGFjaW5nS2V5XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTcGFjaW5nVXRpbGl0eShwcmVmaXg6IHN0cmluZywgcGFyc2VkOiBQYXJzZWRTcGFjaW5nVmFsdWUpOiBzdHJpbmcge1xuICAgIGlmIChwYXJzZWQuc3BhY2luZ0tleSkge1xuICAgICAgcmV0dXJuIGAke3ByZWZpeH0tJHtwYXJzZWQuc3BhY2luZ0tleX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fS1bJHtwYXJzZWQudmFsdWV9XWA7XG4gIH1cblxuICBwcml2YXRlIHRva2VuaXplVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGN1cnJlbnQgPSAnJztcbiAgICBsZXQgcGFyZW5EZXB0aCA9IDA7XG4gICAgbGV0IGluRnVuY3Rpb24gPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSB2YWx1ZVtpXTtcblxuICAgICAgaWYgKGNoYXIgPT09ICcoJykge1xuICAgICAgICBwYXJlbkRlcHRoKys7XG4gICAgICAgIGluRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICBjdXJyZW50ICs9IGNoYXI7XG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICcpJykge1xuICAgICAgICBwYXJlbkRlcHRoLS07XG4gICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcbiAgICAgICAgaWYgKHBhcmVuRGVwdGggPT09IDApIHtcbiAgICAgICAgICBpbkZ1bmN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJyAnICYmIHBhcmVuRGVwdGggPT09IDApIHtcbiAgICAgICAgaWYgKGN1cnJlbnQudHJpbSgpKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2goY3VycmVudC50cmltKCkpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC50cmltKCkpIHtcbiAgICAgIHRva2Vucy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG5cbiAgY29udmVydFByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBub3JtYWxpemVkUHJvcCA9IHByb3BlcnR5LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgbG9nZ2VyLnZlcmJvc2UoYENvbnZlcnRpbmc6ICR7bm9ybWFsaXplZFByb3B9OiAke25vcm1hbGl6ZWRWYWx1ZX1gKTtcblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2Rpc3BsYXknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RGlzcGxheShub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3Bvc2l0aW9uJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBub3JtYWxpemVkVmFsdWUsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ21hcmdpbicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0TWFyZ2luKG5vcm1hbGl6ZWRQcm9wLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdwYWRkaW5nJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRQYWRkaW5nKG5vcm1hbGl6ZWRQcm9wLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ21heC13aWR0aCcgfHwgbm9ybWFsaXplZFByb3AgPT09ICdtaW4td2lkdGgnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RGltZW5zaW9uQ29uc3RyYWludChub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdtYXgtaGVpZ2h0JyB8fCBub3JtYWxpemVkUHJvcCA9PT0gJ21pbi1oZWlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RGltZW5zaW9uQ29uc3RyYWludChub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICd3aWR0aCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRXaWR0aChub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2hlaWdodCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRIZWlnaHQobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdmb250LXdlaWdodCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGb250V2VpZ2h0KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnZm9udC1zaXplJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZvbnRTaXplKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAndGV4dC1hbGlnbicpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtJHtub3JtYWxpemVkVmFsdWV9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICd0ZXh0LWRlY29yYXRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VGV4dERlY29yYXRpb24obm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICd0ZXh0LXRyYW5zZm9ybScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUZXh0VHJhbnNmb3JtKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnbGV0dGVyLXNwYWNpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0TGV0dGVyU3BhY2luZyhub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2xpbmUtaGVpZ2h0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydExpbmVIZWlnaHQobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgnZmxleCcpIHx8IFxuICAgICAgICBub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdqdXN0aWZ5JykgfHwgXG4gICAgICAgIG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ2FsaWduJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGbGV4Ym94KG5vcm1hbGl6ZWRQcm9wLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2dhcCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRHYXAobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdiYWNrZ3JvdW5kLWNvbG9yJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEJhY2tncm91bmRDb2xvcihub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2NvbG9yJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRleHRDb2xvcihub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2JvcmRlci1yYWRpdXMnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Qm9yZGVyUmFkaXVzKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ2JvcmRlcicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Qm9yZGVyKG5vcm1hbGl6ZWRQcm9wLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2FzcGVjdC1yYXRpbycpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBc3BlY3RSYXRpbyhub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ292ZXJmbG93JyB8fCBub3JtYWxpemVkUHJvcCA9PT0gJ292ZXJmbG93LXgnIHx8IG5vcm1hbGl6ZWRQcm9wID09PSAnb3ZlcmZsb3cteScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRPdmVyZmxvdyhub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdvYmplY3QtZml0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydE9iamVjdEZpdChub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ29iamVjdC1wb3NpdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRPYmplY3RQb3NpdGlvbihub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ29wYWNpdHknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0T3BhY2l0eShub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3dvcmQtYnJlYWsnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0V29yZEJyZWFrKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnei1pbmRleCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRaSW5kZXgobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2xhc3NOYW1lOiBudWxsLFxuICAgICAgc2tpcHBlZDogdHJ1ZSxcbiAgICAgIHJlYXNvbjogYFVuc3VwcG9ydGVkIHByb3BlcnR5OiAke3Byb3BlcnR5fWBcbiAgICB9O1xuICB9XG5cbiAgY29udmVydFByb3BlcnR5V2l0aE11bHRpcGxlKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBNdWx0aUNvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm9wID0gcHJvcGVydHkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdtYXJnaW4nIHx8IG5vcm1hbGl6ZWRQcm9wID09PSAncGFkZGluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRTcGFjaW5nU2hvcnRoYW5kKG5vcm1hbGl6ZWRQcm9wLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2JvcmRlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRCb3JkZXJTaG9ydGhhbmQobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgnYm9yZGVyLScpICYmIFxuICAgICAgICBbJ2JvcmRlci10b3AnLCAnYm9yZGVyLXJpZ2h0JywgJ2JvcmRlci1ib3R0b20nLCAnYm9yZGVyLWxlZnQnXS5pbmNsdWRlcyhub3JtYWxpemVkUHJvcCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREaXJlY3Rpb25hbEJvcmRlclNob3J0aGFuZChub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdmbGV4Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZsZXhTaG9ydGhhbmQobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnZlcnRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpO1xuICAgIHJldHVybiB7XG4gICAgICBjbGFzc2VzOiByZXN1bHQuY2xhc3NOYW1lID8gW3Jlc3VsdC5jbGFzc05hbWVdIDogW10sXG4gICAgICB3YXJuaW5nczogcmVzdWx0LnJlYXNvbiA/IFtyZXN1bHQucmVhc29uXSA6IFtdLFxuICAgICAgY3NzUHJvcGVydGllczogcmVzdWx0LmNsYXNzTmFtZSA/IFtwcm9wZXJ0eV0gOiBbXVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRTcGFjaW5nU2hvcnRoYW5kKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IE11bHRpQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZVZhbHVlKHZhbHVlKTtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcHJlZml4ID0gcHJvcCA9PT0gJ21hcmdpbicgPyAnbScgOiAncCc7XG4gICAgY29uc3QgcHJvcFByZWZpeCA9IHByb3AgPT09ICdtYXJnaW4nID8gJ21hcmdpbicgOiAncGFkZGluZyc7XG5cbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3M6IFsnRW1wdHkgc3BhY2luZyB2YWx1ZSddLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkVG9rZW5zID0gdG9rZW5zLm1hcCh0ID0+IHRoaXMucGFyc2VTcGFjaW5nVmFsdWUodCkpO1xuXG4gICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlZFRva2Vuc1swXTtcbiAgICAgIGlmIChwYXJzZWQucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShwcmVmaXgsIHBhcnNlZCkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0gdmFsdWU6ICR7dG9rZW5zWzBdfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgW3ZlcnRpY2FsLCBob3Jpem9udGFsXSA9IHBhcnNlZFRva2VucztcbiAgICAgIFxuICAgICAgaWYgKHZlcnRpY2FsLnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkoYCR7cHJlZml4fXlgLCB2ZXJ0aWNhbCkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0teWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgSW52YWxpZCAke3Byb3B9IHZlcnRpY2FsIHZhbHVlOiAke3Rva2Vuc1swXX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhvcml6b250YWwucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1sxXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9eGAsIGhvcml6b250YWwpKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKGAke3Byb3BQcmVmaXh9LXhgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfSBob3Jpem9udGFsIHZhbHVlOiAke3Rva2Vuc1sxXX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2Vucy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGNvbnN0IFt0b3AsIGhvcml6b250YWwsIGJvdHRvbV0gPSBwYXJzZWRUb2tlbnM7XG5cbiAgICAgIGlmICh0b3AucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9dGAsIHRvcCkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0tdG9wYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0tdG9wIHZhbHVlOiAke3Rva2Vuc1swXX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhvcml6b250YWwucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1sxXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9eGAsIGhvcml6b250YWwpKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKGAke3Byb3BQcmVmaXh9LXhgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfSBob3Jpem9udGFsIHZhbHVlOiAke3Rva2Vuc1sxXX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvdHRvbS5weCAhPT0gbnVsbCB8fCAvXi0/XFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodG9rZW5zWzJdKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5idWlsZFNwYWNpbmdVdGlsaXR5KGAke3ByZWZpeH1iYCwgYm90dG9tKSk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaChgJHtwcm9wUHJlZml4fS1ib3R0b21gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfS1ib3R0b20gdmFsdWU6ICR7dG9rZW5zWzJdfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodG9rZW5zLmxlbmd0aCA+PSA0KSB7XG4gICAgICBjb25zdCBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XSA9IHBhcnNlZFRva2VucztcblxuICAgICAgaWYgKHRvcC5weCAhPT0gbnVsbCB8fCAvXi0/XFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5idWlsZFNwYWNpbmdVdGlsaXR5KGAke3ByZWZpeH10YCwgdG9wKSk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaChgJHtwcm9wUHJlZml4fS10b3BgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfS10b3AgdmFsdWU6ICR7dG9rZW5zWzBdfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocmlnaHQucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1sxXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9cmAsIHJpZ2h0KSk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaChgJHtwcm9wUHJlZml4fS1yaWdodGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgSW52YWxpZCAke3Byb3B9LXJpZ2h0IHZhbHVlOiAke3Rva2Vuc1sxXX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvdHRvbS5weCAhPT0gbnVsbCB8fCAvXi0/XFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodG9rZW5zWzJdKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5idWlsZFNwYWNpbmdVdGlsaXR5KGAke3ByZWZpeH1iYCwgYm90dG9tKSk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaChgJHtwcm9wUHJlZml4fS1ib3R0b21gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfS1ib3R0b20gdmFsdWU6ICR7dG9rZW5zWzJdfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAobGVmdC5weCAhPT0gbnVsbCB8fCAvXi0/XFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodG9rZW5zWzNdKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5idWlsZFNwYWNpbmdVdGlsaXR5KGAke3ByZWZpeH1sYCwgbGVmdCkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0tbGVmdGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgSW52YWxpZCAke3Byb3B9LWxlZnQgdmFsdWU6ICR7dG9rZW5zWzNdfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREaXNwbGF5KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBkaXNwbGF5TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2ZsZXgnOiAnZmxleCcsXG4gICAgICAnYmxvY2snOiAnYmxvY2snLFxuICAgICAgJ2lubGluZSc6ICdpbmxpbmUnLFxuICAgICAgJ2lubGluZS1ibG9jayc6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgJ2dyaWQnOiAnZ3JpZCcsXG4gICAgICAnaW5saW5lLWZsZXgnOiAnaW5saW5lLWZsZXgnLFxuICAgICAgJ2lubGluZS1ncmlkJzogJ2lubGluZS1ncmlkJyxcbiAgICAgICdub25lJzogJ2hpZGRlbicsXG4gICAgICAnY29udGVudHMnOiAnY29udGVudHMnLFxuICAgICAgJ3RhYmxlJzogJ3RhYmxlJyxcbiAgICAgICd0YWJsZS1jZWxsJzogJ3RhYmxlLWNlbGwnLFxuICAgICAgJ3RhYmxlLXJvdyc6ICd0YWJsZS1yb3cnLFxuICAgICAgJ2Zsb3ctcm9vdCc6ICdmbG93LXJvb3QnXG4gICAgfTtcblxuICAgIGlmIChkaXNwbGF5TWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBkaXNwbGF5TWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gZGlzcGxheSB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRNYXJnaW4ocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3Qgc2lkZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdtYXJnaW4nOiAnbScsXG4gICAgICAnbWFyZ2luLXRvcCc6ICdtdCcsXG4gICAgICAnbWFyZ2luLXJpZ2h0JzogJ21yJyxcbiAgICAgICdtYXJnaW4tYm90dG9tJzogJ21iJyxcbiAgICAgICdtYXJnaW4tbGVmdCc6ICdtbCcsXG4gICAgICAnbWFyZ2luLXgnOiAnbXgnLFxuICAgICAgJ21hcmdpbi15JzogJ215J1xuICAgIH07XG4gICAgY29uc3QgcHJlZml4ID0gc2lkZU1hcFtwcm9wXSB8fCAnbSc7XG4gICAgXG4gICAgY29uc3QgaXNOZWdhdGl2ZSA9IHZhbHVlLnN0YXJ0c1dpdGgoJy0nKTtcbiAgICBjb25zdCBhYnNvbHV0ZVZhbHVlID0gaXNOZWdhdGl2ZSA/IHZhbHVlLnNsaWNlKDEpIDogdmFsdWU7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeChhYnNvbHV0ZVZhbHVlKTtcbiAgICBcbiAgICBpZiAodmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LWF1dG9gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBcbiAgICBpZiAocHggPT09IG51bGwpIHtcbiAgICAgIGlmICgvXi0/XFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgTm9uLXBpeGVsIG1hcmdpbiB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgIGlmICghc3BhY2luZykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogaXNOZWdhdGl2ZSA/IGAtJHtwcmVmaXh9LSR7c3BhY2luZ31gIDogYCR7cHJlZml4fS0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFBhZGRpbmcocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgXG4gICAgY29uc3Qgc2lkZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdwYWRkaW5nJzogJ3AnLFxuICAgICAgJ3BhZGRpbmctdG9wJzogJ3B0JyxcbiAgICAgICdwYWRkaW5nLXJpZ2h0JzogJ3ByJyxcbiAgICAgICdwYWRkaW5nLWJvdHRvbSc6ICdwYicsXG4gICAgICAncGFkZGluZy1sZWZ0JzogJ3BsJyxcbiAgICAgICdwYWRkaW5nLXgnOiAncHgnLFxuICAgICAgJ3BhZGRpbmcteSc6ICdweSdcbiAgICB9O1xuICAgIGNvbnN0IHByZWZpeCA9IHNpZGVNYXBbcHJvcF0gfHwgJ3AnO1xuICAgIFxuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgaWYgKC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tcGl4ZWwgcGFkZGluZyB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgIGlmICghc3BhY2luZykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERpbWVuc2lvbkNvbnN0cmFpbnQocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHJlZml4TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ21heC13aWR0aCc6ICdtYXgtdycsXG4gICAgICAnbWluLXdpZHRoJzogJ21pbi13JyxcbiAgICAgICdtYXgtaGVpZ2h0JzogJ21heC1oJyxcbiAgICAgICdtaW4taGVpZ2h0JzogJ21pbi1oJ1xuICAgIH07XG4gICAgY29uc3QgcHJlZml4ID0gcHJlZml4TWFwW3Byb3BdO1xuXG4gICAgaWYgKHZhbHVlID09PSAnMTAwJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1mdWxsYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnMCcgfHwgdmFsdWUgPT09ICcwcHgnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tMGAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tbm9uZWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdtYXgtd2lkdGgnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICdtaW4tY29udGVudCcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnbWF4LXctbWluJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gJ21heC1jb250ZW50Jykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdtYXgtdy1tYXgnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09PSAnZml0LWNvbnRlbnQnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ21heC13LWZpdCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1heFdQcm9zZVNpemVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnNjVjaCc6ICdwcm9zZScsXG4gICAgICAgICc4MGNoJzogJ3Byb3NlLWxnJ1xuICAgICAgfTtcbiAgICAgIGlmIChtYXhXUHJvc2VTaXplc1t2YWx1ZV0pIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgbWF4LXctJHttYXhXUHJvc2VTaXplc1t2YWx1ZV19YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWF4V2lkdGhTY2FsZS5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYG1heC13LSR7dGhpcy5tYXhXaWR0aFNjYWxlLmdldCh2YWx1ZSl9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBpZiAocHggIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICAgIGlmIChzcGFjaW5nKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JXxjaHx2d3x2aCk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggJHtwcm9wfSB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGb250V2VpZ2h0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCB3ZWlnaHRNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnMTAwJzogJ2ZvbnQtdGhpbicsXG4gICAgICAnMjAwJzogJ2ZvbnQtZXh0cmFsaWdodCcsXG4gICAgICAnMzAwJzogJ2ZvbnQtbGlnaHQnLFxuICAgICAgJzQwMCc6ICdmb250LW5vcm1hbCcsXG4gICAgICAnNTAwJzogJ2ZvbnQtbWVkaXVtJyxcbiAgICAgICc2MDAnOiAnZm9udC1zZW1pYm9sZCcsXG4gICAgICAnNzAwJzogJ2ZvbnQtYm9sZCcsXG4gICAgICAnODAwJzogJ2ZvbnQtZXh0cmFib2xkJyxcbiAgICAgICc5MDAnOiAnZm9udC1ibGFjaycsXG4gICAgICAnbm9ybWFsJzogJ2ZvbnQtbm9ybWFsJyxcbiAgICAgICdib2xkJzogJ2ZvbnQtYm9sZCdcbiAgICB9O1xuXG4gICAgaWYgKHdlaWdodE1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogd2VpZ2h0TWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gZm9udC13ZWlnaHQ6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Rm9udFNpemUodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCAhPT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuZm9udFNpemVTY2FsZS5oYXMocHgpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtJHt0aGlzLmZvbnRTaXplU2NhbGUuZ2V0KHB4KX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdGV4dC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vbi1zdGFuZGFyZCBmb250LXNpemU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VGV4dERlY29yYXRpb24odmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGRlY29yYXRpb25NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAndW5kZXJsaW5lJzogJ3VuZGVybGluZScsXG4gICAgICAnbGluZS10aHJvdWdoJzogJ2xpbmUtdGhyb3VnaCcsXG4gICAgICAnbm9uZSc6ICduby11bmRlcmxpbmUnLFxuICAgICAgJ25vLXVuZGVybGluZSc6ICduby11bmRlcmxpbmUnXG4gICAgfTtcblxuICAgIGlmIChkZWNvcmF0aW9uTWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBkZWNvcmF0aW9uTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgdGV4dC1kZWNvcmF0aW9uIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5zdXBwb3J0ZWQgdGV4dC1kZWNvcmF0aW9uOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRleHRUcmFuc2Zvcm0odmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHRyYW5zZm9ybU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICd1cHBlcmNhc2UnOiAndXBwZXJjYXNlJyxcbiAgICAgICdsb3dlcmNhc2UnOiAnbG93ZXJjYXNlJyxcbiAgICAgICdjYXBpdGFsaXplJzogJ2NhcGl0YWxpemUnLFxuICAgICAgJ25vbmUnOiAnbm9ybWFsLWNhc2UnLFxuICAgICAgJ2luaXRpYWwnOiAnbm9ybWFsLWNhc2UnXG4gICAgfTtcblxuICAgIGlmICh0cmFuc2Zvcm1NYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHRyYW5zZm9ybU1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIHRleHQtdHJhbnNmb3JtOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydExldHRlclNwYWNpbmcodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGlmICh0aGlzLmxldHRlclNwYWNpbmdTY2FsZS5oYXModmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0cmFja2luZy0ke3RoaXMubGV0dGVyU3BhY2luZ1NjYWxlLmdldCh2YWx1ZSl9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBrbm93bk1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJy0wLjAyNWVtJzogJ3RpZ2h0JyxcbiAgICAgICctMC4wNWVtJzogJ3RpZ2h0ZXInLFxuICAgICAgJzAuMDI1ZW0nOiAnd2lkZScsXG4gICAgICAnMC4wNWVtJzogJ3dpZGVyJyxcbiAgICAgICcwLjFlbSc6ICd3aWRlc3QnLFxuICAgICAgJzBlbSc6ICdub3JtYWwnXG4gICAgfTtcblxuICAgIGlmIChrbm93bk1hcHBpbmdzW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdHJhY2tpbmctJHtrbm93bk1hcHBpbmdzW3ZhbHVlXX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICgvXi0/XFxkKyhcXC5cXGQrKT8oZW18cHh8cmVtKT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdHJhY2tpbmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGxldHRlci1zcGFjaW5nOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydExpbmVIZWlnaHQodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGlmICh0aGlzLmxpbmVIZWlnaHRTY2FsZS5oYXModmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBsZWFkaW5nLSR7dGhpcy5saW5lSGVpZ2h0U2NhbGUuZ2V0KHZhbHVlKX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGtub3duTWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnMSc6ICdub25lJyxcbiAgICAgICcxLjI1JzogJ3RpZ2h0JyxcbiAgICAgICcxLjM3NSc6ICdzbnVnJyxcbiAgICAgICcxLjUnOiAnbm9ybWFsJyxcbiAgICAgICcxLjYyNSc6ICdyZWxheGVkJyxcbiAgICAgICcyJzogJ2xvb3NlJ1xuICAgIH07XG5cbiAgICBpZiAoa25vd25NYXBwaW5nc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGxlYWRpbmctJHtrbm93bk1hcHBpbmdzW3ZhbHVlXX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGxlYWRpbmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtKT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgbGVhZGluZy1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gbGluZS1oZWlnaHQ6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RmxleGJveChwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBpZiAocHJvcCA9PT0gJ2ZsZXgtZGlyZWN0aW9uJykge1xuICAgICAgY29uc3QgZGlyTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAncm93JzogJ2ZsZXgtcm93JyxcbiAgICAgICAgJ3Jvdy1yZXZlcnNlJzogJ2ZsZXgtcm93LXJldmVyc2UnLFxuICAgICAgICAnY29sdW1uJzogJ2ZsZXgtY29sJyxcbiAgICAgICAgJ2NvbHVtbi1yZXZlcnNlJzogJ2ZsZXgtY29sLXJldmVyc2UnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBkaXJNYXBbdmFsdWVdIHx8IG51bGwsIHNraXBwZWQ6ICFkaXJNYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdmbGV4LXdyYXAnKSB7XG4gICAgICBjb25zdCB3cmFwTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnd3JhcCc6ICdmbGV4LXdyYXAnLFxuICAgICAgICAnbm93cmFwJzogJ2ZsZXgtbm93cmFwJyxcbiAgICAgICAgJ3dyYXAtcmV2ZXJzZSc6ICdmbGV4LXdyYXAtcmV2ZXJzZSdcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHdyYXBNYXBbdmFsdWVdIHx8IG51bGwsIHNraXBwZWQ6ICF3cmFwTWFwW3ZhbHVlXSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnanVzdGlmeS1jb250ZW50Jykge1xuICAgICAgY29uc3QganVzdGlmeU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ2ZsZXgtc3RhcnQnOiAnanVzdGlmeS1zdGFydCcsXG4gICAgICAgICdmbGV4LWVuZCc6ICdqdXN0aWZ5LWVuZCcsXG4gICAgICAgICdjZW50ZXInOiAnanVzdGlmeS1jZW50ZXInLFxuICAgICAgICAnc3BhY2UtYmV0d2Vlbic6ICdqdXN0aWZ5LWJldHdlZW4nLFxuICAgICAgICAnc3BhY2UtYXJvdW5kJzogJ2p1c3RpZnktYXJvdW5kJyxcbiAgICAgICAgJ3NwYWNlLWV2ZW5seSc6ICdqdXN0aWZ5LWV2ZW5seSdcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGp1c3RpZnlNYXBbdmFsdWVdIHx8IG51bGwsIHNraXBwZWQ6ICFqdXN0aWZ5TWFwW3ZhbHVlXSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnYWxpZ24taXRlbXMnKSB7XG4gICAgICBjb25zdCBhbGlnbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ2ZsZXgtc3RhcnQnOiAnaXRlbXMtc3RhcnQnLFxuICAgICAgICAnZmxleC1lbmQnOiAnaXRlbXMtZW5kJyxcbiAgICAgICAgJ2NlbnRlcic6ICdpdGVtcy1jZW50ZXInLFxuICAgICAgICAnYmFzZWxpbmUnOiAnaXRlbXMtYmFzZWxpbmUnLFxuICAgICAgICAnc3RyZXRjaCc6ICdpdGVtcy1zdHJldGNoJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYWxpZ25NYXBbdmFsdWVdIHx8IG51bGwsIHNraXBwZWQ6ICFhbGlnbk1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2FsaWduLWNvbnRlbnQnKSB7XG4gICAgICBjb25zdCBhbGlnbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ2ZsZXgtc3RhcnQnOiAnY29udGVudC1zdGFydCcsXG4gICAgICAgICdmbGV4LWVuZCc6ICdjb250ZW50LWVuZCcsXG4gICAgICAgICdjZW50ZXInOiAnY29udGVudC1jZW50ZXInLFxuICAgICAgICAnc3BhY2UtYmV0d2Vlbic6ICdjb250ZW50LWJldHdlZW4nLFxuICAgICAgICAnc3BhY2UtYXJvdW5kJzogJ2NvbnRlbnQtYXJvdW5kJyxcbiAgICAgICAgJ3N0cmV0Y2gnOiAnY29udGVudC1zdHJldGNoJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYWxpZ25NYXBbdmFsdWVdIHx8IG51bGwsIHNraXBwZWQ6ICFhbGlnbk1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2FsaWduLXNlbGYnKSB7XG4gICAgICBjb25zdCBhbGlnblNlbGZNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdhdXRvJzogJ3NlbGYtYXV0bycsXG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ3NlbGYtc3RhcnQnLFxuICAgICAgICAnZmxleC1lbmQnOiAnc2VsZi1lbmQnLFxuICAgICAgICAnY2VudGVyJzogJ3NlbGYtY2VudGVyJyxcbiAgICAgICAgJ3N0cmV0Y2gnOiAnc2VsZi1zdHJldGNoJyxcbiAgICAgICAgJ2Jhc2VsaW5lJzogJ3NlbGYtYmFzZWxpbmUnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBhbGlnblNlbGZNYXBbdmFsdWVdIHx8IG51bGwsIHNraXBwZWQ6ICFhbGlnblNlbGZNYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdmbGV4LWdyb3cnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICcwJykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdncm93LTAnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09PSAnMScpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnZ3JvdycsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBncm93LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnZmxleC1zaHJpbmsnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICcwJykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdzaHJpbmstMCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT09ICcxJykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdzaHJpbmsnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgc2hyaW5rLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnZmxleC1iYXNpcycpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2Jhc2lzLWF1dG8nLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09PSAnMCcgfHwgdmFsdWUgPT09ICcwcHgnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2Jhc2lzLTAnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgICBpZiAocHggIT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgICAgICBpZiAoc3BhY2luZykge1xuICAgICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJhc2lzLSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JXx2d3x2aCk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYmFzaXMtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbnN1cHBvcnRlZCBmbGV4Ym94IHByb3BlcnR5OiAke3Byb3B9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RmxleFNob3J0aGFuZCh2YWx1ZTogc3RyaW5nKTogTXVsdGlDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodmFsdWUgPT09ICcxJykge1xuICAgICAgY2xhc3Nlcy5wdXNoKCdmbGV4LTEnKTtcbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnZmxleC1hdXRvJyk7XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2ZsZXgnKTtcbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICBjbGFzc2VzLnB1c2goJ2ZsZXgtbm9uZScpO1xuICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdmbGV4Jyk7XG4gICAgICByZXR1cm4geyBjbGFzc2VzLCB3YXJuaW5ncywgY3NzUHJvcGVydGllcyB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdpbml0aWFsJykge1xuICAgICAgY2xhc3Nlcy5wdXNoKCdmbGV4LWluaXRpYWwnKTtcbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2VuaXplVmFsdWUodmFsdWUpO1xuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAzKSB7XG4gICAgICBjb25zdCBbZ3Jvdywgc2hyaW5rLCBiYXNpc10gPSB0b2tlbnM7XG4gICAgICBcbiAgICAgIGlmIChncm93ID09PSAnMScgJiYgc2hyaW5rID09PSAnMScgJiYgYmFzaXMgPT09ICcwJScpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmbGV4LTEnKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdmbGV4Jyk7XG4gICAgICB9IGVsc2UgaWYgKGdyb3cgPT09ICcxJyAmJiBzaHJpbmsgPT09ICcxJyAmJiBiYXNpcyA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnZmxleC1hdXRvJyk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgfSBlbHNlIGlmIChncm93ID09PSAnMCcgJiYgc2hyaW5rID09PSAnMScgJiYgYmFzaXMgPT09ICdhdXRvJykge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2ZsZXgtaW5pdGlhbCcpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2ZsZXgnKTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdyA9PT0gJzAnICYmIHNocmluayA9PT0gJzAnICYmIGJhc2lzID09PSAnYXV0bycpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmbGV4LW5vbmUnKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdmbGV4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc2VzLnB1c2goYGZsZXgtWyR7dmFsdWV9XWApO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2ZsZXgnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMSB8fCB0b2tlbnMubGVuZ3RoID09PSAyKSB7XG4gICAgICBjbGFzc2VzLnB1c2goYGZsZXgtWyR7dmFsdWV9XWApO1xuICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdmbGV4Jyk7XG4gICAgICByZXR1cm4geyBjbGFzc2VzLCB3YXJuaW5ncywgY3NzUHJvcGVydGllcyB9O1xuICAgIH1cblxuICAgIHdhcm5pbmdzLnB1c2goYENvbXBsZXggZmxleCBzaG9ydGhhbmQ6ICR7dmFsdWV9YCk7XG4gICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEdhcCh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgZ2FwLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tcGl4ZWwgZ2FwIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgaWYgKCFzcGFjaW5nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBnYXAtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgZ2FwLSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0V2lkdGgodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGlmICh2YWx1ZSA9PT0gJzEwMCUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LWZ1bGwnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICc1MCUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTEvMicsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzMzLjMzMyUnIHx8IHZhbHVlID09PSAnMzMuMzMlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0xLzMnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICc2Ni42NjYlJyB8fCB2YWx1ZSA9PT0gJzY2LjY3JScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMi8zJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnMjUlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0xLzQnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICc3NSUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTMvNCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LWF1dG8nLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdmaXQtY29udGVudCcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctZml0Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnbWluLWNvbnRlbnQnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LW1pbicsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ21heC1jb250ZW50Jykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy1tYXgnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgICAgaWYgKHNwYWNpbmcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdy0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCV8dncpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB3LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgQ29tcGxleCB3aWR0aCB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRIZWlnaHQodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGlmICh2YWx1ZSA9PT0gJzEwMCUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdoLWZ1bGwnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICc1MCUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdoLTEvMicsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdoLWF1dG8nLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdmaXQtY29udGVudCcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2gtZml0Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnbWluLWNvbnRlbnQnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdoLW1pbicsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ21heC1jb250ZW50Jykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC1tYXgnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICcxMDB2aCcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2gtc2NyZWVuJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBpZiAocHggIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICAgIGlmIChzcGFjaW5nKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGgtJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBoLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlfHZoKT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgaC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggaGVpZ2h0IHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgY29sb3JNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAndHJhbnNwYXJlbnQnOiAnYmctdHJhbnNwYXJlbnQnLFxuICAgICAgJ3doaXRlJzogJ2JnLXdoaXRlJyxcbiAgICAgICdibGFjayc6ICdiZy1ibGFjaycsXG4gICAgICAncmVkJzogJ2JnLXJlZC01MDAnLFxuICAgICAgJ2JsdWUnOiAnYmctYmx1ZS01MDAnLFxuICAgICAgJ2dyZWVuJzogJ2JnLWdyZWVuLTUwMCcsXG4gICAgICAnZ3JheSc6ICdiZy1ncmF5LTUwMCdcbiAgICB9O1xuXG4gICAgaWYgKGNvbG9yTWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBjb2xvck1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBiZy1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggYmFja2dyb3VuZC1jb2xvcjogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRUZXh0Q29sb3IodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGNvbG9yTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3RyYW5zcGFyZW50JzogJ3RleHQtdHJhbnNwYXJlbnQnLFxuICAgICAgJ3doaXRlJzogJ3RleHQtd2hpdGUnLFxuICAgICAgJ2JsYWNrJzogJ3RleHQtYmxhY2snLFxuICAgICAgJ3JlZCc6ICd0ZXh0LXJlZC01MDAnLFxuICAgICAgJ2JsdWUnOiAndGV4dC1ibHVlLTUwMCcsXG4gICAgICAnZ3JlZW4nOiAndGV4dC1ncmVlbi01MDAnLFxuICAgICAgJ2dyYXknOiAndGV4dC1ncmF5LTUwMCdcbiAgICB9O1xuXG4gICAgaWYgKGNvbG9yTWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBjb2xvck1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdGV4dC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgncmdiJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGNvbG9yOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEJvcmRlclJhZGl1cyh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgXG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICc1MCUnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3JvdW5kZWQtZnVsbCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgcm91bmRlZC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgQ29tcGxleCBib3JkZXItcmFkaXVzOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByYWRpdXNNYXA6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgICAwOiAncm91bmRlZC1ub25lJyxcbiAgICAgIDI6ICdyb3VuZGVkLXNtJyxcbiAgICAgIDQ6ICdyb3VuZGVkJyxcbiAgICAgIDY6ICdyb3VuZGVkLW1kJyxcbiAgICAgIDg6ICdyb3VuZGVkLWxnJyxcbiAgICAgIDEyOiAncm91bmRlZC14bCcsXG4gICAgICAxNjogJ3JvdW5kZWQtMnhsJyxcbiAgICAgIDI0OiAncm91bmRlZC0zeGwnXG4gICAgfTtcblxuICAgIGNvbnN0IGNsb3Nlc3QgPSBPYmplY3Qua2V5cyhyYWRpdXNNYXApXG4gICAgICAubWFwKE51bWJlcilcbiAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IFxuICAgICAgICBNYXRoLmFicyhjdXJyIC0gcHgpIDwgTWF0aC5hYnMocHJldiAtIHB4KSA/IGN1cnIgOiBwcmV2XG4gICAgICApO1xuXG4gICAgaWYgKE1hdGguYWJzKGNsb3Nlc3QgLSBweCkgLyAocHggfHwgMSkgPCAwLjIpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogcmFkaXVzTWFwW2Nsb3Nlc3RdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHJvdW5kZWQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRCb3JkZXIocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgaWYgKHByb3AgPT09ICdib3JkZXItd2lkdGgnKSB7XG4gICAgICBjb25zdCB3aWR0aE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJzAnOiAnYm9yZGVyLTAnLFxuICAgICAgICAnMXB4JzogJ2JvcmRlcicsXG4gICAgICAgICcycHgnOiAnYm9yZGVyLTInLFxuICAgICAgICAnNHB4JzogJ2JvcmRlci00JyxcbiAgICAgICAgJzhweCc6ICdib3JkZXItOCdcbiAgICAgIH07XG5cbiAgICAgIGlmICh3aWR0aE1hcFt2YWx1ZV0pIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiB3aWR0aE1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYm9yZGVyLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gYm9yZGVyLXdpZHRoOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2JvcmRlci1zdHlsZScpIHtcbiAgICAgIGNvbnN0IHN0eWxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnc29saWQnOiAnJyxcbiAgICAgICAgJ2Rhc2hlZCc6ICdib3JkZXItZGFzaGVkJyxcbiAgICAgICAgJ2RvdHRlZCc6ICdib3JkZXItZG90dGVkJyxcbiAgICAgICAgJ2RvdWJsZSc6ICdib3JkZXItZG91YmxlJyxcbiAgICAgICAgJ2hpZGRlbic6ICdib3JkZXItaGlkZGVuJyxcbiAgICAgICAgJ25vbmUnOiAnYm9yZGVyLW5vbmUnXG4gICAgICB9O1xuXG4gICAgICBpZiAodmFsdWUgPT09ICdzb2xpZCcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoc3R5bGVNYXBbdmFsdWVdKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogc3R5bGVNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gYm9yZGVyLXN0eWxlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2JvcmRlci1jb2xvcicpIHtcbiAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYm9yZGVyLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJvcmRlci1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sb3JNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICd0cmFuc3BhcmVudCc6ICdib3JkZXItdHJhbnNwYXJlbnQnLFxuICAgICAgICAnd2hpdGUnOiAnYm9yZGVyLXdoaXRlJyxcbiAgICAgICAgJ2JsYWNrJzogJ2JvcmRlci1ibGFjaycsXG4gICAgICAgICdyZWQnOiAnYm9yZGVyLXJlZC01MDAnLFxuICAgICAgICAnYmx1ZSc6ICdib3JkZXItYmx1ZS01MDAnLFxuICAgICAgICAnZ3JlZW4nOiAnYm9yZGVyLWdyZWVuLTUwMCcsXG4gICAgICAgICdncmF5JzogJ2JvcmRlci1ncmF5LTUwMCdcbiAgICAgIH07XG5cbiAgICAgIGlmIChjb2xvck1hcFt2YWx1ZV0pIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBjb2xvck1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJvcmRlci0ke3ZhbHVlfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdib3JkZXItdG9wLXdpZHRoJyB8fCBwcm9wID09PSAnYm9yZGVyLXJpZ2h0LXdpZHRoJyB8fCBcbiAgICAgICAgcHJvcCA9PT0gJ2JvcmRlci1ib3R0b20td2lkdGgnIHx8IHByb3AgPT09ICdib3JkZXItbGVmdC13aWR0aCcpIHtcbiAgICAgIGNvbnN0IHNpZGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdib3JkZXItdG9wLXdpZHRoJzogJ2JvcmRlci10JyxcbiAgICAgICAgJ2JvcmRlci1yaWdodC13aWR0aCc6ICdib3JkZXItcicsXG4gICAgICAgICdib3JkZXItYm90dG9tLXdpZHRoJzogJ2JvcmRlci1iJyxcbiAgICAgICAgJ2JvcmRlci1sZWZ0LXdpZHRoJzogJ2JvcmRlci1sJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHNpZGVNYXBbcHJvcF07XG5cbiAgICAgIGNvbnN0IHdpZHRoTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnMCc6IGAke3ByZWZpeH0tMGAsXG4gICAgICAgICcxcHgnOiBwcmVmaXgsXG4gICAgICAgICcycHgnOiBgJHtwcmVmaXh9LTJgLFxuICAgICAgICAnNHB4JzogYCR7cHJlZml4fS00YCxcbiAgICAgICAgJzhweCc6IGAke3ByZWZpeH0tOGBcbiAgICAgIH07XG5cbiAgICAgIGlmICh3aWR0aE1hcFt2YWx1ZV0pIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiB3aWR0aE1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gJHtwcm9wfTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGJvcmRlciBwcm9wZXJ0eTogJHtwcm9wfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEJvcmRlclNob3J0aGFuZCh2YWx1ZTogc3RyaW5nKTogTXVsdGlDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2VuaXplVmFsdWUodmFsdWUpO1xuXG4gICAgbGV0IHdpZHRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgc3R5bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjb2xvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfHRoaW58bWVkaXVtfHRoaWNrKT8kLy50ZXN0KHRva2VuKSB8fCBcbiAgICAgICAgICB0b2tlbiA9PT0gJ3RoaW4nIHx8IHRva2VuID09PSAnbWVkaXVtJyB8fCB0b2tlbiA9PT0gJ3RoaWNrJykge1xuICAgICAgICB3aWR0aCA9IHRva2VuO1xuICAgICAgfSBlbHNlIGlmIChbJ3NvbGlkJywgJ2Rhc2hlZCcsICdkb3R0ZWQnLCAnZG91YmxlJywgJ2hpZGRlbicsICdub25lJywgJ2dyb292ZScsICdyaWRnZScsICdpbnNldCcsICdvdXRzZXQnXS5pbmNsdWRlcyh0b2tlbikpIHtcbiAgICAgICAgc3R5bGUgPSB0b2tlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbG9yID0gdG9rZW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdpZHRoKSB7XG4gICAgICBjb25zdCB3aWR0aE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJzAnOiAnYm9yZGVyLTAnLFxuICAgICAgICAnMXB4JzogJ2JvcmRlcicsXG4gICAgICAgICcycHgnOiAnYm9yZGVyLTInLFxuICAgICAgICAnNHB4JzogJ2JvcmRlci00JyxcbiAgICAgICAgJzhweCc6ICdib3JkZXItOCcsXG4gICAgICAgICd0aGluJzogJ2JvcmRlcicsXG4gICAgICAgICdtZWRpdW0nOiAnYm9yZGVyLTInLFxuICAgICAgICAndGhpY2snOiAnYm9yZGVyLTQnXG4gICAgICB9O1xuXG4gICAgICBpZiAod2lkdGhNYXBbd2lkdGhdKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh3aWR0aE1hcFt3aWR0aF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGBib3JkZXItWyR7d2lkdGh9XWApO1xuICAgICAgfVxuICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdib3JkZXItd2lkdGgnKTtcbiAgICB9XG5cbiAgICBpZiAoc3R5bGUgJiYgc3R5bGUgIT09ICdzb2xpZCcpIHtcbiAgICAgIGNvbnN0IHN0eWxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnZGFzaGVkJzogJ2JvcmRlci1kYXNoZWQnLFxuICAgICAgICAnZG90dGVkJzogJ2JvcmRlci1kb3R0ZWQnLFxuICAgICAgICAnZG91YmxlJzogJ2JvcmRlci1kb3VibGUnLFxuICAgICAgICAnaGlkZGVuJzogJ2JvcmRlci1oaWRkZW4nLFxuICAgICAgICAnbm9uZSc6ICdib3JkZXItbm9uZSdcbiAgICAgIH07XG5cbiAgICAgIGlmIChzdHlsZU1hcFtzdHlsZV0pIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHN0eWxlTWFwW3N0eWxlXSk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnYm9yZGVyLXN0eWxlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBVbnN1cHBvcnRlZCBib3JkZXItc3R5bGU6ICR7c3R5bGV9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICBpZiAoY29sb3Iuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgYm9yZGVyLVske2NvbG9yfV1gKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sb3Iuc3RhcnRzV2l0aCgncmdiJykpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGBib3JkZXItWyR7Y29sb3J9XWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29sb3JNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgJ3RyYW5zcGFyZW50JzogJ2JvcmRlci10cmFuc3BhcmVudCcsXG4gICAgICAgICAgJ3doaXRlJzogJ2JvcmRlci13aGl0ZScsXG4gICAgICAgICAgJ2JsYWNrJzogJ2JvcmRlci1ibGFjaydcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoY29sb3JNYXBbY29sb3JdKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKGNvbG9yTWFwW2NvbG9yXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKGBib3JkZXItJHtjb2xvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdib3JkZXItY29sb3InKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc2VzLCB3YXJuaW5ncywgY3NzUHJvcGVydGllcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGlyZWN0aW9uYWxCb3JkZXJTaG9ydGhhbmQocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogTXVsdGlDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBzaWRlTWFwOiBSZWNvcmQ8c3RyaW5nLCB7IHByZWZpeDogc3RyaW5nOyB3aWR0aFByb3A6IHN0cmluZzsgY29sb3JQcm9wOiBzdHJpbmcgfT4gPSB7XG4gICAgICAnYm9yZGVyLXRvcCc6IHsgcHJlZml4OiAnYm9yZGVyLXQnLCB3aWR0aFByb3A6ICdib3JkZXItdG9wLXdpZHRoJywgY29sb3JQcm9wOiAnYm9yZGVyLXRvcC1jb2xvcicgfSxcbiAgICAgICdib3JkZXItcmlnaHQnOiB7IHByZWZpeDogJ2JvcmRlci1yJywgd2lkdGhQcm9wOiAnYm9yZGVyLXJpZ2h0LXdpZHRoJywgY29sb3JQcm9wOiAnYm9yZGVyLXJpZ2h0LWNvbG9yJyB9LFxuICAgICAgJ2JvcmRlci1ib3R0b20nOiB7IHByZWZpeDogJ2JvcmRlci1iJywgd2lkdGhQcm9wOiAnYm9yZGVyLWJvdHRvbS13aWR0aCcsIGNvbG9yUHJvcDogJ2JvcmRlci1ib3R0b20tY29sb3InIH0sXG4gICAgICAnYm9yZGVyLWxlZnQnOiB7IHByZWZpeDogJ2JvcmRlci1sJywgd2lkdGhQcm9wOiAnYm9yZGVyLWxlZnQtd2lkdGgnLCBjb2xvclByb3A6ICdib3JkZXItbGVmdC1jb2xvcicgfVxuICAgIH07XG5cbiAgICBjb25zdCBzaWRlID0gc2lkZU1hcFtwcm9wXTtcbiAgICBpZiAoIXNpZGUpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzOiBbYFVua25vd24gZGlyZWN0aW9uYWwgYm9yZGVyOiAke3Byb3B9YF0sIGNzc1Byb3BlcnRpZXMgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2VuaXplVmFsdWUodmFsdWUpO1xuXG4gICAgbGV0IHdpZHRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgc3R5bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjb2xvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfHRoaW58bWVkaXVtfHRoaWNrKT8kLy50ZXN0KHRva2VuKSB8fCBcbiAgICAgICAgICB0b2tlbiA9PT0gJ3RoaW4nIHx8IHRva2VuID09PSAnbWVkaXVtJyB8fCB0b2tlbiA9PT0gJ3RoaWNrJykge1xuICAgICAgICB3aWR0aCA9IHRva2VuO1xuICAgICAgfSBlbHNlIGlmIChbJ3NvbGlkJywgJ2Rhc2hlZCcsICdkb3R0ZWQnLCAnZG91YmxlJywgJ2hpZGRlbicsICdub25lJ10uaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHN0eWxlID0gdG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xvciA9IHRva2VuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3aWR0aCkge1xuICAgICAgY29uc3Qgd2lkdGhNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICcwJzogYCR7c2lkZS5wcmVmaXh9LTBgLFxuICAgICAgICAnMXB4Jzogc2lkZS5wcmVmaXgsXG4gICAgICAgICcycHgnOiBgJHtzaWRlLnByZWZpeH0tMmAsXG4gICAgICAgICc0cHgnOiBgJHtzaWRlLnByZWZpeH0tNGAsXG4gICAgICAgICc4cHgnOiBgJHtzaWRlLnByZWZpeH0tOGBcbiAgICAgIH07XG5cbiAgICAgIGlmICh3aWR0aE1hcFt3aWR0aF0pIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHdpZHRoTWFwW3dpZHRoXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc2VzLnB1c2goYCR7c2lkZS5wcmVmaXh9LVske3dpZHRofV1gKTtcbiAgICAgIH1cbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaChzaWRlLndpZHRoUHJvcCk7XG4gICAgfVxuXG4gICAgaWYgKHN0eWxlICYmIHN0eWxlICE9PSAnc29saWQnKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKGBCb3JkZXIgc3R5bGUgJyR7c3R5bGV9JyBmb3IgJHtwcm9wfSBhcHBsaWVzIHRvIGFsbCBib3JkZXJzYCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICBpZiAoY29sb3Iuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgJHtzaWRlLnByZWZpeH0tWyR7Y29sb3J9XWApO1xuICAgICAgfSBlbHNlIGlmIChjb2xvci5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goYCR7c2lkZS5wcmVmaXh9LVske2NvbG9yfV1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgJHtzaWRlLnByZWZpeH0tJHtjb2xvcn1gKTtcbiAgICAgIH1cbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaChzaWRlLmNvbG9yUHJvcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEFzcGVjdFJhdGlvKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCByYXRpb01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICcxLzEnOiAnYXNwZWN0LXNxdWFyZScsXG4gICAgICAnMTYvOSc6ICdhc3BlY3QtdmlkZW8nLFxuICAgICAgJzQvMyc6ICdhc3BlY3QtWzQvM10nLFxuICAgICAgJzMvNCc6ICdhc3BlY3QtWzMvNF0nLFxuICAgICAgJzIvMyc6ICdhc3BlY3QtWzIvM10nLFxuICAgICAgJzMvMic6ICdhc3BlY3QtWzMvMl0nLFxuICAgICAgJzEvMic6ICdhc3BlY3QtWzEvMl0nLFxuICAgICAgJzIvMSc6ICdhc3BlY3QtWzIvMV0nLFxuICAgICAgJ2F1dG8nOiAnYXNwZWN0LWF1dG8nXG4gICAgfTtcblxuICAgIGlmIChyYXRpb01hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogcmF0aW9NYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGFzcGVjdC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrXFwvXFxkKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBhc3BlY3QtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGFzcGVjdC1yYXRpbzogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRPdmVyZmxvdyhwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBwcmVmaXhNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnb3ZlcmZsb3cnOiAnb3ZlcmZsb3cnLFxuICAgICAgJ292ZXJmbG93LXgnOiAnb3ZlcmZsb3cteCcsXG4gICAgICAnb3ZlcmZsb3cteSc6ICdvdmVyZmxvdy15J1xuICAgIH07XG5cbiAgICBjb25zdCBwcmVmaXggPSBwcmVmaXhNYXBbcHJvcF07XG5cbiAgICBjb25zdCB2YWx1ZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdhdXRvJzogYCR7cHJlZml4fS1hdXRvYCxcbiAgICAgICdoaWRkZW4nOiBgJHtwcmVmaXh9LWhpZGRlbmAsXG4gICAgICAndmlzaWJsZSc6IGAke3ByZWZpeH0tdmlzaWJsZWAsXG4gICAgICAnc2Nyb2xsJzogYCR7cHJlZml4fS1zY3JvbGxgLFxuICAgICAgJ2NsaXAnOiBgJHtwcmVmaXh9LWNsaXBgXG4gICAgfTtcblxuICAgIGlmICh2YWx1ZU1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogdmFsdWVNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBvdmVyZmxvdyB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRPYmplY3RGaXQodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGZpdE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjb250YWluJzogJ29iamVjdC1jb250YWluJyxcbiAgICAgICdjb3Zlcic6ICdvYmplY3QtY292ZXInLFxuICAgICAgJ2ZpbGwnOiAnb2JqZWN0LWZpbGwnLFxuICAgICAgJ25vbmUnOiAnb2JqZWN0LW5vbmUnLFxuICAgICAgJ3NjYWxlLWRvd24nOiAnb2JqZWN0LXNjYWxlLWRvd24nXG4gICAgfTtcblxuICAgIGlmIChmaXRNYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGZpdE1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIG9iamVjdC1maXQ6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0T2JqZWN0UG9zaXRpb24odmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHBvc2l0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NlbnRlcic6ICdvYmplY3QtY2VudGVyJyxcbiAgICAgICd0b3AnOiAnb2JqZWN0LXRvcCcsXG4gICAgICAnYm90dG9tJzogJ29iamVjdC1ib3R0b20nLFxuICAgICAgJ2xlZnQnOiAnb2JqZWN0LWxlZnQnLFxuICAgICAgJ3JpZ2h0JzogJ29iamVjdC1yaWdodCcsXG4gICAgICAnY2VudGVyIGNlbnRlcic6ICdvYmplY3QtY2VudGVyJyxcbiAgICAgICdjZW50ZXIgdG9wJzogJ29iamVjdC10b3AnLFxuICAgICAgJ2NlbnRlciBib3R0b20nOiAnb2JqZWN0LWJvdHRvbScsXG4gICAgICAnbGVmdCBjZW50ZXInOiAnb2JqZWN0LWxlZnQnLFxuICAgICAgJ3JpZ2h0IGNlbnRlcic6ICdvYmplY3QtcmlnaHQnLFxuICAgICAgJ2xlZnQgdG9wJzogJ29iamVjdC1sZWZ0LXRvcCcsXG4gICAgICAncmlnaHQgdG9wJzogJ29iamVjdC1yaWdodC10b3AnLFxuICAgICAgJ2xlZnQgYm90dG9tJzogJ29iamVjdC1sZWZ0LWJvdHRvbScsXG4gICAgICAncmlnaHQgYm90dG9tJzogJ29iamVjdC1yaWdodC1ib3R0b20nXG4gICAgfTtcblxuICAgIGlmIChwb3NpdGlvbk1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogcG9zaXRpb25NYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KCV8cHh8cmVtfGVtKT8oXFxzK1xcZCsoXFwuXFxkKyk/KCV8cHh8cmVtfGVtKT8pPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBvYmplY3QtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIG9iamVjdC1wb3NpdGlvbjogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRPcGFjaXR5KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBudW1WYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIGlmIChpc05hTihudW1WYWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgSW52YWxpZCBvcGFjaXR5IHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJjZW50VmFsdWUgPSBNYXRoLnJvdW5kKG51bVZhbHVlICogMTAwKTtcblxuICAgIGlmICh0aGlzLm9wYWNpdHlTY2FsZS5oYXMocGVyY2VudFZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgb3BhY2l0eS0ke3RoaXMub3BhY2l0eVNjYWxlLmdldChwZXJjZW50VmFsdWUpfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgb3BhY2l0eS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFdvcmRCcmVhayh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgYnJlYWtNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnbm9ybWFsJzogJ2JyZWFrLW5vcm1hbCcsXG4gICAgICAnYnJlYWstYWxsJzogJ2JyZWFrLWFsbCcsXG4gICAgICAnYnJlYWstd29yZCc6ICdicmVhay13b3JkcycsXG4gICAgICAna2VlcC1hbGwnOiAnYnJlYWsta2VlcCdcbiAgICB9O1xuXG4gICAgaWYgKGJyZWFrTWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBicmVha01hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIHdvcmQtYnJlYWs6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0WkluZGV4KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBudW1WYWx1ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgaWYgKGlzTmFOKG51bVZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnei1hdXRvJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgSW52YWxpZCB6LWluZGV4IHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy56SW5kZXhTY2FsZS5oYXMobnVtVmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB6LSR7dGhpcy56SW5kZXhTY2FsZS5nZXQobnVtVmFsdWUpfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgei1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnZlcnRNdWx0aXBsZShwcm9wZXJ0aWVzOiBDU1NQcm9wZXJ0eVtdKTogeyBjbGFzc2VzOiBzdHJpbmdbXTsgd2FybmluZ3M6IHN0cmluZ1tdIH0ge1xuICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBwcm9wZXJ0aWVzLmZvckVhY2goKHsgcHJvcGVydHksIHZhbHVlIH0pID0+IHtcbiAgICAgIGNvbnN0IG11bHRpUmVzdWx0ID0gdGhpcy5jb252ZXJ0UHJvcGVydHlXaXRoTXVsdGlwbGUocHJvcGVydHksIHZhbHVlKTtcbiAgICAgIFxuICAgICAgY2xhc3Nlcy5wdXNoKC4uLm11bHRpUmVzdWx0LmNsYXNzZXMpO1xuICAgICAgd2FybmluZ3MucHVzaCguLi5tdWx0aVJlc3VsdC53YXJuaW5ncyk7XG5cbiAgICAgIGlmIChtdWx0aVJlc3VsdC5jbGFzc2VzLmxlbmd0aCA9PT0gMCAmJiBtdWx0aVJlc3VsdC53YXJuaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb252ZXJ0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXN1bHQuc2tpcHBlZCkge1xuICAgICAgICAgIHdhcm5pbmdzLnB1c2gocmVzdWx0LnJlYXNvbiB8fCBgU2tpcHBlZDogJHtwcm9wZXJ0eX06ICR7dmFsdWV9YCk7XG4gICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFNraXBwZWQ6ICR7cHJvcGVydHl9OiAke3ZhbHVlfSAtICR7cmVzdWx0LnJlYXNvbn1gKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKHJlc3VsdC5jbGFzc05hbWUpO1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBDb252ZXJ0ZWQ6ICR7cHJvcGVydHl9OiAke3ZhbHVlfSDihpIgJHtyZXN1bHQuY2xhc3NOYW1lfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobXVsdGlSZXN1bHQuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYENvbnZlcnRlZDogJHtwcm9wZXJ0eX06ICR7dmFsdWV9IOKGkiAke211bHRpUmVzdWx0LmNsYXNzZXMuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBtdWx0aVJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKHcgPT4gbG9nZ2VyLnZlcmJvc2UoYFdhcm5pbmc6ICR7d31gKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjbGFzc2VzLCB3YXJuaW5ncyB9O1xuICB9XG59XG4iXX0=