css-to-tailwind-react 0.1.0
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/README.md +303 -0
- package/bin/index.js +11 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +80 -0
- package/dist/cssParser.d.ts +41 -0
- package/dist/cssParser.js +215 -0
- package/dist/fileWriter.d.ts +14 -0
- package/dist/fileWriter.js +128 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +21 -0
- package/dist/jsxParser.d.ts +26 -0
- package/dist/jsxParser.js +273 -0
- package/dist/scanner.d.ts +5 -0
- package/dist/scanner.js +55 -0
- package/dist/tailwindMapper.d.ts +35 -0
- package/dist/tailwindMapper.js +428 -0
- package/dist/transformer.d.ts +19 -0
- package/dist/transformer.js +259 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.js +139 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.js +56 -0
- package/package.json +73 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TailwindMapper = void 0;
|
|
4
|
+
const logger_1 = require("./utils/logger");
|
|
5
|
+
class TailwindMapper {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
this.spacingScale = this.buildSpacingScale();
|
|
9
|
+
}
|
|
10
|
+
buildSpacingScale() {
|
|
11
|
+
const scale = new Map();
|
|
12
|
+
const spacing = this.config.theme?.spacing || {};
|
|
13
|
+
Object.entries(spacing).forEach(([key, value]) => {
|
|
14
|
+
// Convert rem to pixels for comparison (assuming 1rem = 16px)
|
|
15
|
+
const remMatch = value.match(/([\d.]+)rem/);
|
|
16
|
+
if (remMatch) {
|
|
17
|
+
const pixels = parseFloat(remMatch[1]) * 16;
|
|
18
|
+
scale.set(Math.round(pixels), key);
|
|
19
|
+
}
|
|
20
|
+
// Also handle pixel values
|
|
21
|
+
const pxMatch = value.match(/([\d.]+)px/);
|
|
22
|
+
if (pxMatch) {
|
|
23
|
+
scale.set(Math.round(parseFloat(pxMatch[1])), key);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return scale;
|
|
27
|
+
}
|
|
28
|
+
pxToSpacing(px) {
|
|
29
|
+
// Try exact match first
|
|
30
|
+
if (this.spacingScale.has(px)) {
|
|
31
|
+
return this.spacingScale.get(px);
|
|
32
|
+
}
|
|
33
|
+
// Find closest match
|
|
34
|
+
let closestKey = null;
|
|
35
|
+
let closestDiff = Infinity;
|
|
36
|
+
this.spacingScale.forEach((_, key) => {
|
|
37
|
+
const diff = Math.abs(key - px);
|
|
38
|
+
if (diff < closestDiff) {
|
|
39
|
+
closestKey = key;
|
|
40
|
+
closestDiff = diff;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
// Only accept if within reasonable tolerance (20%)
|
|
44
|
+
if (closestKey !== null && closestDiff / px < 0.2) {
|
|
45
|
+
return this.spacingScale.get(closestKey) || null;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
extractPx(value) {
|
|
50
|
+
const pxMatch = value.match(/^([\d.]+)px$/);
|
|
51
|
+
if (pxMatch) {
|
|
52
|
+
return parseFloat(pxMatch[1]);
|
|
53
|
+
}
|
|
54
|
+
// Handle rem values
|
|
55
|
+
const remMatch = value.match(/^([\d.]+)rem$/);
|
|
56
|
+
if (remMatch) {
|
|
57
|
+
return parseFloat(remMatch[1]) * 16;
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
convertProperty(property, value) {
|
|
62
|
+
const normalizedProp = property.toLowerCase().trim();
|
|
63
|
+
const normalizedValue = value.toLowerCase().trim();
|
|
64
|
+
logger_1.logger.verbose(`Converting: ${normalizedProp}: ${normalizedValue}`);
|
|
65
|
+
// Display properties
|
|
66
|
+
if (normalizedProp === 'display') {
|
|
67
|
+
return this.convertDisplay(normalizedValue);
|
|
68
|
+
}
|
|
69
|
+
// Position properties
|
|
70
|
+
if (normalizedProp === 'position') {
|
|
71
|
+
return { className: normalizedValue, skipped: false };
|
|
72
|
+
}
|
|
73
|
+
// Margin properties
|
|
74
|
+
if (normalizedProp.startsWith('margin')) {
|
|
75
|
+
return this.convertMargin(normalizedProp, normalizedValue);
|
|
76
|
+
}
|
|
77
|
+
// Padding properties
|
|
78
|
+
if (normalizedProp.startsWith('padding')) {
|
|
79
|
+
return this.convertPadding(normalizedProp, normalizedValue);
|
|
80
|
+
}
|
|
81
|
+
// Font properties
|
|
82
|
+
if (normalizedProp === 'font-weight') {
|
|
83
|
+
return this.convertFontWeight(normalizedValue);
|
|
84
|
+
}
|
|
85
|
+
if (normalizedProp === 'font-size') {
|
|
86
|
+
return this.convertFontSize(normalizedValue);
|
|
87
|
+
}
|
|
88
|
+
// Text properties
|
|
89
|
+
if (normalizedProp === 'text-align') {
|
|
90
|
+
return { className: `text-${normalizedValue}`, skipped: false };
|
|
91
|
+
}
|
|
92
|
+
// Flexbox properties
|
|
93
|
+
if (normalizedProp.startsWith('flex') ||
|
|
94
|
+
normalizedProp.startsWith('justify') ||
|
|
95
|
+
normalizedProp.startsWith('align')) {
|
|
96
|
+
return this.convertFlexbox(normalizedProp, normalizedValue);
|
|
97
|
+
}
|
|
98
|
+
// Gap properties
|
|
99
|
+
if (normalizedProp === 'gap') {
|
|
100
|
+
return this.convertGap(normalizedValue);
|
|
101
|
+
}
|
|
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
|
+
if (normalizedProp === 'background-color') {
|
|
111
|
+
return this.convertBackgroundColor(normalizedValue);
|
|
112
|
+
}
|
|
113
|
+
if (normalizedProp === 'color') {
|
|
114
|
+
return this.convertTextColor(normalizedValue);
|
|
115
|
+
}
|
|
116
|
+
// Border radius
|
|
117
|
+
if (normalizedProp === 'border-radius') {
|
|
118
|
+
return this.convertBorderRadius(normalizedValue);
|
|
119
|
+
}
|
|
120
|
+
// Unsupported properties
|
|
121
|
+
return {
|
|
122
|
+
className: null,
|
|
123
|
+
skipped: true,
|
|
124
|
+
reason: `Unsupported property: ${property}`
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
convertDisplay(value) {
|
|
128
|
+
const displayMap = {
|
|
129
|
+
'flex': 'flex',
|
|
130
|
+
'block': 'block',
|
|
131
|
+
'inline': 'inline',
|
|
132
|
+
'inline-block': 'inline-block',
|
|
133
|
+
'grid': 'grid',
|
|
134
|
+
'none': 'hidden',
|
|
135
|
+
'contents': 'contents',
|
|
136
|
+
'table': 'table',
|
|
137
|
+
'table-cell': 'table-cell'
|
|
138
|
+
};
|
|
139
|
+
if (displayMap[value]) {
|
|
140
|
+
return { className: displayMap[value], skipped: false };
|
|
141
|
+
}
|
|
142
|
+
return { className: null, skipped: true, reason: `Unknown display value: ${value}` };
|
|
143
|
+
}
|
|
144
|
+
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
|
+
const sideMap = {
|
|
154
|
+
'margin': 'm',
|
|
155
|
+
'margin-top': 'mt',
|
|
156
|
+
'margin-right': 'mr',
|
|
157
|
+
'margin-bottom': 'mb',
|
|
158
|
+
'margin-left': 'ml',
|
|
159
|
+
'margin-x': 'mx',
|
|
160
|
+
'margin-y': 'my'
|
|
161
|
+
};
|
|
162
|
+
const prefix = sideMap[prop] || 'm';
|
|
163
|
+
return { className: `${prefix}-${spacing}`, skipped: false };
|
|
164
|
+
}
|
|
165
|
+
convertPadding(prop, value) {
|
|
166
|
+
const px = this.extractPx(value);
|
|
167
|
+
if (px === null) {
|
|
168
|
+
return { className: null, skipped: true, reason: `Non-pixel padding value: ${value}` };
|
|
169
|
+
}
|
|
170
|
+
const spacing = this.pxToSpacing(px);
|
|
171
|
+
if (!spacing) {
|
|
172
|
+
return { className: null, skipped: true, reason: `No matching spacing for: ${value}` };
|
|
173
|
+
}
|
|
174
|
+
const sideMap = {
|
|
175
|
+
'padding': 'p',
|
|
176
|
+
'padding-top': 'pt',
|
|
177
|
+
'padding-right': 'pr',
|
|
178
|
+
'padding-bottom': 'pb',
|
|
179
|
+
'padding-left': 'pl',
|
|
180
|
+
'padding-x': 'px',
|
|
181
|
+
'padding-y': 'py'
|
|
182
|
+
};
|
|
183
|
+
const prefix = sideMap[prop] || 'p';
|
|
184
|
+
return { className: `${prefix}-${spacing}`, skipped: false };
|
|
185
|
+
}
|
|
186
|
+
convertFontWeight(value) {
|
|
187
|
+
const weightMap = {
|
|
188
|
+
'100': 'font-thin',
|
|
189
|
+
'200': 'font-extralight',
|
|
190
|
+
'300': 'font-light',
|
|
191
|
+
'400': 'font-normal',
|
|
192
|
+
'500': 'font-medium',
|
|
193
|
+
'600': 'font-semibold',
|
|
194
|
+
'700': 'font-bold',
|
|
195
|
+
'800': 'font-extrabold',
|
|
196
|
+
'900': 'font-black',
|
|
197
|
+
'normal': 'font-normal',
|
|
198
|
+
'bold': 'font-bold'
|
|
199
|
+
};
|
|
200
|
+
if (weightMap[value]) {
|
|
201
|
+
return { className: weightMap[value], skipped: false };
|
|
202
|
+
}
|
|
203
|
+
return { className: null, skipped: true, reason: `Unknown font-weight: ${value}` };
|
|
204
|
+
}
|
|
205
|
+
convertFontSize(value) {
|
|
206
|
+
const px = this.extractPx(value);
|
|
207
|
+
if (px !== null) {
|
|
208
|
+
// Map common font sizes
|
|
209
|
+
const sizeMap = {
|
|
210
|
+
12: 'text-xs',
|
|
211
|
+
14: 'text-sm',
|
|
212
|
+
16: 'text-base',
|
|
213
|
+
18: 'text-lg',
|
|
214
|
+
20: 'text-xl',
|
|
215
|
+
24: 'text-2xl',
|
|
216
|
+
30: 'text-3xl',
|
|
217
|
+
36: 'text-4xl',
|
|
218
|
+
48: 'text-5xl'
|
|
219
|
+
};
|
|
220
|
+
const closest = Object.keys(sizeMap)
|
|
221
|
+
.map(Number)
|
|
222
|
+
.reduce((prev, curr) => Math.abs(curr - px) < Math.abs(prev - px) ? curr : prev);
|
|
223
|
+
if (Math.abs(closest - px) / px < 0.15) {
|
|
224
|
+
return { className: sizeMap[closest], skipped: false };
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return { className: null, skipped: true, reason: `Non-standard font-size: ${value}` };
|
|
228
|
+
}
|
|
229
|
+
convertFlexbox(prop, value) {
|
|
230
|
+
// Flex direction
|
|
231
|
+
if (prop === 'flex-direction') {
|
|
232
|
+
const dirMap = {
|
|
233
|
+
'row': 'flex-row',
|
|
234
|
+
'row-reverse': 'flex-row-reverse',
|
|
235
|
+
'column': 'flex-col',
|
|
236
|
+
'column-reverse': 'flex-col-reverse'
|
|
237
|
+
};
|
|
238
|
+
return { className: dirMap[value] || null, skipped: !dirMap[value] };
|
|
239
|
+
}
|
|
240
|
+
// Flex wrap
|
|
241
|
+
if (prop === 'flex-wrap') {
|
|
242
|
+
const wrapMap = {
|
|
243
|
+
'wrap': 'flex-wrap',
|
|
244
|
+
'nowrap': 'flex-nowrap',
|
|
245
|
+
'wrap-reverse': 'flex-wrap-reverse'
|
|
246
|
+
};
|
|
247
|
+
return { className: wrapMap[value] || null, skipped: !wrapMap[value] };
|
|
248
|
+
}
|
|
249
|
+
// Justify content
|
|
250
|
+
if (prop === 'justify-content') {
|
|
251
|
+
const justifyMap = {
|
|
252
|
+
'flex-start': 'justify-start',
|
|
253
|
+
'flex-end': 'justify-end',
|
|
254
|
+
'center': 'justify-center',
|
|
255
|
+
'space-between': 'justify-between',
|
|
256
|
+
'space-around': 'justify-around',
|
|
257
|
+
'space-evenly': 'justify-evenly'
|
|
258
|
+
};
|
|
259
|
+
return { className: justifyMap[value] || null, skipped: !justifyMap[value] };
|
|
260
|
+
}
|
|
261
|
+
// Align items
|
|
262
|
+
if (prop === 'align-items') {
|
|
263
|
+
const alignMap = {
|
|
264
|
+
'flex-start': 'items-start',
|
|
265
|
+
'flex-end': 'items-end',
|
|
266
|
+
'center': 'items-center',
|
|
267
|
+
'baseline': 'items-baseline',
|
|
268
|
+
'stretch': 'items-stretch'
|
|
269
|
+
};
|
|
270
|
+
return { className: alignMap[value] || null, skipped: !alignMap[value] };
|
|
271
|
+
}
|
|
272
|
+
return { className: null, skipped: true, reason: `Unsupported flexbox property: ${prop}` };
|
|
273
|
+
}
|
|
274
|
+
convertGap(value) {
|
|
275
|
+
const px = this.extractPx(value);
|
|
276
|
+
if (px === null) {
|
|
277
|
+
return { className: null, skipped: true, reason: `Non-pixel gap value: ${value}` };
|
|
278
|
+
}
|
|
279
|
+
const spacing = this.pxToSpacing(px);
|
|
280
|
+
if (!spacing) {
|
|
281
|
+
return { className: null, skipped: true, reason: `No matching spacing for: ${value}` };
|
|
282
|
+
}
|
|
283
|
+
return { className: `gap-${spacing}`, skipped: false };
|
|
284
|
+
}
|
|
285
|
+
convertWidth(value) {
|
|
286
|
+
// Handle percentage values
|
|
287
|
+
if (value === '100%') {
|
|
288
|
+
return { className: 'w-full', skipped: false };
|
|
289
|
+
}
|
|
290
|
+
if (value === '50%') {
|
|
291
|
+
return { className: 'w-1/2', skipped: false };
|
|
292
|
+
}
|
|
293
|
+
if (value === '33.333%' || value === '33.33%') {
|
|
294
|
+
return { className: 'w-1/3', skipped: false };
|
|
295
|
+
}
|
|
296
|
+
if (value === '66.666%' || value === '66.67%') {
|
|
297
|
+
return { className: 'w-2/3', skipped: false };
|
|
298
|
+
}
|
|
299
|
+
if (value === '25%') {
|
|
300
|
+
return { className: 'w-1/4', skipped: false };
|
|
301
|
+
}
|
|
302
|
+
if (value === '75%') {
|
|
303
|
+
return { className: 'w-3/4', skipped: false };
|
|
304
|
+
}
|
|
305
|
+
// Handle pixel values
|
|
306
|
+
const px = this.extractPx(value);
|
|
307
|
+
if (px !== null) {
|
|
308
|
+
const spacing = this.pxToSpacing(px);
|
|
309
|
+
if (spacing) {
|
|
310
|
+
return { className: `w-${spacing}`, skipped: false };
|
|
311
|
+
}
|
|
312
|
+
// Try arbitrary values for larger sizes
|
|
313
|
+
return { className: `w-[${value}]`, skipped: false };
|
|
314
|
+
}
|
|
315
|
+
return { className: null, skipped: true, reason: `Complex width value: ${value}` };
|
|
316
|
+
}
|
|
317
|
+
convertHeight(value) {
|
|
318
|
+
// Handle percentage values
|
|
319
|
+
if (value === '100%') {
|
|
320
|
+
return { className: 'h-full', skipped: false };
|
|
321
|
+
}
|
|
322
|
+
if (value === '50%') {
|
|
323
|
+
return { className: 'h-1/2', skipped: false };
|
|
324
|
+
}
|
|
325
|
+
// Handle pixel values
|
|
326
|
+
const px = this.extractPx(value);
|
|
327
|
+
if (px !== null) {
|
|
328
|
+
const spacing = this.pxToSpacing(px);
|
|
329
|
+
if (spacing) {
|
|
330
|
+
return { className: `h-${spacing}`, skipped: false };
|
|
331
|
+
}
|
|
332
|
+
return { className: `h-[${value}]`, skipped: false };
|
|
333
|
+
}
|
|
334
|
+
return { className: null, skipped: true, reason: `Complex height value: ${value}` };
|
|
335
|
+
}
|
|
336
|
+
convertBackgroundColor(value) {
|
|
337
|
+
// Handle named colors and hex
|
|
338
|
+
const colorMap = {
|
|
339
|
+
'transparent': 'bg-transparent',
|
|
340
|
+
'white': 'bg-white',
|
|
341
|
+
'black': 'bg-black',
|
|
342
|
+
'red': 'bg-red-500',
|
|
343
|
+
'blue': 'bg-blue-500',
|
|
344
|
+
'green': 'bg-green-500',
|
|
345
|
+
'gray': 'bg-gray-500'
|
|
346
|
+
};
|
|
347
|
+
if (colorMap[value]) {
|
|
348
|
+
return { className: colorMap[value], skipped: false };
|
|
349
|
+
}
|
|
350
|
+
// Handle hex colors - use arbitrary values
|
|
351
|
+
if (value.startsWith('#')) {
|
|
352
|
+
return { className: `bg-[${value}]`, skipped: false };
|
|
353
|
+
}
|
|
354
|
+
// Handle rgb/rgba
|
|
355
|
+
if (value.startsWith('rgb')) {
|
|
356
|
+
return { className: `bg-[${value}]`, skipped: false };
|
|
357
|
+
}
|
|
358
|
+
return { className: null, skipped: true, reason: `Complex background-color: ${value}` };
|
|
359
|
+
}
|
|
360
|
+
convertTextColor(value) {
|
|
361
|
+
const colorMap = {
|
|
362
|
+
'transparent': 'text-transparent',
|
|
363
|
+
'white': 'text-white',
|
|
364
|
+
'black': 'text-black',
|
|
365
|
+
'red': 'text-red-500',
|
|
366
|
+
'blue': 'text-blue-500',
|
|
367
|
+
'green': 'text-green-500',
|
|
368
|
+
'gray': 'text-gray-500'
|
|
369
|
+
};
|
|
370
|
+
if (colorMap[value]) {
|
|
371
|
+
return { className: colorMap[value], skipped: false };
|
|
372
|
+
}
|
|
373
|
+
if (value.startsWith('#')) {
|
|
374
|
+
return { className: `text-[${value}]`, skipped: false };
|
|
375
|
+
}
|
|
376
|
+
if (value.startsWith('rgb')) {
|
|
377
|
+
return { className: `text-[${value}]`, skipped: false };
|
|
378
|
+
}
|
|
379
|
+
return { className: null, skipped: true, reason: `Complex color: ${value}` };
|
|
380
|
+
}
|
|
381
|
+
convertBorderRadius(value) {
|
|
382
|
+
const px = this.extractPx(value);
|
|
383
|
+
if (px === null) {
|
|
384
|
+
// Handle named values
|
|
385
|
+
if (value === '50%') {
|
|
386
|
+
return { className: 'rounded-full', skipped: false };
|
|
387
|
+
}
|
|
388
|
+
return { className: null, skipped: true, reason: `Complex border-radius: ${value}` };
|
|
389
|
+
}
|
|
390
|
+
// Map to Tailwind radius scale
|
|
391
|
+
const radiusMap = {
|
|
392
|
+
0: 'rounded-none',
|
|
393
|
+
2: 'rounded-sm',
|
|
394
|
+
4: 'rounded',
|
|
395
|
+
6: 'rounded-md',
|
|
396
|
+
8: 'rounded-lg',
|
|
397
|
+
12: 'rounded-xl',
|
|
398
|
+
16: 'rounded-2xl',
|
|
399
|
+
24: 'rounded-3xl'
|
|
400
|
+
};
|
|
401
|
+
const closest = Object.keys(radiusMap)
|
|
402
|
+
.map(Number)
|
|
403
|
+
.reduce((prev, curr) => Math.abs(curr - px) < Math.abs(prev - px) ? curr : prev);
|
|
404
|
+
if (Math.abs(closest - px) / (px || 1) < 0.2) {
|
|
405
|
+
return { className: radiusMap[closest], skipped: false };
|
|
406
|
+
}
|
|
407
|
+
// Use arbitrary value
|
|
408
|
+
return { className: `rounded-[${value}]`, skipped: false };
|
|
409
|
+
}
|
|
410
|
+
convertMultiple(properties) {
|
|
411
|
+
const classes = [];
|
|
412
|
+
const warnings = [];
|
|
413
|
+
properties.forEach(({ property, value }) => {
|
|
414
|
+
const result = this.convertProperty(property, value);
|
|
415
|
+
if (result.skipped) {
|
|
416
|
+
warnings.push(result.reason || `Skipped: ${property}: ${value}`);
|
|
417
|
+
logger_1.logger.verbose(`Skipped: ${property}: ${value} - ${result.reason}`);
|
|
418
|
+
}
|
|
419
|
+
else if (result.className) {
|
|
420
|
+
classes.push(result.className);
|
|
421
|
+
logger_1.logger.verbose(`Converted: ${property}: ${value} → ${result.className}`);
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
return { classes, warnings };
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
exports.TailwindMapper = TailwindMapper;
|
|
428
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmRNYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFpbHdpbmRNYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXdDO0FBYXhDLE1BQWEsY0FBYztJQUl6QixZQUFZLE1BQXNCO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBRWpELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMvQyw4REFBOEQ7WUFDOUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1QyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzVDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBRUQsMkJBQTJCO1lBQzNCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFD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Q3RCLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxLQUFLLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUF5QjtRQUN2QyxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFDN0IsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBRTlCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXJELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksWUFBWSxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDakUsZUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLFFBQVEsS0FBSyxLQUFLLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDdEUsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQy9CLGVBQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxRQUFRLEtBQUssS0FBSyxNQUFNLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBNWZELHdDQTRmQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhaWx3aW5kQ29uZmlnIH0gZnJvbSAnLi91dGlscy9jb25maWcnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIENTU1Byb3BlcnR5IHtcbiAgcHJvcGVydHk6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzaW9uUmVzdWx0IHtcbiAgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBza2lwcGVkOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBUYWlsd2luZE1hcHBlciB7XG4gIHByaXZhdGUgY29uZmlnOiBUYWlsd2luZENvbmZpZztcbiAgcHJpdmF0ZSBzcGFjaW5nU2NhbGU6IE1hcDxudW1iZXIsIHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBUYWlsd2luZENvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuc3BhY2luZ1NjYWxlID0gdGhpcy5idWlsZFNwYWNpbmdTY2FsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNwYWNpbmdTY2FsZSgpOiBNYXA8bnVtYmVyLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuY29uZmlnLnRoZW1lPy5zcGFjaW5nIHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMoc3BhY2luZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAvLyBDb252ZXJ0IHJlbSB0byBwaXhlbHMgZm9yIGNvbXBhcmlzb24gKGFzc3VtaW5nIDFyZW0gPSAxNnB4KVxuICAgICAgY29uc3QgcmVtTWF0Y2ggPSB2YWx1ZS5tYXRjaCgvKFtcXGQuXSspcmVtLyk7XG4gICAgICBpZiAocmVtTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gcGFyc2VGbG9hdChyZW1NYXRjaFsxXSkgKiAxNjtcbiAgICAgICAgc2NhbGUuc2V0KE1hdGgucm91bmQocGl4ZWxzKSwga2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8gQWxzbyBoYW5kbGUgcGl4ZWwgdmFsdWVzXG4gICAgICBjb25zdCBweE1hdGNoID0gdmFsdWUubWF0Y2goLyhbXFxkLl0rKXB4Lyk7XG4gICAgICBpZiAocHhNYXRjaCkge1xuICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwYXJzZUZsb2F0KHB4TWF0Y2hbMV0pKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgcHhUb1NwYWNpbmcocHg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIFRyeSBleGFjdCBtYXRjaCBmaXJzdFxuICAgIGlmICh0aGlzLnNwYWNpbmdTY2FsZS5oYXMocHgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGFjaW5nU2NhbGUuZ2V0KHB4KSE7XG4gICAgfVxuXG4gICAgLy8gRmluZCBjbG9zZXN0IG1hdGNoXG4gICAgbGV0IGNsb3Nlc3RLZXk6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjbG9zZXN0RGlmZjogbnVtYmVyID0gSW5maW5pdHk7XG4gICAgXG4gICAgdGhpcy5zcGFjaW5nU2NhbGUuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoa2V5IC0gcHgpO1xuICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0RGlmZikge1xuICAgICAgICBjbG9zZXN0S2V5ID0ga2V5O1xuICAgICAgICBjbG9zZXN0RGlmZiA9IGRpZmY7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBPbmx5IGFjY2VwdCBpZiB3aXRoaW4gcmVhc29uYWJsZSB0b2xlcmFuY2UgKDIwJSlcbiAgICBpZiAoY2xvc2VzdEtleSAhPT0gbnVsbCAmJiBjbG9zZXN0RGlmZiAvIHB4IDwgMC4yKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGFjaW5nU2NhbGUuZ2V0KGNsb3Nlc3RLZXkpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RQeCh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgcHhNYXRjaCA9IHZhbHVlLm1hdGNoKC9eKFtcXGQuXSspcHgkLyk7XG4gICAgaWYgKHB4TWF0Y2gpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHB4TWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSByZW0gdmFsdWVzXG4gICAgY29uc3QgcmVtTWF0Y2ggPSB2YWx1ZS5tYXRjaCgvXihbXFxkLl0rKXJlbSQvKTtcbiAgICBpZiAocmVtTWF0Y2gpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHJlbU1hdGNoWzFdKSAqIDE2O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29udmVydFByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBub3JtYWxpemVkUHJvcCA9IHByb3BlcnR5LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgbG9nZ2VyLnZlcmJvc2UoYENvbnZlcnRpbmc6ICR7bm9ybWFsaXplZFByb3B9OiAke25vcm1hbGl6ZWRWYWx1ZX1gKTtcblxuICAgIC8vIERpc3BsYXkgcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2Rpc3BsYXknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RGlzcGxheShub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFBvc2l0aW9uIHByb3BlcnRpZXNcbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdwb3NpdGlvbicpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbm9ybWFsaXplZFZhbHVlLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIE1hcmdpbiBwcm9wZXJ0aWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ21hcmdpbicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0TWFyZ2luKG5vcm1hbGl6ZWRQcm9wLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFBhZGRpbmcgcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdwYWRkaW5nJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRQYWRkaW5nKG5vcm1hbGl6ZWRQcm9wLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEZvbnQgcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2ZvbnQtd2VpZ2h0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZvbnRXZWlnaHQobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdmb250LXNpemUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Rm9udFNpemUobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBUZXh0IHByb3BlcnRpZXNcbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICd0ZXh0LWFsaWduJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdGV4dC0ke25vcm1hbGl6ZWRWYWx1ZX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIEZsZXhib3ggcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdmbGV4JykgfHwgXG4gICAgICAgIG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ2p1c3RpZnknKSB8fCBcbiAgICAgICAgbm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgnYWxpZ24nKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZsZXhib3gobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gR2FwIHByb3BlcnRpZXNcbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdnYXAnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0R2FwKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gV2lkdGggYW5kIEhlaWdodFxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3dpZHRoJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFdpZHRoKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnaGVpZ2h0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlaWdodChub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIENvbG9yc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2JhY2tncm91bmQtY29sb3InKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0QmFja2dyb3VuZENvbG9yKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnY29sb3InKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VGV4dENvbG9yKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQm9yZGVyIHJhZGl1c1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2JvcmRlci1yYWRpdXMnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Qm9yZGVyUmFkaXVzKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gVW5zdXBwb3J0ZWQgcHJvcGVydGllc1xuICAgIHJldHVybiB7XG4gICAgICBjbGFzc05hbWU6IG51bGwsXG4gICAgICBza2lwcGVkOiB0cnVlLFxuICAgICAgcmVhc29uOiBgVW5zdXBwb3J0ZWQgcHJvcGVydHk6ICR7cHJvcGVydHl9YFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREaXNwbGF5KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBkaXNwbGF5TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2ZsZXgnOiAnZmxleCcsXG4gICAgICAnYmxvY2snOiAnYmxvY2snLFxuICAgICAgJ2lubGluZSc6ICdpbmxpbmUnLFxuICAgICAgJ2lubGluZS1ibG9jayc6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgJ2dyaWQnOiAnZ3JpZCcsXG4gICAgICAnbm9uZSc6ICdoaWRkZW4nLFxuICAgICAgJ2NvbnRlbnRzJzogJ2NvbnRlbnRzJyxcbiAgICAgICd0YWJsZSc6ICd0YWJsZScsXG4gICAgICAndGFibGUtY2VsbCc6ICd0YWJsZS1jZWxsJ1xuICAgIH07XG5cbiAgICBpZiAoZGlzcGxheU1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogZGlzcGxheU1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGRpc3BsYXkgdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0TWFyZ2luKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tcGl4ZWwgbWFyZ2luIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgaWYgKCFzcGFjaW5nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vIG1hdGNoaW5nIHNwYWNpbmcgZm9yOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWRlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ21hcmdpbic6ICdtJyxcbiAgICAgICdtYXJnaW4tdG9wJzogJ210JyxcbiAgICAgICdtYXJnaW4tcmlnaHQnOiAnbXInLFxuICAgICAgJ21hcmdpbi1ib3R0b20nOiAnbWInLFxuICAgICAgJ21hcmdpbi1sZWZ0JzogJ21sJyxcbiAgICAgICdtYXJnaW4teCc6ICdteCcsXG4gICAgICAnbWFyZ2luLXknOiAnbXknXG4gICAgfTtcblxuICAgIGNvbnN0IHByZWZpeCA9IHNpZGVNYXBbcHJvcF0gfHwgJ20nO1xuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFBhZGRpbmcocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vbi1waXhlbCBwYWRkaW5nIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgaWYgKCFzcGFjaW5nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vIG1hdGNoaW5nIHNwYWNpbmcgZm9yOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWRlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3BhZGRpbmcnOiAncCcsXG4gICAgICAncGFkZGluZy10b3AnOiAncHQnLFxuICAgICAgJ3BhZGRpbmctcmlnaHQnOiAncHInLFxuICAgICAgJ3BhZGRpbmctYm90dG9tJzogJ3BiJyxcbiAgICAgICdwYWRkaW5nLWxlZnQnOiAncGwnLFxuICAgICAgJ3BhZGRpbmcteCc6ICdweCcsXG4gICAgICAncGFkZGluZy15JzogJ3B5J1xuICAgIH07XG5cbiAgICBjb25zdCBwcmVmaXggPSBzaWRlTWFwW3Byb3BdIHx8ICdwJztcbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGb250V2VpZ2h0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCB3ZWlnaHRNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnMTAwJzogJ2ZvbnQtdGhpbicsXG4gICAgICAnMjAwJzogJ2ZvbnQtZXh0cmFsaWdodCcsXG4gICAgICAnMzAwJzogJ2ZvbnQtbGlnaHQnLFxuICAgICAgJzQwMCc6ICdmb250LW5vcm1hbCcsXG4gICAgICAnNTAwJzogJ2ZvbnQtbWVkaXVtJyxcbiAgICAgICc2MDAnOiAnZm9udC1zZW1pYm9sZCcsXG4gICAgICAnNzAwJzogJ2ZvbnQtYm9sZCcsXG4gICAgICAnODAwJzogJ2ZvbnQtZXh0cmFib2xkJyxcbiAgICAgICc5MDAnOiAnZm9udC1ibGFjaycsXG4gICAgICAnbm9ybWFsJzogJ2ZvbnQtbm9ybWFsJyxcbiAgICAgICdib2xkJzogJ2ZvbnQtYm9sZCdcbiAgICB9O1xuXG4gICAgaWYgKHdlaWdodE1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogd2VpZ2h0TWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gZm9udC13ZWlnaHQ6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Rm9udFNpemUodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCAhPT0gbnVsbCkge1xuICAgICAgLy8gTWFwIGNvbW1vbiBmb250IHNpemVzXG4gICAgICBjb25zdCBzaXplTWFwOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAgICAgICAxMjogJ3RleHQteHMnLFxuICAgICAgICAxNDogJ3RleHQtc20nLFxuICAgICAgICAxNjogJ3RleHQtYmFzZScsXG4gICAgICAgIDE4OiAndGV4dC1sZycsXG4gICAgICAgIDIwOiAndGV4dC14bCcsXG4gICAgICAgIDI0OiAndGV4dC0yeGwnLFxuICAgICAgICAzMDogJ3RleHQtM3hsJyxcbiAgICAgICAgMzY6ICd0ZXh0LTR4bCcsXG4gICAgICAgIDQ4OiAndGV4dC01eGwnXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjbG9zZXN0ID0gT2JqZWN0LmtleXMoc2l6ZU1hcClcbiAgICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IFxuICAgICAgICAgIE1hdGguYWJzKGN1cnIgLSBweCkgPCBNYXRoLmFicyhwcmV2IC0gcHgpID8gY3VyciA6IHByZXZcbiAgICAgICAgKTtcblxuICAgICAgaWYgKE1hdGguYWJzKGNsb3Nlc3QgLSBweCkgLyBweCA8IDAuMTUpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBzaXplTWFwW2Nsb3Nlc3RdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgTm9uLXN0YW5kYXJkIGZvbnQtc2l6ZTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGbGV4Ym94KHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIC8vIEZsZXggZGlyZWN0aW9uXG4gICAgaWYgKHByb3AgPT09ICdmbGV4LWRpcmVjdGlvbicpIHtcbiAgICAgIGNvbnN0IGRpck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3Jvdyc6ICdmbGV4LXJvdycsXG4gICAgICAgICdyb3ctcmV2ZXJzZSc6ICdmbGV4LXJvdy1yZXZlcnNlJyxcbiAgICAgICAgJ2NvbHVtbic6ICdmbGV4LWNvbCcsXG4gICAgICAgICdjb2x1bW4tcmV2ZXJzZSc6ICdmbGV4LWNvbC1yZXZlcnNlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogZGlyTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhZGlyTWFwW3ZhbHVlXSB9O1xuICAgIH1cblxuICAgIC8vIEZsZXggd3JhcFxuICAgIGlmIChwcm9wID09PSAnZmxleC13cmFwJykge1xuICAgICAgY29uc3Qgd3JhcE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3dyYXAnOiAnZmxleC13cmFwJyxcbiAgICAgICAgJ25vd3JhcCc6ICdmbGV4LW5vd3JhcCcsXG4gICAgICAgICd3cmFwLXJldmVyc2UnOiAnZmxleC13cmFwLXJldmVyc2UnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiB3cmFwTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhd3JhcE1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICAvLyBKdXN0aWZ5IGNvbnRlbnRcbiAgICBpZiAocHJvcCA9PT0gJ2p1c3RpZnktY29udGVudCcpIHtcbiAgICAgIGNvbnN0IGp1c3RpZnlNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ2p1c3RpZnktc3RhcnQnLFxuICAgICAgICAnZmxleC1lbmQnOiAnanVzdGlmeS1lbmQnLFxuICAgICAgICAnY2VudGVyJzogJ2p1c3RpZnktY2VudGVyJyxcbiAgICAgICAgJ3NwYWNlLWJldHdlZW4nOiAnanVzdGlmeS1iZXR3ZWVuJyxcbiAgICAgICAgJ3NwYWNlLWFyb3VuZCc6ICdqdXN0aWZ5LWFyb3VuZCcsXG4gICAgICAgICdzcGFjZS1ldmVubHknOiAnanVzdGlmeS1ldmVubHknXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBqdXN0aWZ5TWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhanVzdGlmeU1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICAvLyBBbGlnbiBpdGVtc1xuICAgIGlmIChwcm9wID09PSAnYWxpZ24taXRlbXMnKSB7XG4gICAgICBjb25zdCBhbGlnbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ2ZsZXgtc3RhcnQnOiAnaXRlbXMtc3RhcnQnLFxuICAgICAgICAnZmxleC1lbmQnOiAnaXRlbXMtZW5kJyxcbiAgICAgICAgJ2NlbnRlcic6ICdpdGVtcy1jZW50ZXInLFxuICAgICAgICAnYmFzZWxpbmUnOiAnaXRlbXMtYmFzZWxpbmUnLFxuICAgICAgICAnc3RyZXRjaCc6ICdpdGVtcy1zdHJldGNoJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYWxpZ25NYXBbdmFsdWVdIHx8IG51bGwsIHNraXBwZWQ6ICFhbGlnbk1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVuc3VwcG9ydGVkIGZsZXhib3ggcHJvcGVydHk6ICR7cHJvcH1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRHYXAodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tcGl4ZWwgZ2FwIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgaWYgKCFzcGFjaW5nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vIG1hdGNoaW5nIHNwYWNpbmcgZm9yOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGBnYXAtJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRXaWR0aCh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgLy8gSGFuZGxlIHBlcmNlbnRhZ2UgdmFsdWVzXG4gICAgaWYgKHZhbHVlID09PSAnMTAwJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctZnVsbCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzUwJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMS8yJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnMzMuMzMzJScgfHwgdmFsdWUgPT09ICczMy4zMyUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTEvMycsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzY2LjY2NiUnIHx8IHZhbHVlID09PSAnNjYuNjclJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0yLzMnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICcyNSUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTEvNCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzc1JScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMy80Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcGl4ZWwgdmFsdWVzXG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgICBpZiAoc3BhY2luZykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB3LSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgLy8gVHJ5IGFyYml0cmFyeSB2YWx1ZXMgZm9yIGxhcmdlciBzaXplc1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdy1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggd2lkdGggdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGVpZ2h0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICAvLyBIYW5kbGUgcGVyY2VudGFnZSB2YWx1ZXNcbiAgICBpZiAodmFsdWUgPT09ICcxMDAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC1mdWxsJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnNTAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC0xLzInLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwaXhlbCB2YWx1ZXNcbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBpZiAocHggIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICAgIGlmIChzcGFjaW5nKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGgtJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBoLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgQ29tcGxleCBoZWlnaHQgdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICAvLyBIYW5kbGUgbmFtZWQgY29sb3JzIGFuZCBoZXhcbiAgICBjb25zdCBjb2xvck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICd0cmFuc3BhcmVudCc6ICdiZy10cmFuc3BhcmVudCcsXG4gICAgICAnd2hpdGUnOiAnYmctd2hpdGUnLFxuICAgICAgJ2JsYWNrJzogJ2JnLWJsYWNrJyxcbiAgICAgICdyZWQnOiAnYmctcmVkLTUwMCcsXG4gICAgICAnYmx1ZSc6ICdiZy1ibHVlLTUwMCcsXG4gICAgICAnZ3JlZW4nOiAnYmctZ3JlZW4tNTAwJyxcbiAgICAgICdncmF5JzogJ2JnLWdyYXktNTAwJ1xuICAgIH07XG5cbiAgICBpZiAoY29sb3JNYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGNvbG9yTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaGV4IGNvbG9ycyAtIHVzZSBhcmJpdHJhcnkgdmFsdWVzXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHJnYi9yZ2JhXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBiZy1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggYmFja2dyb3VuZC1jb2xvcjogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRUZXh0Q29sb3IodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGNvbG9yTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3RyYW5zcGFyZW50JzogJ3RleHQtdHJhbnNwYXJlbnQnLFxuICAgICAgJ3doaXRlJzogJ3RleHQtd2hpdGUnLFxuICAgICAgJ2JsYWNrJzogJ3RleHQtYmxhY2snLFxuICAgICAgJ3JlZCc6ICd0ZXh0LXJlZC01MDAnLFxuICAgICAgJ2JsdWUnOiAndGV4dC1ibHVlLTUwMCcsXG4gICAgICAnZ3JlZW4nOiAndGV4dC1ncmVlbi01MDAnLFxuICAgICAgJ2dyYXknOiAndGV4dC1ncmF5LTUwMCdcbiAgICB9O1xuXG4gICAgaWYgKGNvbG9yTWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBjb2xvck1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdGV4dC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgncmdiJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGNvbG9yOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEJvcmRlclJhZGl1cyh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgXG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICAvLyBIYW5kbGUgbmFtZWQgdmFsdWVzXG4gICAgICBpZiAodmFsdWUgPT09ICc1MCUnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3JvdW5kZWQtZnVsbCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggYm9yZGVyLXJhZGl1czogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgLy8gTWFwIHRvIFRhaWx3aW5kIHJhZGl1cyBzY2FsZVxuICAgIGNvbnN0IHJhZGl1c01hcDogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgICAgIDA6ICdyb3VuZGVkLW5vbmUnLFxuICAgICAgMjogJ3JvdW5kZWQtc20nLFxuICAgICAgNDogJ3JvdW5kZWQnLFxuICAgICAgNjogJ3JvdW5kZWQtbWQnLFxuICAgICAgODogJ3JvdW5kZWQtbGcnLFxuICAgICAgMTI6ICdyb3VuZGVkLXhsJyxcbiAgICAgIDE2OiAncm91bmRlZC0yeGwnLFxuICAgICAgMjQ6ICdyb3VuZGVkLTN4bCdcbiAgICB9O1xuXG4gICAgY29uc3QgY2xvc2VzdCA9IE9iamVjdC5rZXlzKHJhZGl1c01hcClcbiAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgLnJlZHVjZSgocHJldiwgY3VycikgPT4gXG4gICAgICAgIE1hdGguYWJzKGN1cnIgLSBweCkgPCBNYXRoLmFicyhwcmV2IC0gcHgpID8gY3VyciA6IHByZXZcbiAgICAgICk7XG5cbiAgICBpZiAoTWF0aC5hYnMoY2xvc2VzdCAtIHB4KSAvIChweCB8fCAxKSA8IDAuMikge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiByYWRpdXNNYXBbY2xvc2VzdF0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIGFyYml0cmFyeSB2YWx1ZVxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHJvdW5kZWQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBjb252ZXJ0TXVsdGlwbGUocHJvcGVydGllczogQ1NTUHJvcGVydHlbXSk6IHsgY2xhc3Nlczogc3RyaW5nW107IHdhcm5pbmdzOiBzdHJpbmdbXSB9IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKCh7IHByb3BlcnR5LCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnZlcnRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0LnNraXBwZWQpIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChyZXN1bHQucmVhc29uIHx8IGBTa2lwcGVkOiAke3Byb3BlcnR5fTogJHt2YWx1ZX1gKTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFNraXBwZWQ6ICR7cHJvcGVydHl9OiAke3ZhbHVlfSAtICR7cmVzdWx0LnJlYXNvbn1gKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmNsYXNzTmFtZSkge1xuICAgICAgICBjbGFzc2VzLnB1c2gocmVzdWx0LmNsYXNzTmFtZSk7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBDb252ZXJ0ZWQ6ICR7cHJvcGVydHl9OiAke3ZhbHVlfSDihpIgJHtyZXN1bHQuY2xhc3NOYW1lfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ScannedFile } from './scanner';
|
|
2
|
+
import { TailwindConfig } from './utils/config';
|
|
3
|
+
export interface TransformOptions {
|
|
4
|
+
dryRun: boolean;
|
|
5
|
+
deleteCss: boolean;
|
|
6
|
+
skipExternal: boolean;
|
|
7
|
+
skipInline: boolean;
|
|
8
|
+
skipInternal: boolean;
|
|
9
|
+
tailwindConfig: TailwindConfig | null;
|
|
10
|
+
projectRoot: string;
|
|
11
|
+
}
|
|
12
|
+
export interface TransformResults {
|
|
13
|
+
filesScanned: number;
|
|
14
|
+
filesModified: number;
|
|
15
|
+
stylesConverted: number;
|
|
16
|
+
classesReplaced: number;
|
|
17
|
+
warnings: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function transformFiles(files: ScannedFile[], options: TransformOptions): Promise<TransformResults>;
|