mapa-library-ui 0.25.3 → 0.26.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/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-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-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.26.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,579 @@
|
|
|
1
|
+
import { isArray, processCaretTraps } from './utils';
|
|
2
|
+
export { MASKSIE } from './inscricaoestadual';
|
|
3
|
+
import createNumberMask from './createNumberMask';
|
|
4
|
+
import { mask_iptu } from './iptu';
|
|
5
|
+
import { MASKSIE } from './inscricaoestadual';
|
|
6
|
+
const maskNumber = {
|
|
7
|
+
decimalLimit: 2,
|
|
8
|
+
thousandsSeparatorSymbol: '.',
|
|
9
|
+
decimalSymbol: ',',
|
|
10
|
+
allowDecimal: true,
|
|
11
|
+
integerLimit: 17,
|
|
12
|
+
prefix: '',
|
|
13
|
+
suffix: ''
|
|
14
|
+
};
|
|
15
|
+
export const MASKS = {
|
|
16
|
+
aih: {
|
|
17
|
+
text: '000000000000-0',
|
|
18
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/]
|
|
19
|
+
},
|
|
20
|
+
cartaocredito: {
|
|
21
|
+
text: '0000 0000 0000 0000 00/00 000',
|
|
22
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, '0', /\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, '/', /\d/, /\d/, ' ', /\d/, /\d/, /\d/]
|
|
23
|
+
},
|
|
24
|
+
celular: {
|
|
25
|
+
text: '(00) 00000-0000',
|
|
26
|
+
textMask: ['(', /[1-9]/, /\d/, ')', ' ', /[5-9]/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/],
|
|
27
|
+
},
|
|
28
|
+
cep: {
|
|
29
|
+
text: '00.000-000',
|
|
30
|
+
textMask: [/\d/, /\d/, '.', /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/]
|
|
31
|
+
},
|
|
32
|
+
// certidao Certidões de Nascimento, Casamento ou Óbito
|
|
33
|
+
certidao: {
|
|
34
|
+
text: '000000.00.00.0000.0.00000.000.0000000-00',
|
|
35
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, '.', /\d/, /\d/, '.',
|
|
36
|
+
/\d/, /\d/, /\d/, /\d/, '.', /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, '.',
|
|
37
|
+
/\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/]
|
|
38
|
+
},
|
|
39
|
+
chassi: {
|
|
40
|
+
text: 'AAA AAAAAA AA AA0000',
|
|
41
|
+
textMask: [/[1-9]/, /\w/, /\w/, ' ', /\w/, /\w/, /\w/, /\w/, /\w/, /\w/, ' ', /\w/, /\w/, ' ', /\w/, /\w/, /\d/, /\d/, /\d/, /\d/]
|
|
42
|
+
},
|
|
43
|
+
cid: {
|
|
44
|
+
textMask: false
|
|
45
|
+
},
|
|
46
|
+
cnae: {
|
|
47
|
+
text: '0000-0/00',
|
|
48
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, '-', /\d/, '/', /\d/, /\d/]
|
|
49
|
+
},
|
|
50
|
+
cnh: {
|
|
51
|
+
text: '000000000-00',
|
|
52
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/]
|
|
53
|
+
},
|
|
54
|
+
renachseguranca: {
|
|
55
|
+
text: '00000000000',
|
|
56
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/]
|
|
57
|
+
},
|
|
58
|
+
renachestadual: {
|
|
59
|
+
text: 'AA000000000',
|
|
60
|
+
textMask: [/[A-S]/, /[A-Z]/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/]
|
|
61
|
+
},
|
|
62
|
+
cnhespelho: {
|
|
63
|
+
text: '0000000000',
|
|
64
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/]
|
|
65
|
+
},
|
|
66
|
+
cnpj: {
|
|
67
|
+
text: '00.000.000/0000-00',
|
|
68
|
+
textMask: [/\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/]
|
|
69
|
+
},
|
|
70
|
+
cns: {
|
|
71
|
+
text: '000 0000 0000 00-00',
|
|
72
|
+
textMask: [/[1|2|7|8|9]/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, '-', /\d/, /\d/]
|
|
73
|
+
},
|
|
74
|
+
contabanco: {
|
|
75
|
+
text: '000 00000-0 00000-0',
|
|
76
|
+
textMask: [/\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, /\d/, '-',
|
|
77
|
+
/\d/, ' ', /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/]
|
|
78
|
+
},
|
|
79
|
+
cpf: {
|
|
80
|
+
text: '000.000.000-00',
|
|
81
|
+
textMask: [/\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '-', /\d/, /\d/]
|
|
82
|
+
},
|
|
83
|
+
cpfcnpj: {
|
|
84
|
+
text: '00.000.000/0000-00',
|
|
85
|
+
textMask: [/\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/],
|
|
86
|
+
textMaskFunction: function mask(userInput) {
|
|
87
|
+
const numbers = userInput.match(/\d/g);
|
|
88
|
+
let numberLength = 0;
|
|
89
|
+
if (numbers) {
|
|
90
|
+
numberLength = numbers.join('').length;
|
|
91
|
+
}
|
|
92
|
+
if (!userInput || numberLength > 12) {
|
|
93
|
+
return [/\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/];
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return [/\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '-', /\d/, /\d/];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
currency: {
|
|
101
|
+
text: '0.000,00',
|
|
102
|
+
textMask: createNumberMask({
|
|
103
|
+
...maskNumber,
|
|
104
|
+
prefix: 'R$ ',
|
|
105
|
+
allowNegative: true
|
|
106
|
+
})
|
|
107
|
+
},
|
|
108
|
+
data: {
|
|
109
|
+
text: '00/00/0000',
|
|
110
|
+
textMask: [/[0-3]/, /[0-9]/, '/', /[0-1]/, /[0-9]/, '/', /[0-2]/, /[0-9]/, /\d/, /\d/]
|
|
111
|
+
},
|
|
112
|
+
date: {
|
|
113
|
+
text: '00/00/0000',
|
|
114
|
+
textMask: [/[0-1]/, /[0-9]/, '/', /[0-3]/, /[0-9]/, '/', /[0-2]/, /[0-9]/, /\d/, /\d/]
|
|
115
|
+
},
|
|
116
|
+
datetime: {
|
|
117
|
+
text: '00/00/0000 00:00',
|
|
118
|
+
textMask: [/[0-1]/, /[0-9]/, '/', /[0-3]/, /[0-9]/, '/', /[0-2]/, /[0-9]/, /\d/, /\d/, ' ', /\d/, /\d/, ':', /[0-5]/, /\d/]
|
|
119
|
+
},
|
|
120
|
+
datahora: {
|
|
121
|
+
text: '00/00/0000 00:00',
|
|
122
|
+
textMask: [/[0-3]/, /[0-9]/, '/', /[0-1]/, /[0-9]/, '/', /[0-2]/, /[0-9]/, /\d/, /\d/, ' ', /\d/, /\d/, ':', /[0-5]/, /\d/]
|
|
123
|
+
},
|
|
124
|
+
ect: {
|
|
125
|
+
text: '00000000-0',
|
|
126
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/]
|
|
127
|
+
},
|
|
128
|
+
endereco: {
|
|
129
|
+
text: '0000.0000.0000',
|
|
130
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, '.', /[0-2]/, /[0-9]/, /\d/, /\d/]
|
|
131
|
+
},
|
|
132
|
+
iptu: {
|
|
133
|
+
text: '0000.0000.0000',
|
|
134
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, '.', /[0-2]/, /[0-9]/, /\d/, /\d/]
|
|
135
|
+
},
|
|
136
|
+
number: {
|
|
137
|
+
text: '0.000,00',
|
|
138
|
+
textMask: createNumberMask(maskNumber)
|
|
139
|
+
},
|
|
140
|
+
porcentagem: {
|
|
141
|
+
text: '00,00%',
|
|
142
|
+
textMask: createNumberMask({
|
|
143
|
+
...maskNumber,
|
|
144
|
+
suffix: '%'
|
|
145
|
+
})
|
|
146
|
+
},
|
|
147
|
+
pispasep: {
|
|
148
|
+
text: '000.00000.00-0',
|
|
149
|
+
textMask: [/\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, '-', /\d/]
|
|
150
|
+
},
|
|
151
|
+
placa: {
|
|
152
|
+
text: 'AAA-0000',
|
|
153
|
+
textMask: [/[A-S]/, /[A-Z]/, /[A-Z]/, '-', /\d/, /\d/, /\d/, /\d/]
|
|
154
|
+
},
|
|
155
|
+
processo: {
|
|
156
|
+
text: '0000000-00.0000.AAA.0000',
|
|
157
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, '.', /[A-Za-z]/, /[A-Za-z]/, /[A-Za-z]/, '.', /\d/, /\d/, /\d/, /\d/]
|
|
158
|
+
},
|
|
159
|
+
renavam: {
|
|
160
|
+
text: '0000000000-00',
|
|
161
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/],
|
|
162
|
+
textMaskFunction: function mask(userInput) {
|
|
163
|
+
const numbers = userInput.match(/\d/g);
|
|
164
|
+
let numberLength = 0;
|
|
165
|
+
if (numbers) {
|
|
166
|
+
numberLength = numbers.join('').length;
|
|
167
|
+
}
|
|
168
|
+
if (!userInput || numberLength < 9) {
|
|
169
|
+
return [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/];
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
return [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
rg: {
|
|
177
|
+
text: 'AA-00.000.000',
|
|
178
|
+
textMask: [/[A-Za-z]/, /[A-Za-z]/, '-', /\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/]
|
|
179
|
+
},
|
|
180
|
+
sped: {
|
|
181
|
+
text: '0000.0000.0000',
|
|
182
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, '.', /[0-2]/, /[0-9]/, /\d/, /\d/]
|
|
183
|
+
},
|
|
184
|
+
telefone: {
|
|
185
|
+
text: '(00) 00000-0000',
|
|
186
|
+
textMask: ['(', /[1-9]/, /\d/, ')', ' ', /[1-9]/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/],
|
|
187
|
+
textMaskFunction: function mask(userInput) {
|
|
188
|
+
const numbers = userInput.match(/\d/g);
|
|
189
|
+
let numberLength = 0;
|
|
190
|
+
if (numbers) {
|
|
191
|
+
numberLength = numbers.join('').length;
|
|
192
|
+
}
|
|
193
|
+
if (!userInput || numberLength > 10) {
|
|
194
|
+
return ['(', /[1-9]/, /\d/, ')', ' ', /[1-9]/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/];
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
return ['(', /[1-9]/, /\d/, ')', ' ', /[1-9]/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
time: {
|
|
202
|
+
text: '00:00',
|
|
203
|
+
textMask: [/\d/, /\d/, ':', /[0-5]/, /\d/]
|
|
204
|
+
},
|
|
205
|
+
titulo: {
|
|
206
|
+
text: '0000.0000.0000',
|
|
207
|
+
textMask: [/\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, '.', /[0-2]/, /[0-9]/, /\d/, /\d/]
|
|
208
|
+
},
|
|
209
|
+
utils: {
|
|
210
|
+
numberToString: (n) => {
|
|
211
|
+
if (!n || typeof n === 'string') {
|
|
212
|
+
return n;
|
|
213
|
+
}
|
|
214
|
+
return (n.toString()).replace('.', ',');
|
|
215
|
+
},
|
|
216
|
+
textMask: false
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
const makeGeneric = (key) => {
|
|
220
|
+
return (value) => {
|
|
221
|
+
if (!value) {
|
|
222
|
+
return '';
|
|
223
|
+
}
|
|
224
|
+
let mask = MASKS[key].textMask;
|
|
225
|
+
let textMaskFunction = MASKS[key].textMaskFunction;
|
|
226
|
+
if (typeof textMaskFunction === 'function') {
|
|
227
|
+
mask = textMaskFunction(value);
|
|
228
|
+
}
|
|
229
|
+
return conformToMask(value, mask, { guide: false }).conformedValue;
|
|
230
|
+
};
|
|
231
|
+
};
|
|
232
|
+
export const maskBr = {
|
|
233
|
+
aih: makeGeneric('aih'),
|
|
234
|
+
celular: makeGeneric('celular'),
|
|
235
|
+
cep: makeGeneric('cep'),
|
|
236
|
+
certidao: makeGeneric('certidao'),
|
|
237
|
+
chassi: makeGeneric('chassi'),
|
|
238
|
+
cnae: makeGeneric('cnae'),
|
|
239
|
+
cnh: makeGeneric('cnh'),
|
|
240
|
+
renachseguranca: makeGeneric('renachseguranca'),
|
|
241
|
+
renachestadual: makeGeneric('renachestadual'),
|
|
242
|
+
cnhespelho: makeGeneric('cnhespelho'),
|
|
243
|
+
cnpj: makeGeneric('cnpj'),
|
|
244
|
+
cns: makeGeneric('cns'),
|
|
245
|
+
contabanco: makeGeneric('contabanco'),
|
|
246
|
+
cpf: makeGeneric('cpf'),
|
|
247
|
+
cpfcnpj: makeGeneric('cpfcnpj'),
|
|
248
|
+
cartaocredito: makeGeneric('cartaocredito'),
|
|
249
|
+
currency: (currencyValueInput, decimalsFormat = 2) => {
|
|
250
|
+
return formatNumber(MASKS['currency'], currencyValueInput, decimalsFormat);
|
|
251
|
+
},
|
|
252
|
+
data: makeGeneric('data'),
|
|
253
|
+
date: makeGeneric('date'),
|
|
254
|
+
datetime: makeGeneric('datetime'),
|
|
255
|
+
datahora: makeGeneric('datahora'),
|
|
256
|
+
ect: makeGeneric('ect'),
|
|
257
|
+
endereco: makeGeneric('endereco'),
|
|
258
|
+
inscricaoestadual: (inscricaoestadualValue, estado) => {
|
|
259
|
+
const ie = MASKSIE;
|
|
260
|
+
const ieState = ie[estado];
|
|
261
|
+
if (!inscricaoestadualValue || !estado || !ieState ||
|
|
262
|
+
!ieState.textMask) {
|
|
263
|
+
return '';
|
|
264
|
+
}
|
|
265
|
+
let mask = ieState.textMask;
|
|
266
|
+
let textMaskFunction = ieState.textMaskFunction;
|
|
267
|
+
if (typeof textMaskFunction === 'function') {
|
|
268
|
+
mask = textMaskFunction(inscricaoestadualValue);
|
|
269
|
+
}
|
|
270
|
+
return conformToMask(inscricaoestadualValue, mask, { guide: false }).conformedValue;
|
|
271
|
+
},
|
|
272
|
+
iptu: (iptuValue, estado, cidade) => {
|
|
273
|
+
const mask = mask_iptu(iptuValue, estado, cidade);
|
|
274
|
+
if (!mask || typeof mask === 'string') {
|
|
275
|
+
return '';
|
|
276
|
+
}
|
|
277
|
+
return conformToMask(iptuValue, mask.textMask, { guide: false }).conformedValue;
|
|
278
|
+
},
|
|
279
|
+
number: (numberValue, decimalsFormat = 2) => {
|
|
280
|
+
return formatNumber(MASKS['number'], numberValue, decimalsFormat);
|
|
281
|
+
},
|
|
282
|
+
porcentagem: (porcentagemValue, decimalsFormat = 2) => {
|
|
283
|
+
return formatNumber(MASKS['porcentagem'], porcentagemValue, decimalsFormat);
|
|
284
|
+
},
|
|
285
|
+
pispasep: makeGeneric('pispasep'),
|
|
286
|
+
placa: makeGeneric('placa'),
|
|
287
|
+
processo: makeGeneric('processo'),
|
|
288
|
+
renavam: makeGeneric('renavam'),
|
|
289
|
+
rg: makeGeneric('rg'),
|
|
290
|
+
sped: makeGeneric('sped'),
|
|
291
|
+
telefone: makeGeneric('telefone'),
|
|
292
|
+
time: (value) => {
|
|
293
|
+
if (value instanceof Date) {
|
|
294
|
+
value = value.toTimeString().split(' ')[0];
|
|
295
|
+
}
|
|
296
|
+
return makeGeneric('time')(value);
|
|
297
|
+
},
|
|
298
|
+
titulo: makeGeneric('titulo')
|
|
299
|
+
};
|
|
300
|
+
/**
|
|
301
|
+
* FROM TEXT-MASK
|
|
302
|
+
*/
|
|
303
|
+
export const placeholderChar = '_';
|
|
304
|
+
export const strFunction = 'function';
|
|
305
|
+
const defaultPlaceholderChar = placeholderChar;
|
|
306
|
+
const emptyArray = [];
|
|
307
|
+
const emptyString = '';
|
|
308
|
+
export function conformToMask(inputValue = emptyString, mask = emptyArray, config = {}) {
|
|
309
|
+
let rawValue = inputValue.toString();
|
|
310
|
+
if (typeof inputValue === 'number') {
|
|
311
|
+
rawValue = inputValue.toString();
|
|
312
|
+
}
|
|
313
|
+
if (inputValue instanceof Date) {
|
|
314
|
+
rawValue = inputValue.toLocaleString("pt-br");
|
|
315
|
+
}
|
|
316
|
+
if (!isArray(mask)) {
|
|
317
|
+
// If someone passes a function as the mask property, we should call the
|
|
318
|
+
// function to get the mask array - Normally this is handled by the
|
|
319
|
+
// `createTextMaskInputElement:update` function - this allows mask functions
|
|
320
|
+
// to be used directly with `conformToMask`
|
|
321
|
+
if (typeof mask === strFunction) {
|
|
322
|
+
// call the mask function to get the mask array
|
|
323
|
+
mask = mask(inputValue, config);
|
|
324
|
+
// mask functions can setup caret traps to have some control over how the caret moves. We need to process
|
|
325
|
+
// the mask for any caret traps. `processCaretTraps` will remove the caret traps from the mask
|
|
326
|
+
mask = processCaretTraps(mask).maskWithoutCaretTraps;
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
throw new Error('Text-mask:conformToMask; The mask property must be an array.');
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// These configurations tell us how to conform the mask
|
|
333
|
+
const guide = config.guide || true;
|
|
334
|
+
const previousConformedValue = config.previousConformedValue || emptyString;
|
|
335
|
+
const placeholder = convertMaskToPlaceholder(mask, placeholderChar);
|
|
336
|
+
const currentCaretPosition = config.currentCaretPosition;
|
|
337
|
+
const keepCharPositions = config.keepCharPositions;
|
|
338
|
+
// The configs below indicate that the user wants the algorithm to work in *no guide* mode
|
|
339
|
+
const suppressGuide = guide === false && previousConformedValue !== undefined;
|
|
340
|
+
// Calculate lengths once for performance
|
|
341
|
+
const rawValueLength = rawValue.length;
|
|
342
|
+
const previousConformedValueLength = previousConformedValue.length;
|
|
343
|
+
const placeholderLength = placeholder.length;
|
|
344
|
+
const maskLength = mask.length;
|
|
345
|
+
// This tells us the number of edited characters and the direction in which they were edited (+/-)
|
|
346
|
+
const editDistance = rawValueLength - previousConformedValueLength;
|
|
347
|
+
// In *no guide* mode, we need to know if the user is trying to add a character or not
|
|
348
|
+
const isAddition = editDistance > 0;
|
|
349
|
+
// Tells us the index of the first change. For (438) 394-4938 to (38) 394-4938, that would be 1
|
|
350
|
+
const indexOfFirstChange = currentCaretPosition + (isAddition ? -editDistance : 0);
|
|
351
|
+
// We're also gonna need the index of last change, which we can derive as follows...
|
|
352
|
+
const indexOfLastChange = indexOfFirstChange + Math.abs(editDistance);
|
|
353
|
+
// If `conformToMask` is configured to keep character positions, that is, for mask 111, previous value
|
|
354
|
+
// _2_ and raw value 3_2_, the new conformed value should be 32_, not 3_2 (default behavior). That's in the case of
|
|
355
|
+
// addition. And in the case of deletion, previous value _23, raw value _3, the new conformed string should be
|
|
356
|
+
// __3, not _3_ (default behavior)
|
|
357
|
+
//
|
|
358
|
+
// The next block of logic handles keeping character positions for the case of deletion. (Keeping
|
|
359
|
+
// character positions for the case of addition is further down since it is handled differently.)
|
|
360
|
+
// To do this, we want to compensate for all characters that were deleted
|
|
361
|
+
if (keepCharPositions === true && !isAddition) {
|
|
362
|
+
// We will be storing the new placeholder characters in this variable.
|
|
363
|
+
let compensatingPlaceholderChars = emptyString;
|
|
364
|
+
// For every character that was deleted from a placeholder position, we add a placeholder char
|
|
365
|
+
for (let i = indexOfFirstChange; i < indexOfLastChange; i++) {
|
|
366
|
+
if (placeholder[i] === placeholderChar) {
|
|
367
|
+
compensatingPlaceholderChars += placeholderChar;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// Now we trick our algorithm by modifying the raw value to make it contain additional placeholder characters
|
|
371
|
+
// That way when the we start laying the characters again on the mask, it will keep the non-deleted characters
|
|
372
|
+
// in their positions.
|
|
373
|
+
rawValue = (rawValue.slice(0, indexOfFirstChange) +
|
|
374
|
+
compensatingPlaceholderChars +
|
|
375
|
+
rawValue.slice(indexOfFirstChange, rawValueLength));
|
|
376
|
+
}
|
|
377
|
+
// Convert `rawValue` string to an array, and mark characters based on whether they are newly added or have
|
|
378
|
+
// existed in the previous conformed value. Identifying new and old characters is needed for `conformToMask`
|
|
379
|
+
// to work if it is configured to keep character positions.
|
|
380
|
+
const rawValueArr = rawValue
|
|
381
|
+
.split(emptyString)
|
|
382
|
+
.map((char, i) => ({ char, isNew: i >= indexOfFirstChange && i < indexOfLastChange }));
|
|
383
|
+
// The loop below removes masking characters from user input. For example, for mask
|
|
384
|
+
// `00 (111)`, the placeholder would be `00 (___)`. If user input is `00 (234)`, the loop below
|
|
385
|
+
// would remove all characters but `234` from the `rawValueArr`. The rest of the algorithm
|
|
386
|
+
// then would lay `234` on top of the available placeholder positions in the mask.
|
|
387
|
+
for (let i = rawValueLength - 1; i >= 0; i--) {
|
|
388
|
+
const { char } = rawValueArr[i];
|
|
389
|
+
if (char !== placeholderChar) {
|
|
390
|
+
const shouldOffset = i >= indexOfFirstChange && previousConformedValueLength === maskLength;
|
|
391
|
+
if (char === placeholder[(shouldOffset) ? i - editDistance : i]) {
|
|
392
|
+
rawValueArr.splice(i, 1);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// This is the variable that we will be filling with characters as we figure them out
|
|
397
|
+
// in the algorithm below
|
|
398
|
+
let conformedValue = emptyString;
|
|
399
|
+
let someCharsRejected = false;
|
|
400
|
+
// Ok, so first we loop through the placeholder looking for placeholder characters to fill up.
|
|
401
|
+
placeholderLoop: for (let i = 0; i < placeholderLength; i++) {
|
|
402
|
+
const charInPlaceholder = placeholder[i];
|
|
403
|
+
// We see one. Let's find out what we can put in it.
|
|
404
|
+
if (charInPlaceholder === placeholderChar) {
|
|
405
|
+
// But before that, do we actually have any user characters that need a place?
|
|
406
|
+
if (rawValueArr.length > 0) {
|
|
407
|
+
// We will keep chipping away at user input until either we run out of characters
|
|
408
|
+
// or we find at least one character that we can map.
|
|
409
|
+
while (rawValueArr.length > 0) {
|
|
410
|
+
// Let's retrieve the first user character in the queue of characters we have left
|
|
411
|
+
const shift = rawValueArr.shift();
|
|
412
|
+
let rawValueChar = '', isNew = false;
|
|
413
|
+
if (shift) {
|
|
414
|
+
rawValueChar = shift.char;
|
|
415
|
+
isNew = shift.isNew;
|
|
416
|
+
}
|
|
417
|
+
// If the character we got from the user input is a placeholder character (which happens
|
|
418
|
+
// regularly because user input could be something like (540) 90_-____, which includes
|
|
419
|
+
// a bunch of `_` which are placeholder characters) and we are not in *no guide* mode,
|
|
420
|
+
// then we map this placeholder character to the current spot in the placeholder
|
|
421
|
+
if (rawValueChar === placeholderChar && suppressGuide !== true) {
|
|
422
|
+
conformedValue += placeholderChar;
|
|
423
|
+
// And we go to find the next placeholder character that needs filling
|
|
424
|
+
continue placeholderLoop;
|
|
425
|
+
// Else if, the character we got from the user input is not a placeholder, let's see
|
|
426
|
+
// if the current position in the mask can accept it.
|
|
427
|
+
}
|
|
428
|
+
else if (mask[i].test(rawValueChar)) {
|
|
429
|
+
// we map the character differently based on whether we are keeping character positions or not.
|
|
430
|
+
// If any of the conditions below are met, we simply map the raw value character to the
|
|
431
|
+
// placeholder position.
|
|
432
|
+
if (keepCharPositions !== true ||
|
|
433
|
+
isNew === false ||
|
|
434
|
+
previousConformedValue === emptyString ||
|
|
435
|
+
guide === false ||
|
|
436
|
+
!isAddition) {
|
|
437
|
+
conformedValue += rawValueChar;
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
// We enter this block of code if we are trying to keep character positions and none of the conditions
|
|
441
|
+
// above is met. In this case, we need to see if there's an available spot for the raw value character
|
|
442
|
+
// to be mapped to. If we couldn't find a spot, we will discard the character.
|
|
443
|
+
//
|
|
444
|
+
// For example, for mask `1111`, previous conformed value `_2__`, raw value `942_2__`. We can map the
|
|
445
|
+
// `9`, to the first available placeholder position, but then, there are no more spots available for the
|
|
446
|
+
// `4` and `2`. So, we discard them and end up with a conformed value of `92__`.
|
|
447
|
+
const rawValueArrLength = rawValueArr.length;
|
|
448
|
+
let indexOfNextAvailablePlaceholderChar = null;
|
|
449
|
+
// Let's loop through the remaining raw value characters. We are looking for either a suitable spot, ie,
|
|
450
|
+
// a placeholder character or a non-suitable spot, ie, a non-placeholder character that is not new.
|
|
451
|
+
// If we see a suitable spot first, we store its position and exit the loop. If we see a non-suitable
|
|
452
|
+
// spot first, we exit the loop and our `indexOfNextAvailablePlaceholderChar` will stay as `null`.
|
|
453
|
+
for (let i = 0; i < rawValueArrLength; i++) {
|
|
454
|
+
const charData = rawValueArr[i];
|
|
455
|
+
if (charData.char !== placeholderChar && charData.isNew === false) {
|
|
456
|
+
break;
|
|
457
|
+
}
|
|
458
|
+
if (charData.char === placeholderChar) {
|
|
459
|
+
indexOfNextAvailablePlaceholderChar = i;
|
|
460
|
+
break;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
// If `indexOfNextAvailablePlaceholderChar` is not `null`, that means the character is not blocked.
|
|
464
|
+
// We can map it. And to keep the character positions, we remove the placeholder character
|
|
465
|
+
// from the remaining characters
|
|
466
|
+
if (indexOfNextAvailablePlaceholderChar !== null) {
|
|
467
|
+
conformedValue += rawValueChar;
|
|
468
|
+
rawValueArr.splice(indexOfNextAvailablePlaceholderChar, 1);
|
|
469
|
+
// If `indexOfNextAvailablePlaceholderChar` is `null`, that means the character is blocked. We have to
|
|
470
|
+
// discard it.
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
i--;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
// Since we've mapped this placeholder position. We move on to the next one.
|
|
477
|
+
continue placeholderLoop;
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
someCharsRejected = true;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
// We reach this point when we've mapped all the user input characters to placeholder
|
|
485
|
+
// positions in the mask. In *guide* mode, we append the left over characters in the
|
|
486
|
+
// placeholder to the `conformedString`, but in *no guide* mode, we don't wanna do that.
|
|
487
|
+
//
|
|
488
|
+
// That is, for mask `(111)` and user input `2`, we want to return `(2`, not `(2__)`.
|
|
489
|
+
if (suppressGuide === false) {
|
|
490
|
+
conformedValue += placeholder.substr(i, placeholderLength);
|
|
491
|
+
}
|
|
492
|
+
// And we break
|
|
493
|
+
break;
|
|
494
|
+
// Else, the charInPlaceholder is not a placeholderChar. That is, we cannot fill it
|
|
495
|
+
// with user input. So we just map it to the final output
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
conformedValue += charInPlaceholder;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// The following logic is needed to deal with the case of deletion in *no guide* mode.
|
|
502
|
+
//
|
|
503
|
+
// Consider the silly mask `(111) /// 1`. What if user tries to delete the last placeholder
|
|
504
|
+
// position? Something like `(589) /// `. We want to conform that to `(589`. Not `(589) /// `.
|
|
505
|
+
// That's why the logic below finds the last filled placeholder character, and removes everything
|
|
506
|
+
// from that point on.
|
|
507
|
+
if (suppressGuide && isAddition === false) {
|
|
508
|
+
let indexOfLastFilledPlaceholderChar = null;
|
|
509
|
+
// Find the last filled placeholder position and substring from there
|
|
510
|
+
for (let i = 0; i < conformedValue.length; i++) {
|
|
511
|
+
if (placeholder[i] === placeholderChar) {
|
|
512
|
+
indexOfLastFilledPlaceholderChar = i;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
if (indexOfLastFilledPlaceholderChar !== null) {
|
|
516
|
+
// We substring from the beginning until the position after the last filled placeholder char.
|
|
517
|
+
conformedValue = conformedValue.substr(0, indexOfLastFilledPlaceholderChar + 1);
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
// If we couldn't find `indexOfLastFilledPlaceholderChar` that means the user deleted
|
|
521
|
+
// the first character in the mask. So we return an empty string.
|
|
522
|
+
conformedValue = emptyString;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
return { conformedValue, meta: { someCharsRejected } };
|
|
526
|
+
}
|
|
527
|
+
export function convertMaskToPlaceholder(mask = emptyArray, placeholderChar = defaultPlaceholderChar) {
|
|
528
|
+
if (!isArray(mask)) {
|
|
529
|
+
throw new Error('Text-mask:convertMaskToPlaceholder; The mask property must be an array.');
|
|
530
|
+
}
|
|
531
|
+
if (mask.indexOf(placeholderChar) !== -1) {
|
|
532
|
+
throw new Error('Placeholder character must not be used as part of the mask. Please specify a character ' +
|
|
533
|
+
'that is not present in your mask as your placeholder character.\n\n' +
|
|
534
|
+
`The placeholder character that was received is: ${JSON.stringify(placeholderChar)}\n\n` +
|
|
535
|
+
`The mask that was received is: ${JSON.stringify(mask)}`);
|
|
536
|
+
}
|
|
537
|
+
return mask.map((char) => {
|
|
538
|
+
return (char instanceof RegExp) ? placeholderChar : char;
|
|
539
|
+
}).join('');
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Due to a bug on textmask, the requireDecimal its not working, so this function solves this problem
|
|
543
|
+
* @param maskType
|
|
544
|
+
* @param numberValue
|
|
545
|
+
* @param decimalsFormat
|
|
546
|
+
* @returns
|
|
547
|
+
*/
|
|
548
|
+
function formatNumber(maskType, numberValue, decimalsFormat = 2) {
|
|
549
|
+
if (!numberValue && numberValue !== 0) {
|
|
550
|
+
return '';
|
|
551
|
+
}
|
|
552
|
+
if (!numberValue.split) {
|
|
553
|
+
numberValue += '';
|
|
554
|
+
numberValue = numberValue.replace('.', ',');
|
|
555
|
+
}
|
|
556
|
+
const vals = numberValue.split(',');
|
|
557
|
+
if (!maskType.textMask || typeof maskType.textMask !== 'function') {
|
|
558
|
+
return '';
|
|
559
|
+
}
|
|
560
|
+
const mask = maskType.textMask(vals[0]);
|
|
561
|
+
let decimals = '';
|
|
562
|
+
if (decimalsFormat == undefined) {
|
|
563
|
+
decimals = vals.length > 1 ? ',' + vals[1] : '';
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
decimals = vals.length > 1 ? (vals[1] < 10 ? vals[1].toString() + '0' : vals[1].toString()) : '00';
|
|
567
|
+
if (decimals.length > decimalsFormat) {
|
|
568
|
+
decimals = decimals.substring(0, decimalsFormat);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
let conformedValue = conformToMask(numberValue, mask, { guide: false }).conformedValue;
|
|
572
|
+
let suffix = '';
|
|
573
|
+
if (conformedValue.indexOf('%') >= 0) {
|
|
574
|
+
conformedValue = conformedValue.replace('%', '');
|
|
575
|
+
suffix = '%';
|
|
576
|
+
}
|
|
577
|
+
return conformedValue + (decimalsFormat > 0 ? ',' + decimals : '') + suffix;
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hcGEtbGlicmFyeS11aS9zcmMvbGliL2NvcmUvanMtYnJhc2lsL3NyYy9tYXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sZ0JBQWdCLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNuQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsTUFBTSxVQUFVLEdBQVE7SUFDdEIsWUFBWSxFQUFFLENBQUM7SUFDZix3QkFBd0IsRUFBRSxHQUFHO0lBQzdCLGFBQWEsRUFBRSxHQUFHO0lBQ2xCLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFlBQVksRUFBRSxFQUFFO0lBQ2hCLE1BQU0sRUFBRSxFQUFFO0lBQ1YsTUFBTSxFQUFFLEVBQUU7Q0FDWCxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUF3QjtJQUN4QyxHQUFHLEVBQUU7UUFDSCxJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7S0FDOUY7SUFDRCxhQUFhLEVBQUU7UUFDYixJQUFJLEVBQUUsK0JBQStCO1FBQ3JDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUs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QUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsY0FBYyxFQUFFO1lBQ3BDLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUNsRDtLQUNGO0lBRUQsSUFBSSxjQUFjLEdBQUcsYUFBYSxDQUNoQyxXQUFXLEVBQ1gsSUFBSSxFQUNKLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUNqQixDQUFDLGNBQWMsQ0FBQTtJQUdoQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUE7SUFDZixJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3BDLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNoRCxNQUFNLEdBQUcsR0FBRyxDQUFBO0tBQ2I7SUFDRCxPQUFPLGNBQWMsR0FBRyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBcnJheSwgcHJvY2Vzc0NhcmV0VHJhcHMgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEJpZ09iamVjdCwgTWFza1R5cGUgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuZXhwb3J0IHsgTUFTS1NJRSB9IGZyb20gJy4vaW5zY3JpY2FvZXN0YWR1YWwnO1xuaW1wb3J0IGNyZWF0ZU51bWJlck1hc2sgZnJvbSAnLi9jcmVhdGVOdW1iZXJNYXNrJztcbmltcG9ydCB7IG1hc2tfaXB0dSB9IGZyb20gJy4vaXB0dSc7XG5pbXBvcnQgeyBNQVNLU0lFIH0gZnJvbSAnLi9pbnNjcmljYW9lc3RhZHVhbCc7XG5cbmNvbnN0IG1hc2tOdW1iZXI6IGFueSA9IHtcbiAgZGVjaW1hbExpbWl0OiAyLFxuICB0aG91c2FuZHNTZXBhcmF0b3JTeW1ib2w6ICcuJyxcbiAgZGVjaW1hbFN5bWJvbDogJywnLFxuICBhbGxvd0RlY2ltYWw6IHRydWUsXG4gIGludGVnZXJMaW1pdDogMTcsXG4gIHByZWZpeDogJycsXG4gIHN1ZmZpeDogJydcbn1cblxuZXhwb3J0IGNvbnN0IE1BU0tTOiBCaWdPYmplY3Q8TWFza1R5cGU+ID0ge1xuICBhaWg6IHtcbiAgICB0ZXh0OiAnMDAwMDAwMDAwMDAwLTAnLCAvLyAzNTE5MjM0MTQzMTItOFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkL11cbiAgfSxcbiAgY2FydGFvY3JlZGl0bzoge1xuICAgIHRleHQ6ICcwMDAwIDAwMDAgMDAwMCAwMDAwIDAwLzAwIDAwMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJyAnLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJyAnLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJzAnLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJyAnLCAvXFxkLywgL1xcZC8sICcvJywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIGNlbHVsYXI6IHtcbiAgICB0ZXh0OiAnKDAwKSAwMDAwMC0wMDAwJyxcbiAgICB0ZXh0TWFzazogWycoJywgL1sxLTldLywgL1xcZC8sICcpJywgJyAnLCAvWzUtOV0vLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkL10sXG4gIH0sXG4gIGNlcDoge1xuICAgIHRleHQ6ICcwMC4wMDAtMDAwJyxcbiAgICB0ZXh0TWFzazogWy9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIC8vIGNlcnRpZGFvIENlcnRpZMO1ZXMgZGUgTmFzY2ltZW50bywgQ2FzYW1lbnRvIG91IMOTYml0byBcbiAgY2VydGlkYW86IHtcbiAgICB0ZXh0OiAnMDAwMDAwLjAwLjAwLjAwMDAuMC4wMDAwMC4wMDAuMDAwMDAwMC0wMCcsIC8vIDEwNDUzOS4wMS41NS4yMDEzLjEuMDAwMTIuMDIxLjAwMDAxMjMtMjFcbiAgICB0ZXh0TWFzazogWy9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgJy4nLFxuICAgICAgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLicsXG4gICAgICAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgY2hhc3NpOiB7XG4gICAgdGV4dDogJ0FBQSBBQUFBQUEgQUEgQUEwMDAwJywgLy8gOUJXIFpaWjM3NyBWVCAwMDQyNTFcbiAgICB0ZXh0TWFzazogWy9bMS05XS8sIC9cXHcvLCAvXFx3LywgJyAnLCAvXFx3LywgL1xcdy8sIC9cXHcvLCAvXFx3LywgL1xcdy8sIC9cXHcvLCAnICcsIC9cXHcvLCAvXFx3LywgJyAnLCAvXFx3LywgL1xcdy8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBjaWQ6IHtcbiAgICB0ZXh0TWFzazogZmFsc2VcbiAgfSxcbiAgY25hZToge1xuICAgIHRleHQ6ICcwMDAwLTAvMDAnLCAvLyA2ODIxLTgvMDFcbiAgICB0ZXh0TWFzazogWy9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAnLycsIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgY25oOiB7XG4gICAgdGV4dDogJzAwMDAwMDAwMC0wMCcsIC8vIDEyMzQ1Njc4OS0xXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgcmVuYWNoc2VndXJhbmNhOiB7XG4gICAgdGV4dDogJzAwMDAwMDAwMDAwJywgLy8gNTE0NzQ1NDY4NTRcbiAgICB0ZXh0TWFzazogWy9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgcmVuYWNoZXN0YWR1YWw6IHtcbiAgICB0ZXh0OiAnQUEwMDAwMDAwMDAnLCAvLyBNRzU5NzgxMjU2MFxuICAgIHRleHRNYXNrOiBbL1tBLVNdLywgL1tBLVpdLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgY25oZXNwZWxobzoge1xuICAgIHRleHQ6ICcwMDAwMDAwMDAwJywgLy8gMTIzNDU2Nzg5LTFcbiAgICB0ZXh0TWFzazogWy9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBjbnBqOiB7XG4gICAgdGV4dDogJzAwLjAwMC4wMDAvMDAwMC0wMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLycsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgY25zOiB7XG4gICAgdGV4dDogJzAwMCAwMDAwIDAwMDAgMDAtMDAnLFxuICAgIHRleHRNYXNrOiBbL1sxfDJ8N3w4fDldLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIGNvbnRhYmFuY286IHtcbiAgICB0ZXh0OiAnMDAwIDAwMDAwLTAgMDAwMDAtMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLFxuICAgICAgL1xcZC8sICcgJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvXVxuICB9LFxuICBjcGY6IHtcbiAgICB0ZXh0OiAnMDAwLjAwMC4wMDAtMDAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sICctJywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBjcGZjbnBqOiB7XG4gICAgdGV4dDogJzAwLjAwMC4wMDAvMDAwMC0wMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLycsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkL10sXG4gICAgdGV4dE1hc2tGdW5jdGlvbjogZnVuY3Rpb24gbWFzayh1c2VySW5wdXQ6IGFueSkge1xuICAgICAgY29uc3QgbnVtYmVycyA9IHVzZXJJbnB1dC5tYXRjaCgvXFxkL2cpO1xuICAgICAgbGV0IG51bWJlckxlbmd0aCA9IDA7XG4gICAgICBpZiAobnVtYmVycykge1xuICAgICAgICBudW1iZXJMZW5ndGggPSBudW1iZXJzLmpvaW4oJycpLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmICghdXNlcklucHV0IHx8IG51bWJlckxlbmd0aCA+IDEyKSB7XG4gICAgICAgIHJldHVybiBbL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy8nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkLywgL1xcZC9dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsvXFxkLywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkLywgL1xcZC9dO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgY3VycmVuY3k6IHtcbiAgICB0ZXh0OiAnMC4wMDAsMDAnLFxuICAgIHRleHRNYXNrOiBjcmVhdGVOdW1iZXJNYXNrKHtcbiAgICAgIC4uLm1hc2tOdW1iZXIsXG4gICAgICBwcmVmaXg6ICdSJCAnLFxuICAgICAgYWxsb3dOZWdhdGl2ZTogdHJ1ZVxuICAgIH0pXG4gIH0sXG4gIGRhdGE6IHtcbiAgICB0ZXh0OiAnMDAvMDAvMDAwMCcsXG4gICAgdGV4dE1hc2s6IFsvWzAtM10vLCAvWzAtOV0vLCAnLycsIC9bMC0xXS8sIC9bMC05XS8sICcvJywgL1swLTJdLywgL1swLTldLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBkYXRlOiB7XG4gICAgdGV4dDogJzAwLzAwLzAwMDAnLFxuICAgIHRleHRNYXNrOiBbL1swLTFdLywgL1swLTldLywgJy8nLCAvWzAtM10vLCAvWzAtOV0vLCAnLycsIC9bMC0yXS8sIC9bMC05XS8sIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgZGF0ZXRpbWU6IHtcbiAgICB0ZXh0OiAnMDAvMDAvMDAwMCAwMDowMCcsXG4gICAgdGV4dE1hc2s6IFsvWzAtMV0vLCAvWzAtOV0vLCAnLycsIC9bMC0zXS8sIC9bMC05XS8sICcvJywgL1swLTJdLywgL1swLTldLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgJzonLCAvWzAtNV0vLCAvXFxkL11cbiAgfSxcbiAgZGF0YWhvcmE6IHtcbiAgICB0ZXh0OiAnMDAvMDAvMDAwMCAwMDowMCcsXG4gICAgdGV4dE1hc2s6IFsvWzAtM10vLCAvWzAtOV0vLCAnLycsIC9bMC0xXS8sIC9bMC05XS8sICcvJywgL1swLTJdLywgL1swLTldLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgJzonLCAvWzAtNV0vLCAvXFxkL11cbiAgfSxcbiAgZWN0OiB7XG4gICAgdGV4dDogJzAwMDAwMDAwLTAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvXVxuICB9LFxuICBlbmRlcmVjbzoge1xuICAgIHRleHQ6ICcwMDAwLjAwMDAuMDAwMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvWzAtMl0vLCAvWzAtOV0vLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIGlwdHU6IHtcbiAgICB0ZXh0OiAnMDAwMC4wMDAwLjAwMDAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1swLTJdLywgL1swLTldLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBudW1iZXI6IHtcbiAgICB0ZXh0OiAnMC4wMDAsMDAnLFxuICAgIHRleHRNYXNrOiBjcmVhdGVOdW1iZXJNYXNrKG1hc2tOdW1iZXIpXG4gIH0sXG4gIHBvcmNlbnRhZ2VtOiB7XG4gICAgdGV4dDogJzAwLDAwJScsXG4gICAgdGV4dE1hc2s6IGNyZWF0ZU51bWJlck1hc2soe1xuICAgICAgLi4ubWFza051bWJlcixcbiAgICAgIHN1ZmZpeDogJyUnXG4gICAgfSlcbiAgfSxcbiAgcGlzcGFzZXA6IHtcbiAgICB0ZXh0OiAnMDAwLjAwMDAwLjAwLTAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvXVxuICB9LFxuICBwbGFjYToge1xuICAgIHRleHQ6ICdBQUEtMDAwMCcsXG4gICAgdGV4dE1hc2s6IFsvW0EtU10vLCAvW0EtWl0vLCAvW0EtWl0vLCAnLScsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBwcm9jZXNzbzoge1xuICAgIHRleHQ6ICcwMDAwMDAwLTAwLjAwMDAuQUFBLjAwMDAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICctJywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLicsIC9bQS1aYS16XS8sIC9bQS1aYS16XS8sIC9bQS1aYS16XS8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIHJlbmF2YW06IHtcbiAgICB0ZXh0OiAnMDAwMDAwMDAwMC0wMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkL10sXG4gICAgdGV4dE1hc2tGdW5jdGlvbjogZnVuY3Rpb24gbWFzayh1c2VySW5wdXQ6IGFueSkge1xuICAgICAgY29uc3QgbnVtYmVycyA9IHVzZXJJbnB1dC5tYXRjaCgvXFxkL2cpO1xuICAgICAgbGV0IG51bWJlckxlbmd0aCA9IDA7XG4gICAgICBpZiAobnVtYmVycykge1xuICAgICAgICBudW1iZXJMZW5ndGggPSBudW1iZXJzLmpvaW4oJycpLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmICghdXNlcklucHV0IHx8IG51bWJlckxlbmd0aCA8IDkpIHtcbiAgICAgICAgcmV0dXJuIFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICctJywgL1xcZC9dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkL107XG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZzoge1xuICAgIHRleHQ6ICdBQS0wMC4wMDAuMDAwJyxcbiAgICB0ZXh0TWFzazogWy9bQS1aYS16XS8sIC9bQS1aYS16XS8sICctJywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgc3BlZDoge1xuICAgIHRleHQ6ICcwMDAwLjAwMDAuMDAwMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvWzAtMl0vLCAvWzAtOV0vLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIHRlbGVmb25lOiB7XG4gICAgdGV4dDogJygwMCkgMDAwMDAtMDAwMCcsXG4gICAgdGV4dE1hc2s6IFsnKCcsIC9bMS05XS8sIC9cXGQvLCAnKScsICcgJywgL1sxLTldLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICctJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC9dLFxuICAgIHRleHRNYXNrRnVuY3Rpb246IGZ1bmN0aW9uIG1hc2sodXNlcklucHV0OiBhbnkpIHtcbiAgICAgIGNvbnN0IG51bWJlcnMgPSB1c2VySW5wdXQubWF0Y2goL1xcZC9nKTtcbiAgICAgIGxldCBudW1iZXJMZW5ndGggPSAwO1xuICAgICAgaWYgKG51bWJlcnMpIHtcbiAgICAgICAgbnVtYmVyTGVuZ3RoID0gbnVtYmVycy5qb2luKCcnKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoIXVzZXJJbnB1dCB8fCBudW1iZXJMZW5ndGggPiAxMCkge1xuICAgICAgICByZXR1cm4gWycoJywgL1sxLTldLywgL1xcZC8sICcpJywgJyAnLCAvWzEtOV0vLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkL107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWycoJywgL1sxLTldLywgL1xcZC8sICcpJywgJyAnLCAvWzEtOV0vLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHRpbWU6IHtcbiAgICB0ZXh0OiAnMDA6MDAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAnOicsIC9bMC01XS8sIC9cXGQvXVxuICB9LFxuICB0aXR1bG86IHtcbiAgICB0ZXh0OiAnMDAwMC4wMDAwLjAwMDAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1swLTJdLywgL1swLTldLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICB1dGlsczoge1xuICAgIG51bWJlclRvU3RyaW5nOiAobjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIW4gfHwgdHlwZW9mIG4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChuLnRvU3RyaW5nKCkpLnJlcGxhY2UoJy4nLCAnLCcpO1xuICAgIH0sXG4gICAgdGV4dE1hc2s6IGZhbHNlXG4gIH1cbn1cblxuXG5jb25zdCBtYWtlR2VuZXJpYyA9IChrZXk6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGxldCBtYXNrID0gTUFTS1Nba2V5XS50ZXh0TWFza1xuICAgIGxldCB0ZXh0TWFza0Z1bmN0aW9uID0gTUFTS1Nba2V5XS50ZXh0TWFza0Z1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0ZXh0TWFza0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtYXNrID0gdGV4dE1hc2tGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG5cbiAgICByZXR1cm4gY29uZm9ybVRvTWFzayhcbiAgICAgIHZhbHVlLFxuICAgICAgbWFzayxcbiAgICAgIHsgZ3VpZGU6IGZhbHNlIH1cbiAgICApLmNvbmZvcm1lZFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBtYXNrQnIgPSB7XG4gIGFpaDogbWFrZUdlbmVyaWMoJ2FpaCcpLFxuICBjZWx1bGFyOiBtYWtlR2VuZXJpYygnY2VsdWxhcicpLFxuICBjZXA6IG1ha2VHZW5lcmljKCdjZXAnKSxcbiAgY2VydGlkYW86IG1ha2VHZW5lcmljKCdjZXJ0aWRhbycpLFxuICBjaGFzc2k6IG1ha2VHZW5lcmljKCdjaGFzc2knKSxcbiAgY25hZTogbWFrZUdlbmVyaWMoJ2NuYWUnKSxcbiAgY25oOiBtYWtlR2VuZXJpYygnY25oJyksXG4gIHJlbmFjaHNlZ3VyYW5jYTogbWFrZUdlbmVyaWMoJ3JlbmFjaHNlZ3VyYW5jYScpLFxuICByZW5hY2hlc3RhZHVhbDogbWFrZUdlbmVyaWMoJ3JlbmFjaGVzdGFkdWFsJyksXG4gIGNuaGVzcGVsaG86IG1ha2VHZW5lcmljKCdjbmhlc3BlbGhvJyksXG4gIGNucGo6IG1ha2VHZW5lcmljKCdjbnBqJyksXG4gIGNuczogbWFrZUdlbmVyaWMoJ2NucycpLFxuICBjb250YWJhbmNvOiBtYWtlR2VuZXJpYygnY29udGFiYW5jbycpLFxuICBjcGY6IG1ha2VHZW5lcmljKCdjcGYnKSxcbiAgY3BmY25wajogbWFrZUdlbmVyaWMoJ2NwZmNucGonKSxcbiAgY2FydGFvY3JlZGl0bzogbWFrZUdlbmVyaWMoJ2NhcnRhb2NyZWRpdG8nKSxcbiAgY3VycmVuY3k6IChjdXJyZW5jeVZhbHVlSW5wdXQ6IHN0cmluZyB8IG51bWJlciwgZGVjaW1hbHNGb3JtYXQ6IG51bWJlciA9IDIpID0+IHtcbiAgICByZXR1cm4gZm9ybWF0TnVtYmVyKE1BU0tTWydjdXJyZW5jeSddLCBjdXJyZW5jeVZhbHVlSW5wdXQsIGRlY2ltYWxzRm9ybWF0KTtcbiAgfSxcbiAgZGF0YTogbWFrZUdlbmVyaWMoJ2RhdGEnKSxcbiAgZGF0ZTogbWFrZUdlbmVyaWMoJ2RhdGUnKSxcbiAgZGF0ZXRpbWU6IG1ha2VHZW5lcmljKCdkYXRldGltZScpLFxuICBkYXRhaG9yYTogbWFrZUdlbmVyaWMoJ2RhdGFob3JhJyksXG4gIGVjdDogbWFrZUdlbmVyaWMoJ2VjdCcpLFxuICBlbmRlcmVjbzogbWFrZUdlbmVyaWMoJ2VuZGVyZWNvJyksXG4gIGluc2NyaWNhb2VzdGFkdWFsOiAoaW5zY3JpY2FvZXN0YWR1YWxWYWx1ZTogc3RyaW5nLCBlc3RhZG86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGllID0gTUFTS1NJRTtcbiAgICBjb25zdCBpZVN0YXRlID0gaWVbZXN0YWRvXVxuXG4gICAgaWYgKCFpbnNjcmljYW9lc3RhZHVhbFZhbHVlIHx8ICFlc3RhZG8gfHwgIWllU3RhdGUgfHxcbiAgICAgICFpZVN0YXRlLnRleHRNYXNrKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgbGV0IG1hc2sgPSBpZVN0YXRlLnRleHRNYXNrO1xuICAgIGxldCB0ZXh0TWFza0Z1bmN0aW9uID0gaWVTdGF0ZS50ZXh0TWFza0Z1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0ZXh0TWFza0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtYXNrID0gdGV4dE1hc2tGdW5jdGlvbihpbnNjcmljYW9lc3RhZHVhbFZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZm9ybVRvTWFzayhcbiAgICAgIGluc2NyaWNhb2VzdGFkdWFsVmFsdWUsXG4gICAgICBtYXNrLFxuICAgICAgeyBndWlkZTogZmFsc2UgfVxuICAgICkuY29uZm9ybWVkVmFsdWU7XG4gIH0sXG4gIGlwdHU6IChpcHR1VmFsdWU6IHN0cmluZywgZXN0YWRvOiBzdHJpbmcsIGNpZGFkZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWFzayA9IG1hc2tfaXB0dShpcHR1VmFsdWUsIGVzdGFkbywgY2lkYWRlKTtcbiAgICBpZiAoIW1hc2sgfHwgdHlwZW9mIG1hc2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBjb25mb3JtVG9NYXNrKFxuICAgICAgaXB0dVZhbHVlLFxuICAgICAgbWFzay50ZXh0TWFzayxcbiAgICAgIHsgZ3VpZGU6IGZhbHNlIH1cbiAgICApLmNvbmZvcm1lZFZhbHVlO1xuICB9LFxuICBudW1iZXI6IChudW1iZXJWYWx1ZTogYW55LCBkZWNpbWFsc0Zvcm1hdDogbnVtYmVyID0gMikgPT4ge1xuICAgIHJldHVybiBmb3JtYXROdW1iZXIoTUFTS1NbJ251bWJlciddLCBudW1iZXJWYWx1ZSwgZGVjaW1hbHNGb3JtYXQpO1xuICB9LFxuICBwb3JjZW50YWdlbTogKHBvcmNlbnRhZ2VtVmFsdWU6IHN0cmluZywgZGVjaW1hbHNGb3JtYXQ6IG51bWJlciA9IDIpID0+IHtcbiAgICByZXR1cm4gZm9ybWF0TnVtYmVyKE1BU0tTWydwb3JjZW50YWdlbSddLCBwb3JjZW50YWdlbVZhbHVlLCBkZWNpbWFsc0Zvcm1hdCk7XG4gIH0sXG4gIHBpc3Bhc2VwOiBtYWtlR2VuZXJpYygncGlzcGFzZXAnKSxcbiAgcGxhY2E6IG1ha2VHZW5lcmljKCdwbGFjYScpLFxuICBwcm9jZXNzbzogbWFrZUdlbmVyaWMoJ3Byb2Nlc3NvJyksXG4gIHJlbmF2YW06IG1ha2VHZW5lcmljKCdyZW5hdmFtJyksXG4gIHJnOiBtYWtlR2VuZXJpYygncmcnKSxcbiAgc3BlZDogbWFrZUdlbmVyaWMoJ3NwZWQnKSxcbiAgdGVsZWZvbmU6IG1ha2VHZW5lcmljKCd0ZWxlZm9uZScpLFxuICB0aW1lOiAodmFsdWU6IHN0cmluZyB8IERhdGUpID0+IHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvVGltZVN0cmluZygpLnNwbGl0KCcgJylbMF1cbiAgICB9XG4gICAgcmV0dXJuIG1ha2VHZW5lcmljKCd0aW1lJykodmFsdWUpXG4gIH0sXG4gIHRpdHVsbzogbWFrZUdlbmVyaWMoJ3RpdHVsbycpXG59O1xuXG5cblxuLyoqXG4gKiBGUk9NIFRFWFQtTUFTS1xuICovXG5leHBvcnQgY29uc3QgcGxhY2Vob2xkZXJDaGFyID0gJ18nXG5leHBvcnQgY29uc3Qgc3RyRnVuY3Rpb24gPSAnZnVuY3Rpb24nXG5cbmNvbnN0IGRlZmF1bHRQbGFjZWhvbGRlckNoYXIgPSBwbGFjZWhvbGRlckNoYXI7XG5jb25zdCBlbXB0eUFycmF5OiBhbnkgPSBbXVxuY29uc3QgZW1wdHlTdHJpbmcgPSAnJ1xuXG5leHBvcnQgZnVuY3Rpb24gY29uZm9ybVRvTWFzayhpbnB1dFZhbHVlOiBTdHJpbmcgfCBEYXRlID0gZW1wdHlTdHJpbmcsIG1hc2sgPSBlbXB0eUFycmF5LCBjb25maWc6IGFueSA9IHt9KSB7XG4gIGxldCByYXdWYWx1ZSA9IGlucHV0VmFsdWUudG9TdHJpbmcoKTtcbiAgaWYgKHR5cGVvZiBpbnB1dFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJhd1ZhbHVlID0gKDxudW1iZXI+aW5wdXRWYWx1ZSkudG9TdHJpbmcoKTtcbiAgfVxuICBpZiAoaW5wdXRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByYXdWYWx1ZSA9ICg8RGF0ZT5pbnB1dFZhbHVlKS50b0xvY2FsZVN0cmluZyhcInB0LWJyXCIpXG4gIH1cblxuICBpZiAoIWlzQXJyYXkobWFzaykpIHtcbiAgICAvLyBJZiBzb21lb25lIHBhc3NlcyBhIGZ1bmN0aW9uIGFzIHRoZSBtYXNrIHByb3BlcnR5LCB3ZSBzaG91bGQgY2FsbCB0aGVcbiAgICAvLyBmdW5jdGlvbiB0byBnZXQgdGhlIG1hc2sgYXJyYXkgLSBOb3JtYWxseSB0aGlzIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgLy8gYGNyZWF0ZVRleHRNYXNrSW5wdXRFbGVtZW50OnVwZGF0ZWAgZnVuY3Rpb24gLSB0aGlzIGFsbG93cyBtYXNrIGZ1bmN0aW9uc1xuICAgIC8vIHRvIGJlIHVzZWQgZGlyZWN0bHkgd2l0aCBgY29uZm9ybVRvTWFza2BcblxuICAgIGlmICh0eXBlb2YgbWFzayA9PT0gc3RyRnVuY3Rpb24pIHtcbiAgICAgIC8vIGNhbGwgdGhlIG1hc2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBtYXNrIGFycmF5XG4gICAgICBtYXNrID0gbWFzayhpbnB1dFZhbHVlLCBjb25maWcpXG5cbiAgICAgIC8vIG1hc2sgZnVuY3Rpb25zIGNhbiBzZXR1cCBjYXJldCB0cmFwcyB0byBoYXZlIHNvbWUgY29udHJvbCBvdmVyIGhvdyB0aGUgY2FyZXQgbW92ZXMuIFdlIG5lZWQgdG8gcHJvY2Vzc1xuICAgICAgLy8gdGhlIG1hc2sgZm9yIGFueSBjYXJldCB0cmFwcy4gYHByb2Nlc3NDYXJldFRyYXBzYCB3aWxsIHJlbW92ZSB0aGUgY2FyZXQgdHJhcHMgZnJvbSB0aGUgbWFza1xuICAgICAgbWFzayA9IHByb2Nlc3NDYXJldFRyYXBzKG1hc2spLm1hc2tXaXRob3V0Q2FyZXRUcmFwc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUZXh0LW1hc2s6Y29uZm9ybVRvTWFzazsgVGhlIG1hc2sgcHJvcGVydHkgbXVzdCBiZSBhbiBhcnJheS4nXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLy8gVGhlc2UgY29uZmlndXJhdGlvbnMgdGVsbCB1cyBob3cgdG8gY29uZm9ybSB0aGUgbWFza1xuXG4gIGNvbnN0IGd1aWRlID0gY29uZmlnLmd1aWRlIHx8IHRydWU7XG4gIGNvbnN0IHByZXZpb3VzQ29uZm9ybWVkVmFsdWUgPSBjb25maWcucHJldmlvdXNDb25mb3JtZWRWYWx1ZSB8fCBlbXB0eVN0cmluZztcbiAgY29uc3QgcGxhY2Vob2xkZXIgPSBjb252ZXJ0TWFza1RvUGxhY2Vob2xkZXIobWFzaywgcGxhY2Vob2xkZXJDaGFyKTtcbiAgY29uc3QgY3VycmVudENhcmV0UG9zaXRpb24gPSBjb25maWcuY3VycmVudENhcmV0UG9zaXRpb247XG4gIGNvbnN0IGtlZXBDaGFyUG9zaXRpb25zID0gY29uZmlnLmtlZXBDaGFyUG9zaXRpb25zO1xuXG4gIC8vIFRoZSBjb25maWdzIGJlbG93IGluZGljYXRlIHRoYXQgdGhlIHVzZXIgd2FudHMgdGhlIGFsZ29yaXRobSB0byB3b3JrIGluICpubyBndWlkZSogbW9kZVxuICBjb25zdCBzdXBwcmVzc0d1aWRlID0gZ3VpZGUgPT09IGZhbHNlICYmIHByZXZpb3VzQ29uZm9ybWVkVmFsdWUgIT09IHVuZGVmaW5lZFxuXG4gIC8vIENhbGN1bGF0ZSBsZW5ndGhzIG9uY2UgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IHJhd1ZhbHVlTGVuZ3RoID0gcmF3VmFsdWUubGVuZ3RoXG4gIGNvbnN0IHByZXZpb3VzQ29uZm9ybWVkVmFsdWVMZW5ndGggPSBwcmV2aW91c0NvbmZvcm1lZFZhbHVlLmxlbmd0aFxuICBjb25zdCBwbGFjZWhvbGRlckxlbmd0aCA9IHBsYWNlaG9sZGVyLmxlbmd0aFxuICBjb25zdCBtYXNrTGVuZ3RoID0gbWFzay5sZW5ndGhcblxuICAvLyBUaGlzIHRlbGxzIHVzIHRoZSBudW1iZXIgb2YgZWRpdGVkIGNoYXJhY3RlcnMgYW5kIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhleSB3ZXJlIGVkaXRlZCAoKy8tKVxuICBjb25zdCBlZGl0RGlzdGFuY2UgPSByYXdWYWx1ZUxlbmd0aCAtIHByZXZpb3VzQ29uZm9ybWVkVmFsdWVMZW5ndGhcblxuICAvLyBJbiAqbm8gZ3VpZGUqIG1vZGUsIHdlIG5lZWQgdG8ga25vdyBpZiB0aGUgdXNlciBpcyB0cnlpbmcgdG8gYWRkIGEgY2hhcmFjdGVyIG9yIG5vdFxuICBjb25zdCBpc0FkZGl0aW9uID0gZWRpdERpc3RhbmNlID4gMFxuXG4gIC8vIFRlbGxzIHVzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhbmdlLiBGb3IgKDQzOCkgMzk0LTQ5MzggdG8gKDM4KSAzOTQtNDkzOCwgdGhhdCB3b3VsZCBiZSAxXG4gIGNvbnN0IGluZGV4T2ZGaXJzdENoYW5nZSA9IGN1cnJlbnRDYXJldFBvc2l0aW9uICsgKGlzQWRkaXRpb24gPyAtZWRpdERpc3RhbmNlIDogMClcblxuICAvLyBXZSdyZSBhbHNvIGdvbm5hIG5lZWQgdGhlIGluZGV4IG9mIGxhc3QgY2hhbmdlLCB3aGljaCB3ZSBjYW4gZGVyaXZlIGFzIGZvbGxvd3MuLi5cbiAgY29uc3QgaW5kZXhPZkxhc3RDaGFuZ2UgPSBpbmRleE9mRmlyc3RDaGFuZ2UgKyBNYXRoLmFicyhlZGl0RGlzdGFuY2UpXG5cbiAgLy8gSWYgYGNvbmZvcm1Ub01hc2tgIGlzIGNvbmZpZ3VyZWQgdG8ga2VlcCBjaGFyYWN0ZXIgcG9zaXRpb25zLCB0aGF0IGlzLCBmb3IgbWFzayAxMTEsIHByZXZpb3VzIHZhbHVlXG4gIC8vIF8yXyBhbmQgcmF3IHZhbHVlIDNfMl8sIHRoZSBuZXcgY29uZm9ybWVkIHZhbHVlIHNob3VsZCBiZSAzMl8sIG5vdCAzXzIgKGRlZmF1bHQgYmVoYXZpb3IpLiBUaGF0J3MgaW4gdGhlIGNhc2Ugb2ZcbiAgLy8gYWRkaXRpb24uIEFuZCBpbiB0aGUgY2FzZSBvZiBkZWxldGlvbiwgcHJldmlvdXMgdmFsdWUgXzIzLCByYXcgdmFsdWUgXzMsIHRoZSBuZXcgY29uZm9ybWVkIHN0cmluZyBzaG91bGQgYmVcbiAgLy8gX18zLCBub3QgXzNfIChkZWZhdWx0IGJlaGF2aW9yKVxuICAvL1xuICAvLyBUaGUgbmV4dCBibG9jayBvZiBsb2dpYyBoYW5kbGVzIGtlZXBpbmcgY2hhcmFjdGVyIHBvc2l0aW9ucyBmb3IgdGhlIGNhc2Ugb2YgZGVsZXRpb24uIChLZWVwaW5nXG4gIC8vIGNoYXJhY3RlciBwb3NpdGlvbnMgZm9yIHRoZSBjYXNlIG9mIGFkZGl0aW9uIGlzIGZ1cnRoZXIgZG93biBzaW5jZSBpdCBpcyBoYW5kbGVkIGRpZmZlcmVudGx5LilcbiAgLy8gVG8gZG8gdGhpcywgd2Ugd2FudCB0byBjb21wZW5zYXRlIGZvciBhbGwgY2hhcmFjdGVycyB0aGF0IHdlcmUgZGVsZXRlZFxuICBpZiAoa2VlcENoYXJQb3NpdGlvbnMgPT09IHRydWUgJiYgIWlzQWRkaXRpb24pIHtcbiAgICAvLyBXZSB3aWxsIGJlIHN0b3JpbmcgdGhlIG5ldyBwbGFjZWhvbGRlciBjaGFyYWN0ZXJzIGluIHRoaXMgdmFyaWFibGUuXG4gICAgbGV0IGNvbXBlbnNhdGluZ1BsYWNlaG9sZGVyQ2hhcnMgPSBlbXB0eVN0cmluZ1xuXG4gICAgLy8gRm9yIGV2ZXJ5IGNoYXJhY3RlciB0aGF0IHdhcyBkZWxldGVkIGZyb20gYSBwbGFjZWhvbGRlciBwb3NpdGlvbiwgd2UgYWRkIGEgcGxhY2Vob2xkZXIgY2hhclxuICAgIGZvciAobGV0IGkgPSBpbmRleE9mRmlyc3RDaGFuZ2U7IGkgPCBpbmRleE9mTGFzdENoYW5nZTsgaSsrKSB7XG4gICAgICBpZiAocGxhY2Vob2xkZXJbaV0gPT09IHBsYWNlaG9sZGVyQ2hhcikge1xuICAgICAgICBjb21wZW5zYXRpbmdQbGFjZWhvbGRlckNoYXJzICs9IHBsYWNlaG9sZGVyQ2hhclxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vdyB3ZSB0cmljayBvdXIgYWxnb3JpdGhtIGJ5IG1vZGlmeWluZyB0aGUgcmF3IHZhbHVlIHRvIG1ha2UgaXQgY29udGFpbiBhZGRpdGlvbmFsIHBsYWNlaG9sZGVyIGNoYXJhY3RlcnNcbiAgICAvLyBUaGF0IHdheSB3aGVuIHRoZSB3ZSBzdGFydCBsYXlpbmcgdGhlIGNoYXJhY3RlcnMgYWdhaW4gb24gdGhlIG1hc2ssIGl0IHdpbGwga2VlcCB0aGUgbm9uLWRlbGV0ZWQgY2hhcmFjdGVyc1xuICAgIC8vIGluIHRoZWlyIHBvc2l0aW9ucy5cbiAgICByYXdWYWx1ZSA9IChcbiAgICAgIHJhd1ZhbHVlLnNsaWNlKDAsIGluZGV4T2ZGaXJzdENoYW5nZSkgK1xuICAgICAgY29tcGVuc2F0aW5nUGxhY2Vob2xkZXJDaGFycyArXG4gICAgICByYXdWYWx1ZS5zbGljZShpbmRleE9mRmlyc3RDaGFuZ2UsIHJhd1ZhbHVlTGVuZ3RoKVxuICAgIClcbiAgfVxuXG4gIC8vIENvbnZlcnQgYHJhd1ZhbHVlYCBzdHJpbmcgdG8gYW4gYXJyYXksIGFuZCBtYXJrIGNoYXJhY3RlcnMgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBuZXdseSBhZGRlZCBvciBoYXZlXG4gIC8vIGV4aXN0ZWQgaW4gdGhlIHByZXZpb3VzIGNvbmZvcm1lZCB2YWx1ZS4gSWRlbnRpZnlpbmcgbmV3IGFuZCBvbGQgY2hhcmFjdGVycyBpcyBuZWVkZWQgZm9yIGBjb25mb3JtVG9NYXNrYFxuICAvLyB0byB3b3JrIGlmIGl0IGlzIGNvbmZpZ3VyZWQgdG8ga2VlcCBjaGFyYWN0ZXIgcG9zaXRpb25zLlxuICBjb25zdCByYXdWYWx1ZUFyciA9IHJhd1ZhbHVlXG4gICAgLnNwbGl0KGVtcHR5U3RyaW5nKVxuICAgIC5tYXAoKGNoYXIsIGkpID0+ICh7IGNoYXIsIGlzTmV3OiBpID49IGluZGV4T2ZGaXJzdENoYW5nZSAmJiBpIDwgaW5kZXhPZkxhc3RDaGFuZ2UgfSkpXG5cbiAgLy8gVGhlIGxvb3AgYmVsb3cgcmVtb3ZlcyBtYXNraW5nIGNoYXJhY3RlcnMgZnJvbSB1c2VyIGlucHV0LiBGb3IgZXhhbXBsZSwgZm9yIG1hc2tcbiAgLy8gYDAwICgxMTEpYCwgdGhlIHBsYWNlaG9sZGVyIHdvdWxkIGJlIGAwMCAoX19fKWAuIElmIHVzZXIgaW5wdXQgaXMgYDAwICgyMzQpYCwgdGhlIGxvb3AgYmVsb3dcbiAgLy8gd291bGQgcmVtb3ZlIGFsbCBjaGFyYWN0ZXJzIGJ1dCBgMjM0YCBmcm9tIHRoZSBgcmF3VmFsdWVBcnJgLiBUaGUgcmVzdCBvZiB0aGUgYWxnb3JpdGhtXG4gIC8vIHRoZW4gd291bGQgbGF5IGAyMzRgIG9uIHRvcCBvZiB0aGUgYXZhaWxhYmxlIHBsYWNlaG9sZGVyIHBvc2l0aW9ucyBpbiB0aGUgbWFzay5cbiAgZm9yIChsZXQgaSA9IHJhd1ZhbHVlTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCB7IGNoYXIgfSA9IHJhd1ZhbHVlQXJyW2ldXG5cbiAgICBpZiAoY2hhciAhPT0gcGxhY2Vob2xkZXJDaGFyKSB7XG4gICAgICBjb25zdCBzaG91bGRPZmZzZXQgPSBpID49IGluZGV4T2ZGaXJzdENoYW5nZSAmJiBwcmV2aW91c0NvbmZvcm1lZFZhbHVlTGVuZ3RoID09PSBtYXNrTGVuZ3RoXG5cbiAgICAgIGlmIChjaGFyID09PSBwbGFjZWhvbGRlclsoc2hvdWxkT2Zmc2V0KSA/IGkgLSBlZGl0RGlzdGFuY2UgOiBpXSkge1xuICAgICAgICByYXdWYWx1ZUFyci5zcGxpY2UoaSwgMSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGlzIHRoZSB2YXJpYWJsZSB0aGF0IHdlIHdpbGwgYmUgZmlsbGluZyB3aXRoIGNoYXJhY3RlcnMgYXMgd2UgZmlndXJlIHRoZW0gb3V0XG4gIC8vIGluIHRoZSBhbGdvcml0aG0gYmVsb3dcbiAgbGV0IGNvbmZvcm1lZFZhbHVlID0gZW1wdHlTdHJpbmdcbiAgbGV0IHNvbWVDaGFyc1JlamVjdGVkID0gZmFsc2VcblxuICAvLyBPaywgc28gZmlyc3Qgd2UgbG9vcCB0aHJvdWdoIHRoZSBwbGFjZWhvbGRlciBsb29raW5nIGZvciBwbGFjZWhvbGRlciBjaGFyYWN0ZXJzIHRvIGZpbGwgdXAuXG4gIHBsYWNlaG9sZGVyTG9vcDogZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFjZWhvbGRlckxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhckluUGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcltpXVxuXG4gICAgLy8gV2Ugc2VlIG9uZS4gTGV0J3MgZmluZCBvdXQgd2hhdCB3ZSBjYW4gcHV0IGluIGl0LlxuICAgIGlmIChjaGFySW5QbGFjZWhvbGRlciA9PT0gcGxhY2Vob2xkZXJDaGFyKSB7XG4gICAgICAvLyBCdXQgYmVmb3JlIHRoYXQsIGRvIHdlIGFjdHVhbGx5IGhhdmUgYW55IHVzZXIgY2hhcmFjdGVycyB0aGF0IG5lZWQgYSBwbGFjZT9cbiAgICAgIGlmIChyYXdWYWx1ZUFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFdlIHdpbGwga2VlcCBjaGlwcGluZyBhd2F5IGF0IHVzZXIgaW5wdXQgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgY2hhcmFjdGVyc1xuICAgICAgICAvLyBvciB3ZSBmaW5kIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgdGhhdCB3ZSBjYW4gbWFwLlxuICAgICAgICB3aGlsZSAocmF3VmFsdWVBcnIubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIExldCdzIHJldHJpZXZlIHRoZSBmaXJzdCB1c2VyIGNoYXJhY3RlciBpbiB0aGUgcXVldWUgb2YgY2hhcmFjdGVycyB3ZSBoYXZlIGxlZnRcbiAgICAgICAgICBjb25zdCBzaGlmdCA9IHJhd1ZhbHVlQXJyLnNoaWZ0KCk7XG4gICAgICAgICAgbGV0IHJhd1ZhbHVlQ2hhcjogc3RyaW5nID0gJycsIGlzTmV3OiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHNoaWZ0KSB7XG4gICAgICAgICAgICByYXdWYWx1ZUNoYXIgPSBzaGlmdC5jaGFyO1xuICAgICAgICAgICAgaXNOZXcgPSBzaGlmdC5pc05ldztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIHdlIGdvdCBmcm9tIHRoZSB1c2VyIGlucHV0IGlzIGEgcGxhY2Vob2xkZXIgY2hhcmFjdGVyICh3aGljaCBoYXBwZW5zXG4gICAgICAgICAgLy8gcmVndWxhcmx5IGJlY2F1c2UgdXNlciBpbnB1dCBjb3VsZCBiZSBzb21ldGhpbmcgbGlrZSAoNTQwKSA5MF8tX19fXywgd2hpY2ggaW5jbHVkZXNcbiAgICAgICAgICAvLyBhIGJ1bmNoIG9mIGBfYCB3aGljaCBhcmUgcGxhY2Vob2xkZXIgY2hhcmFjdGVycykgYW5kIHdlIGFyZSBub3QgaW4gKm5vIGd1aWRlKiBtb2RlLFxuICAgICAgICAgIC8vIHRoZW4gd2UgbWFwIHRoaXMgcGxhY2Vob2xkZXIgY2hhcmFjdGVyIHRvIHRoZSBjdXJyZW50IHNwb3QgaW4gdGhlIHBsYWNlaG9sZGVyXG4gICAgICAgICAgaWYgKHJhd1ZhbHVlQ2hhciA9PT0gcGxhY2Vob2xkZXJDaGFyICYmIHN1cHByZXNzR3VpZGUgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbmZvcm1lZFZhbHVlICs9IHBsYWNlaG9sZGVyQ2hhclxuXG4gICAgICAgICAgICAvLyBBbmQgd2UgZ28gdG8gZmluZCB0aGUgbmV4dCBwbGFjZWhvbGRlciBjaGFyYWN0ZXIgdGhhdCBuZWVkcyBmaWxsaW5nXG4gICAgICAgICAgICBjb250aW51ZSBwbGFjZWhvbGRlckxvb3BcblxuICAgICAgICAgICAgLy8gRWxzZSBpZiwgdGhlIGNoYXJhY3RlciB3ZSBnb3QgZnJvbSB0aGUgdXNlciBpbnB1dCBpcyBub3QgYSBwbGFjZWhvbGRlciwgbGV0J3Mgc2VlXG4gICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgbWFzayBjYW4gYWNjZXB0IGl0LlxuICAgICAgICAgIH0gZWxzZSBpZiAobWFza1tpXS50ZXN0KHJhd1ZhbHVlQ2hhcikpIHtcbiAgICAgICAgICAgIC8vIHdlIG1hcCB0aGUgY2hhcmFjdGVyIGRpZmZlcmVudGx5IGJhc2VkIG9uIHdoZXRoZXIgd2UgYXJlIGtlZXBpbmcgY2hhcmFjdGVyIHBvc2l0aW9ucyBvciBub3QuXG4gICAgICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIGNvbmRpdGlvbnMgYmVsb3cgYXJlIG1ldCwgd2Ugc2ltcGx5IG1hcCB0aGUgcmF3IHZhbHVlIGNoYXJhY3RlciB0byB0aGVcbiAgICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIHBvc2l0aW9uLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBrZWVwQ2hhclBvc2l0aW9ucyAhPT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICBpc05ldyA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgICAgcHJldmlvdXNDb25mb3JtZWRWYWx1ZSA9PT0gZW1wdHlTdHJpbmcgfHxcbiAgICAgICAgICAgICAgZ3VpZGUgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICAgICFpc0FkZGl0aW9uXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uZm9ybWVkVmFsdWUgKz0gcmF3VmFsdWVDaGFyXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXZSBlbnRlciB0aGlzIGJsb2NrIG9mIGNvZGUgaWYgd2UgYXJlIHRyeWluZyB0byBrZWVwIGNoYXJhY3RlciBwb3NpdGlvbnMgYW5kIG5vbmUgb2YgdGhlIGNvbmRpdGlvbnNcbiAgICAgICAgICAgICAgLy8gYWJvdmUgaXMgbWV0LiBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gc2VlIGlmIHRoZXJlJ3MgYW4gYXZhaWxhYmxlIHNwb3QgZm9yIHRoZSByYXcgdmFsdWUgY2hhcmFjdGVyXG4gICAgICAgICAgICAgIC8vIHRvIGJlIG1hcHBlZCB0by4gSWYgd2UgY291bGRuJ3QgZmluZCBhIHNwb3QsIHdlIHdpbGwgZGlzY2FyZCB0aGUgY2hhcmFjdGVyLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgZm9yIG1hc2sgYDExMTFgLCBwcmV2aW91cyBjb25mb3JtZWQgdmFsdWUgYF8yX19gLCByYXcgdmFsdWUgYDk0Ml8yX19gLiBXZSBjYW4gbWFwIHRoZVxuICAgICAgICAgICAgICAvLyBgOWAsIHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgcGxhY2Vob2xkZXIgcG9zaXRpb24sIGJ1dCB0aGVuLCB0aGVyZSBhcmUgbm8gbW9yZSBzcG90cyBhdmFpbGFibGUgZm9yIHRoZVxuICAgICAgICAgICAgICAvLyBgNGAgYW5kIGAyYC4gU28sIHdlIGRpc2NhcmQgdGhlbSBhbmQgZW5kIHVwIHdpdGggYSBjb25mb3JtZWQgdmFsdWUgb2YgYDkyX19gLlxuICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZUFyckxlbmd0aCA9IHJhd1ZhbHVlQXJyLmxlbmd0aFxuICAgICAgICAgICAgICBsZXQgaW5kZXhPZk5leHRBdmFpbGFibGVQbGFjZWhvbGRlckNoYXIgPSBudWxsXG5cbiAgICAgICAgICAgICAgLy8gTGV0J3MgbG9vcCB0aHJvdWdoIHRoZSByZW1haW5pbmcgcmF3IHZhbHVlIGNoYXJhY3RlcnMuIFdlIGFyZSBsb29raW5nIGZvciBlaXRoZXIgYSBzdWl0YWJsZSBzcG90LCBpZSxcbiAgICAgICAgICAgICAgLy8gYSBwbGFjZWhvbGRlciBjaGFyYWN0ZXIgb3IgYSBub24tc3VpdGFibGUgc3BvdCwgaWUsIGEgbm9uLXBsYWNlaG9sZGVyIGNoYXJhY3RlciB0aGF0IGlzIG5vdCBuZXcuXG4gICAgICAgICAgICAgIC8vIElmIHdlIHNlZSBhIHN1aXRhYmxlIHNwb3QgZmlyc3QsIHdlIHN0b3JlIGl0cyBwb3NpdGlvbiBhbmQgZXhpdCB0aGUgbG9vcC4gSWYgd2Ugc2VlIGEgbm9uLXN1aXRhYmxlXG4gICAgICAgICAgICAgIC8vIHNwb3QgZmlyc3QsIHdlIGV4aXQgdGhlIGxvb3AgYW5kIG91ciBgaW5kZXhPZk5leHRBdmFpbGFibGVQbGFjZWhvbGRlckNoYXJgIHdpbGwgc3RheSBhcyBgbnVsbGAuXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3VmFsdWVBcnJMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJEYXRhID0gcmF3VmFsdWVBcnJbaV1cblxuICAgICAgICAgICAgICAgIGlmIChjaGFyRGF0YS5jaGFyICE9PSBwbGFjZWhvbGRlckNoYXIgJiYgY2hhckRhdGEuaXNOZXcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjaGFyRGF0YS5jaGFyID09PSBwbGFjZWhvbGRlckNoYXIpIHtcbiAgICAgICAgICAgICAgICAgIGluZGV4T2ZOZXh0QXZhaWxhYmxlUGxhY2Vob2xkZXJDaGFyID0gaVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBJZiBgaW5kZXhPZk5leHRBdmFpbGFibGVQbGFjZWhvbGRlckNoYXJgIGlzIG5vdCBgbnVsbGAsIHRoYXQgbWVhbnMgdGhlIGNoYXJhY3RlciBpcyBub3QgYmxvY2tlZC5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIG1hcCBpdC4gQW5kIHRvIGtlZXAgdGhlIGNoYXJhY3RlciBwb3NpdGlvbnMsIHdlIHJlbW92ZSB0aGUgcGxhY2Vob2xkZXIgY2hhcmFjdGVyXG4gICAgICAgICAgICAgIC8vIGZyb20gdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICAgIGlmIChpbmRleE9mTmV4dEF2YWlsYWJsZVBsYWNlaG9sZGVyQ2hhciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZvcm1lZFZhbHVlICs9IHJhd1ZhbHVlQ2hhclxuICAgICAgICAgICAgICAgIHJhd1ZhbHVlQXJyLnNwbGljZShpbmRleE9mTmV4dEF2YWlsYWJsZVBsYWNlaG9sZGVyQ2hhciwgMSlcblxuICAgICAgICAgICAgICAgIC8vIElmIGBpbmRleE9mTmV4dEF2YWlsYWJsZVBsYWNlaG9sZGVyQ2hhcmAgaXMgYG51bGxgLCB0aGF0IG1lYW5zIHRoZSBjaGFyYWN0ZXIgaXMgYmxvY2tlZC4gV2UgaGF2ZSB0b1xuICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgaXQuXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaS0tXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2luY2Ugd2UndmUgbWFwcGVkIHRoaXMgcGxhY2Vob2xkZXIgcG9zaXRpb24uIFdlIG1vdmUgb24gdG8gdGhlIG5leHQgb25lLlxuICAgICAgICAgICAgY29udGludWUgcGxhY2Vob2xkZXJMb29wXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvbWVDaGFyc1JlamVjdGVkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXZSByZWFjaCB0aGlzIHBvaW50IHdoZW4gd2UndmUgbWFwcGVkIGFsbCB0aGUgdXNlciBpbnB1dCBjaGFyYWN0ZXJzIHRvIHBsYWNlaG9sZGVyXG4gICAgICAvLyBwb3NpdGlvbnMgaW4gdGhlIG1hc2suIEluICpndWlkZSogbW9kZSwgd2UgYXBwZW5kIHRoZSBsZWZ0IG92ZXIgY2hhcmFjdGVycyBpbiB0aGVcbiAgICAgIC8vIHBsYWNlaG9sZGVyIHRvIHRoZSBgY29uZm9ybWVkU3RyaW5nYCwgYnV0IGluICpubyBndWlkZSogbW9kZSwgd2UgZG9uJ3Qgd2FubmEgZG8gdGhhdC5cbiAgICAgIC8vXG4gICAgICAvLyBUaGF0IGlzLCBmb3IgbWFzayBgKDExMSlgIGFuZCB1c2VyIGlucHV0IGAyYCwgd2Ugd2FudCB0byByZXR1cm4gYCgyYCwgbm90IGAoMl9fKWAuXG4gICAgICBpZiAoc3VwcHJlc3NHdWlkZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uZm9ybWVkVmFsdWUgKz0gcGxhY2Vob2xkZXIuc3Vic3RyKGksIHBsYWNlaG9sZGVyTGVuZ3RoKVxuICAgICAgfVxuXG4gICAgICAvLyBBbmQgd2UgYnJlYWtcbiAgICAgIGJyZWFrXG5cbiAgICAgIC8vIEVsc2UsIHRoZSBjaGFySW5QbGFjZWhvbGRlciBpcyBub3QgYSBwbGFjZWhvbGRlckNoYXIuIFRoYXQgaXMsIHdlIGNhbm5vdCBmaWxsIGl0XG4gICAgICAvLyB3aXRoIHVzZXIgaW5wdXQuIFNvIHdlIGp1c3QgbWFwIGl0IHRvIHRoZSBmaW5hbCBvdXRwdXRcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZm9ybWVkVmFsdWUgKz0gY2hhckluUGxhY2Vob2xkZXJcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGxvZ2ljIGlzIG5lZWRlZCB0byBkZWFsIHdpdGggdGhlIGNhc2Ugb2YgZGVsZXRpb24gaW4gKm5vIGd1aWRlKiBtb2RlLlxuICAvL1xuICAvLyBDb25zaWRlciB0aGUgc2lsbHkgbWFzayBgKDExMSkgLy8vIDFgLiBXaGF0IGlmIHVzZXIgdHJpZXMgdG8gZGVsZXRlIHRoZSBsYXN0IHBsYWNlaG9sZGVyXG4gIC8vIHBvc2l0aW9uPyBTb21ldGhpbmcgbGlrZSBgKDU4OSkgLy8vIGAuIFdlIHdhbnQgdG8gY29uZm9ybSB0aGF0IHRvIGAoNTg5YC4gTm90IGAoNTg5KSAvLy8gYC5cbiAgLy8gVGhhdCdzIHdoeSB0aGUgbG9naWMgYmVsb3cgZmluZHMgdGhlIGxhc3QgZmlsbGVkIHBsYWNlaG9sZGVyIGNoYXJhY3RlciwgYW5kIHJlbW92ZXMgZXZlcnl0aGluZ1xuICAvLyBmcm9tIHRoYXQgcG9pbnQgb24uXG4gIGlmIChzdXBwcmVzc0d1aWRlICYmIGlzQWRkaXRpb24gPT09IGZhbHNlKSB7XG4gICAgbGV0IGluZGV4T2ZMYXN0RmlsbGVkUGxhY2Vob2xkZXJDaGFyID0gbnVsbFxuXG4gICAgLy8gRmluZCB0aGUgbGFzdCBmaWxsZWQgcGxhY2Vob2xkZXIgcG9zaXRpb24gYW5kIHN1YnN0cmluZyBmcm9tIHRoZXJlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25mb3JtZWRWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBsYWNlaG9sZGVyW2ldID09PSBwbGFjZWhvbGRlckNoYXIpIHtcbiAgICAgICAgaW5kZXhPZkxhc3RGaWxsZWRQbGFjZWhvbGRlckNoYXIgPSBpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluZGV4T2ZMYXN0RmlsbGVkUGxhY2Vob2xkZXJDaGFyICE9PSBudWxsKSB7XG4gICAgICAvLyBXZSBzdWJzdHJpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIHVudGlsIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgbGFzdCBmaWxsZWQgcGxhY2Vob2xkZXIgY2hhci5cbiAgICAgIGNvbmZvcm1lZFZhbHVlID0gY29uZm9ybWVkVmFsdWUuc3Vic3RyKDAsIGluZGV4T2ZMYXN0RmlsbGVkUGxhY2Vob2xkZXJDaGFyICsgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZmluZCBgaW5kZXhPZkxhc3RGaWxsZWRQbGFjZWhvbGRlckNoYXJgIHRoYXQgbWVhbnMgdGhlIHVzZXIgZGVsZXRlZFxuICAgICAgLy8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgbWFzay4gU28gd2UgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgIGNvbmZvcm1lZFZhbHVlID0gZW1wdHlTdHJpbmdcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjb25mb3JtZWRWYWx1ZSwgbWV0YTogeyBzb21lQ2hhcnNSZWplY3RlZCB9IH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydE1hc2tUb1BsYWNlaG9sZGVyKG1hc2sgPSBlbXB0eUFycmF5LCBwbGFjZWhvbGRlckNoYXIgPSBkZWZhdWx0UGxhY2Vob2xkZXJDaGFyKSB7XG4gIGlmICghaXNBcnJheShtYXNrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdUZXh0LW1hc2s6Y29udmVydE1hc2tUb1BsYWNlaG9sZGVyOyBUaGUgbWFzayBwcm9wZXJ0eSBtdXN0IGJlIGFuIGFycmF5LidcbiAgICApXG4gIH1cblxuICBpZiAobWFzay5pbmRleE9mKHBsYWNlaG9sZGVyQ2hhcikgIT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1BsYWNlaG9sZGVyIGNoYXJhY3RlciBtdXN0IG5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIG1hc2suIFBsZWFzZSBzcGVjaWZ5IGEgY2hhcmFjdGVyICcgK1xuICAgICAgJ3RoYXQgaXMgbm90IHByZXNlbnQgaW4geW91ciBtYXNrIGFzIHlvdXIgcGxhY2Vob2xkZXIgY2hhcmFjdGVyLlxcblxcbicgK1xuICAgICAgYFRoZSBwbGFjZWhvbGRlciBjaGFyYWN0ZXIgdGhhdCB3YXMgcmVjZWl2ZWQgaXM6ICR7SlNPTi5zdHJpbmdpZnkocGxhY2Vob2xkZXJDaGFyKX1cXG5cXG5gICtcbiAgICAgIGBUaGUgbWFzayB0aGF0IHdhcyByZWNlaXZlZCBpczogJHtKU09OLnN0cmluZ2lmeShtYXNrKX1gXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIG1hc2subWFwKChjaGFyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gKGNoYXIgaW5zdGFuY2VvZiBSZWdFeHApID8gcGxhY2Vob2xkZXJDaGFyIDogY2hhclxuICB9KS5qb2luKCcnKVxufVxuXG4vKipcbiAqIER1ZSB0byBhIGJ1ZyBvbiB0ZXh0bWFzaywgdGhlIHJlcXVpcmVEZWNpbWFsIGl0cyBub3Qgd29ya2luZywgc28gdGhpcyBmdW5jdGlvbiBzb2x2ZXMgdGhpcyBwcm9ibGVtXG4gKiBAcGFyYW0gbWFza1R5cGUgXG4gKiBAcGFyYW0gbnVtYmVyVmFsdWUgXG4gKiBAcGFyYW0gZGVjaW1hbHNGb3JtYXQgXG4gKiBAcmV0dXJucyBcbiAqL1xuZnVuY3Rpb24gZm9ybWF0TnVtYmVyKG1hc2tUeXBlOiBhbnksIG51bWJlclZhbHVlOiBhbnksIGRlY2ltYWxzRm9ybWF0OiBudW1iZXIgPSAyKSB7XG4gIGlmICghbnVtYmVyVmFsdWUgJiYgbnVtYmVyVmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIW51bWJlclZhbHVlLnNwbGl0KSB7XG4gICAgbnVtYmVyVmFsdWUgKz0gJyc7XG4gICAgbnVtYmVyVmFsdWUgPSBudW1iZXJWYWx1ZS5yZXBsYWNlKCcuJywgJywnKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHMgPSBudW1iZXJWYWx1ZS5zcGxpdCgnLCcpO1xuXG4gIGlmICghbWFza1R5cGUudGV4dE1hc2sgfHwgdHlwZW9mIG1hc2tUeXBlLnRleHRNYXNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgbWFzayA9IG1hc2tUeXBlLnRleHRNYXNrKHZhbHNbMF0pO1xuXG4gIGxldCBkZWNpbWFscyA9ICcnXG4gIGlmIChkZWNpbWFsc0Zvcm1hdCA9PSB1bmRlZmluZWQpIHtcbiAgICBkZWNpbWFscyA9IHZhbHMubGVuZ3RoID4gMSA/ICcsJyArIHZhbHNbMV0gOiAnJztcbiAgfSBlbHNlIHtcbiAgICBkZWNpbWFscyA9IHZhbHMubGVuZ3RoID4gMSA/ICh2YWxzWzFdIDwgMTAgPyB2YWxzWzFdLnRvU3RyaW5nKCkgKyAnMCcgOiB2YWxzWzFdLnRvU3RyaW5nKCkpIDogJzAwJztcbiAgICBpZiAoZGVjaW1hbHMubGVuZ3RoID4gZGVjaW1hbHNGb3JtYXQpIHtcbiAgICAgIGRlY2ltYWxzID0gZGVjaW1hbHMuc3Vic3RyaW5nKDAsIGRlY2ltYWxzRm9ybWF0KTtcbiAgICB9XG4gIH1cblxuICBsZXQgY29uZm9ybWVkVmFsdWUgPSBjb25mb3JtVG9NYXNrKFxuICAgIG51bWJlclZhbHVlLFxuICAgIG1hc2ssXG4gICAgeyBndWlkZTogZmFsc2UgfVxuICApLmNvbmZvcm1lZFZhbHVlXG5cblxuICBsZXQgc3VmZml4ID0gJydcbiAgaWYgKGNvbmZvcm1lZFZhbHVlLmluZGV4T2YoJyUnKSA+PSAwKSB7XG4gICAgY29uZm9ybWVkVmFsdWUgPSBjb25mb3JtZWRWYWx1ZS5yZXBsYWNlKCclJywgJycpXG4gICAgc3VmZml4ID0gJyUnXG4gIH1cbiAgcmV0dXJuIGNvbmZvcm1lZFZhbHVlICsgKGRlY2ltYWxzRm9ybWF0ID4gMCA/ICcsJyArIGRlY2ltYWxzIDogJycpICsgc3VmZml4O1xufSJdfQ==
|