@net7/components 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,59 @@
1
1
  //---------------------------
2
2
  // BUBBLECHART.ts
3
3
  //---------------------------
4
+ /**
5
+ * The bubble chart is drawn using d3js, a library to create and update anything in svg.
6
+ *
7
+ * LEGEND:
8
+ * - svg -> the canvas/<svg> element where everything will be drawn on (appended).
9
+ * - g -> <g> is a group of svg elements.
10
+ * - leaf -> this is the svg circle, the bubble.
11
+ * - text -> this is all the text inside the circle.
12
+ * - tspan -> this is just one line of text.
13
+ *
14
+ * What are "join, enter, update, exit?"
15
+ * https://observablehq.com/@d3/learn-d3-joins?collection=@d3/learn-d3
16
+ * https://observablehq.com/@thetylerwolf/day-18-join-enter-update-exit
17
+ *
18
+ * Each line can have a different width, but all of the text inside a circle
19
+ * needs to be scaled by a constant factor.
20
+ * https://observablehq.com/@mbostock/fit-text-to-circle
21
+ */
4
22
  import { Component, Input } from '@angular/core';
5
23
  import * as i0 from "@angular/core";
6
24
  import * as i1 from "@angular/common";
7
25
  export class BubbleChartComponent {
8
26
  constructor() {
9
27
  this._loaded = false;
28
+ /**
29
+ * Reference for much of the new text scaling code comes from:
30
+ * https://observablehq.com/@mbostock/fit-text-to-circle
31
+ */
32
+ this.measureWidth = (text) => {
33
+ const context = document.createElement('canvas').getContext('2d');
34
+ // measure text with the correct font family and weight
35
+ if (this.data?.fontRendering?.label?.family && this.data?.fontRendering?.label?.weight) {
36
+ context.font = `${this.data.fontRendering.label.weight} ${this.data.fontRendering.label.family}`;
37
+ }
38
+ // calculated width + padding
39
+ return context.measureText(text).width * 1.15;
40
+ };
41
+ this.isValidNumber = (value) => !Number.isNaN(Number.parseFloat(value));
10
42
  this.draw = () => {
11
43
  const { d3 } = this;
12
44
  const { containerId, data, height, width, selected, transition, colorMatch, shuffle, fontRendering } = this.data;
45
+ // SVG shape path for the close icon
13
46
  const closeIconPath = 'M -50,40 L-40,50 0,10 40,50 50,40 10,0 50,-40 40,-50 0,-10 -40,-50 -50,-40 -10,0 -50,40';
47
+ const defaultLineHeight = 13;
48
+ // word count before truncating with ellipsis
49
+ const ellipsisThreshold = 4;
50
+ const textScalingFactor = 1;
14
51
  if (!Array.isArray(data)) {
15
52
  // Check if it is possible to draw with the current dataset
16
53
  console.warn('(n7-bubble-chart) The data object is not in the expected format!');
17
54
  return;
18
55
  }
56
+ // animation settings used to render changes in the chart
19
57
  let t = d3
20
58
  .transition()
21
59
  .duration(0);
@@ -25,17 +63,23 @@ export class BubbleChartComponent {
25
63
  .duration(transition)
26
64
  .ease(d3.easeCubicInOut);
27
65
  }
66
+ // calculate the bubble background color from it's type (domain)
28
67
  const colorMap = d3.scaleOrdinal()
29
68
  .domain(colorMatch ? colorMatch.domain : ['persona', 'luogo', 'organizzazione', 'cosa notevole'])
30
69
  .range(colorMatch ? colorMatch.range : d3.schemeTableau10);
70
+ // calculate how big the radius of the bubble should be
31
71
  const sizeScale = d3 // map entity count to bubble size
32
72
  .scaleLinear()
33
73
  .domain([0, d3.max(data, (d) => +d.count)])
34
74
  .range([3, d3.max(data, (d) => +d.count)]);
75
+ // pack is a d3js method which calculates the bubble's x & y position in the chart
76
+ // circle packing reference: https://observablehq.com/@d3/pack
35
77
  const pack = (children) => d3
36
78
  .pack()
37
79
  .size([width - 2, height - 2])
38
80
  .padding(1.5)(d3.hierarchy({ children }).sum((d) => sizeScale(d.count)));
81
+ // the bubbles are packed in a single level tree, this is the root
82
+ // see circle packing reference: https://observablehq.com/@d3/pack
39
83
  const root = () => {
40
84
  if (typeof shuffle === 'undefined' || shuffle) {
41
85
  const shuffData = data.slice(); // do not modify the source data!
@@ -43,25 +87,33 @@ export class BubbleChartComponent {
43
87
  } // if shuffle is set to false, skip the data shuffle
44
88
  return pack(data);
45
89
  };
90
+ // svg canvas where all the bubbles are drawn
46
91
  const svg = d3
47
92
  .select(`#${containerId}`)
48
93
  .attr('viewBox', [0, 0, width, height])
49
- .attr('font-family', 'Verdana, Geneva, sans-serif')
94
+ // .attr('font-family', 'Verdana, Geneva, sans-serif')
95
+ // .attr('font-size', '10px')
96
+ .style('font', '10px Verdana, Geneva, sans-serif')
97
+ .style('height', 'auto')
98
+ .style('max-width', '100%')
50
99
  .attr('text-anchor', 'middle');
100
+ this.removeUnneededNodes(svg);
101
+ // a leaf of the "pack tree" corresponds to a bubble
51
102
  const leaf = svg.selectAll('g').data(root().leaves(), (d) => d.data.entity.id);
52
103
  leaf
53
104
  .transition(t) // update transition on <g>
54
105
  .attr('fill-opacity', 1)
55
- .attr('transform', (d) => `translate(${d.x + 1},${d.y + 1})`)
56
- .attr('font-size', (d) => {
57
- let size = d.r / 5.5;
58
- size *= 1;
59
- size += 1;
60
- return `${Math.round(size)}px`;
61
- });
62
- leaf.selectAll('.close-icon').remove(); // clear all existing close icons
106
+ .attr('transform', (d) => `translate(${d.x + 1},${d.y + 1})`);
107
+ // .attr('font-size', (d) => {
108
+ // let size = d.r / 5.5;
109
+ // size *= 1;
110
+ // size += 1;
111
+ // return `${Math.round(size)}px`;
112
+ // });
113
+ // clear all existing close icons from the bubbles
114
+ leaf.selectAll('.close-icon').remove();
63
115
  if (selected) {
64
- leaf // render necessary close icons
116
+ leaf // render only the necessary close icons
65
117
  .filter((d) => selected.includes(d.data.entity.id))
66
118
  .append('path')
67
119
  .attr('class', 'close-icon')
@@ -79,86 +131,10 @@ export class BubbleChartComponent {
79
131
  .transition(t) // update transition on <circle>
80
132
  .attr('fill-opacity', 1)
81
133
  .attr('r', (d) => d.r);
82
- leaf
83
- .select('text')
84
- .attr('font-family', () => {
85
- if (fontRendering && fontRendering.label && fontRendering.label.family) {
86
- return fontRendering.label.family;
87
- }
88
- return 'inherit';
89
- })
90
- .attr('font-weight', () => {
91
- if (fontRendering && fontRendering.label && fontRendering.label.weight) {
92
- return fontRendering.label.weight;
93
- }
94
- return 'inherit';
95
- })
96
- .selectAll('tspan')
97
- .data((d) => {
98
- if (d.r / 4 > 4.5) {
99
- // show text and number threshhold
100
- let label = (d.data.entity.label.charAt(0).toUpperCase()
101
- + d.data.entity.label.slice(1)).split(/ +/g);
102
- if (label.length > 3) {
103
- label = label.slice(0, 3);
104
- label[2] += '…';
105
- }
106
- return label;
107
- }
108
- if (d.r / 4 > 2.5) {
109
- // show text threshhold
110
- let label = (d.data.entity.label.charAt(0).toUpperCase()
111
- + d.data.entity.label.slice(1)).split(/ +/g);
112
- if (label.length > 3) {
113
- label = label.slice(0, 3);
114
- label[2] += '…';
115
- }
116
- return label;
117
- }
118
- return '';
119
- })
120
- .join('tspan')
121
- .attr('x', 0)
122
- .attr('y', (d, i, nodes) => `${i - (nodes.length + 1) / 2 + 0.97}em`)
123
- .attr('fill', 'white')
124
- .text((d) => d);
125
- leaf
126
- .select('.label-count')
127
- .attr('font-family', () => {
128
- if (fontRendering && fontRendering.counter && fontRendering.counter.family) {
129
- return fontRendering.counter.family;
130
- }
131
- return 'inherit';
132
- })
133
- .attr('font-weight', () => {
134
- if (fontRendering && fontRendering.counter && fontRendering.counter.weight) {
135
- return fontRendering.counter.weight;
136
- }
137
- return 'inherit';
138
- })
139
- .attr('fill', 'white')
140
- .text((d) => {
141
- if (d.r / 4 > 2.5) {
142
- // show text and number threshhold
143
- return d.data.count;
144
- }
145
- return '';
146
- })
147
- .attr('y', (d) => {
148
- let labelLength = d.data.entity.label.split(/ +/g);
149
- if (labelLength.length > 3) {
150
- labelLength = labelLength.slice(0, 3);
151
- }
152
- return `${labelLength.length - (labelLength.length + 1) / 2 + 0.97}em`;
153
- });
134
+ // g represents a "group of svg items"
135
+ // items grouped together can be added / removed / scaled together
154
136
  const g = leaf.enter().append('g');
155
137
  g.attr('transform', (d) => `translate(${d.x + 1},${d.y + 1})`)
156
- .attr('font-size', (d) => {
157
- let size = d.r / 5.5;
158
- size *= 1;
159
- size += 1;
160
- return `${Math.round(size)}px`;
161
- })
162
138
  .attr('cursor', 'pointer')
163
139
  .on('click', (event, d) => {
164
140
  this.onClick(d.data.entity.id);
@@ -171,10 +147,12 @@ export class BubbleChartComponent {
171
147
  .attr('fill-opacity', 1)
172
148
  .attr('fill', (d) => colorMap(d.data.entity.typeOfEntity))
173
149
  .attr('r', (d) => d.r);
150
+ // prevents the text from overflowing the bubble
174
151
  g.append('clipPath')
175
152
  .attr('id', (d) => { d.clipUid = `Clip-${d.data.entity.id}`; })
176
153
  .append('use')
177
154
  .attr('xlink:href', (d) => d.leafUid.href);
155
+ /** NEW TEXT LOGIC */
178
156
  g.append('text')
179
157
  .attr('font-family', () => {
180
158
  if (fontRendering && fontRendering.label && fontRendering.label.family) {
@@ -188,40 +166,86 @@ export class BubbleChartComponent {
188
166
  }
189
167
  return 'inherit';
190
168
  })
191
- .selectAll('tspan')
192
- .data((d) => {
193
- if (d.r / 4 > 4.5) {
194
- // show text and number threshhold
195
- let label = (d.data.entity.label.charAt(0).toUpperCase()
196
- + d.data.entity.label.slice(1)).split(/ +/g);
197
- if (label.length > 3) {
198
- label = label.slice(0, 3);
199
- label[2] += '…';
200
- }
201
- return label;
169
+ .attr('fill', 'white')
170
+ .each((d) => {
171
+ // Capitalize the first letter of the label
172
+ d.data.entity.label = d.data.entity
173
+ .label.charAt(0).toUpperCase()
174
+ + d.data.entity.label.slice(1);
175
+ // 1. initialize meta object
176
+ if (!d._meta || typeof d._meta !== 'object')
177
+ d._meta = {};
178
+ // 2. tokenize label & count into words
179
+ const words = d.data.entity.label.split(/[\s]+/g); // To hyphenate: /\s+|(?<=-)/
180
+ // Truncate with ellipsis if the label is longer than the threshold
181
+ if (words.length > ellipsisThreshold) {
182
+ words.splice(ellipsisThreshold, words.length - ellipsisThreshold);
183
+ words[ellipsisThreshold - 1] += '…';
202
184
  }
185
+ // add counter
203
186
  if (d.r / 4 > 2.5) {
204
- // show text threshhold
205
- let label = (d.data.entity.label.charAt(0).toUpperCase()
206
- + d.data.entity.label.slice(1)).split(/ +/g);
207
- if (label.length > 3) {
208
- label = label.slice(0, 3);
209
- label[2] += '…';
187
+ // show text threshold
188
+ if (!words[words.length - 1])
189
+ words.pop();
190
+ if (!words[0])
191
+ words.shift();
192
+ }
193
+ if (d.r / 4 > 4.5) {
194
+ // show number threshold
195
+ words.push(`${d.data.count}`);
196
+ }
197
+ d._meta.words = words;
198
+ d._meta.lineHeight = defaultLineHeight;
199
+ const targetWidth = Math.sqrt(this.measureWidth(d._meta.words.join(' ').trim()) * defaultLineHeight);
200
+ // 3. build lines of text
201
+ d._meta.lines = [];
202
+ let line;
203
+ let lineWidth0 = Infinity;
204
+ for (let i = 0, n = d._meta.words.length; i < n; i += 1) {
205
+ const lineText1 = (line ? `${line.text} ` : '') + words[i];
206
+ const lineWidth1 = this.measureWidth(lineText1);
207
+ if ((lineWidth0 + lineWidth1) / 2 < targetWidth && i !== n - 1) {
208
+ line.width = lineWidth0;
209
+ lineWidth0 = lineWidth1;
210
+ line.text = lineText1;
211
+ }
212
+ else {
213
+ // if line is too long or this is the last line (counter), push to next line
214
+ lineWidth0 = this.measureWidth(words[i]);
215
+ line = { width: lineWidth0, text: words[i] };
216
+ d._meta.lines.push(line);
210
217
  }
211
- return label;
212
218
  }
213
- return '';
219
+ // 4. compute the bounding radius
220
+ let radius = 0;
221
+ for (let i = 0, n = d._meta.lines.length; i < n; i += 1) {
222
+ const dy = (Math.abs(i - n / 2) + 0.8) * d._meta.lineHeight;
223
+ const dx = d._meta.lines[i].width / 2;
224
+ radius = Math.max(radius, Math.sqrt(dx * dx + dy * dy));
225
+ }
226
+ d._meta.textRadius = radius;
227
+ return d;
214
228
  })
215
- .join('tspan')
229
+ .attr('transform', (d) => {
230
+ const scale = ((d.r * 0.8) / d._meta.textRadius) * textScalingFactor;
231
+ return `scale(${scale})`;
232
+ })
233
+ .filter((d) => (d.r / 4 > 2.5))
234
+ .selectAll('tspan')
235
+ .data((d) => d._meta.lines)
236
+ .enter()
237
+ .append('tspan')
216
238
  .attr('x', 0)
217
- .attr('y', (d, i, nodes) => `${i - (nodes.length + 1) / 2 + 0.97}em`)
218
- .attr('fill', 'white')
219
- .text((d) => d)
239
+ .attr('y', (d, i, n) => (i - n.length / 2 + 0.8) * defaultLineHeight)
240
+ .attr('class', (d, i, n) => (
241
+ // if it's the last label and a valid number, mark as counter
242
+ i === n.length - 1 && this.isValidNumber(d.text) ? 'label-counter' : 'label-text'))
243
+ .text((d) => d.text)
220
244
  .attr('fill-opacity', 0)
221
245
  .transition(t) // enter() transition on <tspan>
222
246
  .attr('fill-opacity', 1);
223
- g.append('text') // Count label
224
- .attr('class', 'label-count')
247
+ // custom style for the counter
248
+ g.selectAll('tspan.label-counter')
225
249
  .attr('font-family', () => {
226
250
  if (fontRendering && fontRendering.counter && fontRendering.counter.family) {
227
251
  return fontRendering.counter.family;
@@ -233,25 +257,7 @@ export class BubbleChartComponent {
233
257
  return fontRendering.counter.weight;
234
258
  }
235
259
  return 'inherit';
236
- })
237
- .attr('fill', 'white')
238
- .text((d) => {
239
- if (d.r / 4 > 2.5) {
240
- // show text and number threshhold
241
- return d.data.count;
242
- }
243
- return '';
244
- })
245
- .attr('y', (d) => {
246
- let labelLength = d.data.entity.label.split(/ +/g);
247
- if (labelLength.length > 3) {
248
- labelLength = labelLength.slice(0, 3);
249
- }
250
- return `${labelLength.length - (labelLength.length + 1) / 2 + 0.97}em`;
251
- })
252
- .attr('fill-opacity', 0)
253
- .transition(t) // enter() transition on <text>
254
- .attr('fill-opacity', 1);
260
+ });
255
261
  leaf
256
262
  .exit() // EXIT CYCLE
257
263
  .remove();
@@ -273,7 +279,8 @@ export class BubbleChartComponent {
273
279
  return 'scale(.08)';
274
280
  });
275
281
  }
276
- this.emit('d3end', data); // communicate end of draw
282
+ // communicate end of draw
283
+ this.emit('d3end', data);
277
284
  };
278
285
  }
279
286
  ngAfterContentChecked() {
@@ -301,6 +308,13 @@ export class BubbleChartComponent {
301
308
  return;
302
309
  this.emit('click', payload);
303
310
  }
311
+ removeUnneededNodes(svg) {
312
+ // select all nodes and rejoin data
313
+ const nodes = svg.selectAll('g')
314
+ .data(this.data);
315
+ // remove excess nodes
316
+ nodes.exit().remove();
317
+ }
304
318
  }
305
319
  BubbleChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BubbleChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
306
320
  BubbleChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: BubbleChartComponent, selector: "n7-bubble-chart", inputs: { data: "data", emit: "emit" }, ngImport: i0, template: "<div *ngIf=\"data\" class=\"n7-bubble-chart {{ data.classes || '' }}\">\n <svg #bubbleChart id=\"{{data.containerId}}\"></svg>\n</div>", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
@@ -312,4 +326,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
312
326
  }], emit: [{
313
327
  type: Input
314
328
  }] } });
315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnViYmxlLWNoYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHYtY29tcG9uZW50cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2J1YmJsZS1jaGFydC9idWJibGUtY2hhcnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kdi1jb21wb25lbnRzLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvYnViYmxlLWNoYXJ0L2J1YmJsZS1jaGFydC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZCQUE2QjtBQUM3QixpQkFBaUI7QUFDakIsNkJBQTZCO0FBQzdCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUF1QixNQUFNLGVBQWUsQ0FBQzs7O0FBd0d0RSxNQUFNLE9BQU8sb0JBQW9CO0lBSmpDO1FBV1UsWUFBTyxHQUFHLEtBQUssQ0FBQztRQTJCeEIsU0FBSSxHQUFHLEdBQUcsRUFBRTtZQUNWLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDcEIsTUFBTSxFQUNKLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUN6QixLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFDM0IsVUFBVSxFQUFFLE9BQU8sRUFDbkIsYUFBYSxFQUNkLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNkLE1BQU0sYUFBYSxHQUFHLHlGQUF5RixDQUFDO1lBRWhILElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4QiwyREFBMkQ7Z0JBQzNELE9BQU8sQ0FBQyxJQUFJLENBQUMsa0VBQWtFLENBQUMsQ0FBQztnQkFDakYsT0FBTzthQUNSO1lBRUQsSUFBSSxDQUFDLEdBQUcsRUFBRTtpQkFDUCxVQUFVLEVBQUU7aUJBQ1osUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUU7Z0JBQ2xD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SUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLElBQUksSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTztZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDM0IsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDWixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7d0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDOUI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUFPO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDOztrSEFoQ1Usb0JBQW9CO3NHQUFwQixvQkFBb0IsK0ZDM0dqQywySUFFTTs0RkR5R08sb0JBQW9CO2tCQUpoQyxTQUFTOytCQUNFLGlCQUFpQjs4QkFJbEIsSUFBSTtzQkFBWixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCVUJCTEVDSEFSVC50c1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEFmdGVyQ29udGVudENoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIEJ1YmJsZUNoYXJ0Q29tcG9uZW50J3MgXCJkYXRhXCJcbiAqXG4gKiBAcHJvcGVydHkgY29udGFpbmVySWQgKHJlcXVpcmVkKVxuICogQHByb3BlcnR5IGNvbnRhaW5lcldpZHRoIChyZXF1aXJlZClcbiAqIEBwcm9wZXJ0eSBjb250YWluZXJIZWlnaHQgKHJlcXVpcmVkKVxuICogQHByb3BlcnR5IGJ1YmJsZXNEYXRhIChyZXF1aXJlZClcbiAqIEBwcm9wZXJ0eSBpc0ZvcmNlU2ltdWxhdGlvbkVuYWJsZWQgKHJlcXVpcmVkKVxuICogQHByb3BlcnR5IGNsYXNzZXMgKG9wdGlvbmFsKVxuICogQHByb3BlcnR5IHJlc2V0IChvcHRpb25hbClcbiovXG5leHBvcnQgaW50ZXJmYWNlIEJ1YmJsZUNoYXJ0RGF0YSB7XG4gIC8qKlxuICAgKiB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGJ1YmJsZS1jaGFydFxuICAgKi9cbiAgY29udGFpbmVySWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIHRvdGFsIHdpZHRoIGZvciB0aGUgYnViYmxlLWNoYXJ0XG4gICAqL1xuICB3aWR0aDogbnVtYmVyO1xuICAvKipcbiAgICogdG90YWwgaGVpZ2h0IGZvciB0aGUgYnViYmxlLWNoYXJ0XG4gICAqL1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIGRhdGEgYWJvdXQgdGhlIGJ1YmJsZXNcbiAgICovXG4gIGRhdGE6IEJ1YmJsZUNoYXJ0RGF0YUl0ZW1bXTtcbiAgLyoqXG4gICAqIGFkZGl0aW9uYWwgY3NzIGNsYXNzZXNcbiAgICovXG4gIGNsYXNzZXM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBsaXN0IG9mIElEJ3Mgb2Ygc2VsZWN0ZWQgaXRlbXNcbiAgICogKHNlbGVjdGVkIGl0ZW1zIHdpbGwgcmVuZGVyIHdpdGggYSAnWCcgaWNvbilcbiAgICovXG4gIHNlbGVjdGVkPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgbGlzdCBvZiB0eXBlT2ZFbnRpdHkgdHlwZXMgKGRvbWFpbiksXG4gICAqIGFuZCBhIGxpc3Qgb2YgY29sb3JzIChyYW5nZSksIHdoaWNoIHdpbGwgYmUgbWFwcGVkIHRvZ2V0aGVyLlxuICAgKi9cbiAgY29sb3JNYXRjaD86IHtcbiAgICBkb21haW46IHN0cmluZ1tdO1xuICAgIHJhbmdlOiBzdHJpbmdbXTtcbiAgfTtcbiAgLyoqXG4gICAqIERlZmluZSBhIG1heCBhbmQgbWluIHNpemUgZm9yIHRoZSBidWJibGVzXG4gICAqL1xuICBzaXplUmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG4gIC8qKlxuICAgKiBJZiBkZWZpbmVkLCB0cmFuc2l0aW9uIHdpbGwgYmUgYWN0aXZhdGVkXG4gICAqIGFuZCB0aGUgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIGR1cmF0aW9uXG4gICAqL1xuICB0cmFuc2l0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgICogSWYgc2V0IHRvIGZhbHNlLCBzdG9wcyB0aGUgc2h1ZmZsaW5nIG9mIHRoZSBkYXRhXG4gICAqIGJlZm9yZSByZW5kZXJpbmcuXG4gICAqL1xuICBzaHVmZmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIGZvbnQtZmFtaWx5IGFuZCB0aGUgZm9udC13ZWlnaHQgZm9yIGVhY2ggdGV4dCBncm91cFxuICAgKi9cbiAgZm9udFJlbmRlcmluZz86IHtcbiAgICBsYWJlbD86IHtcbiAgICAgIGZhbWlseT86IHN0cmluZztcbiAgICAgIHdlaWdodD86IHN0cmluZztcbiAgICB9O1xuICAgIGNvdW50ZXI/OiB7XG4gICAgICBmYW1pbHk/OiBzdHJpbmc7XG4gICAgICB3ZWlnaHQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogZXhwb3NlIHRoZSBkcmF3IGZ1bmN0aW9uIG91dHNpZGUgb2YgbjctZnJvbnRlbmQvY29tcG9uZW50cyBsaWJyYXJ5XG4gICAqIHRoaXMgaXMgbmVlZGVkIHRvIHJlZHJhdyBidWJibGUtY2hhcnQtY29tcG9uZW50IG9uIGNvbW1hbmRcbiAgICovXG4gIHNldERyYXc/OiBhbnk7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBEM0NoYXJ0J3MgXCJkYXRhXCJcbiAqXG4gKiBAcHJvcGVydHkgZW50aXR5IChyZXF1aXJlZClcbiAqIC0gaWQgKHJlcXVpcmVkKVxuICogLSBsYWJlbCAob3B0aW9uYWwpXG4gKiAtIHR5cGVPZkVudGl0eSAob3B0aW9uYWwpXG4gKiBAcHJvcGVydHkgY291bnQgKHJlcXVpcmVkKVxuKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnViYmxlQ2hhcnREYXRhSXRlbSB7XG4gIGVudGl0eToge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbGFiZWw/OiBzdHJpbmc7XG4gICAgdHlwZU9mRW50aXR5Pzogc3RyaW5nO1xuICB9O1xuICBjb3VudDogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduNy1idWJibGUtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYnViYmxlLWNoYXJ0Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEJ1YmJsZUNoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XG4gIEBJbnB1dCgpIGRhdGE6IEJ1YmJsZUNoYXJ0RGF0YTtcblxuICBASW5wdXQoKSBlbWl0OiBhbnk7XG5cbiAgcHJpdmF0ZSBkMztcblxuICBwcml2YXRlIF9sb2FkZWQgPSBmYWxzZTtcblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgLypcbiAgICAgV2FpdHMgZm9yIHRoZSBkb20gdG8gYmUgbG9hZGVkLCB0aGVuIGZpcmVzIHRoZSBkcmF3IGZ1bmN0aW9uXG4gICAgIHRoYXQgcmVuZGVycyB0aGUgY2hhcnQuXG4gICAgKi9cbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICBpZiAodGhpcy5fbG9hZGVkKSByZXR1cm47XG4gICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGltcG9ydCgnZDMnKS50aGVuKChtb2R1bGUpID0+IHtcbiAgICAgICAgICB0aGlzLmQzID0gbW9kdWxlO1xuICAgICAgICAgIHRoaXMuZHJhdygpO1xuICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLnNldERyYXcpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXREcmF3KHRoaXMuZHJhdyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2socGF5bG9hZCkge1xuICAgIGlmICghdGhpcy5lbWl0KSByZXR1cm47XG4gICAgdGhpcy5lbWl0KCdjbGljaycsIHBheWxvYWQpO1xuICB9XG5cbiAgZHJhdyA9ICgpID0+IHtcbiAgICBjb25zdCB7IGQzIH0gPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRhaW5lcklkLCBkYXRhLCBoZWlnaHQsXG4gICAgICB3aWR0aCwgc2VsZWN0ZWQsIHRyYW5zaXRpb24sXG4gICAgICBjb2xvck1hdGNoLCBzaHVmZmxlLFxuICAgICAgZm9udFJlbmRlcmluZ1xuICAgIH0gPSB0aGlzLmRhdGE7XG4gICAgY29uc3QgY2xvc2VJY29uUGF0aCA9ICdNIC01MCw0MCBMLTQwLDUwIDAsMTAgNDAsNTAgNTAsNDAgMTAsMCA1MCwtNDAgNDAsLTUwIDAsLTEwIC00MCwtNTAgLTUwLC00MCAtMTAsMCAtNTAsNDAnO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAvLyBDaGVjayBpZiBpdCBpcyBwb3NzaWJsZSB0byBkcmF3IHdpdGggdGhlIGN1cnJlbnQgZGF0YXNldFxuICAgICAgY29uc29sZS53YXJuKCcobjctYnViYmxlLWNoYXJ0KSBUaGUgZGF0YSBvYmplY3QgaXMgbm90IGluIHRoZSBleHBlY3RlZCBmb3JtYXQhJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHQgPSBkM1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKDApO1xuICAgIGlmICh0eXBlb2YgdHJhbnNpdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHQgPSBkM1xuICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgIC5kdXJhdGlvbih0cmFuc2l0aW9uKVxuICAgICAgICAuZWFzZShkMy5lYXNlQ3ViaWNJbk91dCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JNYXAgPSBkMy5zY2FsZU9yZGluYWwoKVxuICAgICAgLmRvbWFpbihjb2xvck1hdGNoID8gY29sb3JNYXRjaC5kb21haW4gOiBbJ3BlcnNvbmEnLCAnbHVvZ28nLCAnb3JnYW5penphemlvbmUnLCAnY29zYSBub3Rldm9sZSddKVxuICAgICAgLnJhbmdlKGNvbG9yTWF0Y2ggPyBjb2xvck1hdGNoLnJhbmdlIDogZDMuc2NoZW1lVGFibGVhdTEwKTtcblxuICAgIGNvbnN0IHNpemVTY2FsZSA9IGQzIC8vIG1hcCBlbnRpdHkgY291bnQgdG8gYnViYmxlIHNpemVcbiAgICAgIC5zY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFswLCBkMy5tYXgoZGF0YSwgKGQpID0+ICtkLmNvdW50KV0pXG4gICAgICAucmFuZ2UoWzMsIGQzLm1heChkYXRhLCAoZCkgPT4gK2QuY291bnQpXSk7XG5cbiAgICBjb25zdCBwYWNrID0gKGNoaWxkcmVuKSA9PiBkM1xuICAgICAgLnBhY2soKVxuICAgICAgLnNpemUoW3dpZHRoIC0gMiwgaGVpZ2h0IC0gMl0pXG4gICAgICAucGFkZGluZygxLjUpKFxuICAgICAgICBkMy5oaWVyYXJjaHkoeyBjaGlsZHJlbiB9KS5zdW0oKGQpID0+IHNpemVTY2FsZShkLmNvdW50KSlcbiAgICAgICk7XG5cbiAgICBjb25zdCByb290ID0gKCkgPT4geyAvLyBpZiBzaHVmZmxlIGlzIHVuZGVmaW5lZCBvciB0cnVlLCBzaHVmZmxlIHRoZSBkYXRhXG4gICAgICBpZiAodHlwZW9mIHNodWZmbGUgPT09ICd1bmRlZmluZWQnIHx8IHNodWZmbGUpIHtcbiAgICAgICAgY29uc3Qgc2h1ZmZEYXRhID0gZGF0YS5zbGljZSgpOyAvLyBkbyBub3QgbW9kaWZ5IHRoZSBzb3VyY2UgZGF0YSFcbiAgICAgICAgcmV0dXJuIHBhY2soZDMuc2h1ZmZsZShzaHVmZkRhdGEpKTtcbiAgICAgIH0gLy8gaWYgc2h1ZmZsZSBpcyBzZXQgdG8gZmFsc2UsIHNraXAgdGhlIGRhdGEgc2h1ZmZsZVxuICAgICAgcmV0dXJuIHBhY2soZGF0YSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHN2ZyA9IGQzXG4gICAgICAuc2VsZWN0KGAjJHtjb250YWluZXJJZH1gKVxuICAgICAgLmF0dHIoJ3ZpZXdCb3gnLCBbMCwgMCwgd2lkdGgsIGhlaWdodF0pXG4gICAgICAuYXR0cignZm9udC1mYW1pbHknLCAnVmVyZGFuYSwgR2VuZXZhLCBzYW5zLXNlcmlmJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTtcblxuICAgIGNvbnN0IGxlYWYgPSBzdmcuc2VsZWN0QWxsKCdnJykuZGF0YShyb290KCkubGVhdmVzKCksIChkKSA9PiBkLmRhdGEuZW50aXR5LmlkKTtcbiAgICBsZWFmXG4gICAgICAudHJhbnNpdGlvbih0KSAvLyB1cGRhdGUgdHJhbnNpdGlvbiBvbiA8Zz5cbiAgICAgIC5hdHRyKCdmaWxsLW9wYWNpdHknLCAxKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC54ICsgMX0sJHtkLnkgKyAxfSlgKVxuICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsIChkKSA9PiB7XG4gICAgICAgIGxldCBzaXplID0gZC5yIC8gNS41O1xuICAgICAgICBzaXplICo9IDE7XG4gICAgICAgIHNpemUgKz0gMTtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQoc2l6ZSl9cHhgO1xuICAgICAgfSk7XG5cbiAgICBsZWFmLnNlbGVjdEFsbCgnLmNsb3NlLWljb24nKS5yZW1vdmUoKTsgLy8gY2xlYXIgYWxsIGV4aXN0aW5nIGNsb3NlIGljb25zXG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICBsZWFmIC8vIHJlbmRlciBuZWNlc3NhcnkgY2xvc2UgaWNvbnNcbiAgICAgICAgLmZpbHRlcigoZCkgPT4gc2VsZWN0ZWQuaW5jbHVkZXMoZC5kYXRhLmVudGl0eS5pZCkpXG4gICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnY2xvc2UtaWNvbicpXG4gICAgICAgIC5hdHRyKCdkJywgY2xvc2VJY29uUGF0aClcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnI2ZmZicpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4ge1xuICAgICAgICAgIGlmIChkLnIgLyA0ID4gMykge1xuICAgICAgICAgICAgcmV0dXJuIGBzY2FsZSguMDgpIHRyYW5zbGF0ZSgwLCAke2QuciAqIDEwIC0gODB9KWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAnc2NhbGUoLjA4KSc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxlYWZcbiAgICAgIC5zZWxlY3QoJ2NpcmNsZScpXG4gICAgICAudHJhbnNpdGlvbih0KSAvLyB1cGRhdGUgdHJhbnNpdGlvbiBvbiA8Y2lyY2xlPlxuICAgICAgLmF0dHIoJ2ZpbGwtb3BhY2l0eScsIDEpXG4gICAgICAuYXR0cigncicsIChkKSA9PiBkLnIpO1xuXG4gICAgbGVhZlxuICAgICAgLnNlbGVjdCgndGV4dCcpXG4gICAgICAuYXR0cignZm9udC1mYW1pbHknLCAoKSA9PiB7XG4gICAgICAgIGlmIChmb250UmVuZGVyaW5nICYmIGZvbnRSZW5kZXJpbmcubGFiZWwgJiYgZm9udFJlbmRlcmluZy5sYWJlbC5mYW1pbHkpIHtcbiAgICAgICAgICByZXR1cm4gZm9udFJlbmRlcmluZy5sYWJlbC5mYW1pbHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmhlcml0JztcbiAgICAgIH0pXG4gICAgICAuYXR0cignZm9udC13ZWlnaHQnLCAoKSA9PiB7XG4gICAgICAgIGlmIChmb250UmVuZGVyaW5nICYmIGZvbnRSZW5kZXJpbmcubGFiZWwgJiYgZm9udFJlbmRlcmluZy5sYWJlbC53ZWlnaHQpIHtcbiAgICAgICAgICByZXR1cm4gZm9udFJlbmRlcmluZy5sYWJlbC53ZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmhlcml0JztcbiAgICAgIH0pXG4gICAgICAuc2VsZWN0QWxsKCd0c3BhbicpXG4gICAgICAuZGF0YSgoZCkgPT4ge1xuICAgICAgICBpZiAoZC5yIC8gNCA+IDQuNSkge1xuICAgICAgICAgIC8vIHNob3cgdGV4dCBhbmQgbnVtYmVyIHRocmVzaGhvbGRcbiAgICAgICAgICBsZXQgbGFiZWwgPSAoXG4gICAgICAgICAgICBkLmRhdGEuZW50aXR5LmxhYmVsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICArIGQuZGF0YS5lbnRpdHkubGFiZWwuc2xpY2UoMSlcbiAgICAgICAgICApLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICBpZiAobGFiZWwubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5zbGljZSgwLCAzKTtcbiAgICAgICAgICAgIGxhYmVsWzJdICs9ICfigKYnO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbGFiZWw7XG4gICAgICAgIH0gaWYgKGQuciAvIDQgPiAyLjUpIHtcbiAgICAgICAgICAvLyBzaG93IHRleHQgdGhyZXNoaG9sZFxuICAgICAgICAgIGxldCBsYWJlbCA9IChcbiAgICAgICAgICAgIGQuZGF0YS5lbnRpdHkubGFiZWwuY2hhckF0KDApLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICsgZC5kYXRhLmVudGl0eS5sYWJlbC5zbGljZSgxKVxuICAgICAgICAgICkuc3BsaXQoLyArL2cpO1xuICAgICAgICAgIGlmIChsYWJlbC5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICBsYWJlbCA9IGxhYmVsLnNsaWNlKDAsIDMpO1xuICAgICAgICAgICAgbGFiZWxbMl0gKz0gJ+KApic7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBsYWJlbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJ3RzcGFuJylcbiAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgIC5hdHRyKCd5JywgKGQsIGksIG5vZGVzKSA9PiBgJHtpIC0gKG5vZGVzLmxlbmd0aCArIDEpIC8gMiArIDAuOTd9ZW1gKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnd2hpdGUnKVxuICAgICAgLnRleHQoKGQpID0+IGQpO1xuXG4gICAgbGVhZlxuICAgICAgLnNlbGVjdCgnLmxhYmVsLWNvdW50JylcbiAgICAgIC5hdHRyKCdmb250LWZhbWlseScsICgpID0+IHtcbiAgICAgICAgaWYgKGZvbnRSZW5kZXJpbmcgJiYgZm9udFJlbmRlcmluZy5jb3VudGVyICYmIGZvbnRSZW5kZXJpbmcuY291bnRlci5mYW1pbHkpIHtcbiAgICAgICAgICByZXR1cm4gZm9udFJlbmRlcmluZy5jb3VudGVyLmZhbWlseTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2luaGVyaXQnO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmb250LXdlaWdodCcsICgpID0+IHtcbiAgICAgICAgaWYgKGZvbnRSZW5kZXJpbmcgJiYgZm9udFJlbmRlcmluZy5jb3VudGVyICYmIGZvbnRSZW5kZXJpbmcuY291bnRlci53ZWlnaHQpIHtcbiAgICAgICAgICByZXR1cm4gZm9udFJlbmRlcmluZy5jb3VudGVyLndlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2luaGVyaXQnO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3doaXRlJylcbiAgICAgIC50ZXh0KChkKSA9PiB7XG4gICAgICAgIGlmIChkLnIgLyA0ID4gMi41KSB7XG4gICAgICAgICAgLy8gc2hvdyB0ZXh0IGFuZCBudW1iZXIgdGhyZXNoaG9sZFxuICAgICAgICAgIHJldHVybiBkLmRhdGEuY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCd5JywgKGQpID0+IHtcbiAgICAgICAgbGV0IGxhYmVsTGVuZ3RoID0gZC5kYXRhLmVudGl0eS5sYWJlbC5zcGxpdCgvICsvZyk7XG4gICAgICAgIGlmIChsYWJlbExlbmd0aC5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgbGFiZWxMZW5ndGggPSBsYWJlbExlbmd0aC5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7bGFiZWxMZW5ndGgubGVuZ3RoIC0gKGxhYmVsTGVuZ3RoLmxlbmd0aCArIDEpIC8gMiArIDAuOTd9ZW1gO1xuICAgICAgfSk7XG5cblxuICAgIGNvbnN0IGcgPSBsZWFmLmVudGVyKCkuYXBwZW5kKCdnJyk7XG5cbiAgICBnLmF0dHIoJ3RyYW5zZm9ybScsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC54ICsgMX0sJHtkLnkgKyAxfSlgKVxuICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsIChkKSA9PiB7XG4gICAgICAgIGxldCBzaXplID0gZC5yIC8gNS41O1xuICAgICAgICBzaXplICo9IDE7XG4gICAgICAgIHNpemUgKz0gMTtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQoc2l6ZSl9cHhgO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgICAub24oJ2NsaWNrJywgKGV2ZW50LCBkKSA9PiB7XG4gICAgICAgIHRoaXMub25DbGljayhkLmRhdGEuZW50aXR5LmlkKTtcbiAgICAgIH0pXG4gICAgICAuYXR0cignaWQnLCAoZCkgPT4gYGdfJHtkLmRhdGEuZW50aXR5LmlkfWApXG4gICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgLmF0dHIoJ2lkJywgKGQpID0+IHsgZC5sZWFmVWlkID0gZC5kYXRhLmVudGl0eS5pZDsgfSlcbiAgICAgIC5hdHRyKCdyJywgMClcbiAgICAgIC50cmFuc2l0aW9uKHQpIC8vIGVudGVyKCkgdHJhbnNpdGlvbiBvbiA8Y2lyY2xlPlxuICAgICAgLmF0dHIoJ2ZpbGwtb3BhY2l0eScsIDEpXG4gICAgICAuYXR0cignZmlsbCcsIChkKSA9PiBjb2xvck1hcChkLmRhdGEuZW50aXR5LnR5cGVPZkVudGl0eSkpXG4gICAgICAuYXR0cigncicsIChkKSA9PiBkLnIpO1xuXG4gICAgZy5hcHBlbmQoJ2NsaXBQYXRoJylcbiAgICAgIC5hdHRyKCdpZCcsIChkKSA9PiB7IGQuY2xpcFVpZCA9IGBDbGlwLSR7ZC5kYXRhLmVudGl0eS5pZH1gOyB9KVxuICAgICAgLmFwcGVuZCgndXNlJylcbiAgICAgIC5hdHRyKCd4bGluazpocmVmJywgKGQpID0+IGQubGVhZlVpZC5ocmVmKTtcblxuICAgIGcuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdmb250LWZhbWlseScsICgpID0+IHtcbiAgICAgICAgaWYgKGZvbnRSZW5kZXJpbmcgJiYgZm9udFJlbmRlcmluZy5sYWJlbCAmJiBmb250UmVuZGVyaW5nLmxhYmVsLmZhbWlseSkge1xuICAgICAgICAgIHJldHVybiBmb250UmVuZGVyaW5nLmxhYmVsLmZhbWlseTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2luaGVyaXQnO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmb250LXdlaWdodCcsICgpID0+IHtcbiAgICAgICAgaWYgKGZvbnRSZW5kZXJpbmcgJiYgZm9udFJlbmRlcmluZyAmJiBmb250UmVuZGVyaW5nLmxhYmVsICYmIGZvbnRSZW5kZXJpbmcubGFiZWwud2VpZ2h0KSB7XG4gICAgICAgICAgcmV0dXJuIGZvbnRSZW5kZXJpbmcubGFiZWwud2VpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnaW5oZXJpdCc7XG4gICAgICB9KVxuICAgICAgLnNlbGVjdEFsbCgndHNwYW4nKVxuICAgICAgLmRhdGEoKGQpID0+IHtcbiAgICAgICAgaWYgKGQuciAvIDQgPiA0LjUpIHtcbiAgICAgICAgICAvLyBzaG93IHRleHQgYW5kIG51bWJlciB0aHJlc2hob2xkXG4gICAgICAgICAgbGV0IGxhYmVsID0gKFxuICAgICAgICAgICAgZC5kYXRhLmVudGl0eS5sYWJlbC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKVxuICAgICAgICAgICAgKyBkLmRhdGEuZW50aXR5LmxhYmVsLnNsaWNlKDEpXG4gICAgICAgICAgKS5zcGxpdCgvICsvZyk7XG4gICAgICAgICAgaWYgKGxhYmVsLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuc2xpY2UoMCwgMyk7XG4gICAgICAgICAgICBsYWJlbFsyXSArPSAn4oCmJztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGxhYmVsO1xuICAgICAgICB9IGlmIChkLnIgLyA0ID4gMi41KSB7XG4gICAgICAgICAgLy8gc2hvdyB0ZXh0IHRocmVzaGhvbGRcbiAgICAgICAgICBsZXQgbGFiZWwgPSAoXG4gICAgICAgICAgICBkLmRhdGEuZW50aXR5LmxhYmVsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICArIGQuZGF0YS5lbnRpdHkubGFiZWwuc2xpY2UoMSlcbiAgICAgICAgICApLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICBpZiAobGFiZWwubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5zbGljZSgwLCAzKTtcbiAgICAgICAgICAgIGxhYmVsWzJdICs9ICfigKYnO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCd0c3BhbicpXG4gICAgICAuYXR0cigneCcsIDApXG4gICAgICAuYXR0cigneScsIChkLCBpLCBub2RlcykgPT4gYCR7aSAtIChub2Rlcy5sZW5ndGggKyAxKSAvIDIgKyAwLjk3fWVtYClcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3doaXRlJylcbiAgICAgIC50ZXh0KChkKSA9PiBkKVxuICAgICAgLmF0dHIoJ2ZpbGwtb3BhY2l0eScsIDApXG4gICAgICAudHJhbnNpdGlvbih0KSAvLyBlbnRlcigpIHRyYW5zaXRpb24gb24gPHRzcGFuPlxuICAgICAgLmF0dHIoJ2ZpbGwtb3BhY2l0eScsIDEpO1xuXG4gICAgZy5hcHBlbmQoJ3RleHQnKSAvLyBDb3VudCBsYWJlbFxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xhYmVsLWNvdW50JylcbiAgICAgIC5hdHRyKCdmb250LWZhbWlseScsICgpID0+IHtcbiAgICAgICAgaWYgKGZvbnRSZW5kZXJpbmcgJiYgZm9udFJlbmRlcmluZy5jb3VudGVyICYmIGZvbnRSZW5kZXJpbmcuY291bnRlci5mYW1pbHkpIHtcbiAgICAgICAgICByZXR1cm4gZm9udFJlbmRlcmluZy5jb3VudGVyLmZhbWlseTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2luaGVyaXQnO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmb250LXdlaWdodCcsICgpID0+IHtcbiAgICAgICAgaWYgKGZvbnRSZW5kZXJpbmcgJiYgZm9udFJlbmRlcmluZy5jb3VudGVyICYmIGZvbnRSZW5kZXJpbmcuY291bnRlci53ZWlnaHQpIHtcbiAgICAgICAgICByZXR1cm4gZm9udFJlbmRlcmluZy5jb3VudGVyLndlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2luaGVyaXQnO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3doaXRlJylcbiAgICAgIC50ZXh0KChkKSA9PiB7XG4gICAgICAgIGlmIChkLnIgLyA0ID4gMi41KSB7XG4gICAgICAgICAgLy8gc2hvdyB0ZXh0IGFuZCBudW1iZXIgdGhyZXNoaG9sZFxuICAgICAgICAgIHJldHVybiBkLmRhdGEuY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCd5JywgKGQpID0+IHtcbiAgICAgICAgbGV0IGxhYmVsTGVuZ3RoID0gZC5kYXRhLmVudGl0eS5sYWJlbC5zcGxpdCgvICsvZyk7XG4gICAgICAgIGlmIChsYWJlbExlbmd0aC5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgbGFiZWxMZW5ndGggPSBsYWJlbExlbmd0aC5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7bGFiZWxMZW5ndGgubGVuZ3RoIC0gKGxhYmVsTGVuZ3RoLmxlbmd0aCArIDEpIC8gMiArIDAuOTd9ZW1gO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsLW9wYWNpdHknLCAwKVxuICAgICAgLnRyYW5zaXRpb24odCkgLy8gZW50ZXIoKSB0cmFuc2l0aW9uIG9uIDx0ZXh0PlxuICAgICAgLmF0dHIoJ2ZpbGwtb3BhY2l0eScsIDEpO1xuXG4gICAgbGVhZlxuICAgICAgLmV4aXQoKSAvLyBFWElUIENZQ0xFXG4gICAgICAucmVtb3ZlKCk7XG5cbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIGcuZmlsdGVyKChkKSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhkLmxlYWZVaWQpKSAvLyBhcHBlbmQgJ1gnIGljb24gLy8gb25seSBmb3Igc2VsZWN0ZWQgYnViYmxlc1xuICAgICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgLmF0dHIoJ2QnLCBjbG9zZUljb25QYXRoKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnY2xvc2UtaWNvbicpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgKGQpID0+IHtcbiAgICAgICAgICBpZiAoZC5yIC8gNCA+IDIuNSkge1xuICAgICAgICAgICAgcmV0dXJuICcjZmZmJztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICd0cmFuc3BhcmVudCc7XG4gICAgICAgIH0pXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4ge1xuICAgICAgICAgIGlmIChkLnIgLyA0ID4gMykge1xuICAgICAgICAgICAgcmV0dXJuIGBzY2FsZSguMDgpIHRyYW5zbGF0ZSgwLCAke2QuciAqIDEwIC0gODB9KWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAnc2NhbGUoLjA4KSc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdCgnZDNlbmQnLCBkYXRhKTsgLy8gY29tbXVuaWNhdGUgZW5kIG9mIGRyYXdcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImRhdGFcIiBjbGFzcz1cIm43LWJ1YmJsZS1jaGFydCB7eyBkYXRhLmNsYXNzZXMgfHwgJycgfX1cIj5cbiAgICA8c3ZnICNidWJibGVDaGFydCBpZD1cInt7ZGF0YS5jb250YWluZXJJZH19XCI+PC9zdmc+XG48L2Rpdj4iXX0=
329
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnViYmxlLWNoYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHYtY29tcG9uZW50cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2J1YmJsZS1jaGFydC9idWJibGUtY2hhcnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kdi1jb21wb25lbnRzLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvYnViYmxlLWNoYXJ0L2J1YmJsZS1jaGFydC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZCQUE2QjtBQUM3QixpQkFBaUI7QUFDakIsNkJBQTZCO0FBRTdCOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUF1QixNQUFNLGVBQWUsQ0FBQzs7O0FBMEh0RSxNQUFNLE9BQU8sb0JBQW9CO0lBSmpDO1FBV1UsWUFBTyxHQUFHLEtBQUssQ0FBQztRQTJCeEI7OztXQUdHO1FBQ0gsaUJBQVksR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xFLHVEQUF1RDtZQUN2RCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtnQkFDdEYsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ2xHO1lBQ0QsNkJBQTZCO1lBQzdCLE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJ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QjtnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLE9BQU87UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFrQkQsbUJBQW1CLENBQUMsR0FBRztRQUNyQixtQ0FBbUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7YUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixzQkFBc0I7UUFDdEIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3hCLENBQUM7O2tIQXhEVSxvQkFBb0I7c0dBQXBCLG9CQUFvQiwrRkNqSmpDLDJJQUVNOzRGRCtJTyxvQkFBb0I7a0JBSmhDLFNBQVM7K0JBQ0UsaUJBQWlCOzhCQUlsQixJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJVQkJMRUNIQVJULnRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoZSBidWJibGUgY2hhcnQgaXMgZHJhd24gdXNpbmcgZDNqcywgYSBsaWJyYXJ5IHRvIGNyZWF0ZSBhbmQgdXBkYXRlIGFueXRoaW5nIGluIHN2Zy5cbiAqXG4gKiBMRUdFTkQ6XG4gKiAtIHN2ZyAtPiB0aGUgY2FudmFzLzxzdmc+IGVsZW1lbnQgd2hlcmUgZXZlcnl0aGluZyB3aWxsIGJlIGRyYXduIG9uIChhcHBlbmRlZCkuXG4gKiAtIGcgLT4gPGc+IGlzIGEgZ3JvdXAgb2Ygc3ZnIGVsZW1lbnRzLlxuICogLSBsZWFmIC0+IHRoaXMgaXMgdGhlIHN2ZyBjaXJjbGUsIHRoZSBidWJibGUuXG4gKiAtIHRleHQgLT4gdGhpcyBpcyBhbGwgdGhlIHRleHQgaW5zaWRlIHRoZSBjaXJjbGUuXG4gKiAtIHRzcGFuIC0+IHRoaXMgaXMganVzdCBvbmUgbGluZSBvZiB0ZXh0LlxuICpcbiAqIFdoYXQgYXJlIFwiam9pbiwgZW50ZXIsIHVwZGF0ZSwgZXhpdD9cIlxuICogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9sZWFybi1kMy1qb2lucz9jb2xsZWN0aW9uPUBkMy9sZWFybi1kM1xuICogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0B0aGV0eWxlcndvbGYvZGF5LTE4LWpvaW4tZW50ZXItdXBkYXRlLWV4aXRcbiAqXG4gKiBFYWNoIGxpbmUgY2FuIGhhdmUgYSBkaWZmZXJlbnQgd2lkdGgsIGJ1dCBhbGwgb2YgdGhlIHRleHQgaW5zaWRlIGEgY2lyY2xlXG4gKiBuZWVkcyB0byBiZSBzY2FsZWQgYnkgYSBjb25zdGFudCBmYWN0b3IuXG4gKiBodHRwczovL29ic2VydmFibGVocS5jb20vQG1ib3N0b2NrL2ZpdC10ZXh0LXRvLWNpcmNsZVxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEFmdGVyQ29udGVudENoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIEQzQ2hhcnQncyBcImRhdGFcIlxuICpcbiAqIEBwcm9wZXJ0eSBlbnRpdHkgKHJlcXVpcmVkKVxuICogLSBpZCAocmVxdWlyZWQpXG4gKiAtIGxhYmVsIChvcHRpb25hbClcbiAqIC0gdHlwZU9mRW50aXR5IChvcHRpb25hbClcbiAqIEBwcm9wZXJ0eSBjb3VudCAocmVxdWlyZWQpXG4qL1xuZXhwb3J0IGludGVyZmFjZSBCdWJibGVDaGFydERhdGFJdGVtIHtcbiAgZW50aXR5OiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBsYWJlbD86IHN0cmluZztcbiAgICB0eXBlT2ZFbnRpdHk/OiBzdHJpbmc7XG4gIH07XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBhIENpcmNsZSdzIG5vZGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENpcmNsZU5vZGUge1xuICBjbGlwVWlkOiBzdHJpbmc7XG4gIGRhdGE6IEJ1YmJsZUNoYXJ0RGF0YUl0ZW07XG4gIGRlcHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBsZWFmVWlkOiBzdHJpbmc7XG4gIHBhcmVudDogTm9kZTtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHI6IG51bWJlcjtcbiAgdmFsdWU6IG51bWJlcjtcbiAgLyoqIER5bmFtaWMgZGF0YSBmb3IgaW50ZXJuYWwgbG9naWMgKi9cbiAgX21ldGE/OiBhbnk7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBCdWJibGVDaGFydENvbXBvbmVudCdzIFwiZGF0YVwiXG4gKlxuICogQHByb3BlcnR5IGNvbnRhaW5lcklkIChyZXF1aXJlZClcbiAqIEBwcm9wZXJ0eSBjb250YWluZXJXaWR0aCAocmVxdWlyZWQpXG4gKiBAcHJvcGVydHkgY29udGFpbmVySGVpZ2h0IChyZXF1aXJlZClcbiAqIEBwcm9wZXJ0eSBidWJibGVzRGF0YSAocmVxdWlyZWQpXG4gKiBAcHJvcGVydHkgaXNGb3JjZVNpbXVsYXRpb25FbmFibGVkIChyZXF1aXJlZClcbiAqIEBwcm9wZXJ0eSBjbGFzc2VzIChvcHRpb25hbClcbiAqIEBwcm9wZXJ0eSByZXNldCAob3B0aW9uYWwpXG4qL1xuZXhwb3J0IGludGVyZmFjZSBCdWJibGVDaGFydERhdGEge1xuICAvKipcbiAgICogdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBidWJibGUtY2hhcnRcbiAgICovXG4gIGNvbnRhaW5lcklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiB0b3RhbCB3aWR0aCBmb3IgdGhlIGJ1YmJsZS1jaGFydFxuICAgKi9cbiAgd2lkdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIHRvdGFsIGhlaWdodCBmb3IgdGhlIGJ1YmJsZS1jaGFydFxuICAgKi9cbiAgaGVpZ2h0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBkYXRhIGFib3V0IHRoZSBidWJibGVzXG4gICAqL1xuICBkYXRhOiBCdWJibGVDaGFydERhdGFJdGVtW107XG4gIC8qKlxuICAgKiBhZGRpdGlvbmFsIGNzcyBjbGFzc2VzXG4gICAqL1xuICBjbGFzc2VzPzogc3RyaW5nO1xuICAvKipcbiAgICogbGlzdCBvZiBJRCdzIG9mIHNlbGVjdGVkIGl0ZW1zXG4gICAqIChzZWxlY3RlZCBpdGVtcyB3aWxsIHJlbmRlciB3aXRoIGEgJ1gnIGljb24pXG4gICAqL1xuICBzZWxlY3RlZD86IHN0cmluZ1tdO1xuICAvKipcbiAgICogU3BlY2lmeSBhIGxpc3Qgb2YgdHlwZU9mRW50aXR5IHR5cGVzIChkb21haW4pLFxuICAgKiBhbmQgYSBsaXN0IG9mIGNvbG9ycyAocmFuZ2UpLCB3aGljaCB3aWxsIGJlIG1hcHBlZCB0b2dldGhlci5cbiAgICovXG4gIGNvbG9yTWF0Y2g/OiB7XG4gICAgZG9tYWluOiBzdHJpbmdbXTtcbiAgICByYW5nZTogc3RyaW5nW107XG4gIH07XG4gIC8qKlxuICAgKiBEZWZpbmUgYSBtYXggYW5kIG1pbiBzaXplIGZvciB0aGUgYnViYmxlc1xuICAgKi9cbiAgc2l6ZVJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICAvKipcbiAgICogSWYgZGVmaW5lZCwgdHJhbnNpdGlvbiB3aWxsIGJlIGFjdGl2YXRlZFxuICAgKiBhbmQgdGhlIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyBkdXJhdGlvblxuICAgKi9cbiAgdHJhbnNpdGlvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIElmIHNldCB0byBmYWxzZSwgc3RvcHMgdGhlIHNodWZmbGluZyBvZiB0aGUgZGF0YVxuICAgKiBiZWZvcmUgcmVuZGVyaW5nLlxuICAgKi9cbiAgc2h1ZmZsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBmb250LWZhbWlseSBhbmQgdGhlIGZvbnQtd2VpZ2h0IGZvciBlYWNoIHRleHQgZ3JvdXBcbiAgICovXG4gIGZvbnRSZW5kZXJpbmc/OiB7XG4gICAgbGFiZWw/OiB7XG4gICAgICBmYW1pbHk/OiBzdHJpbmc7XG4gICAgICB3ZWlnaHQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb3VudGVyPzoge1xuICAgICAgZmFtaWx5Pzogc3RyaW5nO1xuICAgICAgd2VpZ2h0Pzogc3RyaW5nO1xuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4cG9zZSB0aGUgZHJhdyBmdW5jdGlvbiBvdXRzaWRlIG9mIG43LWZyb250ZW5kL2NvbXBvbmVudHMgbGlicmFyeVxuICAgKiB0aGlzIGlzIG5lZWRlZCB0byByZWRyYXcgYnViYmxlLWNoYXJ0LWNvbXBvbmVudCBvbiBjb21tYW5kXG4gICAqL1xuICBzZXREcmF3PzogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduNy1idWJibGUtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYnViYmxlLWNoYXJ0Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEJ1YmJsZUNoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XG4gIEBJbnB1dCgpIGRhdGE6IEJ1YmJsZUNoYXJ0RGF0YTtcblxuICBASW5wdXQoKSBlbWl0OiBhbnk7XG5cbiAgcHJpdmF0ZSBkMztcblxuICBwcml2YXRlIF9sb2FkZWQgPSBmYWxzZTtcblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgLypcbiAgICAgV2FpdHMgZm9yIHRoZSBkb20gdG8gYmUgbG9hZGVkLCB0aGVuIGZpcmVzIHRoZSBkcmF3IGZ1bmN0aW9uXG4gICAgIHRoYXQgcmVuZGVycyB0aGUgY2hhcnQuXG4gICAgKi9cbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICBpZiAodGhpcy5fbG9hZGVkKSByZXR1cm47XG4gICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGltcG9ydCgnZDMnKS50aGVuKChtb2R1bGUpID0+IHtcbiAgICAgICAgICB0aGlzLmQzID0gbW9kdWxlO1xuICAgICAgICAgIHRoaXMuZHJhdygpO1xuICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLnNldERyYXcpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXREcmF3KHRoaXMuZHJhdyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2socGF5bG9hZCkge1xuICAgIGlmICghdGhpcy5lbWl0KSByZXR1cm47XG4gICAgdGhpcy5lbWl0KCdjbGljaycsIHBheWxvYWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSBmb3IgbXVjaCBvZiB0aGUgbmV3IHRleHQgc2NhbGluZyBjb2RlIGNvbWVzIGZyb206XG4gICAqIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AbWJvc3RvY2svZml0LXRleHQtdG8tY2lyY2xlXG4gICAqL1xuICBtZWFzdXJlV2lkdGggPSAodGV4dCkgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpO1xuICAgIC8vIG1lYXN1cmUgdGV4dCB3aXRoIHRoZSBjb3JyZWN0IGZvbnQgZmFtaWx5IGFuZCB3ZWlnaHRcbiAgICBpZiAodGhpcy5kYXRhPy5mb250UmVuZGVyaW5nPy5sYWJlbD8uZmFtaWx5ICYmIHRoaXMuZGF0YT8uZm9udFJlbmRlcmluZz8ubGFiZWw/LndlaWdodCkge1xuICAgICAgY29udGV4dC5mb250ID0gYCR7dGhpcy5kYXRhLmZvbnRSZW5kZXJpbmcubGFiZWwud2VpZ2h0fSAke3RoaXMuZGF0YS5mb250UmVuZGVyaW5nLmxhYmVsLmZhbWlseX1gO1xuICAgIH1cbiAgICAvLyBjYWxjdWxhdGVkIHdpZHRoICsgcGFkZGluZ1xuICAgIHJldHVybiBjb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoICogMS4xNTtcbiAgfTtcblxuICBpc1ZhbGlkTnVtYmVyID0gKHZhbHVlKSA9PiAhTnVtYmVyLmlzTmFOKE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSk7XG5cbiAgcmVtb3ZlVW5uZWVkZWROb2RlcyhzdmcpIHtcbiAgICAvLyBzZWxlY3QgYWxsIG5vZGVzIGFuZCByZWpvaW4gZGF0YVxuICAgIGNvbnN0IG5vZGVzID0gc3ZnLnNlbGVjdEFsbCgnZycpXG4gICAgICAuZGF0YSh0aGlzLmRhdGEpO1xuICAgIC8vIHJlbW92ZSBleGNlc3Mgbm9kZXNcbiAgICBub2Rlcy5leGl0KCkucmVtb3ZlKCk7XG4gIH1cblxuICBkcmF3ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgZDMgfSA9IHRoaXM7XG4gICAgY29uc3Qge1xuICAgICAgY29udGFpbmVySWQsIGRhdGEsIGhlaWdodCxcbiAgICAgIHdpZHRoLCBzZWxlY3RlZCwgdHJhbnNpdGlvbixcbiAgICAgIGNvbG9yTWF0Y2gsIHNodWZmbGUsXG4gICAgICBmb250UmVuZGVyaW5nXG4gICAgfSA9IHRoaXMuZGF0YTtcbiAgICAvLyBTVkcgc2hhcGUgcGF0aCBmb3IgdGhlIGNsb3NlIGljb25cbiAgICBjb25zdCBjbG9zZUljb25QYXRoID0gJ00gLTUwLDQwIEwtNDAsNTAgMCwxMCA0MCw1MCA1MCw0MCAxMCwwIDUwLC00MCA0MCwtNTAgMCwtMTAgLTQwLC01MCAtNTAsLTQwIC0xMCwwIC01MCw0MCc7XG4gICAgY29uc3QgZGVmYXVsdExpbmVIZWlnaHQgPSAxMztcbiAgICAvLyB3b3JkIGNvdW50IGJlZm9yZSB0cnVuY2F0aW5nIHdpdGggZWxsaXBzaXNcbiAgICBjb25zdCBlbGxpcHNpc1RocmVzaG9sZCA9IDQ7XG4gICAgY29uc3QgdGV4dFNjYWxpbmdGYWN0b3IgPSAxO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAvLyBDaGVjayBpZiBpdCBpcyBwb3NzaWJsZSB0byBkcmF3IHdpdGggdGhlIGN1cnJlbnQgZGF0YXNldFxuICAgICAgY29uc29sZS53YXJuKCcobjctYnViYmxlLWNoYXJ0KSBUaGUgZGF0YSBvYmplY3QgaXMgbm90IGluIHRoZSBleHBlY3RlZCBmb3JtYXQhJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYW5pbWF0aW9uIHNldHRpbmdzIHVzZWQgdG8gcmVuZGVyIGNoYW5nZXMgaW4gdGhlIGNoYXJ0XG4gICAgbGV0IHQgPSBkM1xuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKDApO1xuICAgIGlmICh0eXBlb2YgdHJhbnNpdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHQgPSBkM1xuICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgIC5kdXJhdGlvbih0cmFuc2l0aW9uKVxuICAgICAgICAuZWFzZShkMy5lYXNlQ3ViaWNJbk91dCk7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSBidWJibGUgYmFja2dyb3VuZCBjb2xvciBmcm9tIGl0J3MgdHlwZSAoZG9tYWluKVxuICAgIGNvbnN0IGNvbG9yTWFwID0gZDMuc2NhbGVPcmRpbmFsKClcbiAgICAgIC5kb21haW4oY29sb3JNYXRjaCA/IGNvbG9yTWF0Y2guZG9tYWluIDogWydwZXJzb25hJywgJ2x1b2dvJywgJ29yZ2FuaXp6YXppb25lJywgJ2Nvc2Egbm90ZXZvbGUnXSlcbiAgICAgIC5yYW5nZShjb2xvck1hdGNoID8gY29sb3JNYXRjaC5yYW5nZSA6IGQzLnNjaGVtZVRhYmxlYXUxMCk7XG5cbiAgICAvLyBjYWxjdWxhdGUgaG93IGJpZyB0aGUgcmFkaXVzIG9mIHRoZSBidWJibGUgc2hvdWxkIGJlXG4gICAgY29uc3Qgc2l6ZVNjYWxlID0gZDMgLy8gbWFwIGVudGl0eSBjb3VudCB0byBidWJibGUgc2l6ZVxuICAgICAgLnNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oWzAsIGQzLm1heChkYXRhLCAoZCkgPT4gK2QuY291bnQpXSlcbiAgICAgIC5yYW5nZShbMywgZDMubWF4KGRhdGEsIChkKSA9PiArZC5jb3VudCldKTtcblxuICAgIC8vIHBhY2sgaXMgYSBkM2pzIG1ldGhvZCB3aGljaCBjYWxjdWxhdGVzIHRoZSBidWJibGUncyB4ICYgeSBwb3NpdGlvbiBpbiB0aGUgY2hhcnRcbiAgICAvLyBjaXJjbGUgcGFja2luZyByZWZlcmVuY2U6IGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AZDMvcGFja1xuICAgIGNvbnN0IHBhY2sgPSAoY2hpbGRyZW4pID0+IGQzXG4gICAgICAucGFjaygpXG4gICAgICAuc2l6ZShbd2lkdGggLSAyLCBoZWlnaHQgLSAyXSlcbiAgICAgIC5wYWRkaW5nKDEuNSkoXG4gICAgICAgIGQzLmhpZXJhcmNoeSh7IGNoaWxkcmVuIH0pLnN1bSgoZCkgPT4gc2l6ZVNjYWxlKGQuY291bnQpKVxuICAgICAgKTtcblxuICAgIC8vIHRoZSBidWJibGVzIGFyZSBwYWNrZWQgaW4gYSBzaW5nbGUgbGV2ZWwgdHJlZSwgdGhpcyBpcyB0aGUgcm9vdFxuICAgIC8vIHNlZSBjaXJjbGUgcGFja2luZyByZWZlcmVuY2U6IGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AZDMvcGFja1xuICAgIGNvbnN0IHJvb3QgPSAoKSA9PiB7IC8vIGlmIHNodWZmbGUgaXMgdW5kZWZpbmVkIG9yIHRydWUsIHNodWZmbGUgdGhlIGRhdGFcbiAgICAgIGlmICh0eXBlb2Ygc2h1ZmZsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgc2h1ZmZsZSkge1xuICAgICAgICBjb25zdCBzaHVmZkRhdGEgPSBkYXRhLnNsaWNlKCk7IC8vIGRvIG5vdCBtb2RpZnkgdGhlIHNvdXJjZSBkYXRhIVxuICAgICAgICByZXR1cm4gcGFjayhkMy5zaHVmZmxlKHNodWZmRGF0YSkpO1xuICAgICAgfSAvLyBpZiBzaHVmZmxlIGlzIHNldCB0byBmYWxzZSwgc2tpcCB0aGUgZGF0YSBzaHVmZmxlXG4gICAgICByZXR1cm4gcGFjayhkYXRhKTtcbiAgICB9O1xuXG4gICAgLy8gc3ZnIGNhbnZhcyB3aGVyZSBhbGwgdGhlIGJ1YmJsZXMgYXJlIGRyYXduXG4gICAgY29uc3Qgc3ZnID0gZDNcbiAgICAgIC5zZWxlY3QoYCMke2NvbnRhaW5lcklkfWApXG4gICAgICAuYXR0cigndmlld0JveCcsIFswLCAwLCB3aWR0aCwgaGVpZ2h0XSlcbiAgICAgIC8vIC5hdHRyKCdmb250LWZhbWlseScsICdWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWYnKVxuICAgICAgLy8gLmF0dHIoJ2ZvbnQtc2l6ZScsICcxMHB4JylcbiAgICAgIC5zdHlsZSgnZm9udCcsICcxMHB4IFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZicpXG4gICAgICAuc3R5bGUoJ2hlaWdodCcsICdhdXRvJylcbiAgICAgIC5zdHlsZSgnbWF4LXdpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpO1xuXG4gICAgdGhpcy5yZW1vdmVVbm5lZWRlZE5vZGVzKHN2Zyk7XG5cbiAgICAvLyBhIGxlYWYgb2YgdGhlIFwicGFjayB0cmVlXCIgY29ycmVzcG9uZHMgdG8gYSBidWJibGVcbiAgICBjb25zdCBsZWFmID0gc3ZnLnNlbGVjdEFsbCgnZycpLmRhdGEocm9vdCgpLmxlYXZlcygpLCAoZCkgPT4gZC5kYXRhLmVudGl0eS5pZCk7XG4gICAgbGVhZlxuICAgICAgLnRyYW5zaXRpb24odCkgLy8gdXBkYXRlIHRyYW5zaXRpb24gb24gPGc+XG4gICAgICAuYXR0cignZmlsbC1vcGFjaXR5JywgMSlcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4gYHRyYW5zbGF0ZSgke2QueCArIDF9LCR7ZC55ICsgMX0pYCk7XG4gICAgLy8gLmF0dHIoJ2ZvbnQtc2l6ZScsIChkKSA9PiB7XG4gICAgLy8gICBsZXQgc2l6ZSA9IGQuciAvIDUuNTtcbiAgICAvLyAgIHNpemUgKj0gMTtcbiAgICAvLyAgIHNpemUgKz0gMTtcbiAgICAvLyAgIHJldHVybiBgJHtNYXRoLnJvdW5kKHNpemUpfXB4YDtcbiAgICAvLyB9KTtcblxuICAgIC8vIGNsZWFyIGFsbCBleGlzdGluZyBjbG9zZSBpY29ucyBmcm9tIHRoZSBidWJibGVzXG4gICAgbGVhZi5zZWxlY3RBbGwoJy5jbG9zZS1pY29uJykucmVtb3ZlKCk7XG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICBsZWFmIC8vIHJlbmRlciBvbmx5IHRoZSBuZWNlc3NhcnkgY2xvc2UgaWNvbnNcbiAgICAgICAgLmZpbHRlcigoZCkgPT4gc2VsZWN0ZWQuaW5jbHVkZXMoZC5kYXRhLmVudGl0eS5pZCkpXG4gICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnY2xvc2UtaWNvbicpXG4gICAgICAgIC5hdHRyKCdkJywgY2xvc2VJY29uUGF0aClcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnI2ZmZicpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4ge1xuICAgICAgICAgIGlmIChkLnIgLyA0ID4gMykge1xuICAgICAgICAgICAgcmV0dXJuIGBzY2FsZSguMDgpIHRyYW5zbGF0ZSgwLCAke2QuciAqIDEwIC0gODB9KWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAnc2NhbGUoLjA4KSc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxlYWZcbiAgICAgIC5zZWxlY3QoJ2NpcmNsZScpXG4gICAgICAudHJhbnNpdGlvbih0KSAvLyB1cGRhdGUgdHJhbnNpdGlvbiBvbiA8Y2lyY2xlPlxuICAgICAgLmF0dHIoJ2ZpbGwtb3BhY2l0eScsIDEpXG4gICAgICAuYXR0cigncicsIChkKSA9PiBkLnIpO1xuXG4gICAgLy8gZyByZXByZXNlbnRzIGEgXCJncm91cCBvZiBzdmcgaXRlbXNcIlxuICAgIC8vIGl0ZW1zIGdyb3VwZWQgdG9nZXRoZXIgY2FuIGJlIGFkZGVkIC8gcmVtb3ZlZCAvIHNjYWxlZCB0b2dldGhlclxuICAgIGNvbnN0IGcgPSBsZWFmLmVudGVyKCkuYXBwZW5kKCdnJyk7XG5cbiAgICBnLmF0dHIoJ3RyYW5zZm9ybScsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC54ICsgMX0sJHtkLnkgKyAxfSlgKVxuICAgICAgLmF0dHIoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQsIGQpID0+IHtcbiAgICAgICAgdGhpcy5vbkNsaWNrKGQuZGF0YS5lbnRpdHkuaWQpO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKCdpZCcsIChkKSA9PiBgZ18ke2QuZGF0YS5lbnRpdHkuaWR9YClcbiAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAuYXR0cignaWQnLCAoZCkgPT4geyBkLmxlYWZVaWQgPSBkLmRhdGEuZW50aXR5LmlkOyB9KVxuICAgICAgLmF0dHIoJ3InLCAwKVxuICAgICAgLnRyYW5zaXRpb24odCkgLy8gZW50ZXIoKSB0cmFuc2l0aW9uIG9uIDxjaXJjbGU+XG4gICAgICAuYXR0cignZmlsbC1vcGFjaXR5JywgMSlcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQpID0+IGNvbG9yTWFwKGQuZGF0YS5lbnRpdHkudHlwZU9mRW50aXR5KSlcbiAgICAgIC5hdHRyKCdyJywgKGQpID0+IGQucik7XG5cbiAgICAvLyBwcmV2ZW50cyB0aGUgdGV4dCBmcm9tIG92ZXJmbG93aW5nIHRoZSBidWJibGVcbiAgICBnLmFwcGVuZCgnY2xpcFBhdGgnKVxuICAgICAgLmF0dHIoJ2lkJywgKGQpID0+IHsgZC5jbGlwVWlkID0gYENsaXAtJHtkLmRhdGEuZW50aXR5LmlkfWA7IH0pXG4gICAgICAuYXBwZW5kKCd1c2UnKVxuICAgICAgLmF0dHIoJ3hsaW5rOmhyZWYnLCAoZCkgPT4gZC5sZWFmVWlkLmhyZWYpO1xuXG4gICAgLyoqIE5FVyBURVhUIExPR0lDICovXG4gICAgZy5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2ZvbnQtZmFtaWx5JywgKCkgPT4ge1xuICAgICAgICBpZiAoZm9udFJlbmRlcmluZyAmJiBmb250UmVuZGVyaW5nLmxhYmVsICYmIGZvbnRSZW5kZXJpbmcubGFiZWwuZmFtaWx5KSB7XG4gICAgICAgICAgcmV0dXJuIGZvbnRSZW5kZXJpbmcubGFiZWwuZmFtaWx5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnaW5oZXJpdCc7XG4gICAgICB9KVxuICAgICAgLmF0dHIoJ2ZvbnQtd2VpZ2h0JywgKCkgPT4ge1xuICAgICAgICBpZiAoZm9udFJlbmRlcmluZyAmJiBmb250UmVuZGVyaW5nICYmIGZvbnRSZW5kZXJpbmcubGFiZWwgJiYgZm9udFJlbmRlcmluZy5sYWJlbC53ZWlnaHQpIHtcbiAgICAgICAgICByZXR1cm4gZm9udFJlbmRlcmluZy5sYWJlbC53ZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmhlcml0JztcbiAgICAgIH0pXG4gICAgICAuYXR0cignZmlsbCcsICd3aGl0ZScpXG4gICAgICAuZWFjaCgoZDogQ2lyY2xlTm9kZSkgPT4ge1xuICAgICAgICAvLyBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIGxhYmVsXG4gICAgICAgIGQuZGF0YS5lbnRpdHkubGFiZWwgPSBkLmRhdGEuZW50aXR5XG4gICAgICAgICAgLmxhYmVsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgKyBkLmRhdGEuZW50aXR5LmxhYmVsLnNsaWNlKDEpO1xuICAgICAgICAvLyAxLiBpbml0aWFsaXplIG1ldGEgb2JqZWN0XG4gICAgICAgIGlmICghZC5fbWV0YSB8fCB0eXBlb2YgZC5fbWV0YSAhPT0gJ29iamVjdCcpIGQuX21ldGEgPSB7fTtcbiAgICAgICAgLy8gMi4gdG9rZW5pemUgbGFiZWwgJiBjb3VudCBpbnRvIHdvcmRzXG4gICAgICAgIGNvbnN0IHdvcmRzID0gZC5kYXRhLmVudGl0eS5sYWJlbC5zcGxpdCgvW1xcc10rL2cpOyAvLyBUbyBoeXBoZW5hdGU6IC9cXHMrfCg/PD0tKS9cbiAgICAgICAgLy8gVHJ1bmNhdGUgd2l0aCBlbGxpcHNpcyBpZiB0aGUgbGFiZWwgaXMgbG9uZ2VyIHRoYW4gdGhlIHRocmVzaG9sZFxuICAgICAgICBpZiAod29yZHMubGVuZ3RoID4gZWxsaXBzaXNUaHJlc2hvbGQpIHtcbiAgICAgICAgICB3b3Jkcy5zcGxpY2UoZWxsaXBzaXNUaHJlc2hvbGQsIHdvcmRzLmxlbmd0aCAtIGVsbGlwc2lzVGhyZXNob2xkKTtcbiAgICAgICAgICB3b3Jkc1tlbGxpcHNpc1RocmVzaG9sZCAtIDFdICs9ICfigKYnO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCBjb3VudGVyXG4gICAgICAgIGlmIChkLnIgLyA0ID4gMi41KSB7XG4gICAgICAgICAgLy8gc2hvdyB0ZXh0IHRocmVzaG9sZFxuICAgICAgICAgIGlmICghd29yZHNbd29yZHMubGVuZ3RoIC0gMV0pIHdvcmRzLnBvcCgpO1xuICAgICAgICAgIGlmICghd29yZHNbMF0pIHdvcmRzLnNoaWZ0KCk7XG4gICAgICAgIH0gaWYgKGQuciAvIDQgPiA0LjUpIHtcbiAgICAgICAgICAvLyBzaG93IG51bWJlciB0aHJlc2hvbGRcbiAgICAgICAgICB3b3Jkcy5wdXNoKGAke2QuZGF0YS5jb3VudH1gKTtcbiAgICAgICAgfVxuICAgICAgICBkLl9tZXRhLndvcmRzID0gd29yZHM7XG4gICAgICAgIGQuX21ldGEubGluZUhlaWdodCA9IGRlZmF1bHRMaW5lSGVpZ2h0O1xuICAgICAgICBjb25zdCB0YXJnZXRXaWR0aCA9IE1hdGguc3FydChcbiAgICAgICAgICB0aGlzLm1lYXN1cmVXaWR0aChkLl9tZXRhLndvcmRzLmpvaW4oJyAnKS50cmltKCkpICogZGVmYXVsdExpbmVIZWlnaHRcbiAgICAgICAgKTtcbiAgICAgICAgLy8gMy4gYnVpbGQgbGluZXMgb2YgdGV4dFxuICAgICAgICBkLl9tZXRhLmxpbmVzID0gW107XG4gICAgICAgIGxldCBsaW5lO1xuICAgICAgICBsZXQgbGluZVdpZHRoMCA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbiA9IGQuX21ldGEud29yZHMubGVuZ3RoOyBpIDwgbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgbGluZVRleHQxID0gKGxpbmUgPyBgJHtsaW5lLnRleHR9IGAgOiAnJykgKyB3b3Jkc1tpXTtcbiAgICAgICAgICBjb25zdCBsaW5lV2lkdGgxID0gdGhpcy5tZWFzdXJlV2lkdGgobGluZVRleHQxKTtcbiAgICAgICAgICBpZiAoKGxpbmVXaWR0aDAgKyBsaW5lV2lkdGgxKSAvIDIgPCB0YXJnZXRXaWR0aCAmJiBpICE9PSBuIC0gMSkge1xuICAgICAgICAgICAgbGluZS53aWR0aCA9IGxpbmVXaWR0aDA7XG4gICAgICAgICAgICBsaW5lV2lkdGgwID0gbGluZVdpZHRoMTtcbiAgICAgICAgICAgIGxpbmUudGV4dCA9IGxpbmVUZXh0MTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgbGluZSBpcyB0b28gbG9uZyBvciB0aGlzIGlzIHRoZSBsYXN0IGxpbmUgKGNvdW50ZXIpLCBwdXNoIHRvIG5leHQgbGluZVxuICAgICAgICAgICAgbGluZVdpZHRoMCA9IHRoaXMubWVhc3VyZVdpZHRoKHdvcmRzW2ldKTtcbiAgICAgICAgICAgIGxpbmUgPSB7IHdpZHRoOiBsaW5lV2lkdGgwLCB0ZXh0OiB3b3Jkc1tpXSB9O1xuICAgICAgICAgICAgZC5fbWV0YS5saW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyA0LiBjb21wdXRlIHRoZSBib3VuZGluZyByYWRpdXNcbiAgICAgICAgbGV0IHJhZGl1cyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gZC5fbWV0YS5saW5lcy5sZW5ndGg7IGkgPCBuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBkeSA9IChNYXRoLmFicyhpIC0gbiAvIDIpICsgMC44KSAqIGQuX21ldGEubGluZUhlaWdodDtcbiAgICAgICAgICBjb25zdCBkeCA9IGQuX21ldGEubGluZXNbaV0ud2lkdGggLyAyO1xuICAgICAgICAgIHJhZGl1cyA9IE1hdGgubWF4KHJhZGl1cywgTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KSk7XG4gICAgICAgIH1cbiAgICAgICAgZC5fbWV0YS50ZXh0UmFkaXVzID0gcmFkaXVzO1xuICAgICAgICByZXR1cm4gZDtcbiAgICAgIH0pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IHtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSAoKGQuciAqIDAuOCkgLyBkLl9tZXRhLnRleHRSYWRpdXMpICogdGV4dFNjYWxpbmdGYWN0b3I7XG4gICAgICAgIHJldHVybiBgc2NhbGUoJHtzY2FsZX0pYDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChkKSA9PiAoZC5yIC8gNCA+IDIuNSkpXG4gICAgICAuc2VsZWN0QWxsKCd0c3BhbicpXG4gICAgICAuZGF0YSgoZCkgPT4gZC5fbWV0YS5saW5lcylcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCd0c3BhbicpXG4gICAgICAuYXR0cigneCcsIDApXG4gICAgICAuYXR0cigneScsIChkLCBpLCBuKSA9PiAoaSAtIG4ubGVuZ3RoIC8gMiArIDAuOCkgKiBkZWZhdWx0TGluZUhlaWdodClcbiAgICAgIC5hdHRyKCdjbGFzcycsIChkLCBpLCBuKSA9PiAoXG4gICAgICAgIC8vIGlmIGl0J3MgdGhlIGxhc3QgbGFiZWwgYW5kIGEgdmFsaWQgbnVtYmVyLCBtYXJrIGFzIGNvdW50ZXJcbiAgICAgICAgaSA9PT0gbi5sZW5ndGggLSAxICYmIHRoaXMuaXNWYWxpZE51bWJlcihkLnRleHQpID8gJ2xhYmVsLWNvdW50ZXInIDogJ2xhYmVsLXRleHQnXG4gICAgICApKVxuICAgICAgLnRleHQoKGQpID0+IGQudGV4dClcbiAgICAgIC5hdHRyKCdmaWxsLW9wYWNpdHknLCAwKVxuICAgICAgLnRyYW5zaXRpb24odCkgLy8gZW50ZXIoKSB0cmFuc2l0aW9uIG9uIDx0c3Bhbj5cbiAgICAgIC5hdHRyKCdmaWxsLW9wYWNpdHknLCAxKTtcblxuICAgIC8vIGN1c3RvbSBzdHlsZSBmb3IgdGhlIGNvdW50ZXJcbiAgICBnLnNlbGVjdEFsbCgndHNwYW4ubGFiZWwtY291bnRlcicpXG4gICAgICAuYXR0cignZm9udC1mYW1pbHknLCAoKSA9PiB7XG4gICAgICAgIGlmIChmb250UmVuZGVyaW5nICYmIGZvbnRSZW5kZXJpbmcuY291bnRlciAmJiBmb250UmVuZGVyaW5nLmNvdW50ZXIuZmFtaWx5KSB7XG4gICAgICAgICAgcmV0dXJuIGZvbnRSZW5kZXJpbmcuY291bnRlci5mYW1pbHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmhlcml0JztcbiAgICAgIH0pXG4gICAgICAuYXR0cignZm9udC13ZWlnaHQnLCAoKSA9PiB7XG4gICAgICAgIGlmIChmb250UmVuZGVyaW5nICYmIGZvbnRSZW5kZXJpbmcuY291bnRlciAmJiBmb250UmVuZGVyaW5nLmNvdW50ZXIud2VpZ2h0KSB7XG4gICAgICAgICAgcmV0dXJuIGZvbnRSZW5kZXJpbmcuY291bnRlci53ZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmhlcml0JztcbiAgICAgIH0pO1xuXG4gICAgbGVhZlxuICAgICAgLmV4aXQoKSAvLyBFWElUIENZQ0xFXG4gICAgICAucmVtb3ZlKCk7XG5cbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIGcuZmlsdGVyKChkKSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhkLmxlYWZVaWQpKSAvLyBhcHBlbmQgJ1gnIGljb24gLy8gb25seSBmb3Igc2VsZWN0ZWQgYnViYmxlc1xuICAgICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgLmF0dHIoJ2QnLCBjbG9zZUljb25QYXRoKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnY2xvc2UtaWNvbicpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgKGQpID0+IHtcbiAgICAgICAgICBpZiAoZC5yIC8gNCA+IDIuNSkge1xuICAgICAgICAgICAgcmV0dXJuICcjZmZmJztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICd0cmFuc3BhcmVudCc7XG4gICAgICAgIH0pXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4ge1xuICAgICAgICAgIGlmIChkLnIgLyA0ID4gMykge1xuICAgICAgICAgICAgcmV0dXJuIGBzY2FsZSguMDgpIHRyYW5zbGF0ZSgwLCAke2QuciAqIDEwIC0gODB9KWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAnc2NhbGUoLjA4KSc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNvbW11bmljYXRlIGVuZCBvZiBkcmF3XG4gICAgdGhpcy5lbWl0KCdkM2VuZCcsIGRhdGEpO1xuICB9O1xufVxuIiwiPGRpdiAqbmdJZj1cImRhdGFcIiBjbGFzcz1cIm43LWJ1YmJsZS1jaGFydCB7eyBkYXRhLmNsYXNzZXMgfHwgJycgfX1cIj5cbiAgICA8c3ZnICNidWJibGVDaGFydCBpZD1cInt7ZGF0YS5jb250YWluZXJJZH19XCI+PC9zdmc+XG48L2Rpdj4iXX0=