mapa-library-ui 0.25.3 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/core/js-brasil/index.mjs +16 -0
- package/esm2020/lib/core/js-brasil/src/create.mjs +455 -0
- package/esm2020/lib/core/js-brasil/src/createNumberMask.mjs +115 -0
- package/esm2020/lib/core/js-brasil/src/estados.mjs +34 -0
- package/esm2020/lib/core/js-brasil/src/index.mjs +34 -0
- package/esm2020/lib/core/js-brasil/src/inscricaoestadual.mjs +702 -0
- package/esm2020/lib/core/js-brasil/src/interfaces.mjs +2 -0
- package/esm2020/lib/core/js-brasil/src/iptu.mjs +25 -0
- package/esm2020/lib/core/js-brasil/src/iptu_create.mjs +60 -0
- package/esm2020/lib/core/js-brasil/src/iptu_mask.mjs +38 -0
- package/esm2020/lib/core/js-brasil/src/iptu_validate.mjs +67 -0
- package/esm2020/lib/core/js-brasil/src/mask.mjs +579 -0
- package/esm2020/lib/core/js-brasil/src/name.mjs +371 -0
- package/esm2020/lib/core/js-brasil/src/placa.mjs +162 -0
- package/esm2020/lib/core/js-brasil/src/rg.mjs +63 -0
- package/esm2020/lib/core/js-brasil/src/saude.mjs +62 -0
- package/esm2020/lib/core/js-brasil/src/utils.mjs +304 -0
- package/esm2020/lib/core/js-brasil/src/validate.mjs +627 -0
- package/esm2020/lib/core/pipes/cpf.mjs +17 -0
- package/esm2020/public-api.mjs +3 -1
- package/esm2020/src/lib/components/capability/lib/components/dropdown/src/dropdown.component.mjs +2 -2
- package/esm2020/src/lib/components/chart/lib/components/dropdown/src/dropdown.component.mjs +2 -2
- package/esm2020/src/lib/components/dropdown/lib/components/dropdown/src/dropdown.component.mjs +2 -2
- package/esm2020/src/lib/components/table/lib/components/table/public-api.mjs +2 -1
- package/esm2020/src/lib/components/table/lib/components/table/src/table.module.mjs +10 -3
- package/fesm2015/mapa-library-ui-src-lib-components-capability.mjs +1 -1
- package/fesm2015/mapa-library-ui-src-lib-components-capability.mjs.map +1 -1
- package/fesm2015/mapa-library-ui-src-lib-components-chart.mjs +1 -1
- package/fesm2015/mapa-library-ui-src-lib-components-chart.mjs.map +1 -1
- package/fesm2015/mapa-library-ui-src-lib-components-dropdown.mjs +1 -1
- package/fesm2015/mapa-library-ui-src-lib-components-dropdown.mjs.map +1 -1
- package/fesm2015/mapa-library-ui-src-lib-components-table.mjs +31 -24
- package/fesm2015/mapa-library-ui-src-lib-components-table.mjs.map +1 -1
- package/fesm2015/mapa-library-ui.mjs +3675 -2
- package/fesm2015/mapa-library-ui.mjs.map +1 -1
- package/fesm2020/mapa-library-ui-src-lib-components-capability.mjs +1 -1
- package/fesm2020/mapa-library-ui-src-lib-components-capability.mjs.map +1 -1
- package/fesm2020/mapa-library-ui-src-lib-components-chart.mjs +1 -1
- package/fesm2020/mapa-library-ui-src-lib-components-chart.mjs.map +1 -1
- package/fesm2020/mapa-library-ui-src-lib-components-dropdown.mjs +1 -1
- package/fesm2020/mapa-library-ui-src-lib-components-dropdown.mjs.map +1 -1
- package/fesm2020/mapa-library-ui-src-lib-components-table.mjs +31 -24
- package/fesm2020/mapa-library-ui-src-lib-components-table.mjs.map +1 -1
- package/fesm2020/mapa-library-ui.mjs +3682 -2
- package/fesm2020/mapa-library-ui.mjs.map +1 -1
- package/lib/core/js-brasil/index.d.ts +15 -0
- package/lib/core/js-brasil/src/create.d.ts +37 -0
- package/lib/core/js-brasil/src/createNumberMask.d.ts +13 -0
- package/lib/core/js-brasil/src/estados.d.ts +7 -0
- package/lib/core/js-brasil/src/index.d.ts +34 -0
- package/lib/core/js-brasil/src/inscricaoestadual.d.ts +7 -0
- package/lib/core/js-brasil/src/interfaces.d.ts +51 -0
- package/lib/core/js-brasil/src/iptu.d.ts +3 -0
- package/lib/core/js-brasil/src/iptu_create.d.ts +5 -0
- package/lib/core/js-brasil/src/iptu_mask.d.ts +2 -0
- package/lib/core/js-brasil/src/iptu_validate.d.ts +10 -0
- package/lib/core/js-brasil/src/mask.d.ts +53 -0
- package/lib/core/js-brasil/src/name.d.ts +9 -0
- package/lib/core/js-brasil/src/placa.d.ts +6 -0
- package/lib/core/js-brasil/src/rg.d.ts +5 -0
- package/lib/core/js-brasil/src/saude.d.ts +84 -0
- package/lib/core/js-brasil/src/utils.d.ts +71 -0
- package/lib/core/js-brasil/src/validate.d.ts +90 -0
- package/lib/core/pipes/cpf.d.ts +7 -0
- package/mapa-library-ui-0.27.0.tgz +0 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/src/lib/components/table/lib/components/table/public-api.d.ts +1 -0
- package/mapa-library-ui-0.25.3.tgz +0 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { ESTADOS_SIGLA } from './estados';
|
|
2
|
+
export function isPresent(obj) {
|
|
3
|
+
return obj !== undefined && obj !== null;
|
|
4
|
+
}
|
|
5
|
+
export function isArray(value) {
|
|
6
|
+
return (Array.isArray && Array.isArray(value)) || value instanceof Array;
|
|
7
|
+
}
|
|
8
|
+
export function isString(value) {
|
|
9
|
+
return typeof value === 'string' || value instanceof String;
|
|
10
|
+
}
|
|
11
|
+
export function isNumber(value) {
|
|
12
|
+
return typeof value === 'number' && !isNaN(value); // && value.length === undefined
|
|
13
|
+
}
|
|
14
|
+
export function isNil(value) {
|
|
15
|
+
return typeof value === 'undefined' || value === null;
|
|
16
|
+
}
|
|
17
|
+
const strCaretTrap = '[]';
|
|
18
|
+
export function processCaretTraps(mask) {
|
|
19
|
+
const indexes = [];
|
|
20
|
+
let indexOfCaretTrap;
|
|
21
|
+
while (indexOfCaretTrap = mask.indexOf(strCaretTrap), indexOfCaretTrap !== -1) { // eslint-disable-line
|
|
22
|
+
indexes.push(indexOfCaretTrap);
|
|
23
|
+
mask.splice(indexOfCaretTrap, 1);
|
|
24
|
+
}
|
|
25
|
+
return { maskWithoutCaretTraps: mask, indexes };
|
|
26
|
+
}
|
|
27
|
+
export const modulo11 = (value) => {
|
|
28
|
+
let mults = [];
|
|
29
|
+
let weightVal = 2;
|
|
30
|
+
for (let i = 0; i < value.length; i++) {
|
|
31
|
+
// mults = [weightVal, ...mults]
|
|
32
|
+
mults.push(weightVal);
|
|
33
|
+
weightVal++;
|
|
34
|
+
if (weightVal > 9)
|
|
35
|
+
weightVal = 2;
|
|
36
|
+
}
|
|
37
|
+
mults = mults.reverse();
|
|
38
|
+
let sum = 0;
|
|
39
|
+
for (let i = 0; i < value.length; i++) {
|
|
40
|
+
sum += parseInt(value[i]) * mults[i];
|
|
41
|
+
}
|
|
42
|
+
const digit = (sum * 10) % 11;
|
|
43
|
+
return digit;
|
|
44
|
+
};
|
|
45
|
+
export const modulo11Custom = (string, size, maxMult = string.length, by10 = true) => {
|
|
46
|
+
if (!by10)
|
|
47
|
+
size = 1;
|
|
48
|
+
for (let n = 1; n <= size; n++) {
|
|
49
|
+
let soma = 0;
|
|
50
|
+
let mult = 2;
|
|
51
|
+
for (let i = string.length - 1; i >= 0; i--) {
|
|
52
|
+
soma += (mult * parseInt(string.charAt(i)));
|
|
53
|
+
mult++;
|
|
54
|
+
if (mult > maxMult)
|
|
55
|
+
mult = 2;
|
|
56
|
+
}
|
|
57
|
+
let dig;
|
|
58
|
+
if (by10) {
|
|
59
|
+
dig = ((soma * 10) % 11) % 10;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
dig = soma % 11;
|
|
63
|
+
if (dig == 10)
|
|
64
|
+
dig = 0;
|
|
65
|
+
}
|
|
66
|
+
string += dig;
|
|
67
|
+
}
|
|
68
|
+
return string.substr(string.length - size, size);
|
|
69
|
+
};
|
|
70
|
+
export const modulo11a = (string, size, mod) => {
|
|
71
|
+
let soma = 0;
|
|
72
|
+
for (let i = 1; i <= size; i++) {
|
|
73
|
+
// tslint:disable-next-line:radix
|
|
74
|
+
soma = soma + parseInt(string.substring(i - 1, i)) * (mod - i);
|
|
75
|
+
}
|
|
76
|
+
let resto = (soma * 10) % 11;
|
|
77
|
+
if ((resto === 10) || (resto === 11)) {
|
|
78
|
+
resto = 0;
|
|
79
|
+
}
|
|
80
|
+
return resto;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
*
|
|
84
|
+
* @param input
|
|
85
|
+
* ^ - Match line start
|
|
86
|
+
(\d) - match first digit and capture it in back reference #1 i.e. \1
|
|
87
|
+
(?!..) is a negative lookahead
|
|
88
|
+
(?!\1+$) means disallow the match if first digit is followed by same digit (captured group) till end.
|
|
89
|
+
\d{11}$ match next 11 digit followed by line end
|
|
90
|
+
*/
|
|
91
|
+
export function allNumbersAreSame(inputValue) {
|
|
92
|
+
const input = getAllDigits(inputValue);
|
|
93
|
+
if (typeof input === 'string') {
|
|
94
|
+
const reg = new RegExp('^(\\d)(?!\\1+$)\\d{' + (input.length - 1) + '}$');
|
|
95
|
+
return reg.test(input);
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
export function getAllDigits(input) {
|
|
100
|
+
if (!input.match) {
|
|
101
|
+
input = input.toString();
|
|
102
|
+
}
|
|
103
|
+
const match = input.match(/\d/g);
|
|
104
|
+
if (match) {
|
|
105
|
+
return match.join("");
|
|
106
|
+
}
|
|
107
|
+
return '';
|
|
108
|
+
}
|
|
109
|
+
export function getAllWords(input) {
|
|
110
|
+
const match = input.match(/\w/g);
|
|
111
|
+
if (match) {
|
|
112
|
+
return match.join("");
|
|
113
|
+
}
|
|
114
|
+
return '';
|
|
115
|
+
}
|
|
116
|
+
export function currencyToNumber(input) {
|
|
117
|
+
if (typeof input === 'number') {
|
|
118
|
+
return input;
|
|
119
|
+
}
|
|
120
|
+
input = input.replace(/ /g, '');
|
|
121
|
+
if (input.indexOf('$') !== -1) {
|
|
122
|
+
const vals = input.split('$');
|
|
123
|
+
input = vals[1];
|
|
124
|
+
}
|
|
125
|
+
// Keeping just numbers . and ,
|
|
126
|
+
input = input.replace(/[^0-9.,]+/, '');
|
|
127
|
+
// eua format
|
|
128
|
+
if (input.indexOf('.') === (input.length - 1) - 2) {
|
|
129
|
+
input = input.replace(/\,/g, '');
|
|
130
|
+
}
|
|
131
|
+
// br format
|
|
132
|
+
else {
|
|
133
|
+
input = input.replace(/\./g, '').replace(',', '.');
|
|
134
|
+
}
|
|
135
|
+
return parseFloat(input);
|
|
136
|
+
}
|
|
137
|
+
export function numberToCurrency(value) {
|
|
138
|
+
return ' R$ ' + value.toFixed(2).replace('.', ',') + ' ';
|
|
139
|
+
}
|
|
140
|
+
;
|
|
141
|
+
export function slugify(value) {
|
|
142
|
+
return value.toString().toLowerCase()
|
|
143
|
+
.replace(/[àÀáÁâÂãäÄÅåª]+/g, 'a') // Special Characters #1
|
|
144
|
+
.replace(/[èÈéÉêÊëË]+/g, 'e') // Special Characters #2
|
|
145
|
+
.replace(/[ìÌíÍîÎïÏ]+/g, 'i') // Special Characters #3
|
|
146
|
+
.replace(/[òÒóÓôÔõÕöÖº]+/g, 'o') // Special Characters #4
|
|
147
|
+
.replace(/[ùÙúÚûÛüÜ]+/g, 'u') // Special Characters #5
|
|
148
|
+
.replace(/[ýÝÿŸ]+/g, 'y') // Special Characters #6
|
|
149
|
+
.replace(/[ñÑ]+/g, 'n') // Special Characters #7
|
|
150
|
+
.replace(/[çÇ]+/g, 'c') // Special Characters #8
|
|
151
|
+
.replace(/[ß]+/g, 'ss') // Special Characters #9
|
|
152
|
+
.replace(/[Ææ]+/g, 'ae') // Special Characters #10
|
|
153
|
+
.replace(/[Øøœ]+/g, 'oe') // Special Characters #11
|
|
154
|
+
.replace(/[%]+/g, 'pct') // Special Characters #12
|
|
155
|
+
.replace(/\s+/g, '-') // Replace spaces with -
|
|
156
|
+
.replace(/[^\w\-]+/g, '') // Remove all non-word chars
|
|
157
|
+
.replace(/\-\-+/g, '-') // Replace multiple - with single -
|
|
158
|
+
.replace(/^-+/, '') // Trim - from start of text
|
|
159
|
+
.replace(/-+$/, ''); // Trim - from end of text
|
|
160
|
+
}
|
|
161
|
+
;
|
|
162
|
+
/**
|
|
163
|
+
*
|
|
164
|
+
* @param string ex. 12345
|
|
165
|
+
* @param size 11
|
|
166
|
+
* @param fill 0
|
|
167
|
+
*
|
|
168
|
+
* Returns: 00000012345
|
|
169
|
+
*/
|
|
170
|
+
export function fillString(string, size, fill) {
|
|
171
|
+
if (string.length < size) {
|
|
172
|
+
const dif = size - string.length;
|
|
173
|
+
for (let i = 0; i < dif; i++) {
|
|
174
|
+
string = fill + string;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return string;
|
|
178
|
+
}
|
|
179
|
+
export function randArray(array) {
|
|
180
|
+
const index = randomNumber(0, array.length);
|
|
181
|
+
return array[index];
|
|
182
|
+
}
|
|
183
|
+
export function rand(length, ...ranges) {
|
|
184
|
+
var str = ""; // the string (initialized to "")
|
|
185
|
+
while (length--) { // repeat this length of times
|
|
186
|
+
var ind = Math.floor(Math.random() * ranges.length); // get a random range from the ranges object
|
|
187
|
+
var min = ranges[ind][0].charCodeAt(0), // get the minimum char code allowed for this range
|
|
188
|
+
max = ranges[ind][1].charCodeAt(0); // get the maximum char code allowed for this range
|
|
189
|
+
var c = Math.floor(Math.random() * (max - min + 1)) + min; // get a random char code between min and max
|
|
190
|
+
str += String.fromCharCode(c); // convert it back into a character and append it to the string str
|
|
191
|
+
}
|
|
192
|
+
return str; // return str
|
|
193
|
+
}
|
|
194
|
+
export function randomNumber(begin, end) {
|
|
195
|
+
const dif = end - begin;
|
|
196
|
+
const number = Math.floor(Math.random() * dif) + begin;
|
|
197
|
+
return number;
|
|
198
|
+
}
|
|
199
|
+
export function randomLetter(size = 1, onlyCapitals = false) {
|
|
200
|
+
var text = "";
|
|
201
|
+
let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
202
|
+
if (onlyCapitals == false) {
|
|
203
|
+
possible += "abcdefghijklmnopqrstuvwxyz";
|
|
204
|
+
}
|
|
205
|
+
possible = possible.split('');
|
|
206
|
+
for (let i = 0; i < size; i++) {
|
|
207
|
+
const pos = Math.floor(Math.random() * possible.length);
|
|
208
|
+
text += possible[pos];
|
|
209
|
+
}
|
|
210
|
+
return text;
|
|
211
|
+
}
|
|
212
|
+
export function randomLetterOrNumber(size = 1, onlyCapitals = false) {
|
|
213
|
+
var text = "";
|
|
214
|
+
let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
215
|
+
if (onlyCapitals == false) {
|
|
216
|
+
possible += "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
217
|
+
}
|
|
218
|
+
possible = possible.split('');
|
|
219
|
+
for (let i = 0; i < size; i++) {
|
|
220
|
+
const pos = Math.floor(Math.random() * possible.length);
|
|
221
|
+
text += possible[pos];
|
|
222
|
+
}
|
|
223
|
+
return text;
|
|
224
|
+
}
|
|
225
|
+
export const randomEstadoSigla = () => {
|
|
226
|
+
const total = ESTADOS_SIGLA.length;
|
|
227
|
+
return ESTADOS_SIGLA[Math.floor(Math.random() * total)];
|
|
228
|
+
};
|
|
229
|
+
export const CORES = ["AMARELO", "AZUL", "BEGE", "BRANCA", "CINZA", "DOURADA", "GRENA", "LARANJA", "MARROM", "PRATA",
|
|
230
|
+
"PRETA", "ROSA", "ROXA", "VERDE", "VERMELHA", "FANTASIA"];
|
|
231
|
+
export function getSpecialProperty(model, key) {
|
|
232
|
+
return model[key];
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
*
|
|
236
|
+
*/
|
|
237
|
+
export const makeGenericFaker = (val, options = null) => {
|
|
238
|
+
return () => {
|
|
239
|
+
if (!val.textMask || !val.textMask.map) {
|
|
240
|
+
return '';
|
|
241
|
+
}
|
|
242
|
+
const newData = val.textMask.map((c, index) => {
|
|
243
|
+
if (options && options[index]) {
|
|
244
|
+
return options[index]();
|
|
245
|
+
}
|
|
246
|
+
c = c.toString();
|
|
247
|
+
if (c === /\d/.toString()) {
|
|
248
|
+
return Math.floor(Math.random() * 10).toString();
|
|
249
|
+
}
|
|
250
|
+
else if (c === /[A-Za-z]/.toString()) {
|
|
251
|
+
return randomLetter(1).toString();
|
|
252
|
+
}
|
|
253
|
+
else if (c === /\w/.toString()) {
|
|
254
|
+
return randomLetterOrNumber(1).toString();
|
|
255
|
+
}
|
|
256
|
+
else if (c.indexOf('/[') === 0) { // /[1-9]/ ou /[5-9]/
|
|
257
|
+
c = c.replace('/[', '').replace(']/', '');
|
|
258
|
+
if (c.indexOf('-') > 0) {
|
|
259
|
+
c = c.split('-');
|
|
260
|
+
if (parseInt(c[1])) {
|
|
261
|
+
const mult = c[1] - c[0];
|
|
262
|
+
const plus = parseInt(c[0]);
|
|
263
|
+
return (Math.floor(Math.random() * mult) + plus).toString();
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
return rand(1, [c[0], c[1]]);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else if (c.indexOf('|') > 0) {
|
|
270
|
+
c = c.split('|');
|
|
271
|
+
const index = Math.floor(Math.random() * c.length);
|
|
272
|
+
return c[index];
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
return c;
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
return newData.join('');
|
|
280
|
+
};
|
|
281
|
+
};
|
|
282
|
+
const utilsBr = {
|
|
283
|
+
isPresent,
|
|
284
|
+
isArray,
|
|
285
|
+
isString,
|
|
286
|
+
isNumber,
|
|
287
|
+
isNil,
|
|
288
|
+
processCaretTraps,
|
|
289
|
+
allNumbersAreSame,
|
|
290
|
+
getAllDigits,
|
|
291
|
+
getAllWords,
|
|
292
|
+
currencyToNumber,
|
|
293
|
+
numberToCurrency,
|
|
294
|
+
slugify,
|
|
295
|
+
fillString,
|
|
296
|
+
randArray,
|
|
297
|
+
rand,
|
|
298
|
+
randomNumber,
|
|
299
|
+
randomLetter,
|
|
300
|
+
randomLetterOrNumber,
|
|
301
|
+
getSpecialProperty
|
|
302
|
+
};
|
|
303
|
+
export default utilsBr;
|
|
304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBhLWxpYnJhcnktdWkvc3JjL2xpYi9jb3JlL2pzLWJyYXNpbC9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUcxQyxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVE7SUFDaEMsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUM7QUFDM0MsQ0FBQztBQUVELE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBVTtJQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLEtBQUssQ0FBQTtBQUMxRSxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFVO0lBQ2pDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssWUFBWSxNQUFNLENBQUE7QUFDN0QsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBVTtJQUNqQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztBQUNyRixDQUFDO0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFVO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssV0FBVyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUE7QUFDdkQsQ0FBQztBQUtELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQTtBQUN6QixNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBUztJQUN6QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7SUFFbEIsSUFBSSxnQkFBd0IsQ0FBQTtJQUM1QixPQUFPLGdCQUFnQixHQUFHLElBQUksQ0FBQyxP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QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDOUI7aUJBQ0Y7cUJBQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDN0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbkQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pCO2FBRUY7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLENBQUM7YUFDVjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQTtBQUVELE1BQU0sT0FBTyxHQUFHO0lBQ2QsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLEtBQUs7SUFDTCxpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxJQUFJO0lBQ0osWUFBWTtJQUNaLFlBQVk7SUFDWixvQkFBb0I7SUFDcEIsa0JBQWtCO0NBQ25CLENBQUE7QUFFRCxlQUFlLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVTVEFET1NfU0lHTEEgfSBmcm9tICcuL2VzdGFkb3MnO1xuaW1wb3J0IHsgQmlnT2JqZWN0IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlc2VudChvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheSh2YWx1ZTogYW55KSB7XG4gIHJldHVybiAoQXJyYXkuaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBBcnJheVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWU6IGFueSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IGFueSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpOyAvLyAmJiB2YWx1ZS5sZW5ndGggPT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOaWwodmFsdWU6IGFueSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZSA9PT0gbnVsbFxufVxuXG5cblxuXG5jb25zdCBzdHJDYXJldFRyYXAgPSAnW10nXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0NhcmV0VHJhcHMobWFzazogYW55KSB7XG4gIGNvbnN0IGluZGV4ZXMgPSBbXVxuXG4gIGxldCBpbmRleE9mQ2FyZXRUcmFwOiBudW1iZXJcbiAgd2hpbGUgKGluZGV4T2ZDYXJldFRyYXAgPSBtYXNrLmluZGV4T2Yoc3RyQ2FyZXRUcmFwKSwgaW5kZXhPZkNhcmV0VHJhcCAhPT0gLTEpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGluZGV4ZXMucHVzaChpbmRleE9mQ2FyZXRUcmFwKVxuXG4gICAgbWFzay5zcGxpY2UoaW5kZXhPZkNhcmV0VHJhcCwgMSlcbiAgfVxuXG4gIHJldHVybiB7IG1hc2tXaXRob3V0Q2FyZXRUcmFwczogbWFzaywgaW5kZXhlcyB9XG59XG5cbmV4cG9ydCBjb25zdCBtb2R1bG8xMSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIGxldCBtdWx0czogYW55ID0gW11cbiAgbGV0IHdlaWdodFZhbCA9IDJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIC8vIG11bHRzID0gW3dlaWdodFZhbCwgLi4ubXVsdHNdXG4gICAgbXVsdHMucHVzaCh3ZWlnaHRWYWwpXG4gICAgd2VpZ2h0VmFsKytcbiAgICBpZiAod2VpZ2h0VmFsID4gOSkgd2VpZ2h0VmFsID0gMlxuICB9XG5cbiAgbXVsdHMgPSBtdWx0cy5yZXZlcnNlKClcblxuICBsZXQgc3VtID0gMFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgc3VtICs9IHBhcnNlSW50KHZhbHVlW2ldKSAqIG11bHRzW2ldXG4gIH1cbiAgY29uc3QgZGlnaXQgPSAoc3VtICoxMCkgJSAxMVxuICByZXR1cm4gZGlnaXRcbn1cblxuZXhwb3J0IGNvbnN0IG1vZHVsbzExQ3VzdG9tID0gKHN0cmluZzogc3RyaW5nLCBzaXplOiBudW1iZXIsIG1heE11bHQgPSBzdHJpbmcubGVuZ3RoLCBieTEwID0gdHJ1ZSkgPT4ge1xuICBpZiAoIWJ5MTApIHNpemUgPSAxXG4gIGZvciAobGV0IG4gPSAxOyBuIDw9IHNpemU7IG4rKykge1xuICAgIGxldCBzb21hID0gMFxuICAgIGxldCBtdWx0ID0gMlxuICAgIGZvciAobGV0IGkgPSBzdHJpbmcubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHNvbWEgKz0gKG11bHQgKiBwYXJzZUludChzdHJpbmcuY2hhckF0KGkpKSlcbiAgICAgIG11bHQrK1xuICAgICAgaWYgKG11bHQgPiBtYXhNdWx0KSBtdWx0ID0gMlxuICAgIH1cbiAgICBsZXQgZGlnXG4gICAgaWYgKGJ5MTApIHtcbiAgICAgIGRpZyA9ICgoc29tYSAqIDEwKSAlIDExKSAlIDEwO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWcgPSBzb21hICUgMTE7XG4gICAgICBpZiAoZGlnID09IDEwKSBkaWcgPSAwO1xuICAgIH1cbiAgICBzdHJpbmcgKz0gZGlnO1xuICB9XG4gIHJldHVybiBzdHJpbmcuc3Vic3RyKHN0cmluZy5sZW5ndGggLSBzaXplLCBzaXplKTtcbn1cblxuXG5leHBvcnQgY29uc3QgbW9kdWxvMTFhID0gKHN0cmluZzogc3RyaW5nLCBzaXplOiBudW1iZXIsIG1vZDogbnVtYmVyKSA9PiB7XG4gIGxldCBzb21hID0gMDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gc2l6ZTsgaSsrKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJhZGl4XG4gICAgc29tYSA9IHNvbWEgKyBwYXJzZUludChzdHJpbmcuc3Vic3RyaW5nKGkgLSAxLCBpKSkgKiAobW9kIC0gaSk7XG4gIH1cbiAgbGV0IHJlc3RvID0gKHNvbWEgKiAxMCkgJSAxMTtcblxuICBpZiAoKHJlc3RvID09PSAxMCkgfHwgKHJlc3RvID09PSAxMSkpIHtcbiAgICByZXN0byA9IDA7XG4gIH1cbiAgcmV0dXJuIHJlc3RvO1xufVxuXG4vKipcbiAqIFxuICogQHBhcmFtIGlucHV0IFxuICogXiAtIE1hdGNoIGxpbmUgc3RhcnRcbiAgKFxcZCkgLSBtYXRjaCBmaXJzdCBkaWdpdCBhbmQgY2FwdHVyZSBpdCBpbiBiYWNrIHJlZmVyZW5jZSAjMSBpLmUuIFxcMVxuICAoPyEuLikgaXMgYSBuZWdhdGl2ZSBsb29rYWhlYWRcbiAgKD8hXFwxKyQpIG1lYW5zIGRpc2FsbG93IHRoZSBtYXRjaCBpZiBmaXJzdCBkaWdpdCBpcyBmb2xsb3dlZCBieSBzYW1lIGRpZ2l0IChjYXB0dXJlZCBncm91cCkgdGlsbCBlbmQuXG4gIFxcZHsxMX0kIG1hdGNoIG5leHQgMTEgZGlnaXQgZm9sbG93ZWQgYnkgbGluZSBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsbE51bWJlcnNBcmVTYW1lKGlucHV0VmFsdWU6IHN0cmluZykge1xuICBjb25zdCBpbnB1dDogc3RyaW5nIHwgdm9pZCA9IGdldEFsbERpZ2l0cyhpbnB1dFZhbHVlKTtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCByZWcgPSBuZXcgUmVnRXhwKCdeKFxcXFxkKSg/IVxcXFwxKyQpXFxcXGR7JyArICgoPHN0cmluZz5pbnB1dCkubGVuZ3RoIC0gMSkgKyAnfSQnKTtcbiAgICByZXR1cm4gcmVnLnRlc3QoaW5wdXQpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbERpZ2l0cyhpbnB1dDogc3RyaW5nKSB7XG4gIGlmICghaW5wdXQubWF0Y2gpIHtcbiAgICBpbnB1dCA9IGlucHV0LnRvU3RyaW5nKCk7XG4gIH1cbiAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaCgvXFxkL2cpO1xuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4gbWF0Y2guam9pbihcIlwiKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxXb3JkcyhpbnB1dDogc3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goL1xcdy9nKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1hdGNoLmpvaW4oXCJcIik7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3VycmVuY3lUb051bWJlcihpbnB1dDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG4gIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvIC9nLCAnJyk7XG4gIGlmIChpbnB1dC5pbmRleE9mKCckJykgIT09IC0xKSB7XG4gICAgY29uc3QgdmFscyA9IGlucHV0LnNwbGl0KCckJyk7XG4gICAgaW5wdXQgPSB2YWxzWzFdO1xuICB9XG5cbiAgLy8gS2VlcGluZyBqdXN0IG51bWJlcnMgLiBhbmQgLFxuICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teMC05LixdKy8sICcnKTtcblxuICAvLyBldWEgZm9ybWF0XG4gIGlmIChpbnB1dC5pbmRleE9mKCcuJykgPT09IChpbnB1dC5sZW5ndGggLSAxKSAtIDIpIHtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1xcLC9nLCAnJylcbiAgfVxuICAvLyBiciBmb3JtYXRcbiAgZWxzZSB7XG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9cXC4vZywgJycpLnJlcGxhY2UoJywnLCAnLicpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlRmxvYXQoaW5wdXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9DdXJyZW5jeSh2YWx1ZTogbnVtYmVyKSB7XG4gIHJldHVybiAnIFIkICcgKyB2YWx1ZS50b0ZpeGVkKDIpLnJlcGxhY2UoJy4nLCAnLCcpICsgJyAnO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNsdWdpZnkodmFsdWU6IHN0cmluZykge1xuXG4gIHJldHVybiB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW8Ogw4DDocOBw6LDgsOjw6TDhMOFw6XCql0rL2csICdhJykgICAgICAgLy8gU3BlY2lhbCBDaGFyYWN0ZXJzICMxXG4gICAgLnJlcGxhY2UoL1vDqMOIw6nDicOqw4rDq8OLXSsvZywgJ2UnKSAgICAgICBcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjMlxuICAgIC5yZXBsYWNlKC9bw6zDjMOtw43DrsOOw6/Dj10rL2csICdpJykgICAgICAgXHQvLyBTcGVjaWFsIENoYXJhY3RlcnMgIzNcbiAgICAucmVwbGFjZSgvW8Oyw5LDs8OTw7TDlMO1w5XDtsOWwrpdKy9nLCAnbycpICAgICAgIFx0Ly8gU3BlY2lhbCBDaGFyYWN0ZXJzICM0XG4gICAgLnJlcGxhY2UoL1vDucOZw7rDmsO7w5vDvMOcXSsvZywgJ3UnKSAgICAgICBcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjNVxuICAgIC5yZXBsYWNlKC9bw73DncO/xbhdKy9nLCAneScpICAgICAgIFx0XHQvLyBTcGVjaWFsIENoYXJhY3RlcnMgIzZcbiAgICAucmVwbGFjZSgvW8Oxw5FdKy9nLCAnbicpICAgICAgIFx0XHRcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjN1xuICAgIC5yZXBsYWNlKC9bw6fDh10rL2csICdjJykgICAgICAgXHRcdFx0Ly8gU3BlY2lhbCBDaGFyYWN0ZXJzICM4XG4gICAgLnJlcGxhY2UoL1vDn10rL2csICdzcycpICAgICAgIFx0XHRcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjOVxuICAgIC5yZXBsYWNlKC9bw4bDpl0rL2csICdhZScpICAgICAgIFx0XHRcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjMTBcbiAgICAucmVwbGFjZSgvW8OYw7jFk10rL2csICdvZScpICAgICAgIFx0XHQvLyBTcGVjaWFsIENoYXJhY3RlcnMgIzExXG4gICAgLnJlcGxhY2UoL1slXSsvZywgJ3BjdCcpICAgICAgIFx0XHRcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjMTJcbiAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpICAgICAgICAgICBcdFx0Ly8gUmVwbGFjZSBzcGFjZXMgd2l0aCAtXG4gICAgLnJlcGxhY2UoL1teXFx3XFwtXSsvZywgJycpICAgICAgIFx0XHQvLyBSZW1vdmUgYWxsIG5vbi13b3JkIGNoYXJzXG4gICAgLnJlcGxhY2UoL1xcLVxcLSsvZywgJy0nKSAgICAgICAgIFx0XHQvLyBSZXBsYWNlIG11bHRpcGxlIC0gd2l0aCBzaW5nbGUgLVxuICAgIC5yZXBsYWNlKC9eLSsvLCAnJykgICAgICAgICAgICAgXHRcdC8vIFRyaW0gLSBmcm9tIHN0YXJ0IG9mIHRleHRcbiAgICAucmVwbGFjZSgvLSskLywgJycpOyAgICAgICAgICAgIFx0XHQvLyBUcmltIC0gZnJvbSBlbmQgb2YgdGV4dFxuXG59O1xuLyoqXG4gKiBcbiAqIEBwYXJhbSBzdHJpbmcgIGV4LiAxMjM0NVxuICogQHBhcmFtIHNpemUgICAxMVxuICogQHBhcmFtIGZpbGwgICAwXG4gKiBcbiAqIFJldHVybnM6IDAwMDAwMDEyMzQ1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsU3RyaW5nKHN0cmluZzogc3RyaW5nLCBzaXplOiBudW1iZXIsIGZpbGw6IHN0cmluZykge1xuICBpZiAoc3RyaW5nLmxlbmd0aCA8IHNpemUpIHtcbiAgICBjb25zdCBkaWYgPSBzaXplIC0gc3RyaW5nLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZjsgaSsrKSB7XG4gICAgICBzdHJpbmcgPSBmaWxsICsgc3RyaW5nXG4gICAgfVxuICB9XG4gIHJldHVybiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRBcnJheShhcnJheTogc3RyaW5nIHwgYW55W10pIHtcbiAgY29uc3QgaW5kZXggPSByYW5kb21OdW1iZXIoMCwgYXJyYXkubGVuZ3RoKTtcbiAgcmV0dXJuIGFycmF5W2luZGV4XTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcmFuZChsZW5ndGg6IG51bWJlciwgLi4ucmFuZ2VzOiBhbnlbXSkge1xuICB2YXIgc3RyID0gXCJcIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0cmluZyAoaW5pdGlhbGl6ZWQgdG8gXCJcIilcbiAgd2hpbGUgKGxlbmd0aC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXQgdGhpcyBsZW5ndGggb2YgdGltZXNcbiAgICB2YXIgaW5kID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcmFuZ2VzLmxlbmd0aCk7ICAgICAgICAgICAgICAvLyBnZXQgYSByYW5kb20gcmFuZ2UgZnJvbSB0aGUgcmFuZ2VzIG9iamVjdFxuICAgIHZhciBtaW4gPSByYW5nZXNbaW5kXVswXS5jaGFyQ29kZUF0KDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbWluaW11bSBjaGFyIGNvZGUgYWxsb3dlZCBmb3IgdGhpcyByYW5nZVxuICAgICAgbWF4ID0gcmFuZ2VzW2luZF1bMV0uY2hhckNvZGVBdCgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbWF4aW11bSBjaGFyIGNvZGUgYWxsb3dlZCBmb3IgdGhpcyByYW5nZVxuICAgIHZhciBjID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjsgICAgICAgIC8vIGdldCBhIHJhbmRvbSBjaGFyIGNvZGUgYmV0d2VlbiBtaW4gYW5kIG1heFxuICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgaXQgYmFjayBpbnRvIGEgY2hhcmFjdGVyIGFuZCBhcHBlbmQgaXQgdG8gdGhlIHN0cmluZyBzdHJcbiAgfVxuICByZXR1cm4gc3RyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBzdHJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbU51bWJlcihiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICBjb25zdCBkaWYgPSBlbmQgLSBiZWdpbjtcbiAgY29uc3QgbnVtYmVyID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZGlmKSArIGJlZ2luO1xuICByZXR1cm4gbnVtYmVyO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21MZXR0ZXIoc2l6ZSA9IDEsIG9ubHlDYXBpdGFscyA9IGZhbHNlKSB7XG4gIHZhciB0ZXh0ID0gXCJcIjtcbiAgbGV0IHBvc3NpYmxlOiBhbnkgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXCI7XG4gIGlmIChvbmx5Q2FwaXRhbHMgPT0gZmFsc2UpIHtcbiAgICBwb3NzaWJsZSArPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG4gIH1cbiAgcG9zc2libGUgPSBwb3NzaWJsZS5zcGxpdCgnJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgY29uc3QgcG9zID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9zc2libGUubGVuZ3RoKTtcbiAgICB0ZXh0ICs9IHBvc3NpYmxlW3Bvc107XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUxldHRlck9yTnVtYmVyKHNpemUgPSAxLCBvbmx5Q2FwaXRhbHMgPSBmYWxzZSkge1xuICB2YXIgdGV4dCA9IFwiXCI7XG4gIGxldCBwb3NzaWJsZTogYW55ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlcIjtcbiAgaWYgKG9ubHlDYXBpdGFscyA9PSBmYWxzZSkge1xuICAgIHBvc3NpYmxlICs9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XCI7XG4gIH1cbiAgcG9zc2libGUgPSBwb3NzaWJsZS5zcGxpdCgnJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgY29uc3QgcG9zID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9zc2libGUubGVuZ3RoKTtcbiAgICB0ZXh0ICs9IHBvc3NpYmxlW3Bvc107XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbmV4cG9ydCBjb25zdCByYW5kb21Fc3RhZG9TaWdsYSA9ICgpID0+IHtcbiAgY29uc3QgdG90YWwgPSBFU1RBRE9TX1NJR0xBLmxlbmd0aDtcbiAgcmV0dXJuIEVTVEFET1NfU0lHTEFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdG90YWwpXTtcbn1cblxuZXhwb3J0IGNvbnN0IENPUkVTID0gW1wiQU1BUkVMT1wiLCBcIkFaVUxcIiwgXCJCRUdFXCIsIFwiQlJBTkNBXCIsIFwiQ0lOWkFcIiwgXCJET1VSQURBXCIsIFwiR1JFTkFcIiwgXCJMQVJBTkpBXCIsIFwiTUFSUk9NXCIsIFwiUFJBVEFcIixcbiAgXCJQUkVUQVwiLCBcIlJPU0FcIiwgXCJST1hBXCIsIFwiVkVSREVcIiwgXCJWRVJNRUxIQVwiLCBcIkZBTlRBU0lBXCJdO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGVjaWFsUHJvcGVydHk8VE1vZGVsLCBUS2V5IGV4dGVuZHMga2V5b2YgVE1vZGVsPihcbiAgbW9kZWw6IFRNb2RlbCxcbiAga2V5OiBUS2V5XG4pIHtcbiAgcmV0dXJuIG1vZGVsW2tleV07XG59XG5cbi8qKlxuICogXG4gKi9cbmV4cG9ydCBjb25zdCBtYWtlR2VuZXJpY0Zha2VyID0gKHZhbDogYW55LCBvcHRpb25zOiBCaWdPYmplY3Q8RnVuY3Rpb24+IHwgbnVsbCA9IG51bGwpID0+IHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoIXZhbC50ZXh0TWFzayB8fCAhdmFsLnRleHRNYXNrLm1hcCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBuZXdEYXRhID0gdmFsLnRleHRNYXNrLm1hcCgoYzogc3RyaW5nIHwgYW55W10sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnNbaW5kZXhdKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zW2luZGV4XSgpO1xuICAgICAgfVxuICAgICAgYyA9IGMudG9TdHJpbmcoKTtcbiAgICAgIGlmIChjID09PSAvXFxkLy50b1N0cmluZygpKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMCkudG9TdHJpbmcoKVxuICAgICAgfSBlbHNlIGlmIChjID09PSAvW0EtWmEtel0vLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgcmV0dXJuIHJhbmRvbUxldHRlcigxKS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChjID09PSAvXFx3Ly50b1N0cmluZygpKSB7XG4gICAgICAgIHJldHVybiByYW5kb21MZXR0ZXJPck51bWJlcigxKS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChjLmluZGV4T2YoJy9bJykgPT09IDApIHsgLy8gL1sxLTldLyBvdSAvWzUtOV0vXG4gICAgICAgIGMgPSBjLnJlcGxhY2UoJy9bJywgJycpLnJlcGxhY2UoJ10vJywgJycpO1xuXG4gICAgICAgIGlmIChjLmluZGV4T2YoJy0nKSA+IDApIHtcbiAgICAgICAgICBjID0gYy5zcGxpdCgnLScpO1xuICAgICAgICAgIGlmIChwYXJzZUludChjWzFdKSkge1xuICAgICAgICAgICAgY29uc3QgbXVsdCA9IGNbMV0gLSBjWzBdO1xuICAgICAgICAgICAgY29uc3QgcGx1cyA9IHBhcnNlSW50KGNbMF0pO1xuICAgICAgICAgICAgcmV0dXJuIChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtdWx0KSArIHBsdXMpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByYW5kKDEsIFtjWzBdLCBjWzFdXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGMuaW5kZXhPZignfCcpID4gMCkge1xuICAgICAgICAgIGMgPSBjLnNwbGl0KCd8Jyk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjLmxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuIGNbaW5kZXhdO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBuZXdEYXRhLmpvaW4oJycpO1xuICB9O1xufVxuXG5jb25zdCB1dGlsc0JyID0ge1xuICBpc1ByZXNlbnQsXG4gIGlzQXJyYXksXG4gIGlzU3RyaW5nLFxuICBpc051bWJlcixcbiAgaXNOaWwsXG4gIHByb2Nlc3NDYXJldFRyYXBzLFxuICBhbGxOdW1iZXJzQXJlU2FtZSxcbiAgZ2V0QWxsRGlnaXRzLFxuICBnZXRBbGxXb3JkcyxcbiAgY3VycmVuY3lUb051bWJlcixcbiAgbnVtYmVyVG9DdXJyZW5jeSxcbiAgc2x1Z2lmeSxcbiAgZmlsbFN0cmluZyxcbiAgcmFuZEFycmF5LFxuICByYW5kLFxuICByYW5kb21OdW1iZXIsXG4gIHJhbmRvbUxldHRlcixcbiAgcmFuZG9tTGV0dGVyT3JOdW1iZXIsXG4gIGdldFNwZWNpYWxQcm9wZXJ0eVxufVxuXG5leHBvcnQgZGVmYXVsdCB1dGlsc0JyOyJdfQ==
|