fable-editor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/angular/LICENSE +21 -0
  4. package/dist/angular/README.md +175 -0
  5. package/dist/angular/angular/fable-editor.component.d.ts +29 -0
  6. package/dist/angular/angular/fable-editor.module.d.ts +7 -0
  7. package/dist/angular/angular/index.d.ts +2 -0
  8. package/dist/angular/core/config.d.ts +17 -0
  9. package/dist/angular/core/docx-import.d.ts +1 -0
  10. package/dist/angular/core/editor.d.ts +219 -0
  11. package/dist/angular/core/i18n.d.ts +139 -0
  12. package/dist/angular/core/icons.d.ts +2 -0
  13. package/dist/angular/core/index.d.ts +7 -0
  14. package/dist/angular/core/paste-engine.d.ts +6 -0
  15. package/dist/angular/core/types.d.ts +87 -0
  16. package/dist/angular/esm2022/angular/fable-editor.component.mjs +101 -0
  17. package/dist/angular/esm2022/angular/fable-editor.module.mjs +16 -0
  18. package/dist/angular/esm2022/angular/index.mjs +3 -0
  19. package/dist/angular/esm2022/core/config.mjs +122 -0
  20. package/dist/angular/esm2022/core/docx-import.mjs +391 -0
  21. package/dist/angular/esm2022/core/editor.mjs +2700 -0
  22. package/dist/angular/esm2022/core/i18n.mjs +278 -0
  23. package/dist/angular/esm2022/core/icons.mjs +89 -0
  24. package/dist/angular/esm2022/core/index.mjs +6 -0
  25. package/dist/angular/esm2022/core/paste-engine.mjs +482 -0
  26. package/dist/angular/esm2022/core/types.mjs +2 -0
  27. package/dist/angular/esm2022/fable-editor.mjs +5 -0
  28. package/dist/angular/esm2022/index.mjs +2 -0
  29. package/dist/angular/fesm2022/fable-editor.mjs +4176 -0
  30. package/dist/angular/fesm2022/fable-editor.mjs.map +1 -0
  31. package/dist/angular/index.d.ts +1 -0
  32. package/dist/core/config.d.ts +18 -0
  33. package/dist/core/config.d.ts.map +1 -0
  34. package/dist/core/docx-import.d.ts +2 -0
  35. package/dist/core/docx-import.d.ts.map +1 -0
  36. package/dist/core/editor.css +1175 -0
  37. package/dist/core/editor.d.ts +221 -0
  38. package/dist/core/editor.d.ts.map +1 -0
  39. package/dist/core/i18n.d.ts +141 -0
  40. package/dist/core/i18n.d.ts.map +1 -0
  41. package/dist/core/icons.d.ts +3 -0
  42. package/dist/core/icons.d.ts.map +1 -0
  43. package/dist/core/index.cjs +12 -0
  44. package/dist/core/index.d.ts +8 -0
  45. package/dist/core/index.d.ts.map +1 -0
  46. package/dist/core/index.mjs +2789 -0
  47. package/dist/core/paste-engine.d.ts +7 -0
  48. package/dist/core/paste-engine.d.ts.map +1 -0
  49. package/dist/core/types.d.ts +88 -0
  50. package/dist/core/types.d.ts.map +1 -0
  51. package/dist/react/FableEditor.d.ts +13 -0
  52. package/dist/react/FableEditor.d.ts.map +1 -0
  53. package/dist/react/index.cjs +41 -0
  54. package/dist/react/index.d.ts +3 -0
  55. package/dist/react/index.d.ts.map +1 -0
  56. package/dist/react/index.mjs +3471 -0
  57. package/package.json +105 -0
  58. package/style.css +1175 -0
