@bnsights/bbsf-utilities 1.0.31 → 1.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +3 -0
  2. package/bnsights-bbsf-utilities-1.0.33.tgz +0 -0
  3. package/bnsights-bbsf-utilities.metadata.json +1 -1
  4. package/bundles/bnsights-bbsf-utilities.umd.js +3384 -4
  5. package/bundles/bnsights-bbsf-utilities.umd.js.map +1 -1
  6. package/esm2015/lib/shared/config/word/constants.js +105 -0
  7. package/esm2015/lib/shared/config/word/docx-document.js +351 -0
  8. package/esm2015/lib/shared/config/word/helpers/index.js +4 -0
  9. package/esm2015/lib/shared/config/word/helpers/render-document-file.js +278 -0
  10. package/esm2015/lib/shared/config/word/helpers/xml-builder.js +1765 -0
  11. package/esm2015/lib/shared/config/word/html-to-docx.js +195 -0
  12. package/esm2015/lib/shared/config/word/index.js +55 -0
  13. package/esm2015/lib/shared/config/word/namespaces.js +37 -0
  14. package/esm2015/lib/shared/config/word/schemas/content-types.js +26 -0
  15. package/esm2015/lib/shared/config/word/schemas/core.js +29 -0
  16. package/esm2015/lib/shared/config/word/schemas/document-rels.js +16 -0
  17. package/esm2015/lib/shared/config/word/schemas/document.template.js +109 -0
  18. package/esm2015/lib/shared/config/word/schemas/font-table.js +40 -0
  19. package/esm2015/lib/shared/config/word/schemas/generic-rels.js +11 -0
  20. package/esm2015/lib/shared/config/word/schemas/index.js +13 -0
  21. package/esm2015/lib/shared/config/word/schemas/numbering.js +19 -0
  22. package/esm2015/lib/shared/config/word/schemas/rels.js +11 -0
  23. package/esm2015/lib/shared/config/word/schemas/settings.js +13 -0
  24. package/esm2015/lib/shared/config/word/schemas/styles.js +149 -0
  25. package/esm2015/lib/shared/config/word/schemas/theme.js +200 -0
  26. package/esm2015/lib/shared/config/word/schemas/web-settings.js +9 -0
  27. package/esm2015/lib/shared/config/word/utils/color-conversion.js +60 -0
  28. package/esm2015/lib/shared/config/word/utils/list.js +51 -0
  29. package/esm2015/lib/shared/config/word/utils/unit-conversion.js +30 -0
  30. package/esm2015/lib/shared/config/word/utils/url.js +9 -0
  31. package/esm2015/lib/shared/config/word/utils/vnode.js +3 -0
  32. package/esm2015/lib/shared/config/word/word-work/templates/documentTemplate.js +54 -0
  33. package/esm2015/lib/shared/config/word/word-work/templates/index.js +4 -0
  34. package/esm2015/lib/shared/config/word/word-work/templates/mhtDocumentTemplate.js +22 -0
  35. package/esm2015/lib/shared/config/word/word-work/templates/mhtPartTemplate.js +10 -0
  36. package/esm2015/lib/shared/config/word/word-work/utils.js +26 -0
  37. package/esm2015/lib/shared/models/WordDocumentModel.js +8 -0
  38. package/esm2015/lib/shared/services/word-document.service.js +39 -0
  39. package/esm2015/public-api.js +3 -1
  40. package/fesm2015/bnsights-bbsf-utilities.js +3630 -2
  41. package/fesm2015/bnsights-bbsf-utilities.js.map +1 -1
  42. package/lib/shared/config/word/constants.d.ts +124 -0
  43. package/lib/shared/config/word/docx-document.d.ts +73 -0
  44. package/lib/shared/config/word/helpers/index.d.ts +1 -0
  45. package/lib/shared/config/word/helpers/render-document-file.d.ts +4 -0
  46. package/lib/shared/config/word/helpers/xml-builder.d.ts +14 -0
  47. package/lib/shared/config/word/html-to-docx.d.ts +1 -0
  48. package/lib/shared/config/word/index.d.ts +1 -0
  49. package/lib/shared/config/word/namespaces.d.ts +36 -0
  50. package/lib/shared/config/word/schemas/content-types.d.ts +1 -0
  51. package/lib/shared/config/word/schemas/core.d.ts +1 -0
  52. package/lib/shared/config/word/schemas/document-rels.d.ts +1 -0
  53. package/lib/shared/config/word/schemas/document.template.d.ts +4 -0
  54. package/lib/shared/config/word/schemas/font-table.d.ts +1 -0
  55. package/lib/shared/config/word/schemas/generic-rels.d.ts +1 -0
  56. package/lib/shared/config/word/schemas/index.d.ts +12 -0
  57. package/lib/shared/config/word/schemas/numbering.d.ts +1 -0
  58. package/lib/shared/config/word/schemas/rels.d.ts +1 -0
  59. package/lib/shared/config/word/schemas/settings.d.ts +1 -0
  60. package/lib/shared/config/word/schemas/styles.d.ts +1 -0
  61. package/lib/shared/config/word/schemas/theme.d.ts +1 -0
  62. package/lib/shared/config/word/schemas/web-settings.d.ts +1 -0
  63. package/lib/shared/config/word/utils/color-conversion.d.ts +7 -0
  64. package/lib/shared/config/word/utils/list.d.ts +6 -0
  65. package/lib/shared/config/word/utils/unit-conversion.d.ts +29 -0
  66. package/lib/shared/config/word/utils/url.d.ts +1 -0
  67. package/lib/shared/config/word/utils/vnode.d.ts +1 -0
  68. package/lib/shared/config/word/word-work/templates/documentTemplate.d.ts +12 -0
  69. package/lib/shared/config/word/word-work/templates/index.d.ts +3 -0
  70. package/lib/shared/config/word/word-work/templates/mhtDocumentTemplate.d.ts +1 -0
  71. package/lib/shared/config/word/word-work/templates/mhtPartTemplate.d.ts +1 -0
  72. package/lib/shared/config/word/word-work/utils.d.ts +1 -0
  73. package/lib/shared/models/WordDocumentModel.d.ts +16 -0
  74. package/lib/shared/services/word-document.service.d.ts +5 -0
  75. package/package.json +1 -1
  76. package/public-api.d.ts +2 -0
  77. package/bnsights-bbsf-utilities-1.0.31.tgz +0 -0
