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,627 @@
|
|
|
1
|
+
import { getAllDigits, fillString, getAllWords } from './utils';
|
|
2
|
+
import { validate_inscricaoestadual } from './inscricaoestadual';
|
|
3
|
+
import { validate_placa } from './placa';
|
|
4
|
+
import { create_cnpj, create_cpf, create_renavam, create_ect, create_processo, create_titulo_atual, create_cnh, create_certidao, create_aih, create_pispasep, create_cnhespelho, create_renachestadual, create_renachseguranca } from './create';
|
|
5
|
+
import RG from './rg';
|
|
6
|
+
import { validate_iptu } from './iptu';
|
|
7
|
+
import { ESTADOS_SIGLA } from './estados';
|
|
8
|
+
export function validate_aih(aih) {
|
|
9
|
+
const aihClean = aih.replace(/[^\d]+/g, '');
|
|
10
|
+
const dvOriginal = aihClean.substr(-1);
|
|
11
|
+
const dv = create_aih(aihClean);
|
|
12
|
+
return dvOriginal === dv;
|
|
13
|
+
}
|
|
14
|
+
export function validate_celular(cel) {
|
|
15
|
+
let celClean = cel.replace(/[^\d]+/g, '');
|
|
16
|
+
celClean = celClean.replace(/_/g, '');
|
|
17
|
+
if (celClean.length !== 11) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
if (celClean[0] == 0 || celClean[2] < 5) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
export const CEPRange = {
|
|
26
|
+
'SP': /^([1][0-9]{3}|[01][0-9]{4})[0-9]{3}$/g,
|
|
27
|
+
'RJ': /^[2][0-8][0-9]{3}[0-9]{3}$/g,
|
|
28
|
+
'MS': /^[7][9][0-9]{3}[0-9]{3}$/g,
|
|
29
|
+
'MG': /^[3][0-9]{4}[0-9]{3}$/g,
|
|
30
|
+
'MT': /^[7][8][8][0-9]{2}[0-9]{3}$/g,
|
|
31
|
+
'AC': /^[6][9]{2}[0-9]{2}[0-9]{3}$/g,
|
|
32
|
+
'AL': /^[5][7][0-9]{3}[0-9]{3}$/g,
|
|
33
|
+
'AM': /^[6][9][0-8][0-9]{2}[0-9]{3}$/g,
|
|
34
|
+
'AP': /^[6][89][9][0-9]{2}[0-9]{3}$/g,
|
|
35
|
+
'BA': /^[4][0-8][0-9]{3}[0-9]{3}$/g,
|
|
36
|
+
'CE': /^[6][0-3][0-9]{3}[0-9]{3}$/g,
|
|
37
|
+
'DF': /^[7][0-3][0-6][0-9]{2}[0-9]{3}$/g,
|
|
38
|
+
'ES': /^[2][9][0-9]{3}[0-9]{3}$/g,
|
|
39
|
+
'GO': /^[7][3-6][7-9][0-9]{2}[0-9]{3}$/g,
|
|
40
|
+
'MA': /^[6][5][0-9]{3}[0-9]{3}$/g,
|
|
41
|
+
'PA': /^[6][6-8][0-8][0-9]{2}[0-9]{3}$/g,
|
|
42
|
+
'PB': /^[5][8][0-9]{3}[0-9]{3}$/g,
|
|
43
|
+
'PE': /^[5][0-6][0-9]{2}[0-9]{3}$/g,
|
|
44
|
+
'PI': /^[6][4][0-9]{3}[0-9]{3}$/g,
|
|
45
|
+
'PR': /^[8][0-7][0-9]{3}[0-9]{3}$/g,
|
|
46
|
+
'RN': /^[5][9][0-9]{3}[0-9]{3}$/g,
|
|
47
|
+
'RO': /^[7][8][9][0-9]{2}[0-9]{3}$/g,
|
|
48
|
+
'RR': /^[6][9][3][0-9]{2}[0-9]{3}$/g,
|
|
49
|
+
'RS': /^[9][0-9]{4}[0-9]{3}$/g,
|
|
50
|
+
'SC': /^[8][89][0-9]{3}[0-9]{3}$/g,
|
|
51
|
+
'SE': /^[4][9][0-9]{3}[0-9]{3}$/g,
|
|
52
|
+
'TO': /^[7][7][0-9]{3}[0-9]{3}$/g,
|
|
53
|
+
};
|
|
54
|
+
export function validate_cep(cep) {
|
|
55
|
+
const cepClean = cep.replace(/[^\d]+/g, '');
|
|
56
|
+
const exp = /\d{2}\.\d{3}\-\d{3}/;
|
|
57
|
+
if (!exp.test(cep) && cepClean.length !== 8) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
export function cep_ranges(cep) {
|
|
63
|
+
cep = (cep.toString()).replace(/[^\d]+/g, '');
|
|
64
|
+
cep = parseInt(cep, 10);
|
|
65
|
+
const cepString = cep.toString();
|
|
66
|
+
let found;
|
|
67
|
+
for (let estado in CEPRange) {
|
|
68
|
+
const v = CEPRange[estado];
|
|
69
|
+
const r = new RegExp(v).test(cepString);
|
|
70
|
+
if (r) {
|
|
71
|
+
found = r;
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (!found) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
export function validate_certidao(value) {
|
|
81
|
+
let certidao = getAllDigits(value);
|
|
82
|
+
const format = /[0-9]{32}/;
|
|
83
|
+
if (!format.test(certidao)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
let dvOriginal = certidao.substr(-2);
|
|
87
|
+
const dv = create_certidao(certidao);
|
|
88
|
+
return dv === dvOriginal;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
*
|
|
92
|
+
* @param chassi
|
|
93
|
+
*/
|
|
94
|
+
export function validate_chassi(chassi) {
|
|
95
|
+
// 1 - Possuir o número "0" (ZERO) como 1º dígito.
|
|
96
|
+
const zeroNoPrimeiroDigito = /^0/;
|
|
97
|
+
if (zeroNoPrimeiroDigito.test(chassi)) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
// 2 - Possuir espaço no chassi
|
|
101
|
+
chassi = getAllWords(chassi); // espacoNoChassi
|
|
102
|
+
// 3 - Se, a partir do 4º dígito, houver uma repetição consecutiva, por mais de seis vezes, do mesmo dígito
|
|
103
|
+
// (alfabético ou numérico). Exemplos: 9BW11111119452687 e 9BWZZZ5268AAAAAAA.
|
|
104
|
+
const repeticaoMaisDe6Vezes = /^.{4,}([0-9A-Z])\1{5,}/;
|
|
105
|
+
if (repeticaoMaisDe6Vezes.test(chassi)) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
// 4 - Apresente os caracteres "i", "I", "o", "O", "q", "Q".
|
|
109
|
+
const caracteresiIoOqQ = /[iIoOqQ]/;
|
|
110
|
+
if (caracteresiIoOqQ.test(chassi)) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
// 5 - Os quatro últimos caracteres devem ser obrigatoriamente numéricos
|
|
114
|
+
const ultimos4Numericos = /[0-9]{4}$/;
|
|
115
|
+
if (!ultimos4Numericos.test(chassi)) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
// 6 - Se possuir número de dígitos diferente de 17 (alfanuméricos).
|
|
119
|
+
if (chassi.length > 17) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
function validate_cnae(number) {
|
|
125
|
+
if (!number)
|
|
126
|
+
return true;
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
*
|
|
131
|
+
* II - Número do Espelho da CNH - segundo número de identificação nacional,
|
|
132
|
+
* que será formado por 9 (nove) caracteres mais 1 (um) dígito verificador de segurança,
|
|
133
|
+
* autorizado e controlado pelo DENATRAN, e identificará cada espelho de CNH expedida.
|
|
134
|
+
* https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-denatran/resolucoes-contran
|
|
135
|
+
* https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao5112014.pdf
|
|
136
|
+
* 598: https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao59820162.pdf
|
|
137
|
+
* @param value
|
|
138
|
+
*/
|
|
139
|
+
export function validate_cnhespelho(value) {
|
|
140
|
+
value = value.replace(/[^\d]/g, '');
|
|
141
|
+
if (value.length !== 10) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
let check = create_cnhespelho(value);
|
|
145
|
+
if (check === '0' || check === '1')
|
|
146
|
+
check = '0';
|
|
147
|
+
return value.substr(-1) == check;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
*
|
|
151
|
+
* III – Número do formulário RENACH - número de identificação
|
|
152
|
+
* estadual, documento de coleta de dados do candidato/condutor gerado a cada serviço,
|
|
153
|
+
* composto, obrigatoriamente, por 11 (onze) caracteres, sendo as duas primeiras
|
|
154
|
+
* posições formadas pela sigla da Unidade de Federação expedidora, facultada a
|
|
155
|
+
* utilização da última posição como dígito verificador de segurança.
|
|
156
|
+
* a) O número do formulário RENACH identificará a Unidade da
|
|
157
|
+
* Federação onde o condutor foi habilitado ou realizou alterações de dados no seu
|
|
158
|
+
* cadastro pela última vez.
|
|
159
|
+
* b) O Formulário RENACH que dá origem às informações na
|
|
160
|
+
* BINCO e autorização para a impressão da CNH deverá ficar arquivado em seg
|
|
161
|
+
* 598 - https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao59820162.pdf
|
|
162
|
+
* 718 - https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-contran/resolucoes/resolucao7182017.pdf
|
|
163
|
+
* @param value
|
|
164
|
+
*/
|
|
165
|
+
export function validate_renachestadual(value) {
|
|
166
|
+
const state = value.substr(0, 2).toLowerCase();
|
|
167
|
+
if (!ESTADOS_SIGLA.includes(state)) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
let digits = value.substr(2);
|
|
171
|
+
digits = digits.replace(/[^\d]/g, '');
|
|
172
|
+
if (digits.length !== 9) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
let check = create_renachestadual(value);
|
|
176
|
+
if (check === '0' || check === '1')
|
|
177
|
+
check = '0';
|
|
178
|
+
return value.substr(-1) == check;
|
|
179
|
+
}
|
|
180
|
+
export function validate_renachseguranca(value) {
|
|
181
|
+
value = value.replace(/[^\d]/g, '');
|
|
182
|
+
if (value.length !== 11) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
let check = create_renachseguranca(value);
|
|
186
|
+
return value.substr(-1) == check;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* BINCO
|
|
190
|
+
* I – o primeiro número de identificação nacional – Registro Nacional,
|
|
191
|
+
* será gerado pelo sistema informatizado da Base Índice Nacional de Condutores –
|
|
192
|
+
* BINCO, composto de 9 (nove) caracteres mais 2 (dois) dígitos verificadores de
|
|
193
|
+
* segurança, sendo único para cada condutor e o acompanhará durante toda a
|
|
194
|
+
* sua existência como condutor, não sendo permitida a sua reutilização para
|
|
195
|
+
* outro condutor.
|
|
196
|
+
* @param value
|
|
197
|
+
* @returns
|
|
198
|
+
*/
|
|
199
|
+
export function validate_cnh(value) {
|
|
200
|
+
value = value.toString().replace(/[^\d]/g, '');
|
|
201
|
+
if (value.length !== 11) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
let check = create_cnh(value);
|
|
205
|
+
return value.substr(-2) == check;
|
|
206
|
+
}
|
|
207
|
+
export function validate_cnpj(cnpj) {
|
|
208
|
+
// Valida se tem apenas número, - ou .
|
|
209
|
+
let precisaFicarVazio = cnpj.replace(/^[0-9./-]*$/gm, '');
|
|
210
|
+
if (precisaFicarVazio != '')
|
|
211
|
+
return false;
|
|
212
|
+
cnpj = cnpj.replace(/[^\d]+/g, '');
|
|
213
|
+
let tamanho = cnpj.length - 2;
|
|
214
|
+
const digitos = cnpj.substring(tamanho);
|
|
215
|
+
const resultados = create_cnpj(cnpj);
|
|
216
|
+
if (!resultados ||
|
|
217
|
+
resultados[0] !== parseInt(digitos.charAt(0), 10) ||
|
|
218
|
+
resultados[1] !== parseInt(digitos.charAt(1), 10)) {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
function validate_contabanco(number) {
|
|
224
|
+
if (!number)
|
|
225
|
+
return false;
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Referencia: http://www.receita.fazenda.gov.br/aplicacoes/atcta/funcoes.js
|
|
230
|
+
* @param strCPF
|
|
231
|
+
* @returns
|
|
232
|
+
*/
|
|
233
|
+
export function validate_cpf(strCPF) {
|
|
234
|
+
// Valida se tem apenas número, - ou .
|
|
235
|
+
let precisaFicarVazio = strCPF.replace(/^[0-9.-]*$/gm, '');
|
|
236
|
+
if (precisaFicarVazio != '')
|
|
237
|
+
return false;
|
|
238
|
+
strCPF = strCPF.replace(/[^\d]+/g, '');
|
|
239
|
+
if (strCPF.length !== 11) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
//verifica se todos os numeros sao iguais
|
|
243
|
+
const expIguais = /^(?!.*(\d)\1{10}).*$/;
|
|
244
|
+
if (!strCPF.match(expIguais)) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
// valida digito verificados
|
|
248
|
+
const restos = create_cpf(strCPF);
|
|
249
|
+
if (!restos || restos != strCPF.substr(-2)) {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
function validate_cpfcnpj(number) {
|
|
255
|
+
return validate_cpf(number) || validate_cnpj(number);
|
|
256
|
+
}
|
|
257
|
+
export function validate_cns(value) {
|
|
258
|
+
const cns = getAllDigits(value);
|
|
259
|
+
const definitivo = /[1-2][0-9]{10}00[0-1][0-9]/; // começam com 1 ou 2
|
|
260
|
+
const provisorio = /[7-9][0-9]{14}/; // começam com 7,8 ou 9
|
|
261
|
+
if (!definitivo.test(cns) && !provisorio.test(cns)) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
let soma = 0;
|
|
265
|
+
for (let i = 0; i < cns.length; i++) {
|
|
266
|
+
soma += parseInt(cns[i]) * (15 - i);
|
|
267
|
+
}
|
|
268
|
+
return soma % 11 == 0;
|
|
269
|
+
}
|
|
270
|
+
export function validate_cartaocredito(input) {
|
|
271
|
+
let value;
|
|
272
|
+
if (typeof input == 'string') {
|
|
273
|
+
value = getAllDigits(input);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
value = input.toString();
|
|
277
|
+
}
|
|
278
|
+
const number = value.slice(0, 16);
|
|
279
|
+
const mes = parseInt(value.slice(16, 18));
|
|
280
|
+
const ano = parseInt(value.slice(18, 20));
|
|
281
|
+
const cvv = value.slice(20, 23);
|
|
282
|
+
const d = new Date();
|
|
283
|
+
const anoAtual = (d.getFullYear() - 2000);
|
|
284
|
+
if (ano && ano < anoAtual) {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
if (mes && mes < d.getMonth() + 1 && ano === anoAtual) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
if (cvv) {
|
|
291
|
+
const validcvv = validate_cvv(cvv);
|
|
292
|
+
if (validcvv.isValid === false) {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
let found;
|
|
297
|
+
Object.keys(creditCardValidator).forEach(key => {
|
|
298
|
+
if (creditCardValidator[key].test(number)) {
|
|
299
|
+
found = key;
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
return !!found;
|
|
303
|
+
}
|
|
304
|
+
function validate_cvv(value, maxLength = 3) {
|
|
305
|
+
maxLength = maxLength instanceof Array ? maxLength : [maxLength];
|
|
306
|
+
if (typeof value !== 'string') {
|
|
307
|
+
return { isValid: false, isPotentiallyValid: false };
|
|
308
|
+
}
|
|
309
|
+
if (!/^\d*$/.test(value)) {
|
|
310
|
+
return { isValid: false, isPotentiallyValid: false };
|
|
311
|
+
}
|
|
312
|
+
var i = 0;
|
|
313
|
+
const max = value.length;
|
|
314
|
+
for (; i < maxLength.length; i++) {
|
|
315
|
+
if (max === maxLength[i]) {
|
|
316
|
+
return { isValid: true, isPotentiallyValid: true };
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (value.length < Math.min.apply(null, maxLength)) {
|
|
320
|
+
return { isValid: false, isPotentiallyValid: true };
|
|
321
|
+
}
|
|
322
|
+
var maximum = maxLength;
|
|
323
|
+
var i = 0;
|
|
324
|
+
for (; i < maxLength.length; i++) {
|
|
325
|
+
maximum = maxLength[i] > maximum ? maxLength[i] : maximum;
|
|
326
|
+
}
|
|
327
|
+
if (value.length > maximum) {
|
|
328
|
+
return { isValid: false, isPotentiallyValid: false };
|
|
329
|
+
}
|
|
330
|
+
return { isValid: true, isPotentiallyValid: true };
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* A hash of valid CC abbreviations and regular expressions
|
|
334
|
+
mc: Mastercard
|
|
335
|
+
ec: Eurocard
|
|
336
|
+
vi: Visa
|
|
337
|
+
ax: American Express
|
|
338
|
+
dc: Diners Club
|
|
339
|
+
bl: Carte Blanch
|
|
340
|
+
di: Discover
|
|
341
|
+
jcb: JCB
|
|
342
|
+
er: Enroute
|
|
343
|
+
*/
|
|
344
|
+
export const creditCardValidator = {
|
|
345
|
+
'mc': /5[1-5][0-9]{14}/,
|
|
346
|
+
'ec': /5[1-5][0-9]{14}/,
|
|
347
|
+
'vi': /4(?:[0-9]{12}|[0-9]{15})/,
|
|
348
|
+
'ax': /3[47][0-9]{13}/,
|
|
349
|
+
'dc': /3(?:0[0-5][0-9]{11}|[68][0-9]{12})/,
|
|
350
|
+
'bl': /3(?:0[0-5][0-9]{11}|[68][0-9]{12})/,
|
|
351
|
+
'di': /6011[0-9]{12}/,
|
|
352
|
+
'jcb': /(?:3[0-9]{15}|(2131|1800)[0-9]{11})/,
|
|
353
|
+
'er': /2(?:014|149)[0-9]{11}/
|
|
354
|
+
};
|
|
355
|
+
export function validate_currency(currency) {
|
|
356
|
+
if (typeof currency === 'number') {
|
|
357
|
+
return true;
|
|
358
|
+
}
|
|
359
|
+
const regex = /^(R\$|R\$ )?(-)?(?!0(\.)?00)\d{1,3}((\.)?\d{3})*(,\d\d)?$/g;
|
|
360
|
+
return regex.test(currency);
|
|
361
|
+
}
|
|
362
|
+
function validate_data(value) {
|
|
363
|
+
if (!value) {
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
const values = value.split('/');
|
|
367
|
+
if (values.length !== 3) {
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
const testData = new Date(values[1] + '/' + values[0] + '/' + values[2]);
|
|
371
|
+
if (!testData.getTime()) {
|
|
372
|
+
return false;
|
|
373
|
+
}
|
|
374
|
+
// if (parseInt(values[0]) > 31 || parseInt(values[1]) > 12 || parseInt(values[2]) < 1000) return false;
|
|
375
|
+
return true;
|
|
376
|
+
}
|
|
377
|
+
function validate_date(value) {
|
|
378
|
+
if (!value || value.length < 10) {
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
const testData = new Date(value);
|
|
382
|
+
if (!testData.getTime()) {
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
387
|
+
export function validate_datetime(time, options = {}) {
|
|
388
|
+
if (!time) {
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
time = time.toString();
|
|
392
|
+
const values = time.split(' ');
|
|
393
|
+
if (validate_date(values[0]) && validate_time(values[1], options)) {
|
|
394
|
+
return true;
|
|
395
|
+
}
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
export function validate_datahora(time, options = {}) {
|
|
399
|
+
if (!time) {
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
time = time.toString();
|
|
403
|
+
const values = time.split(' ');
|
|
404
|
+
if (validate_data(values[0]) && validate_time(values[1], options)) {
|
|
405
|
+
return true;
|
|
406
|
+
}
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
export function validate_ect(number) {
|
|
410
|
+
number = getAllDigits(number);
|
|
411
|
+
if (number.length > 9) {
|
|
412
|
+
return false;
|
|
413
|
+
}
|
|
414
|
+
const nodigit = number.substr(0, number.length - 1);
|
|
415
|
+
const dg = create_ect(nodigit);
|
|
416
|
+
if (parseInt(number[number.length - 1]) === dg) {
|
|
417
|
+
return true;
|
|
418
|
+
}
|
|
419
|
+
return false;
|
|
420
|
+
}
|
|
421
|
+
function validate_email(email) {
|
|
422
|
+
var re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
423
|
+
return re.test(String(email).toLowerCase());
|
|
424
|
+
}
|
|
425
|
+
function validate_endereco(number) {
|
|
426
|
+
if (!number)
|
|
427
|
+
return false;
|
|
428
|
+
return true;
|
|
429
|
+
}
|
|
430
|
+
export function validate_number(number) {
|
|
431
|
+
if (number.split(',').length > 2) {
|
|
432
|
+
return false;
|
|
433
|
+
}
|
|
434
|
+
const regexDecimal = /^\d+(?:\.\d{0,2})$/;
|
|
435
|
+
const regex = /^[0-9]{0,10}[,]{1,1}[0-9]{0,4}/;
|
|
436
|
+
const regexNumero = /^[0-9]{0,10}/;
|
|
437
|
+
return regexDecimal.test(number) || regex.test(number) || regexNumero.test(number);
|
|
438
|
+
}
|
|
439
|
+
export function validate_porcentagem(porcentagem) {
|
|
440
|
+
porcentagem = porcentagem.split('%')[0];
|
|
441
|
+
return validate_number(porcentagem);
|
|
442
|
+
}
|
|
443
|
+
export function validate_processo(processo) {
|
|
444
|
+
let processoClean = processo.replace(/\./g, '');
|
|
445
|
+
processoClean = processoClean.replace(/\-/g, '');
|
|
446
|
+
// const exp = /\d{7}\-\d{2}\.\d{4}\.\w{3}\.\d{4}/;
|
|
447
|
+
// const expClean = /\d{13}\w{3}\d{4}/;
|
|
448
|
+
// if (!exp.test(processo) && !expClean.test(processoClean)) {
|
|
449
|
+
// return false;
|
|
450
|
+
// }
|
|
451
|
+
let processoValidado = create_processo(processo);
|
|
452
|
+
if (parseInt(processoClean) !== parseInt(getAllDigits(processoValidado))) {
|
|
453
|
+
return false;
|
|
454
|
+
}
|
|
455
|
+
return true;
|
|
456
|
+
}
|
|
457
|
+
export function validate_pispasep(number) {
|
|
458
|
+
number = getAllDigits(number);
|
|
459
|
+
let nis = fillString(number, 11, '0');
|
|
460
|
+
const regex = /\d{11}/; // /^\d{3}\.\d{5}\.\d{2}\-\d{1}$/;
|
|
461
|
+
if (!regex.test(nis)) {
|
|
462
|
+
return false;
|
|
463
|
+
}
|
|
464
|
+
const digit = create_pispasep(number);
|
|
465
|
+
return nis[10].toString() == digit.toString();
|
|
466
|
+
}
|
|
467
|
+
export function validate_renavam(renavam) {
|
|
468
|
+
let renavamClean = renavam.replace(/\./g, '');
|
|
469
|
+
renavamClean = renavamClean.replace(/\-/g, '');
|
|
470
|
+
const dv = create_renavam(renavam);
|
|
471
|
+
const tam = renavam.length;
|
|
472
|
+
const digitos = renavam.substr(tam - 1, 1);
|
|
473
|
+
if (digitos.charCodeAt(0) - 48 === dv) {
|
|
474
|
+
return true;
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
return false;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
export function validate_rg(rg) {
|
|
481
|
+
let rgClean = rg.replace(/\./g, '');
|
|
482
|
+
rgClean = rgClean.replace(/-/g, '');
|
|
483
|
+
const exp = /[a-z]{2}\-\d{2}\.\d{3}\.\d{3}/;
|
|
484
|
+
const expClean = /[a-z]{2}\d{8}/;
|
|
485
|
+
const state = rg.substr(0, 2).toUpperCase();
|
|
486
|
+
if (!exp.test(rg) && !expClean.test(rgClean) && !(state in CEPRange)) {
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
const validateState = RG[state];
|
|
490
|
+
if (validateState) {
|
|
491
|
+
return validateState(rg);
|
|
492
|
+
}
|
|
493
|
+
return true;
|
|
494
|
+
}
|
|
495
|
+
function validate_senha(value, options = {}) {
|
|
496
|
+
let finalregex = '^';
|
|
497
|
+
// ^ The password string will start this way
|
|
498
|
+
// (?=.*[a-z]) The string must contain at least 1 lowercase alphabetical character
|
|
499
|
+
if (options.lowercase !== false) {
|
|
500
|
+
finalregex = finalregex + '(?=.*[a-z])';
|
|
501
|
+
}
|
|
502
|
+
// (?=.*[A-Z]) The string must contain at least 1 uppercase alphabetical character
|
|
503
|
+
if (options.uppercase !== false) {
|
|
504
|
+
finalregex = finalregex + '(?=.*[A-Z])';
|
|
505
|
+
}
|
|
506
|
+
// (?=.*[0-9]) The string must contain at least 1 numeric character
|
|
507
|
+
if (options.numeric !== false) {
|
|
508
|
+
finalregex = finalregex + '(?=.*[0-9])';
|
|
509
|
+
}
|
|
510
|
+
// (?=.*[!@#\$%\^&\*]) The string must contain at least one special character, but we are escaping reserved RegEx characters to avoid conflict
|
|
511
|
+
if (options.numeric !== false) {
|
|
512
|
+
finalregex = finalregex + '(?=.*[!@#\\$%\\^&\\*])';
|
|
513
|
+
}
|
|
514
|
+
// (?=.{8,}) The string must be eight characters or longer
|
|
515
|
+
if (!options.size) {
|
|
516
|
+
options.size = 8;
|
|
517
|
+
}
|
|
518
|
+
finalregex = finalregex + `(?=.{${options.size},})`;
|
|
519
|
+
const regex = new RegExp(finalregex);
|
|
520
|
+
return regex.test(value);
|
|
521
|
+
}
|
|
522
|
+
function validate_site(value) {
|
|
523
|
+
var re = /(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&=]*)/g;
|
|
524
|
+
return re.test(String(value).toLowerCase());
|
|
525
|
+
}
|
|
526
|
+
export function validate_sped(sped) {
|
|
527
|
+
if (!sped)
|
|
528
|
+
return false;
|
|
529
|
+
return true;
|
|
530
|
+
}
|
|
531
|
+
export function validate_telefone(tel) {
|
|
532
|
+
const telClean = tel.replace(/[^\d]+/g, '');
|
|
533
|
+
tel = tel.replace(/_/g, '');
|
|
534
|
+
if (!(telClean.length === 10 || telClean.length === 11)) {
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
if (telClean[0] == 0 || telClean[2] == 0) {
|
|
538
|
+
return false;
|
|
539
|
+
}
|
|
540
|
+
return true;
|
|
541
|
+
}
|
|
542
|
+
export function validate_time(time, options = {}) {
|
|
543
|
+
const value = time.toString();
|
|
544
|
+
if (options.diario) {
|
|
545
|
+
const expression = /^([0-1]?[0-9]|2[0-4]):([0-5][0-9])(:[0-5][0-9])?$/;
|
|
546
|
+
return expression.test(value);
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
const expression = /^([0-9]?[0-9]):([0-5][0-9])(:[0-5][0-9])?$/;
|
|
550
|
+
return expression.test(value);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
export function validate_titulo(titulo) {
|
|
554
|
+
if (!titulo) {
|
|
555
|
+
return false;
|
|
556
|
+
}
|
|
557
|
+
const tituloClean = titulo.replace(/\./g, '');
|
|
558
|
+
const exp = /\d{4}\.\d{4}\.\d{4}/;
|
|
559
|
+
const expClean = /\d{4}\d{4}\d{4}/;
|
|
560
|
+
if (!exp.test(tituloClean) && !expClean.test(tituloClean)) {
|
|
561
|
+
return false;
|
|
562
|
+
}
|
|
563
|
+
const tam = tituloClean.length;
|
|
564
|
+
let dig;
|
|
565
|
+
try {
|
|
566
|
+
dig = create_titulo_atual(tituloClean);
|
|
567
|
+
// const noDv = tituloClean.substr(0, tam - 2);
|
|
568
|
+
// dig = create_titulo(noDv);
|
|
569
|
+
}
|
|
570
|
+
catch (e) {
|
|
571
|
+
return false;
|
|
572
|
+
}
|
|
573
|
+
const digitos = tituloClean.substr(tam - 2, 2);
|
|
574
|
+
if (digitos === dig) {
|
|
575
|
+
return true;
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
return false;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
function validate_username(value) {
|
|
582
|
+
var re = /^[a-z0-9_-]{3,16}$/igm;
|
|
583
|
+
return re.test(String(value).toLowerCase());
|
|
584
|
+
}
|
|
585
|
+
export const validateBr = {
|
|
586
|
+
aih: validate_aih,
|
|
587
|
+
cartaocredito: validate_cartaocredito,
|
|
588
|
+
celular: validate_celular,
|
|
589
|
+
cep: validate_cep,
|
|
590
|
+
certidao: validate_certidao,
|
|
591
|
+
chassi: validate_chassi,
|
|
592
|
+
cnae: validate_cnae,
|
|
593
|
+
cnh: validate_cnh,
|
|
594
|
+
cnhespelho: validate_cnhespelho,
|
|
595
|
+
renachestadual: validate_renachestadual,
|
|
596
|
+
renachseguranca: validate_renachseguranca,
|
|
597
|
+
cnpj: validate_cnpj,
|
|
598
|
+
cns: validate_cns,
|
|
599
|
+
contabanco: validate_contabanco,
|
|
600
|
+
cpf: validate_cpf,
|
|
601
|
+
cpfcnpj: validate_cpfcnpj,
|
|
602
|
+
currency: validate_currency,
|
|
603
|
+
data: validate_data,
|
|
604
|
+
date: validate_date,
|
|
605
|
+
datetime: validate_datetime,
|
|
606
|
+
datahora: validate_datahora,
|
|
607
|
+
ect: validate_ect,
|
|
608
|
+
email: validate_email,
|
|
609
|
+
endereco: validate_endereco,
|
|
610
|
+
inscricaoestadual: validate_inscricaoestadual,
|
|
611
|
+
iptu: validate_iptu,
|
|
612
|
+
number: validate_number,
|
|
613
|
+
porcentagem: validate_porcentagem,
|
|
614
|
+
pispasep: validate_pispasep,
|
|
615
|
+
placa: validate_placa,
|
|
616
|
+
processo: validate_processo,
|
|
617
|
+
renavam: validate_renavam,
|
|
618
|
+
rg: validate_rg,
|
|
619
|
+
senha: validate_senha,
|
|
620
|
+
site: validate_site,
|
|
621
|
+
sped: validate_sped,
|
|
622
|
+
telefone: validate_telefone,
|
|
623
|
+
time: validate_time,
|
|
624
|
+
titulo: validate_titulo,
|
|
625
|
+
username: validate_username
|
|
626
|
+
};
|
|
627
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBhLWxpYnJhcnktdWkvc3JjL2xpYi9jb3JlL2pzLWJyYXNpbC9zcmMvdmFsaWRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUNMLFdBQVcsRUFBRSxVQUFVLEVBQ3ZCLGNBQWMsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFDN0wsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUcxQyxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVc7SUFDdEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxPQUFPLFVBQVUsS0FBSyxFQUFFLENBQUM7QUFDM0IsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFRO0lBQ3ZDLElBQUksUUFBUSxHQUFH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ZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBCaWdPYmplY3QgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVfaW5zY3JpY2FvZXN0YWR1YWwgfSBmcm9tICcuL2luc2NyaWNhb2VzdGFkdWFsJztcbmltcG9ydCB7IHZhbGlkYXRlX3BsYWNhIH0gZnJvbSAnLi9wbGFjYSc7XG5pbXBvcnQge1xuICBjcmVhdGVfY25waiwgY3JlYXRlX2NwZixcbiAgY3JlYXRlX3JlbmF2YW0sIGNyZWF0ZV9lY3QsIGNyZWF0ZV9wcm9jZXNzbywgY3JlYXRlX3RpdHVsb19hdHVhbCwgY3JlYXRlX2NuaCwgY3JlYXRlX2NlcnRpZGFvLCBjcmVhdGVfYWloLCBjcmVhdGVfcGlzcGFzZXAsIGNyZWF0ZV9jbmhlc3BlbGhvLCBjcmVhdGVfcmVuYWNoZXN0YWR1YWwsIGNyZWF0ZV9yZW5hY2hzZWd1cmFuY2Fcbn0gZnJvbSAnLi9jcmVhdGUnO1xuaW1wb3J0IFJHIGZyb20gJy4vcmcnO1xuaW1wb3J0IHsgdmFsaWRhdGVfaXB0dSB9IGZyb20gJy4vaXB0dSc7XG5pbXBvcnQgeyBFU1RBRE9TX1NJR0xBIH0gZnJvbSAnLi9lc3RhZG9zJztcblxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfYWloKGFpaDogc3RyaW5nKSB7XG4gIGNvbnN0IGFpaENsZWFuID0gYWloLnJlcGxhY2UoL1teXFxkXSsvZywgJycpO1xuICBjb25zdCBkdk9yaWdpbmFsID0gYWloQ2xlYW4uc3Vic3RyKC0xKTtcbiAgY29uc3QgZHYgPSBjcmVhdGVfYWloKGFpaENsZWFuKTtcbiAgcmV0dXJuIGR2T3JpZ2luYWwgPT09IGR2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfY2VsdWxhcihjZWw6IGFueSkge1xuICBsZXQgY2VsQ2xlYW4gPSBjZWwucmVwbGFjZSgvW15cXGRdKy9nLCAnJyk7XG4gIGNlbENsZWFuID0gY2VsQ2xlYW4ucmVwbGFjZSgvXy9nLCAnJyk7XG4gIGlmIChjZWxDbGVhbi5sZW5ndGggIT09IDExKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChjZWxDbGVhblswXSA9PSAwIHx8IGNlbENsZWFuWzJdIDwgNSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IENFUFJhbmdlOiBCaWdPYmplY3Q8UmVnRXhwPiA9IHtcbiAgJ1NQJzogL14oWzFdWzAtOV17M318WzAxXVswLTldezR9KVswLTldezN9JC9nLFxuICAnUkonOiAvXlsyXVswLThdWzAtOV17M31bMC05XXszfSQvZyxcbiAgJ01TJzogL15bN11bOV1bMC05XXszfVswLTldezN9JC9nLFxuICAnTUcnOiAvXlszXVswLTldezR9WzAtOV17M30kL2csXG4gICdNVCc6IC9eWzddWzhdWzhdWzAtOV17Mn1bMC05XXszfSQvZyxcbiAgJ0FDJzogL15bNl1bOV17Mn1bMC05XXsyfVswLTldezN9JC9nLFxuICAnQUwnOiAvXls1XVs3XVswLTldezN9WzAtOV17M30kL2csXG4gICdBTSc6IC9eWzZdWzldWzAtOF1bMC05XXsyfVswLTldezN9JC9nLFxuICAnQVAnOiAvXls2XVs4OV1bOV1bMC05XXsyfVswLTldezN9JC9nLFxuICAnQkEnOiAvXls0XVswLThdWzAtOV17M31bMC05XXszfSQvZyxcbiAgJ0NFJzogL15bNl1bMC0zXVswLTldezN9WzAtOV17M30kL2csXG4gICdERic6IC9eWzddWzAtM11bMC02XVswLTldezJ9WzAtOV17M30kL2csXG4gICdFUyc6IC9eWzJdWzldWzAtOV17M31bMC05XXszfSQvZyxcbiAgJ0dPJzogL15bN11bMy02XVs3LTldWzAtOV17Mn1bMC05XXszfSQvZyxcbiAgJ01BJzogL15bNl1bNV1bMC05XXszfVswLTldezN9JC9nLFxuICAnUEEnOiAvXls2XVs2LThdWzAtOF1bMC05XXsyfVswLTldezN9JC9nLFxuICAnUEInOiAvXls1XVs4XVswLTldezN9WzAtOV17M30kL2csXG4gICdQRSc6IC9eWzVdWzAtNl1bMC05XXsyfVswLTldezN9JC9nLFxuICAnUEknOiAvXls2XVs0XVswLTldezN9WzAtOV17M30kL2csXG4gICdQUic6IC9eWzhdWzAtN11bMC05XXszfVswLTldezN9JC9nLFxuICAnUk4nOiAvXls1XVs5XVswLTldezN9WzAtOV17M30kL2csXG4gICdSTyc6IC9eWzddWzhdWzldWzAtOV17Mn1bMC05XXszfSQvZyxcbiAgJ1JSJzogL15bNl1bOV1bM11bMC05XXsyfVswLTldezN9JC9nLFxuICAnUlMnOiAvXls5XVswLTldezR9WzAtOV17M30kL2csXG4gICdTQyc6IC9eWzhdWzg5XVswLTldezN9WzAtOV17M30kL2csXG4gICdTRSc6IC9eWzRdWzldWzAtOV17M31bMC05XXszfSQvZyxcbiAgJ1RPJzogL15bN11bN11bMC05XXszfVswLTldezN9JC9nLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfY2VwKGNlcDogc3RyaW5nKSB7XG4gIGNvbnN0IGNlcENsZWFuID0gY2VwLnJlcGxhY2UoL1teXFxkXSsvZywgJycpO1xuICBjb25zdCBleHAgPSAvXFxkezJ9XFwuXFxkezN9XFwtXFxkezN9LztcbiAgaWYgKCFleHAudGVzdChjZXApICYmIGNlcENsZWFuLmxlbmd0aCAhPT0gOCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2VwX3JhbmdlcyhjZXA6IHN0cmluZyB8IG51bWJlcikge1xuICBjZXAgPSAoY2VwLnRvU3RyaW5nKCkpLnJlcGxhY2UoL1teXFxkXSsvZywgJycpO1xuICBjZXAgPSBwYXJzZUludChjZXAsIDEwKTtcbiAgY29uc3QgY2VwU3RyaW5nOiBzdHJpbmcgPSBjZXAudG9TdHJpbmcoKTtcbiAgbGV0IGZvdW5kOiBhbnk7XG4gIGZvciAobGV0IGVzdGFkbyBpbiBDRVBSYW5nZSkge1xuICAgIGNvbnN0IHYgPSBDRVBSYW5nZVtlc3RhZG9dO1xuICAgIGNvbnN0IHIgPSBuZXcgUmVnRXhwKHYpLnRlc3QoY2VwU3RyaW5nKTtcbiAgICBpZiAocikge1xuICAgICAgZm91bmQgPSByO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFmb3VuZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX2NlcnRpZGFvKHZhbHVlOiBzdHJpbmcpIHtcbiAgbGV0IGNlcnRpZGFvID0gZ2V0QWxsRGlnaXRzKHZhbHVlKTtcblxuICBjb25zdCBmb3JtYXQgPSAvWzAtOV17MzJ9LztcbiAgaWYgKCFmb3JtYXQudGVzdChjZXJ0aWRhbykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgZHZPcmlnaW5hbCA9IGNlcnRpZGFvLnN1YnN0cigtMik7XG4gIGNvbnN0IGR2ID0gY3JlYXRlX2NlcnRpZGFvKGNlcnRpZGFvKTtcblxuICByZXR1cm4gZHYgPT09IGR2T3JpZ2luYWw7XG59XG5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSBjaGFzc2kgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9jaGFzc2koY2hhc3NpOiBzdHJpbmcpIHtcblxuICAvLyAxIC0gUG9zc3VpciBvIG7Dum1lcm8gXCIwXCIgKFpFUk8pIGNvbW8gMcK6IGTDrWdpdG8uXG4gIGNvbnN0IHplcm9Ob1ByaW1laXJvRGlnaXRvID0gL14wLztcbiAgaWYgKHplcm9Ob1ByaW1laXJvRGlnaXRvLnRlc3QoY2hhc3NpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIDIgLSBQb3NzdWlyIGVzcGHDp28gbm8gY2hhc3NpXG4gIGNoYXNzaSA9IGdldEFsbFdvcmRzKGNoYXNzaSk7IC8vIGVzcGFjb05vQ2hhc3NpXG5cbiAgLy8gMyAtIFNlLCBhIHBhcnRpciBkbyA0wrogZMOtZ2l0bywgaG91dmVyIHVtYSByZXBldGnDp8OjbyBjb25zZWN1dGl2YSwgcG9yIG1haXMgZGUgc2VpcyB2ZXplcywgZG8gbWVzbW8gZMOtZ2l0byBcbiAgLy8gKGFsZmFiw6l0aWNvIG91IG51bcOpcmljbykuIEV4ZW1wbG9zOiA5QlcxMTExMTExOTQ1MjY4NyBlIDlCV1paWjUyNjhBQUFBQUFBLlxuICBjb25zdCByZXBldGljYW9NYWlzRGU2VmV6ZXMgPSAvXi57NCx9KFswLTlBLVpdKVxcMXs1LH0vXG4gIGlmIChyZXBldGljYW9NYWlzRGU2VmV6ZXMudGVzdChjaGFzc2kpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gNCAtIEFwcmVzZW50ZSBvcyBjYXJhY3RlcmVzIFwiaVwiLCBcIklcIiwgXCJvXCIsIFwiT1wiLCBcInFcIiwgXCJRXCIuXG4gIGNvbnN0IGNhcmFjdGVyZXNpSW9PcVEgPSAvW2lJb09xUV0vO1xuICBpZiAoY2FyYWN0ZXJlc2lJb09xUS50ZXN0KGNoYXNzaSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyA1IC0gT3MgcXVhdHJvIMO6bHRpbW9zIGNhcmFjdGVyZXMgZGV2ZW0gc2VyIG9icmlnYXRvcmlhbWVudGUgbnVtw6lyaWNvc1xuICBjb25zdCB1bHRpbW9zNE51bWVyaWNvcyA9IC9bMC05XXs0fSQvO1xuICBpZiAoIXVsdGltb3M0TnVtZXJpY29zLnRlc3QoY2hhc3NpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIDYgLSBTZSBwb3NzdWlyIG7Dum1lcm8gZGUgZMOtZ2l0b3MgZGlmZXJlbnRlIGRlIDE3IChhbGZhbnVtw6lyaWNvcykuIFxuICBpZiAoY2hhc3NpLmxlbmd0aCA+IDE3KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlX2NuYWUobnVtYmVyOiBhbnkpIHtcbiAgaWYgKCFudW1iZXIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBcbiAqIElJIC0gTsO6bWVybyBkbyBFc3BlbGhvIGRhIENOSCAtIHNlZ3VuZG8gbsO6bWVybyBkZSBpZGVudGlmaWNhw6fDo28gbmFjaW9uYWwsIFxuICogcXVlIHNlcsOhIGZvcm1hZG8gcG9yIDkgKG5vdmUpIGNhcmFjdGVyZXMgbWFpcyAxICh1bSkgZMOtZ2l0byB2ZXJpZmljYWRvciBkZSBzZWd1cmFuw6dhLCBcbiAqIGF1dG9yaXphZG8gZSBjb250cm9sYWRvIHBlbG8gREVOQVRSQU4sIGUgaWRlbnRpZmljYXLDoSBjYWRhIGVzcGVsaG8gZGUgQ05IIGV4cGVkaWRhLlxuICogaHR0cHM6Ly93d3cuZ292LmJyL2luZnJhZXN0cnV0dXJhL3B0LWJyL2Fzc3VudG9zL3RyYW5zaXRvL2NvbnRldWRvLWRlbmF0cmFuL3Jlc29sdWNvZXMtY29udHJhblxuICogaHR0cHM6Ly93d3cuZ292LmJyL2luZnJhZXN0cnV0dXJhL3B0LWJyL2Fzc3VudG9zL3RyYW5zaXRvL2NvbnRldWRvLWNvbnRyYW4vcmVzb2x1Y29lcy9yZXNvbHVjYW81MTEyMDE0LnBkZlxuICogNTk4OiBodHRwczovL3d3dy5nb3YuYnIvaW5mcmFlc3RydXR1cmEvcHQtYnIvYXNzdW50b3MvdHJhbnNpdG8vY29udGV1ZG8tY29udHJhbi9yZXNvbHVjb2VzL3Jlc29sdWNhbzU5ODIwMTYyLnBkZlxuICogQHBhcmFtIHZhbHVlIFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfY25oZXNwZWxobyh2YWx1ZTogc3RyaW5nKSB7XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXGRdL2csICcnKVxuICBpZiAodmFsdWUubGVuZ3RoICE9PSAxMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IGNoZWNrID0gY3JlYXRlX2NuaGVzcGVsaG8odmFsdWUpXG4gIGlmIChjaGVjayA9PT0gJzAnIHx8IGNoZWNrID09PSAnMScpIGNoZWNrID0gJzAnXG4gIHJldHVybiB2YWx1ZS5zdWJzdHIoLTEpID09IGNoZWNrXG59XG5cbi8qKlxuICogXG4gKiBJSUkg4oCTIE7Dum1lcm8gZG8gZm9ybXVsw6FyaW8gUkVOQUNIIC0gbsO6bWVybyBkZSBpZGVudGlmaWNhw6fDo29cbiogZXN0YWR1YWwsIGRvY3VtZW50byBkZSBjb2xldGEgZGUgZGFkb3MgZG8gY2FuZGlkYXRvL2NvbmR1dG9yIGdlcmFkbyBhIGNhZGEgc2VydmnDp28sXG4qIGNvbXBvc3RvLCBvYnJpZ2F0b3JpYW1lbnRlLCBwb3IgMTEgKG9uemUpIGNhcmFjdGVyZXMsIHNlbmRvIGFzIGR1YXMgcHJpbWVpcmFzXG4qIHBvc2nDp8O1ZXMgZm9ybWFkYXMgcGVsYSBzaWdsYSBkYSBVbmlkYWRlIGRlIEZlZGVyYcOnw6NvIGV4cGVkaWRvcmEsIGZhY3VsdGFkYSBhXG4qIHV0aWxpemHDp8OjbyBkYSDDumx0aW1hIHBvc2nDp8OjbyBjb21vIGTDrWdpdG8gdmVyaWZpY2Fkb3IgZGUgc2VndXJhbsOnYS5cbiogIGEpIE8gbsO6bWVybyBkbyBmb3JtdWzDoXJpbyBSRU5BQ0ggaWRlbnRpZmljYXLDoSBhIFVuaWRhZGUgZGFcbiogRmVkZXJhw6fDo28gb25kZSBvIGNvbmR1dG9yIGZvaSBoYWJpbGl0YWRvIG91IHJlYWxpem91IGFsdGVyYcOnw7VlcyBkZSBkYWRvcyBubyBzZXVcbiogY2FkYXN0cm8gcGVsYSDDumx0aW1hIHZlei5cbiogIGIpIE8gRm9ybXVsw6FyaW8gUkVOQUNIIHF1ZSBkw6Egb3JpZ2VtIMOgcyBpbmZvcm1hw6fDtWVzIG5hXG4qIEJJTkNPIGUgYXV0b3JpemHDp8OjbyBwYXJhIGEgaW1wcmVzc8OjbyBkYSBDTkggZGV2ZXLDoSBmaWNhciBhcnF1aXZhZG8gZW0gc2VnXG4qIDU5OCAtIGh0dHBzOi8vd3d3Lmdvdi5ici9pbmZyYWVzdHJ1dHVyYS9wdC1ici9hc3N1bnRvcy90cmFuc2l0by9jb250ZXVkby1jb250cmFuL3Jlc29sdWNvZXMvcmVzb2x1Y2FvNTk4MjAxNjIucGRmXG4qIDcxOCAtIGh0dHBzOi8vd3d3Lmdvdi5ici9pbmZyYWVzdHJ1dHVyYS9wdC1ici9hc3N1bnRvcy90cmFuc2l0by9jb250ZXVkby1jb250cmFuL3Jlc29sdWNvZXMvcmVzb2x1Y2FvNzE4MjAxNy5wZGZcbiogQHBhcmFtIHZhbHVlIFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfcmVuYWNoZXN0YWR1YWwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCBzdGF0ZSA9IHZhbHVlLnN1YnN0cigwLCAyKS50b0xvd2VyQ2FzZSgpXG4gIGlmICghRVNUQURPU19TSUdMQS5pbmNsdWRlcyhzdGF0ZSkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGxldCBkaWdpdHMgPSB2YWx1ZS5zdWJzdHIoMilcbiAgZGlnaXRzID0gZGlnaXRzLnJlcGxhY2UoL1teXFxkXS9nLCAnJyk7XG4gIGlmIChkaWdpdHMubGVuZ3RoICE9PSA5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBjaGVjayA9IGNyZWF0ZV9yZW5hY2hlc3RhZHVhbCh2YWx1ZSlcbiAgaWYgKGNoZWNrID09PSAnMCcgfHwgY2hlY2sgPT09ICcxJykgY2hlY2sgPSAnMCdcbiAgcmV0dXJuIHZhbHVlLnN1YnN0cigtMSkgPT0gY2hlY2s7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9yZW5hY2hzZWd1cmFuY2EodmFsdWU6IHN0cmluZykge1xuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxkXS9nLCAnJyk7XG5cbiAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgY2hlY2sgPSBjcmVhdGVfcmVuYWNoc2VndXJhbmNhKHZhbHVlKVxuICByZXR1cm4gdmFsdWUuc3Vic3RyKC0xKSA9PSBjaGVjaztcbn1cblxuLyoqXG4gKiBCSU5DT1xuICogSSDigJMgbyBwcmltZWlybyBuw7ptZXJvIGRlIGlkZW50aWZpY2HDp8OjbyBuYWNpb25hbCDigJMgUmVnaXN0cm8gTmFjaW9uYWwsIFxuICogc2Vyw6EgZ2VyYWRvIHBlbG8gc2lzdGVtYSBpbmZvcm1hdGl6YWRvIGRhIEJhc2Ugw41uZGljZSBOYWNpb25hbCBkZSBDb25kdXRvcmVzIOKAkyBcbiAqIEJJTkNPLCBjb21wb3N0byBkZSA5IChub3ZlKSBjYXJhY3RlcmVzIG1haXMgMiAoZG9pcykgZMOtZ2l0b3MgdmVyaWZpY2Fkb3JlcyBkZSBcbiAqIHNlZ3VyYW7Dp2EsIHNlbmRvIMO6bmljbyBwYXJhIGNhZGEgY29uZHV0b3IgZSBvIGFjb21wYW5oYXLDoSBkdXJhbnRlIHRvZGEgYSBcbiAqIHN1YSBleGlzdMOqbmNpYSBjb21vIGNvbmR1dG9yLCBuw6NvIHNlbmRvIHBlcm1pdGlkYSBhIHN1YSByZXV0aWxpemHDp8OjbyBwYXJhIFxuICogb3V0cm8gY29uZHV0b3IuXG4gKiBAcGFyYW0gdmFsdWUgXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX2NuaCh2YWx1ZTogc3RyaW5nKSB7XG4gIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKC9bXlxcZF0vZywgJycpO1xuICBpZiAodmFsdWUubGVuZ3RoICE9PSAxMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsZXQgY2hlY2sgPSBjcmVhdGVfY25oKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlLnN1YnN0cigtMikgPT0gY2hlY2s7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9jbnBqKGNucGo6IGFueSkge1xuICAvLyBWYWxpZGEgc2UgdGVtIGFwZW5hcyBuw7ptZXJvLCAtIG91IC5cbiAgbGV0IHByZWNpc2FGaWNhclZhemlvID0gY25wai5yZXBsYWNlKC9eWzAtOS4vLV0qJC9nbSwgJycpXG4gIGlmIChwcmVjaXNhRmljYXJWYXppbyAhPSAnJylcbiAgICByZXR1cm4gZmFsc2VcblxuICBjbnBqID0gY25wai5yZXBsYWNlKC9bXlxcZF0rL2csICcnKTtcbiAgbGV0IHRhbWFuaG8gPSBjbnBqLmxlbmd0aCAtIDJcbiAgY29uc3QgZGlnaXRvcyA9IGNucGouc3Vic3RyaW5nKHRhbWFuaG8pO1xuICBjb25zdCByZXN1bHRhZG9zID0gY3JlYXRlX2NucGooY25waik7XG4gIGlmICghcmVzdWx0YWRvcyB8fFxuICAgIHJlc3VsdGFkb3NbMF0gIT09IHBhcnNlSW50KGRpZ2l0b3MuY2hhckF0KDApLCAxMCkgfHxcbiAgICByZXN1bHRhZG9zWzFdICE9PSBwYXJzZUludChkaWdpdG9zLmNoYXJBdCgxKSwgMTApXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlX2NvbnRhYmFuY28obnVtYmVyOiBhbnkpIHtcbiAgaWYgKCFudW1iZXIpIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2lhOiBodHRwOi8vd3d3LnJlY2VpdGEuZmF6ZW5kYS5nb3YuYnIvYXBsaWNhY29lcy9hdGN0YS9mdW5jb2VzLmpzXG4gKiBAcGFyYW0gc3RyQ1BGIFxuICogQHJldHVybnMgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9jcGYoc3RyQ1BGOiBhbnkpIHtcbiAgLy8gVmFsaWRhIHNlIHRlbSBhcGVuYXMgbsO6bWVybywgLSBvdSAuXG4gIGxldCBwcmVjaXNhRmljYXJWYXppbyA9IHN0ckNQRi5yZXBsYWNlKC9eWzAtOS4tXSokL2dtLCAnJylcbiAgaWYgKHByZWNpc2FGaWNhclZhemlvICE9ICcnKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIHN0ckNQRiA9IHN0ckNQRi5yZXBsYWNlKC9bXlxcZF0rL2csICcnKTtcbiAgaWYgKHN0ckNQRi5sZW5ndGggIT09IDExKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy92ZXJpZmljYSBzZSB0b2RvcyBvcyBudW1lcm9zIHNhbyBpZ3VhaXNcbiAgY29uc3QgZXhwSWd1YWlzID0gL14oPyEuKihcXGQpXFwxezEwfSkuKiQvO1xuICBpZiAoIXN0ckNQRi5tYXRjaChleHBJZ3VhaXMpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gdmFsaWRhIGRpZ2l0byB2ZXJpZmljYWRvc1xuICBjb25zdCByZXN0b3MgPSBjcmVhdGVfY3BmKHN0ckNQRik7XG4gIGlmICghcmVzdG9zIHx8IHJlc3RvcyAhPSBzdHJDUEYuc3Vic3RyKC0yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVfY3BmY25waihudW1iZXI6IGFueSkge1xuICByZXR1cm4gdmFsaWRhdGVfY3BmKG51bWJlcikgfHwgdmFsaWRhdGVfY25waihudW1iZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfY25zKHZhbHVlOiBzdHJpbmcpIHtcbiAgY29uc3QgY25zID0gZ2V0QWxsRGlnaXRzKHZhbHVlKTtcbiAgY29uc3QgZGVmaW5pdGl2byA9IC9bMS0yXVswLTldezEwfTAwWzAtMV1bMC05XS87IC8vIGNvbWXDp2FtIGNvbSAxIG91IDJcbiAgY29uc3QgcHJvdmlzb3JpbyA9IC9bNy05XVswLTldezE0fS87ICAgICAgICAgICAgICAvLyBjb21lw6dhbSBjb20gNyw4IG91IDlcbiAgaWYgKCFkZWZpbml0aXZvLnRlc3QoY25zKSAmJiAhcHJvdmlzb3Jpby50ZXN0KGNucykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgc29tYSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY25zLmxlbmd0aDsgaSsrKSB7XG4gICAgc29tYSArPSBwYXJzZUludChjbnNbaV0pICogKDE1IC0gaSk7XG4gIH1cblxuICByZXR1cm4gc29tYSAlIDExID09IDA7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX2NhcnRhb2NyZWRpdG8oaW5wdXQ6IHN0cmluZyB8IG51bWJlcikge1xuICBsZXQgdmFsdWU6IHN0cmluZztcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gZ2V0QWxsRGlnaXRzKGlucHV0KTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGlucHV0LnRvU3RyaW5nKCk7XG4gIH1cblxuICBjb25zdCBudW1iZXIgPSB2YWx1ZS5zbGljZSgwLCAxNik7XG4gIGNvbnN0IG1lcyA9IHBhcnNlSW50KHZhbHVlLnNsaWNlKDE2LCAxOCkpO1xuICBjb25zdCBhbm8gPSBwYXJzZUludCh2YWx1ZS5zbGljZSgxOCwgMjApKTtcbiAgY29uc3QgY3Z2ID0gdmFsdWUuc2xpY2UoMjAsIDIzKTtcblxuICBjb25zdCBkID0gbmV3IERhdGUoKTtcbiAgY29uc3QgYW5vQXR1YWwgPSAoZC5nZXRGdWxsWWVhcigpIC0gMjAwMCk7XG4gIGlmIChhbm8gJiYgYW5vIDwgYW5vQXR1YWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG1lcyAmJiBtZXMgPCBkLmdldE1vbnRoKCkgKyAxICYmIGFubyA9PT0gYW5vQXR1YWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoY3Z2KSB7XG4gICAgY29uc3QgdmFsaWRjdnYgPSB2YWxpZGF0ZV9jdnYoY3Z2KTtcbiAgICBpZiAodmFsaWRjdnYuaXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBsZXQgZm91bmQ7XG4gIE9iamVjdC5rZXlzKGNyZWRpdENhcmRWYWxpZGF0b3IpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAoY3JlZGl0Q2FyZFZhbGlkYXRvcltrZXldLnRlc3QobnVtYmVyKSkge1xuICAgICAgZm91bmQgPSBrZXk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuICEhZm91bmQ7XG5cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVfY3Z2KHZhbHVlOiBzdHJpbmcgfCBhbnlbXSwgbWF4TGVuZ3RoOiBhbnkgPSAzKSB7XG4gIG1heExlbmd0aCA9IG1heExlbmd0aCBpbnN0YW5jZW9mIEFycmF5ID8gbWF4TGVuZ3RoIDogW21heExlbmd0aF07XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgaXNQb3RlbnRpYWxseVZhbGlkOiBmYWxzZSB9O1xuICB9XG4gIGlmICghL15cXGQqJC8udGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgaXNQb3RlbnRpYWxseVZhbGlkOiBmYWxzZSB9O1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICBjb25zdCBtYXggPSB2YWx1ZS5sZW5ndGg7XG4gIGZvciAoOyBpIDwgbWF4TGVuZ3RoLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG1heCA9PT0gbWF4TGVuZ3RoW2ldKSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBpc1BvdGVudGlhbGx5VmFsaWQ6IHRydWUgfTtcbiAgICB9XG4gIH1cblxuICBpZiAodmFsdWUubGVuZ3RoIDwgTWF0aC5taW4uYXBwbHkobnVsbCwgbWF4TGVuZ3RoKSkge1xuICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBpc1BvdGVudGlhbGx5VmFsaWQ6IHRydWUgfTtcbiAgfVxuXG4gIHZhciBtYXhpbXVtID0gbWF4TGVuZ3RoO1xuICB2YXIgaSA9IDA7XG5cbiAgZm9yICg7IGkgPCBtYXhMZW5ndGgubGVuZ3RoOyBpKyspIHtcbiAgICBtYXhpbXVtID0gbWF4TGVuZ3RoW2ldID4gbWF4aW11bSA/IG1heExlbmd0aFtpXSA6IG1heGltdW07XG4gIH1cblxuICBpZiAodmFsdWUubGVuZ3RoID4gbWF4aW11bSkge1xuICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBpc1BvdGVudGlhbGx5VmFsaWQ6IGZhbHNlIH07XG4gIH1cblxuICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBpc1BvdGVudGlhbGx5VmFsaWQ6IHRydWUgfTtcbn1cblxuXG4vKipcbiAqICAgICBBIGhhc2ggb2YgdmFsaWQgQ0MgYWJicmV2aWF0aW9ucyBhbmQgcmVndWxhciBleHByZXNzaW9uc1xuICAgIG1jOiBNYXN0ZXJjYXJkXG4gICAgZWM6IEV1cm9jYXJkXG4gICAgdmk6IFZpc2FcbiAgICBheDogQW1lcmljYW4gRXhwcmVzc1xuICAgIGRjOiBEaW5lcnMgQ2x1YlxuICAgIGJsOiBDYXJ0ZSBCbGFuY2hcbiAgICBkaTogRGlzY292ZXJcbiAgICBqY2I6IEpDQlxuICAgIGVyOiBFbnJvdXRlXG4qL1xuZXhwb3J0IGNvbnN0IGNyZWRpdENhcmRWYWxpZGF0b3I6IEJpZ09iamVjdDxSZWdFeHA+ID0ge1xuICAnbWMnOiAvNVsxLTVdWzAtOV17MTR9LyxcbiAgJ2VjJzogLzVbMS01XVswLTldezE0fS8sXG4gICd2aSc6IC80KD86WzAtOV17MTJ9fFswLTldezE1fSkvLFxuICAnYXgnOiAvM1s0N11bMC05XXsxM30vLFxuICAnZGMnOiAvMyg/OjBbMC01XVswLTldezExfXxbNjhdWzAtOV17MTJ9KS8sXG4gICdibCc6IC8zKD86MFswLTVdWzAtOV17MTF9fFs2OF1bMC05XXsxMn0pLyxcbiAgJ2RpJzogLzYwMTFbMC05XXsxMn0vLFxuICAnamNiJzogLyg/OjNbMC05XXsxNX18KDIxMzF8MTgwMClbMC05XXsxMX0pLyxcbiAgJ2VyJzogLzIoPzowMTR8MTQ5KVswLTldezExfS9cbn07XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX2N1cnJlbmN5KGN1cnJlbmN5OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgaWYgKHR5cGVvZiBjdXJyZW5jeSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZWdleCA9IC9eKFJcXCR8UlxcJCApPygtKT8oPyEwKFxcLik/MDApXFxkezEsM30oKFxcLik/XFxkezN9KSooLFxcZFxcZCk/JC9nO1xuICByZXR1cm4gcmVnZXgudGVzdChjdXJyZW5jeSk7XG59XG5cblxuZnVuY3Rpb24gdmFsaWRhdGVfZGF0YSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHZhbHVlcyA9IHZhbHVlLnNwbGl0KCcvJyk7XG4gIGlmICh2YWx1ZXMubGVuZ3RoICE9PSAzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHRlc3REYXRhOiBEYXRlID0gbmV3IERhdGUodmFsdWVzWzFdICsgJy8nICsgdmFsdWVzWzBdICsgJy8nICsgdmFsdWVzWzJdKVxuICBpZiAoIXRlc3REYXRhLmdldFRpbWUoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBpZiAocGFyc2VJbnQodmFsdWVzWzBdKSA+IDMxIHx8IHBhcnNlSW50KHZhbHVlc1sxXSkgPiAxMiB8fCBwYXJzZUludCh2YWx1ZXNbMl0pIDwgMTAwMCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZV9kYXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoIDwgMTApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgdGVzdERhdGE6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKCF0ZXN0RGF0YS5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9kYXRldGltZSh0aW1lOiBzdHJpbmcgfCBudW1iZXIsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gIGlmICghdGltZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0aW1lID0gdGltZS50b1N0cmluZygpO1xuICBjb25zdCB2YWx1ZXMgPSB0aW1lLnNwbGl0KCcgJyk7XG4gIGlmICh2YWxpZGF0ZV9kYXRlKHZhbHVlc1swXSkgJiYgdmFsaWRhdGVfdGltZSh2YWx1ZXNbMV0sIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9kYXRhaG9yYSh0aW1lOiBzdHJpbmcgfCBudW1iZXIsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gIGlmICghdGltZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0aW1lID0gdGltZS50b1N0cmluZygpO1xuICBjb25zdCB2YWx1ZXMgPSB0aW1lLnNwbGl0KCcgJyk7XG4gIGlmICh2YWxpZGF0ZV9kYXRhKHZhbHVlc1swXSkgJiYgdmFsaWRhdGVfdGltZSh2YWx1ZXNbMV0sIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfZWN0KG51bWJlcjogc3RyaW5nKSB7XG4gIG51bWJlciA9IGdldEFsbERpZ2l0cyhudW1iZXIpO1xuICBpZiAobnVtYmVyLmxlbmd0aCA+IDkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IG5vZGlnaXQgPSBudW1iZXIuc3Vic3RyKDAsIG51bWJlci5sZW5ndGggLSAxKTtcbiAgY29uc3QgZGcgPSBjcmVhdGVfZWN0KG5vZGlnaXQpO1xuXG4gIGlmIChwYXJzZUludChudW1iZXJbbnVtYmVyLmxlbmd0aCAtIDFdKSA9PT0gZGcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlX2VtYWlsKGVtYWlsOiBhbnkpIHtcbiAgdmFyIHJlID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC9cbiAgcmV0dXJuIHJlLnRlc3QoU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpKVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZV9lbmRlcmVjbyhudW1iZXI6IGFueSkge1xuICBpZiAoIW51bWJlcikgcmV0dXJuIGZhbHNlXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9udW1iZXIobnVtYmVyOiBzdHJpbmcpIHtcbiAgaWYgKG51bWJlci5zcGxpdCgnLCcpLmxlbmd0aCA+IDIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCByZWdleERlY2ltYWwgPSAvXlxcZCsoPzpcXC5cXGR7MCwyfSkkLztcbiAgY29uc3QgcmVnZXggPSAvXlswLTldezAsMTB9WyxdezEsMX1bMC05XXswLDR9LztcbiAgY29uc3QgcmVnZXhOdW1lcm8gPSAvXlswLTldezAsMTB9LztcbiAgcmV0dXJuIHJlZ2V4RGVjaW1hbC50ZXN0KG51bWJlcikgfHwgcmVnZXgudGVzdChudW1iZXIpIHx8IHJlZ2V4TnVtZXJvLnRlc3QobnVtYmVyKTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfcG9yY2VudGFnZW0ocG9yY2VudGFnZW06IHN0cmluZykge1xuICBwb3JjZW50YWdlbSA9IHBvcmNlbnRhZ2VtLnNwbGl0KCclJylbMF07XG4gIHJldHVybiB2YWxpZGF0ZV9udW1iZXIocG9yY2VudGFnZW0pO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9wcm9jZXNzbyhwcm9jZXNzbzogYW55KSB7XG4gIGxldCBwcm9jZXNzb0NsZWFuID0gcHJvY2Vzc28ucmVwbGFjZSgvXFwuL2csICcnKTtcbiAgcHJvY2Vzc29DbGVhbiA9IHByb2Nlc3NvQ2xlYW4ucmVwbGFjZSgvXFwtL2csICcnKTtcbiAgLy8gY29uc3QgZXhwID0gL1xcZHs3fVxcLVxcZHsyfVxcLlxcZHs0fVxcLlxcd3szfVxcLlxcZHs0fS87XG4gIC8vIGNvbnN0IGV4cENsZWFuID0gL1xcZHsxM31cXHd7M31cXGR7NH0vO1xuICAvLyBpZiAoIWV4cC50ZXN0KHByb2Nlc3NvKSAmJiAhZXhwQ2xlYW4udGVzdChwcm9jZXNzb0NsZWFuKSkge1xuICAvLyAgIHJldHVybiBmYWxzZTtcbiAgLy8gfVxuICBsZXQgcHJvY2Vzc29WYWxpZGFkbyA9IGNyZWF0ZV9wcm9jZXNzbyhwcm9jZXNzbyk7XG4gIGlmIChwYXJzZUludChwcm9jZXNzb0NsZWFuKSAhPT0gcGFyc2VJbnQoZ2V0QWxsRGlnaXRzKHByb2Nlc3NvVmFsaWRhZG8pKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfcGlzcGFzZXAobnVtYmVyOiBzdHJpbmcpIHtcbiAgbnVtYmVyID0gZ2V0QWxsRGlnaXRzKG51bWJlcik7XG4gIGxldCBuaXMgPSBmaWxsU3RyaW5nKG51bWJlciwgMTEsICcwJyk7XG4gIGNvbnN0IHJlZ2V4ID0gL1xcZHsxMX0vOyAvLyAvXlxcZHszfVxcLlxcZHs1fVxcLlxcZHsyfVxcLVxcZHsxfSQvO1xuICBpZiAoIXJlZ2V4LnRlc3QobmlzKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGRpZ2l0ID0gY3JlYXRlX3Bpc3Bhc2VwKG51bWJlcik7XG4gIHJldHVybiBuaXNbMTBdLnRvU3RyaW5nKCkgPT0gZGlnaXQudG9TdHJpbmcoKTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfcmVuYXZhbShyZW5hdmFtOiBhbnkpIHtcbiAgbGV0IHJlbmF2YW1DbGVhbiA9IHJlbmF2YW0ucmVwbGFjZSgvXFwuL2csICcnKTtcbiAgcmVuYXZhbUNsZWFuID0gcmVuYXZhbUNsZWFuLnJlcGxhY2UoL1xcLS9nLCAnJyk7XG4gIGNvbnN0IGR2ID0gY3JlYXRlX3JlbmF2YW0ocmVuYXZhbSk7XG4gIGNvbnN0IHRhbSA9IHJlbmF2YW0ubGVuZ3RoO1xuICBjb25zdCBkaWdpdG9zID0gcmVuYXZhbS5zdWJzdHIodGFtIC0gMSwgMSk7XG4gIGlmIChkaWdpdG9zLmNoYXJDb2RlQXQoMCkgLSA0OCA9PT0gZHYpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZV9yZyhyZzogc3RyaW5nKSB7XG4gIGxldCByZ0NsZWFuID0gcmcucmVwbGFjZSgvXFwuL2csICcnKTtcbiAgcmdDbGVhbiA9IHJnQ2xlYW4ucmVwbGFjZSgvLS9nLCAnJyk7XG4gIGNvbnN0IGV4cCA9IC9bYS16XXsyfVxcLVxcZHsyfVxcLlxcZHszfVxcLlxcZHszfS87XG4gIGNvbnN0IGV4cENsZWFuID0gL1thLXpdezJ9XFxkezh9LztcbiAgY29uc3Qgc3RhdGUgPSByZy5zdWJzdHIoMCwgMikudG9VcHBlckNhc2UoKTtcblxuICBpZiAoIWV4cC50ZXN0KHJnKSAmJiAhZXhwQ2xlYW4udGVzdChyZ0NsZWFuKSAmJiAhKHN0YXRlIGluIENFUFJhbmdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB2YWxpZGF0ZVN0YXRlID0gUkdbc3RhdGVdO1xuICBpZiAodmFsaWRhdGVTdGF0ZSkge1xuICAgIHJldHVybiB2YWxpZGF0ZVN0YXRlKHJnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVfc2VuaGEodmFsdWU6IHN0cmluZywgb3B0aW9uczogYW55ID0ge30pIHtcbiAgbGV0IGZpbmFscmVnZXggPSAnXic7XG4gIC8vICAgXlx0VGhlIHBhc3N3b3JkIHN0cmluZyB3aWxsIHN0YXJ0IHRoaXMgd2F5XG4gIC8vICg/PS4qW2Etel0pXHRUaGUgc3RyaW5nIG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGxvd2VyY2FzZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyXG4gIGlmIChvcHRpb25zLmxvd2VyY2FzZSAhPT0gZmFsc2UpIHtcbiAgICBmaW5hbHJlZ2V4ID0gZmluYWxyZWdleCArICcoPz0uKlthLXpdKSc7XG4gIH1cbiAgLy8gKD89LipbQS1aXSlcdFRoZSBzdHJpbmcgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgdXBwZXJjYXNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXJcbiAgaWYgKG9wdGlvbnMudXBwZXJjYXNlICE9PSBmYWxzZSkge1xuICAgIGZpbmFscmVnZXggPSBmaW5hbHJlZ2V4ICsgJyg/PS4qW0EtWl0pJztcbiAgfVxuICAvLyAoPz0uKlswLTldKVx0VGhlIHN0cmluZyBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBudW1lcmljIGNoYXJhY3RlclxuICBpZiAob3B0aW9ucy5udW1lcmljICE9PSBmYWxzZSkge1xuICAgIGZpbmFscmVnZXggPSBmaW5hbHJlZ2V4ICsgJyg/PS4qWzAtOV0pJztcbiAgfVxuICAvLyAoPz0uKlshQCNcXCQlXFxeJlxcKl0pXHRUaGUgc3RyaW5nIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgc3BlY2lhbCBjaGFyYWN0ZXIsIGJ1dCB3ZSBhcmUgZXNjYXBpbmcgcmVzZXJ2ZWQgUmVnRXggY2hhcmFjdGVycyB0byBhdm9pZCBjb25mbGljdFxuICBpZiAob3B0aW9ucy5udW1lcmljICE9PSBmYWxzZSkge1xuICAgIGZpbmFscmVnZXggPSBmaW5hbHJlZ2V4ICsgJyg/PS4qWyFAI1xcXFwkJVxcXFxeJlxcXFwqXSknO1xuICB9XG4gIC8vICg/PS57OCx9KVx0VGhlIHN0cmluZyBtdXN0IGJlIGVpZ2h0IGNoYXJhY3RlcnMgb3IgbG9uZ2VyXG4gIGlmICghb3B0aW9ucy5zaXplKSB7XG4gICAgb3B0aW9ucy5zaXplID0gODtcbiAgfVxuXG4gIGZpbmFscmVnZXggPSBmaW5hbHJlZ2V4ICsgYCg/PS57JHtvcHRpb25zLnNpemV9LH0pYDtcblxuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoZmluYWxyZWdleCk7XG4gIHJldHVybiByZWdleC50ZXN0KHZhbHVlKTtcbn1cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZV9zaXRlKHZhbHVlOiBhbnkpIHtcbiAgdmFyIHJlID0gLyhodHRwKHMpPzpcXC9cXC8uKT8od3d3XFwuKT9bLWEtekEtWjAtOUA6JS5fXFwrfiM9XXsyLDI1Nn1cXC5bYS16XXsyLDZ9XFxiKFstYS16QS1aMC05QDolX1xcKy5+Iz8mPV0qKS9nO1xuICByZXR1cm4gcmUudGVzdChTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfc3BlZChzcGVkOiBzdHJpbmcpIHtcbiAgaWYgKCFzcGVkKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX3RlbGVmb25lKHRlbDogYW55KSB7XG4gIGNvbnN0IHRlbENsZWFuID0gdGVsLnJlcGxhY2UoL1teXFxkXSsvZywgJycpO1xuICB0ZWwgPSB0ZWwucmVwbGFjZSgvXy9nLCAnJyk7XG4gIGlmICghKHRlbENsZWFuLmxlbmd0aCA9PT0gMTAgfHwgdGVsQ2xlYW4ubGVuZ3RoID09PSAxMSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHRlbENsZWFuWzBdID09IDAgfHwgdGVsQ2xlYW5bMl0gPT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlX3RpbWUodGltZTogc3RyaW5nIHwgbnVtYmVyLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICBjb25zdCB2YWx1ZSA9IHRpbWUudG9TdHJpbmcoKTtcbiAgaWYgKG9wdGlvbnMuZGlhcmlvKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IC9eKFswLTFdP1swLTldfDJbMC00XSk6KFswLTVdWzAtOV0pKDpbMC01XVswLTldKT8kLztcbiAgICByZXR1cm4gZXhwcmVzc2lvbi50ZXN0KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gL14oWzAtOV0/WzAtOV0pOihbMC01XVswLTldKSg6WzAtNV1bMC05XSk/JC87XG4gICAgcmV0dXJuIGV4cHJlc3Npb24udGVzdCh2YWx1ZSk7XG4gIH1cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVfdGl0dWxvKHRpdHVsbzogYW55KSB7XG4gIGlmICghdGl0dWxvKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHRpdHVsb0NsZWFuID0gdGl0dWxvLnJlcGxhY2UoL1xcLi9nLCAnJyk7XG4gIGNvbnN0IGV4cCA9IC9cXGR7NH1cXC5cXGR7NH1cXC5cXGR7NH0vO1xuICBjb25zdCBleHBDbGVhbiA9IC9cXGR7NH1cXGR7NH1cXGR7NH0vO1xuICBpZiAoIWV4cC50ZXN0KHRpdHVsb0NsZWFuKSAmJiAhZXhwQ2xlYW4udGVzdCh0aXR1bG9DbGVhbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB0YW0gPSB0aXR1bG9DbGVhbi5sZW5ndGg7XG5cbiAgbGV0IGRpZztcbiAgdHJ5IHtcbiAgICBkaWcgPSBjcmVhdGVfdGl0dWxvX2F0dWFsKHRpdHVsb0NsZWFuKTtcbiAgICAvLyBjb25zdCBub0R2ID0gdGl0dWxvQ2xlYW4uc3Vic3RyKDAsIHRhbSAtIDIpO1xuICAgIC8vIGRpZyA9IGNyZWF0ZV90aXR1bG8obm9Edik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBkaWdpdG9zID0gdGl0dWxvQ2xlYW4uc3Vic3RyKHRhbSAtIDIsIDIpO1xuICBpZiAoZGlnaXRvcyA9PT0gZGlnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlX3VzZXJuYW1lKHZhbHVlOiBhbnkpIHtcbiAgdmFyIHJlID0gL15bYS16MC05Xy1dezMsMTZ9JC9pZ207XG4gIHJldHVybiByZS50ZXN0KFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKSk7XG59XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUJyOiBCaWdPYmplY3Q8RnVuY3Rpb24+ID0ge1xuICBhaWg6IHZhbGlkYXRlX2FpaCxcbiAgY2FydGFvY3JlZGl0bzogdmFsaWRhdGVfY2FydGFvY3JlZGl0byxcbiAgY2VsdWxhcjogdmFsaWRhdGVfY2VsdWxhcixcbiAgY2VwOiB2YWxpZGF0ZV9jZXAsXG4gIGNlcnRpZGFvOiB2YWxpZGF0ZV9jZXJ0aWRhbyxcbiAgY2hhc3NpOiB2YWxpZGF0ZV9jaGFzc2ksXG4gIGNuYWU6IHZhbGlkYXRlX2NuYWUsXG4gIGNuaDogdmFsaWRhdGVfY25oLFxuICBjbmhlc3BlbGhvOiB2YWxpZGF0ZV9jbmhlc3BlbGhvLFxuICByZW5hY2hlc3RhZHVhbDogdmFsaWRhdGVfcmVuYWNoZXN0YWR1YWwsXG4gIHJlbmFjaHNlZ3VyYW5jYTogdmFsaWRhdGVfcmVuYWNoc2VndXJhbmNhLFxuICBjbnBqOiB2YWxpZGF0ZV9jbnBqLFxuICBjbnM6IHZhbGlkYXRlX2NucyxcbiAgY29udGFiYW5jbzogdmFsaWRhdGVfY29udGFiYW5jbyxcbiAgY3BmOiB2YWxpZGF0ZV9jcGYsXG4gIGNwZmNucGo6IHZhbGlkYXRlX2NwZmNucGosXG4gIGN1cnJlbmN5OiB2YWxpZGF0ZV9jdXJyZW5jeSxcbiAgZGF0YTogdmFsaWRhdGVfZGF0YSxcbiAgZGF0ZTogdmFsaWRhdGVfZGF0ZSxcbiAgZGF0ZXRpbWU6IHZhbGlkYXRlX2RhdGV0aW1lLFxuICBkYXRhaG9yYTogdmFsaWRhdGVfZGF0YWhvcmEsXG4gIGVjdDogdmFsaWRhdGVfZWN0LFxuICBlbWFpbDogdmFsaWRhdGVfZW1haWwsXG4gIGVuZGVyZWNvOiB2YWxpZGF0ZV9lbmRlcmVjbyxcbiAgaW5zY3JpY2FvZXN0YWR1YWw6IHZhbGlkYXRlX2luc2NyaWNhb2VzdGFkdWFsLFxuICBpcHR1OiB2YWxpZGF0ZV9pcHR1LFxuICBudW1iZXI6IHZhbGlkYXRlX251bWJlcixcbiAgcG9yY2VudGFnZW06IHZhbGlkYXRlX3BvcmNlbnRhZ2VtLFxuICBwaXNwYXNlcDogdmFsaWRhdGVfcGlzcGFzZXAsXG4gIHBsYWNhOiB2YWxpZGF0ZV9wbGFjYSxcbiAgcHJvY2Vzc286IHZhbGlkYXRlX3Byb2Nlc3NvLFxuICByZW5hdmFtOiB2YWxpZGF0ZV9yZW5hdmFtLFxuICByZzogdmFsaWRhdGVfcmcsXG4gIHNlbmhhOiB2YWxpZGF0ZV9zZW5oYSxcbiAgc2l0ZTogdmFsaWRhdGVfc2l0ZSxcbiAgc3BlZDogdmFsaWRhdGVfc3BlZCxcbiAgdGVsZWZvbmU6IHZhbGlkYXRlX3RlbGVmb25lLFxuICB0aW1lOiB2YWxpZGF0ZV90aW1lLFxuICB0aXR1bG86IHZhbGlkYXRlX3RpdHVsbyxcbiAgdXNlcm5hbWU6IHZhbGlkYXRlX3VzZXJuYW1lXG59O1xuIl19
|