@@ -0,0 +1,391 @@
1
+ /* Minimal .docx → HTML converter with no dependencies.
2
+ Parses the ZIP container manually and inflates entries with the browser's
3
+ DecompressionStream, then maps WordprocessingML to editor-friendly HTML:
4
+ headings, run formatting, colors, hyperlinks, lists, tables and images. */
5
+ function parseZip(buf) {
6
+ const d = new DataView(buf);
7
+ const entries = new Map();
8
+ // find End Of Central Directory record (sig 0x06054b50), scanning back over the comment
9
+ let eocd = -1;
10
+ for (let i = buf.byteLength - 22; i >= Math.max(0, buf.byteLength - 22 - 0xffff); i--) {
11
+ if (d.getUint32(i, true) === 0x06054b50) {
12
+ eocd = i;
13
+ break;
14
+ }
15
+ }
16
+ if (eocd < 0)
17
+ throw new Error('EOCD not found');
18
+ const count = d.getUint16(eocd + 10, true);
19
+ let p = d.getUint32(eocd + 16, true);
20
+ const utf8 = new TextDecoder();
21
+ for (let i = 0; i < count; i++) {
22
+ if (d.getUint32(p, true) !== 0x02014b50)
23
+ break;
24
+ const method = d.getUint16(p + 10, true);
25
+ const compSize = d.getUint32(p + 20, true);
26
+ const nameLen = d.getUint16(p + 28, true);
27
+ const extraLen = d.getUint16(p + 30, true);
28
+ const commentLen = d.getUint16(p + 32, true);
29
+ const localOffset = d.getUint32(p + 42, true);
30
+ const name = utf8.decode(new Uint8Array(buf, p + 46, nameLen));
31
+ entries.set(name, { name, method, compSize, localOffset });
32
+ p += 46 + nameLen + extraLen + commentLen;
33
+ }
34
+ return entries;
35
+ }
36
+ async function readEntry(buf, e) {
37
+ const d = new DataView(buf, e.localOffset);
38
+ if (d.getUint32(0, true) !== 0x04034b50)
39
+ throw new Error('Bad local header');
40
+ const nameLen = d.getUint16(26, true);
41
+ const extraLen = d.getUint16(28, true);
42
+ const start = e.localOffset + 30 + nameLen + extraLen;
43
+ const comp = new Uint8Array(buf.slice(start, start + e.compSize));
44
+ if (e.method === 0)
45
+ return comp;
46
+ if (e.method !== 8)
47
+ throw new Error('Unsupported compression method ' + e.method);
48
+ const stream = new Blob([comp]).stream().pipeThrough(new DecompressionStream('deflate-raw'));
49
+ return new Uint8Array(await new Response(stream).arrayBuffer());
50
+ }
51
+ /* ------------------------------------------------------------- helpers */
52
+ const esc = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
53
+ const kids = (el, name) => Array.from(el.children).filter((c) => c.localName === name);
54
+ const kid = (el, ...path) => {
55
+ let cur = el;
56
+ for (const name of path) {
57
+ if (!cur)
58
+ return null;
59
+ cur = Array.from(cur.children).find((c) => c.localName === name) || null;
60
+ }
61
+ return cur;
62
+ };
63
+ const val = (el, attrName = 'val') => {
64
+ if (!el)
65
+ return '';
66
+ for (const a of Array.from(el.attributes)) {
67
+ if (a.localName === attrName)
68
+ return a.value;
69
+ }
70
+ return '';
71
+ };
72
+ /** A toggle property like <w:b/> is on unless val is explicitly false/0. */
73
+ const flagOn = (rPr, name) => {
74
+ const el = rPr ? kid(rPr, name) : null;
75
+ if (!el)
76
+ return false;
77
+ const v = val(el);
78
+ return v !== 'false' && v !== '0';
79
+ };
80
+ const HIGHLIGHTS = {
81
+ yellow: '#FFFF00',
82
+ green: '#00FF00',
83
+ cyan: '#00FFFF',
84
+ magenta: '#FF00FF',
85
+ blue: '#0000FF',
86
+ red: '#FF0000',
87
+ darkBlue: '#00008B',
88
+ darkCyan: '#008B8B',
89
+ darkGreen: '#006400',
90
+ darkMagenta: '#8B008B',
91
+ darkRed: '#8B0000',
92
+ darkYellow: '#808000',
93
+ darkGray: '#A9A9A9',
94
+ lightGray: '#D3D3D3',
95
+ black: '#000000',
96
+ white: '#FFFFFF'
97
+ };
98
+ const IMG_MIME = {
99
+ png: 'image/png',
100
+ jpg: 'image/jpeg',
101
+ jpeg: 'image/jpeg',
102
+ gif: 'image/gif',
103
+ bmp: 'image/bmp',
104
+ webp: 'image/webp'
105
+ };
106
+ function toBase64(bytes) {
107
+ let bin = '';
108
+ for (let i = 0; i < bytes.length; i += 0x8000) {
109
+ bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
110
+ }
111
+ return btoa(bin);
112
+ }
113
+ /* ------------------------------------------------------------- converter */
114
+ class DocxConverter {
115
+ rels;
116
+ images;
117
+ numFmt;
118
+ constructor(rels, images, numFmt) {
119
+ this.rels = rels;
120
+ this.images = images;
121
+ this.numFmt = numFmt;
122
+ }
123
+ convertBody(body) {
124
+ let html = '';
125
+ // stack of open lists for nested numbering
126
+ let listStack = [];
127
+ const closeLists = (depth) => {
128
+ while (listStack.length > depth)
129
+ html += `</${listStack.pop()}>`;
130
+ };
131
+ for (const child of Array.from(body.children)) {
132
+ if (child.localName === 'p') {
133
+ const list = this.paraList(child);
134
+ if (list) {
135
+ const depth = list.ilvl + 1;
136
+ while (listStack.length > depth)
137
+ html += `</${listStack.pop()}>`;
138
+ if (listStack.length === depth && listStack[depth - 1] !== list.type) {
139
+ html += `</${listStack.pop()}>`;
140
+ }
141
+ while (listStack.length < depth) {
142
+ html += `<${list.type}>`;
143
+ listStack.push(list.type);
144
+ }
145
+ html += `<li>${this.runsOf(child) || '<br>'}</li>`;
146
+ continue;
147
+ }
148
+ closeLists(0);
149
+ html += this.convertPara(child);
150
+ }
151
+ else if (child.localName === 'tbl') {
152
+ closeLists(0);
153
+ html += this.convertTable(child);
154
+ }
155
+ else if (child.localName === 'sectPr') {
156
+ // section properties — no visual content
157
+ }
158
+ }
159
+ closeLists(0);
160
+ return html || '<p><br></p>';
161
+ }
162
+ paraList(p) {
163
+ const numPr = kid(p, 'pPr', 'numPr');
164
+ if (!numPr)
165
+ return null;
166
+ const numId = val(kid(numPr, 'numId'));
167
+ if (!numId || numId === '0')
168
+ return null;
169
+ const ilvl = parseInt(val(kid(numPr, 'ilvl')) || '0', 10) || 0;
170
+ return { type: this.numFmt.get(numId) || 'ul', ilvl: Math.min(ilvl, 8) };
171
+ }
172
+ convertPara(p) {
173
+ const pPr = kid(p, 'pPr');
174
+ const style = val(kid(p, 'pPr', 'pStyle'));
175
+ let tag = 'p';
176
+ const m = /^Heading([1-6])$/i.exec(style);
177
+ if (m)
178
+ tag = 'h' + m[1];
179
+ else if (/^Title$/i.test(style))
180
+ tag = 'h1';
181
+ const css = [];
182
+ const jc = val(kid(p, 'pPr', 'jc'));
183
+ if (jc === 'center')
184
+ css.push('text-align:center');
185
+ else if (jc === 'right' || jc === 'end')
186
+ css.push('text-align:right');
187
+ else if (jc === 'both' || jc === 'distribute')
188
+ css.push('text-align:justify');
189
+ if (pPr && kid(pPr, 'bidi'))
190
+ css.push('direction:rtl');
191
+ const inner = this.runsOf(p);
192
+ const attrs = css.length ? ` style="${css.join(';')}"` : '';
193
+ return `<${tag}${attrs}>${inner || '<br>'}</${tag}>`;
194
+ }
195
+ runsOf(el) {
196
+ let html = '';
197
+ for (const child of Array.from(el.children)) {
198
+ if (child.localName === 'r')
199
+ html += this.convertRun(child);
200
+ else if (child.localName === 'hyperlink') {
201
+ let href = this.rels.get(val(child, 'id')) || '';
202
+ const anchor = val(child, 'anchor');
203
+ if (!href && anchor)
204
+ href = '#' + anchor;
205
+ const inner = this.runsOf(child);
206
+ html += href ? `<a href="${esc(href)}">${inner}</a>` : inner;
207
+ }
208
+ else if (child.localName === 'smartTag' || child.localName === 'ins') {
209
+ html += this.runsOf(child);
210
+ }
211
+ }
212
+ return html;
213
+ }
214
+ convertRun(r) {
215
+ const rPr = kid(r, 'rPr');
216
+ let text = '';
217
+ for (const child of Array.from(r.children)) {
218
+ if (child.localName === 't')
219
+ text += esc(child.textContent || '');
220
+ else if (child.localName === 'br' || child.localName === 'cr')
221
+ text += '<br>';
222
+ else if (child.localName === 'tab')
223
+ text += '&emsp;';
224
+ else if (child.localName === 'drawing' || child.localName === 'pict' || child.localName === 'object') {
225
+ text += this.convertImage(child);
226
+ }
227
+ }
228
+ if (!text)
229
+ return '';
230
+ const css = [];
231
+ const color = val(rPr ? kid(rPr, 'color') : null);
232
+ if (color && color !== 'auto')
233
+ css.push('color:#' + color);
234
+ const highlight = val(rPr ? kid(rPr, 'highlight') : null);
235
+ if (highlight && HIGHLIGHTS[highlight])
236
+ css.push('background-color:' + HIGHLIGHTS[highlight]);
237
+ const sz = parseFloat(val(rPr ? kid(rPr, 'sz') : null));
238
+ if (sz)
239
+ css.push('font-size:' + Math.round((sz / 2) * (4 / 3)) + 'px');
240
+ const font = rPr ? kid(rPr, 'rFonts') : null;
241
+ const fontName = val(font, 'ascii') || val(font, 'cs');
242
+ if (fontName)
243
+ css.push(`font-family:'${fontName}'`);
244
+ if (css.length)
245
+ text = `<span style="${css.join(';')}">${text}</span>`;
246
+ if (flagOn(rPr, 'b'))
247
+ text = `<strong>${text}</strong>`;
248
+ if (flagOn(rPr, 'i'))
249
+ text = `<em>${text}</em>`;
250
+ if (flagOn(rPr, 'u') && val(kid(rPr, 'u')) !== 'none')
251
+ text = `<u>${text}</u>`;
252
+ if (flagOn(rPr, 'strike'))
253
+ text = `<s>${text}</s>`;
254
+ const vert = val(rPr ? kid(rPr, 'vertAlign') : null);
255
+ if (vert === 'superscript')
256
+ text = `<sup>${text}</sup>`;
257
+ else if (vert === 'subscript')
258
+ text = `<sub>${text}</sub>`;
259
+ return text;
260
+ }
261
+ convertImage(holder) {
262
+ // find any blip (DrawingML) or imagedata (VML) descendant regardless of depth
263
+ let relId = '';
264
+ let widthPx = 0;
265
+ const walk = (el) => {
266
+ if (el.localName === 'blip')
267
+ relId = relId || val(el, 'embed') || val(el, 'link');
268
+ if (el.localName === 'imagedata')
269
+ relId = relId || val(el, 'id');
270
+ if (el.localName === 'extent') {
271
+ const cx = parseFloat(el.getAttribute('cx') || '0');
272
+ if (cx)
273
+ widthPx = Math.round(cx / 9525); // EMU → px
274
+ }
275
+ for (const c of Array.from(el.children))
276
+ walk(c);
277
+ };
278
+ walk(holder);
279
+ if (!relId)
280
+ return '';
281
+ const src = this.images.get(relId);
282
+ if (!src)
283
+ return '';
284
+ const w = widthPx ? ` width="${widthPx}"` : '';
285
+ return `<img src="${src}" alt=""${w}>`;
286
+ }
287
+ convertTable(tbl) {
288
+ let html = '<table style="border-collapse:collapse;width:100%"><tbody>';
289
+ for (const tr of kids(tbl, 'tr')) {
290
+ html += '<tr>';
291
+ for (const tc of kids(tr, 'tc')) {
292
+ const span = parseInt(val(kid(tc, 'tcPr', 'gridSpan')) || '1', 10) || 1;
293
+ const spanAttr = span > 1 ? ` colspan="${span}"` : '';
294
+ let inner = '';
295
+ for (const child of Array.from(tc.children)) {
296
+ if (child.localName === 'p')
297
+ inner += this.convertPara(child);
298
+ else if (child.localName === 'tbl')
299
+ inner += this.convertTable(child);
300
+ }
301
+ html += `<td style="border:1px solid #b9c2cc"${spanAttr}>${inner || '<br>'}</td>`;
302
+ }
303
+ html += '</tr>';
304
+ }
305
+ return html + '</tbody></table>';
306
+ }
307
+ }
308
+ /* ------------------------------------------------------------- entry point */
309
+ export async function importDocxToHtml(input) {
310
+ const buf = input instanceof ArrayBuffer ? input : await input.arrayBuffer();
311
+ const entries = parseZip(buf);
312
+ const decoder = new TextDecoder();
313
+ const readXml = async (name) => {
314
+ const e = entries.get(name);
315
+ if (!e)
316
+ return null;
317
+ return new DOMParser().parseFromString(decoder.decode(await readEntry(buf, e)), 'application/xml');
318
+ };
319
+ const doc = await readXml('word/document.xml');
320
+ const body = doc?.getElementsByTagName('*');
321
+ let bodyEl = null;
322
+ if (body) {
323
+ for (const el of Array.from(body)) {
324
+ if (el.localName === 'body') {
325
+ bodyEl = el;
326
+ break;
327
+ }
328
+ }
329
+ }
330
+ if (!bodyEl)
331
+ throw new Error('word/document.xml missing or invalid');
332
+ // relationships: id → target (hyperlinks are absolute, images relative to word/)
333
+ const rels = new Map();
334
+ const imageTargets = new Map();
335
+ const relsDoc = await readXml('word/_rels/document.xml.rels');
336
+ if (relsDoc) {
337
+ for (const rel of Array.from(relsDoc.getElementsByTagName('*'))) {
338
+ if (rel.localName !== 'Relationship')
339
+ continue;
340
+ const id = rel.getAttribute('Id') || '';
341
+ const target = rel.getAttribute('Target') || '';
342
+ const type = rel.getAttribute('Type') || '';
343
+ if (/hyperlink/i.test(type))
344
+ rels.set(id, target);
345
+ else if (/image/i.test(type))
346
+ imageTargets.set(id, target);
347
+ }
348
+ }
349
+ // load referenced images as data URLs
350
+ const images = new Map();
351
+ for (const [id, target] of imageTargets) {
352
+ const path = target.startsWith('/') ? target.slice(1) : 'word/' + target.replace(/^\.\//, '');
353
+ const entry = entries.get(path);
354
+ if (!entry)
355
+ continue;
356
+ const ext = (path.split('.').pop() || '').toLowerCase();
357
+ const mime = IMG_MIME[ext];
358
+ if (!mime)
359
+ continue; // skip unsupported formats like emf/wmf
360
+ try {
361
+ images.set(id, `data:${mime};base64,${toBase64(await readEntry(buf, entry))}`);
362
+ }
363
+ catch {
364
+ /* skip broken image */
365
+ }
366
+ }
367
+ // numbering: numId → ul/ol (from level-0 numFmt of the abstract definition)
368
+ const numFmt = new Map();
369
+ const numDoc = await readXml('word/numbering.xml');
370
+ if (numDoc) {
371
+ const abstractFmt = new Map();
372
+ const all = Array.from(numDoc.getElementsByTagName('*'));
373
+ for (const el of all) {
374
+ if (el.localName !== 'abstractNum')
375
+ continue;
376
+ const id = val(el, 'abstractNumId');
377
+ const lvl0 = kids(el, 'lvl').find((l) => val(l, 'ilvl') === '0') || kids(el, 'lvl')[0];
378
+ const fmt = lvl0 ? val(kid(lvl0, 'numFmt')) : '';
379
+ abstractFmt.set(id, fmt === 'bullet' ? 'ul' : 'ol');
380
+ }
381
+ for (const el of all) {
382
+ if (el.localName !== 'num')
383
+ continue;
384
+ const numId = val(el, 'numId');
385
+ const absId = val(kid(el, 'abstractNumId'));
386
+ numFmt.set(numId, abstractFmt.get(absId) || 'ul');
387
+ }
388
+ }
389
+ return new DocxConverter(rels, images, numFmt).convertBody(bodyEl);
390
+ }
391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jeC1pbXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9kb2N4LWltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OzZFQUc2RTtBQVM3RSxTQUFTLFFBQVEsQ0FBQyxHQUFnQjtJQUNoQyxNQUFNLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUM1Qyx3RkFBd0Y7SUFDeEYsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RGLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDeEMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULE1BQU07UUFDUixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FB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QUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLEVBQUUsQ0FBQyxTQUFTLEtBQUssS0FBSztnQkFBRSxTQUFTO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0IsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogTWluaW1hbCAuZG9jeCDihpIgSFRNTCBjb252ZXJ0ZXIgd2l0aCBubyBkZXBlbmRlbmNpZXMuXG4gICBQYXJzZXMgdGhlIFpJUCBjb250YWluZXIgbWFudWFsbHkgYW5kIGluZmxhdGVzIGVudHJpZXMgd2l0aCB0aGUgYnJvd3NlcidzXG4gICBEZWNvbXByZXNzaW9uU3RyZWFtLCB0aGVuIG1hcHMgV29yZHByb2Nlc3NpbmdNTCB0byBlZGl0b3ItZnJpZW5kbHkgSFRNTDpcbiAgIGhlYWRpbmdzLCBydW4gZm9ybWF0dGluZywgY29sb3JzLCBoeXBlcmxpbmtzLCBsaXN0cywgdGFibGVzIGFuZCBpbWFnZXMuICovXG5cbmludGVyZmFjZSBaaXBFbnRyeSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbWV0aG9kOiBudW1iZXI7XG4gIGNvbXBTaXplOiBudW1iZXI7XG4gIGxvY2FsT2Zmc2V0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlWmlwKGJ1ZjogQXJyYXlCdWZmZXIpOiBNYXA8c3RyaW5nLCBaaXBFbnRyeT4ge1xuICBjb25zdCBkID0gbmV3IERhdGFWaWV3KGJ1Zik7XG4gIGNvbnN0IGVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgWmlwRW50cnk+KCk7XG4gIC8vIGZpbmQgRW5kIE9mIENlbnRyYWwgRGlyZWN0b3J5IHJlY29yZCAoc2lnIDB4MDYwNTRiNTApLCBzY2FubmluZyBiYWNrIG92ZXIgdGhlIGNvbW1lbnRcbiAgbGV0IGVvY2QgPSAtMTtcbiAgZm9yIChsZXQgaSA9IGJ1Zi5ieXRlTGVuZ3RoIC0gMjI7IGkgPj0gTWF0aC5tYXgoMCwgYnVmLmJ5dGVMZW5ndGggLSAyMiAtIDB4ZmZmZik7IGktLSkge1xuICAgIGlmIChkLmdldFVpbnQzMihpLCB0cnVlKSA9PT0gMHgwNjA1NGI1MCkge1xuICAgICAgZW9jZCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGVvY2QgPCAwKSB0aHJvdyBuZXcgRXJyb3IoJ0VPQ0Qgbm90IGZvdW5kJyk7XG4gIGNvbnN0IGNvdW50ID0gZC5nZXRVaW50MTYoZW9jZCArIDEwLCB0cnVlKTtcbiAgbGV0IHAgPSBkLmdldFVpbnQzMihlb2NkICsgMTYsIHRydWUpO1xuICBjb25zdCB1dGY4ID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGlmIChkLmdldFVpbnQzMihwLCB0cnVlKSAhPT0gMHgwMjAxNGI1MCkgYnJlYWs7XG4gICAgY29uc3QgbWV0aG9kID0gZC5nZXRVaW50MTYocCArIDEwLCB0cnVlKTtcbiAgICBjb25zdCBjb21wU2l6ZSA9IGQuZ2V0VWludDMyKHAgKyAyMCwgdHJ1ZSk7XG4gICAgY29uc3QgbmFtZUxlbiA9IGQuZ2V0VWludDE2KHAgKyAyOCwgdHJ1ZSk7XG4gICAgY29uc3QgZXh0cmFMZW4gPSBkLmdldFVpbnQxNihwICsgMzAsIHRydWUpO1xuICAgIGNvbnN0IGNvbW1lbnRMZW4gPSBkLmdldFVpbnQxNihwICsgMzIsIHRydWUpO1xuICAgIGNvbnN0IGxvY2FsT2Zmc2V0ID0gZC5nZXRVaW50MzIocCArIDQyLCB0cnVlKTtcbiAgICBjb25zdCBuYW1lID0gdXRmOC5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoYnVmLCBwICsgNDYsIG5hbWVMZW4pKTtcbiAgICBlbnRyaWVzLnNldChuYW1lLCB7IG5hbWUsIG1ldGhvZCwgY29tcFNpemUsIGxvY2FsT2Zmc2V0IH0pO1xuICAgIHAgKz0gNDYgKyBuYW1lTGVuICsgZXh0cmFMZW4gKyBjb21tZW50TGVuO1xuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkRW50cnkoYnVmOiBBcnJheUJ1ZmZlciwgZTogWmlwRW50cnkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgZCA9IG5ldyBEYXRhVmlldyhidWYsIGUubG9jYWxPZmZzZXQpO1xuICBpZiAoZC5nZXRVaW50MzIoMCwgdHJ1ZSkgIT09IDB4MDQwMzRiNTApIHRocm93IG5ldyBFcnJvcignQmFkIGxvY2FsIGhlYWRlcicpO1xuICBjb25zdCBuYW1lTGVuID0gZC5nZXRVaW50MTYoMjYsIHRydWUpO1xuICBjb25zdCBleHRyYUxlbiA9IGQuZ2V0VWludDE2KDI4LCB0cnVlKTtcbiAgY29uc3Qgc3RhcnQgPSBlLmxvY2FsT2Zmc2V0ICsgMzAgKyBuYW1lTGVuICsgZXh0cmFMZW47XG4gIGNvbnN0IGNvbXAgPSBuZXcgVWludDhBcnJheShidWYuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgZS5jb21wU2l6ZSkpO1xuICBpZiAoZS5tZXRob2QgPT09IDApIHJldHVybiBjb21wO1xuICBpZiAoZS5tZXRob2QgIT09IDgpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kICcgKyBlLm1ldGhvZCk7XG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBCbG9iKFtjb21wIGFzIEJsb2JQYXJ0XSkuc3RyZWFtKCkucGlwZVRocm91Z2gobmV3IERlY29tcHJlc3Npb25TdHJlYW0oJ2RlZmxhdGUtcmF3JykpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IFJlc3BvbnNlKHN0cmVhbSkuYXJyYXlCdWZmZXIoKSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAqL1xuY29uc3QgZXNjID0gKHM6IHN0cmluZykgPT5cbiAgcy5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuXG5jb25zdCBraWRzID0gKGVsOiBFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBFbGVtZW50W10gPT5cbiAgQXJyYXkuZnJvbShlbC5jaGlsZHJlbikuZmlsdGVyKChjKSA9PiBjLmxvY2FsTmFtZSA9PT0gbmFtZSk7XG5cbmNvbnN0IGtpZCA9IChlbDogRWxlbWVudCwgLi4ucGF0aDogc3RyaW5nW10pOiBFbGVtZW50IHwgbnVsbCA9PiB7XG4gIGxldCBjdXI6IEVsZW1lbnQgfCBudWxsID0gZWw7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBwYXRoKSB7XG4gICAgaWYgKCFjdXIpIHJldHVybiBudWxsO1xuICAgIGN1ciA9IEFycmF5LmZyb20oY3VyLmNoaWxkcmVuKS5maW5kKChjKSA9PiBjLmxvY2FsTmFtZSA9PT0gbmFtZSkgfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gY3VyO1xufTtcblxuY29uc3QgdmFsID0gKGVsOiBFbGVtZW50IHwgbnVsbCwgYXR0ck5hbWUgPSAndmFsJyk6IHN0cmluZyA9PiB7XG4gIGlmICghZWwpIHJldHVybiAnJztcbiAgZm9yIChjb25zdCBhIG9mIEFycmF5LmZyb20oZWwuYXR0cmlidXRlcykpIHtcbiAgICBpZiAoYS5sb2NhbE5hbWUgPT09IGF0dHJOYW1lKSByZXR1cm4gYS52YWx1ZTtcbiAgfVxuICByZXR1cm4gJyc7XG59O1xuXG4vKiogQSB0b2dnbGUgcHJvcGVydHkgbGlrZSA8dzpiLz4gaXMgb24gdW5sZXNzIHZhbCBpcyBleHBsaWNpdGx5IGZhbHNlLzAuICovXG5jb25zdCBmbGFnT24gPSAoclByOiBFbGVtZW50IHwgbnVsbCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGVsID0gclByID8ga2lkKHJQciwgbmFtZSkgOiBudWxsO1xuICBpZiAoIWVsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHYgPSB2YWwoZWwpO1xuICByZXR1cm4gdiAhPT0gJ2ZhbHNlJyAmJiB2ICE9PSAnMCc7XG59O1xuXG5jb25zdCBISUdITElHSFRTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICB5ZWxsb3c6ICcjRkZGRjAwJyxcbiAgZ3JlZW46ICcjMDBGRjAwJyxcbiAgY3lhbjogJyMwMEZGRkYnLFxuICBtYWdlbnRhOiAnI0ZGMDBGRicsXG4gIGJsdWU6ICcjMDAwMEZGJyxcbiAgcmVkOiAnI0ZGMDAwMCcsXG4gIGRhcmtCbHVlOiAnIzAwMDA4QicsXG4gIGRhcmtDeWFuOiAnIzAwOEI4QicsXG4gIGRhcmtHcmVlbjogJyMwMDY0MDAnLFxuICBkYXJrTWFnZW50YTogJyM4QjAwOEInLFxuICBkYXJrUmVkOiAnIzhCMDAwMCcsXG4gIGRhcmtZZWxsb3c6ICcjODA4MDAwJyxcbiAgZGFya0dyYXk6ICcjQTlBOUE5JyxcbiAgbGlnaHRHcmF5OiAnI0QzRDNEMycsXG4gIGJsYWNrOiAnIzAwMDAwMCcsXG4gIHdoaXRlOiAnI0ZGRkZGRidcbn07XG5cbmNvbnN0IElNR19NSU1FOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBwbmc6ICdpbWFnZS9wbmcnLFxuICBqcGc6ICdpbWFnZS9qcGVnJyxcbiAganBlZzogJ2ltYWdlL2pwZWcnLFxuICBnaWY6ICdpbWFnZS9naWYnLFxuICBibXA6ICdpbWFnZS9ibXAnLFxuICB3ZWJwOiAnaW1hZ2Uvd2VicCdcbn07XG5cbmZ1bmN0aW9uIHRvQmFzZTY0KGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgbGV0IGJpbiA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAweDgwMDApIHtcbiAgICBiaW4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcy5zdWJhcnJheShpLCBpICsgMHg4MDAwKSk7XG4gIH1cbiAgcmV0dXJuIGJ0b2EoYmluKTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZXJ0ZXIgKi9cbmNsYXNzIERvY3hDb252ZXJ0ZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbHM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gICAgcHJpdmF0ZSBpbWFnZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gICAgcHJpdmF0ZSBudW1GbXQ6IE1hcDxzdHJpbmcsICd1bCcgfCAnb2wnPlxuICApIHt9XG5cbiAgY29udmVydEJvZHkoYm9keTogRWxlbWVudCk6IHN0cmluZyB7XG4gICAgbGV0IGh0bWwgPSAnJztcbiAgICAvLyBzdGFjayBvZiBvcGVuIGxpc3RzIGZvciBuZXN0ZWQgbnVtYmVyaW5nXG4gICAgbGV0IGxpc3RTdGFjazogQXJyYXk8J3VsJyB8ICdvbCc+ID0gW107XG4gICAgY29uc3QgY2xvc2VMaXN0cyA9IChkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgICB3aGlsZSAobGlzdFN0YWNrLmxlbmd0aCA+IGRlcHRoKSBodG1sICs9IGA8LyR7bGlzdFN0YWNrLnBvcCgpfT5gO1xuICAgIH07XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5mcm9tKGJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICBpZiAoY2hpbGQubG9jYWxOYW1lID09PSAncCcpIHtcbiAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMucGFyYUxpc3QoY2hpbGQpO1xuICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgIGNvbnN0IGRlcHRoID0gbGlzdC5pbHZsICsgMTtcbiAgICAgICAgICB3aGlsZSAobGlzdFN0YWNrLmxlbmd0aCA+IGRlcHRoKSBodG1sICs9IGA8LyR7bGlzdFN0YWNrLnBvcCgpfT5gO1xuICAgICAgICAgIGlmIChsaXN0U3RhY2subGVuZ3RoID09PSBkZXB0aCAmJiBsaXN0U3RhY2tbZGVwdGggLSAxXSAhPT0gbGlzdC50eXBlKSB7XG4gICAgICAgICAgICBodG1sICs9IGA8LyR7bGlzdFN0YWNrLnBvcCgpfT5gO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAobGlzdFN0YWNrLmxlbmd0aCA8IGRlcHRoKSB7XG4gICAgICAgICAgICBodG1sICs9IGA8JHtsaXN0LnR5cGV9PmA7XG4gICAgICAgICAgICBsaXN0U3RhY2sucHVzaChsaXN0LnR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBodG1sICs9IGA8bGk+JHt0aGlzLnJ1bnNPZihjaGlsZCkgfHwgJzxicj4nfTwvbGk+YDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZUxpc3RzKDApO1xuICAgICAgICBodG1sICs9IHRoaXMuY29udmVydFBhcmEoY2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICd0YmwnKSB7XG4gICAgICAgIGNsb3NlTGlzdHMoMCk7XG4gICAgICAgIGh0bWwgKz0gdGhpcy5jb252ZXJ0VGFibGUoY2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICdzZWN0UHInKSB7XG4gICAgICAgIC8vIHNlY3Rpb24gcHJvcGVydGllcyDigJQgbm8gdmlzdWFsIGNvbnRlbnRcbiAgICAgIH1cbiAgICB9XG4gICAgY2xvc2VMaXN0cygwKTtcbiAgICByZXR1cm4gaHRtbCB8fCAnPHA+PGJyPjwvcD4nO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJhTGlzdChwOiBFbGVtZW50KTogeyB0eXBlOiAndWwnIHwgJ29sJzsgaWx2bDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBudW1QciA9IGtpZChwLCAncFByJywgJ251bVByJyk7XG4gICAgaWYgKCFudW1QcikgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbnVtSWQgPSB2YWwoa2lkKG51bVByLCAnbnVtSWQnKSk7XG4gICAgaWYgKCFudW1JZCB8fCBudW1JZCA9PT0gJzAnKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbHZsID0gcGFyc2VJbnQodmFsKGtpZChudW1QciwgJ2lsdmwnKSkgfHwgJzAnLCAxMCkgfHwgMDtcbiAgICByZXR1cm4geyB0eXBlOiB0aGlzLm51bUZtdC5nZXQobnVtSWQpIHx8ICd1bCcsIGlsdmw6IE1hdGgubWluKGlsdmwsIDgpIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRQYXJhKHA6IEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBQciA9IGtpZChwLCAncFByJyk7XG4gICAgY29uc3Qgc3R5bGUgPSB2YWwoa2lkKHAsICdwUHInLCAncFN0eWxlJykpO1xuICAgIGxldCB0YWcgPSAncCc7XG4gICAgY29uc3QgbSA9IC9eSGVhZGluZyhbMS02XSkkL2kuZXhlYyhzdHlsZSk7XG4gICAgaWYgKG0pIHRhZyA9ICdoJyArIG1bMV07XG4gICAgZWxzZSBpZiAoL15UaXRsZSQvaS50ZXN0KHN0eWxlKSkgdGFnID0gJ2gxJztcbiAgICBjb25zdCBjc3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgamMgPSB2YWwoa2lkKHAsICdwUHInLCAnamMnKSk7XG4gICAgaWYgKGpjID09PSAnY2VudGVyJykgY3NzLnB1c2goJ3RleHQtYWxpZ246Y2VudGVyJyk7XG4gICAgZWxzZSBpZiAoamMgPT09ICdyaWdodCcgfHwgamMgPT09ICdlbmQnKSBjc3MucHVzaCgndGV4dC1hbGlnbjpyaWdodCcpO1xuICAgIGVsc2UgaWYgKGpjID09PSAnYm90aCcgfHwgamMgPT09ICdkaXN0cmlidXRlJykgY3NzLnB1c2goJ3RleHQtYWxpZ246anVzdGlmeScpO1xuICAgIGlmIChwUHIgJiYga2lkKHBQciwgJ2JpZGknKSkgY3NzLnB1c2goJ2RpcmVjdGlvbjpydGwnKTtcbiAgICBjb25zdCBpbm5lciA9IHRoaXMucnVuc09mKHApO1xuICAgIGNvbnN0IGF0dHJzID0gY3NzLmxlbmd0aCA/IGAgc3R5bGU9XCIke2Nzcy5qb2luKCc7Jyl9XCJgIDogJyc7XG4gICAgcmV0dXJuIGA8JHt0YWd9JHthdHRyc30+JHtpbm5lciB8fCAnPGJyPid9PC8ke3RhZ30+YDtcbiAgfVxuXG4gIHByaXZhdGUgcnVuc09mKGVsOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICBsZXQgaHRtbCA9ICcnO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuZnJvbShlbC5jaGlsZHJlbikpIHtcbiAgICAgIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICdyJykgaHRtbCArPSB0aGlzLmNvbnZlcnRSdW4oY2hpbGQpO1xuICAgICAgZWxzZSBpZiAoY2hpbGQubG9jYWxOYW1lID09PSAnaHlwZXJsaW5rJykge1xuICAgICAgICBsZXQgaHJlZiA9IHRoaXMucmVscy5nZXQodmFsKGNoaWxkLCAnaWQnKSkgfHwgJyc7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IHZhbChjaGlsZCwgJ2FuY2hvcicpO1xuICAgICAgICBpZiAoIWhyZWYgJiYgYW5jaG9yKSBocmVmID0gJyMnICsgYW5jaG9yO1xuICAgICAgICBjb25zdCBpbm5lciA9IHRoaXMucnVuc09mKGNoaWxkKTtcbiAgICAgICAgaHRtbCArPSBocmVmID8gYDxhIGhyZWY9XCIke2VzYyhocmVmKX1cIj4ke2lubmVyfTwvYT5gIDogaW5uZXI7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ3NtYXJ0VGFnJyB8fCBjaGlsZC5sb2NhbE5hbWUgPT09ICdpbnMnKSB7XG4gICAgICAgIGh0bWwgKz0gdGhpcy5ydW5zT2YoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJ1bihyOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCByUHIgPSBraWQociwgJ3JQcicpO1xuICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5mcm9tKHIuY2hpbGRyZW4pKSB7XG4gICAgICBpZiAoY2hpbGQubG9jYWxOYW1lID09PSAndCcpIHRleHQgKz0gZXNjKGNoaWxkLnRleHRDb250ZW50IHx8ICcnKTtcbiAgICAgIGVsc2UgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ2JyJyB8fCBjaGlsZC5sb2NhbE5hbWUgPT09ICdjcicpIHRleHQgKz0gJzxicj4nO1xuICAgICAgZWxzZSBpZiAoY2hpbGQubG9jYWxOYW1lID09PSAndGFiJykgdGV4dCArPSAnJmVtc3A7JztcbiAgICAgIGVsc2UgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ2RyYXdpbmcnIHx8IGNoaWxkLmxvY2FsTmFtZSA9PT0gJ3BpY3QnIHx8IGNoaWxkLmxvY2FsTmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGV4dCArPSB0aGlzLmNvbnZlcnRJbWFnZShjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGNzczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjb2xvciA9IHZhbChyUHIgPyBraWQoclByLCAnY29sb3InKSA6IG51bGwpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvciAhPT0gJ2F1dG8nKSBjc3MucHVzaCgnY29sb3I6IycgKyBjb2xvcik7XG4gICAgY29uc3QgaGlnaGxpZ2h0ID0gdmFsKHJQciA/IGtpZChyUHIsICdoaWdobGlnaHQnKSA6IG51bGwpO1xuICAgIGlmIChoaWdobGlnaHQgJiYgSElHSExJR0hUU1toaWdobGlnaHRdKSBjc3MucHVzaCgnYmFja2dyb3VuZC1jb2xvcjonICsgSElHSExJR0hUU1toaWdobGlnaHRdKTtcbiAgICBjb25zdCBzeiA9IHBhcnNlRmxvYXQodmFsKHJQciA/IGtpZChyUHIsICdzeicpIDogbnVsbCkpO1xuICAgIGlmIChzeikgY3NzLnB1c2goJ2ZvbnQtc2l6ZTonICsgTWF0aC5yb3VuZCgoc3ogLyAyKSAqICg0IC8gMykpICsgJ3B4Jyk7XG4gICAgY29uc3QgZm9udCA9IHJQciA/IGtpZChyUHIsICdyRm9udHMnKSA6IG51bGw7XG4gICAgY29uc3QgZm9udE5hbWUgPSB2YWwoZm9udCwgJ2FzY2lpJykgfHwgdmFsKGZvbnQsICdjcycpO1xuICAgIGlmIChmb250TmFtZSkgY3NzLnB1c2goYGZvbnQtZmFtaWx5Oicke2ZvbnROYW1lfSdgKTtcbiAgICBpZiAoY3NzLmxlbmd0aCkgdGV4dCA9IGA8c3BhbiBzdHlsZT1cIiR7Y3NzLmpvaW4oJzsnKX1cIj4ke3RleHR9PC9zcGFuPmA7XG4gICAgaWYgKGZsYWdPbihyUHIsICdiJykpIHRleHQgPSBgPHN0cm9uZz4ke3RleHR9PC9zdHJvbmc+YDtcbiAgICBpZiAoZmxhZ09uKHJQciwgJ2knKSkgdGV4dCA9IGA8ZW0+JHt0ZXh0fTwvZW0+YDtcbiAgICBpZiAoZmxhZ09uKHJQciwgJ3UnKSAmJiB2YWwoa2lkKHJQciEsICd1JykpICE9PSAnbm9uZScpIHRleHQgPSBgPHU+JHt0ZXh0fTwvdT5gO1xuICAgIGlmIChmbGFnT24oclByLCAnc3RyaWtlJykpIHRleHQgPSBgPHM+JHt0ZXh0fTwvcz5gO1xuICAgIGNvbnN0IHZlcnQgPSB2YWwoclByID8ga2lkKHJQciwgJ3ZlcnRBbGlnbicpIDogbnVsbCk7XG4gICAgaWYgKHZlcnQgPT09ICdzdXBlcnNjcmlwdCcpIHRleHQgPSBgPHN1cD4ke3RleHR9PC9zdXA+YDtcbiAgICBlbHNlIGlmICh2ZXJ0ID09PSAnc3Vic2NyaXB0JykgdGV4dCA9IGA8c3ViPiR7dGV4dH08L3N1Yj5gO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SW1hZ2UoaG9sZGVyOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICAvLyBmaW5kIGFueSBibGlwIChEcmF3aW5nTUwpIG9yIGltYWdlZGF0YSAoVk1MKSBkZXNjZW5kYW50IHJlZ2FyZGxlc3Mgb2YgZGVwdGhcbiAgICBsZXQgcmVsSWQgPSAnJztcbiAgICBsZXQgd2lkdGhQeCA9IDA7XG4gICAgY29uc3Qgd2FsayA9IChlbDogRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGVsLmxvY2FsTmFtZSA9PT0gJ2JsaXAnKSByZWxJZCA9IHJlbElkIHx8IHZhbChlbCwgJ2VtYmVkJykgfHwgdmFsKGVsLCAnbGluaycpO1xuICAgICAgaWYgKGVsLmxvY2FsTmFtZSA9PT0gJ2ltYWdlZGF0YScpIHJlbElkID0gcmVsSWQgfHwgdmFsKGVsLCAnaWQnKTtcbiAgICAgIGlmIChlbC5sb2NhbE5hbWUgPT09ICdleHRlbnQnKSB7XG4gICAgICAgIGNvbnN0IGN4ID0gcGFyc2VGbG9hdChlbC5nZXRBdHRyaWJ1dGUoJ2N4JykgfHwgJzAnKTtcbiAgICAgICAgaWYgKGN4KSB3aWR0aFB4ID0gTWF0aC5yb3VuZChjeCAvIDk1MjUpOyAvLyBFTVUg4oaSIHB4XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgQXJyYXkuZnJvbShlbC5jaGlsZHJlbikpIHdhbGsoYyk7XG4gICAgfTtcbiAgICB3YWxrKGhvbGRlcik7XG4gICAgaWYgKCFyZWxJZCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHNyYyA9IHRoaXMuaW1hZ2VzLmdldChyZWxJZCk7XG4gICAgaWYgKCFzcmMpIHJldHVybiAnJztcbiAgICBjb25zdCB3ID0gd2lkdGhQeCA/IGAgd2lkdGg9XCIke3dpZHRoUHh9XCJgIDogJyc7XG4gICAgcmV0dXJuIGA8aW1nIHNyYz1cIiR7c3JjfVwiIGFsdD1cIlwiJHt3fT5gO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VGFibGUodGJsOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7d2lkdGg6MTAwJVwiPjx0Ym9keT4nO1xuICAgIGZvciAoY29uc3QgdHIgb2Yga2lkcyh0YmwsICd0cicpKSB7XG4gICAgICBodG1sICs9ICc8dHI+JztcbiAgICAgIGZvciAoY29uc3QgdGMgb2Yga2lkcyh0ciwgJ3RjJykpIHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHBhcnNlSW50KHZhbChraWQodGMsICd0Y1ByJywgJ2dyaWRTcGFuJykpIHx8ICcxJywgMTApIHx8IDE7XG4gICAgICAgIGNvbnN0IHNwYW5BdHRyID0gc3BhbiA+IDEgPyBgIGNvbHNwYW49XCIke3NwYW59XCJgIDogJyc7XG4gICAgICAgIGxldCBpbm5lciA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIEFycmF5LmZyb20odGMuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ3AnKSBpbm5lciArPSB0aGlzLmNvbnZlcnRQYXJhKGNoaWxkKTtcbiAgICAgICAgICBlbHNlIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICd0YmwnKSBpbm5lciArPSB0aGlzLmNvbnZlcnRUYWJsZShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjYjljMmNjXCIke3NwYW5BdHRyfT4ke2lubmVyIHx8ICc8YnI+J308L3RkPmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgfVxuICAgIHJldHVybiBodG1sICsgJzwvdGJvZHk+PC90YWJsZT4nO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW50cnkgcG9pbnQgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnREb2N4VG9IdG1sKGlucHV0OiBGaWxlIHwgQmxvYiB8IEFycmF5QnVmZmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYnVmID0gaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IGlucHV0IDogYXdhaXQgaW5wdXQuYXJyYXlCdWZmZXIoKTtcbiAgY29uc3QgZW50cmllcyA9IHBhcnNlWmlwKGJ1Zik7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgY29uc3QgcmVhZFhtbCA9IGFzeW5jIChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPERvY3VtZW50IHwgbnVsbD4gPT4ge1xuICAgIGNvbnN0IGUgPSBlbnRyaWVzLmdldChuYW1lKTtcbiAgICBpZiAoIWUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGRlY29kZXIuZGVjb2RlKGF3YWl0IHJlYWRFbnRyeShidWYsIGUpKSwgJ2FwcGxpY2F0aW9uL3htbCcpO1xuICB9O1xuXG4gIGNvbnN0IGRvYyA9IGF3YWl0IHJlYWRYbWwoJ3dvcmQvZG9jdW1lbnQueG1sJyk7XG4gIGNvbnN0IGJvZHkgPSBkb2M/LmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJyk7XG4gIGxldCBib2R5RWw6IEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgaWYgKGJvZHkpIHtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIEFycmF5LmZyb20oYm9keSkpIHtcbiAgICAgIGlmIChlbC5sb2NhbE5hbWUgPT09ICdib2R5Jykge1xuICAgICAgICBib2R5RWwgPSBlbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghYm9keUVsKSB0aHJvdyBuZXcgRXJyb3IoJ3dvcmQvZG9jdW1lbnQueG1sIG1pc3Npbmcgb3IgaW52YWxpZCcpO1xuXG4gIC8vIHJlbGF0aW9uc2hpcHM6IGlkIOKGkiB0YXJnZXQgKGh5cGVybGlua3MgYXJlIGFic29sdXRlLCBpbWFnZXMgcmVsYXRpdmUgdG8gd29yZC8pXG4gIGNvbnN0IHJlbHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCBpbWFnZVRhcmdldHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCByZWxzRG9jID0gYXdhaXQgcmVhZFhtbCgnd29yZC9fcmVscy9kb2N1bWVudC54bWwucmVscycpO1xuICBpZiAocmVsc0RvYykge1xuICAgIGZvciAoY29uc3QgcmVsIG9mIEFycmF5LmZyb20ocmVsc0RvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpKSkge1xuICAgICAgaWYgKHJlbC5sb2NhbE5hbWUgIT09ICdSZWxhdGlvbnNoaXAnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGlkID0gcmVsLmdldEF0dHJpYnV0ZSgnSWQnKSB8fCAnJztcbiAgICAgIGNvbnN0IHRhcmdldCA9IHJlbC5nZXRBdHRyaWJ1dGUoJ1RhcmdldCcpIHx8ICcnO1xuICAgICAgY29uc3QgdHlwZSA9IHJlbC5nZXRBdHRyaWJ1dGUoJ1R5cGUnKSB8fCAnJztcbiAgICAgIGlmICgvaHlwZXJsaW5rL2kudGVzdCh0eXBlKSkgcmVscy5zZXQoaWQsIHRhcmdldCk7XG4gICAgICBlbHNlIGlmICgvaW1hZ2UvaS50ZXN0KHR5cGUpKSBpbWFnZVRhcmdldHMuc2V0KGlkLCB0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxvYWQgcmVmZXJlbmNlZCBpbWFnZXMgYXMgZGF0YSBVUkxzXG4gIGNvbnN0IGltYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgW2lkLCB0YXJnZXRdIG9mIGltYWdlVGFyZ2V0cykge1xuICAgIGNvbnN0IHBhdGggPSB0YXJnZXQuc3RhcnRzV2l0aCgnLycpID8gdGFyZ2V0LnNsaWNlKDEpIDogJ3dvcmQvJyArIHRhcmdldC5yZXBsYWNlKC9eXFwuXFwvLywgJycpO1xuICAgIGNvbnN0IGVudHJ5ID0gZW50cmllcy5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyeSkgY29udGludWU7XG4gICAgY29uc3QgZXh0ID0gKHBhdGguc3BsaXQoJy4nKS5wb3AoKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBtaW1lID0gSU1HX01JTUVbZXh0XTtcbiAgICBpZiAoIW1pbWUpIGNvbnRpbnVlOyAvLyBza2lwIHVuc3VwcG9ydGVkIGZvcm1hdHMgbGlrZSBlbWYvd21mXG4gICAgdHJ5IHtcbiAgICAgIGltYWdlcy5zZXQoaWQsIGBkYXRhOiR7bWltZX07YmFzZTY0LCR7dG9CYXNlNjQoYXdhaXQgcmVhZEVudHJ5KGJ1ZiwgZW50cnkpKX1gKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHNraXAgYnJva2VuIGltYWdlICovXG4gICAgfVxuICB9XG5cbiAgLy8gbnVtYmVyaW5nOiBudW1JZCDihpIgdWwvb2wgKGZyb20gbGV2ZWwtMCBudW1GbXQgb2YgdGhlIGFic3RyYWN0IGRlZmluaXRpb24pXG4gIGNvbnN0IG51bUZtdCA9IG5ldyBNYXA8c3RyaW5nLCAndWwnIHwgJ29sJz4oKTtcbiAgY29uc3QgbnVtRG9jID0gYXdhaXQgcmVhZFhtbCgnd29yZC9udW1iZXJpbmcueG1sJyk7XG4gIGlmIChudW1Eb2MpIHtcbiAgICBjb25zdCBhYnN0cmFjdEZtdCA9IG5ldyBNYXA8c3RyaW5nLCAndWwnIHwgJ29sJz4oKTtcbiAgICBjb25zdCBhbGwgPSBBcnJheS5mcm9tKG51bURvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpKTtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIGFsbCkge1xuICAgICAgaWYgKGVsLmxvY2FsTmFtZSAhPT0gJ2Fic3RyYWN0TnVtJykgY29udGludWU7XG4gICAgICBjb25zdCBpZCA9IHZhbChlbCwgJ2Fic3RyYWN0TnVtSWQnKTtcbiAgICAgIGNvbnN0IGx2bDAgPSBraWRzKGVsLCAnbHZsJykuZmluZCgobCkgPT4gdmFsKGwsICdpbHZsJykgPT09ICcwJykgfHwga2lkcyhlbCwgJ2x2bCcpWzBdO1xuICAgICAgY29uc3QgZm10ID0gbHZsMCA/IHZhbChraWQobHZsMCwgJ251bUZtdCcpKSA6ICcnO1xuICAgICAgYWJzdHJhY3RGbXQuc2V0KGlkLCBmbXQgPT09ICdidWxsZXQnID8gJ3VsJyA6ICdvbCcpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsIG9mIGFsbCkge1xuICAgICAgaWYgKGVsLmxvY2FsTmFtZSAhPT0gJ251bScpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbnVtSWQgPSB2YWwoZWwsICdudW1JZCcpO1xuICAgICAgY29uc3QgYWJzSWQgPSB2YWwoa2lkKGVsLCAnYWJzdHJhY3ROdW1JZCcpKTtcbiAgICAgIG51bUZtdC5zZXQobnVtSWQsIGFic3RyYWN0Rm10LmdldChhYnNJZCkgfHwgJ3VsJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBEb2N4Q29udmVydGVyKHJlbHMsIGltYWdlcywgbnVtRm10KS5jb252ZXJ0Qm9keShib2R5RWwpO1xufVxuIl19