@@ -0,0 +1,1765 @@
1
+ import { __awaiter, __rest } from "tslib";
2
+ /* eslint-disable no-await-in-loop */
3
+ /* eslint-disable radix */
4
+ /* eslint-disable no-param-reassign */
5
+ /* eslint-disable no-case-declarations */
6
+ /* eslint-disable no-plusplus */
7
+ /* eslint-disable no-else-return */
8
+ import { fragment } from 'xmlbuilder2';
9
+ import isVNode from 'virtual-dom/vnode/is-vnode';
10
+ import isVText from 'virtual-dom/vnode/is-vtext';
11
+ import colorNames from 'color-name';
12
+ import { cloneDeep } from 'lodash';
13
+ import imageToBase64 from 'image-to-base64';
14
+ import mimeTypes from 'mime-types';
15
+ import sizeOf from 'image-size';
16
+ import namespaces from '../namespaces';
17
+ import { rgbToHex, hslToHex, hslRegex, rgbRegex, hexRegex, hex3Regex, hex3ToHex, } from '../utils/color-conversion';
18
+ import { pixelToEMU, pixelRegex, TWIPToEMU, percentageRegex, pointRegex, pointToHIP, HIPToTWIP, pointToTWIP, pixelToHIP, pixelToTWIP, pixelToEIP, pointToEIP, cmToTWIP, cmRegex, inchRegex, inchToTWIP, } from '../utils/unit-conversion';
19
+ // FIXME: remove the cyclic dependency
20
+ // eslint-disable-next-line import/no-cycle
21
+ import { buildImage, buildList } from './render-document-file';
22
+ import { defaultFont, hyperlinkType, paragraphBordersObject, colorlessColors, verticalAlignValues, imageType, internalRelationship, } from '../constants';
23
+ import { vNodeHasChildren } from '../utils/vnode';
24
+ import { isValidUrl } from '../utils/url';
25
+ // eslint-disable-next-line consistent-return
26
+ const fixupColorCode = (colorCodeString) => {
27
+ if (Object.prototype.hasOwnProperty.call(colorNames, colorCodeString.toLowerCase())) {
28
+ const [red, green, blue] = colorNames[colorCodeString.toLowerCase()];
29
+ return rgbToHex(red, green, blue);
30
+ }
31
+ else if (rgbRegex.test(colorCodeString)) {
32
+ const matchedParts = colorCodeString.match(rgbRegex);
33
+ const red = matchedParts[1];
34
+ const green = matchedParts[2];
35
+ const blue = matchedParts[3];
36
+ return rgbToHex(red, green, blue);
37
+ }
38
+ else if (hslRegex.test(colorCodeString)) {
39
+ const matchedParts = colorCodeString.match(hslRegex);
40
+ const hue = matchedParts[1];
41
+ const saturation = matchedParts[2];
42
+ const luminosity = matchedParts[3];
43
+ return hslToHex(hue, saturation, luminosity);
44
+ }
45
+ else if (hexRegex.test(colorCodeString)) {
46
+ const matchedParts = colorCodeString.match(hexRegex);
47
+ return matchedParts[1];
48
+ }
49
+ else if (hex3Regex.test(colorCodeString)) {
50
+ const matchedParts = colorCodeString.match(hex3Regex);
51
+ const red = matchedParts[1];
52
+ const green = matchedParts[2];
53
+ const blue = matchedParts[3];
54
+ return hex3ToHex(red, green, blue);
55
+ }
56
+ else {
57
+ return '000000';
58
+ }
59
+ };
60
+ const ɵ0 = fixupColorCode;
61
+ const buildRunFontFragment = (fontName = defaultFont) => fragment({ namespaceAlias: { w: namespaces.w } })
62
+ .ele('@w', 'rFonts')
63
+ .att('@w', 'ascii', fontName)
64
+ .att('@w', 'hAnsi', fontName)
65
+ .up();
66
+ const ɵ1 = buildRunFontFragment;
67
+ const buildRunStyleFragment = (type = 'Hyperlink') => fragment({ namespaceAlias: { w: namespaces.w } })
68
+ .ele('@w', 'rStyle')
69
+ .att('@w', 'val', type)
70
+ .up();
71
+ const ɵ2 = buildRunStyleFragment;
72
+ const buildTableRowHeight = (tableRowHeight) => fragment({ namespaceAlias: { w: namespaces.w } })
73
+ .ele('@w', 'trHeight')
74
+ .att('@w', 'val', tableRowHeight)
75
+ .att('@w', 'hRule', 'atLeast')
76
+ .up();
77
+ const ɵ3 = buildTableRowHeight;
78
+ const buildVerticalAlignment = (verticalAlignment) => {
79
+ if (verticalAlignment.toLowerCase() === 'middle') {
80
+ verticalAlignment = 'center';
81
+ }
82
+ return fragment({ namespaceAlias: { w: namespaces.w } })
83
+ .ele('@w', 'vAlign')
84
+ .att('@w', 'val', verticalAlignment)
85
+ .up();
86
+ };
87
+ const ɵ4 = buildVerticalAlignment;
88
+ const buildVerticalMerge = (verticalMerge = 'continue') => fragment({ namespaceAlias: { w: namespaces.w } })
89
+ .ele('@w', 'vMerge')
90
+ .att('@w', 'val', verticalMerge)
91
+ .up();
92
+ const ɵ5 = buildVerticalMerge;
93
+ const buildColor = (colorCode) => fragment({ namespaceAlias: { w: namespaces.w } })
94
+ .ele('@w', 'color')
95
+ .att('@w', 'val', colorCode)
96
+ .up();
97
+ const ɵ6 = buildColor;
98
+ const buildFontSize = (fontSize) => fragment({ namespaceAlias: { w: namespaces.w } })
99
+ .ele('@w', 'sz')
100
+ .att('@w', 'val', fontSize)
101
+ .up();
102
+ const ɵ7 = buildFontSize;
103
+ const buildShading = (colorCode) => fragment({ namespaceAlias: { w: namespaces.w } })
104
+ .ele('@w', 'shd')
105
+ .att('@w', 'val', 'clear')
106
+ .att('@w', 'fill', colorCode)
107
+ .up();
108
+ const ɵ8 = buildShading;
109
+ const buildHighlight = (color = 'yellow') => fragment({ namespaceAlias: { w: namespaces.w } })
110
+ .ele('@w', 'highlight')
111
+ .att('@w', 'val', color)
112
+ .up();
113
+ const ɵ9 = buildHighlight;
114
+ const buildVertAlign = (type = 'baseline') => fragment({ namespaceAlias: { w: namespaces.w } })
115
+ .ele('@w', 'vertAlign')
116
+ .att('@w', 'val', type)
117
+ .up();
118
+ const ɵ10 = buildVertAlign;
119
+ const buildStrike = () => fragment({ namespaceAlias: { w: namespaces.w } })
120
+ .ele('@w', 'strike')
121
+ .att('@w', 'val', true)
122
+ .up();
123
+ const ɵ11 = buildStrike;
124
+ const buildBold = () => fragment({ namespaceAlias: { w: namespaces.w } })
125
+ .ele('@w', 'b')
126
+ .up();
127
+ const ɵ12 = buildBold;
128
+ const buildItalics = () => fragment({ namespaceAlias: { w: namespaces.w } })
129
+ .ele('@w', 'i')
130
+ .up();
131
+ const ɵ13 = buildItalics;
132
+ const buildUnderline = (type = 'single') => fragment({ namespaceAlias: { w: namespaces.w } })
133
+ .ele('@w', 'u')
134
+ .att('@w', 'val', type)
135
+ .up();
136
+ const ɵ14 = buildUnderline;
137
+ const buildLineBreak = (type = 'textWrapping') => fragment({ namespaceAlias: { w: namespaces.w } })
138
+ .ele('@w', 'br')
139
+ .att('@w', 'type', type)
140
+ .up();
141
+ const ɵ15 = buildLineBreak;
142
+ const buildBorder = (borderSide = 'top', borderSize = 0, borderSpacing = 0, borderColor = fixupColorCode('black'), borderStroke = 'single') => fragment({ namespaceAlias: { w: namespaces.w } })
143
+ .ele('@w', borderSide)
144
+ .att('@w', 'val', borderStroke)
145
+ .att('@w', 'sz', borderSize)
146
+ .att('@w', 'space', borderSpacing)
147
+ .att('@w', 'color', borderColor)
148
+ .up();
149
+ const ɵ16 = buildBorder;
150
+ const buildTextElement = (text) => fragment({ namespaceAlias: { w: namespaces.w } })
151
+ .ele('@w', 't')
152
+ .att('@xml', 'space', 'preserve')
153
+ .txt(text)
154
+ .up();
155
+ const ɵ17 = buildTextElement;
156
+ // eslint-disable-next-line consistent-return
157
+ const fixupLineHeight = (lineHeight, fontSize) => {
158
+ // FIXME: If line height is anything other than a number
159
+ // eslint-disable-next-line no-restricted-globals
160
+ if (!isNaN(lineHeight)) {
161
+ if (fontSize) {
162
+ const actualLineHeight = +lineHeight * fontSize;
163
+ return HIPToTWIP(actualLineHeight);
164
+ }
165
+ else {
166
+ // 240 TWIP or 12 point is default line height
167
+ return +lineHeight * 240;
168
+ }
169
+ }
170
+ else {
171
+ // 240 TWIP or 12 point is default line height
172
+ return 240;
173
+ }
174
+ };
175
+ const ɵ18 = fixupLineHeight;
176
+ // eslint-disable-next-line consistent-return
177
+ const fixupFontSize = (fontSizeString) => {
178
+ if (pointRegex.test(fontSizeString)) {
179
+ const matchedParts = fontSizeString.match(pointRegex);
180
+ // convert point to half point
181
+ return pointToHIP(matchedParts[1]);
182
+ }
183
+ else if (pixelRegex.test(fontSizeString)) {
184
+ const matchedParts = fontSizeString.match(pixelRegex);
185
+ // convert pixels to half point
186
+ return pixelToHIP(matchedParts[1]);
187
+ }
188
+ };
189
+ const ɵ19 = fixupFontSize;
190
+ // eslint-disable-next-line consistent-return
191
+ const fixupRowHeight = (rowHeightString) => {
192
+ if (pointRegex.test(rowHeightString)) {
193
+ const matchedParts = rowHeightString.match(pointRegex);
194
+ // convert point to half point
195
+ return pointToTWIP(matchedParts[1]);
196
+ }
197
+ else if (pixelRegex.test(rowHeightString)) {
198
+ const matchedParts = rowHeightString.match(pixelRegex);
199
+ // convert pixels to half point
200
+ return pixelToTWIP(matchedParts[1]);
201
+ }
202
+ else if (cmRegex.test(rowHeightString)) {
203
+ const matchedParts = rowHeightString.match(cmRegex);
204
+ return cmToTWIP(matchedParts[1]);
205
+ }
206
+ else if (inchRegex.test(rowHeightString)) {
207
+ const matchedParts = rowHeightString.match(inchRegex);
208
+ return inchToTWIP(matchedParts[1]);
209
+ }
210
+ };
211
+ const ɵ20 = fixupRowHeight;
212
+ // eslint-disable-next-line consistent-return
213
+ const fixupColumnWidth = (columnWidthString) => {
214
+ if (pointRegex.test(columnWidthString)) {
215
+ const matchedParts = columnWidthString.match(pointRegex);
216
+ return pointToTWIP(matchedParts[1]);
217
+ }
218
+ else if (pixelRegex.test(columnWidthString)) {
219
+ const matchedParts = columnWidthString.match(pixelRegex);
220
+ return pixelToTWIP(matchedParts[1]);
221
+ }
222
+ else if (cmRegex.test(columnWidthString)) {
223
+ const matchedParts = columnWidthString.match(cmRegex);
224
+ return cmToTWIP(matchedParts[1]);
225
+ }
226
+ else if (inchRegex.test(columnWidthString)) {
227
+ const matchedParts = columnWidthString.match(inchRegex);
228
+ return inchToTWIP(matchedParts[1]);
229
+ }
230
+ };
231
+ const ɵ21 = fixupColumnWidth;
232
+ // eslint-disable-next-line consistent-return
233
+ const fixupMargin = (marginString) => {
234
+ if (pointRegex.test(marginString)) {
235
+ const matchedParts = marginString.match(pointRegex);
236
+ // convert point to half point
237
+ return pointToTWIP(matchedParts[1]);
238
+ }
239
+ else if (pixelRegex.test(marginString)) {
240
+ const matchedParts = marginString.match(pixelRegex);
241
+ // convert pixels to half point
242
+ return pixelToTWIP(matchedParts[1]);
243
+ }
244
+ };
245
+ const ɵ22 = fixupMargin;
246
+ const modifiedStyleAttributesBuilder = (vNode, attributes, options) => {
247
+ const modifiedAttributes = Object.assign({}, attributes);
248
+ // styles
249
+ if (isVNode(vNode) && vNode.properties && vNode.properties.style) {
250
+ if (vNode.properties.style.color && !colorlessColors.includes(vNode.properties.style.color)) {
251
+ modifiedAttributes.color = fixupColorCode(vNode.properties.style.color);
252
+ }
253
+ if (vNode.properties.style['background-color'] &&
254
+ !colorlessColors.includes(vNode.properties.style['background-color'])) {
255
+ modifiedAttributes.backgroundColor = fixupColorCode(vNode.properties.style['background-color']);
256
+ }
257
+ if (vNode.properties.style['vertical-align'] &&
258
+ verticalAlignValues.includes(vNode.properties.style['vertical-align'])) {
259
+ modifiedAttributes.verticalAlign = vNode.properties.style['vertical-align'];
260
+ }
261
+ if (vNode.properties.style['text-align'] &&
262
+ ['left', 'right', 'center', 'justify'].includes(vNode.properties.style['text-align'])) {
263
+ modifiedAttributes.textAlign = vNode.properties.style['text-align'];
264
+ }
265
+ // FIXME: remove bold check when other font weights are handled.
266
+ if (vNode.properties.style['font-weight'] && vNode.properties.style['font-weight'] === 'bold') {
267
+ modifiedAttributes.strong = vNode.properties.style['font-weight'];
268
+ }
269
+ if (vNode.properties.style['font-size']) {
270
+ modifiedAttributes.fontSize = fixupFontSize(vNode.properties.style['font-size']);
271
+ }
272
+ if (vNode.properties.style['line-height']) {
273
+ modifiedAttributes.lineHeight = fixupLineHeight(vNode.properties.style['line-height'], vNode.properties.style['font-size']
274
+ ? fixupFontSize(vNode.properties.style['font-size'])
275
+ : null);
276
+ }
277
+ if (vNode.properties.style['margin-left'] || vNode.properties.style['margin-right']) {
278
+ const leftMargin = fixupMargin(vNode.properties.style['margin-left']);
279
+ const rightMargin = fixupMargin(vNode.properties.style['margin-right']);
280
+ const indentation = {};
281
+ if (leftMargin) {
282
+ indentation.left = leftMargin;
283
+ }
284
+ if (rightMargin) {
285
+ indentation.right = rightMargin;
286
+ }
287
+ if (leftMargin || rightMargin) {
288
+ modifiedAttributes.indentation = indentation;
289
+ }
290
+ }
291
+ if (vNode.properties.style.display) {
292
+ modifiedAttributes.display = vNode.properties.style.display;
293
+ }
294
+ if (vNode.properties.style.width) {
295
+ modifiedAttributes.width = vNode.properties.style.width;
296
+ }
297
+ }
298
+ // paragraph only
299
+ if (options && options.isParagraph) {
300
+ if (isVNode(vNode) && vNode.tagName === 'blockquote') {
301
+ modifiedAttributes.indentation = { left: 284 };
302
+ modifiedAttributes.textAlign = 'justify';
303
+ }
304
+ else if (isVNode(vNode) && vNode.tagName === 'code') {
305
+ modifiedAttributes.highlightColor = 'lightGray';
306
+ }
307
+ else if (isVNode(vNode) && vNode.tagName === 'pre') {
308
+ modifiedAttributes.font = 'Courier';
309
+ }
310
+ }
311
+ return modifiedAttributes;
312
+ };
313
+ const ɵ23 = modifiedStyleAttributesBuilder;
314
+ // html tag to formatting function
315
+ // options are passed to the formatting function if needed
316
+ const buildFormatting = (htmlTag, options) => {
317
+ switch (htmlTag) {
318
+ case 'strong':
319
+ case 'b':
320
+ return buildBold();
321
+ case 'em':
322
+ case 'i':
323
+ return buildItalics();
324
+ case 'ins':
325
+ case 'u':
326
+ return buildUnderline();
327
+ case 'strike':
328
+ case 'del':
329
+ case 's':
330
+ return buildStrike();
331
+ case 'sub':
332
+ return buildVertAlign('subscript');
333
+ case 'sup':
334
+ return buildVertAlign('superscript');
335
+ case 'mark':
336
+ return buildHighlight();
337
+ case 'code':
338
+ return buildHighlight('lightGray');
339
+ case 'highlightColor':
340
+ return buildHighlight(options && options.color ? options.color : 'lightGray');
341
+ case 'font':
342
+ case 'pre':
343
+ return buildRunFontFragment('Courier');
344
+ case 'color':
345
+ return buildColor(options && options.color ? options.color : 'black');
346
+ case 'backgroundColor':
347
+ return buildShading(options && options.color ? options.color : 'black');
348
+ case 'fontSize':
349
+ // does this need a unit of measure?
350
+ return buildFontSize(options && options.fontSize ? options.fontSize : 10);
351
+ case 'hyperlink':
352
+ return buildRunStyleFragment('Hyperlink');
353
+ }
354
+ return null;
355
+ };
356
+ const ɵ24 = buildFormatting;
357
+ const buildRunProperties = (attributes) => {
358
+ const runPropertiesFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'rPr');
359
+ if (attributes && attributes.constructor === Object) {
360
+ Object.keys(attributes).forEach((key) => {
361
+ const options = {};
362
+ if (key === 'color' || key === 'backgroundColor' || key === 'highlightColor') {
363
+ options.color = attributes[key];
364
+ }
365
+ if (key === 'fontSize') {
366
+ options.fontSize = attributes[key];
367
+ }
368
+ const formattingFragment = buildFormatting(key, options);
369
+ if (formattingFragment) {
370
+ runPropertiesFragment.import(formattingFragment);
371
+ }
372
+ });
373
+ }
374
+ runPropertiesFragment.up();
375
+ return runPropertiesFragment;
376
+ };
377
+ const ɵ25 = buildRunProperties;
378
+ const buildRun = (vNode, attributes, docxDocumentInstance) => __awaiter(void 0, void 0, void 0, function* () {
379
+ const runFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'r');
380
+ const runPropertiesFragment = buildRunProperties(cloneDeep(attributes));
381
+ // case where we have recursive spans representing font changes
382
+ if (isVNode(vNode) && vNode.tagName === 'span') {
383
+ // eslint-disable-next-line no-use-before-define
384
+ return buildRunOrRuns(vNode, attributes, docxDocumentInstance);
385
+ }
386
+ if (isVNode(vNode) &&
387
+ [
388
+ 'strong',
389
+ 'b',
390
+ 'em',
391
+ 'i',
392
+ 'u',
393
+ 'ins',
394
+ 'strike',
395
+ 'del',
396
+ 's',
397
+ 'sub',
398
+ 'sup',
399
+ 'mark',
400
+ 'blockquote',
401
+ 'code',
402
+ 'pre',
403
+ ].includes(vNode.tagName)) {
404
+ const runFragmentsArray = [];
405
+ let vNodes = [vNode];
406
+ // create temp run fragments to split the paragraph into different runs
407
+ let tempAttributes = cloneDeep(attributes);
408
+ let tempRunFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'r');
409
+ while (vNodes.length) {
410
+ const tempVNode = vNodes.shift();
411
+ if (isVText(tempVNode)) {
412
+ const textFragment = buildTextElement(tempVNode.text);
413
+ const tempRunPropertiesFragment = buildRunProperties(Object.assign(Object.assign({}, attributes), tempAttributes));
414
+ tempRunFragment.import(tempRunPropertiesFragment);
415
+ tempRunFragment.import(textFragment);
416
+ runFragmentsArray.push(tempRunFragment);
417
+ // re initialize temp run fragments with new fragment
418
+ tempAttributes = cloneDeep(attributes);
419
+ tempRunFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'r');
420
+ }
421
+ else if (isVNode(tempVNode)) {
422
+ if ([
423
+ 'strong',
424
+ 'b',
425
+ 'em',
426
+ 'i',
427
+ 'u',
428
+ 'ins',
429
+ 'strike',
430
+ 'del',
431
+ 's',
432
+ 'sub',
433
+ 'sup',
434
+ 'mark',
435
+ 'code',
436
+ 'pre',
437
+ ].includes(tempVNode.tagName)) {
438
+ tempAttributes = {};
439
+ switch (tempVNode.tagName) {
440
+ case 'strong':
441
+ case 'b':
442
+ tempAttributes.strong = true;
443
+ break;
444
+ case 'i':
445
+ tempAttributes.i = true;
446
+ break;
447
+ case 'u':
448
+ tempAttributes.u = true;
449
+ break;
450
+ case 'sub':
451
+ tempAttributes.sub = true;
452
+ break;
453
+ case 'sup':
454
+ tempAttributes.sup = true;
455
+ break;
456
+ }
457
+ const formattingFragment = buildFormatting(tempVNode);
458
+ if (formattingFragment) {
459
+ runPropertiesFragment.import(formattingFragment);
460
+ }
461
+ // go a layer deeper if there is a span somewhere in the children
462
+ }
463
+ else if (tempVNode.tagName === 'span') {
464
+ // eslint-disable-next-line no-use-before-define
465
+ const spanFragment = yield buildRunOrRuns(tempVNode, Object.assign(Object.assign({}, attributes), tempAttributes), docxDocumentInstance);
466
+ // if spanFragment is an array, we need to add each fragment to the runFragmentsArray. If the fragment is an array, perform a depth first search on the array to add each fragment to the runFragmentsArray
467
+ if (Array.isArray(spanFragment)) {
468
+ spanFragment.flat(Infinity);
469
+ runFragmentsArray.push(...spanFragment);
470
+ }
471
+ else {
472
+ runFragmentsArray.push(spanFragment);
473
+ }
474
+ // do not slice and concat children since this is already accounted for in the buildRunOrRuns function
475
+ // eslint-disable-next-line no-continue
476
+ continue;
477
+ }
478
+ }
479
+ if (tempVNode.children && tempVNode.children.length) {
480
+ if (tempVNode.children.length > 1) {
481
+ attributes = Object.assign(Object.assign({}, attributes), tempAttributes);
482
+ }
483
+ vNodes = tempVNode.children.slice().concat(vNodes);
484
+ }
485
+ }
486
+ if (runFragmentsArray.length) {
487
+ return runFragmentsArray;
488
+ }
489
+ }
490
+ runFragment.import(runPropertiesFragment);
491
+ if (isVText(vNode)) {
492
+ const textFragment = buildTextElement(vNode.text);
493
+ runFragment.import(textFragment);
494
+ }
495
+ else if (attributes && attributes.type === 'picture') {
496
+ let response = null;
497
+ const base64Uri = decodeURIComponent(vNode.properties.src);
498
+ if (base64Uri) {
499
+ response = docxDocumentInstance.createMediaFile(base64Uri);
500
+ }
501
+ if (response) {
502
+ docxDocumentInstance.zip
503
+ .folder('word')
504
+ .folder('media')
505
+ .file(response.fileNameWithExtension, Buffer.from(response.fileContent, 'base64'), {
506
+ createFolders: false,
507
+ });
508
+ const documentRelsId = docxDocumentInstance.createDocumentRelationships(docxDocumentInstance.relationshipFilename, imageType, `media/${response.fileNameWithExtension}`, internalRelationship);
509
+ attributes.inlineOrAnchored = true;
510
+ attributes.relationshipId = documentRelsId;
511
+ attributes.id = response.id;
512
+ attributes.fileContent = response.fileContent;
513
+ attributes.fileNameWithExtension = response.fileNameWithExtension;
514
+ }
515
+ const { type, inlineOrAnchored } = attributes, otherAttributes = __rest(attributes, ["type", "inlineOrAnchored"]);
516
+ // eslint-disable-next-line no-use-before-define
517
+ const imageFragment = buildDrawing(inlineOrAnchored, type, otherAttributes);
518
+ runFragment.import(imageFragment);
519
+ }
520
+ else if (isVNode(vNode) && vNode.tagName === 'br') {
521
+ const lineBreakFragment = buildLineBreak();
522
+ runFragment.import(lineBreakFragment);
523
+ }
524
+ runFragment.up();
525
+ return runFragment;
526
+ });
527
+ const ɵ26 = buildRun;
528
+ const buildRunOrRuns = (vNode, attributes, docxDocumentInstance) => __awaiter(void 0, void 0, void 0, function* () {
529
+ if (isVNode(vNode) && vNode.tagName === 'span') {
530
+ let runFragments = [];
531
+ for (let index = 0; index < vNode.children.length; index++) {
532
+ const childVNode = vNode.children[index];
533
+ const modifiedAttributes = modifiedStyleAttributesBuilder(vNode, attributes);
534
+ const tempRunFragments = yield buildRun(childVNode, modifiedAttributes, docxDocumentInstance);
535
+ runFragments = runFragments.concat(Array.isArray(tempRunFragments) ? tempRunFragments : [tempRunFragments]);
536
+ }
537
+ return runFragments;
538
+ }
539
+ else {
540
+ const tempRunFragments = yield buildRun(vNode, attributes, docxDocumentInstance);
541
+ return tempRunFragments;
542
+ }
543
+ });
544
+ const ɵ27 = buildRunOrRuns;
545
+ const buildRunOrHyperLink = (vNode, attributes, docxDocumentInstance) => __awaiter(void 0, void 0, void 0, function* () {
546
+ if (isVNode(vNode) && vNode.tagName === 'a') {
547
+ const relationshipId = docxDocumentInstance.createDocumentRelationships(docxDocumentInstance.relationshipFilename, hyperlinkType, vNode.properties && vNode.properties.href ? vNode.properties.href : '');
548
+ const hyperlinkFragment = fragment({ namespaceAlias: { w: namespaces.w, r: namespaces.r } })
549
+ .ele('@w', 'hyperlink')
550
+ .att('@r', 'id', `rId${relationshipId}`);
551
+ const modifiedAttributes = Object.assign({}, attributes);
552
+ modifiedAttributes.hyperlink = true;
553
+ const runFragments = yield buildRunOrRuns(vNode.children[0], modifiedAttributes, docxDocumentInstance);
554
+ if (Array.isArray(runFragments)) {
555
+ for (let index = 0; index < runFragments.length; index++) {
556
+ const runFragment = runFragments[index];
557
+ hyperlinkFragment.import(runFragment);
558
+ }
559
+ }
560
+ else {
561
+ hyperlinkFragment.import(runFragments);
562
+ }
563
+ hyperlinkFragment.up();
564
+ return hyperlinkFragment;
565
+ }
566
+ const runFragments = yield buildRunOrRuns(vNode, attributes, docxDocumentInstance);
567
+ return runFragments;
568
+ });
569
+ const ɵ28 = buildRunOrHyperLink;
570
+ const buildNumberingProperties = (levelId, numberingId) => fragment({ namespaceAlias: { w: namespaces.w } })
571
+ .ele('@w', 'numPr')
572
+ .ele('@w', 'ilvl')
573
+ .att('@w', 'val', String(levelId))
574
+ .up()
575
+ .ele('@w', 'numId')
576
+ .att('@w', 'val', String(numberingId))
577
+ .up()
578
+ .up();
579
+ const ɵ29 = buildNumberingProperties;
580
+ const buildNumberingInstances = () => fragment({ namespaceAlias: { w: namespaces.w } })
581
+ .ele('@w', 'num')
582
+ .ele('@w', 'abstractNumId')
583
+ .up()
584
+ .up();
585
+ const ɵ30 = buildNumberingInstances;
586
+ const buildSpacing = (lineSpacing, beforeSpacing, afterSpacing) => {
587
+ const spacingFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'spacing');
588
+ if (lineSpacing) {
589
+ spacingFragment.att('@w', 'line', lineSpacing);
590
+ }
591
+ if (beforeSpacing) {
592
+ spacingFragment.att('@w', 'before', beforeSpacing);
593
+ }
594
+ if (afterSpacing) {
595
+ spacingFragment.att('@w', 'after', afterSpacing);
596
+ }
597
+ spacingFragment.att('@w', 'lineRule', 'auto').up();
598
+ return spacingFragment;
599
+ };
600
+ const ɵ31 = buildSpacing;
601
+ const buildIndentation = ({ left, right }) => {
602
+ const indentationFragment = fragment({
603
+ namespaceAlias: { w: namespaces.w },
604
+ }).ele('@w', 'ind');
605
+ if (left) {
606
+ indentationFragment.att('@w', 'left', left);
607
+ }
608
+ if (right) {
609
+ indentationFragment.att('@w', 'right', right);
610
+ }
611
+ indentationFragment.up();
612
+ return indentationFragment;
613
+ };
614
+ const ɵ32 = buildIndentation;
615
+ const buildPStyle = (style = 'Normal') => fragment({ namespaceAlias: { w: namespaces.w } })
616
+ .ele('@w', 'pStyle')
617
+ .att('@w', 'val', style)
618
+ .up();
619
+ const ɵ33 = buildPStyle;
620
+ const buildHorizontalAlignment = (horizontalAlignment) => {
621
+ if (horizontalAlignment === 'justify') {
622
+ horizontalAlignment = 'both';
623
+ }
624
+ return fragment({ namespaceAlias: { w: namespaces.w } })
625
+ .ele('@w', 'jc')
626
+ .att('@w', 'val', horizontalAlignment)
627
+ .up();
628
+ };
629
+ const ɵ34 = buildHorizontalAlignment;
630
+ const buildParagraphBorder = () => {
631
+ const paragraphBorderFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'pBdr');
632
+ const bordersObject = cloneDeep(paragraphBordersObject);
633
+ Object.keys(bordersObject).forEach((borderName) => {
634
+ if (bordersObject[borderName]) {
635
+ const { size, spacing, color } = bordersObject[borderName];
636
+ const borderFragment = buildBorder(borderName, size, spacing, color);
637
+ paragraphBorderFragment.import(borderFragment);
638
+ }
639
+ });
640
+ paragraphBorderFragment.up();
641
+ return paragraphBorderFragment;
642
+ };
643
+ const ɵ35 = buildParagraphBorder;
644
+ const buildParagraphProperties = (attributes) => {
645
+ const paragraphPropertiesFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'pPr');
646
+ if (attributes && attributes.constructor === Object) {
647
+ Object.keys(attributes).forEach((key) => {
648
+ switch (key) {
649
+ case 'numbering':
650
+ const { levelId, numberingId } = attributes[key];
651
+ const numberingPropertiesFragment = buildNumberingProperties(levelId, numberingId);
652
+ paragraphPropertiesFragment.import(numberingPropertiesFragment);
653
+ // eslint-disable-next-line no-param-reassign
654
+ delete attributes.numbering;
655
+ break;
656
+ case 'textAlign':
657
+ const horizontalAlignmentFragment = buildHorizontalAlignment(attributes[key]);
658
+ paragraphPropertiesFragment.import(horizontalAlignmentFragment);
659
+ // eslint-disable-next-line no-param-reassign
660
+ delete attributes.textAlign;
661
+ break;
662
+ case 'backgroundColor':
663
+ // Add shading to Paragraph Properties only if display is block
664
+ // Essentially if background color needs to be across the row
665
+ if (attributes.display === 'block') {
666
+ const shadingFragment = buildShading(attributes[key]);
667
+ paragraphPropertiesFragment.import(shadingFragment);
668
+ // FIXME: Inner padding in case of shaded paragraphs.
669
+ const paragraphBorderFragment = buildParagraphBorder();
670
+ paragraphPropertiesFragment.import(paragraphBorderFragment);
671
+ // eslint-disable-next-line no-param-reassign
672
+ delete attributes.backgroundColor;
673
+ }
674
+ break;
675
+ case 'paragraphStyle':
676
+ const pStyleFragment = buildPStyle(attributes.paragraphStyle);
677
+ paragraphPropertiesFragment.import(pStyleFragment);
678
+ delete attributes.paragraphStyle;
679
+ break;
680
+ case 'indentation':
681
+ const indentationFragment = buildIndentation(attributes[key]);
682
+ paragraphPropertiesFragment.import(indentationFragment);
683
+ // eslint-disable-next-line no-param-reassign
684
+ delete attributes.indentation;
685
+ break;
686
+ }
687
+ });
688
+ const spacingFragment = buildSpacing(attributes.lineHeight, attributes.beforeSpacing, attributes.afterSpacing);
689
+ // eslint-disable-next-line no-param-reassign
690
+ delete attributes.lineHeight;
691
+ // eslint-disable-next-line no-param-reassign
692
+ delete attributes.beforeSpacing;
693
+ // eslint-disable-next-line no-param-reassign
694
+ delete attributes.afterSpacing;
695
+ paragraphPropertiesFragment.import(spacingFragment);
696
+ }
697
+ paragraphPropertiesFragment.up();
698
+ return paragraphPropertiesFragment;
699
+ };
700
+ const ɵ36 = buildParagraphProperties;
701
+ const computeImageDimensions = (vNode, attributes) => {
702
+ const { maximumWidth, originalWidth, originalHeight } = attributes;
703
+ const aspectRatio = originalWidth / originalHeight;
704
+ const maximumWidthInEMU = TWIPToEMU(maximumWidth);
705
+ let originalWidthInEMU = pixelToEMU(originalWidth);
706
+ let originalHeightInEMU = pixelToEMU(originalHeight);
707
+ if (originalWidthInEMU > maximumWidthInEMU) {
708
+ originalWidthInEMU = maximumWidthInEMU;
709
+ originalHeightInEMU = Math.round(originalWidthInEMU / aspectRatio);
710
+ }
711
+ let modifiedHeight;
712
+ let modifiedWidth;
713
+ if (vNode.properties && vNode.properties.style) {
714
+ if (vNode.properties.style.width) {
715
+ if (vNode.properties.style.width !== 'auto') {
716
+ if (pixelRegex.test(vNode.properties.style.width)) {
717
+ modifiedWidth = pixelToEMU(vNode.properties.style.width.match(pixelRegex)[1]);
718
+ }
719
+ else if (percentageRegex.test(vNode.properties.style.width)) {
720
+ const percentageValue = vNode.properties.style.width.match(percentageRegex)[1];
721
+ modifiedWidth = Math.round((percentageValue / 100) * originalWidthInEMU);
722
+ }
723
+ }
724
+ else {
725
+ // eslint-disable-next-line no-lonely-if
726
+ if (vNode.properties.style.height && vNode.properties.style.height === 'auto') {
727
+ modifiedWidth = originalWidthInEMU;
728
+ modifiedHeight = originalHeightInEMU;
729
+ }
730
+ }
731
+ }
732
+ if (vNode.properties.style.height) {
733
+ if (vNode.properties.style.height !== 'auto') {
734
+ if (pixelRegex.test(vNode.properties.style.height)) {
735
+ modifiedHeight = pixelToEMU(vNode.properties.style.height.match(pixelRegex)[1]);
736
+ }
737
+ else if (percentageRegex.test(vNode.properties.style.height)) {
738
+ const percentageValue = vNode.properties.style.width.match(percentageRegex)[1];
739
+ modifiedHeight = Math.round((percentageValue / 100) * originalHeightInEMU);
740
+ if (!modifiedWidth) {
741
+ modifiedWidth = Math.round(modifiedHeight * aspectRatio);
742
+ }
743
+ }
744
+ }
745
+ else {
746
+ // eslint-disable-next-line no-lonely-if
747
+ if (modifiedWidth) {
748
+ if (!modifiedHeight) {
749
+ modifiedHeight = Math.round(modifiedWidth / aspectRatio);
750
+ }
751
+ }
752
+ else {
753
+ modifiedHeight = originalHeightInEMU;
754
+ modifiedWidth = originalWidthInEMU;
755
+ }
756
+ }
757
+ }
758
+ if (modifiedWidth && !modifiedHeight) {
759
+ modifiedHeight = Math.round(modifiedWidth / aspectRatio);
760
+ }
761
+ else if (modifiedHeight && !modifiedWidth) {
762
+ modifiedWidth = Math.round(modifiedHeight * aspectRatio);
763
+ }
764
+ }
765
+ else {
766
+ modifiedWidth = originalWidthInEMU;
767
+ modifiedHeight = originalHeightInEMU;
768
+ }
769
+ // eslint-disable-next-line no-param-reassign
770
+ attributes.width = modifiedWidth;
771
+ // eslint-disable-next-line no-param-reassign
772
+ attributes.height = modifiedHeight;
773
+ };
774
+ const ɵ37 = computeImageDimensions;
775
+ const buildParagraph = (vNode, attributes, docxDocumentInstance) => __awaiter(void 0, void 0, void 0, function* () {
776
+ const paragraphFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'p');
777
+ const modifiedAttributes = modifiedStyleAttributesBuilder(vNode, attributes, {
778
+ isParagraph: true,
779
+ });
780
+ const paragraphPropertiesFragment = buildParagraphProperties(modifiedAttributes);
781
+ paragraphFragment.import(paragraphPropertiesFragment);
782
+ if (isVNode(vNode) && vNodeHasChildren(vNode)) {
783
+ if ([
784
+ 'span',
785
+ 'strong',
786
+ 'b',
787
+ 'em',
788
+ 'i',
789
+ 'u',
790
+ 'ins',
791
+ 'strike',
792
+ 'del',
793
+ 's',
794
+ 'sub',
795
+ 'sup',
796
+ 'mark',
797
+ 'a',
798
+ 'code',
799
+ 'pre',
800
+ ].includes(vNode.tagName)) {
801
+ const runOrHyperlinkFragments = yield buildRunOrHyperLink(vNode, modifiedAttributes, docxDocumentInstance);
802
+ if (Array.isArray(runOrHyperlinkFragments)) {
803
+ for (let iteratorIndex = 0; iteratorIndex < runOrHyperlinkFragments.length; iteratorIndex++) {
804
+ const runOrHyperlinkFragment = runOrHyperlinkFragments[iteratorIndex];
805
+ paragraphFragment.import(runOrHyperlinkFragment);
806
+ }
807
+ }
808
+ else {
809
+ paragraphFragment.import(runOrHyperlinkFragments);
810
+ }
811
+ }
812
+ else if (vNode.tagName === 'blockquote') {
813
+ const runFragmentOrFragments = yield buildRun(vNode, attributes);
814
+ if (Array.isArray(runFragmentOrFragments)) {
815
+ for (let index = 0; index < runFragmentOrFragments.length; index++) {
816
+ paragraphFragment.import(runFragmentOrFragments[index]);
817
+ }
818
+ }
819
+ else {
820
+ paragraphFragment.import(runFragmentOrFragments);
821
+ }
822
+ }
823
+ else {
824
+ for (let index = 0; index < vNode.children.length; index++) {
825
+ const childVNode = vNode.children[index];
826
+ if (childVNode.tagName === 'img') {
827
+ let base64String;
828
+ const imageSource = childVNode.properties.src;
829
+ if (isValidUrl(imageSource)) {
830
+ base64String = yield imageToBase64(imageSource).catch((error) => {
831
+ // eslint-disable-next-line no-console
832
+ console.warning(`skipping image download and conversion due to ${error}`);
833
+ });
834
+ if (base64String && mimeTypes.lookup(imageSource)) {
835
+ childVNode.properties.src = `data:${mimeTypes.lookup(imageSource)};base64, ${base64String}`;
836
+ }
837
+ else {
838
+ break;
839
+ }
840
+ }
841
+ else {
842
+ // eslint-disable-next-line no-useless-escape, prefer-destructuring
843
+ base64String = imageSource.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/)[2];
844
+ }
845
+ const imageBuffer = Buffer.from(decodeURIComponent(base64String), 'base64');
846
+ const imageProperties = sizeOf(imageBuffer);
847
+ modifiedAttributes.maximumWidth =
848
+ modifiedAttributes.maximumWidth || docxDocumentInstance.availableDocumentSpace;
849
+ modifiedAttributes.originalWidth = imageProperties.width;
850
+ modifiedAttributes.originalHeight = imageProperties.height;
851
+ computeImageDimensions(childVNode, modifiedAttributes);
852
+ }
853
+ const runOrHyperlinkFragments = yield buildRunOrHyperLink(childVNode, isVNode(childVNode) && childVNode.tagName === 'img'
854
+ ? Object.assign(Object.assign({}, modifiedAttributes), { type: 'picture' }) : modifiedAttributes, docxDocumentInstance);
855
+ if (Array.isArray(runOrHyperlinkFragments)) {
856
+ for (let iteratorIndex = 0; iteratorIndex < runOrHyperlinkFragments.length; iteratorIndex++) {
857
+ const runOrHyperlinkFragment = runOrHyperlinkFragments[iteratorIndex];
858
+ paragraphFragment.import(runOrHyperlinkFragment);
859
+ }
860
+ }
861
+ else {
862
+ paragraphFragment.import(runOrHyperlinkFragments);
863
+ }
864
+ }
865
+ }
866
+ }
867
+ else {
868
+ // In case paragraphs has to be rendered where vText is present. Eg. table-cell
869
+ // Or in case the vNode is something like img
870
+ if (isVNode(vNode) && vNode.tagName === 'img') {
871
+ const imageSource = vNode.properties.src;
872
+ let base64String = imageSource;
873
+ if (isValidUrl(imageSource)) {
874
+ base64String = yield imageToBase64(imageSource).catch((error) => {
875
+ // eslint-disable-next-line no-console
876
+ console.warning(`skipping image download and conversion due to ${error}`);
877
+ });
878
+ if (base64String && mimeTypes.lookup(imageSource)) {
879
+ vNode.properties.src = `data:${mimeTypes.lookup(imageSource)};base64, ${base64String}`;
880
+ }
881
+ else {
882
+ paragraphFragment.up();
883
+ return paragraphFragment;
884
+ }
885
+ }
886
+ else {
887
+ // eslint-disable-next-line no-useless-escape, prefer-destructuring
888
+ base64String = base64String.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/)[2];
889
+ }
890
+ const imageBuffer = Buffer.from(decodeURIComponent(base64String), 'base64');
891
+ const imageProperties = sizeOf(imageBuffer);
892
+ modifiedAttributes.maximumWidth =
893
+ modifiedAttributes.maximumWidth || docxDocumentInstance.availableDocumentSpace;
894
+ modifiedAttributes.originalWidth = imageProperties.width;
895
+ modifiedAttributes.originalHeight = imageProperties.height;
896
+ computeImageDimensions(vNode, modifiedAttributes);
897
+ }
898
+ const runFragments = yield buildRunOrRuns(vNode, modifiedAttributes, docxDocumentInstance);
899
+ if (Array.isArray(runFragments)) {
900
+ for (let index = 0; index < runFragments.length; index++) {
901
+ const runFragment = runFragments[index];
902
+ paragraphFragment.import(runFragment);
903
+ }
904
+ }
905
+ else {
906
+ paragraphFragment.import(runFragments);
907
+ }
908
+ }
909
+ paragraphFragment.up();
910
+ return paragraphFragment;
911
+ });
912
+ const ɵ38 = buildParagraph;
913
+ const buildGridSpanFragment = (spanValue) => fragment({ namespaceAlias: { w: namespaces.w } })
914
+ .ele('@w', 'gridSpan')
915
+ .att('@w', 'val', spanValue)
916
+ .up();
917
+ const ɵ39 = buildGridSpanFragment;
918
+ const buildTableCellSpacing = (cellSpacing = 0) => fragment({ namespaceAlias: { w: namespaces.w } })
919
+ .ele('@w', 'tblCellSpacing')
920
+ .att('@w', 'w', cellSpacing)
921
+ .att('@w', 'type', 'dxa')
922
+ .up();
923
+ const ɵ40 = buildTableCellSpacing;
924
+ const buildTableCellBorders = (tableCellBorder) => {
925
+ const tableCellBordersFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tcBorders');
926
+ const { color, stroke } = tableCellBorder, borders = __rest(tableCellBorder, ["color", "stroke"]);
927
+ Object.keys(borders).forEach((border) => {
928
+ if (tableCellBorder[border]) {
929
+ const borderFragment = buildBorder(border, tableCellBorder[border], 0, color, stroke);
930
+ tableCellBordersFragment.import(borderFragment);
931
+ }
932
+ });
933
+ tableCellBordersFragment.up();
934
+ return tableCellBordersFragment;
935
+ };
936
+ const ɵ41 = buildTableCellBorders;
937
+ const buildTableCellWidth = (tableCellWidth) => fragment({ namespaceAlias: { w: namespaces.w } })
938
+ .ele('@w', 'tcW')
939
+ .att('@w', 'w', fixupColumnWidth(tableCellWidth))
940
+ .att('@w', 'type', 'dxa')
941
+ .up();
942
+ const ɵ42 = buildTableCellWidth;
943
+ const buildTableCellProperties = (attributes) => {
944
+ const tableCellPropertiesFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tcPr');
945
+ if (attributes && attributes.constructor === Object) {
946
+ Object.keys(attributes).forEach((key) => {
947
+ switch (key) {
948
+ case 'backgroundColor':
949
+ const shadingFragment = buildShading(attributes[key]);
950
+ tableCellPropertiesFragment.import(shadingFragment);
951
+ // eslint-disable-next-line no-param-reassign
952
+ delete attributes.backgroundColor;
953
+ break;
954
+ case 'verticalAlign':
955
+ const verticalAlignmentFragment = buildVerticalAlignment(attributes[key]);
956
+ tableCellPropertiesFragment.import(verticalAlignmentFragment);
957
+ // eslint-disable-next-line no-param-reassign
958
+ delete attributes.verticalAlign;
959
+ break;
960
+ case 'colSpan':
961
+ const gridSpanFragment = buildGridSpanFragment(attributes[key]);
962
+ tableCellPropertiesFragment.import(gridSpanFragment);
963
+ // eslint-disable-next-line no-param-reassign
964
+ delete attributes.colSpan;
965
+ break;
966
+ case 'tableCellBorder':
967
+ const tableCellBorderFragment = buildTableCellBorders(attributes[key]);
968
+ tableCellPropertiesFragment.import(tableCellBorderFragment);
969
+ // eslint-disable-next-line no-param-reassign
970
+ delete attributes.tableCellBorder;
971
+ break;
972
+ case 'rowSpan':
973
+ const verticalMergeFragment = buildVerticalMerge(attributes[key]);
974
+ tableCellPropertiesFragment.import(verticalMergeFragment);
975
+ delete attributes.rowSpan;
976
+ break;
977
+ case 'width':
978
+ const widthFragment = buildTableCellWidth(attributes[key]);
979
+ tableCellPropertiesFragment.import(widthFragment);
980
+ delete attributes.width;
981
+ break;
982
+ }
983
+ });
984
+ }
985
+ tableCellPropertiesFragment.up();
986
+ return tableCellPropertiesFragment;
987
+ };
988
+ const ɵ43 = buildTableCellProperties;
989
+ const fixupTableCellBorder = (vNode, attributes) => {
990
+ if (Object.prototype.hasOwnProperty.call(vNode.properties.style, 'border')) {
991
+ if (vNode.properties.style.border === 'none' || vNode.properties.style.border === 0) {
992
+ attributes.tableCellBorder = {};
993
+ }
994
+ else {
995
+ // eslint-disable-next-line no-use-before-define
996
+ const [borderSize, borderStroke, borderColor] = cssBorderParser(vNode.properties.style.border);
997
+ attributes.tableCellBorder = {
998
+ top: borderSize,
999
+ left: borderSize,
1000
+ bottom: borderSize,
1001
+ right: borderSize,
1002
+ color: borderColor,
1003
+ stroke: borderStroke,
1004
+ };
1005
+ }
1006
+ }
1007
+ if (vNode.properties.style['border-top'] && vNode.properties.style['border-top'] === '0') {
1008
+ attributes.tableCellBorder = Object.assign(Object.assign({}, attributes.tableCellBorder), { top: 0 });
1009
+ }
1010
+ else if (vNode.properties.style['border-top'] && vNode.properties.style['border-top'] !== '0') {
1011
+ // eslint-disable-next-line no-use-before-define
1012
+ const [borderSize, borderStroke, borderColor] = cssBorderParser(vNode.properties.style['border-top']);
1013
+ attributes.tableCellBorder = Object.assign(Object.assign({}, attributes.tableCellBorder), { top: borderSize, color: borderColor, stroke: borderStroke });
1014
+ }
1015
+ if (vNode.properties.style['border-left'] && vNode.properties.style['border-left'] === '0') {
1016
+ attributes.tableCellBorder = Object.assign(Object.assign({}, attributes.tableCellBorder), { left: 0 });
1017
+ }
1018
+ else if (vNode.properties.style['border-left'] &&
1019
+ vNode.properties.style['border-left'] !== '0') {
1020
+ // eslint-disable-next-line no-use-before-define
1021
+ const [borderSize, borderStroke, borderColor] = cssBorderParser(vNode.properties.style['border-left']);
1022
+ attributes.tableCellBorder = Object.assign(Object.assign({}, attributes.tableCellBorder), { left: borderSize, color: borderColor, stroke: borderStroke });
1023
+ }
1024
+ if (vNode.properties.style['border-bottom'] && vNode.properties.style['border-bottom'] === '0') {
1025
+ attributes.tableCellBorder = Object.assign(Object.assign({}, attributes.tableCellBorder), { bottom: 0 });
1026
+ }
1027
+ else if (vNode.properties.style['border-bottom'] &&
1028
+ vNode.properties.style['border-bottom'] !== '0') {
1029
+ // eslint-disable-next-line no-use-before-define
1030
+ const [borderSize, borderStroke, borderColor] = cssBorderParser(vNode.properties.style['border-bottom']);
1031
+ attributes.tableCellBorder = Object.assign(Object.assign({}, attributes.tableCellBorder), { bottom: borderSize, color: borderColor, stroke: borderStroke });
1032
+ }
1033
+ if (vNode.properties.style['border-right'] && vNode.properties.style['border-right'] === '0') {
1034
+ attributes.tableCellBorder = Object.assign(Object.assign({}, attributes.tableCellBorder), { right: 0 });
1035
+ }
1036
+ else if (vNode.properties.style['border-right'] &&
1037
+ vNode.properties.style['border-right'] !== '0') {
1038
+ // eslint-disable-next-line no-use-before-define
1039
+ const [borderSize, borderStroke, borderColor] = cssBorderParser(vNode.properties.style['border-right']);
1040
+ attributes.tableCellBorder = Object.assign(Object.assign({}, attributes.tableCellBorder), { right: borderSize, color: borderColor, stroke: borderStroke });
1041
+ }
1042
+ };
1043
+ const ɵ44 = fixupTableCellBorder;
1044
+ const buildTableCell = (vNode, attributes, rowSpanMap, columnIndex, docxDocumentInstance) => __awaiter(void 0, void 0, void 0, function* () {
1045
+ const tableCellFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tc');
1046
+ let modifiedAttributes = Object.assign({}, attributes);
1047
+ if (isVNode(vNode) && vNode.properties) {
1048
+ if (vNode.properties.rowSpan) {
1049
+ rowSpanMap.set(columnIndex.index, { rowSpan: vNode.properties.rowSpan - 1, colSpan: 0 });
1050
+ modifiedAttributes.rowSpan = 'restart';
1051
+ }
1052
+ else {
1053
+ const previousSpanObject = rowSpanMap.get(columnIndex.index);
1054
+ rowSpanMap.set(columnIndex.index,
1055
+ // eslint-disable-next-line prefer-object-spread
1056
+ Object.assign({}, previousSpanObject, {
1057
+ rowSpan: 0,
1058
+ colSpan: (previousSpanObject && previousSpanObject.colSpan) || 0,
1059
+ }));
1060
+ }
1061
+ if (vNode.properties.colSpan ||
1062
+ (vNode.properties.style && vNode.properties.style['column-span'])) {
1063
+ modifiedAttributes.colSpan =
1064
+ vNode.properties.colSpan ||
1065
+ (vNode.properties.style && vNode.properties.style['column-span']);
1066
+ const previousSpanObject = rowSpanMap.get(columnIndex.index);
1067
+ rowSpanMap.set(columnIndex.index,
1068
+ // eslint-disable-next-line prefer-object-spread
1069
+ Object.assign({}, previousSpanObject, {
1070
+ colSpan: parseInt(modifiedAttributes.colSpan) || 0,
1071
+ }));
1072
+ columnIndex.index += parseInt(modifiedAttributes.colSpan) - 1;
1073
+ }
1074
+ if (vNode.properties.style) {
1075
+ modifiedAttributes = Object.assign(Object.assign({}, modifiedAttributes), modifiedStyleAttributesBuilder(vNode, attributes));
1076
+ fixupTableCellBorder(vNode, modifiedAttributes);
1077
+ }
1078
+ }
1079
+ const tableCellPropertiesFragment = buildTableCellProperties(modifiedAttributes);
1080
+ tableCellFragment.import(tableCellPropertiesFragment);
1081
+ if (vNodeHasChildren(vNode)) {
1082
+ for (let index = 0; index < vNode.children.length; index++) {
1083
+ const childVNode = vNode.children[index];
1084
+ if (isVNode(childVNode) && childVNode.tagName === 'img') {
1085
+ const imageFragment = yield buildImage(docxDocumentInstance, childVNode, modifiedAttributes.maximumWidth);
1086
+ if (imageFragment) {
1087
+ tableCellFragment.import(imageFragment);
1088
+ }
1089
+ }
1090
+ else if (isVNode(childVNode) && childVNode.tagName === 'figure') {
1091
+ if (vNodeHasChildren(childVNode)) {
1092
+ // eslint-disable-next-line no-plusplus
1093
+ for (let iteratorIndex = 0; iteratorIndex < childVNode.children.length; iteratorIndex++) {
1094
+ const grandChildVNode = childVNode.children[iteratorIndex];
1095
+ if (grandChildVNode.tagName === 'img') {
1096
+ const imageFragment = yield buildImage(docxDocumentInstance, grandChildVNode, modifiedAttributes.maximumWidth);
1097
+ if (imageFragment) {
1098
+ tableCellFragment.import(imageFragment);
1099
+ }
1100
+ }
1101
+ }
1102
+ }
1103
+ }
1104
+ else if (isVNode(childVNode) && ['ul', 'ol'].includes(childVNode.tagName)) {
1105
+ // render list in table
1106
+ if (vNodeHasChildren(childVNode)) {
1107
+ yield buildList(childVNode, docxDocumentInstance, tableCellFragment);
1108
+ }
1109
+ }
1110
+ else {
1111
+ const paragraphFragment = yield buildParagraph(childVNode, modifiedAttributes, docxDocumentInstance);
1112
+ tableCellFragment.import(paragraphFragment);
1113
+ }
1114
+ }
1115
+ }
1116
+ else {
1117
+ // TODO: Figure out why building with buildParagraph() isn't working
1118
+ const paragraphFragment = fragment({ namespaceAlias: { w: namespaces.w } })
1119
+ .ele('@w', 'p')
1120
+ .up();
1121
+ tableCellFragment.import(paragraphFragment);
1122
+ }
1123
+ tableCellFragment.up();
1124
+ return tableCellFragment;
1125
+ });
1126
+ const ɵ45 = buildTableCell;
1127
+ const buildRowSpanCell = (rowSpanMap, columnIndex, attributes) => {
1128
+ const rowSpanCellFragments = [];
1129
+ let spanObject = rowSpanMap.get(columnIndex.index);
1130
+ while (spanObject && spanObject.rowSpan) {
1131
+ const rowSpanCellFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tc');
1132
+ const tableCellPropertiesFragment = buildTableCellProperties(Object.assign(Object.assign({}, attributes), { rowSpan: 'continue', colSpan: spanObject.colSpan ? spanObject.colSpan : 0 }));
1133
+ rowSpanCellFragment.import(tableCellPropertiesFragment);
1134
+ const paragraphFragment = fragment({ namespaceAlias: { w: namespaces.w } })
1135
+ .ele('@w', 'p')
1136
+ .up();
1137
+ rowSpanCellFragment.import(paragraphFragment);
1138
+ rowSpanCellFragment.up();
1139
+ rowSpanCellFragments.push(rowSpanCellFragment);
1140
+ if (spanObject.rowSpan - 1 === 0) {
1141
+ rowSpanMap.delete(columnIndex.index);
1142
+ }
1143
+ else {
1144
+ rowSpanMap.set(columnIndex.index, {
1145
+ rowSpan: spanObject.rowSpan - 1,
1146
+ colSpan: spanObject.colSpan || 0,
1147
+ });
1148
+ }
1149
+ columnIndex.index += spanObject.colSpan || 1;
1150
+ spanObject = rowSpanMap.get(columnIndex.index);
1151
+ }
1152
+ return rowSpanCellFragments;
1153
+ };
1154
+ const ɵ46 = buildRowSpanCell;
1155
+ const buildTableRowProperties = (attributes) => {
1156
+ const tableRowPropertiesFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'trPr');
1157
+ if (attributes && attributes.constructor === Object) {
1158
+ Object.keys(attributes).forEach((key) => {
1159
+ switch (key) {
1160
+ case 'tableRowHeight':
1161
+ const tableRowHeightFragment = buildTableRowHeight(attributes[key]);
1162
+ tableRowPropertiesFragment.import(tableRowHeightFragment);
1163
+ // eslint-disable-next-line no-param-reassign
1164
+ delete attributes.tableRowHeight;
1165
+ break;
1166
+ case 'rowCantSplit':
1167
+ if (attributes.rowCantSplit) {
1168
+ const cantSplitFragment = fragment({ namespaceAlias: { w: namespaces.w } })
1169
+ .ele('@w', 'cantSplit')
1170
+ .up();
1171
+ tableRowPropertiesFragment.import(cantSplitFragment);
1172
+ // eslint-disable-next-line no-param-reassign
1173
+ delete attributes.rowCantSplit;
1174
+ }
1175
+ break;
1176
+ }
1177
+ });
1178
+ }
1179
+ tableRowPropertiesFragment.up();
1180
+ return tableRowPropertiesFragment;
1181
+ };
1182
+ const ɵ47 = buildTableRowProperties;
1183
+ const buildTableRow = (vNode, attributes, rowSpanMap, docxDocumentInstance) => __awaiter(void 0, void 0, void 0, function* () {
1184
+ const tableRowFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tr');
1185
+ const modifiedAttributes = Object.assign({}, attributes);
1186
+ if (isVNode(vNode) && vNode.properties) {
1187
+ // FIXME: find a better way to get row height from cell style
1188
+ if ((vNode.properties.style && vNode.properties.style.height) ||
1189
+ (vNode.children[0] &&
1190
+ isVNode(vNode.children[0]) &&
1191
+ vNode.children[0].properties.style &&
1192
+ vNode.children[0].properties.style.height)) {
1193
+ modifiedAttributes.tableRowHeight = fixupRowHeight((vNode.properties.style && vNode.properties.style.height) ||
1194
+ (vNode.children[0] &&
1195
+ isVNode(vNode.children[0]) &&
1196
+ vNode.children[0].properties.style &&
1197
+ vNode.children[0].properties.style.height
1198
+ ? vNode.children[0].properties.style.height
1199
+ : undefined));
1200
+ }
1201
+ if (vNode.properties.style) {
1202
+ fixupTableCellBorder(vNode, modifiedAttributes);
1203
+ }
1204
+ }
1205
+ const tableRowPropertiesFragment = buildTableRowProperties(modifiedAttributes);
1206
+ tableRowFragment.import(tableRowPropertiesFragment);
1207
+ const columnIndex = { index: 0 };
1208
+ if (vNodeHasChildren(vNode)) {
1209
+ const tableColumns = vNode.children.filter((childVNode) => ['td', 'th'].includes(childVNode.tagName));
1210
+ const maximumColumnWidth = docxDocumentInstance.availableDocumentSpace / tableColumns.length;
1211
+ // eslint-disable-next-line no-restricted-syntax
1212
+ for (const column of tableColumns) {
1213
+ const rowSpanCellFragments = buildRowSpanCell(rowSpanMap, columnIndex, modifiedAttributes);
1214
+ if (Array.isArray(rowSpanCellFragments)) {
1215
+ for (let iteratorIndex = 0; iteratorIndex < rowSpanCellFragments.length; iteratorIndex++) {
1216
+ const rowSpanCellFragment = rowSpanCellFragments[iteratorIndex];
1217
+ tableRowFragment.import(rowSpanCellFragment);
1218
+ }
1219
+ }
1220
+ const tableCellFragment = yield buildTableCell(column, Object.assign(Object.assign({}, modifiedAttributes), { maximumWidth: maximumColumnWidth }), rowSpanMap, columnIndex, docxDocumentInstance);
1221
+ columnIndex.index++;
1222
+ tableRowFragment.import(tableCellFragment);
1223
+ }
1224
+ }
1225
+ if (columnIndex.index < rowSpanMap.size) {
1226
+ const rowSpanCellFragments = buildRowSpanCell(rowSpanMap, columnIndex, modifiedAttributes);
1227
+ if (Array.isArray(rowSpanCellFragments)) {
1228
+ for (let iteratorIndex = 0; iteratorIndex < rowSpanCellFragments.length; iteratorIndex++) {
1229
+ const rowSpanCellFragment = rowSpanCellFragments[iteratorIndex];
1230
+ tableRowFragment.import(rowSpanCellFragment);
1231
+ }
1232
+ }
1233
+ }
1234
+ tableRowFragment.up();
1235
+ return tableRowFragment;
1236
+ });
1237
+ const ɵ48 = buildTableRow;
1238
+ const buildTableGridCol = (gridWidth) => fragment({ namespaceAlias: { w: namespaces.w } })
1239
+ .ele('@w', 'gridCol')
1240
+ .att('@w', 'w', String(gridWidth));
1241
+ const ɵ49 = buildTableGridCol;
1242
+ const buildTableGrid = (vNode, attributes) => {
1243
+ const tableGridFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tblGrid');
1244
+ if (vNodeHasChildren(vNode)) {
1245
+ const gridColumns = vNode.children.filter((childVNode) => childVNode.tagName === 'col');
1246
+ const gridWidth = attributes.maximumWidth / gridColumns.length;
1247
+ for (let index = 0; index < gridColumns.length; index++) {
1248
+ const tableGridColFragment = buildTableGridCol(gridWidth);
1249
+ tableGridFragment.import(tableGridColFragment);
1250
+ }
1251
+ }
1252
+ tableGridFragment.up();
1253
+ return tableGridFragment;
1254
+ };
1255
+ const ɵ50 = buildTableGrid;
1256
+ const buildTableGridFromTableRow = (vNode, attributes) => {
1257
+ const tableGridFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tblGrid');
1258
+ if (vNodeHasChildren(vNode)) {
1259
+ const numberOfGridColumns = vNode.children.reduce((accumulator, childVNode) => {
1260
+ const colSpan = childVNode.properties.colSpan ||
1261
+ (childVNode.properties.style && childVNode.properties.style['column-span']);
1262
+ return accumulator + (colSpan ? parseInt(colSpan) : 1);
1263
+ }, 0);
1264
+ const gridWidth = attributes.maximumWidth / numberOfGridColumns;
1265
+ for (let index = 0; index < numberOfGridColumns; index++) {
1266
+ const tableGridColFragment = buildTableGridCol(gridWidth);
1267
+ tableGridFragment.import(tableGridColFragment);
1268
+ }
1269
+ }
1270
+ tableGridFragment.up();
1271
+ return tableGridFragment;
1272
+ };
1273
+ const ɵ51 = buildTableGridFromTableRow;
1274
+ const buildTableBorders = (tableBorder) => {
1275
+ const tableBordersFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tblBorders');
1276
+ const { color, stroke } = tableBorder, borders = __rest(tableBorder, ["color", "stroke"]);
1277
+ Object.keys(borders).forEach((border) => {
1278
+ if (borders[border]) {
1279
+ const borderFragment = buildBorder(border, borders[border], 0, color, stroke);
1280
+ tableBordersFragment.import(borderFragment);
1281
+ }
1282
+ });
1283
+ tableBordersFragment.up();
1284
+ return tableBordersFragment;
1285
+ };
1286
+ const ɵ52 = buildTableBorders;
1287
+ const buildTableWidth = (tableWidth) => fragment({ namespaceAlias: { w: namespaces.w } })
1288
+ .ele('@w', 'tblW')
1289
+ .att('@w', 'type', 'dxa')
1290
+ .att('@w', 'w', String(tableWidth))
1291
+ .up();
1292
+ const ɵ53 = buildTableWidth;
1293
+ const buildCellMargin = (side, margin) => fragment({ namespaceAlias: { w: namespaces.w } })
1294
+ .ele('@w', side)
1295
+ .att('@w', 'type', 'dxa')
1296
+ .att('@w', 'w', String(margin))
1297
+ .up();
1298
+ const ɵ54 = buildCellMargin;
1299
+ const buildTableCellMargins = (margin) => {
1300
+ const tableCellMarFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tblCellMar');
1301
+ ['top', 'bottom'].forEach((side) => {
1302
+ const marginFragment = buildCellMargin(side, margin / 2);
1303
+ tableCellMarFragment.import(marginFragment);
1304
+ });
1305
+ ['left', 'right'].forEach((side) => {
1306
+ const marginFragment = buildCellMargin(side, margin);
1307
+ tableCellMarFragment.import(marginFragment);
1308
+ });
1309
+ return tableCellMarFragment;
1310
+ };
1311
+ const ɵ55 = buildTableCellMargins;
1312
+ const buildTableProperties = (attributes) => {
1313
+ const tablePropertiesFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tblPr');
1314
+ if (attributes && attributes.constructor === Object) {
1315
+ Object.keys(attributes).forEach((key) => {
1316
+ switch (key) {
1317
+ case 'tableBorder':
1318
+ const tableBordersFragment = buildTableBorders(attributes[key]);
1319
+ tablePropertiesFragment.import(tableBordersFragment);
1320
+ // eslint-disable-next-line no-param-reassign
1321
+ delete attributes.tableBorder;
1322
+ break;
1323
+ case 'tableCellSpacing':
1324
+ const tableCellSpacingFragment = buildTableCellSpacing(attributes[key]);
1325
+ tablePropertiesFragment.import(tableCellSpacingFragment);
1326
+ // eslint-disable-next-line no-param-reassign
1327
+ delete attributes.tableCellSpacing;
1328
+ break;
1329
+ case 'width':
1330
+ if (attributes[key]) {
1331
+ const tableWidthFragment = buildTableWidth(attributes[key]);
1332
+ tablePropertiesFragment.import(tableWidthFragment);
1333
+ }
1334
+ // eslint-disable-next-line no-param-reassign
1335
+ delete attributes.width;
1336
+ break;
1337
+ }
1338
+ });
1339
+ }
1340
+ const tableCellMarginFragment = buildTableCellMargins(160);
1341
+ tablePropertiesFragment.import(tableCellMarginFragment);
1342
+ // by default, all tables are center aligned.
1343
+ const alignmentFragment = buildHorizontalAlignment('center');
1344
+ tablePropertiesFragment.import(alignmentFragment);
1345
+ tablePropertiesFragment.up();
1346
+ return tablePropertiesFragment;
1347
+ };
1348
+ const ɵ56 = buildTableProperties;
1349
+ const cssBorderParser = (borderString) => {
1350
+ let [size, stroke, color] = borderString.split(' ');
1351
+ if (pointRegex.test(size)) {
1352
+ const matchedParts = size.match(pointRegex);
1353
+ // convert point to eighth of a point
1354
+ size = pointToEIP(matchedParts[1]);
1355
+ }
1356
+ else if (pixelRegex.test(size)) {
1357
+ const matchedParts = size.match(pixelRegex);
1358
+ // convert pixels to eighth of a point
1359
+ size = pixelToEIP(matchedParts[1]);
1360
+ }
1361
+ stroke = stroke && ['dashed', 'dotted', 'double'].includes(stroke) ? stroke : 'single';
1362
+ color = color && fixupColorCode(color).toUpperCase();
1363
+ return [size, stroke, color];
1364
+ };
1365
+ const ɵ57 = cssBorderParser;
1366
+ const buildTable = (vNode, attributes, docxDocumentInstance) => __awaiter(void 0, void 0, void 0, function* () {
1367
+ const tableFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tbl');
1368
+ const modifiedAttributes = Object.assign({}, attributes);
1369
+ if (isVNode(vNode) && vNode.properties) {
1370
+ const tableAttributes = vNode.properties.attributes || {};
1371
+ const tableStyles = vNode.properties.style || {};
1372
+ const tableBorders = {};
1373
+ const tableCellBorders = {};
1374
+ let [borderSize, borderStrike, borderColor] = [2, 'single', '000000'];
1375
+ // eslint-disable-next-line no-restricted-globals
1376
+ if (!isNaN(tableAttributes.border)) {
1377
+ borderSize = parseInt(tableAttributes.border, 10);
1378
+ }
1379
+ // css style overrides table border properties
1380
+ if (tableStyles.border) {
1381
+ const [cssSize, cssStroke, cssColor] = cssBorderParser(tableStyles.border);
1382
+ borderSize = cssSize || borderSize;
1383
+ borderColor = cssColor || borderColor;
1384
+ borderStrike = cssStroke || borderStrike;
1385
+ }
1386
+ tableBorders.top = borderSize;
1387
+ tableBorders.bottom = borderSize;
1388
+ tableBorders.left = borderSize;
1389
+ tableBorders.right = borderSize;
1390
+ tableBorders.stroke = borderStrike;
1391
+ tableBorders.color = borderColor;
1392
+ if (tableStyles['border-collapse'] === 'collapse') {
1393
+ tableBorders.insideV = borderSize;
1394
+ tableBorders.insideH = borderSize;
1395
+ }
1396
+ else {
1397
+ tableBorders.insideV = 0;
1398
+ tableBorders.insideH = 0;
1399
+ tableCellBorders.top = 1;
1400
+ tableCellBorders.bottom = 1;
1401
+ tableCellBorders.left = 1;
1402
+ tableCellBorders.right = 1;
1403
+ }
1404
+ modifiedAttributes.tableBorder = tableBorders;
1405
+ modifiedAttributes.tableCellSpacing = 0;
1406
+ if (Object.keys(tableCellBorders).length) {
1407
+ modifiedAttributes.tableCellBorder = tableCellBorders;
1408
+ }
1409
+ let minimumWidth;
1410
+ let maximumWidth;
1411
+ let width;
1412
+ // Calculate minimum width of table
1413
+ if (pixelRegex.test(tableStyles['min-width'])) {
1414
+ minimumWidth = pixelToTWIP(tableStyles['min-width'].match(pixelRegex)[1]);
1415
+ }
1416
+ else if (percentageRegex.test(tableStyles['min-width'])) {
1417
+ const percentageValue = tableStyles['min-width'].match(percentageRegex)[1];
1418
+ minimumWidth = Math.round((percentageValue / 100) * attributes.maximumWidth);
1419
+ }
1420
+ // Calculate maximum width of table
1421
+ if (pixelRegex.test(tableStyles['max-width'])) {
1422
+ pixelRegex.lastIndex = 0;
1423
+ maximumWidth = pixelToTWIP(tableStyles['max-width'].match(pixelRegex)[1]);
1424
+ }
1425
+ else if (percentageRegex.test(tableStyles['max-width'])) {
1426
+ percentageRegex.lastIndex = 0;
1427
+ const percentageValue = tableStyles['max-width'].match(percentageRegex)[1];
1428
+ maximumWidth = Math.round((percentageValue / 100) * attributes.maximumWidth);
1429
+ }
1430
+ // Calculate specified width of table
1431
+ if (pixelRegex.test(tableStyles.width)) {
1432
+ pixelRegex.lastIndex = 0;
1433
+ width = pixelToTWIP(tableStyles.width.match(pixelRegex)[1]);
1434
+ }
1435
+ else if (percentageRegex.test(tableStyles.width)) {
1436
+ percentageRegex.lastIndex = 0;
1437
+ const percentageValue = tableStyles.width.match(percentageRegex)[1];
1438
+ width = Math.round((percentageValue / 100) * attributes.maximumWidth);
1439
+ }
1440
+ // If width isn't supplied, we should have min-width as the width.
1441
+ if (width) {
1442
+ modifiedAttributes.width = width;
1443
+ if (maximumWidth) {
1444
+ modifiedAttributes.width = Math.min(modifiedAttributes.width, maximumWidth);
1445
+ }
1446
+ if (minimumWidth) {
1447
+ modifiedAttributes.width = Math.max(modifiedAttributes.width, minimumWidth);
1448
+ }
1449
+ }
1450
+ else if (minimumWidth) {
1451
+ modifiedAttributes.width = minimumWidth;
1452
+ }
1453
+ if (modifiedAttributes.width) {
1454
+ modifiedAttributes.width = Math.min(modifiedAttributes.width, attributes.maximumWidth);
1455
+ }
1456
+ }
1457
+ const tablePropertiesFragment = buildTableProperties(modifiedAttributes);
1458
+ tableFragment.import(tablePropertiesFragment);
1459
+ const rowSpanMap = new Map();
1460
+ if (vNodeHasChildren(vNode)) {
1461
+ for (let index = 0; index < vNode.children.length; index++) {
1462
+ const childVNode = vNode.children[index];
1463
+ if (childVNode.tagName === 'colgroup') {
1464
+ const tableGridFragment = buildTableGrid(childVNode, modifiedAttributes);
1465
+ tableFragment.import(tableGridFragment);
1466
+ }
1467
+ else if (childVNode.tagName === 'thead') {
1468
+ for (let iteratorIndex = 0; iteratorIndex < childVNode.children.length; iteratorIndex++) {
1469
+ const grandChildVNode = childVNode.children[iteratorIndex];
1470
+ if (grandChildVNode.tagName === 'tr') {
1471
+ if (iteratorIndex === 0) {
1472
+ const tableGridFragment = buildTableGridFromTableRow(grandChildVNode, modifiedAttributes);
1473
+ tableFragment.import(tableGridFragment);
1474
+ }
1475
+ const tableRowFragment = yield buildTableRow(grandChildVNode, modifiedAttributes, rowSpanMap, docxDocumentInstance);
1476
+ tableFragment.import(tableRowFragment);
1477
+ }
1478
+ }
1479
+ }
1480
+ else if (childVNode.tagName === 'tbody') {
1481
+ for (let iteratorIndex = 0; iteratorIndex < childVNode.children.length; iteratorIndex++) {
1482
+ const grandChildVNode = childVNode.children[iteratorIndex];
1483
+ if (grandChildVNode.tagName === 'tr') {
1484
+ if (iteratorIndex === 0) {
1485
+ const tableGridFragment = buildTableGridFromTableRow(grandChildVNode, modifiedAttributes);
1486
+ tableFragment.import(tableGridFragment);
1487
+ }
1488
+ const tableRowFragment = yield buildTableRow(grandChildVNode, modifiedAttributes, rowSpanMap, docxDocumentInstance);
1489
+ tableFragment.import(tableRowFragment);
1490
+ }
1491
+ }
1492
+ }
1493
+ else if (childVNode.tagName === 'tr') {
1494
+ if (index === 0) {
1495
+ const tableGridFragment = buildTableGridFromTableRow(childVNode, modifiedAttributes);
1496
+ tableFragment.import(tableGridFragment);
1497
+ }
1498
+ const tableRowFragment = yield buildTableRow(childVNode, modifiedAttributes, rowSpanMap, docxDocumentInstance);
1499
+ tableFragment.import(tableRowFragment);
1500
+ }
1501
+ }
1502
+ }
1503
+ tableFragment.up();
1504
+ return tableFragment;
1505
+ });
1506
+ const ɵ58 = buildTable;
1507
+ const buildPresetGeometry = () => fragment({ namespaceAlias: { a: namespaces.a } })
1508
+ .ele('@a', 'prstGeom')
1509
+ .att('prst', 'rect')
1510
+ .up();
1511
+ const ɵ59 = buildPresetGeometry;
1512
+ const buildExtents = ({ width, height }) => fragment({ namespaceAlias: { a: namespaces.a } })
1513
+ .ele('@a', 'ext')
1514
+ .att('cx', width)
1515
+ .att('cy', height)
1516
+ .up();
1517
+ const ɵ60 = buildExtents;
1518
+ const buildOffset = () => fragment({ namespaceAlias: { a: namespaces.a } })
1519
+ .ele('@a', 'off')
1520
+ .att('x', '0')
1521
+ .att('y', '0')
1522
+ .up();
1523
+ const ɵ61 = buildOffset;
1524
+ const buildGraphicFrameTransform = (attributes) => {
1525
+ const graphicFrameTransformFragment = fragment({ namespaceAlias: { a: namespaces.a } }).ele('@a', 'xfrm');
1526
+ const offsetFragment = buildOffset();
1527
+ graphicFrameTransformFragment.import(offsetFragment);
1528
+ const extentsFragment = buildExtents(attributes);
1529
+ graphicFrameTransformFragment.import(extentsFragment);
1530
+ graphicFrameTransformFragment.up();
1531
+ return graphicFrameTransformFragment;
1532
+ };
1533
+ const ɵ62 = buildGraphicFrameTransform;
1534
+ const buildShapeProperties = (attributes) => {
1535
+ const shapeProperties = fragment({ namespaceAlias: { pic: namespaces.pic } }).ele('@pic', 'spPr');
1536
+ const graphicFrameTransformFragment = buildGraphicFrameTransform(attributes);
1537
+ shapeProperties.import(graphicFrameTransformFragment);
1538
+ const presetGeometryFragment = buildPresetGeometry();
1539
+ shapeProperties.import(presetGeometryFragment);
1540
+ shapeProperties.up();
1541
+ return shapeProperties;
1542
+ };
1543
+ const ɵ63 = buildShapeProperties;
1544
+ const buildFillRect = () => fragment({ namespaceAlias: { a: namespaces.a } })
1545
+ .ele('@a', 'fillRect')
1546
+ .up();
1547
+ const ɵ64 = buildFillRect;
1548
+ const buildStretch = () => {
1549
+ const stretchFragment = fragment({ namespaceAlias: { a: namespaces.a } }).ele('@a', 'stretch');
1550
+ const fillRectFragment = buildFillRect();
1551
+ stretchFragment.import(fillRectFragment);
1552
+ stretchFragment.up();
1553
+ return stretchFragment;
1554
+ };
1555
+ const ɵ65 = buildStretch;
1556
+ const buildSrcRectFragment = () => fragment({ namespaceAlias: { a: namespaces.a } })
1557
+ .ele('@a', 'srcRect')
1558
+ .att('b', '0')
1559
+ .att('l', '0')
1560
+ .att('r', '0')
1561
+ .att('t', '0')
1562
+ .up();
1563
+ const ɵ66 = buildSrcRectFragment;
1564
+ const buildBinaryLargeImageOrPicture = (relationshipId) => fragment({
1565
+ namespaceAlias: { a: namespaces.a, r: namespaces.r },
1566
+ })
1567
+ .ele('@a', 'blip')
1568
+ .att('@r', 'embed', `rId${relationshipId}`)
1569
+ // FIXME: possible values 'email', 'none', 'print', 'hqprint', 'screen'
1570
+ .att('cstate', 'print')
1571
+ .up();
1572
+ const ɵ67 = buildBinaryLargeImageOrPicture;
1573
+ const buildBinaryLargeImageOrPictureFill = (relationshipId) => {
1574
+ const binaryLargeImageOrPictureFillFragment = fragment({
1575
+ namespaceAlias: { pic: namespaces.pic },
1576
+ }).ele('@pic', 'blipFill');
1577
+ const binaryLargeImageOrPictureFragment = buildBinaryLargeImageOrPicture(relationshipId);
1578
+ binaryLargeImageOrPictureFillFragment.import(binaryLargeImageOrPictureFragment);
1579
+ const srcRectFragment = buildSrcRectFragment();
1580
+ binaryLargeImageOrPictureFillFragment.import(srcRectFragment);
1581
+ const stretchFragment = buildStretch();
1582
+ binaryLargeImageOrPictureFillFragment.import(stretchFragment);
1583
+ binaryLargeImageOrPictureFillFragment.up();
1584
+ return binaryLargeImageOrPictureFillFragment;
1585
+ };
1586
+ const ɵ68 = buildBinaryLargeImageOrPictureFill;
1587
+ const buildNonVisualPictureDrawingProperties = () => fragment({ namespaceAlias: { pic: namespaces.pic } })
1588
+ .ele('@pic', 'cNvPicPr')
1589
+ .up();
1590
+ const ɵ69 = buildNonVisualPictureDrawingProperties;
1591
+ const buildNonVisualDrawingProperties = (pictureId, pictureNameWithExtension, pictureDescription = '') => fragment({ namespaceAlias: { pic: namespaces.pic } })
1592
+ .ele('@pic', 'cNvPr')
1593
+ .att('id', pictureId)
1594
+ .att('name', pictureNameWithExtension)
1595
+ .att('descr', pictureDescription)
1596
+ .up();
1597
+ const ɵ70 = buildNonVisualDrawingProperties;
1598
+ const buildNonVisualPictureProperties = (pictureId, pictureNameWithExtension, pictureDescription) => {
1599
+ const nonVisualPicturePropertiesFragment = fragment({
1600
+ namespaceAlias: { pic: namespaces.pic },
1601
+ }).ele('@pic', 'nvPicPr');
1602
+ // TODO: Handle picture attributes
1603
+ const nonVisualDrawingPropertiesFragment = buildNonVisualDrawingProperties(pictureId, pictureNameWithExtension, pictureDescription);
1604
+ nonVisualPicturePropertiesFragment.import(nonVisualDrawingPropertiesFragment);
1605
+ const nonVisualPictureDrawingPropertiesFragment = buildNonVisualPictureDrawingProperties();
1606
+ nonVisualPicturePropertiesFragment.import(nonVisualPictureDrawingPropertiesFragment);
1607
+ nonVisualPicturePropertiesFragment.up();
1608
+ return nonVisualPicturePropertiesFragment;
1609
+ };
1610
+ const ɵ71 = buildNonVisualPictureProperties;
1611
+ const buildPicture = ({ id, fileNameWithExtension, description, relationshipId, width, height, }) => {
1612
+ const pictureFragment = fragment({ namespaceAlias: { pic: namespaces.pic } }).ele('@pic', 'pic');
1613
+ const nonVisualPicturePropertiesFragment = buildNonVisualPictureProperties(id, fileNameWithExtension, description);
1614
+ pictureFragment.import(nonVisualPicturePropertiesFragment);
1615
+ const binaryLargeImageOrPictureFill = buildBinaryLargeImageOrPictureFill(relationshipId);
1616
+ pictureFragment.import(binaryLargeImageOrPictureFill);
1617
+ const shapeProperties = buildShapeProperties({ width, height });
1618
+ pictureFragment.import(shapeProperties);
1619
+ pictureFragment.up();
1620
+ return pictureFragment;
1621
+ };
1622
+ const ɵ72 = buildPicture;
1623
+ const buildGraphicData = (graphicType, attributes) => {
1624
+ const graphicDataFragment = fragment({ namespaceAlias: { a: namespaces.a } })
1625
+ .ele('@a', 'graphicData')
1626
+ .att('uri', 'http://schemas.openxmlformats.org/drawingml/2006/picture');
1627
+ if (graphicType === 'picture') {
1628
+ const pictureFragment = buildPicture(attributes);
1629
+ graphicDataFragment.import(pictureFragment);
1630
+ }
1631
+ graphicDataFragment.up();
1632
+ return graphicDataFragment;
1633
+ };
1634
+ const ɵ73 = buildGraphicData;
1635
+ const buildGraphic = (graphicType, attributes) => {
1636
+ const graphicFragment = fragment({ namespaceAlias: { a: namespaces.a } }).ele('@a', 'graphic');
1637
+ // TODO: Handle drawing type
1638
+ const graphicDataFragment = buildGraphicData(graphicType, attributes);
1639
+ graphicFragment.import(graphicDataFragment);
1640
+ graphicFragment.up();
1641
+ return graphicFragment;
1642
+ };
1643
+ const ɵ74 = buildGraphic;
1644
+ const buildDrawingObjectNonVisualProperties = (pictureId, pictureName) => fragment({ namespaceAlias: { wp: namespaces.wp } })
1645
+ .ele('@wp', 'docPr')
1646
+ .att('id', pictureId)
1647
+ .att('name', pictureName)
1648
+ .up();
1649
+ const ɵ75 = buildDrawingObjectNonVisualProperties;
1650
+ const buildWrapSquare = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1651
+ .ele('@wp', 'wrapSquare')
1652
+ .att('wrapText', 'bothSides')
1653
+ .att('distB', '228600')
1654
+ .att('distT', '228600')
1655
+ .att('distL', '228600')
1656
+ .att('distR', '228600')
1657
+ .up();
1658
+ const ɵ76 = buildWrapSquare;
1659
+ // eslint-disable-next-line no-unused-vars
1660
+ const buildWrapNone = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1661
+ .ele('@wp', 'wrapNone')
1662
+ .up();
1663
+ const ɵ77 = buildWrapNone;
1664
+ const buildEffectExtentFragment = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1665
+ .ele('@wp', 'effectExtent')
1666
+ .att('b', '0')
1667
+ .att('l', '0')
1668
+ .att('r', '0')
1669
+ .att('t', '0')
1670
+ .up();
1671
+ const ɵ78 = buildEffectExtentFragment;
1672
+ const buildExtent = ({ width, height }) => fragment({ namespaceAlias: { wp: namespaces.wp } })
1673
+ .ele('@wp', 'extent')
1674
+ .att('cx', width)
1675
+ .att('cy', height)
1676
+ .up();
1677
+ const ɵ79 = buildExtent;
1678
+ const buildPositionV = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1679
+ .ele('@wp', 'positionV')
1680
+ .att('relativeFrom', 'paragraph')
1681
+ .ele('@wp', 'posOffset')
1682
+ .txt('19050')
1683
+ .up()
1684
+ .up();
1685
+ const ɵ80 = buildPositionV;
1686
+ const buildPositionH = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1687
+ .ele('@wp', 'positionH')
1688
+ .att('relativeFrom', 'column')
1689
+ .ele('@wp', 'posOffset')
1690
+ .txt('19050')
1691
+ .up()
1692
+ .up();
1693
+ const ɵ81 = buildPositionH;
1694
+ const buildSimplePos = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1695
+ .ele('@wp', 'simplePos')
1696
+ .att('x', '0')
1697
+ .att('y', '0')
1698
+ .up();
1699
+ const ɵ82 = buildSimplePos;
1700
+ const buildAnchoredDrawing = (graphicType, attributes) => {
1701
+ const anchoredDrawingFragment = fragment({ namespaceAlias: { wp: namespaces.wp } })
1702
+ .ele('@wp', 'anchor')
1703
+ .att('distB', '0')
1704
+ .att('distL', '0')
1705
+ .att('distR', '0')
1706
+ .att('distT', '0')
1707
+ .att('relativeHeight', '0')
1708
+ .att('behindDoc', 'false')
1709
+ .att('locked', 'true')
1710
+ .att('layoutInCell', 'true')
1711
+ .att('allowOverlap', 'false')
1712
+ .att('simplePos', 'false');
1713
+ // Even though simplePos isnt supported by Word 2007 simplePos is required.
1714
+ const simplePosFragment = buildSimplePos();
1715
+ anchoredDrawingFragment.import(simplePosFragment);
1716
+ const positionHFragment = buildPositionH();
1717
+ anchoredDrawingFragment.import(positionHFragment);
1718
+ const positionVFragment = buildPositionV();
1719
+ anchoredDrawingFragment.import(positionVFragment);
1720
+ const extentFragment = buildExtent({ width: attributes.width, height: attributes.height });
1721
+ anchoredDrawingFragment.import(extentFragment);
1722
+ const effectExtentFragment = buildEffectExtentFragment();
1723
+ anchoredDrawingFragment.import(effectExtentFragment);
1724
+ const wrapSquareFragment = buildWrapSquare();
1725
+ anchoredDrawingFragment.import(wrapSquareFragment);
1726
+ const drawingObjectNonVisualPropertiesFragment = buildDrawingObjectNonVisualProperties(attributes.id, attributes.fileNameWithExtension);
1727
+ anchoredDrawingFragment.import(drawingObjectNonVisualPropertiesFragment);
1728
+ const graphicFragment = buildGraphic(graphicType, attributes);
1729
+ anchoredDrawingFragment.import(graphicFragment);
1730
+ anchoredDrawingFragment.up();
1731
+ return anchoredDrawingFragment;
1732
+ };
1733
+ const ɵ83 = buildAnchoredDrawing;
1734
+ const buildInlineDrawing = (graphicType, attributes) => {
1735
+ const inlineDrawingFragment = fragment({ namespaceAlias: { wp: namespaces.wp } })
1736
+ .ele('@wp', 'inline')
1737
+ .att('distB', '0')
1738
+ .att('distL', '0')
1739
+ .att('distR', '0')
1740
+ .att('distT', '0');
1741
+ const extentFragment = buildExtent({ width: attributes.width, height: attributes.height });
1742
+ inlineDrawingFragment.import(extentFragment);
1743
+ const effectExtentFragment = buildEffectExtentFragment();
1744
+ inlineDrawingFragment.import(effectExtentFragment);
1745
+ const drawingObjectNonVisualPropertiesFragment = buildDrawingObjectNonVisualProperties(attributes.id, attributes.fileNameWithExtension);
1746
+ inlineDrawingFragment.import(drawingObjectNonVisualPropertiesFragment);
1747
+ const graphicFragment = buildGraphic(graphicType, attributes);
1748
+ inlineDrawingFragment.import(graphicFragment);
1749
+ inlineDrawingFragment.up();
1750
+ return inlineDrawingFragment;
1751
+ };
1752
+ const ɵ84 = buildInlineDrawing;
1753
+ const buildDrawing = (inlineOrAnchored = false, graphicType, attributes) => {
1754
+ const drawingFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'drawing');
1755
+ const inlineOrAnchoredDrawingFragment = inlineOrAnchored
1756
+ ? buildInlineDrawing(graphicType, attributes)
1757
+ : buildAnchoredDrawing(graphicType, attributes);
1758
+ drawingFragment.import(inlineOrAnchoredDrawingFragment);
1759
+ drawingFragment.up();
1760
+ return drawingFragment;
1761
+ };
1762
+ const ɵ85 = buildDrawing;
1763
+ export { buildParagraph, buildTable, buildNumberingInstances, buildLineBreak, buildIndentation, buildTextElement, buildBold, buildItalics, buildUnderline, buildDrawing, fixupLineHeight, };
1764
+ export { ɵ0, ɵ1, ɵ2, ɵ3, ɵ4, ɵ5, ɵ6, ɵ7, ɵ8, ɵ9, ɵ10, ɵ11, ɵ12, ɵ13, ɵ14, ɵ15, ɵ16, ɵ17, ɵ18, ɵ19, ɵ20, ɵ21, ɵ22, ɵ23, ɵ24, ɵ25, ɵ26, ɵ27, ɵ28, ɵ29, ɵ30, ɵ31, ɵ32, ɵ33, ɵ34, ɵ35, ɵ36, ɵ37, ɵ38, ɵ39, ɵ40, ɵ41, ɵ42, ɵ43, ɵ44, ɵ45, ɵ46, ɵ47, ɵ48, ɵ49, ɵ50, ɵ51, ɵ52, ɵ53, ɵ54, ɵ55, ɵ56, ɵ57, ɵ58, ɵ59, ɵ60, ɵ61, ɵ62, ɵ63, ɵ64, ɵ65, ɵ66, ɵ67, ɵ68, ɵ69, ɵ70, ɵ71, ɵ72, ɵ73, ɵ74, ɵ75, ɵ76, ɵ77, ɵ78, ɵ79, ɵ80, ɵ81, ɵ82, ɵ83, ɵ84, ɵ85 };
1765
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLXV0aWxpdGllcy9zcmMvbGliL3NoYXJlZC9jb25maWcvd29yZC9oZWxwZXJzL3htbC1idWlsZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxxQ0FBcUM7QUFDckMsMEJBQTBCO0FBQzFCLHNDQUFzQztBQUN0Qyx5Q0FBeUM7QUFDekMsZ0NBQWdDO0FBQ2hDLG1DQUFtQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sT0FBTyxNQUFNLDRCQUE0QixDQUFDO0FBQ2pELE9BQU8sT0FBTyxNQUFNLDRCQUE0QixDQUFDO0FBQ2pELE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ25DLE9BQU8sYUFBYSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7QUFFaEMsT0FBTyxVQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsVUFBVSxFQUNWLFVBQVUsRUFDVixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixVQUFVLEVBQ1YsU0FBUyxFQUNULFdBQVcsRUFDWCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVixVQUFVLEVBQ1YsUUFBUSxFQUNSLE9BQU8sRUFDUCxTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsc0NBQXNDO0FBQ3RDLDJDQUEyQztBQUMzQyxP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RCxlQUFlLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDeEQsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRXJCLE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUMsQ0FBQzs7QUFFRixPQUFPLEVBQ0wsY0FBYyxFQUNkLFVBQVUsRUFDVix1QkFBdUIsRUFDdkIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFlBQVksRUFDWixjQUFjLEVBQ2QsWUFBWSxFQUNaLGVBQWUsR0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AgKi9cclxuLyogZXNsaW50LWRpc2FibGUgcmFkaXggKi9cclxuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cclxuLyogZXNsaW50LWRpc2FibGUgbm8tY2FzZS1kZWNsYXJhdGlvbnMgKi9cclxuLyogZXNsaW50LWRpc2FibGUgbm8tcGx1c3BsdXMgKi9cclxuLyogZXNsaW50LWRpc2FibGUgbm8tZWxzZS1yZXR1cm4gKi9cclxuaW1wb3J0IHsgZnJhZ21lbnQgfSBmcm9tICd4bWxidWlsZGVyMic7XHJcbmltcG9ydCBpc1ZOb2RlIGZyb20gJ3ZpcnR1YWwtZG9tL3Zub2RlL2lzLXZub2RlJztcclxuaW1wb3J0IGlzVlRleHQgZnJvbSAndmlydHVhbC1kb20vdm5vZGUvaXMtdnRleHQnO1xyXG5pbXBvcnQgY29sb3JOYW1lcyBmcm9tICdjb2xvci1uYW1lJztcclxuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IGltYWdlVG9CYXNlNjQgZnJvbSAnaW1hZ2UtdG8tYmFzZTY0JztcclxuaW1wb3J0IG1pbWVUeXBlcyBmcm9tICdtaW1lLXR5cGVzJztcclxuaW1wb3J0IHNpemVPZiBmcm9tICdpbWFnZS1zaXplJztcclxuXHJcbmltcG9ydCBuYW1lc3BhY2VzIGZyb20gJy4uL25hbWVzcGFjZXMnO1xyXG5pbXBvcnQge1xyXG4gIHJnYlRvSGV4LFxyXG4gIGhzbFRvSGV4LFxyXG4gIGhzbFJlZ2V4LFxyXG4gIHJnYlJlZ2V4LFxyXG4gIGhleFJlZ2V4LFxyXG4gIGhleDNSZWdleCxcclxuICBoZXgzVG9IZXgsXHJcbn0gZnJvbSAnLi4vdXRpbHMvY29sb3ItY29udmVyc2lvbic7XHJcbmltcG9ydCB7XHJcbiAgcGl4ZWxUb0VNVSxcclxuICBwaXhlbFJlZ2V4LFxyXG4gIFRXSVBUb0VNVSxcclxuICBwZXJjZW50YWdlUmVnZXgsXHJcbiAgcG9pbnRSZWdleCxcclxuICBwb2ludFRvSElQLFxyXG4gIEhJUFRvVFdJUCxcclxuICBwb2ludFRvVFdJUCxcclxuICBwaXhlbFRvSElQLFxyXG4gIHBpeGVsVG9UV0lQLFxyXG4gIHBpeGVsVG9FSVAsXHJcbiAgcG9pbnRUb0VJUCxcclxuICBjbVRvVFdJUCxcclxuICBjbVJlZ2V4LFxyXG4gIGluY2hSZWdleCxcclxuICBpbmNoVG9UV0lQLFxyXG59IGZyb20gJy4uL3V0aWxzL3VuaXQtY29udmVyc2lvbic7XHJcbi8vIEZJWE1FOiByZW1vdmUgdGhlIGN5Y2xpYyBkZXBlbmRlbmN5XHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tY3ljbGVcclxuaW1wb3J0IHsgYnVpbGRJbWFnZSwgYnVpbGRMaXN0IH0gZnJvbSAnLi9yZW5kZXItZG9jdW1lbnQtZmlsZSc7XHJcbmltcG9ydCB7XHJcbiAgZGVmYXVsdEZvbnQsXHJcbiAgaHlwZXJsaW5rVHlwZSxcclxuICBwYXJhZ3JhcGhCb3JkZXJzT2JqZWN0LFxyXG4gIGNvbG9ybGVzc0NvbG9ycyxcclxuICB2ZXJ0aWNhbEFsaWduVmFsdWVzLFxyXG4gIGltYWdlVHlwZSxcclxuICBpbnRlcm5hbFJlbGF0aW9uc2hpcCxcclxufSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyB2Tm9kZUhhc0NoaWxkcmVuIH0gZnJvbSAnLi4vdXRpbHMvdm5vZGUnO1xyXG5pbXBvcnQgeyBpc1ZhbGlkVXJsIH0gZnJvbSAnLi4vdXRpbHMvdXJsJztcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxyXG5jb25zdCBmaXh1cENvbG9yQ29kZSA9IChjb2xvckNvZGVTdHJpbmcpID0+IHtcclxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbG9yTmFtZXMsIGNvbG9yQ29kZVN0cmluZy50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgY29uc3QgW3JlZCwgZ3JlZW4sIGJsdWVdID0gY29sb3JOYW1lc1tjb2xvckNvZGVTdHJpbmcudG9Mb3dlckNhc2UoKV07XHJcblxyXG4gICAgcmV0dXJuIHJnYlRvSGV4KHJlZCwgZ3JlZW4sIGJsdWUpO1xyXG4gIH0gZWxzZSBpZiAocmdiUmVnZXgudGVzdChjb2xvckNvZGVTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBjb2xvckNvZGVTdHJpbmcubWF0Y2gocmdiUmVnZXgpO1xyXG4gICAgY29uc3QgcmVkID0gbWF0Y2hlZFBhcnRzWzFdO1xyXG4gICAgY29uc3QgZ3JlZW4gPSBtYXRjaGVkUGFydHNbMl07XHJcbiAgICBjb25zdCBibHVlID0gbWF0Y2hlZFBhcnRzWzNdO1xyXG5cclxuICAgIHJldHVybiByZ2JUb0hleChyZWQsIGdyZWVuLCBibHVlKTtcclxuICB9IGVsc2UgaWYgKGhzbFJlZ2V4LnRlc3QoY29sb3JDb2RlU3RyaW5nKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gY29sb3JDb2RlU3RyaW5nLm1hdGNoKGhzbFJlZ2V4KTtcclxuICAgIGNvbnN0IGh1ZSA9IG1hdGNoZWRQYXJ0c1sxXTtcclxuICAgIGNvbnN0IHNhdHVyYXRpb24gPSBtYXRjaGVkUGFydHNbMl07XHJcbiAgICBjb25zdCBsdW1pbm9zaXR5ID0gbWF0Y2hlZFBhcnRzWzNdO1xyXG5cclxuICAgIHJldHVybiBoc2xUb0hleChodWUsIHNhdHVyYXRpb24sIGx1bWlub3NpdHkpO1xyXG4gIH0gZWxzZSBpZiAoaGV4UmVnZXgudGVzdChjb2xvckNvZGVTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBjb2xvckNvZGVTdHJpbmcubWF0Y2goaGV4UmVnZXgpO1xyXG5cclxuICAgIHJldHVybiBtYXRjaGVkUGFydHNbMV07XHJcbiAgfSBlbHNlIGlmIChoZXgzUmVnZXgudGVzdChjb2xvckNvZGVTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBjb2xvckNvZGVTdHJpbmcubWF0Y2goaGV4M1JlZ2V4KTtcclxuICAgIGNvbnN0IHJlZCA9IG1hdGNoZWRQYXJ0c1sxXTtcclxuICAgIGNvbnN0IGdyZWVuID0gbWF0Y2hlZFBhcnRzWzJdO1xyXG4gICAgY29uc3QgYmx1ZSA9IG1hdGNoZWRQYXJ0c1szXTtcclxuXHJcbiAgICByZXR1cm4gaGV4M1RvSGV4KHJlZCwgZ3JlZW4sIGJsdWUpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gJzAwMDAwMCc7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgYnVpbGRSdW5Gb250RnJhZ21lbnQgPSAoZm9udE5hbWUgPSBkZWZhdWx0Rm9udCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICdyRm9udHMnKVxyXG4gICAgLmF0dCgnQHcnLCAnYXNjaWknLCBmb250TmFtZSlcclxuICAgIC5hdHQoJ0B3JywgJ2hBbnNpJywgZm9udE5hbWUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkUnVuU3R5bGVGcmFnbWVudCA9ICh0eXBlID0gJ0h5cGVybGluaycpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnclN0eWxlJylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIHR5cGUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVGFibGVSb3dIZWlnaHQgPSAodGFibGVSb3dIZWlnaHQpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAndHJIZWlnaHQnKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgdGFibGVSb3dIZWlnaHQpXHJcbiAgICAuYXR0KCdAdycsICdoUnVsZScsICdhdExlYXN0JylcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRWZXJ0aWNhbEFsaWdubWVudCA9ICh2ZXJ0aWNhbEFsaWdubWVudCkgPT4ge1xyXG4gIGlmICh2ZXJ0aWNhbEFsaWdubWVudC50b0xvd2VyQ2FzZSgpID09PSAnbWlkZGxlJykge1xyXG4gICAgdmVydGljYWxBbGlnbm1lbnQgPSAnY2VudGVyJztcclxuICB9XHJcblxyXG4gIHJldHVybiBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICd2QWxpZ24nKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgdmVydGljYWxBbGlnbm1lbnQpXHJcbiAgICAudXAoKTtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkVmVydGljYWxNZXJnZSA9ICh2ZXJ0aWNhbE1lcmdlID0gJ2NvbnRpbnVlJykgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICd2TWVyZ2UnKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgdmVydGljYWxNZXJnZSlcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRDb2xvciA9IChjb2xvckNvZGUpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnY29sb3InKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgY29sb3JDb2RlKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZEZvbnRTaXplID0gKGZvbnRTaXplKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ3N6JylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIGZvbnRTaXplKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZFNoYWRpbmcgPSAoY29sb3JDb2RlKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ3NoZCcpXHJcbiAgICAuYXR0KCdAdycsICd2YWwnLCAnY2xlYXInKVxyXG4gICAgLmF0dCgnQHcnLCAnZmlsbCcsIGNvbG9yQ29kZSlcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRIaWdobGlnaHQgPSAoY29sb3IgPSAneWVsbG93JykgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICdoaWdobGlnaHQnKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgY29sb3IpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVmVydEFsaWduID0gKHR5cGUgPSAnYmFzZWxpbmUnKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ3ZlcnRBbGlnbicpXHJcbiAgICAuYXR0KCdAdycsICd2YWwnLCB0eXBlKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZFN0cmlrZSA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnc3RyaWtlJylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIHRydWUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkQm9sZCA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnYicpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkSXRhbGljcyA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnaScpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVW5kZXJsaW5lID0gKHR5cGUgPSAnc2luZ2xlJykgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICd1JylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIHR5cGUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkTGluZUJyZWFrID0gKHR5cGUgPSAndGV4dFdyYXBwaW5nJykgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICdicicpXHJcbiAgICAuYXR0KCdAdycsICd0eXBlJywgdHlwZSlcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRCb3JkZXIgPSAoXHJcbiAgYm9yZGVyU2lkZSA9ICd0b3AnLFxyXG4gIGJvcmRlclNpemUgPSAwLFxyXG4gIGJvcmRlclNwYWNpbmcgPSAwLFxyXG4gIGJvcmRlckNvbG9yID0gZml4dXBDb2xvckNvZGUoJ2JsYWNrJyksXHJcbiAgYm9yZGVyU3Ryb2tlID0gJ3NpbmdsZSdcclxuKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgYm9yZGVyU2lkZSlcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIGJvcmRlclN0cm9rZSlcclxuICAgIC5hdHQoJ0B3JywgJ3N6JywgYm9yZGVyU2l6ZSlcclxuICAgIC5hdHQoJ0B3JywgJ3NwYWNlJywgYm9yZGVyU3BhY2luZylcclxuICAgIC5hdHQoJ0B3JywgJ2NvbG9yJywgYm9yZGVyQ29sb3IpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVGV4dEVsZW1lbnQgPSAodGV4dCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICd0JylcclxuICAgIC5hdHQoJ0B4bWwnLCAnc3BhY2UnLCAncHJlc2VydmUnKVxyXG4gICAgLnR4dCh0ZXh0KVxyXG4gICAgLnVwKCk7XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cclxuY29uc3QgZml4dXBMaW5lSGVpZ2h0ID0gKGxpbmVIZWlnaHQsIGZvbnRTaXplKSA9PiB7XHJcbiAgLy8gRklYTUU6IElmIGxpbmUgaGVpZ2h0IGlzIGFueXRoaW5nIG90aGVyIHRoYW4gYSBudW1iZXJcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXHJcbiAgaWYgKCFpc05hTihsaW5lSGVpZ2h0KSkge1xyXG4gICAgaWYgKGZvbnRTaXplKSB7XHJcbiAgICAgIGNvbnN0IGFjdHVhbExpbmVIZWlnaHQgPSArbGluZUhlaWdodCAqIGZvbnRTaXplO1xyXG5cclxuICAgICAgcmV0dXJuIEhJUFRvVFdJUChhY3R1YWxMaW5lSGVpZ2h0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIDI0MCBUV0lQIG9yIDEyIHBvaW50IGlzIGRlZmF1bHQgbGluZSBoZWlnaHRcclxuICAgICAgcmV0dXJuICtsaW5lSGVpZ2h0ICogMjQwO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyAyNDAgVFdJUCBvciAxMiBwb2ludCBpcyBkZWZhdWx0IGxpbmUgaGVpZ2h0XHJcbiAgICByZXR1cm4gMjQwO1xyXG4gIH1cclxufTtcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxyXG5jb25zdCBmaXh1cEZvbnRTaXplID0gKGZvbnRTaXplU3RyaW5nKSA9PiB7XHJcbiAgaWYgKHBvaW50UmVnZXgudGVzdChmb250U2l6ZVN0cmluZykpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRQYXJ0cyA9IGZvbnRTaXplU3RyaW5nLm1hdGNoKHBvaW50UmVnZXgpO1xyXG4gICAgLy8gY29udmVydCBwb2ludCB0byBoYWxmIHBvaW50XHJcbiAgICByZXR1cm4gcG9pbnRUb0hJUChtYXRjaGVkUGFydHNbMV0pO1xyXG4gIH0gZWxzZSBpZiAocGl4ZWxSZWdleC50ZXN0KGZvbnRTaXplU3RyaW5nKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gZm9udFNpemVTdHJpbmcubWF0Y2gocGl4ZWxSZWdleCk7XHJcbiAgICAvLyBjb252ZXJ0IHBpeGVscyB0byBoYWxmIHBvaW50XHJcbiAgICByZXR1cm4gcGl4ZWxUb0hJUChtYXRjaGVkUGFydHNbMV0pO1xyXG4gIH1cclxufTtcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxyXG5jb25zdCBmaXh1cFJvd0hlaWdodCA9IChyb3dIZWlnaHRTdHJpbmcpID0+IHtcclxuICBpZiAocG9pbnRSZWdleC50ZXN0KHJvd0hlaWdodFN0cmluZykpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRQYXJ0cyA9IHJvd0hlaWdodFN0cmluZy5tYXRjaChwb2ludFJlZ2V4KTtcclxuICAgIC8vIGNvbnZlcnQgcG9pbnQgdG8gaGFsZiBwb2ludFxyXG4gICAgcmV0dXJuIHBvaW50VG9UV0lQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfSBlbHNlIGlmIChwaXhlbFJlZ2V4LnRlc3Qocm93SGVpZ2h0U3RyaW5nKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gcm93SGVpZ2h0U3RyaW5nLm1hdGNoKHBpeGVsUmVnZXgpO1xyXG4gICAgLy8gY29udmVydCBwaXhlbHMgdG8gaGFsZiBwb2ludFxyXG4gICAgcmV0dXJuIHBpeGVsVG9UV0lQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfSBlbHNlIGlmIChjbVJlZ2V4LnRlc3Qocm93SGVpZ2h0U3RyaW5nKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gcm93SGVpZ2h0U3RyaW5nLm1hdGNoKGNtUmVnZXgpO1xyXG4gICAgcmV0dXJuIGNtVG9UV0lQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfSBlbHNlIGlmIChpbmNoUmVnZXgudGVzdChyb3dIZWlnaHRTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSByb3dIZWlnaHRTdHJpbmcubWF0Y2goaW5jaFJlZ2V4KTtcclxuICAgIHJldHVybiBpbmNoVG9UV0lQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfVxyXG59O1xyXG5cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXHJcbmNvbnN0IGZpeHVwQ29sdW1uV2lkdGggPSAoY29sdW1uV2lkdGhTdHJpbmcpID0+IHtcclxuICBpZiAocG9pbnRSZWdleC50ZXN0KGNvbHVtbldpZHRoU3RyaW5nKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gY29sdW1uV2lkdGhTdHJpbmcubWF0Y2gocG9pbnRSZWdleCk7XHJcbiAgICByZXR1cm4gcG9pbnRUb1RXSVAobWF0Y2hlZFBhcnRzWzFdKTtcclxuICB9IGVsc2UgaWYgKHBpeGVsUmVnZXgudGVzdChjb2x1bW5XaWR0aFN0cmluZykpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRQYXJ0cyA9IGNvbHVtbldpZHRoU3RyaW5nLm1hdGNoKHBpeGVsUmVnZXgpO1xyXG4gICAgcmV0dXJuIHBpeGVsVG9UV0lQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfSBlbHNlIGlmIChjbVJlZ2V4LnRlc3QoY29sdW1uV2lkdGhTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBjb2x1bW5XaWR0aFN0cmluZy5tYXRjaChjbVJlZ2V4KTtcclxuICAgIHJldHVybiBjbVRvVFdJUChtYXRjaGVkUGFydHNbMV0pO1xyXG4gIH0gZWxzZSBpZiAoaW5jaFJlZ2V4LnRlc3QoY29sdW1uV2lkdGhTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBjb2x1bW5XaWR0aFN0cmluZy5tYXRjaChpbmNoUmVnZXgpO1xyXG4gICAgcmV0dXJuIGluY2hUb1RXSVAobWF0Y2hlZFBhcnRzWzFdKTtcclxuICB9XHJcbn07XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cclxuY29uc3QgZml4dXBNYXJnaW4gPSAobWFyZ2luU3RyaW5nKSA9PiB7XHJcbiAgaWYgKHBvaW50UmVnZXgudGVzdChtYXJnaW5TdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBtYXJnaW5TdHJpbmcubWF0Y2gocG9pbnRSZWdleCk7XHJcbiAgICAvLyBjb252ZXJ0IHBvaW50IHRvIGhhbGYgcG9pbnRcclxuICAgIHJldHVybiBwb2ludFRvVFdJUChtYXRjaGVkUGFydHNbMV0pO1xyXG4gIH0gZWxzZSBpZiAocGl4ZWxSZWdleC50ZXN0KG1hcmdpblN0cmluZykpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRQYXJ0cyA9IG1hcmdpblN0cmluZy5tYXRjaChwaXhlbFJlZ2V4KTtcclxuICAgIC8vIGNvbnZlcnQgcGl4ZWxzIHRvIGhhbGYgcG9pbnRcclxuICAgIHJldHVybiBwaXhlbFRvVFdJUChtYXRjaGVkUGFydHNbMV0pO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IG1vZGlmaWVkU3R5bGVBdHRyaWJ1dGVzQnVpbGRlciA9ICh2Tm9kZSwgYXR0cmlidXRlcywgb3B0aW9ucykgPT4ge1xyXG4gIGNvbnN0IG1vZGlmaWVkQXR0cmlidXRlcyA9IHsgLi4uYXR0cmlidXRlcyB9O1xyXG5cclxuICAvLyBzdHlsZXNcclxuICBpZiAoaXNWTm9kZSh2Tm9kZSkgJiYgdk5vZGUucHJvcGVydGllcyAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlKSB7XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZS5jb2xvciAmJiAhY29sb3JsZXNzQ29sb3JzLmluY2x1ZGVzKHZOb2RlLnByb3BlcnRpZXMuc3R5bGUuY29sb3IpKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5jb2xvciA9IGZpeHVwQ29sb3JDb2RlKHZOb2RlLnByb3BlcnRpZXMuc3R5bGUuY29sb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYmFja2dyb3VuZC1jb2xvciddICYmXHJcbiAgICAgICFjb2xvcmxlc3NDb2xvcnMuaW5jbHVkZXModk5vZGUucHJvcGVydGllcy5zdHlsZVsnYmFja2dyb3VuZC1jb2xvciddKVxyXG4gICAgKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5iYWNrZ3JvdW5kQ29sb3IgPSBmaXh1cENvbG9yQ29kZShcclxuICAgICAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydiYWNrZ3JvdW5kLWNvbG9yJ11cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ3ZlcnRpY2FsLWFsaWduJ10gJiZcclxuICAgICAgdmVydGljYWxBbGlnblZhbHVlcy5pbmNsdWRlcyh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWyd2ZXJ0aWNhbC1hbGlnbiddKVxyXG4gICAgKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy52ZXJ0aWNhbEFsaWduID0gdk5vZGUucHJvcGVydGllcy5zdHlsZVsndmVydGljYWwtYWxpZ24nXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ3RleHQtYWxpZ24nXSAmJlxyXG4gICAgICBbJ2xlZnQnLCAncmlnaHQnLCAnY2VudGVyJywgJ2p1c3RpZnknXS5pbmNsdWRlcyh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWyd0ZXh0LWFsaWduJ10pXHJcbiAgICApIHtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLnRleHRBbGlnbiA9IHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ3RleHQtYWxpZ24nXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGSVhNRTogcmVtb3ZlIGJvbGQgY2hlY2sgd2hlbiBvdGhlciBmb250IHdlaWdodHMgYXJlIGhhbmRsZWQuXHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZVsnZm9udC13ZWlnaHQnXSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydmb250LXdlaWdodCddID09PSAnYm9sZCcpIHtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLnN0cm9uZyA9IHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2ZvbnQtd2VpZ2h0J107XHJcbiAgICB9XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZVsnZm9udC1zaXplJ10pIHtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLmZvbnRTaXplID0gZml4dXBGb250U2l6ZSh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydmb250LXNpemUnXSk7XHJcbiAgICB9XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZVsnbGluZS1oZWlnaHQnXSkge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMubGluZUhlaWdodCA9IGZpeHVwTGluZUhlaWdodChcclxuICAgICAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydsaW5lLWhlaWdodCddLFxyXG4gICAgICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2ZvbnQtc2l6ZSddXHJcbiAgICAgICAgICA/IGZpeHVwRm9udFNpemUodk5vZGUucHJvcGVydGllcy5zdHlsZVsnZm9udC1zaXplJ10pXHJcbiAgICAgICAgICA6IG51bGxcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydtYXJnaW4tbGVmdCddIHx8IHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ21hcmdpbi1yaWdodCddKSB7XHJcbiAgICAgIGNvbnN0IGxlZnRNYXJnaW4gPSBmaXh1cE1hcmdpbih2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydtYXJnaW4tbGVmdCddKTtcclxuICAgICAgY29uc3QgcmlnaHRNYXJnaW4gPSBmaXh1cE1hcmdpbih2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydtYXJnaW4tcmlnaHQnXSk7XHJcbiAgICAgIGNvbnN0IGluZGVudGF0aW9uID0ge307XHJcbiAgICAgIGlmIChsZWZ0TWFyZ2luKSB7XHJcbiAgICAgICAgaW5kZW50YXRpb24ubGVmdCA9IGxlZnRNYXJnaW47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJpZ2h0TWFyZ2luKSB7XHJcbiAgICAgICAgaW5kZW50YXRpb24ucmlnaHQgPSByaWdodE1hcmdpbjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobGVmdE1hcmdpbiB8fCByaWdodE1hcmdpbikge1xyXG4gICAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5pbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZS5kaXNwbGF5KSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5kaXNwbGF5ID0gdk5vZGUucHJvcGVydGllcy5zdHlsZS5kaXNwbGF5O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLndpZHRoKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy53aWR0aCA9IHZOb2RlLnByb3BlcnRpZXMuc3R5bGUud2lkdGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwYXJhZ3JhcGggb25seVxyXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaXNQYXJhZ3JhcGgpIHtcclxuICAgIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS50YWdOYW1lID09PSAnYmxvY2txdW90ZScpIHtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLmluZGVudGF0aW9uID0geyBsZWZ0OiAyODQgfTtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLnRleHRBbGlnbiA9ICdqdXN0aWZ5JztcclxuICAgIH0gZWxzZSBpZiAoaXNWTm9kZSh2Tm9kZSkgJiYgdk5vZGUudGFnTmFtZSA9PT0gJ2NvZGUnKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5oaWdobGlnaHRDb2xvciA9ICdsaWdodEdyYXknO1xyXG4gICAgfSBlbHNlIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS50YWdOYW1lID09PSAncHJlJykge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMuZm9udCA9ICdDb3VyaWVyJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBtb2RpZmllZEF0dHJpYnV0ZXM7XHJcbn07XHJcblxyXG4vLyBodG1sIHRhZyB0byBmb3JtYXR0aW5nIGZ1bmN0aW9uXHJcbi8vIG9wdGlvbnMgYXJlIHBhc3NlZCB0byB0aGUgZm9ybWF0dGluZyBmdW5jdGlvbiBpZiBuZWVkZWRcclxuY29uc3QgYnVpbGRGb3JtYXR0aW5nID0gKGh0bWxUYWcsIG9wdGlvbnMpID0+IHtcclxuICBzd2l0Y2ggKGh0bWxUYWcpIHtcclxuICAgIGNhc2UgJ3N0cm9uZyc6XHJcbiAgICBjYXNlICdiJzpcclxuICAgICAgcmV0dXJuIGJ1aWxkQm9sZCgpO1xyXG4gICAgY2FzZSAnZW0nOlxyXG4gICAgY2FzZSAnaSc6XHJcbiAgICAgIHJldHVybiBidWlsZEl0YWxpY3MoKTtcclxuICAgIGNhc2UgJ2lucyc6XHJcbiAgICBjYXNlICd1JzpcclxuICAgICAgcmV0dXJuIGJ1aWxkVW5kZXJsaW5lKCk7XHJcbiAgICBjYXNlICdzdHJpa2UnOlxyXG4gICAgY2FzZSAnZGVsJzpcclxuICAgIGNhc2UgJ3MnOlxyXG4gICAgICByZXR1cm4gYnVpbGRTdHJpa2UoKTtcclxuICAgIGNhc2UgJ3N1Yic6XHJcbiAgICAgIHJldHVybiBidWlsZFZlcnRBbGlnbignc3Vic2NyaXB0Jyk7XHJcbiAgICBjYXNlICdzdXAnOlxyXG4gICAgICByZXR1cm4gYnVpbGRWZXJ0QWxpZ24oJ3N1cGVyc2NyaXB0Jyk7XHJcbiAgICBjYXNlICdtYXJrJzpcclxuICAgICAgcmV0dXJuIGJ1aWxkSGlnaGxpZ2h0KCk7XHJcbiAgICBjYXNlICdjb2RlJzpcclxuICAgICAgcmV0dXJuIGJ1aWxkSGlnaGxpZ2h0KCdsaWdodEdyYXknKTtcclxuICAgIGNhc2UgJ2hpZ2hsaWdodENvbG9yJzpcclxuICAgICAgcmV0dXJuIGJ1aWxkSGlnaGxpZ2h0KG9wdGlvbnMgJiYgb3B0aW9ucy5jb2xvciA/IG9wdGlvbnMuY29sb3IgOiAnbGlnaHRHcmF5Jyk7XHJcbiAgICBjYXNlICdmb250JzpcclxuICAgIGNhc2UgJ3ByZSc6XHJcbiAgICAgIHJldHVybiBidWlsZFJ1bkZvbnRGcmFnbWVudCgnQ291cmllcicpO1xyXG4gICAgY2FzZSAnY29sb3InOlxyXG4gICAgICByZXR1cm4gYnVpbGRDb2xvcihvcHRpb25zICYmIG9wdGlvbnMuY29sb3IgPyBvcHRpb25zLmNvbG9yIDogJ2JsYWNrJyk7XHJcbiAgICBjYXNlICdiYWNrZ3JvdW5kQ29sb3InOlxyXG4gICAgICByZXR1cm4gYnVpbGRTaGFkaW5nKG9wdGlvbnMgJiYgb3B0aW9ucy5jb2xvciA/IG9wdGlvbnMuY29sb3IgOiAnYmxhY2snKTtcclxuICAgIGNhc2UgJ2ZvbnRTaXplJzpcclxuICAgICAgLy8gZG9lcyB0aGlzIG5lZWQgYSB1bml0IG9mIG1lYXN1cmU/XHJcbiAgICAgIHJldHVybiBidWlsZEZvbnRTaXplKG9wdGlvbnMgJiYgb3B0aW9ucy5mb250U2l6ZSA/IG9wdGlvbnMuZm9udFNpemUgOiAxMCk7XHJcbiAgICBjYXNlICdoeXBlcmxpbmsnOlxyXG4gICAgICByZXR1cm4gYnVpbGRSdW5TdHlsZUZyYWdtZW50KCdIeXBlcmxpbmsnKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRSdW5Qcm9wZXJ0aWVzID0gKGF0dHJpYnV0ZXMpID0+IHtcclxuICBjb25zdCBydW5Qcm9wZXJ0aWVzRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAnclByJyk7XHJcbiAgaWYgKGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XHJcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xyXG4gICAgICBpZiAoa2V5ID09PSAnY29sb3InIHx8IGtleSA9PT0gJ2JhY2tncm91bmRDb2xvcicgfHwga2V5ID09PSAnaGlnaGxpZ2h0Q29sb3InKSB7XHJcbiAgICAgICAgb3B0aW9ucy5jb2xvciA9IGF0dHJpYnV0ZXNba2V5XTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGtleSA9PT0gJ2ZvbnRTaXplJykge1xyXG4gICAgICAgIG9wdGlvbnMuZm9udFNpemUgPSBhdHRyaWJ1dGVzW2tleV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGZvcm1hdHRpbmdGcmFnbWVudCA9IGJ1aWxkRm9ybWF0dGluZyhrZXksIG9wdGlvbnMpO1xyXG4gICAgICBpZiAoZm9ybWF0dGluZ0ZyYWdtZW50KSB7XHJcbiAgICAgICAgcnVuUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydChmb3JtYXR0aW5nRnJhZ21lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcnVuUHJvcGVydGllc0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBydW5Qcm9wZXJ0aWVzRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFJ1biA9IGFzeW5jICh2Tm9kZSwgYXR0cmlidXRlcywgZG9jeERvY3VtZW50SW5zdGFuY2UpID0+IHtcclxuICBjb25zdCBydW5GcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICdyJyk7XHJcbiAgY29uc3QgcnVuUHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGRSdW5Qcm9wZXJ0aWVzKGNsb25lRGVlcChhdHRyaWJ1dGVzKSk7XHJcblxyXG4gIC8vIGNhc2Ugd2hlcmUgd2UgaGF2ZSByZWN1cnNpdmUgc3BhbnMgcmVwcmVzZW50aW5nIGZvbnQgY2hhbmdlc1xyXG4gIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS50YWdOYW1lID09PSAnc3BhbicpIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gICAgcmV0dXJuIGJ1aWxkUnVuT3JSdW5zKHZOb2RlLCBhdHRyaWJ1dGVzLCBkb2N4RG9jdW1lbnRJbnN0YW5jZSk7XHJcbiAgfVxyXG5cclxuICBpZiAoXHJcbiAgICBpc1ZOb2RlKHZOb2RlKSAmJlxyXG4gICAgW1xyXG4gICAgICAnc3Ryb25nJyxcclxuICAgICAgJ2InLFxyXG4gICAgICAnZW0nLFxyXG4gICAgICAnaScsXHJcbiAgICAgICd1JyxcclxuICAgICAgJ2lucycsXHJcbiAgICAgICdzdHJpa2UnLFxyXG4gICAgICAnZGVsJyxcclxuICAgICAgJ3MnLFxyXG4gICAgICAnc3ViJyxcclxuICAgICAgJ3N1cCcsXHJcbiAgICAgICdtYXJrJyxcclxuICAgICAgJ2Jsb2NrcXVvdGUnLFxyXG4gICAgICAnY29kZScsXHJcbiAgICAgICdwcmUnLFxyXG4gICAgXS5pbmNsdWRlcyh2Tm9kZS50YWdOYW1lKVxyXG4gICkge1xyXG4gICAgY29uc3QgcnVuRnJhZ21lbnRzQXJyYXkgPSBbXTtcclxuXHJcbiAgICBsZXQgdk5vZGVzID0gW3ZOb2RlXTtcclxuICAgIC8vIGNyZWF0ZSB0ZW1wIHJ1biBmcmFnbWVudHMgdG8gc3BsaXQgdGhlIHBhcmFncmFwaCBpbnRvIGRpZmZlcmVudCBydW5zXHJcbiAgICBsZXQgdGVtcEF0dHJpYnV0ZXMgPSBjbG9uZURlZXAoYXR0cmlidXRlcyk7XHJcbiAgICBsZXQgdGVtcFJ1bkZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoJ0B3JywgJ3InKTtcclxuICAgIHdoaWxlICh2Tm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IHRlbXBWTm9kZSA9IHZOb2Rlcy5zaGlmdCgpO1xyXG4gICAgICBpZiAoaXNWVGV4dCh0ZW1wVk5vZGUpKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dEZyYWdtZW50ID0gYnVpbGRUZXh0RWxlbWVudCh0ZW1wVk5vZGUudGV4dCk7XHJcbiAgICAgICAgY29uc3QgdGVtcFJ1blByb3BlcnRpZXNGcmFnbWVudCA9IGJ1aWxkUnVuUHJvcGVydGllcyh7IC4uLmF0dHJpYnV0ZXMsIC4uLnRlbXBBdHRyaWJ1dGVzIH0pO1xyXG4gICAgICAgIHRlbXBSdW5GcmFnbWVudC5pbXBvcnQodGVtcFJ1blByb3BlcnRpZXNGcmFnbWVudCk7XHJcbiAgICAgICAgdGVtcFJ1bkZyYWdtZW50LmltcG9ydCh0ZXh0RnJhZ21lbnQpO1xyXG4gICAgICAgIHJ1bkZyYWdtZW50c0FycmF5LnB1c2godGVtcFJ1bkZyYWdtZW50KTtcclxuXHJcbiAgICAgICAgLy8gcmUgaW5pdGlhbGl6ZSB0ZW1wIHJ1biBmcmFnbWVudHMgd2l0aCBuZXcgZnJhZ21lbnRcclxuICAgICAgICB0ZW1wQXR0cmlidXRlcyA9IGNsb25lRGVlcChhdHRyaWJ1dGVzKTtcclxuICAgICAgICB0ZW1wUnVuRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAncicpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzVk5vZGUodGVtcFZOb2RlKSkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIFtcclxuICAgICAgICAgICAgJ3N0cm9uZycsXHJcbiAgICAgICAgICAgICdiJyxcclxuICAgICAgICAgICAgJ2VtJyxcclxuICAgICAgICAgICAgJ2knLFxyXG4gICAgICAgICAgICAndScsXHJcbiAgICAgICAgICAgICdpbnMnLFxyXG4gICAgICAgICAgICAnc3RyaWtlJyxcclxuICAgICAgICAgICAgJ2RlbCcsXHJcbiAgICAgICAgICAgICdzJyxcclxuICAgICAgICAgICAgJ3N1YicsXHJcbiAgICAgICAgICAgICdzdXAnLFxyXG4gICAgICAgICAgICAnbWFyaycsXHJcbiAgICAgICAgICAgICdjb2RlJyxcclxuICAgICAgICAgICAgJ3ByZScsXHJcbiAgICAgICAgICBdLmluY2x1ZGVzKHRlbXBWTm9kZS50YWdOYW1lKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGVtcEF0dHJpYnV0ZXMgPSB7fTtcclxuICAgICAgICAgIHN3aXRjaCAodGVtcFZOb2RlLnRhZ05hbWUpIHtcclxuICAgICAgICAgICAgY2FzZSAnc3Ryb25nJzpcclxuICAgICAgICAgICAgY2FzZSAnYic6XHJcbiAgICAgICAgICAgICAgdGVtcEF0dHJpYnV0ZXMuc3Ryb25nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnaSc6XHJcbiAgICAgICAgICAgICAgdGVtcEF0dHJpYnV0ZXMuaSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3UnOlxyXG4gICAgICAgICAgICAgIHRlbXBBdHRyaWJ1dGVzLnUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdzdWInOlxyXG4gICAgICAgICAgICAgIHRlbXBBdHRyaWJ1dGVzLnN1YiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3N1cCc6XHJcbiAgICAgICAgICAgICAgdGVtcEF0dHJpYnV0ZXMuc3VwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IGZvcm1hdHRpbmdGcmFnbWVudCA9IGJ1aWxkRm9ybWF0dGluZyh0ZW1wVk5vZGUpO1xyXG5cclxuICAgICAgICAgIGlmIChmb3JtYXR0aW5nRnJhZ21lbnQpIHtcclxuICAgICAgICAgICAgcnVuUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydChmb3JtYXR0aW5nRnJhZ21lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZ28gYSBsYXllciBkZWVwZXIgaWYgdGhlcmUgaXMgYSBzcGFuIHNvbWV3aGVyZSBpbiB0aGUgY2hpbGRyZW5cclxuICAgICAgICB9IGVsc2UgaWYgKHRlbXBWTm9kZS50YWdOYW1lID09PSAnc3BhbicpIHtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gICAgICAgICAgY29uc3Qgc3BhbkZyYWdtZW50ID0gYXdhaXQgYnVpbGRSdW5PclJ1bnMoXHJcbiAgICAgICAgICAgIHRlbXBWTm9kZSxcclxuICAgICAgICAgICAgeyAuLi5hdHRyaWJ1dGVzLCAuLi50ZW1wQXR0cmlidXRlcyB9LFxyXG4gICAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAvLyBpZiBzcGFuRnJhZ21lbnQgaXMgYW4gYXJyYXksIHdlIG5lZWQgdG8gYWRkIGVhY2ggZnJhZ21lbnQgdG8gdGhlIHJ1bkZyYWdtZW50c0FycmF5LiBJZiB0aGUgZnJhZ21lbnQgaXMgYW4gYXJyYXksIHBlcmZvcm0gYSBkZXB0aCBmaXJzdCBzZWFyY2ggb24gdGhlIGFycmF5IHRvIGFkZCBlYWNoIGZyYWdtZW50IHRvIHRoZSBydW5GcmFnbWVudHNBcnJheVxyXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3BhbkZyYWdtZW50KSkge1xyXG4gICAgICAgICAgICBzcGFuRnJhZ21lbnQuZmxhdChJbmZpbml0eSk7XHJcbiAgICAgICAgICAgIHJ1bkZyYWdtZW50c0FycmF5LnB1c2goLi4uc3BhbkZyYWdtZW50KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJ1bkZyYWdtZW50c0FycmF5LnB1c2goc3BhbkZyYWdtZW50KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBkbyBub3Qgc2xpY2UgYW5kIGNvbmNhdCBjaGlsZHJlbiBzaW5jZSB0aGlzIGlzIGFscmVhZHkgYWNjb3VudGVkIGZvciBpbiB0aGUgYnVpbGRSdW5PclJ1bnMgZnVuY3Rpb25cclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGVtcFZOb2RlLmNoaWxkcmVuICYmIHRlbXBWTm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgICBpZiAodGVtcFZOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZXMgPSB7IC4uLmF0dHJpYnV0ZXMsIC4uLnRlbXBBdHRyaWJ1dGVzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2Tm9kZXMgPSB0ZW1wVk5vZGUuY2hpbGRyZW4uc2xpY2UoKS5jb25jYXQodk5vZGVzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHJ1bkZyYWdtZW50c0FycmF5Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gcnVuRnJhZ21lbnRzQXJyYXk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBydW5GcmFnbWVudC5pbXBvcnQocnVuUHJvcGVydGllc0ZyYWdtZW50KTtcclxuICBpZiAoaXNWVGV4dCh2Tm9kZSkpIHtcclxuICAgIGNvbnN0IHRleHRGcmFnbWVudCA9IGJ1aWxkVGV4dEVsZW1lbnQodk5vZGUudGV4dCk7XHJcbiAgICBydW5GcmFnbWVudC5pbXBvcnQodGV4dEZyYWdtZW50KTtcclxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy50eXBlID09PSAncGljdHVyZScpIHtcclxuICAgIGxldCByZXNwb25zZSA9IG51bGw7XHJcblxyXG4gICAgY29uc3QgYmFzZTY0VXJpID0gZGVjb2RlVVJJQ29tcG9uZW50KHZOb2RlLnByb3BlcnRpZXMuc3JjKTtcclxuICAgIGlmIChiYXNlNjRVcmkpIHtcclxuICAgICAgcmVzcG9uc2UgPSBkb2N4RG9jdW1lbnRJbnN0YW5jZS5jcmVhdGVNZWRpYUZpbGUoYmFzZTY0VXJpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgZG9jeERvY3VtZW50SW5zdGFuY2UuemlwXHJcbiAgICAgICAgLmZvbGRlcignd29yZCcpXHJcbiAgICAgICAgLmZvbGRlcignbWVkaWEnKVxyXG4gICAgICAgIC5maWxlKHJlc3BvbnNlLmZpbGVOYW1lV2l0aEV4dGVuc2lvbiwgQnVmZmVyLmZyb20ocmVzcG9uc2UuZmlsZUNvbnRlbnQsICdiYXNlNjQnKSwge1xyXG4gICAgICAgICAgY3JlYXRlRm9sZGVyczogZmFsc2UsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBkb2N1bWVudFJlbHNJZCA9IGRvY3hEb2N1bWVudEluc3RhbmNlLmNyZWF0ZURvY3VtZW50UmVsYXRpb25zaGlwcyhcclxuICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZS5yZWxhdGlvbnNoaXBGaWxlbmFtZSxcclxuICAgICAgICBpbWFnZVR5cGUsXHJcbiAgICAgICAgYG1lZGlhLyR7cmVzcG9uc2UuZmlsZU5hbWVXaXRoRXh0ZW5zaW9ufWAsXHJcbiAgICAgICAgaW50ZXJuYWxSZWxhdGlvbnNoaXBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGF0dHJpYnV0ZXMuaW5saW5lT3JBbmNob3JlZCA9IHRydWU7XHJcbiAgICAgIGF0dHJpYnV0ZXMucmVsYXRpb25zaGlwSWQgPSBkb2N1bWVudFJlbHNJZDtcclxuICAgICAgYXR0cmlidXRlcy5pZCA9IHJlc3BvbnNlLmlkO1xyXG4gICAgICBhdHRyaWJ1dGVzLmZpbGVDb250ZW50ID0gcmVzcG9uc2UuZmlsZUNvbnRlbnQ7XHJcbiAgICAgIGF0dHJpYnV0ZXMuZmlsZU5hbWVXaXRoRXh0ZW5zaW9uID0gcmVzcG9uc2UuZmlsZU5hbWVXaXRoRXh0ZW5zaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHsgdHlwZSwgaW5saW5lT3JBbmNob3JlZCwgLi4ub3RoZXJBdHRyaWJ1dGVzIH0gPSBhdHRyaWJ1dGVzO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXHJcbiAgICBjb25zdCBpbWFnZUZyYWdtZW50ID0gYnVpbGREcmF3aW5nKGlubGluZU9yQW5jaG9yZWQsIHR5cGUsIG90aGVyQXR0cmlidXRlcyk7XHJcbiAgICBydW5GcmFnbWVudC5pbXBvcnQoaW1hZ2VGcmFnbWVudCk7XHJcbiAgfSBlbHNlIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS50YWdOYW1lID09PSAnYnInKSB7XHJcbiAgICBjb25zdCBsaW5lQnJlYWtGcmFnbWVudCA9IGJ1aWxkTGluZUJyZWFrKCk7XHJcbiAgICBydW5GcmFnbWVudC5pbXBvcnQobGluZUJyZWFrRnJhZ21lbnQpO1xyXG4gIH1cclxuICBydW5GcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gcnVuRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFJ1bk9yUnVucyA9IGFzeW5jICh2Tm9kZSwgYXR0cmlidXRlcywgZG9jeERvY3VtZW50SW5zdGFuY2UpID0+IHtcclxuICBpZiAoaXNWTm9kZSh2Tm9kZSkgJiYgdk5vZGUudGFnTmFtZSA9PT0gJ3NwYW4nKSB7XHJcbiAgICBsZXQgcnVuRnJhZ21lbnRzID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZOb2RlLmNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBjaGlsZFZOb2RlID0gdk5vZGUuY2hpbGRyZW5baW5kZXhdO1xyXG4gICAgICBjb25zdCBtb2RpZmllZEF0dHJpYnV0ZXMgPSBtb2RpZmllZFN0eWxlQXR0cmlidXRlc0J1aWxkZXIodk5vZGUsIGF0dHJpYnV0ZXMpO1xyXG4gICAgICBjb25zdCB0ZW1wUnVuRnJhZ21lbnRzID0gYXdhaXQgYnVpbGRSdW4oY2hpbGRWTm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzLCBkb2N4RG9jdW1lbnRJbnN0YW5jZSk7XHJcbiAgICAgIHJ1bkZyYWdtZW50cyA9IHJ1bkZyYWdtZW50cy5jb25jYXQoXHJcbiAgICAgICAgQXJyYXkuaXNBcnJheSh0ZW1wUnVuRnJhZ21lbnRzKSA/IHRlbXBSdW5GcmFnbWVudHMgOiBbdGVtcFJ1bkZyYWdtZW50c11cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcnVuRnJhZ21lbnRzO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCB0ZW1wUnVuRnJhZ21lbnRzID0gYXdhaXQgYnVpbGRSdW4odk5vZGUsIGF0dHJpYnV0ZXMsIGRvY3hEb2N1bWVudEluc3RhbmNlKTtcclxuICAgIHJldHVybiB0ZW1wUnVuRnJhZ21lbnRzO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkUnVuT3JIeXBlckxpbmsgPSBhc3luYyAodk5vZGUsIGF0dHJpYnV0ZXMsIGRvY3hEb2N1bWVudEluc3RhbmNlKSA9PiB7XHJcbiAgaWYgKGlzVk5vZGUodk5vZGUpICYmIHZOb2RlLnRhZ05hbWUgPT09ICdhJykge1xyXG4gICAgY29uc3QgcmVsYXRpb25zaGlwSWQgPSBkb2N4RG9jdW1lbnRJbnN0YW5jZS5jcmVhdGVEb2N1bWVudFJlbGF0aW9uc2hpcHMoXHJcbiAgICAgIGRvY3hEb2N1bWVudEluc3RhbmNlLnJlbGF0aW9uc2hpcEZpbGVuYW1lLFxyXG4gICAgICBoeXBlcmxpbmtUeXBlLFxyXG4gICAgICB2Tm9kZS5wcm9wZXJ0aWVzICYmIHZOb2RlLnByb3BlcnRpZXMuaHJlZiA/IHZOb2RlLnByb3BlcnRpZXMuaHJlZiA6ICcnXHJcbiAgICApO1xyXG4gICAgY29uc3QgaHlwZXJsaW5rRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudywgcjogbmFtZXNwYWNlcy5yIH0gfSlcclxuICAgICAgLmVsZSgnQHcnLCAnaHlwZXJsaW5rJylcclxuICAgICAgLmF0dCgnQHInLCAnaWQnLCBgcklkJHtyZWxhdGlvbnNoaXBJZH1gKTtcclxuXHJcbiAgICBjb25zdCBtb2RpZmllZEF0dHJpYnV0ZXMgPSB7IC4uLmF0dHJpYnV0ZXMgfTtcclxuICAgIG1vZGlmaWVkQXR0cmlidXRlcy5oeXBlcmxpbmsgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IHJ1bkZyYWdtZW50cyA9IGF3YWl0IGJ1aWxkUnVuT3JSdW5zKFxyXG4gICAgICB2Tm9kZS5jaGlsZHJlblswXSxcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLFxyXG4gICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgKTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHJ1bkZyYWdtZW50cykpIHtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJ1bkZyYWdtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBydW5GcmFnbWVudCA9IHJ1bkZyYWdtZW50c1tpbmRleF07XHJcblxyXG4gICAgICAgIGh5cGVybGlua0ZyYWdtZW50LmltcG9ydChydW5GcmFnbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGh5cGVybGlua0ZyYWdtZW50LmltcG9ydChydW5GcmFnbWVudHMpO1xyXG4gICAgfVxyXG4gICAgaHlwZXJsaW5rRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgICByZXR1cm4gaHlwZXJsaW5rRnJhZ21lbnQ7XHJcbiAgfVxyXG5cclxuICBjb25zdCBydW5GcmFnbWVudHMgPSBhd2FpdCBidWlsZFJ1bk9yUnVucyh2Tm9kZSwgYXR0cmlidXRlcywgZG9jeERvY3VtZW50SW5zdGFuY2UpO1xyXG5cclxuICByZXR1cm4gcnVuRnJhZ21lbnRzO1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGROdW1iZXJpbmdQcm9wZXJ0aWVzID0gKGxldmVsSWQsIG51bWJlcmluZ0lkKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ251bVByJylcclxuICAgIC5lbGUoJ0B3JywgJ2lsdmwnKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgU3RyaW5nKGxldmVsSWQpKVxyXG4gICAgLnVwKClcclxuICAgIC5lbGUoJ0B3JywgJ251bUlkJylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIFN0cmluZyhudW1iZXJpbmdJZCkpXHJcbiAgICAudXAoKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZE51bWJlcmluZ0luc3RhbmNlcyA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnbnVtJylcclxuICAgIC5lbGUoJ0B3JywgJ2Fic3RyYWN0TnVtSWQnKVxyXG4gICAgLnVwKClcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRTcGFjaW5nID0gKGxpbmVTcGFjaW5nLCBiZWZvcmVTcGFjaW5nLCBhZnRlclNwYWNpbmcpID0+IHtcclxuICBjb25zdCBzcGFjaW5nRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAnc3BhY2luZycpO1xyXG5cclxuICBpZiAobGluZVNwYWNpbmcpIHtcclxuICAgIHNwYWNpbmdGcmFnbWVudC5hdHQoJ0B3JywgJ2xpbmUnLCBsaW5lU3BhY2luZyk7XHJcbiAgfVxyXG4gIGlmIChiZWZvcmVTcGFjaW5nKSB7XHJcbiAgICBzcGFjaW5nRnJhZ21lbnQuYXR0KCdAdycsICdiZWZvcmUnLCBiZWZvcmVTcGFjaW5nKTtcclxuICB9XHJcbiAgaWYgKGFmdGVyU3BhY2luZykge1xyXG4gICAgc3BhY2luZ0ZyYWdtZW50LmF0dCgnQHcnLCAnYWZ0ZXInLCBhZnRlclNwYWNpbmcpO1xyXG4gIH1cclxuXHJcbiAgc3BhY2luZ0ZyYWdtZW50LmF0dCgnQHcnLCAnbGluZVJ1bGUnLCAnYXV0bycpLnVwKCk7XHJcblxyXG4gIHJldHVybiBzcGFjaW5nRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZEluZGVudGF0aW9uID0gKHsgbGVmdCwgcmlnaHQgfSkgPT4ge1xyXG4gIGNvbnN0IGluZGVudGF0aW9uRnJhZ21lbnQgPSBmcmFnbWVudCh7XHJcbiAgICBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSxcclxuICB9KS5lbGUoJ0B3JywgJ2luZCcpO1xyXG5cclxuICBpZiAobGVmdCkge1xyXG4gICAgaW5kZW50YXRpb25GcmFnbWVudC5hdHQoJ0B3JywgJ2xlZnQnLCBsZWZ0KTtcclxuICB9XHJcbiAgaWYgKHJpZ2h0KSB7XHJcbiAgICBpbmRlbnRhdGlvbkZyYWdtZW50LmF0dCgnQHcnLCAncmlnaHQnLCByaWdodCk7XHJcbiAgfVxyXG5cclxuICBpbmRlbnRhdGlvbkZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBpbmRlbnRhdGlvbkZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRQU3R5bGUgPSAoc3R5bGUgPSAnTm9ybWFsJykgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICdwU3R5bGUnKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgc3R5bGUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkSG9yaXpvbnRhbEFsaWdubWVudCA9IChob3Jpem9udGFsQWxpZ25tZW50KSA9PiB7XHJcbiAgaWYgKGhvcml6b250YWxBbGlnbm1lbnQgPT09ICdqdXN0aWZ5Jykge1xyXG4gICAgaG9yaXpvbnRhbEFsaWdubWVudCA9ICdib3RoJztcclxuICB9XHJcbiAgcmV0dXJuIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ2pjJylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIGhvcml6b250YWxBbGlnbm1lbnQpXHJcbiAgICAudXAoKTtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkUGFyYWdyYXBoQm9yZGVyID0gKCkgPT4ge1xyXG4gIGNvbnN0IHBhcmFncmFwaEJvcmRlckZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3BCZHInXHJcbiAgKTtcclxuICBjb25zdCBib3JkZXJzT2JqZWN0ID0gY2xvbmVEZWVwKHBhcmFncmFwaEJvcmRlcnNPYmplY3QpO1xyXG5cclxuICBPYmplY3Qua2V5cyhib3JkZXJzT2JqZWN0KS5mb3JFYWNoKChib3JkZXJOYW1lKSA9PiB7XHJcbiAgICBpZiAoYm9yZGVyc09iamVjdFtib3JkZXJOYW1lXSkge1xyXG4gICAgICBjb25zdCB7IHNpemUsIHNwYWNpbmcsIGNvbG9yIH0gPSBib3JkZXJzT2JqZWN0W2JvcmRlck5hbWVdO1xyXG5cclxuICAgICAgY29uc3QgYm9yZGVyRnJhZ21lbnQgPSBidWlsZEJvcmRlcihib3JkZXJOYW1lLCBzaXplLCBzcGFjaW5nLCBjb2xvcik7XHJcbiAgICAgIHBhcmFncmFwaEJvcmRlckZyYWdtZW50LmltcG9ydChib3JkZXJGcmFnbWVudCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHBhcmFncmFwaEJvcmRlckZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBwYXJhZ3JhcGhCb3JkZXJGcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkUGFyYWdyYXBoUHJvcGVydGllcyA9IChhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgcGFyYWdyYXBoUHJvcGVydGllc0ZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3BQcidcclxuICApO1xyXG4gIGlmIChhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xyXG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgY2FzZSAnbnVtYmVyaW5nJzpcclxuICAgICAgICAgIGNvbnN0IHsgbGV2ZWxJZCwgbnVtYmVyaW5nSWQgfSA9IGF0dHJpYnV0ZXNba2V5XTtcclxuICAgICAgICAgIGNvbnN0IG51bWJlcmluZ1Byb3BlcnRpZXNGcmFnbWVudCA9IGJ1aWxkTnVtYmVyaW5nUHJvcGVydGllcyhsZXZlbElkLCBudW1iZXJpbmdJZCk7XHJcbiAgICAgICAgICBwYXJhZ3JhcGhQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KG51bWJlcmluZ1Byb3BlcnRpZXNGcmFnbWVudCk7XHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLm51bWJlcmluZztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RleHRBbGlnbic6XHJcbiAgICAgICAgICBjb25zdCBob3Jpem9udGFsQWxpZ25tZW50RnJhZ21lbnQgPSBidWlsZEhvcml6b250YWxBbGlnbm1lbnQoYXR0cmlidXRlc1trZXldKTtcclxuICAgICAgICAgIHBhcmFncmFwaFByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQoaG9yaXpvbnRhbEFsaWdubWVudEZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMudGV4dEFsaWduO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnYmFja2dyb3VuZENvbG9yJzpcclxuICAgICAgICAgIC8vIEFkZCBzaGFkaW5nIHRvIFBhcmFncmFwaCBQcm9wZXJ0aWVzIG9ubHkgaWYgZGlzcGxheSBpcyBibG9ja1xyXG4gICAgICAgICAgLy8gRXNzZW50aWFsbHkgaWYgYmFja2dyb3VuZCBjb2xvciBuZWVkcyB0byBiZSBhY3Jvc3MgdGhlIHJvd1xyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZGlzcGxheSA9PT0gJ2Jsb2NrJykge1xyXG4gICAgICAgICAgICBjb25zdCBzaGFkaW5nRnJhZ21lbnQgPSBidWlsZFNoYWRpbmcoYXR0cmlidXRlc1trZXldKTtcclxuICAgICAgICAgICAgcGFyYWdyYXBoUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydChzaGFkaW5nRnJhZ21lbnQpO1xyXG4gICAgICAgICAgICAvLyBGSVhNRTogSW5uZXIgcGFkZGluZyBpbiBjYXNlIG9mIHNoYWRlZCBwYXJhZ3JhcGhzLlxyXG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhCb3JkZXJGcmFnbWVudCA9IGJ1aWxkUGFyYWdyYXBoQm9yZGVyKCk7XHJcbiAgICAgICAgICAgIHBhcmFncmFwaFByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQocGFyYWdyYXBoQm9yZGVyRnJhZ21lbnQpO1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuYmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAncGFyYWdyYXBoU3R5bGUnOlxyXG4gICAgICAgICAgY29uc3QgcFN0eWxlRnJhZ21lbnQgPSBidWlsZFBTdHlsZShhdHRyaWJ1dGVzLnBhcmFncmFwaFN0eWxlKTtcclxuICAgICAgICAgIHBhcmFncmFwaFByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQocFN0eWxlRnJhZ21lbnQpO1xyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMucGFyYWdyYXBoU3R5bGU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdpbmRlbnRhdGlvbic6XHJcbiAgICAgICAgICBjb25zdCBpbmRlbnRhdGlvbkZyYWdtZW50ID0gYnVpbGRJbmRlbnRhdGlvbihhdHRyaWJ1dGVzW2tleV0pO1xyXG4gICAgICAgICAgcGFyYWdyYXBoUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydChpbmRlbnRhdGlvbkZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuaW5kZW50YXRpb247XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc3BhY2luZ0ZyYWdtZW50ID0gYnVpbGRTcGFjaW5nKFxyXG4gICAgICBhdHRyaWJ1dGVzLmxpbmVIZWlnaHQsXHJcbiAgICAgIGF0dHJpYnV0ZXMuYmVmb3JlU3BhY2luZyxcclxuICAgICAgYXR0cmlidXRlcy5hZnRlclNwYWNpbmdcclxuICAgICk7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLmxpbmVIZWlnaHQ7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLmJlZm9yZVNwYWNpbmc7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLmFmdGVyU3BhY2luZztcclxuXHJcbiAgICBwYXJhZ3JhcGhQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KHNwYWNpbmdGcmFnbWVudCk7XHJcbiAgfVxyXG4gIHBhcmFncmFwaFByb3BlcnRpZXNGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gcGFyYWdyYXBoUHJvcGVydGllc0ZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgY29tcHV0ZUltYWdlRGltZW5zaW9ucyA9ICh2Tm9kZSwgYXR0cmlidXRlcykgPT4ge1xyXG4gIGNvbnN0IHsgbWF4aW11bVdpZHRoLCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCB9ID0gYXR0cmlidXRlcztcclxuICBjb25zdCBhc3BlY3RSYXRpbyA9IG9yaWdpbmFsV2lkdGggLyBvcmlnaW5hbEhlaWdodDtcclxuICBjb25zdCBtYXhpbXVtV2lkdGhJbkVNVSA9IFRXSVBUb0VNVShtYXhpbXVtV2lkdGgpO1xyXG4gIGxldCBvcmlnaW5hbFdpZHRoSW5FTVUgPSBwaXhlbFRvRU1VKG9yaWdpbmFsV2lkdGgpO1xyXG4gIGxldCBvcmlnaW5hbEhlaWdodEluRU1VID0gcGl4ZWxUb0VNVShvcmlnaW5hbEhlaWdodCk7XHJcbiAgaWYgKG9yaWdpbmFsV2lkdGhJbkVNVSA+IG1heGltdW1XaWR0aEluRU1VKSB7XHJcbiAgICBvcmlnaW5hbFdpZHRoSW5FTVUgPSBtYXhpbXVtV2lkdGhJbkVNVTtcclxuICAgIG9yaWdpbmFsSGVpZ2h0SW5FTVUgPSBNYXRoLnJvdW5kKG9yaWdpbmFsV2lkdGhJbkVNVSAvIGFzcGVjdFJhdGlvKTtcclxuICB9XHJcbiAgbGV0IG1vZGlmaWVkSGVpZ2h0O1xyXG4gIGxldCBtb2RpZmllZFdpZHRoO1xyXG5cclxuICBpZiAodk5vZGUucHJvcGVydGllcyAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlKSB7XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZS53aWR0aCkge1xyXG4gICAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZS53aWR0aCAhPT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgaWYgKHBpeGVsUmVnZXgudGVzdCh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLndpZHRoKSkge1xyXG4gICAgICAgICAgbW9kaWZpZWRXaWR0aCA9IHBpeGVsVG9FTVUodk5vZGUucHJvcGVydGllcy5zdHlsZS53aWR0aC5tYXRjaChwaXhlbFJlZ2V4KVsxXSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50YWdlUmVnZXgudGVzdCh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLndpZHRoKSkge1xyXG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZVZhbHVlID0gdk5vZGUucHJvcGVydGllcy5zdHlsZS53aWR0aC5tYXRjaChwZXJjZW50YWdlUmVnZXgpWzFdO1xyXG5cclxuICAgICAgICAgIG1vZGlmaWVkV2lkdGggPSBNYXRoLnJvdW5kKChwZXJjZW50YWdlVmFsdWUgLyAxMDApICogb3JpZ2luYWxXaWR0aEluRU1VKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmVseS1pZlxyXG4gICAgICAgIGlmICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCA9PT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgICBtb2RpZmllZFdpZHRoID0gb3JpZ2luYWxXaWR0aEluRU1VO1xyXG4gICAgICAgICAgbW9kaWZpZWRIZWlnaHQgPSBvcmlnaW5hbEhlaWdodEluRU1VO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHZOb2RlLnByb3BlcnRpZXMuc3R5bGUuaGVpZ2h0KSB7XHJcbiAgICAgIGlmICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCAhPT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgaWYgKHBpeGVsUmVnZXgudGVzdCh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCkpIHtcclxuICAgICAgICAgIG1vZGlmaWVkSGVpZ2h0ID0gcGl4ZWxUb0VNVSh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodC5tYXRjaChwaXhlbFJlZ2V4KVsxXSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50YWdlUmVnZXgudGVzdCh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCkpIHtcclxuICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VWYWx1ZSA9IHZOb2RlLnByb3BlcnRpZXMuc3R5bGUud2lkdGgubWF0Y2gocGVyY2VudGFnZVJlZ2V4KVsxXTtcclxuXHJcbiAgICAgICAgICBtb2RpZmllZEhlaWdodCA9IE1hdGgucm91bmQoKHBlcmNlbnRhZ2VWYWx1ZSAvIDEwMCkgKiBvcmlnaW5hbEhlaWdodEluRU1VKTtcclxuICAgICAgICAgIGlmICghbW9kaWZpZWRXaWR0aCkge1xyXG4gICAgICAgICAgICBtb2RpZmllZFdpZHRoID0gTWF0aC5yb3VuZChtb2RpZmllZEhlaWdodCAqIGFzcGVjdFJhdGlvKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmVseS1pZlxyXG4gICAgICAgIGlmIChtb2RpZmllZFdpZHRoKSB7XHJcbiAgICAgICAgICBpZiAoIW1vZGlmaWVkSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIG1vZGlmaWVkSGVpZ2h0ID0gTWF0aC5yb3VuZChtb2RpZmllZFdpZHRoIC8gYXNwZWN0UmF0aW8pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBtb2RpZmllZEhlaWdodCA9IG9yaWdpbmFsSGVpZ2h0SW5FTVU7XHJcbiAgICAgICAgICBtb2RpZmllZFdpZHRoID0gb3JpZ2luYWxXaWR0aEluRU1VO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKG1vZGlmaWVkV2lkdGggJiYgIW1vZGlmaWVkSGVpZ2h0KSB7XHJcbiAgICAgIG1vZGlmaWVkSGVpZ2h0ID0gTWF0aC5yb3VuZChtb2RpZmllZFdpZHRoIC8gYXNwZWN0UmF0aW8pO1xyXG4gICAgfSBlbHNlIGlmIChtb2RpZmllZEhlaWdodCAmJiAhbW9kaWZpZWRXaWR0aCkge1xyXG4gICAgICBtb2RpZmllZFdpZHRoID0gTWF0aC5yb3VuZChtb2RpZmllZEhlaWdodCAqIGFzcGVjdFJhdGlvKTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgbW9kaWZpZWRXaWR0aCA9IG9yaWdpbmFsV2lkdGhJbkVNVTtcclxuICAgIG1vZGlmaWVkSGVpZ2h0ID0gb3JpZ2luYWxIZWlnaHRJbkVNVTtcclxuICB9XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gIGF0dHJpYnV0ZXMud2lkdGggPSBtb2RpZmllZFdpZHRoO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gIGF0dHJpYnV0ZXMuaGVpZ2h0ID0gbW9kaWZpZWRIZWlnaHQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFBhcmFncmFwaCA9IGFzeW5jICh2Tm9kZSwgYXR0cmlidXRlcywgZG9jeERvY3VtZW50SW5zdGFuY2UpID0+IHtcclxuICBjb25zdCBwYXJhZ3JhcGhGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICdwJyk7XHJcbiAgY29uc3QgbW9kaWZpZWRBdHRyaWJ1dGVzID0gbW9kaWZpZWRTdHlsZUF0dHJpYnV0ZXNCdWlsZGVyKHZOb2RlLCBhdHRyaWJ1dGVzLCB7XHJcbiAgICBpc1BhcmFncmFwaDogdHJ1ZSxcclxuICB9KTtcclxuICBjb25zdCBwYXJhZ3JhcGhQcm9wZXJ0aWVzRnJhZ21lbnQgPSBidWlsZFBhcmFncmFwaFByb3BlcnRpZXMobW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocGFyYWdyYXBoUHJvcGVydGllc0ZyYWdtZW50KTtcclxuICBpZiAoaXNWTm9kZSh2Tm9kZSkgJiYgdk5vZGVIYXNDaGlsZHJlbih2Tm9kZSkpIHtcclxuICAgIGlmIChcclxuICAgICAgW1xyXG4gICAgICAgICdzcGFuJyxcclxuICAgICAgICAnc3Ryb25nJyxcclxuICAgICAgICAnYicsXHJcbiAgICAgICAgJ2VtJyxcclxuICAgICAgICAnaScsXHJcbiAgICAgICAgJ3UnLFxyXG4gICAgICAgICdpbnMnLFxyXG4gICAgICAgICdzdHJpa2UnLFxyXG4gICAgICAgICdkZWwnLFxyXG4gICAgICAgICdzJyxcclxuICAgICAgICAnc3ViJyxcclxuICAgICAgICAnc3VwJyxcclxuICAgICAgICAnbWFyaycsXHJcbiAgICAgICAgJ2EnLFxyXG4gICAgICAgICdjb2RlJyxcclxuICAgICAgICAncHJlJyxcclxuICAgICAgXS5pbmNsdWRlcyh2Tm9kZS50YWdOYW1lKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHJ1bk9ySHlwZXJsaW5rRnJhZ21lbnRzID0gYXdhaXQgYnVpbGRSdW5Pckh5cGVyTGluayhcclxuICAgICAgICB2Tm9kZSxcclxuICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMsXHJcbiAgICAgICAgZG9jeERvY3VtZW50SW5zdGFuY2VcclxuICAgICAgKTtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocnVuT3JIeXBlcmxpbmtGcmFnbWVudHMpKSB7XHJcbiAgICAgICAgZm9yIChcclxuICAgICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcclxuICAgICAgICAgIGl0ZXJhdG9ySW5kZXggPCBydW5Pckh5cGVybGlua0ZyYWdtZW50cy5sZW5ndGg7XHJcbiAgICAgICAgICBpdGVyYXRvckluZGV4KytcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbnN0IHJ1bk9ySHlwZXJsaW5rRnJhZ21lbnQgPSBydW5Pckh5cGVybGlua0ZyYWdtZW50c1tpdGVyYXRvckluZGV4XTtcclxuXHJcbiAgICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuT3JIeXBlcmxpbmtGcmFnbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmFncmFwaEZyYWdtZW50LmltcG9ydChydW5Pckh5cGVybGlua0ZyYWdtZW50cyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodk5vZGUudGFnTmFtZSA9PT0gJ2Jsb2NrcXVvdGUnKSB7XHJcbiAgICAgIGNvbnN0IHJ1bkZyYWdtZW50T3JGcmFnbWVudHMgPSBhd2FpdCBidWlsZFJ1bih2Tm9kZSwgYXR0cmlidXRlcyk7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJ1bkZyYWdtZW50T3JGcmFnbWVudHMpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJ1bkZyYWdtZW50T3JGcmFnbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuRnJhZ21lbnRPckZyYWdtZW50c1tpbmRleF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuRnJhZ21lbnRPckZyYWdtZW50cyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2Tm9kZS5jaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBjaGlsZFZOb2RlID0gdk5vZGUuY2hpbGRyZW5baW5kZXhdO1xyXG4gICAgICAgIGlmIChjaGlsZFZOb2RlLnRhZ05hbWUgPT09ICdpbWcnKSB7XHJcbiAgICAgICAgICBsZXQgYmFzZTY0U3RyaW5nO1xyXG4gICAgICAgICAgY29uc3QgaW1hZ2VTb3VyY2UgPSBjaGlsZFZOb2RlLnByb3BlcnRpZXMuc3JjO1xyXG4gICAgICAgICAgaWYgKGlzVmFsaWRVcmwoaW1hZ2VTb3VyY2UpKSB7XHJcbiAgICAgICAgICAgIGJhc2U2NFN0cmluZyA9IGF3YWl0IGltYWdlVG9CYXNlNjQoaW1hZ2VTb3VyY2UpLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuaW5nKGBza2lwcGluZyBpbWFnZSBkb3dubG9hZCBhbmQgY29udmVyc2lvbiBkdWUgdG8gJHtlcnJvcn1gKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYmFzZTY0U3RyaW5nICYmIG1pbWVUeXBlcy5sb29rdXAoaW1hZ2VTb3VyY2UpKSB7XHJcbiAgICAgICAgICAgICAgY2hpbGRWTm9kZS5wcm9wZXJ0aWVzLnNyYyA9IGBkYXRhOiR7bWltZVR5cGVzLmxvb2t1cChcclxuICAgICAgICAgICAgICAgIGltYWdlU291cmNlXHJcbiAgICAgICAgICAgICAgKX07YmFzZTY0LCAke2Jhc2U2NFN0cmluZ31gO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1lc2NhcGUsIHByZWZlci1kZXN0cnVjdHVyaW5nXHJcbiAgICAgICAgICAgIGJhc2U2NFN0cmluZyA9IGltYWdlU291cmNlLm1hdGNoKC9eZGF0YTooW0EtWmEtei0rXFwvXSspO2Jhc2U2NCwoLispJC8pWzJdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgaW1hZ2VCdWZmZXIgPSBCdWZmZXIuZnJvbShkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0U3RyaW5nKSwgJ2Jhc2U2NCcpO1xyXG4gICAgICAgICAgY29uc3QgaW1hZ2VQcm9wZXJ0aWVzID0gc2l6ZU9mKGltYWdlQnVmZmVyKTtcclxuXHJcbiAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMubWF4aW11bVdpZHRoID1cclxuICAgICAgICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLm1heGltdW1XaWR0aCB8fCBkb2N4RG9jdW1lbnRJbnN0YW5jZS5hdmFpbGFibGVEb2N1bWVudFNwYWNlO1xyXG4gICAgICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLm9yaWdpbmFsV2lkdGggPSBpbWFnZVByb3BlcnRpZXMud2lkdGg7XHJcbiAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMub3JpZ2luYWxIZWlnaHQgPSBpbWFnZVByb3BlcnRpZXMuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgIGNvbXB1dGVJbWFnZURpbWVuc2lvbnMoY2hpbGRWTm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnVuT3JIeXBlcmxpbmtGcmFnbWVudHMgPSBhd2FpdCBidWlsZFJ1bk9ySHlwZXJMaW5rKFxyXG4gICAgICAgICAgY2hpbGRWTm9kZSxcclxuICAgICAgICAgIGlzVk5vZGUoY2hpbGRWTm9kZSkgJiYgY2hpbGRWTm9kZS50YWdOYW1lID09PSAnaW1nJ1xyXG4gICAgICAgICAgICA/IHsgLi4ubW9kaWZpZWRBdHRyaWJ1dGVzLCB0eXBlOiAncGljdHVyZScgfVxyXG4gICAgICAgICAgICA6IG1vZGlmaWVkQXR0cmlidXRlcyxcclxuICAgICAgICAgIGRvY3hEb2N1bWVudEluc3RhbmNlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShydW5Pckh5cGVybGlua0ZyYWdtZW50cykpIHtcclxuICAgICAgICAgIGZvciAoXHJcbiAgICAgICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcclxuICAgICAgICAgICAgaXRlcmF0b3JJbmRleCA8IHJ1bk9ySHlwZXJsaW5rRnJhZ21lbnRzLmxlbmd0aDtcclxuICAgICAgICAgICAgaXRlcmF0b3JJbmRleCsrXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgcnVuT3JIeXBlcmxpbmtGcmFnbWVudCA9IHJ1bk9ySHlwZXJsaW5rRnJhZ21lbnRzW2l0ZXJhdG9ySW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgcGFyYWdyYXBoRnJhZ21lbnQuaW1wb3J0KHJ1bk9ySHlwZXJsaW5rRnJhZ21lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuT3JIeXBlcmxpbmtGcmFnbWVudHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBJbiBjYXNlIHBhcmFncmFwaHMgaGFzIHRvIGJlIHJlbmRlcmVkIHdoZXJlIHZUZXh0IGlzIHByZXNlbnQuIEVnLiB0YWJsZS1jZWxsXHJcbiAgICAvLyBPciBpbiBjYXNlIHRoZSB2Tm9kZSBpcyBzb21ldGhpbmcgbGlrZSBpbWdcclxuICAgIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS50YWdOYW1lID09PSAnaW1nJykge1xyXG4gICAgICBjb25zdCBpbWFnZVNvdXJjZSA9IHZOb2RlLnByb3BlcnRpZXMuc3JjO1xyXG4gICAgICBsZXQgYmFzZTY0U3RyaW5nID0gaW1hZ2VTb3VyY2U7XHJcbiAgICAgIGlmIChpc1ZhbGlkVXJsKGltYWdlU291cmNlKSkge1xyXG4gICAgICAgIGJhc2U2NFN0cmluZyA9IGF3YWl0IGltYWdlVG9CYXNlNjQoaW1hZ2VTb3VyY2UpLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgIGNvbnNvbGUud2FybmluZyhgc2tpcHBpbmcgaW1hZ2UgZG93bmxvYWQgYW5kIGNvbnZlcnNpb24gZHVlIHRvICR7ZXJyb3J9YCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChiYXNlNjRTdHJpbmcgJiYgbWltZVR5cGVzLmxvb2t1cChpbWFnZVNvdXJjZSkpIHtcclxuICAgICAgICAgIHZOb2RlLnByb3BlcnRpZXMuc3JjID0gYGRhdGE6JHttaW1lVHlwZXMubG9va3VwKGltYWdlU291cmNlKX07YmFzZTY0LCAke2Jhc2U2NFN0cmluZ31gO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC51cCgpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBwYXJhZ3JhcGhGcmFnbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlLCBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xyXG4gICAgICAgIGJhc2U2NFN0cmluZyA9IGJhc2U2NFN0cmluZy5tYXRjaCgvXmRhdGE6KFtBLVphLXotK1xcL10rKTtiYXNlNjQsKC4rKSQvKVsyXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW1hZ2VCdWZmZXIgPSBCdWZmZXIuZnJvbShkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0U3RyaW5nKSwgJ2Jhc2U2NCcpO1xyXG4gICAgICBjb25zdCBpbWFnZVByb3BlcnRpZXMgPSBzaXplT2YoaW1hZ2VCdWZmZXIpO1xyXG5cclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLm1heGltdW1XaWR0aCA9XHJcbiAgICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLm1heGltdW1XaWR0aCB8fCBkb2N4RG9jdW1lbnRJbnN0YW5jZS5hdmFpbGFibGVEb2N1bWVudFNwYWNlO1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMub3JpZ2luYWxXaWR0aCA9IGltYWdlUHJvcGVydGllcy53aWR0aDtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLm9yaWdpbmFsSGVpZ2h0ID0gaW1hZ2VQcm9wZXJ0aWVzLmhlaWdodDtcclxuXHJcbiAgICAgIGNvbXB1dGVJbWFnZURpbWVuc2lvbnModk5vZGUsIG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBydW5GcmFnbWVudHMgPSBhd2FpdCBidWlsZFJ1bk9yUnVucyh2Tm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzLCBkb2N4RG9jdW1lbnRJbnN0YW5jZSk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShydW5GcmFnbWVudHMpKSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBydW5GcmFnbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgcnVuRnJhZ21lbnQgPSBydW5GcmFnbWVudHNbaW5kZXhdO1xyXG5cclxuICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuRnJhZ21lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuRnJhZ21lbnRzKTtcclxuICAgIH1cclxuICB9XHJcbiAgcGFyYWdyYXBoRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHBhcmFncmFwaEZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRHcmlkU3BhbkZyYWdtZW50ID0gKHNwYW5WYWx1ZSkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICdncmlkU3BhbicpXHJcbiAgICAuYXR0KCdAdycsICd2YWwnLCBzcGFuVmFsdWUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVGFibGVDZWxsU3BhY2luZyA9IChjZWxsU3BhY2luZyA9IDApID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAndGJsQ2VsbFNwYWNpbmcnKVxyXG4gICAgLmF0dCgnQHcnLCAndycsIGNlbGxTcGFjaW5nKVxyXG4gICAgLmF0dCgnQHcnLCAndHlwZScsICdkeGEnKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZFRhYmxlQ2VsbEJvcmRlcnMgPSAodGFibGVDZWxsQm9yZGVyKSA9PiB7XHJcbiAgY29uc3QgdGFibGVDZWxsQm9yZGVyc0ZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3RjQm9yZGVycydcclxuICApO1xyXG5cclxuICBjb25zdCB7IGNvbG9yLCBzdHJva2UsIC4uLmJvcmRlcnMgfSA9IHRhYmxlQ2VsbEJvcmRlcjtcclxuICBPYmplY3Qua2V5cyhib3JkZXJzKS5mb3JFYWNoKChib3JkZXIpID0+IHtcclxuICAgIGlmICh0YWJsZUNlbGxCb3JkZXJbYm9yZGVyXSkge1xyXG4gICAgICBjb25zdCBib3JkZXJGcmFnbWVudCA9IGJ1aWxkQm9yZGVyKGJvcmRlciwgdGFibGVDZWxsQm9yZGVyW2JvcmRlcl0sIDAsIGNvbG9yLCBzdHJva2UpO1xyXG4gICAgICB0YWJsZUNlbGxCb3JkZXJzRnJhZ21lbnQuaW1wb3J0KGJvcmRlckZyYWdtZW50KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgdGFibGVDZWxsQm9yZGVyc0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiB0YWJsZUNlbGxCb3JkZXJzRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFRhYmxlQ2VsbFdpZHRoID0gKHRhYmxlQ2VsbFdpZHRoKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ3RjVycpXHJcbiAgICAuYXR0KCdAdycsICd3JywgZml4dXBDb2x1bW5XaWR0aCh0YWJsZUNlbGxXaWR0aCkpXHJcbiAgICAuYXR0KCdAdycsICd0eXBlJywgJ2R4YScpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVGFibGVDZWxsUHJvcGVydGllcyA9IChhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3RjUHInXHJcbiAgKTtcclxuICBpZiAoYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcclxuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBzd2l0Y2ggKGtleSkge1xyXG4gICAgICAgIGNhc2UgJ2JhY2tncm91bmRDb2xvcic6XHJcbiAgICAgICAgICBjb25zdCBzaGFkaW5nRnJhZ21lbnQgPSBidWlsZFNoYWRpbmcoYXR0cmlidXRlc1trZXldKTtcclxuICAgICAgICAgIHRhYmxlQ2VsbFByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQoc2hhZGluZ0ZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuYmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAndmVydGljYWxBbGlnbic6XHJcbiAgICAgICAgICBjb25zdCB2ZXJ0aWNhbEFsaWdubWVudEZyYWdtZW50ID0gYnVpbGRWZXJ0aWNhbEFsaWdubWVudChhdHRyaWJ1dGVzW2tleV0pO1xyXG4gICAgICAgICAgdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydCh2ZXJ0aWNhbEFsaWdubWVudEZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMudmVydGljYWxBbGlnbjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2NvbFNwYW4nOlxyXG4gICAgICAgICAgY29uc3QgZ3JpZFNwYW5GcmFnbWVudCA9IGJ1aWxkR3JpZFNwYW5GcmFnbWVudChhdHRyaWJ1dGVzW2tleV0pO1xyXG4gICAgICAgICAgdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydChncmlkU3BhbkZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuY29sU3BhbjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RhYmxlQ2VsbEJvcmRlcic6XHJcbiAgICAgICAgICBjb25zdCB0YWJsZUNlbGxCb3JkZXJGcmFnbWVudCA9IGJ1aWxkVGFibGVDZWxsQm9yZGVycyhhdHRyaWJ1dGVzW2tleV0pO1xyXG4gICAgICAgICAgdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydCh0YWJsZUNlbGxCb3JkZXJGcmFnbWVudCk7XHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLnRhYmxlQ2VsbEJvcmRlcjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Jvd1NwYW4nOlxyXG4gICAgICAgICAgY29uc3QgdmVydGljYWxNZXJnZUZyYWdtZW50ID0gYnVpbGRWZXJ0aWNhbE1lcmdlKGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICB0YWJsZUNlbGxQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KHZlcnRpY2FsTWVyZ2VGcmFnbWVudCk7XHJcblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMucm93U3BhbjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3dpZHRoJzpcclxuICAgICAgICAgIGNvbnN0IHdpZHRoRnJhZ21lbnQgPSBidWlsZFRhYmxlQ2VsbFdpZHRoKGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICB0YWJsZUNlbGxQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KHdpZHRoRnJhZ21lbnQpO1xyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMud2lkdGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHRhYmxlQ2VsbFByb3BlcnRpZXNGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgZml4dXBUYWJsZUNlbGxCb3JkZXIgPSAodk5vZGUsIGF0dHJpYnV0ZXMpID0+IHtcclxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZOb2RlLnByb3BlcnRpZXMuc3R5bGUsICdib3JkZXInKSkge1xyXG4gICAgaWYgKHZOb2RlLnByb3BlcnRpZXMuc3R5bGUuYm9yZGVyID09PSAnbm9uZScgfHwgdk5vZGUucHJvcGVydGllcy5zdHlsZS5ib3JkZXIgPT09IDApIHtcclxuICAgICAgYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB7fTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gICAgICBjb25zdCBbYm9yZGVyU2l6ZSwgYm9yZGVyU3Ryb2tlLCBib3JkZXJDb2xvcl0gPSBjc3NCb3JkZXJQYXJzZXIoXHJcbiAgICAgICAgdk5vZGUucHJvcGVydGllcy5zdHlsZS5ib3JkZXJcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyID0ge1xyXG4gICAgICAgIHRvcDogYm9yZGVyU2l6ZSxcclxuICAgICAgICBsZWZ0OiBib3JkZXJTaXplLFxyXG4gICAgICAgIGJvdHRvbTogYm9yZGVyU2l6ZSxcclxuICAgICAgICByaWdodDogYm9yZGVyU2l6ZSxcclxuICAgICAgICBjb2xvcjogYm9yZGVyQ29sb3IsXHJcbiAgICAgICAgc3Ryb2tlOiBib3JkZXJTdHJva2UsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItdG9wJ10gJiYgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLXRvcCddID09PSAnMCcpIHtcclxuICAgIGF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyID0ge1xyXG4gICAgICAuLi5hdHRyaWJ1dGVzLnRhYmxlQ2VsbEJvcmRlcixcclxuICAgICAgdG9wOiAwLFxyXG4gICAgfTtcclxuICB9IGVsc2UgaWYgKHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci10b3AnXSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItdG9wJ10gIT09ICcwJykge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXHJcbiAgICBjb25zdCBbYm9yZGVyU2l6ZSwgYm9yZGVyU3Ryb2tlLCBib3JkZXJDb2xvcl0gPSBjc3NCb3JkZXJQYXJzZXIoXHJcbiAgICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci10b3AnXVxyXG4gICAgKTtcclxuICAgIGF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyID0ge1xyXG4gICAgICAuLi5hdHRyaWJ1dGVzLnRhYmxlQ2VsbEJvcmRlcixcclxuICAgICAgdG9wOiBib3JkZXJTaXplLFxyXG4gICAgICBjb2xvcjogYm9yZGVyQ29sb3IsXHJcbiAgICAgIHN0cm9rZTogYm9yZGVyU3Ryb2tlLFxyXG4gICAgfTtcclxuICB9XHJcbiAgaWYgKHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci1sZWZ0J10gJiYgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLWxlZnQnXSA9PT0gJzAnKSB7XHJcbiAgICBhdHRyaWJ1dGVzLnRhYmxlQ2VsbEJvcmRlciA9IHtcclxuICAgICAgLi4uYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIsXHJcbiAgICAgIGxlZnQ6IDAsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSBpZiAoXHJcbiAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItbGVmdCddICYmXHJcbiAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItbGVmdCddICE9PSAnMCdcclxuICApIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gICAgY29uc3QgW2JvcmRlclNpemUsIGJvcmRlclN0cm9rZSwgYm9yZGVyQ29sb3JdID0gY3NzQm9yZGVyUGFyc2VyKFxyXG4gICAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItbGVmdCddXHJcbiAgICApO1xyXG4gICAgYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB7XHJcbiAgICAgIC4uLmF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyLFxyXG4gICAgICBsZWZ0OiBib3JkZXJTaXplLFxyXG4gICAgICBjb2xvcjogYm9yZGVyQ29sb3IsXHJcbiAgICAgIHN0cm9rZTogYm9yZGVyU3Ryb2tlLFxyXG4gICAgfTtcclxuICB9XHJcbiAgaWYgKHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci1ib3R0b20nXSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItYm90dG9tJ10gPT09ICcwJykge1xyXG4gICAgYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB7XHJcbiAgICAgIC4uLmF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyLFxyXG4gICAgICBib3R0b206IDAsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSBpZiAoXHJcbiAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItYm90dG9tJ10gJiZcclxuICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci1ib3R0b20nXSAhPT0gJzAnXHJcbiAgKSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcclxuICAgIGNvbnN0IFtib3JkZXJTaXplLCBib3JkZXJTdHJva2UsIGJvcmRlckNvbG9yXSA9IGNzc0JvcmRlclBhcnNlcihcclxuICAgICAgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLWJvdHRvbSddXHJcbiAgICApO1xyXG4gICAgYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB7XHJcbiAgICAgIC4uLmF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyLFxyXG4gICAgICBib3R0b206IGJvcmRlclNpemUsXHJcbiAgICAgIGNvbG9yOiBib3JkZXJDb2xvcixcclxuICAgICAgc3Ryb2tlOiBib3JkZXJTdHJva2UsXHJcbiAgICB9O1xyXG4gIH1cclxuICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLXJpZ2h0J10gJiYgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLXJpZ2h0J10gPT09ICcwJykge1xyXG4gICAgYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB7XHJcbiAgICAgIC4uLmF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyLFxyXG4gICAgICByaWdodDogMCxcclxuICAgIH07XHJcbiAgfSBlbHNlIGlmIChcclxuICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci1yaWdodCddICYmXHJcbiAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItcmlnaHQnXSAhPT0gJzAnXHJcbiAgKSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcclxuICAgIGNvbnN0IFtib3JkZXJTaXplLCBib3JkZXJTdHJva2UsIGJvcmRlckNvbG9yXSA9IGNzc0JvcmRlclBhcnNlcihcclxuICAgICAgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLXJpZ2h0J11cclxuICAgICk7XHJcbiAgICBhdHRyaWJ1dGVzLnRhYmxlQ2VsbEJvcmRlciA9IHtcclxuICAgICAgLi4uYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIsXHJcbiAgICAgIHJpZ2h0OiBib3JkZXJTaXplLFxyXG4gICAgICBjb2xvcjogYm9yZGVyQ29sb3IsXHJcbiAgICAgIHN0cm9rZTogYm9yZGVyU3Ryb2tlLFxyXG4gICAgfTtcclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFRhYmxlQ2VsbCA9IGFzeW5jICh2Tm9kZSwgYXR0cmlidXRlcywgcm93U3Bhbk1hcCwgY29sdW1uSW5kZXgsIGRvY3hEb2N1bWVudEluc3RhbmNlKSA9PiB7XHJcbiAgY29uc3QgdGFibGVDZWxsRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAndGMnKTtcclxuXHJcbiAgbGV0IG1vZGlmaWVkQXR0cmlidXRlcyA9IHsgLi4uYXR0cmlidXRlcyB9O1xyXG4gIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS5wcm9wZXJ0aWVzKSB7XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5yb3dTcGFuKSB7XHJcbiAgICAgIHJvd1NwYW5NYXAuc2V0KGNvbHVtbkluZGV4LmluZGV4LCB7IHJvd1NwYW46IHZOb2RlLnByb3BlcnRpZXMucm93U3BhbiAtIDEsIGNvbFNwYW46IDAgfSk7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5yb3dTcGFuID0gJ3Jlc3RhcnQnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcHJldmlvdXNTcGFuT2JqZWN0ID0gcm93U3Bhbk1hcC5nZXQoY29sdW1uSW5kZXguaW5kZXgpO1xyXG4gICAgICByb3dTcGFuTWFwLnNldChcclxuICAgICAgICBjb2x1bW5JbmRleC5pbmRleCxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLW9iamVjdC1zcHJlYWRcclxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91c1NwYW5PYmplY3QsIHtcclxuICAgICAgICAgIHJvd1NwYW46IDAsXHJcbiAgICAgICAgICBjb2xTcGFuOiAocHJldmlvdXNTcGFuT2JqZWN0ICYmIHByZXZpb3VzU3Bhbk9iamVjdC5jb2xTcGFuKSB8fCAwLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHZOb2RlLnByb3BlcnRpZXMuY29sU3BhbiB8fFxyXG4gICAgICAodk5vZGUucHJvcGVydGllcy5zdHlsZSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydjb2x1bW4tc3BhbiddKVxyXG4gICAgKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5jb2xTcGFuID1cclxuICAgICAgICB2Tm9kZS5wcm9wZXJ0aWVzLmNvbFNwYW4gfHxcclxuICAgICAgICAodk5vZGUucHJvcGVydGllcy5zdHlsZSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydjb2x1bW4tc3BhbiddKTtcclxuICAgICAgY29uc3QgcHJldmlvdXNTcGFuT2JqZWN0ID0gcm93U3Bhbk1hcC5nZXQoY29sdW1uSW5kZXguaW5kZXgpO1xyXG4gICAgICByb3dTcGFuTWFwLnNldChcclxuICAgICAgICBjb2x1bW5JbmRleC5pbmRleCxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLW9iamVjdC1zcHJlYWRcclxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91c1NwYW5PYmplY3QsIHtcclxuICAgICAgICAgIGNvbFNwYW46IHBhcnNlSW50KG1vZGlmaWVkQXR0cmlidXRlcy5jb2xTcGFuKSB8fCAwLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbHVtbkluZGV4LmluZGV4ICs9IHBhcnNlSW50KG1vZGlmaWVkQXR0cmlidXRlcy5jb2xTcGFuKSAtIDE7XHJcbiAgICB9XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZSkge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMgPSB7XHJcbiAgICAgICAgLi4ubW9kaWZpZWRBdHRyaWJ1dGVzLFxyXG4gICAgICAgIC4uLm1vZGlmaWVkU3R5bGVBdHRyaWJ1dGVzQnVpbGRlcih2Tm9kZSwgYXR0cmlidXRlcyksXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaXh1cFRhYmxlQ2VsbEJvcmRlcih2Tm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICAgIH1cclxuICB9XHJcbiAgY29uc3QgdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGRUYWJsZUNlbGxQcm9wZXJ0aWVzKG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgdGFibGVDZWxsRnJhZ21lbnQuaW1wb3J0KHRhYmxlQ2VsbFByb3BlcnRpZXNGcmFnbWVudCk7XHJcbiAgaWYgKHZOb2RlSGFzQ2hpbGRyZW4odk5vZGUpKSB7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdk5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkVk5vZGUgPSB2Tm9kZS5jaGlsZHJlbltpbmRleF07XHJcbiAgICAgIGlmIChpc1ZOb2RlKGNoaWxkVk5vZGUpICYmIGNoaWxkVk5vZGUudGFnTmFtZSA9PT0gJ2ltZycpIHtcclxuICAgICAgICBjb25zdCBpbWFnZUZyYWdtZW50ID0gYXdhaXQgYnVpbGRJbWFnZShcclxuICAgICAgICAgIGRvY3hEb2N1bWVudEluc3RhbmNlLFxyXG4gICAgICAgICAgY2hpbGRWTm9kZSxcclxuICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5tYXhpbXVtV2lkdGhcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChpbWFnZUZyYWdtZW50KSB7XHJcbiAgICAgICAgICB0YWJsZUNlbGxGcmFnbWVudC5pbXBvcnQoaW1hZ2VGcmFnbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGlzVk5vZGUoY2hpbGRWTm9kZSkgJiYgY2hpbGRWTm9kZS50YWdOYW1lID09PSAnZmlndXJlJykge1xyXG4gICAgICAgIGlmICh2Tm9kZUhhc0NoaWxkcmVuKGNoaWxkVk5vZGUpKSB7XHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcclxuICAgICAgICAgIGZvciAobGV0IGl0ZXJhdG9ySW5kZXggPSAwOyBpdGVyYXRvckluZGV4IDwgY2hpbGRWTm9kZS5jaGlsZHJlbi5sZW5ndGg7IGl0ZXJhdG9ySW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBncmFuZENoaWxkVk5vZGUgPSBjaGlsZFZOb2RlLmNoaWxkcmVuW2l0ZXJhdG9ySW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAoZ3JhbmRDaGlsZFZOb2RlLnRhZ05hbWUgPT09ICdpbWcnKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgaW1hZ2VGcmFnbWVudCA9IGF3YWl0IGJ1aWxkSW1hZ2UoXHJcbiAgICAgICAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZSxcclxuICAgICAgICAgICAgICAgIGdyYW5kQ2hpbGRWTm9kZSxcclxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5tYXhpbXVtV2lkdGhcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGlmIChpbWFnZUZyYWdtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZUNlbGxGcmFnbWVudC5pbXBvcnQoaW1hZ2VGcmFnbWVudCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGlzVk5vZGUoY2hpbGRWTm9kZSkgJiYgWyd1bCcsICdvbCddLmluY2x1ZGVzKGNoaWxkVk5vZGUudGFnTmFtZSkpIHtcclxuICAgICAgICAvLyByZW5kZXIgbGlzdCBpbiB0YWJsZVxyXG4gICAgICAgIGlmICh2Tm9kZUhhc0NoaWxkcmVuKGNoaWxkVk5vZGUpKSB7XHJcbiAgICAgICAgICBhd2FpdCBidWlsZExpc3QoY2hpbGRWTm9kZSwgZG9jeERvY3VtZW50SW5zdGFuY2UsIHRhYmxlQ2VsbEZyYWdtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoRnJhZ21lbnQgPSBhd2FpdCBidWlsZFBhcmFncmFwaChcclxuICAgICAgICAgIGNoaWxkVk5vZGUsXHJcbiAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMsXHJcbiAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRhYmxlQ2VsbEZyYWdtZW50LmltcG9ydChwYXJhZ3JhcGhGcmFnbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYnVpbGRpbmcgd2l0aCBidWlsZFBhcmFncmFwaCgpIGlzbid0IHdvcmtpbmdcclxuICAgIGNvbnN0IHBhcmFncmFwaEZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgICAuZWxlKCdAdycsICdwJylcclxuICAgICAgLnVwKCk7XHJcbiAgICB0YWJsZUNlbGxGcmFnbWVudC5pbXBvcnQocGFyYWdyYXBoRnJhZ21lbnQpO1xyXG4gIH1cclxuICB0YWJsZUNlbGxGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gdGFibGVDZWxsRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFJvd1NwYW5DZWxsID0gKHJvd1NwYW5NYXAsIGNvbHVtbkluZGV4LCBhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3Qgcm93U3BhbkNlbGxGcmFnbWVudHMgPSBbXTtcclxuICBsZXQgc3Bhbk9iamVjdCA9IHJvd1NwYW5NYXAuZ2V0KGNvbHVtbkluZGV4LmluZGV4KTtcclxuICB3aGlsZSAoc3Bhbk9iamVjdCAmJiBzcGFuT2JqZWN0LnJvd1NwYW4pIHtcclxuICAgIGNvbnN0IHJvd1NwYW5DZWxsRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAndGMnKTtcclxuXHJcbiAgICBjb25zdCB0YWJsZUNlbGxQcm9wZXJ0aWVzRnJhZ21lbnQgPSBidWlsZFRhYmxlQ2VsbFByb3BlcnRpZXMoe1xyXG4gICAgICAuLi5hdHRyaWJ1dGVzLFxyXG4gICAgICByb3dTcGFuOiAnY29udGludWUnLFxyXG4gICAgICBjb2xTcGFuOiBzcGFuT2JqZWN0LmNvbFNwYW4gPyBzcGFuT2JqZWN0LmNvbFNwYW4gOiAwLFxyXG4gICAgfSk7XHJcbiAgICByb3dTcGFuQ2VsbEZyYWdtZW50LmltcG9ydCh0YWJsZUNlbGxQcm9wZXJ0aWVzRnJhZ21lbnQpO1xyXG5cclxuICAgIGNvbnN0IHBhcmFncmFwaEZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgICAuZWxlKCdAdycsICdwJylcclxuICAgICAgLnVwKCk7XHJcbiAgICByb3dTcGFuQ2VsbEZyYWdtZW50LmltcG9ydChwYXJhZ3JhcGhGcmFnbWVudCk7XHJcbiAgICByb3dTcGFuQ2VsbEZyYWdtZW50LnVwKCk7XHJcblxyXG4gICAgcm93U3BhbkNlbGxGcmFnbWVudHMucHVzaChyb3dTcGFuQ2VsbEZyYWdtZW50KTtcclxuXHJcbiAgICBpZiAoc3Bhbk9iamVjdC5yb3dTcGFuIC0gMSA9PT0gMCkge1xyXG4gICAgICByb3dTcGFuTWFwLmRlbGV0ZShjb2x1bW5JbmRleC5pbmRleCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByb3dTcGFuTWFwLnNldChjb2x1bW5JbmRleC5pbmRleCwge1xyXG4gICAgICAgIHJvd1NwYW46IHNwYW5PYmplY3Qucm93U3BhbiAtIDEsXHJcbiAgICAgICAgY29sU3Bhbjogc3Bhbk9iamVjdC5jb2xTcGFuIHx8IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY29sdW1uSW5kZXguaW5kZXggKz0gc3Bhbk9iamVjdC5jb2xTcGFuIHx8IDE7XHJcbiAgICBzcGFuT2JqZWN0ID0gcm93U3Bhbk1hcC5nZXQoY29sdW1uSW5kZXguaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJvd1NwYW5DZWxsRnJhZ21lbnRzO1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZVJvd1Byb3BlcnRpZXMgPSAoYXR0cmlidXRlcykgPT4ge1xyXG4gIGNvbnN0IHRhYmxlUm93UHJvcGVydGllc0ZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3RyUHInXHJcbiAgKTtcclxuICBpZiAoYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcclxuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBzd2l0Y2ggKGtleSkge1xyXG4gICAgICAgIGNhc2UgJ3RhYmxlUm93SGVpZ2h0JzpcclxuICAgICAgICAgIGNvbnN0IHRhYmxlUm93SGVpZ2h0RnJhZ21lbnQgPSBidWlsZFRhYmxlUm93SGVpZ2h0KGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICB0YWJsZVJvd1Byb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQodGFibGVSb3dIZWlnaHRGcmFnbWVudCk7XHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLnRhYmxlUm93SGVpZ2h0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAncm93Q2FudFNwbGl0JzpcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnJvd0NhbnRTcGxpdCkge1xyXG4gICAgICAgICAgICBjb25zdCBjYW50U3BsaXRGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgICAgICAgICAgICAuZWxlKCdAdycsICdjYW50U3BsaXQnKVxyXG4gICAgICAgICAgICAgIC51cCgpO1xyXG4gICAgICAgICAgICB0YWJsZVJvd1Byb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQoY2FudFNwbGl0RnJhZ21lbnQpO1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMucm93Q2FudFNwbGl0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICB0YWJsZVJvd1Byb3BlcnRpZXNGcmFnbWVudC51cCgpO1xyXG4gIHJldHVybiB0YWJsZVJvd1Byb3BlcnRpZXNGcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkVGFibGVSb3cgPSBhc3luYyAodk5vZGUsIGF0dHJpYnV0ZXMsIHJvd1NwYW5NYXAsIGRvY3hEb2N1bWVudEluc3RhbmNlKSA9PiB7XHJcbiAgY29uc3QgdGFibGVSb3dGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICd0cicpO1xyXG4gIGNvbnN0IG1vZGlmaWVkQXR0cmlidXRlcyA9IHsgLi4uYXR0cmlidXRlcyB9O1xyXG4gIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS5wcm9wZXJ0aWVzKSB7XHJcbiAgICAvLyBGSVhNRTogZmluZCBhIGJldHRlciB3YXkgdG8gZ2V0IHJvdyBoZWlnaHQgZnJvbSBjZWxsIHN0eWxlXHJcbiAgICBpZiAoXHJcbiAgICAgICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlICYmIHZOb2RlLnByb3BlcnRpZXMuc3R5bGUuaGVpZ2h0KSB8fFxyXG4gICAgICAodk5vZGUuY2hpbGRyZW5bMF0gJiZcclxuICAgICAgICBpc1ZOb2RlKHZOb2RlLmNoaWxkcmVuWzBdKSAmJlxyXG4gICAgICAgIHZOb2RlLmNoaWxkcmVuWzBdLnByb3BlcnRpZXMuc3R5bGUgJiZcclxuICAgICAgICB2Tm9kZS5jaGlsZHJlblswXS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodClcclxuICAgICkge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMudGFibGVSb3dIZWlnaHQgPSBmaXh1cFJvd0hlaWdodChcclxuICAgICAgICAodk5vZGUucHJvcGVydGllcy5zdHlsZSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCkgfHxcclxuICAgICAgICAgICh2Tm9kZS5jaGlsZHJlblswXSAmJlxyXG4gICAgICAgICAgaXNWTm9kZSh2Tm9kZS5jaGlsZHJlblswXSkgJiZcclxuICAgICAgICAgIHZOb2RlLmNoaWxkcmVuWzBdLnByb3BlcnRpZXMuc3R5bGUgJiZcclxuICAgICAgICAgIHZOb2RlLmNoaWxkcmVuWzBdLnByb3BlcnRpZXMuc3R5bGUuaGVpZ2h0XHJcbiAgICAgICAgICAgID8gdk5vZGUuY2hpbGRyZW5bMF0ucHJvcGVydGllcy5zdHlsZS5oZWlnaHRcclxuICAgICAgICAgICAgOiB1bmRlZmluZWQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZSkge1xyXG4gICAgICBmaXh1cFRhYmxlQ2VsbEJvcmRlcih2Tm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHRhYmxlUm93UHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGRUYWJsZVJvd1Byb3BlcnRpZXMobW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICB0YWJsZVJvd0ZyYWdtZW50LmltcG9ydCh0YWJsZVJvd1Byb3BlcnRpZXNGcmFnbWVudCk7XHJcblxyXG4gIGNvbnN0IGNvbHVtbkluZGV4ID0geyBpbmRleDogMCB9O1xyXG5cclxuICBpZiAodk5vZGVIYXNDaGlsZHJlbih2Tm9kZSkpIHtcclxuICAgIGNvbnN0IHRhYmxlQ29sdW1ucyA9IHZOb2RlLmNoaWxkcmVuLmZpbHRlcigoY2hpbGRWTm9kZSkgPT5cclxuICAgICAgWyd0ZCcsICd0aCddLmluY2x1ZGVzKGNoaWxkVk5vZGUudGFnTmFtZSlcclxuICAgICk7XHJcbiAgICBjb25zdCBtYXhpbXVtQ29sdW1uV2lkdGggPSBkb2N4RG9jdW1lbnRJbnN0YW5jZS5hdmFpbGFibGVEb2N1bWVudFNwYWNlIC8gdGFibGVDb2x1bW5zLmxlbmd0aDtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcclxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRhYmxlQ29sdW1ucykge1xyXG4gICAgICBjb25zdCByb3dTcGFuQ2VsbEZyYWdtZW50cyA9IGJ1aWxkUm93U3BhbkNlbGwocm93U3Bhbk1hcCwgY29sdW1uSW5kZXgsIG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvd1NwYW5DZWxsRnJhZ21lbnRzKSkge1xyXG4gICAgICAgIGZvciAobGV0IGl0ZXJhdG9ySW5kZXggPSAwOyBpdGVyYXRvckluZGV4IDwgcm93U3BhbkNlbGxGcmFnbWVudHMubGVuZ3RoOyBpdGVyYXRvckluZGV4KyspIHtcclxuICAgICAgICAgIGNvbnN0IHJvd1NwYW5DZWxsRnJhZ21lbnQgPSByb3dTcGFuQ2VsbEZyYWdtZW50c1tpdGVyYXRvckluZGV4XTtcclxuXHJcbiAgICAgICAgICB0YWJsZVJvd0ZyYWdtZW50LmltcG9ydChyb3dTcGFuQ2VsbEZyYWdtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdGFibGVDZWxsRnJhZ21lbnQgPSBhd2FpdCBidWlsZFRhYmxlQ2VsbChcclxuICAgICAgICBjb2x1bW4sXHJcbiAgICAgICAgeyAuLi5tb2RpZmllZEF0dHJpYnV0ZXMsIG1heGltdW1XaWR0aDogbWF4aW11bUNvbHVtbldpZHRoIH0sXHJcbiAgICAgICAgcm93U3Bhbk1hcCxcclxuICAgICAgICBjb2x1bW5JbmRleCxcclxuICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICApO1xyXG4gICAgICBjb2x1bW5JbmRleC5pbmRleCsrO1xyXG5cclxuICAgICAgdGFibGVSb3dGcmFnbWVudC5pbXBvcnQodGFibGVDZWxsRnJhZ21lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKGNvbHVtbkluZGV4LmluZGV4IDwgcm93U3Bhbk1hcC5zaXplKSB7XHJcbiAgICBjb25zdCByb3dTcGFuQ2VsbEZyYWdtZW50cyA9IGJ1aWxkUm93U3BhbkNlbGwocm93U3Bhbk1hcCwgY29sdW1uSW5kZXgsIG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dTcGFuQ2VsbEZyYWdtZW50cykpIHtcclxuICAgICAgZm9yIChsZXQgaXRlcmF0b3JJbmRleCA9IDA7IGl0ZXJhdG9ySW5kZXggPCByb3dTcGFuQ2VsbEZyYWdtZW50cy5sZW5ndGg7IGl0ZXJhdG9ySW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IHJvd1NwYW5DZWxsRnJhZ21lbnQgPSByb3dTcGFuQ2VsbEZyYWdtZW50c1tpdGVyYXRvckluZGV4XTtcclxuXHJcbiAgICAgICAgdGFibGVSb3dGcmFnbWVudC5pbXBvcnQocm93U3BhbkNlbGxGcmFnbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRhYmxlUm93RnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHRhYmxlUm93RnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFRhYmxlR3JpZENvbCA9IChncmlkV2lkdGgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnZ3JpZENvbCcpXHJcbiAgICAuYXR0KCdAdycsICd3JywgU3RyaW5nKGdyaWRXaWR0aCkpO1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZUdyaWQgPSAodk5vZGUsIGF0dHJpYnV0ZXMpID0+IHtcclxuICBjb25zdCB0YWJsZUdyaWRGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICd0YmxHcmlkJyk7XHJcbiAgaWYgKHZOb2RlSGFzQ2hpbGRyZW4odk5vZGUpKSB7XHJcbiAgICBjb25zdCBncmlkQ29sdW1ucyA9IHZOb2RlLmNoaWxkcmVuLmZpbHRlcigoY2hpbGRWTm9kZSkgPT4gY2hpbGRWTm9kZS50YWdOYW1lID09PSAnY29sJyk7XHJcbiAgICBjb25zdCBncmlkV2lkdGggPSBhdHRyaWJ1dGVzLm1heGltdW1XaWR0aCAvIGdyaWRDb2x1bW5zLmxlbmd0aDtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZ3JpZENvbHVtbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IHRhYmxlR3JpZENvbEZyYWdtZW50ID0gYnVpbGRUYWJsZUdyaWRDb2woZ3JpZFdpZHRoKTtcclxuICAgICAgdGFibGVHcmlkRnJhZ21lbnQuaW1wb3J0KHRhYmxlR3JpZENvbEZyYWdtZW50KTtcclxuICAgIH1cclxuICB9XHJcbiAgdGFibGVHcmlkRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHRhYmxlR3JpZEZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZUdyaWRGcm9tVGFibGVSb3cgPSAodk5vZGUsIGF0dHJpYnV0ZXMpID0+IHtcclxuICBjb25zdCB0YWJsZUdyaWRGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICd0YmxHcmlkJyk7XHJcbiAgaWYgKHZOb2RlSGFzQ2hpbGRyZW4odk5vZGUpKSB7XHJcbiAgICBjb25zdCBudW1iZXJPZkdyaWRDb2x1bW5zID0gdk5vZGUuY2hpbGRyZW4ucmVkdWNlKChhY2N1bXVsYXRvciwgY2hpbGRWTm9kZSkgPT4ge1xyXG4gICAgICBjb25zdCBjb2xTcGFuID1cclxuICAgICAgICBjaGlsZFZOb2RlLnByb3BlcnRpZXMuY29sU3BhbiB8fFxyXG4gICAgICAgIChjaGlsZFZOb2RlLnByb3BlcnRpZXMuc3R5bGUgJiYgY2hpbGRWTm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydjb2x1bW4tc3BhbiddKTtcclxuXHJcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvciArIChjb2xTcGFuID8gcGFyc2VJbnQoY29sU3BhbikgOiAxKTtcclxuICAgIH0sIDApO1xyXG4gICAgY29uc3QgZ3JpZFdpZHRoID0gYXR0cmlidXRlcy5tYXhpbXVtV2lkdGggLyBudW1iZXJPZkdyaWRDb2x1bW5zO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJPZkdyaWRDb2x1bW5zOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IHRhYmxlR3JpZENvbEZyYWdtZW50ID0gYnVpbGRUYWJsZUdyaWRDb2woZ3JpZFdpZHRoKTtcclxuICAgICAgdGFibGVHcmlkRnJhZ21lbnQuaW1wb3J0KHRhYmxlR3JpZENvbEZyYWdtZW50KTtcclxuICAgIH1cclxuICB9XHJcbiAgdGFibGVHcmlkRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHRhYmxlR3JpZEZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZUJvcmRlcnMgPSAodGFibGVCb3JkZXIpID0+IHtcclxuICBjb25zdCB0YWJsZUJvcmRlcnNGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKFxyXG4gICAgJ0B3JyxcclxuICAgICd0YmxCb3JkZXJzJ1xyXG4gICk7XHJcblxyXG4gIGNvbnN0IHsgY29sb3IsIHN0cm9rZSwgLi4uYm9yZGVycyB9ID0gdGFibGVCb3JkZXI7XHJcblxyXG4gIE9iamVjdC5rZXlzKGJvcmRlcnMpLmZvckVhY2goKGJvcmRlcikgPT4ge1xyXG4gICAgaWYgKGJvcmRlcnNbYm9yZGVyXSkge1xyXG4gICAgICBjb25zdCBib3JkZXJGcmFnbWVudCA9IGJ1aWxkQm9yZGVyKGJvcmRlciwgYm9yZGVyc1tib3JkZXJdLCAwLCBjb2xvciwgc3Ryb2tlKTtcclxuICAgICAgdGFibGVCb3JkZXJzRnJhZ21lbnQuaW1wb3J0KGJvcmRlckZyYWdtZW50KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgdGFibGVCb3JkZXJzRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHRhYmxlQm9yZGVyc0ZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZVdpZHRoID0gKHRhYmxlV2lkdGgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAndGJsVycpXHJcbiAgICAuYXR0KCdAdycsICd0eXBlJywgJ2R4YScpXHJcbiAgICAuYXR0KCdAdycsICd3JywgU3RyaW5nKHRhYmxlV2lkdGgpKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZENlbGxNYXJnaW4gPSAoc2lkZSwgbWFyZ2luKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3Jywgc2lkZSlcclxuICAgIC5hdHQoJ0B3JywgJ3R5cGUnLCAnZHhhJylcclxuICAgIC5hdHQoJ0B3JywgJ3cnLCBTdHJpbmcobWFyZ2luKSlcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZUNlbGxNYXJnaW5zID0gKG1hcmdpbikgPT4ge1xyXG4gIGNvbnN0IHRhYmxlQ2VsbE1hckZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3RibENlbGxNYXInXHJcbiAgKTtcclxuXHJcbiAgWyd0b3AnLCAnYm90dG9tJ10uZm9yRWFjaCgoc2lkZSkgPT4ge1xyXG4gICAgY29uc3QgbWFyZ2luRnJhZ21lbnQgPSBidWlsZENlbGxNYXJnaW4oc2lkZSwgbWFyZ2luIC8gMik7XHJcbiAgICB0YWJsZUNlbGxNYXJGcmFnbWVudC5pbXBvcnQobWFyZ2luRnJhZ21lbnQpO1xyXG4gIH0pO1xyXG4gIFsnbGVmdCcsICdyaWdodCddLmZvckVhY2goKHNpZGUpID0+IHtcclxuICAgIGNvbnN0IG1hcmdpbkZyYWdtZW50ID0gYnVpbGRDZWxsTWFyZ2luKHNpZGUsIG1hcmdpbik7XHJcbiAgICB0YWJsZUNlbGxNYXJGcmFnbWVudC5pbXBvcnQobWFyZ2luRnJhZ21lbnQpO1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gdGFibGVDZWxsTWFyRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFRhYmxlUHJvcGVydGllcyA9IChhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgdGFibGVQcm9wZXJ0aWVzRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZShcclxuICAgICdAdycsXHJcbiAgICAndGJsUHInXHJcbiAgKTtcclxuXHJcbiAgaWYgKGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XHJcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgICBjYXNlICd0YWJsZUJvcmRlcic6XHJcbiAgICAgICAgICBjb25zdCB0YWJsZUJvcmRlcnNGcmFnbWVudCA9IGJ1aWxkVGFibGVCb3JkZXJzKGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICB0YWJsZVByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQodGFibGVCb3JkZXJzRnJhZ21lbnQpO1xyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXHJcbiAgICAgICAgICBkZWxldGUgYXR0cmlidXRlcy50YWJsZUJvcmRlcjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RhYmxlQ2VsbFNwYWNpbmcnOlxyXG4gICAgICAgICAgY29uc3QgdGFibGVDZWxsU3BhY2luZ0ZyYWdtZW50ID0gYnVpbGRUYWJsZUNlbGxTcGFjaW5nKGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICB0YWJsZVByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQodGFibGVDZWxsU3BhY2luZ0ZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMudGFibGVDZWxsU3BhY2luZztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3dpZHRoJzpcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGVzW2tleV0pIHtcclxuICAgICAgICAgICAgY29uc3QgdGFibGVXaWR0aEZyYWdtZW50ID0gYnVpbGRUYWJsZVdpZHRoKGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICAgIHRhYmxlUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydCh0YWJsZVdpZHRoRnJhZ21lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXHJcbiAgICAgICAgICBkZWxldGUgYXR0cmlidXRlcy53aWR0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgY29uc3QgdGFibGVDZWxsTWFyZ2luRnJhZ21lbnQgPSBidWlsZFRhYmxlQ2VsbE1hcmdpbnMoMTYwKTtcclxuICB0YWJsZVByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQodGFibGVDZWxsTWFyZ2luRnJhZ21lbnQpO1xyXG5cclxuICAvLyBieSBkZWZhdWx0LCBhbGwgdGFibGVzIGFyZSBjZW50ZXIgYWxpZ25lZC5cclxuICBjb25zdCBhbGlnbm1lbnRGcmFnbWVudCA9IGJ1aWxkSG9yaXpvbnRhbEFsaWdubWVudCgnY2VudGVyJyk7XHJcbiAgdGFibGVQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KGFsaWdubWVudEZyYWdtZW50KTtcclxuXHJcbiAgdGFibGVQcm9wZXJ0aWVzRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHRhYmxlUHJvcGVydGllc0ZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgY3NzQm9yZGVyUGFyc2VyID0gKGJvcmRlclN0cmluZykgPT4ge1xyXG4gIGxldCBbc2l6ZSwgc3Ryb2tlLCBjb2xvcl0gPSBib3JkZXJTdHJpbmcuc3BsaXQoJyAnKTtcclxuXHJcbiAgaWYgKHBvaW50UmVnZXgudGVzdChzaXplKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gc2l6ZS5tYXRjaChwb2ludFJlZ2V4KTtcclxuICAgIC8vIGNvbnZlcnQgcG9pbnQgdG8gZWlnaHRoIG9mIGEgcG9pbnRcclxuICAgIHNpemUgPSBwb2ludFRvRUlQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfSBlbHNlIGlmIChwaXhlbFJlZ2V4LnRlc3Qoc2l6ZSkpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRQYXJ0cyA9IHNpemUubWF0Y2gocGl4ZWxSZWdleCk7XHJcbiAgICAvLyBjb252ZXJ0IHBpeGVscyB0byBlaWdodGggb2YgYSBwb2ludFxyXG4gICAgc2l6ZSA9IHBpeGVsVG9FSVAobWF0Y2hlZFBhcnRzWzFdKTtcclxuICB9XHJcbiAgc3Ryb2tlID0gc3Ryb2tlICYmIFsnZGFzaGVkJywgJ2RvdHRlZCcsICdkb3VibGUnXS5pbmNsdWRlcyhzdHJva2UpID8gc3Ryb2tlIDogJ3NpbmdsZSc7XHJcblxyXG4gIGNvbG9yID0gY29sb3IgJiYgZml4dXBDb2xvckNvZGUoY29sb3IpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gIHJldHVybiBbc2l6ZSwgc3Ryb2tlLCBjb2xvcl07XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFRhYmxlID0gYXN5bmMgKHZOb2RlLCBhdHRyaWJ1dGVzLCBkb2N4RG9jdW1lbnRJbnN0YW5jZSkgPT4ge1xyXG4gIGNvbnN0IHRhYmxlRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAndGJsJyk7XHJcbiAgY29uc3QgbW9kaWZpZWRBdHRyaWJ1dGVzID0geyAuLi5hdHRyaWJ1dGVzIH07XHJcbiAgaWYgKGlzVk5vZGUodk5vZGUpICYmIHZOb2RlLnByb3BlcnRpZXMpIHtcclxuICAgIGNvbnN0IHRhYmxlQXR0cmlidXRlcyA9IHZOb2RlLnByb3BlcnRpZXMuYXR0cmlidXRlcyB8fCB7fTtcclxuICAgIGNvbnN0IHRhYmxlU3R5bGVzID0gdk5vZGUucHJvcGVydGllcy5zdHlsZSB8fCB7fTtcclxuICAgIGNvbnN0IHRhYmxlQm9yZGVycyA9IHt9O1xyXG4gICAgY29uc3QgdGFibGVDZWxsQm9yZGVycyA9IHt9O1xyXG4gICAgbGV0IFtib3JkZXJTaXplLCBib3JkZXJTdHJpa2UsIGJvcmRlckNvbG9yXSA9IFsyLCAnc2luZ2xlJywgJzAwMDAwMCddO1xyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcclxuICAgIGlmICghaXNOYU4odGFibGVBdHRyaWJ1dGVzLmJvcmRlcikpIHtcclxuICAgICAgYm9yZGVyU2l6ZSA9IHBhcnNlSW50KHRhYmxlQXR0cmlidXRlcy5ib3JkZXIsIDEwKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjc3Mgc3R5bGUgb3ZlcnJpZGVzIHRhYmxlIGJvcmRlciBwcm9wZXJ0aWVzXHJcbiAgICBpZiAodGFibGVTdHlsZXMuYm9yZGVyKSB7XHJcbiAgICAgIGNvbnN0IFtjc3NTaXplLCBjc3NTdHJva2UsIGNzc0NvbG9yXSA9IGNzc0JvcmRlclBhcnNlcih0YWJsZVN0eWxlcy5ib3JkZXIpO1xyXG4gICAgICBib3JkZXJTaXplID0gY3NzU2l6ZSB8fCBib3JkZXJTaXplO1xyXG4gICAgICBib3JkZXJDb2xvciA9IGNzc0NvbG9yIHx8IGJvcmRlckNvbG9yO1xyXG4gICAgICBib3JkZXJTdHJpa2UgPSBjc3NTdHJva2UgfHwgYm9yZGVyU3RyaWtlO1xyXG4gICAgfVxyXG5cclxuICAgIHRhYmxlQm9yZGVycy50b3AgPSBib3JkZXJTaXplO1xyXG4gICAgdGFibGVCb3JkZXJzLmJvdHRvbSA9IGJvcmRlclNpemU7XHJcbiAgICB0YWJsZUJvcmRlcnMubGVmdCA9IGJvcmRlclNpemU7XHJcbiAgICB0YWJsZUJvcmRlcnMucmlnaHQgPSBib3JkZXJTaXplO1xyXG4gICAgdGFibGVCb3JkZXJzLnN0cm9rZSA9IGJvcmRlclN0cmlrZTtcclxuICAgIHRhYmxlQm9yZGVycy5jb2xvciA9IGJvcmRlckNvbG9yO1xyXG5cclxuICAgIGlmICh0YWJsZVN0eWxlc1snYm9yZGVyLWNvbGxhcHNlJ10gPT09ICdjb2xsYXBzZScpIHtcclxuICAgICAgdGFibGVCb3JkZXJzLmluc2lkZVYgPSBib3JkZXJTaXplO1xyXG4gICAgICB0YWJsZUJvcmRlcnMuaW5zaWRlSCA9IGJvcmRlclNpemU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YWJsZUJvcmRlcnMuaW5zaWRlViA9IDA7XHJcbiAgICAgIHRhYmxlQm9yZGVycy5pbnNpZGVIID0gMDtcclxuICAgICAgdGFibGVDZWxsQm9yZGVycy50b3AgPSAxO1xyXG4gICAgICB0YWJsZUNlbGxCb3JkZXJzLmJvdHRvbSA9IDE7XHJcbiAgICAgIHRhYmxlQ2VsbEJvcmRlcnMubGVmdCA9IDE7XHJcbiAgICAgIHRhYmxlQ2VsbEJvcmRlcnMucmlnaHQgPSAxO1xyXG4gICAgfVxyXG5cclxuICAgIG1vZGlmaWVkQXR0cmlidXRlcy50YWJsZUJvcmRlciA9IHRhYmxlQm9yZGVycztcclxuICAgIG1vZGlmaWVkQXR0cmlidXRlcy50YWJsZUNlbGxTcGFjaW5nID0gMDtcclxuXHJcbiAgICBpZiAoT2JqZWN0LmtleXModGFibGVDZWxsQm9yZGVycykubGVuZ3RoKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB0YWJsZUNlbGxCb3JkZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtaW5pbXVtV2lkdGg7XHJcbiAgICBsZXQgbWF4aW11bVdpZHRoO1xyXG4gICAgbGV0IHdpZHRoO1xyXG4gICAgLy8gQ2FsY3VsYXRlIG1pbmltdW0gd2lkdGggb2YgdGFibGVcclxuICAgIGlmIChwaXhlbFJlZ2V4LnRlc3QodGFibGVTdHlsZXNbJ21pbi13aWR0aCddKSkge1xyXG4gICAgICBtaW5pbXVtV2lkdGggPSBwaXhlbFRvVFdJUCh0YWJsZVN0eWxlc1snbWluLXdpZHRoJ10ubWF0Y2gocGl4ZWxSZWdleClbMV0pO1xyXG4gICAgfSBlbHNlIGlmIChwZXJjZW50YWdlUmVnZXgudGVzdCh0YWJsZVN0eWxlc1snbWluLXdpZHRoJ10pKSB7XHJcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2VWYWx1ZSA9IHRhYmxlU3R5bGVzWydtaW4td2lkdGgnXS5tYXRjaChwZXJjZW50YWdlUmVnZXgpWzFdO1xyXG4gICAgICBtaW5pbXVtV2lkdGggPSBNYXRoLnJvdW5kKChwZXJjZW50YWdlVmFsdWUgLyAxMDApICogYXR0cmlidXRlcy5tYXhpbXVtV2lkdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhbGN1bGF0ZSBtYXhpbXVtIHdpZHRoIG9mIHRhYmxlXHJcbiAgICBpZiAocGl4ZWxSZWdleC50ZXN0KHRhYmxlU3R5bGVzWydtYXgtd2lkdGgnXSkpIHtcclxuICAgICAgcGl4ZWxSZWdleC5sYXN0SW5kZXggPSAwO1xyXG4gICAgICBtYXhpbXVtV2lkdGggPSBwaXhlbFRvVFdJUCh0YWJsZVN0eWxlc1snbWF4LXdpZHRoJ10ubWF0Y2gocGl4ZWxSZWdleClbMV0pO1xyXG4gICAgfSBlbHNlIGlmIChwZXJjZW50YWdlUmVnZXgudGVzdCh0YWJsZVN0eWxlc1snbWF4LXdpZHRoJ10pKSB7XHJcbiAgICAgIHBlcmNlbnRhZ2VSZWdleC5sYXN0SW5kZXggPSAwO1xyXG4gICAgICBjb25zdCBwZXJjZW50YWdlVmFsdWUgPSB0YWJsZVN0eWxlc1snbWF4LXdpZHRoJ10ubWF0Y2gocGVyY2VudGFnZVJlZ2V4KVsxXTtcclxuICAgICAgbWF4aW11bVdpZHRoID0gTWF0aC5yb3VuZCgocGVyY2VudGFnZVZhbHVlIC8gMTAwKSAqIGF0dHJpYnV0ZXMubWF4aW11bVdpZHRoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxjdWxhdGUgc3BlY2lmaWVkIHdpZHRoIG9mIHRhYmxlXHJcbiAgICBpZiAocGl4ZWxSZWdleC50ZXN0KHRhYmxlU3R5bGVzLndpZHRoKSkge1xyXG4gICAgICBwaXhlbFJlZ2V4Lmxhc3RJbmRleCA9IDA7XHJcbiAgICAgIHdpZHRoID0gcGl4ZWxUb1RXSVAodGFibGVTdHlsZXMud2lkdGgubWF0Y2gocGl4ZWxSZWdleClbMV0pO1xyXG4gICAgfSBlbHNlIGlmIChwZXJjZW50YWdlUmVnZXgudGVzdCh0YWJsZVN0eWxlcy53aWR0aCkpIHtcclxuICAgICAgcGVyY2VudGFnZVJlZ2V4Lmxhc3RJbmRleCA9IDA7XHJcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2VWYWx1ZSA9IHRhYmxlU3R5bGVzLndpZHRoLm1hdGNoKHBlcmNlbnRhZ2VSZWdleClbMV07XHJcbiAgICAgIHdpZHRoID0gTWF0aC5yb3VuZCgocGVyY2VudGFnZVZhbHVlIC8gMTAwKSAqIGF0dHJpYnV0ZXMubWF4aW11bVdpZHRoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB3aWR0aCBpc24ndCBzdXBwbGllZCwgd2Ugc2hvdWxkIGhhdmUgbWluLXdpZHRoIGFzIHRoZSB3aWR0aC5cclxuICAgIGlmICh3aWR0aCkge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgaWYgKG1heGltdW1XaWR0aCkge1xyXG4gICAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy53aWR0aCA9IE1hdGgubWluKG1vZGlmaWVkQXR0cmlidXRlcy53aWR0aCwgbWF4aW11bVdpZHRoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWluaW11bVdpZHRoKSB7XHJcbiAgICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLndpZHRoID0gTWF0aC5tYXgobW9kaWZpZWRBdHRyaWJ1dGVzLndpZHRoLCBtaW5pbXVtV2lkdGgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKG1pbmltdW1XaWR0aCkge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMud2lkdGggPSBtaW5pbXVtV2lkdGg7XHJcbiAgICB9XHJcbiAgICBpZiAobW9kaWZpZWRBdHRyaWJ1dGVzLndpZHRoKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy53aWR0aCA9IE1hdGgubWluKG1vZGlmaWVkQXR0cmlidXRlcy53aWR0aCwgYXR0cmlidXRlcy5tYXhpbXVtV2lkdGgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCB0YWJsZVByb3BlcnRpZXNGcmFnbWVudCA9IGJ1aWxkVGFibGVQcm9wZXJ0aWVzKG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgdGFibGVGcmFnbWVudC5pbXBvcnQodGFibGVQcm9wZXJ0aWVzRnJhZ21lbnQpO1xyXG5cclxuICBjb25zdCByb3dTcGFuTWFwID0gbmV3IE1hcCgpO1xyXG5cclxuICBpZiAodk5vZGVIYXNDaGlsZHJlbih2Tm9kZSkpIHtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2Tm9kZS5jaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgY2hpbGRWTm9kZSA9IHZOb2RlLmNoaWxkcmVuW2luZGV4XTtcclxuICAgICAgaWYgKGNoaWxkVk5vZGUudGFnTmFtZSA9PT0gJ2NvbGdyb3VwJykge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlR3JpZEZyYWdtZW50ID0gYnVpbGRUYWJsZUdyaWQoY2hpbGRWTm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICAgICAgICB0YWJsZUZyYWdtZW50LmltcG9ydCh0YWJsZUdyaWRGcmFnbWVudCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGRWTm9kZS50YWdOYW1lID09PSAndGhlYWQnKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaXRlcmF0b3JJbmRleCA9IDA7IGl0ZXJhdG9ySW5kZXggPCBjaGlsZFZOb2RlLmNoaWxkcmVuLmxlbmd0aDsgaXRlcmF0b3JJbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBncmFuZENoaWxkVk5vZGUgPSBjaGlsZFZOb2RlLmNoaWxkcmVuW2l0ZXJhdG9ySW5kZXhdO1xyXG4gICAgICAgICAgaWYgKGdyYW5kQ2hpbGRWTm9kZS50YWdOYW1lID09PSAndHInKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVyYXRvckluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFibGVHcmlkRnJhZ21lbnQgPSBidWlsZFRhYmxlR3JpZEZyb21UYWJsZVJvdyhcclxuICAgICAgICAgICAgICAgIGdyYW5kQ2hpbGRWTm9kZSxcclxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgdGFibGVGcmFnbWVudC5pbXBvcnQodGFibGVHcmlkRnJhZ21lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUm93RnJhZ21lbnQgPSBhd2FpdCBidWlsZFRhYmxlUm93KFxyXG4gICAgICAgICAgICAgIGdyYW5kQ2hpbGRWTm9kZSxcclxuICAgICAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMsXHJcbiAgICAgICAgICAgICAgcm93U3Bhbk1hcCxcclxuICAgICAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0YWJsZUZyYWdtZW50LmltcG9ydCh0YWJsZVJvd0ZyYWdtZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGRWTm9kZS50YWdOYW1lID09PSAndGJvZHknKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaXRlcmF0b3JJbmRleCA9IDA7IGl0ZXJhdG9ySW5kZXggPCBjaGlsZFZOb2RlLmNoaWxkcmVuLmxlbmd0aDsgaXRlcmF0b3JJbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBncmFuZENoaWxkVk5vZGUgPSBjaGlsZFZOb2RlLmNoaWxkcmVuW2l0ZXJhdG9ySW5kZXhdO1xyXG4gICAgICAgICAgaWYgKGdyYW5kQ2hpbGRWTm9kZS50YWdOYW1lID09PSAndHInKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVyYXRvckluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFibGVHcmlkRnJhZ21lbnQgPSBidWlsZFRhYmxlR3JpZEZyb21UYWJsZVJvdyhcclxuICAgICAgICAgICAgICAgIGdyYW5kQ2hpbGRWTm9kZSxcclxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgdGFibGVGcmFnbWVudC5pbXBvcnQodGFibGVHcmlkRnJhZ21lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUm93RnJhZ21lbnQgPSBhd2FpdCBidWlsZFRhYmxlUm93KFxyXG4gICAgICAgICAgICAgIGdyYW5kQ2hpbGRWTm9kZSxcclxuICAgICAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMsXHJcbiAgICAgICAgICAgICAgcm93U3Bhbk1hcCxcclxuICAgICAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0YWJsZUZyYWdtZW50LmltcG9ydCh0YWJsZVJvd0ZyYWdtZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGRWTm9kZS50YWdOYW1lID09PSAndHInKSB7XHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCB0YWJsZUdyaWRGcmFnbWVudCA9IGJ1aWxkVGFibGVHcmlkRnJvbVRhYmxlUm93KGNoaWxkVk5vZGUsIG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgICAgICAgICB0YWJsZUZyYWdtZW50LmltcG9ydCh0YWJsZUdyaWRGcmFnbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhYmxlUm93RnJhZ21lbnQgPSBhd2FpdCBidWlsZFRhYmxlUm93KFxyXG4gICAgICAgICAgY2hpbGRWTm9kZSxcclxuICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlcyxcclxuICAgICAgICAgIHJvd1NwYW5NYXAsXHJcbiAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGFibGVGcmFnbWVudC5pbXBvcnQodGFibGVSb3dGcmFnbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgdGFibGVGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gdGFibGVGcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkUHJlc2V0R2VvbWV0cnkgPSAoKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgYTogbmFtZXNwYWNlcy5hIH0gfSlcclxuICAgIC5lbGUoJ0BhJywgJ3Byc3RHZW9tJylcclxuICAgIC5hdHQoJ3Byc3QnLCAncmVjdCcpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkRXh0ZW50cyA9ICh7IHdpZHRoLCBoZWlnaHQgfSkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IGE6IG5hbWVzcGFjZXMuYSB9IH0pXHJcbiAgICAuZWxlKCdAYScsICdleHQnKVxyXG4gICAgLmF0dCgnY3gnLCB3aWR0aClcclxuICAgIC5hdHQoJ2N5JywgaGVpZ2h0KVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZE9mZnNldCA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyBhOiBuYW1lc3BhY2VzLmEgfSB9KVxyXG4gICAgLmVsZSgnQGEnLCAnb2ZmJylcclxuICAgIC5hdHQoJ3gnLCAnMCcpXHJcbiAgICAuYXR0KCd5JywgJzAnKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZEdyYXBoaWNGcmFtZVRyYW5zZm9ybSA9IChhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgZ3JhcGhpY0ZyYW1lVHJhbnNmb3JtRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IGE6IG5hbWVzcGFjZXMuYSB9IH0pLmVsZShcclxuICAgICdAYScsXHJcbiAgICAneGZybSdcclxuICApO1xyXG5cclxuICBjb25zdCBvZmZzZXRGcmFnbWVudCA9IGJ1aWxkT2Zmc2V0KCk7XHJcbiAgZ3JhcGhpY0ZyYW1lVHJhbnNmb3JtRnJhZ21lbnQuaW1wb3J0KG9mZnNldEZyYWdtZW50KTtcclxuICBjb25zdCBleHRlbnRzRnJhZ21lbnQgPSBidWlsZEV4dGVudHMoYXR0cmlidXRlcyk7XHJcbiAgZ3JhcGhpY0ZyYW1lVHJhbnNmb3JtRnJhZ21lbnQuaW1wb3J0KGV4dGVudHNGcmFnbWVudCk7XHJcblxyXG4gIGdyYXBoaWNGcmFtZVRyYW5zZm9ybUZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBncmFwaGljRnJhbWVUcmFuc2Zvcm1GcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkU2hhcGVQcm9wZXJ0aWVzID0gKGF0dHJpYnV0ZXMpID0+IHtcclxuICBjb25zdCBzaGFwZVByb3BlcnRpZXMgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHBpYzogbmFtZXNwYWNlcy5waWMgfSB9KS5lbGUoJ0BwaWMnLCAnc3BQcicpO1xyXG5cclxuICBjb25zdCBncmFwaGljRnJhbWVUcmFuc2Zvcm1GcmFnbWVudCA9IGJ1aWxkR3JhcGhpY0ZyYW1lVHJhbnNmb3JtKGF0dHJpYnV0ZXMpO1xyXG4gIHNoYXBlUHJvcGVydGllcy5pbXBvcnQoZ3JhcGhpY0ZyYW1lVHJhbnNmb3JtRnJhZ21lbnQpO1xyXG4gIGNvbnN0IHByZXNldEdlb21ldHJ5RnJhZ21lbnQgPSBidWlsZFByZXNldEdlb21ldHJ5KCk7XHJcbiAgc2hhcGVQcm9wZXJ0aWVzLmltcG9ydChwcmVzZXRHZW9tZXRyeUZyYWdtZW50KTtcclxuXHJcbiAgc2hhcGVQcm9wZXJ0aWVzLnVwKCk7XHJcblxyXG4gIHJldHVybiBzaGFwZVByb3BlcnRpZXM7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZEZpbGxSZWN0ID0gKCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IGE6IG5hbWVzcGFjZXMuYSB9IH0pXHJcbiAgICAuZWxlKCdAYScsICdmaWxsUmVjdCcpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkU3RyZXRjaCA9ICgpID0+IHtcclxuICBjb25zdCBzdHJldGNoRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IGE6IG5hbWVzcGFjZXMuYSB9IH0pLmVsZSgnQGEnLCAnc3RyZXRjaCcpO1xyXG5cclxuICBjb25zdCBmaWxsUmVjdEZyYWdtZW50ID0gYnVpbGRGaWxsUmVjdCgpO1xyXG4gIHN0cmV0Y2hGcmFnbWVudC5pbXBvcnQoZmlsbFJlY3RGcmFnbWVudCk7XHJcblxyXG4gIHN0cmV0Y2hGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gc3RyZXRjaEZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRTcmNSZWN0RnJhZ21lbnQgPSAoKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgYTogbmFtZXNwYWNlcy5hIH0gfSlcclxuICAgIC5lbGUoJ0BhJywgJ3NyY1JlY3QnKVxyXG4gICAgLmF0dCgnYicsICcwJylcclxuICAgIC5hdHQoJ2wnLCAnMCcpXHJcbiAgICAuYXR0KCdyJywgJzAnKVxyXG4gICAgLmF0dCgndCcsICcwJylcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRCaW5hcnlMYXJnZUltYWdlT3JQaWN0dXJlID0gKHJlbGF0aW9uc2hpcElkKSA9PlxyXG4gIGZyYWdtZW50KHtcclxuICAgIG5hbWVzcGFjZUFsaWFzOiB7IGE6IG5hbWVzcGFjZXMuYSwgcjogbmFtZXNwYWNlcy5yIH0sXHJcbiAgfSlcclxuICAgIC5lbGUoJ0BhJywgJ2JsaXAnKVxyXG4gICAgLmF0dCgnQHInLCAnZW1iZWQnLCBgcklkJHtyZWxhdGlvbnNoaXBJZH1gKVxyXG4gICAgLy8gRklYTUU6IHBvc3NpYmxlIHZhbHVlcyAnZW1haWwnLCAnbm9uZScsICdwcmludCcsICdocXByaW50JywgJ3NjcmVlbidcclxuICAgIC5hdHQoJ2NzdGF0ZScsICdwcmludCcpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkQmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGwgPSAocmVsYXRpb25zaGlwSWQpID0+IHtcclxuICBjb25zdCBiaW5hcnlMYXJnZUltYWdlT3JQaWN0dXJlRmlsbEZyYWdtZW50ID0gZnJhZ21lbnQoe1xyXG4gICAgbmFtZXNwYWNlQWxpYXM6IHsgcGljOiBuYW1lc3BhY2VzLnBpYyB9LFxyXG4gIH0pLmVsZSgnQHBpYycsICdibGlwRmlsbCcpO1xyXG4gIGNvbnN0IGJpbmFyeUxhcmdlSW1hZ2VPclBpY3R1cmVGcmFnbWVudCA9IGJ1aWxkQmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZShyZWxhdGlvbnNoaXBJZCk7XHJcbiAgYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGxGcmFnbWVudC5pbXBvcnQoYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZyYWdtZW50KTtcclxuICBjb25zdCBzcmNSZWN0RnJhZ21lbnQgPSBidWlsZFNyY1JlY3RGcmFnbWVudCgpO1xyXG4gIGJpbmFyeUxhcmdlSW1hZ2VPclBpY3R1cmVGaWxsRnJhZ21lbnQuaW1wb3J0KHNyY1JlY3RGcmFnbWVudCk7XHJcbiAgY29uc3Qgc3RyZXRjaEZyYWdtZW50ID0gYnVpbGRTdHJldGNoKCk7XHJcbiAgYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGxGcmFnbWVudC5pbXBvcnQoc3RyZXRjaEZyYWdtZW50KTtcclxuXHJcbiAgYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGxGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGxGcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkTm9uVmlzdWFsUGljdHVyZURyYXdpbmdQcm9wZXJ0aWVzID0gKCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHBpYzogbmFtZXNwYWNlcy5waWMgfSB9KVxyXG4gICAgLmVsZSgnQHBpYycsICdjTnZQaWNQcicpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkTm9uVmlzdWFsRHJhd2luZ1Byb3BlcnRpZXMgPSAoXHJcbiAgcGljdHVyZUlkLFxyXG4gIHBpY3R1cmVOYW1lV2l0aEV4dGVuc2lvbixcclxuICBwaWN0dXJlRGVzY3JpcHRpb24gPSAnJ1xyXG4pID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyBwaWM6IG5hbWVzcGFjZXMucGljIH0gfSlcclxuICAgIC5lbGUoJ0BwaWMnLCAnY052UHInKVxyXG4gICAgLmF0dCgnaWQnLCBwaWN0dXJlSWQpXHJcbiAgICAuYXR0KCduYW1lJywgcGljdHVyZU5hbWVXaXRoRXh0ZW5zaW9uKVxyXG4gICAgLmF0dCgnZGVzY3InLCBwaWN0dXJlRGVzY3JpcHRpb24pXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkTm9uVmlzdWFsUGljdHVyZVByb3BlcnRpZXMgPSAoXHJcbiAgcGljdHVyZUlkLFxyXG4gIHBpY3R1cmVOYW1lV2l0aEV4dGVuc2lvbixcclxuICBwaWN0dXJlRGVzY3JpcHRpb25cclxuKSA9PiB7XHJcbiAgY29uc3Qgbm9uVmlzdWFsUGljdHVyZVByb3BlcnRpZXNGcmFnbWVudCA9IGZyYWdtZW50KHtcclxuICAgIG5hbWVzcGFjZUFsaWFzOiB7IHBpYzogbmFtZXNwYWNlcy5waWMgfSxcclxuICB9KS5lbGUoJ0BwaWMnLCAnbnZQaWNQcicpO1xyXG4gIC8vIFRPRE86IEhhbmRsZSBwaWN0dXJlIGF0dHJpYnV0ZXNcclxuICBjb25zdCBub25WaXN1YWxEcmF3aW5nUHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGROb25WaXN1YWxEcmF3aW5nUHJvcGVydGllcyhcclxuICAgIHBpY3R1cmVJZCxcclxuICAgIHBpY3R1cmVOYW1lV2l0aEV4dGVuc2lvbixcclxuICAgIHBpY3R1cmVEZXNjcmlwdGlvblxyXG4gICk7XHJcbiAgbm9uVmlzdWFsUGljdHVyZVByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQobm9uVmlzdWFsRHJhd2luZ1Byb3BlcnRpZXNGcmFnbWVudCk7XHJcbiAgY29uc3Qgbm9uVmlzdWFsUGljdHVyZURyYXdpbmdQcm9wZXJ0aWVzRnJhZ21lbnQgPSBidWlsZE5vblZpc3VhbFBpY3R1cmVEcmF3aW5nUHJvcGVydGllcygpO1xyXG4gIG5vblZpc3VhbFBpY3R1cmVQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KG5vblZpc3VhbFBpY3R1cmVEcmF3aW5nUHJvcGVydGllc0ZyYWdtZW50KTtcclxuICBub25WaXN1YWxQaWN0dXJlUHJvcGVydGllc0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBub25WaXN1YWxQaWN0dXJlUHJvcGVydGllc0ZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRQaWN0dXJlID0gKHtcclxuICBpZCxcclxuICBmaWxlTmFtZVdpdGhFeHRlbnNpb24sXHJcbiAgZGVzY3JpcHRpb24sXHJcbiAgcmVsYXRpb25zaGlwSWQsXHJcbiAgd2lkdGgsXHJcbiAgaGVpZ2h0LFxyXG59KSA9PiB7XHJcbiAgY29uc3QgcGljdHVyZUZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyBwaWM6IG5hbWVzcGFjZXMucGljIH0gfSkuZWxlKCdAcGljJywgJ3BpYycpO1xyXG4gIGNvbnN0IG5vblZpc3VhbFBpY3R1cmVQcm9wZXJ0aWVzRnJhZ21lbnQgPSBidWlsZE5vblZpc3VhbFBpY3R1cmVQcm9wZXJ0aWVzKFxyXG4gICAgaWQsXHJcbiAgICBmaWxlTmFtZVdpdGhFeHRlbnNpb24sXHJcbiAgICBkZXNjcmlwdGlvblxyXG4gICk7XHJcbiAgcGljdHVyZUZyYWdtZW50LmltcG9ydChub25WaXN1YWxQaWN0dXJlUHJvcGVydGllc0ZyYWdtZW50KTtcclxuICBjb25zdCBiaW5hcnlMYXJnZUltYWdlT3JQaWN0dXJlRmlsbCA9IGJ1aWxkQmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGwocmVsYXRpb25zaGlwSWQpO1xyXG4gIHBpY3R1cmVGcmFnbWVudC5pbXBvcnQoYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGwpO1xyXG4gIGNvbnN0IHNoYXBlUHJvcGVydGllcyA9IGJ1aWxkU2hhcGVQcm9wZXJ0aWVzKHsgd2lkdGgsIGhlaWdodCB9KTtcclxuICBwaWN0dXJlRnJhZ21lbnQuaW1wb3J0KHNoYXBlUHJvcGVydGllcyk7XHJcbiAgcGljdHVyZUZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBwaWN0dXJlRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZEdyYXBoaWNEYXRhID0gKGdyYXBoaWNUeXBlLCBhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgZ3JhcGhpY0RhdGFGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgYTogbmFtZXNwYWNlcy5hIH0gfSlcclxuICAgIC5lbGUoJ0BhJywgJ2dyYXBoaWNEYXRhJylcclxuICAgIC5hdHQoJ3VyaScsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvcGljdHVyZScpO1xyXG4gIGlmIChncmFwaGljVHlwZSA9PT0gJ3BpY3R1cmUnKSB7XHJcbiAgICBjb25zdCBwaWN0dXJlRnJhZ21lbnQgPSBidWlsZFBpY3R1cmUoYXR0cmlidXRlcyk7XHJcbiAgICBncmFwaGljRGF0YUZyYWdtZW50LmltcG9ydChwaWN0dXJlRnJhZ21lbnQpO1xyXG4gIH1cclxuICBncmFwaGljRGF0YUZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBncmFwaGljRGF0YUZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRHcmFwaGljID0gKGdyYXBoaWNUeXBlLCBhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgZ3JhcGhpY0ZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyBhOiBuYW1lc3BhY2VzLmEgfSB9KS5lbGUoJ0BhJywgJ2dyYXBoaWMnKTtcclxuICAvLyBUT0RPOiBIYW5kbGUgZHJhd2luZyB0eXBlXHJcbiAgY29uc3QgZ3JhcGhpY0RhdGFGcmFnbWVudCA9IGJ1aWxkR3JhcGhpY0RhdGEoZ3JhcGhpY1R5cGUsIGF0dHJpYnV0ZXMpO1xyXG4gIGdyYXBoaWNGcmFnbWVudC5pbXBvcnQoZ3JhcGhpY0RhdGFGcmFnbWVudCk7XHJcbiAgZ3JhcGhpY0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBncmFwaGljRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZERyYXdpbmdPYmplY3ROb25WaXN1YWxQcm9wZXJ0aWVzID0gKHBpY3R1cmVJZCwgcGljdHVyZU5hbWUpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3cDogbmFtZXNwYWNlcy53cCB9IH0pXHJcbiAgICAuZWxlKCdAd3AnLCAnZG9jUHInKVxyXG4gICAgLmF0dCgnaWQnLCBwaWN0dXJlSWQpXHJcbiAgICAuYXR0KCduYW1lJywgcGljdHVyZU5hbWUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkV3JhcFNxdWFyZSA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3cDogbmFtZXNwYWNlcy53cCB9IH0pXHJcbiAgICAuZWxlKCdAd3AnLCAnd3JhcFNxdWFyZScpXHJcbiAgICAuYXR0KCd3cmFwVGV4dCcsICdib3RoU2lkZXMnKVxyXG4gICAgLmF0dCgnZGlzdEInLCAnMjI4NjAwJylcclxuICAgIC5hdHQoJ2Rpc3RUJywgJzIyODYwMCcpXHJcbiAgICAuYXR0KCdkaXN0TCcsICcyMjg2MDAnKVxyXG4gICAgLmF0dCgnZGlzdFInLCAnMjI4NjAwJylcclxuICAgIC51cCgpO1xyXG5cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbmNvbnN0IGJ1aWxkV3JhcE5vbmUgPSAoKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgd3A6IG5hbWVzcGFjZXMud3AgfSB9KVxyXG4gICAgLmVsZSgnQHdwJywgJ3dyYXBOb25lJylcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRFZmZlY3RFeHRlbnRGcmFnbWVudCA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3cDogbmFtZXNwYWNlcy53cCB9IH0pXHJcbiAgICAuZWxlKCdAd3AnLCAnZWZmZWN0RXh0ZW50JylcclxuICAgIC5hdHQoJ2InLCAnMCcpXHJcbiAgICAuYXR0KCdsJywgJzAnKVxyXG4gICAgLmF0dCgncicsICcwJylcclxuICAgIC5hdHQoJ3QnLCAnMCcpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkRXh0ZW50ID0gKHsgd2lkdGgsIGhlaWdodCB9KSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgd3A6IG5hbWVzcGFjZXMud3AgfSB9KVxyXG4gICAgLmVsZSgnQHdwJywgJ2V4dGVudCcpXHJcbiAgICAuYXR0KCdjeCcsIHdpZHRoKVxyXG4gICAgLmF0dCgnY3knLCBoZWlnaHQpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkUG9zaXRpb25WID0gKCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHdwOiBuYW1lc3BhY2VzLndwIH0gfSlcclxuICAgIC5lbGUoJ0B3cCcsICdwb3NpdGlvblYnKVxyXG4gICAgLmF0dCgncmVsYXRpdmVGcm9tJywgJ3BhcmFncmFwaCcpXHJcbiAgICAuZWxlKCdAd3AnLCAncG9zT2Zmc2V0JylcclxuICAgIC50eHQoJzE5MDUwJylcclxuICAgIC51cCgpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkUG9zaXRpb25IID0gKCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHdwOiBuYW1lc3BhY2VzLndwIH0gfSlcclxuICAgIC5lbGUoJ0B3cCcsICdwb3NpdGlvbkgnKVxyXG4gICAgLmF0dCgncmVsYXRpdmVGcm9tJywgJ2NvbHVtbicpXHJcbiAgICAuZWxlKCdAd3AnLCAncG9zT2Zmc2V0JylcclxuICAgIC50eHQoJzE5MDUwJylcclxuICAgIC51cCgpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkU2ltcGxlUG9zID0gKCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHdwOiBuYW1lc3BhY2VzLndwIH0gfSlcclxuICAgIC5lbGUoJ0B3cCcsICdzaW1wbGVQb3MnKVxyXG4gICAgLmF0dCgneCcsICcwJylcclxuICAgIC5hdHQoJ3knLCAnMCcpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkQW5jaG9yZWREcmF3aW5nID0gKGdyYXBoaWNUeXBlLCBhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgYW5jaG9yZWREcmF3aW5nRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHdwOiBuYW1lc3BhY2VzLndwIH0gfSlcclxuICAgIC5lbGUoJ0B3cCcsICdhbmNob3InKVxyXG4gICAgLmF0dCgnZGlzdEInLCAnMCcpXHJcbiAgICAuYXR0KCdkaXN0TCcsICcwJylcclxuICAgIC5hdHQoJ2Rpc3RSJywgJzAnKVxyXG4gICAgLmF0dCgnZGlzdFQnLCAnMCcpXHJcbiAgICAuYXR0KCdyZWxhdGl2ZUhlaWdodCcsICcwJylcclxuICAgIC5hdHQoJ2JlaGluZERvYycsICdmYWxzZScpXHJcbiAgICAuYXR0KCdsb2NrZWQnLCAndHJ1ZScpXHJcbiAgICAuYXR0KCdsYXlvdXRJbkNlbGwnLCAndHJ1ZScpXHJcbiAgICAuYXR0KCdhbGxvd092ZXJsYXAnLCAnZmFsc2UnKVxyXG4gICAgLmF0dCgnc2ltcGxlUG9zJywgJ2ZhbHNlJyk7XHJcbiAgLy8gRXZlbiB0aG91Z2ggc2ltcGxlUG9zIGlzbnQgc3VwcG9ydGVkIGJ5IFdvcmQgMjAwNyBzaW1wbGVQb3MgaXMgcmVxdWlyZWQuXHJcbiAgY29uc3Qgc2ltcGxlUG9zRnJhZ21lbnQgPSBidWlsZFNpbXBsZVBvcygpO1xyXG4gIGFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50LmltcG9ydChzaW1wbGVQb3NGcmFnbWVudCk7XHJcbiAgY29uc3QgcG9zaXRpb25IRnJhZ21lbnQgPSBidWlsZFBvc2l0aW9uSCgpO1xyXG4gIGFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50LmltcG9ydChwb3NpdGlvbkhGcmFnbWVudCk7XHJcbiAgY29uc3QgcG9zaXRpb25WRnJhZ21lbnQgPSBidWlsZFBvc2l0aW9uVigpO1xyXG4gIGFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50LmltcG9ydChwb3NpdGlvblZGcmFnbWVudCk7XHJcbiAgY29uc3QgZXh0ZW50RnJhZ21lbnQgPSBidWlsZEV4dGVudCh7IHdpZHRoOiBhdHRyaWJ1dGVzLndpZHRoLCBoZWlnaHQ6IGF0dHJpYnV0ZXMuaGVpZ2h0IH0pO1xyXG4gIGFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50LmltcG9ydChleHRlbnRGcmFnbWVudCk7XHJcbiAgY29uc3QgZWZmZWN0RXh0ZW50RnJhZ21lbnQgPSBidWlsZEVmZmVjdEV4dGVudEZyYWdtZW50KCk7XHJcbiAgYW5jaG9yZWREcmF3aW5nRnJhZ21lbnQuaW1wb3J0KGVmZmVjdEV4dGVudEZyYWdtZW50KTtcclxuICBjb25zdCB3cmFwU3F1YXJlRnJhZ21lbnQgPSBidWlsZFdyYXBTcXVhcmUoKTtcclxuICBhbmNob3JlZERyYXdpbmdGcmFnbWVudC5pbXBvcnQod3JhcFNxdWFyZUZyYWdtZW50KTtcclxuICBjb25zdCBkcmF3aW5nT2JqZWN0Tm9uVmlzdWFsUHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGREcmF3aW5nT2JqZWN0Tm9uVmlzdWFsUHJvcGVydGllcyhcclxuICAgIGF0dHJpYnV0ZXMuaWQsXHJcbiAgICBhdHRyaWJ1dGVzLmZpbGVOYW1lV2l0aEV4dGVuc2lvblxyXG4gICk7XHJcbiAgYW5jaG9yZWREcmF3aW5nRnJhZ21lbnQuaW1wb3J0KGRyYXdpbmdPYmplY3ROb25WaXN1YWxQcm9wZXJ0aWVzRnJhZ21lbnQpO1xyXG4gIGNvbnN0IGdyYXBoaWNGcmFnbWVudCA9IGJ1aWxkR3JhcGhpYyhncmFwaGljVHlwZSwgYXR0cmlidXRlcyk7XHJcbiAgYW5jaG9yZWREcmF3aW5nRnJhZ21lbnQuaW1wb3J0KGdyYXBoaWNGcmFnbWVudCk7XHJcblxyXG4gIGFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBhbmNob3JlZERyYXdpbmdGcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkSW5saW5lRHJhd2luZyA9IChncmFwaGljVHlwZSwgYXR0cmlidXRlcykgPT4ge1xyXG4gIGNvbnN0IGlubGluZURyYXdpbmdGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgd3A6IG5hbWVzcGFjZXMud3AgfSB9KVxyXG4gICAgLmVsZSgnQHdwJywgJ2lubGluZScpXHJcbiAgICAuYXR0KCdkaXN0QicsICcwJylcclxuICAgIC5hdHQoJ2Rpc3RMJywgJzAnKVxyXG4gICAgLmF0dCgnZGlzdFInLCAnMCcpXHJcbiAgICAuYXR0KCdkaXN0VCcsICcwJyk7XHJcblxyXG4gIGNvbnN0IGV4dGVudEZyYWdtZW50ID0gYnVpbGRFeHRlbnQoeyB3aWR0aDogYXR0cmlidXRlcy53aWR0aCwgaGVpZ2h0OiBhdHRyaWJ1dGVzLmhlaWdodCB9KTtcclxuICBpbmxpbmVEcmF3aW5nRnJhZ21lbnQuaW1wb3J0KGV4dGVudEZyYWdtZW50KTtcclxuICBjb25zdCBlZmZlY3RFeHRlbnRGcmFnbWVudCA9IGJ1aWxkRWZmZWN0RXh0ZW50RnJhZ21lbnQoKTtcclxuICBpbmxpbmVEcmF3aW5nRnJhZ21lbnQuaW1wb3J0KGVmZmVjdEV4dGVudEZyYWdtZW50KTtcclxuICBjb25zdCBkcmF3aW5nT2JqZWN0Tm9uVmlzdWFsUHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGREcmF3aW5nT2JqZWN0Tm9uVmlzdWFsUHJvcGVydGllcyhcclxuICAgIGF0dHJpYnV0ZXMuaWQsXHJcbiAgICBhdHRyaWJ1dGVzLmZpbGVOYW1lV2l0aEV4dGVuc2lvblxyXG4gICk7XHJcbiAgaW5saW5lRHJhd2luZ0ZyYWdtZW50LmltcG9ydChkcmF3aW5nT2JqZWN0Tm9uVmlzdWFsUHJvcGVydGllc0ZyYWdtZW50KTtcclxuICBjb25zdCBncmFwaGljRnJhZ21lbnQgPSBidWlsZEdyYXBoaWMoZ3JhcGhpY1R5cGUsIGF0dHJpYnV0ZXMpO1xyXG4gIGlubGluZURyYXdpbmdGcmFnbWVudC5pbXBvcnQoZ3JhcGhpY0ZyYWdtZW50KTtcclxuXHJcbiAgaW5saW5lRHJhd2luZ0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBpbmxpbmVEcmF3aW5nRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZERyYXdpbmcgPSAoaW5saW5lT3JBbmNob3JlZCA9IGZhbHNlLCBncmFwaGljVHlwZSwgYXR0cmlidXRlcykgPT4ge1xyXG4gIGNvbnN0IGRyYXdpbmdGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICdkcmF3aW5nJyk7XHJcbiAgY29uc3QgaW5saW5lT3JBbmNob3JlZERyYXdpbmdGcmFnbWVudCA9IGlubGluZU9yQW5jaG9yZWRcclxuICAgID8gYnVpbGRJbmxpbmVEcmF3aW5nKGdyYXBoaWNUeXBlLCBhdHRyaWJ1dGVzKVxyXG4gICAgOiBidWlsZEFuY2hvcmVkRHJhd2luZyhncmFwaGljVHlwZSwgYXR0cmlidXRlcyk7XHJcbiAgZHJhd2luZ0ZyYWdtZW50LmltcG9ydChpbmxpbmVPckFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50KTtcclxuICBkcmF3aW5nRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIGRyYXdpbmdGcmFnbWVudDtcclxufTtcclxuXHJcbmV4cG9ydCB7XHJcbiAgYnVpbGRQYXJhZ3JhcGgsXHJcbiAgYnVpbGRUYWJsZSxcclxuICBidWlsZE51bWJlcmluZ0luc3RhbmNlcyxcclxuICBidWlsZExpbmVCcmVhayxcclxuICBidWlsZEluZGVudGF0aW9uLFxyXG4gIGJ1aWxkVGV4dEVsZW1lbnQsXHJcbiAgYnVpbGRCb2xkLFxyXG4gIGJ1aWxkSXRhbGljcyxcclxuICBidWlsZFVuZGVybGluZSxcclxuICBidWlsZERyYXdpbmcsXHJcbiAgZml4dXBMaW5lSGVpZ2h0LFxyXG59O1xyXG4iXX0=