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.
- package/dist/cssParser.d.ts +3 -0
- package/dist/cssParser.js +78 -6
- package/dist/tailwindMapper.d.ts +38 -0
- package/dist/tailwindMapper.js +993 -80
- package/dist/utils/propertyMapper.d.ts +2 -0
- package/dist/utils/propertyMapper.js +133 -6
- package/dist/utils/variableRegistry.d.ts +52 -0
- package/dist/utils/variableRegistry.js +196 -0
- package/package.json +1 -1
package/dist/tailwindMapper.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
209
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
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
|
|
420
|
-
classes.
|
|
421
|
-
|
|
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=
|