lib-portal-angular 0.0.69 → 0.0.70

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,8 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
- import * as i2 from "lucide-angular";
4
+ import * as i2 from "@angular/forms";
5
+ import * as i3 from "lucide-angular";
5
6
  export class CalendarArgentaComponent {
6
7
  constructor() {
7
8
  this.id = 'argenta-calendar';
@@ -9,54 +10,73 @@ export class CalendarArgentaComponent {
9
10
  this.label = 'Select a date';
10
11
  this.minDate = null;
11
12
  this.maxDate = null;
12
- this.locale = 'pt'; // Suporte para diferentes idiomas
13
- this.useTime = false; // Propriedade para definir se inclui hora
14
- this.initialDate = null; // Propriedade para receber a data inicial
15
- this.dateChange = new EventEmitter();
13
+ this.locale = 'pt';
14
+ this.useTime = false; // Incluir ou não a hora
15
+ this.initialDate = null; // Data inicial no modo de data única
16
+ this.rangeMode = false; // Ativa o modo de intervalo de datas
17
+ this.startDate = null; // Data de início do intervalo
18
+ this.endDate = null; // Data de fim do intervalo
19
+ this.closeButtonLabel = 'Fechar'; // Texto do botão de fechar
20
+ this.rangeChange = new EventEmitter(); // Evento que emite data única ou intervalo
16
21
  this.currentYear = new Date().getFullYear();
17
22
  this.currentMonth = new Date().getMonth();
18
23
  this.selectedDate = null;
24
+ this.selectedStartDate = null;
25
+ this.selectedEndDate = null;
19
26
  this.isCalendarVisible = false;
20
27
  this.inputDate = '';
21
28
  this.invalidDate = false;
29
+ this.isSelectingStart = true; // Controla se estamos selecionando a data inicial ou final
30
+ this.startTime = '';
31
+ this.endTime = '';
32
+ this.selectedTime = '';
22
33
  this.locales = {
23
34
  en: {
24
35
  months: [
25
- 'January', 'February', 'March', 'April', 'May', 'June', 'July',
26
- 'August', 'September', 'October', 'November', 'December'
36
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'
27
37
  ],
28
38
  daysOfWeek: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
29
- invalidDateMessage: 'Invalid date. Please enter a date in the format dd/MM/yyyy'
39
+ invalidDateMessage: 'Invalid date. Please enter a date in the format dd/MM/yyyy',
40
+ startTimeLabel: 'Start Time',
41
+ endTimeLabel: 'End Time',
30
42
  },
31
43
  pt: {
32
44
  months: [
33
- 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho',
34
- 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'
45
+ 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'
35
46
  ],
36
47
  daysOfWeek: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'],
37
- invalidDateMessage: 'Data inválida. Por favor, insira uma data no formato dd/MM/yyyy'
48
+ invalidDateMessage: 'Data inválida. Por favor, insira uma data no formato dd/MM/yyyy',
49
+ startTimeLabel: 'Hora de Início',
50
+ endTimeLabel: 'Hora de Fim',
38
51
  },
39
52
  es: {
40
53
  months: [
41
- 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio',
42
- 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'
54
+ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'
43
55
  ],
44
56
  daysOfWeek: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'],
45
- invalidDateMessage: 'Fecha inválida. Por favor, ingrese una fecha en el formato dd/MM/yyyy'
57
+ invalidDateMessage: 'Fecha inválida. Por favor, ingrese una fecha en el formato dd/MM/yyyy',
58
+ startTimeLabel: 'Hora de Inicio',
59
+ endTimeLabel: 'Hora de Fin',
46
60
  }
47
61
  };
48
62
  }
49
63
  ngOnInit() {
50
- if (this.initialDate) {
51
- // Se a initialDate for fornecida, usamos ela
52
- this.updateCalendar(this.initialDate);
64
+ if (this.rangeMode) {
65
+ if (this.startDate) {
66
+ this.selectedStartDate = this.parseDate(this.startDate);
67
+ this.startTime = this.formatTimeForDisplay(this.selectedStartDate);
68
+ }
69
+ if (this.endDate) {
70
+ this.selectedEndDate = this.parseDate(this.endDate);
71
+ this.endTime = this.formatTimeForDisplay(this.selectedEndDate);
72
+ }
73
+ this.updateInputForRange(); // Atualiza o input no modo range com horas
53
74
  }
54
75
  else {
55
- // Caso contrário, usamos a data atual
56
- const today = new Date();
57
- this.selectedDate = today;
58
- this.inputDate = this.formatDateForDisplay(today);
59
- this.dateChange.emit(this.inputDate); // Emite a data inicial
76
+ if (this.initialDate) {
77
+ this.updateCalendar(this.initialDate); // Atualiza o input único com a data inicial
78
+ this.selectedTime = this.formatTimeForDisplay(this.selectedDate);
79
+ }
60
80
  }
61
81
  }
62
82
  ngOnChanges(changes) {
@@ -64,123 +84,233 @@ export class CalendarArgentaComponent {
64
84
  this.updateCalendar(changes['initialDate'].currentValue);
65
85
  }
66
86
  }
67
- // Método para atualizar o calendário com a data passada
87
+ // Atualiza o calendário para exibir a data única e a hora
68
88
  updateCalendar(dateString) {
69
89
  const parsedDate = this.parseDate(dateString);
70
- // Verifica se a data é válida
71
- if (parsedDate !== null && this.validateDate(dateString)) {
90
+ if (parsedDate && this.validateDate(dateString)) {
72
91
  this.selectedDate = parsedDate;
73
92
  this.currentYear = parsedDate.getFullYear();
74
93
  this.currentMonth = parsedDate.getMonth();
75
- this.inputDate = this.formatDateForDisplay(parsedDate);
76
- this.dateChange.emit(this.inputDate); // Emite a nova data
77
- this.invalidDate = false; // Remove o status de data inválida
94
+ this.inputDate = this.formatDateForDisplay(parsedDate); // Inclui a hora no input principal
95
+ this.emitSingleOrRange(); // Emite data única ou intervalo
96
+ this.invalidDate = false;
78
97
  }
79
98
  else {
80
- this.invalidDate = true; // Marca a data como inválida
81
- this.dateChange.emit('Data ou hora inválida'); // Emite mensagem de erro
82
- console.log('Data ou hora inválida passada para o componente');
99
+ this.invalidDate = true;
83
100
  }
84
101
  }
85
102
  onInputChange(event) {
86
103
  const inputValue = event.target.value;
87
104
  this.inputDate = this.applyDateMask(inputValue);
88
- // Validação para obrigar a hora quando useTime for verdadeiro
89
- if (this.useTime) {
90
- // Se a entrada não tiver o comprimento correto para data + hora
91
- if (this.inputDate.length < 16) {
92
- this.invalidDate = true;
93
- this.dateChange.emit('Data ou hora inválida');
94
- return;
95
- }
96
- }
97
- // Somente validar a hora se o campo useTime estiver ativo e o formato estiver correto
98
- if (this.useTime && this.inputDate.length >= 14) {
99
- const [datePart, timePart] = this.inputDate.split(' ');
100
- if (timePart) {
101
- const [hourStr, minuteStr] = timePart.split(':');
102
- const hour = Number(hourStr);
103
- const minute = Number(minuteStr);
104
- // Corrige somente se a hora/minuto forem inválidos
105
- if (hour < 0 || hour > 23 || isNaN(hour)) {
106
- this.invalidDate = true;
107
- this.dateChange.emit('Hora inválida');
108
- return;
105
+ if (this.rangeMode) {
106
+ const dateParts = this.inputDate.split(' - ');
107
+ if (dateParts.length === 2) {
108
+ const [startDate, endDate] = dateParts;
109
+ // Valida as duas partes do intervalo
110
+ if (this.validateDate(startDate) && this.validateDate(endDate)) {
111
+ this.invalidDate = false;
112
+ const parsedStartDate = this.parseDate(startDate);
113
+ const parsedEndDate = this.parseDate(endDate);
114
+ if (parsedStartDate && parsedEndDate) {
115
+ this.selectedStartDate = parsedStartDate;
116
+ this.selectedEndDate = parsedEndDate;
117
+ this.emitSingleOrRange(); // Emite o intervalo atualizado
118
+ }
109
119
  }
110
- else if (minute < 0 || minute > 59 || isNaN(minute)) {
120
+ else {
111
121
  this.invalidDate = true;
112
- this.dateChange.emit('Hora inválida');
113
- return;
114
122
  }
115
- else {
123
+ }
124
+ }
125
+ else {
126
+ // Valida data única
127
+ if ((this.useTime && this.inputDate.length === 16) || (!this.useTime && this.inputDate.length === 10)) {
128
+ if (this.validateDate(this.inputDate)) {
116
129
  this.invalidDate = false;
130
+ const parsedDate = this.parseDate(this.inputDate);
131
+ if (parsedDate) {
132
+ this.selectedDate = parsedDate;
133
+ this.emitSingleOrRange(); // Emite a data única atualizada
134
+ }
135
+ }
136
+ else {
137
+ this.invalidDate = true;
117
138
  }
118
139
  }
119
140
  }
120
- // Emitir a data quando for válida
121
- if ((this.useTime && this.inputDate.length === 16) || (!this.useTime && this.inputDate.length === 10)) {
122
- if (this.validateDate(this.inputDate)) {
123
- this.invalidDate = false;
124
- const parsedDate = this.parseDate(this.inputDate);
125
- // Verificar se parsedDate não é nulo antes de acessar suas propriedades
126
- if (parsedDate !== null) {
127
- this.currentYear = parsedDate.getFullYear();
128
- this.currentMonth = parsedDate.getMonth();
129
- this.selectedDate = parsedDate;
130
- // Formatar a data para dd/MM/yyyy - HH:mm
131
- const formattedDate = this.formatDateForEmit(parsedDate);
132
- this.dateChange.emit(formattedDate); // Emite a data válida com o hífen
141
+ }
142
+ // Atualiza o input no modo intervalo
143
+ updateInputForRange() {
144
+ if (this.selectedStartDate && this.selectedEndDate) {
145
+ const formattedStart = this.formatDateForDisplay(this.selectedStartDate);
146
+ const formattedEnd = this.formatDateForDisplay(this.selectedEndDate);
147
+ this.inputDate = `${formattedStart} - ${formattedEnd}`;
148
+ }
149
+ else if (this.selectedStartDate) {
150
+ this.inputDate = this.formatDateForDisplay(this.selectedStartDate);
151
+ }
152
+ }
153
+ /// Emite data única ou intervalo, incluindo horas
154
+ emitSingleOrRange() {
155
+ if (this.rangeMode) {
156
+ const formattedStart = this.selectedStartDate ? this.formatDateForDisplay(this.selectedStartDate) : '';
157
+ const formattedEnd = this.selectedEndDate ? this.formatDateForDisplay(this.selectedEndDate) : '';
158
+ this.inputDate = `${formattedStart} - ${formattedEnd}`; // Atualiza o input principal com o range e horas
159
+ this.rangeChange.emit({ start: formattedStart, end: formattedEnd });
160
+ }
161
+ else {
162
+ const formattedDate = this.selectedDate ? this.formatDateForDisplay(this.selectedDate) : '';
163
+ this.inputDate = formattedDate; // Atualiza o input principal com a data única e hora
164
+ this.rangeChange.emit({ start: formattedDate, end: '' });
165
+ }
166
+ }
167
+ // Função para tratar mudanças nas horas
168
+ onTimeChange(type) {
169
+ if (type === 'start') {
170
+ if (this.selectedStartDate) {
171
+ const [hours, minutes] = this.startTime ? this.startTime.split(':') : ['00', '00'];
172
+ this.selectedStartDate.setHours(+hours, +minutes);
173
+ }
174
+ }
175
+ else if (type === 'end') {
176
+ if (this.selectedEndDate) {
177
+ const [hours, minutes] = this.endTime ? this.endTime.split(':') : ['00', '00'];
178
+ this.selectedEndDate.setHours(+hours, +minutes);
179
+ }
180
+ }
181
+ else if (type === 'single') {
182
+ if (this.selectedDate) {
183
+ const [hours, minutes] = this.selectedTime ? this.selectedTime.split(':') : ['00', '00'];
184
+ this.selectedDate.setHours(+hours, +minutes);
185
+ }
186
+ }
187
+ this.emitSingleOrRange(); // Atualiza o valor no input principal
188
+ }
189
+ // Função para formatação da hora no input de hora
190
+ formatTimeForDisplay(date) {
191
+ if (!date)
192
+ return '';
193
+ const hours = date.getHours().toString().padStart(2, '0');
194
+ const minutes = date.getMinutes().toString().padStart(2, '0');
195
+ return `${hours}:${minutes}`;
196
+ }
197
+ // Método para selecionar uma data no calendário
198
+ selectDate(day) {
199
+ const date = new Date(this.currentYear, this.currentMonth, day);
200
+ if (this.rangeMode) {
201
+ // Lógica para rangeMode
202
+ if (this.isSelectingStart) {
203
+ this.selectedStartDate = date;
204
+ if (this.startTime) {
205
+ const [hours, minutes] = this.startTime.split(':');
206
+ this.selectedStartDate.setHours(+hours, +minutes);
133
207
  }
134
208
  else {
135
- console.log('Data inválida passada para o componente.');
136
- this.dateChange.emit('Data inválida');
209
+ this.selectedStartDate.setHours(0, 0);
210
+ this.startTime = '00:00';
137
211
  }
212
+ this.isSelectingStart = false;
138
213
  }
139
214
  else {
140
- this.invalidDate = true;
141
- this.dateChange.emit('Data inválida'); // Emite o evento com mensagem de erro
215
+ this.selectedEndDate = date;
216
+ if (this.endTime) {
217
+ const [hours, minutes] = this.endTime.split(':');
218
+ this.selectedEndDate.setHours(+hours, +minutes);
219
+ }
220
+ else {
221
+ this.selectedEndDate.setHours(0, 0);
222
+ this.endTime = '00:00';
223
+ }
224
+ this.isSelectingStart = true;
225
+ this.emitSingleOrRange();
142
226
  }
227
+ this.updateInputForRange();
228
+ // O calendário só será fechado ao clicar no botão "Fechar"
143
229
  }
144
- }
145
- // Formatar a data e hora com hífen
146
- formatDateForEmit(date) {
147
- const day = date.getDate().toString().padStart(2, '0');
148
- const month = (date.getMonth() + 1).toString().padStart(2, '0');
149
- const year = date.getFullYear();
150
- let formattedDate = `${day}/${month}/${year}`;
151
- if (this.useTime) {
152
- const hours = date.getHours().toString().padStart(2, '0');
153
- const minutes = date.getMinutes().toString().padStart(2, '0');
154
- // Adiciona o hífen entre a data e a hora
155
- formattedDate += ` - ${hours}:${minutes}`;
230
+ else {
231
+ // Lógica para quando não está em rangeMode
232
+ this.selectedDate = date;
233
+ if (this.selectedTime) {
234
+ const [hours, minutes] = this.selectedTime.split(':');
235
+ this.selectedDate.setHours(+hours, +minutes);
236
+ }
237
+ else {
238
+ this.selectedDate.setHours(0, 0);
239
+ this.selectedTime = '00:00';
240
+ }
241
+ this.inputDate = this.formatDateForDisplay(date);
242
+ this.emitSingleOrRange();
243
+ // **Fechar o calendário apenas se `useTime` for false**
244
+ if (!this.useTime) {
245
+ this.isCalendarVisible = false; // Fecha o calendário automaticamente se `useTime` for false
246
+ }
247
+ // Se `useTime` for true, o calendário permanece aberto para inserir a hora
156
248
  }
157
- return formattedDate;
158
249
  }
159
250
  applyDateMask(inputValue) {
251
+ // Remove qualquer caractere que não seja numérico
160
252
  let digitsOnly = inputValue.replace(/\D/g, '');
161
- // Limita os dígitos com base no uso de hora
162
- const maxLength = this.useTime ? 12 : 8;
163
- if (digitsOnly.length > maxLength) {
164
- digitsOnly = digitsOnly.substring(0, maxLength);
253
+ if (this.rangeMode) {
254
+ const maxLength = this.useTime ? 28 : 17; // Ajusta o comprimento máximo para intervalo com ou sem tempo
255
+ // Certifica-se de que a entrada não excede o comprimento permitido
256
+ if (digitsOnly.length > maxLength) {
257
+ digitsOnly = digitsOnly.substring(0, maxLength);
258
+ }
259
+ // Primeiro intervalo (start date)
260
+ let day1 = digitsOnly.substring(0, 2);
261
+ let month1 = digitsOnly.substring(2, 4);
262
+ let year1 = digitsOnly.substring(4, 8);
263
+ let hour1 = digitsOnly.substring(8, 10);
264
+ let minute1 = digitsOnly.substring(10, 12);
265
+ // Cria a data formatada para a primeira parte (start date)
266
+ let maskedDate = `${day1}/${month1}/${year1}`;
267
+ if (this.useTime && hour1 && minute1) {
268
+ maskedDate += ` ${hour1}:${minute1}`;
269
+ }
270
+ // Adiciona o separador ' - ' se houver dados para o segundo intervalo
271
+ if (digitsOnly.length > 12) {
272
+ maskedDate += ' - ';
273
+ }
274
+ // Segundo intervalo (end date)
275
+ let day2 = digitsOnly.substring(12, 14);
276
+ let month2 = digitsOnly.substring(14, 16);
277
+ let year2 = digitsOnly.substring(16, 20);
278
+ let hour2 = digitsOnly.substring(20, 22);
279
+ let minute2 = digitsOnly.substring(22, 24);
280
+ let endDatePart = `${day2}/${month2}/${year2}`;
281
+ if (this.useTime && hour2 && minute2) {
282
+ endDatePart += ` ${hour2}:${minute2}`;
283
+ }
284
+ // Adiciona a segunda parte (end date) ao input, se aplicável
285
+ if (digitsOnly.length > 12) {
286
+ maskedDate += endDatePart;
287
+ }
288
+ return maskedDate;
165
289
  }
166
- let day = digitsOnly.substring(0, 2);
167
- let month = digitsOnly.substring(2, 4);
168
- let year = digitsOnly.substring(4, 8);
169
- let hour = digitsOnly.substring(8, 10);
170
- let minute = digitsOnly.substring(10, 12);
171
- let maskedDate = `${day}/${month}/${year}`;
172
- if (this.useTime && hour && minute) {
173
- maskedDate += ` ${hour}:${minute}`;
290
+ else {
291
+ const maxLength = this.useTime ? 16 : 10;
292
+ if (digitsOnly.length > maxLength) {
293
+ digitsOnly = digitsOnly.substring(0, maxLength);
294
+ }
295
+ let day = digitsOnly.substring(0, 2);
296
+ let month = digitsOnly.substring(2, 4);
297
+ let year = digitsOnly.substring(4, 8);
298
+ let hour = digitsOnly.substring(8, 10);
299
+ let minute = digitsOnly.substring(10, 12);
300
+ let maskedDate = `${day}/${month}/${year}`;
301
+ if (this.useTime && hour && minute) {
302
+ maskedDate += ` ${hour}:${minute}`;
303
+ }
304
+ return maskedDate;
174
305
  }
175
- return maskedDate;
176
306
  }
307
+ // Validação da data
177
308
  validateDate(inputValue) {
178
309
  const [datePart, timePart] = inputValue.split(' ');
179
310
  const [dayStr, monthStr, yearStr] = datePart.split('/');
180
311
  const day = Number(dayStr);
181
312
  const month = Number(monthStr);
182
313
  const year = Number(yearStr);
183
- // Validação de data
184
314
  if (month < 1 || month > 12 || yearStr.length !== 4 || isNaN(year)) {
185
315
  return false;
186
316
  }
@@ -188,30 +318,36 @@ export class CalendarArgentaComponent {
188
318
  if (day < 1 || day > lastDayOfMonth) {
189
319
  return false;
190
320
  }
191
- // Validação de hora
192
321
  if (this.useTime && timePart) {
193
322
  const [hourStr, minuteStr] = timePart.split(':');
194
323
  const hour = Number(hourStr);
195
324
  const minute = Number(minuteStr);
196
325
  if (hour < 0 || hour > 23 || minute < 0 || minute > 59 || isNaN(hour) || isNaN(minute)) {
197
- return false; // Hora ou minuto inválidos
326
+ return false;
198
327
  }
199
328
  }
200
329
  return true;
201
330
  }
202
- parseDate(dateStr) {
203
- const [datePart, timePart] = dateStr.split(' ');
204
- const [day, month, year] = datePart.split('/').map(Number);
205
- if (!day || !month || !year) {
206
- return null;
331
+ handleKeyPress(event) {
332
+ const charCode = event.key.charCodeAt(0);
333
+ // Permitir apenas números e barra "/"
334
+ if ((charCode < 48 || charCode > 57) && charCode !== 47) {
335
+ event.preventDefault(); // Bloqueia a inserção de caracteres não permitidos
207
336
  }
208
- const date = new Date(year, month - 1, day);
209
- if (this.useTime && timePart) {
210
- const [hour, minute] = timePart.split(':').map(Number);
211
- date.setHours(hour || 0, minute || 0);
337
+ // Limita o tamanho da entrada conforme o tipo de dado (com ou sem hora)
338
+ if (this.inputDate.replace(/\D/g, '').length >= (this.useTime ? 12 : 8)) {
339
+ event.preventDefault(); // Limita o número de caracteres permitidos
212
340
  }
213
- return date;
214
341
  }
342
+ // Fecha o calendário
343
+ closeCalendar() {
344
+ this.isCalendarVisible = false;
345
+ }
346
+ // Alterna a visibilidade do calendário
347
+ toggleCalendar() {
348
+ this.isCalendarVisible = !this.isCalendarVisible;
349
+ }
350
+ // Formata a data e hora para exibição no input principal
215
351
  formatDateForDisplay(date) {
216
352
  const day = date.getDate().toString().padStart(2, '0');
217
353
  const month = (date.getMonth() + 1).toString().padStart(2, '0');
@@ -224,72 +360,56 @@ export class CalendarArgentaComponent {
224
360
  }
225
361
  return formattedDate;
226
362
  }
227
- toggleCalendar() {
228
- this.isCalendarVisible = !this.isCalendarVisible;
229
- }
230
- selectDate(day) {
231
- const date = new Date(this.currentYear, this.currentMonth, day);
232
- this.inputDate = this.formatDateForDisplay(date);
233
- this.selectedDate = date; // Armazena a data selecionada
234
- this.dateChange.emit(this.inputDate); // Emite a data selecionada ao clicar no calendário
235
- this.isCalendarVisible = false; // Fecha o calendário após a seleção
363
+ // Formata a data para emitir no evento
364
+ formatDateForEmit(date) {
365
+ const day = date.getDate().toString().padStart(2, '0');
366
+ const month = (date.getMonth() + 1).toString().padStart(2, '0');
367
+ const year = date.getFullYear();
368
+ let formattedDate = `${day}/${month}/${year}`;
369
+ if (this.useTime) {
370
+ const hours = date.getHours().toString().padStart(2, '0');
371
+ const minutes = date.getMinutes().toString().padStart(2, '0');
372
+ formattedDate += ` - ${hours}:${minutes}`;
373
+ }
374
+ return formattedDate;
236
375
  }
237
- handleKeyPress(event) {
238
- const charCode = event.key.charCodeAt(0);
239
- if (charCode < 48 || charCode > 57) {
240
- event.preventDefault();
376
+ // Função para parsing de string para Date
377
+ parseDate(dateStr) {
378
+ const [datePart, timePart] = dateStr.split(' ');
379
+ const [day, month, year] = datePart.split('/').map(Number);
380
+ if (!day || !month || !year) {
381
+ return null;
241
382
  }
242
- if (this.inputDate.replace(/\D/g, '').length >= (this.useTime ? 12 : 8)) {
243
- event.preventDefault();
383
+ const date = new Date(year, month - 1, day);
384
+ if (this.useTime && timePart) {
385
+ const [hour, minute] = timePart.split(':').map(Number);
386
+ date.setHours(hour || 0, minute || 0);
244
387
  }
388
+ return date;
245
389
  }
390
+ // Gera a lista de dias no mês atual
246
391
  get daysInMonth() {
247
- const firstDayOfMonth = new Date(this.currentYear, this.currentMonth, 1).getDay(); // Dia da semana do primeiro dia do mês
248
- const totalDaysInMonth = new Date(this.currentYear, this.currentMonth + 1, 0).getDate(); // Total de dias no mês
249
- const daysArray = Array.from({ length: totalDaysInMonth }, (_, i) => i + 1); // Array com todos os dias do mês
392
+ const firstDayOfMonth = new Date(this.currentYear, this.currentMonth, 1).getDay();
393
+ const totalDaysInMonth = new Date(this.currentYear, this.currentMonth + 1, 0).getDate();
394
+ const daysArray = Array.from({ length: totalDaysInMonth }, (_, i) => i + 1);
250
395
  const leadingEmptyDays = Array(firstDayOfMonth).fill(null); // Dias vazios antes do primeiro dia do mês
251
- return [...leadingEmptyDays, ...daysArray]; // Retorna os dias vazios seguidos pelos dias do mês
252
- }
253
- get months() {
254
- return this.locales[this.locale]?.months || this.locales['en'].months;
255
- }
256
- get daysOfWeek() {
257
- return this.locales[this.locale]?.daysOfWeek || this.locales['en'].daysOfWeek;
258
- }
259
- prevMonth() {
260
- if (this.currentMonth === 0) {
261
- this.currentMonth = 11;
262
- this.currentYear--;
263
- }
264
- else {
265
- this.currentMonth--;
266
- }
267
- }
268
- nextMonth() {
269
- if (this.currentMonth === 11) {
270
- this.currentMonth = 0;
271
- this.currentYear++;
272
- }
273
- else {
274
- this.currentMonth++;
275
- }
396
+ return [...leadingEmptyDays, ...daysArray];
276
397
  }
398
+ // Verifica se um dia está selecionado
277
399
  isSelected(day) {
278
400
  if (!this.selectedDate)
279
401
  return false;
280
402
  const selectedDay = this.selectedDate.getDate();
281
403
  const selectedMonth = this.selectedDate.getMonth();
282
404
  const selectedYear = this.selectedDate.getFullYear();
283
- return (selectedDay === day &&
284
- selectedMonth === this.currentMonth &&
285
- selectedYear === this.currentYear);
405
+ return selectedDay === day && selectedMonth === this.currentMonth && selectedYear === this.currentYear;
286
406
  }
407
+ // Verifica se o dia é hoje
287
408
  isToday(day) {
288
409
  const today = new Date();
289
- return (today.getFullYear() === this.currentYear &&
290
- today.getMonth() === this.currentMonth &&
291
- today.getDate() === day);
410
+ return today.getFullYear() === this.currentYear && today.getMonth() === this.currentMonth && today.getDate() === day;
292
411
  }
412
+ // Verifica se a data está desabilitada
293
413
  isDateDisabled(day) {
294
414
  const date = new Date(this.currentYear, this.currentMonth, day);
295
415
  if (this.minDate && date < this.minDate)
@@ -298,12 +418,47 @@ export class CalendarArgentaComponent {
298
418
  return true;
299
419
  return false;
300
420
  }
421
+ // Verifica se um dia está no intervalo selecionado
422
+ isInRange(day) {
423
+ if (!this.selectedStartDate || !this.selectedEndDate)
424
+ return false;
425
+ const date = new Date(this.currentYear, this.currentMonth, day);
426
+ return date >= this.selectedStartDate && date <= this.selectedEndDate;
427
+ }
428
+ // Avança para o próximo mês
429
+ nextMonth() {
430
+ if (this.currentMonth === 11) {
431
+ this.currentMonth = 0;
432
+ this.currentYear++;
433
+ }
434
+ else {
435
+ this.currentMonth++;
436
+ }
437
+ }
438
+ // Retrocede para o mês anterior
439
+ prevMonth() {
440
+ if (this.currentMonth === 0) {
441
+ this.currentMonth = 11;
442
+ this.currentYear--;
443
+ }
444
+ else {
445
+ this.currentMonth--;
446
+ }
447
+ }
448
+ // Retorna a lista de meses de acordo com o locale
449
+ get months() {
450
+ return this.locales[this.locale]?.months || this.locales['en'].months;
451
+ }
452
+ // Retorna a lista de dias da semana de acordo com o locale
453
+ get daysOfWeek() {
454
+ return this.locales[this.locale]?.daysOfWeek || this.locales['en'].daysOfWeek;
455
+ }
301
456
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CalendarArgentaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
302
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CalendarArgentaComponent, selector: "argenta-calendar", inputs: { id: "id", placeholder: "placeholder", label: "label", minDate: "minDate", maxDate: "maxDate", locale: "locale", useTime: "useTime", initialDate: "initialDate" }, outputs: { dateChange: "dateChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"form-group\">\n <label [for]=\"id\" [ngClass]=\"'label-styles'\">{{ label }}</label>\n <div class=\"input-wrapper\">\n <input\n id=\"{{ id }}\"\n type=\"text\"\n class=\"custom-input\"\n [attr.placeholder]=\"useTime ? 'dd/MM/yyyy HH:mm' : 'dd/MM/yyyy'\"\n [value]=\"inputDate\"\n (input)=\"onInputChange($event)\"\n (keypress)=\"handleKeyPress($event)\"\n (click)=\"toggleCalendar()\"\n />\n <!-- \u00CDcone de calend\u00E1rio dentro do input -->\n <lucide-icon name=\"calendar\" class=\"calendar-icon\"></lucide-icon>\n </div>\n\n <!-- Mensagem de erro estilo bal\u00E3ozinho -->\n <div *ngIf=\"invalidDate\" class=\"error-message\">\n {{ locales[locale].invalidDateMessage }}\n <!-- Mostra a parte de 'HH:mm' apenas se useTime for verdadeiro -->\n <span *ngIf=\"useTime\"> HH:mm.</span>\n </div>\n\n <div class=\"calendar-wrapper\">\n <div class=\"calendar-container\" [ngClass]=\"{ open: isCalendarVisible }\">\n <div class=\"calendar\">\n <div class=\"calendar-header\">\n <button (click)=\"prevMonth()\">&#8249;</button>\n <span>{{ months[currentMonth] }} {{ currentYear }}</span>\n <button (click)=\"nextMonth()\">&#8250;</button>\n </div>\n\n <div class=\"calendar-body\">\n <div class=\"calendar-day-names\">\n <span *ngFor=\"let day of daysOfWeek\">{{ day }}</span>\n </div>\n\n <div class=\"calendar-days\">\n <span\n *ngFor=\"let day of daysInMonth; let i = index\"\n [class.today]=\"isToday(day)\"\n [class.selected]=\"isSelected(day)\"\n [class.disabled]=\"isDateDisabled(day)\"\n (click)=\"day ? selectDate(day) : null\"\n >\n <!-- Somente permite clique em dias v\u00E1lidos -->\n {{ day ? day : \"\" }}\n <!-- Exibe o dia se for v\u00E1lido, sen\u00E3o exibe vazio -->\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\";body{font-family:Inter,sans-serif}.calendar-container{overflow:hidden;max-height:0;transition:max-height .4s ease}.calendar-container.open{max-height:500px}.calendar{display:inline-block;border:1px solid #ccc;border-radius:8px;padding:10px;width:450px;font-family:Inter,Arial,sans-serif;transition:max-height .4s ease}.calendar .calendar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-weight:700}.calendar .calendar-header button{background-color:#00444c;color:#fff;border:none;padding:8px 12px;cursor:pointer;border-radius:8px;font-size:1.2rem;transition:background-color .2s}.calendar .calendar-header button:hover{background-color:#2ca58d}.calendar .calendar-header span{font-size:1.4rem;color:#00444c;text-align:center;flex-grow:1}.calendar .calendar-body{display:grid;grid-template-columns:repeat(7,1fr);gap:7px}.calendar .calendar-body .calendar-day-names{display:contents}.calendar .calendar-body .calendar-day-names span{text-align:center;font-weight:700;margin-bottom:5px;font-size:.9rem}.calendar .calendar-body .calendar-day-names span:nth-child(1){color:#ff8080}.calendar .calendar-body .calendar-day-names span:nth-child(7){color:#555}.calendar .calendar-body .calendar-days{display:contents}.calendar .calendar-body .calendar-days span{display:flex;justify-content:center;align-items:center;margin:1px;padding:10px;height:45px;width:45px;cursor:pointer;border-radius:50%;transition:background-color .2s,color .2s ease}.calendar .calendar-body .calendar-days span.today{background-color:#2ca58d;color:#fff}.calendar .calendar-body .calendar-days span.selected{background-color:#00444c;color:#fff}.calendar .calendar-body .calendar-days span.disabled{background-color:#e9ecef;color:#999;cursor:not-allowed}.calendar .calendar-body .calendar-days span:hover:not(.disabled){background-color:#2ca58d;color:#fff}.custom-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:.9rem;height:46px;padding:.5rem .75rem;border:1px solid #ccc;border-radius:4px;width:100%;box-sizing:border-box}.custom-input::placeholder{font-size:14px;color:#d3d3d3}.label-styles{font-weight:400;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.5rem}.error-message{position:relative;background-color:#ff8080;color:#fff;padding:10px;border-radius:8px;font-size:.9rem;max-width:250px;margin-top:5px}.error-message:after{content:\"\";position:absolute;top:100%;left:20px;border-width:10px;border-style:solid;border-color:#ff8080 transparent transparent transparent}.input-wrapper{position:relative;display:inline-block;width:100%}.input-wrapper .custom-input{width:100%;padding-right:40px;box-sizing:border-box}.input-wrapper .calendar-icon{position:absolute;top:50%;right:10px;transform:translateY(-50%);pointer-events:none;color:#b8b8b8}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }] }); }
457
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CalendarArgentaComponent, selector: "argenta-calendar", inputs: { id: "id", placeholder: "placeholder", label: "label", minDate: "minDate", maxDate: "maxDate", locale: "locale", useTime: "useTime", initialDate: "initialDate", rangeMode: "rangeMode", startDate: "startDate", endDate: "endDate", closeButtonLabel: "closeButtonLabel" }, outputs: { rangeChange: "rangeChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"form-group\">\n <label [for]=\"id\" [ngClass]=\"'label-styles'\">{{ label }}</label>\n <div class=\"input-wrapper\">\n <input\n id=\"{{ id }}\"\n type=\"text\"\n class=\"custom-input\"\n [attr.placeholder]=\"rangeMode && useTime ? 'dd/MM/yyyy HH:mm - dd/MM/yyyy HH:mm' : \n rangeMode && !useTime ? 'dd/MM/yyyy - dd/MM/yyyy' :(!rangeMode && useTime ? 'dd/MM/yyyy HH:mm' : 'dd/MM/yyyy')\"\n [value]=\"inputDate\"\n (input)=\"onInputChange($event)\"\n (keypress)=\"handleKeyPress($event)\"\n (click)=\"toggleCalendar()\"\n />\n <lucide-icon name=\"calendar\" class=\"calendar-icon\"></lucide-icon>\n </div>\n\n <div *ngIf=\"invalidDate\" class=\"error-message\">\n {{ locales[locale].invalidDateMessage }}\n <span *ngIf=\"useTime\"> HH:mm.</span>\n </div>\n\n <div class=\"calendar-wrapper\">\n <div class=\"calendar-container\" [ngClass]=\"{ open: isCalendarVisible }\">\n <div class=\"calendar\">\n <div class=\"calendar-header\">\n <button (click)=\"prevMonth()\">&#8249;</button>\n <span>{{ months[currentMonth] }} {{ currentYear }}</span>\n <button (click)=\"nextMonth()\">&#8250;</button>\n </div>\n\n <div class=\"calendar-body\">\n <div class=\"calendar-day-names\">\n <span *ngFor=\"let day of daysOfWeek\">{{ day }}</span>\n </div>\n\n <div class=\"calendar-days\">\n <span\n *ngFor=\"let day of daysInMonth; let i = index\"\n [class.today]=\"isToday(day)\"\n [class.selected]=\"isSelected(day)\"\n [class.in-range]=\"isInRange(day)\"\n [class.disabled]=\"isDateDisabled(day)\"\n (click)=\"day ? selectDate(day) : null\"\n >\n {{ day ? day : \"\" }}\n </span>\n </div>\n </div>\n\n <!-- Inputs para inser\u00E7\u00E3o das horas -->\n <div *ngIf=\"useTime\" class=\"time-inputs\">\n <!-- Campo de hora de in\u00EDcio -->\n <div *ngIf=\"rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.startTimeLabel || 'Hora de In\u00EDcio' }}</label> <!-- Usando tradu\u00E7\u00E3o -->\n <input type=\"time\" [(ngModel)]=\"startTime\" (change)=\"onTimeChange('start')\" />\n </div>\n\n <!-- Campo de hora de fim -->\n <div *ngIf=\"rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.endTimeLabel || 'Hora de Fim' }}</label> <!-- Usando tradu\u00E7\u00E3o -->\n <input type=\"time\" [(ngModel)]=\"endTime\" (change)=\"onTimeChange('end')\" />\n </div>\n\n <!-- Campo de hora \u00FAnica (se n\u00E3o for range) -->\n <div *ngIf=\"!rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.startTimeLabel || 'Hora' }}</label> <!-- Usando o label de in\u00EDcio -->\n <input type=\"time\" [(ngModel)]=\"selectedTime\" (change)=\"onTimeChange('single')\" />\n </div>\n </div>\n\n <!-- Bot\u00E3o de fechar o calend\u00E1rio -->\n <button class=\"close-button\" (click)=\"closeCalendar()\">{{ closeButtonLabel }}</button>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\";body{font-family:Inter,sans-serif}.calendar-container{overflow:hidden;max-height:0;transition:max-height .4s ease;position:absolute;top:100%;left:0;z-index:9999;background-color:#fff;box-shadow:0 4px 12px #0000001a;width:auto;max-width:none}.calendar-wrapper{position:relative}@media (max-width: 300px){.calendar-container{width:100vw;left:0}}.calendar-container.open{max-height:500px}.calendar{display:inline-block;border:1px solid #ccc;border-radius:8px;padding:10px;width:450px;font-family:Inter,Arial,sans-serif;transition:max-height .4s ease;background-color:#f5f5f5}.calendar .calendar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-weight:700}.calendar .calendar-header button{background-color:#00444c;color:#fff;border:none;padding:8px 12px;cursor:pointer;border-radius:8px;font-size:1.2rem;transition:background-color .2s}.calendar .calendar-header button:hover{background-color:#2ca58d}.calendar .calendar-header span{font-size:1.4rem;color:#00444c;text-align:center;flex-grow:1}.calendar .calendar-body{display:grid;grid-template-columns:repeat(7,1fr);gap:7px}.calendar .calendar-body .calendar-day-names{display:contents}.calendar .calendar-body .calendar-day-names span{text-align:center;font-weight:700;margin-bottom:5px;font-size:.9rem}.calendar .calendar-body .calendar-day-names span:nth-child(1){color:#ff8080}.calendar .calendar-body .calendar-day-names span:nth-child(7){color:#555}.calendar .calendar-body .calendar-days{display:contents}.calendar .calendar-body .calendar-days span{display:flex;justify-content:center;align-items:center;margin:1px;padding:10px;height:45px;width:45px;cursor:pointer;border-radius:50%;transition:background-color .2s,color .2s ease}.calendar .calendar-body .calendar-days span.today{background-color:#2ca58d;color:#fff}.calendar .calendar-body .calendar-days span.selected{background-color:#00444c;color:#fff}.calendar .calendar-body .calendar-days span.disabled{background-color:#e9ecef;color:#999;cursor:not-allowed}.calendar .calendar-body .calendar-days span:hover:not(.disabled){background-color:#2ca58d;color:#fff}.custom-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:.9rem;height:46px;padding:.5rem .75rem;border:1px solid #ccc;border-radius:4px;width:100%;box-sizing:border-box}.custom-input::placeholder{font-size:14px;color:#d3d3d3}.label-styles{font-weight:400;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.5rem}.error-message{position:relative;background-color:#ff8080;color:#fff;padding:10px;border-radius:8px;font-size:.9rem;max-width:250px;margin-top:5px}.error-message:after{content:\"\";position:absolute;top:100%;left:20px;border-width:10px;border-style:solid;border-color:#ff8080 transparent transparent transparent}.input-wrapper{position:relative;display:inline-block;width:100%}.input-wrapper .custom-input{width:100%;padding-right:40px;box-sizing:border-box}.input-wrapper .calendar-icon{position:absolute;top:50%;right:10px;transform:translateY(-50%);pointer-events:none;color:#b8b8b8}.calendar-days{display:contents}.calendar-days span{display:flex;justify-content:center;align-items:center;margin:1px;padding:10px;height:45px;width:45px;cursor:pointer;border-radius:50%;transition:background-color .2s,color .2s ease}.calendar-days span.today{background-color:#2ca58d;color:#fff;text-decoration:underline}.calendar-days span.selected{background-color:#00444c;color:#fff}.calendar-days span.in-range{background-color:#fd9;color:#000}.calendar-days span.disabled{background-color:#e9ecef;color:#999;cursor:not-allowed}.calendar-days span:hover:not(.disabled){background-color:#2ca58d;color:#fff}.calendar-body{position:relative}.close-button{float:right;margin-top:10px;background-color:#fff3cd;color:#383838;border:none;padding:6px 12px;cursor:pointer;border-radius:20px;font-size:12px;font-weight:500;transition:all .2s ease}.close-button:hover{background-color:#e9ebec;box-shadow:0 2px 4px #00000026}.close-button:active{transform:translateY(1px)}.time-inputs{display:flex;justify-content:space-between;margin-top:10px}.time-input{display:flex;flex-direction:column;width:45%}.time-input label{font-size:.9rem;margin-bottom:5px}.time-input input{padding:8px;font-size:.9rem;border:1px solid #ccc;border-radius:4px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }] }); }
303
458
  }
304
459
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CalendarArgentaComponent, decorators: [{
305
460
  type: Component,
306
- args: [{ selector: 'argenta-calendar', template: "<div class=\"form-group\">\n <label [for]=\"id\" [ngClass]=\"'label-styles'\">{{ label }}</label>\n <div class=\"input-wrapper\">\n <input\n id=\"{{ id }}\"\n type=\"text\"\n class=\"custom-input\"\n [attr.placeholder]=\"useTime ? 'dd/MM/yyyy HH:mm' : 'dd/MM/yyyy'\"\n [value]=\"inputDate\"\n (input)=\"onInputChange($event)\"\n (keypress)=\"handleKeyPress($event)\"\n (click)=\"toggleCalendar()\"\n />\n <!-- \u00CDcone de calend\u00E1rio dentro do input -->\n <lucide-icon name=\"calendar\" class=\"calendar-icon\"></lucide-icon>\n </div>\n\n <!-- Mensagem de erro estilo bal\u00E3ozinho -->\n <div *ngIf=\"invalidDate\" class=\"error-message\">\n {{ locales[locale].invalidDateMessage }}\n <!-- Mostra a parte de 'HH:mm' apenas se useTime for verdadeiro -->\n <span *ngIf=\"useTime\"> HH:mm.</span>\n </div>\n\n <div class=\"calendar-wrapper\">\n <div class=\"calendar-container\" [ngClass]=\"{ open: isCalendarVisible }\">\n <div class=\"calendar\">\n <div class=\"calendar-header\">\n <button (click)=\"prevMonth()\">&#8249;</button>\n <span>{{ months[currentMonth] }} {{ currentYear }}</span>\n <button (click)=\"nextMonth()\">&#8250;</button>\n </div>\n\n <div class=\"calendar-body\">\n <div class=\"calendar-day-names\">\n <span *ngFor=\"let day of daysOfWeek\">{{ day }}</span>\n </div>\n\n <div class=\"calendar-days\">\n <span\n *ngFor=\"let day of daysInMonth; let i = index\"\n [class.today]=\"isToday(day)\"\n [class.selected]=\"isSelected(day)\"\n [class.disabled]=\"isDateDisabled(day)\"\n (click)=\"day ? selectDate(day) : null\"\n >\n <!-- Somente permite clique em dias v\u00E1lidos -->\n {{ day ? day : \"\" }}\n <!-- Exibe o dia se for v\u00E1lido, sen\u00E3o exibe vazio -->\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\";body{font-family:Inter,sans-serif}.calendar-container{overflow:hidden;max-height:0;transition:max-height .4s ease}.calendar-container.open{max-height:500px}.calendar{display:inline-block;border:1px solid #ccc;border-radius:8px;padding:10px;width:450px;font-family:Inter,Arial,sans-serif;transition:max-height .4s ease}.calendar .calendar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-weight:700}.calendar .calendar-header button{background-color:#00444c;color:#fff;border:none;padding:8px 12px;cursor:pointer;border-radius:8px;font-size:1.2rem;transition:background-color .2s}.calendar .calendar-header button:hover{background-color:#2ca58d}.calendar .calendar-header span{font-size:1.4rem;color:#00444c;text-align:center;flex-grow:1}.calendar .calendar-body{display:grid;grid-template-columns:repeat(7,1fr);gap:7px}.calendar .calendar-body .calendar-day-names{display:contents}.calendar .calendar-body .calendar-day-names span{text-align:center;font-weight:700;margin-bottom:5px;font-size:.9rem}.calendar .calendar-body .calendar-day-names span:nth-child(1){color:#ff8080}.calendar .calendar-body .calendar-day-names span:nth-child(7){color:#555}.calendar .calendar-body .calendar-days{display:contents}.calendar .calendar-body .calendar-days span{display:flex;justify-content:center;align-items:center;margin:1px;padding:10px;height:45px;width:45px;cursor:pointer;border-radius:50%;transition:background-color .2s,color .2s ease}.calendar .calendar-body .calendar-days span.today{background-color:#2ca58d;color:#fff}.calendar .calendar-body .calendar-days span.selected{background-color:#00444c;color:#fff}.calendar .calendar-body .calendar-days span.disabled{background-color:#e9ecef;color:#999;cursor:not-allowed}.calendar .calendar-body .calendar-days span:hover:not(.disabled){background-color:#2ca58d;color:#fff}.custom-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:.9rem;height:46px;padding:.5rem .75rem;border:1px solid #ccc;border-radius:4px;width:100%;box-sizing:border-box}.custom-input::placeholder{font-size:14px;color:#d3d3d3}.label-styles{font-weight:400;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.5rem}.error-message{position:relative;background-color:#ff8080;color:#fff;padding:10px;border-radius:8px;font-size:.9rem;max-width:250px;margin-top:5px}.error-message:after{content:\"\";position:absolute;top:100%;left:20px;border-width:10px;border-style:solid;border-color:#ff8080 transparent transparent transparent}.input-wrapper{position:relative;display:inline-block;width:100%}.input-wrapper .custom-input{width:100%;padding-right:40px;box-sizing:border-box}.input-wrapper .calendar-icon{position:absolute;top:50%;right:10px;transform:translateY(-50%);pointer-events:none;color:#b8b8b8}\n"] }]
461
+ args: [{ selector: 'argenta-calendar', template: "<div class=\"form-group\">\n <label [for]=\"id\" [ngClass]=\"'label-styles'\">{{ label }}</label>\n <div class=\"input-wrapper\">\n <input\n id=\"{{ id }}\"\n type=\"text\"\n class=\"custom-input\"\n [attr.placeholder]=\"rangeMode && useTime ? 'dd/MM/yyyy HH:mm - dd/MM/yyyy HH:mm' : \n rangeMode && !useTime ? 'dd/MM/yyyy - dd/MM/yyyy' :(!rangeMode && useTime ? 'dd/MM/yyyy HH:mm' : 'dd/MM/yyyy')\"\n [value]=\"inputDate\"\n (input)=\"onInputChange($event)\"\n (keypress)=\"handleKeyPress($event)\"\n (click)=\"toggleCalendar()\"\n />\n <lucide-icon name=\"calendar\" class=\"calendar-icon\"></lucide-icon>\n </div>\n\n <div *ngIf=\"invalidDate\" class=\"error-message\">\n {{ locales[locale].invalidDateMessage }}\n <span *ngIf=\"useTime\"> HH:mm.</span>\n </div>\n\n <div class=\"calendar-wrapper\">\n <div class=\"calendar-container\" [ngClass]=\"{ open: isCalendarVisible }\">\n <div class=\"calendar\">\n <div class=\"calendar-header\">\n <button (click)=\"prevMonth()\">&#8249;</button>\n <span>{{ months[currentMonth] }} {{ currentYear }}</span>\n <button (click)=\"nextMonth()\">&#8250;</button>\n </div>\n\n <div class=\"calendar-body\">\n <div class=\"calendar-day-names\">\n <span *ngFor=\"let day of daysOfWeek\">{{ day }}</span>\n </div>\n\n <div class=\"calendar-days\">\n <span\n *ngFor=\"let day of daysInMonth; let i = index\"\n [class.today]=\"isToday(day)\"\n [class.selected]=\"isSelected(day)\"\n [class.in-range]=\"isInRange(day)\"\n [class.disabled]=\"isDateDisabled(day)\"\n (click)=\"day ? selectDate(day) : null\"\n >\n {{ day ? day : \"\" }}\n </span>\n </div>\n </div>\n\n <!-- Inputs para inser\u00E7\u00E3o das horas -->\n <div *ngIf=\"useTime\" class=\"time-inputs\">\n <!-- Campo de hora de in\u00EDcio -->\n <div *ngIf=\"rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.startTimeLabel || 'Hora de In\u00EDcio' }}</label> <!-- Usando tradu\u00E7\u00E3o -->\n <input type=\"time\" [(ngModel)]=\"startTime\" (change)=\"onTimeChange('start')\" />\n </div>\n\n <!-- Campo de hora de fim -->\n <div *ngIf=\"rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.endTimeLabel || 'Hora de Fim' }}</label> <!-- Usando tradu\u00E7\u00E3o -->\n <input type=\"time\" [(ngModel)]=\"endTime\" (change)=\"onTimeChange('end')\" />\n </div>\n\n <!-- Campo de hora \u00FAnica (se n\u00E3o for range) -->\n <div *ngIf=\"!rangeMode\" class=\"time-input\">\n <label>{{ locales[locale]?.startTimeLabel || 'Hora' }}</label> <!-- Usando o label de in\u00EDcio -->\n <input type=\"time\" [(ngModel)]=\"selectedTime\" (change)=\"onTimeChange('single')\" />\n </div>\n </div>\n\n <!-- Bot\u00E3o de fechar o calend\u00E1rio -->\n <button class=\"close-button\" (click)=\"closeCalendar()\">{{ closeButtonLabel }}</button>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\";body{font-family:Inter,sans-serif}.calendar-container{overflow:hidden;max-height:0;transition:max-height .4s ease;position:absolute;top:100%;left:0;z-index:9999;background-color:#fff;box-shadow:0 4px 12px #0000001a;width:auto;max-width:none}.calendar-wrapper{position:relative}@media (max-width: 300px){.calendar-container{width:100vw;left:0}}.calendar-container.open{max-height:500px}.calendar{display:inline-block;border:1px solid #ccc;border-radius:8px;padding:10px;width:450px;font-family:Inter,Arial,sans-serif;transition:max-height .4s ease;background-color:#f5f5f5}.calendar .calendar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-weight:700}.calendar .calendar-header button{background-color:#00444c;color:#fff;border:none;padding:8px 12px;cursor:pointer;border-radius:8px;font-size:1.2rem;transition:background-color .2s}.calendar .calendar-header button:hover{background-color:#2ca58d}.calendar .calendar-header span{font-size:1.4rem;color:#00444c;text-align:center;flex-grow:1}.calendar .calendar-body{display:grid;grid-template-columns:repeat(7,1fr);gap:7px}.calendar .calendar-body .calendar-day-names{display:contents}.calendar .calendar-body .calendar-day-names span{text-align:center;font-weight:700;margin-bottom:5px;font-size:.9rem}.calendar .calendar-body .calendar-day-names span:nth-child(1){color:#ff8080}.calendar .calendar-body .calendar-day-names span:nth-child(7){color:#555}.calendar .calendar-body .calendar-days{display:contents}.calendar .calendar-body .calendar-days span{display:flex;justify-content:center;align-items:center;margin:1px;padding:10px;height:45px;width:45px;cursor:pointer;border-radius:50%;transition:background-color .2s,color .2s ease}.calendar .calendar-body .calendar-days span.today{background-color:#2ca58d;color:#fff}.calendar .calendar-body .calendar-days span.selected{background-color:#00444c;color:#fff}.calendar .calendar-body .calendar-days span.disabled{background-color:#e9ecef;color:#999;cursor:not-allowed}.calendar .calendar-body .calendar-days span:hover:not(.disabled){background-color:#2ca58d;color:#fff}.custom-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:.9rem;height:46px;padding:.5rem .75rem;border:1px solid #ccc;border-radius:4px;width:100%;box-sizing:border-box}.custom-input::placeholder{font-size:14px;color:#d3d3d3}.label-styles{font-weight:400;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.5rem}.error-message{position:relative;background-color:#ff8080;color:#fff;padding:10px;border-radius:8px;font-size:.9rem;max-width:250px;margin-top:5px}.error-message:after{content:\"\";position:absolute;top:100%;left:20px;border-width:10px;border-style:solid;border-color:#ff8080 transparent transparent transparent}.input-wrapper{position:relative;display:inline-block;width:100%}.input-wrapper .custom-input{width:100%;padding-right:40px;box-sizing:border-box}.input-wrapper .calendar-icon{position:absolute;top:50%;right:10px;transform:translateY(-50%);pointer-events:none;color:#b8b8b8}.calendar-days{display:contents}.calendar-days span{display:flex;justify-content:center;align-items:center;margin:1px;padding:10px;height:45px;width:45px;cursor:pointer;border-radius:50%;transition:background-color .2s,color .2s ease}.calendar-days span.today{background-color:#2ca58d;color:#fff;text-decoration:underline}.calendar-days span.selected{background-color:#00444c;color:#fff}.calendar-days span.in-range{background-color:#fd9;color:#000}.calendar-days span.disabled{background-color:#e9ecef;color:#999;cursor:not-allowed}.calendar-days span:hover:not(.disabled){background-color:#2ca58d;color:#fff}.calendar-body{position:relative}.close-button{float:right;margin-top:10px;background-color:#fff3cd;color:#383838;border:none;padding:6px 12px;cursor:pointer;border-radius:20px;font-size:12px;font-weight:500;transition:all .2s ease}.close-button:hover{background-color:#e9ebec;box-shadow:0 2px 4px #00000026}.close-button:active{transform:translateY(1px)}.time-inputs{display:flex;justify-content:space-between;margin-top:10px}.time-input{display:flex;flex-direction:column;width:45%}.time-input label{font-size:.9rem;margin-bottom:5px}.time-input input{padding:8px;font-size:.9rem;border:1px solid #ccc;border-radius:4px}\n"] }]
307
462
  }], propDecorators: { id: [{
308
463
  type: Input
309
464
  }], placeholder: [{
@@ -320,7 +475,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
320
475
  type: Input
321
476
  }], initialDate: [{
322
477
  type: Input
323
- }], dateChange: [{
478
+ }], rangeMode: [{
479
+ type: Input
480
+ }], startDate: [{
481
+ type: Input
482
+ }], endDate: [{
483
+ type: Input
484
+ }], closeButtonLabel: [{
485
+ type: Input
486
+ }], rangeChange: [{
324
487
  type: Output
325
488
  }] } });
326
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWItcG9ydGFsLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyLWFyZ2VudGEvY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWItcG9ydGFsLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyLWFyZ2VudGEvY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQzs7OztBQU96RyxNQUFNLE9BQU8sd0JBQXdCO0lBTHJDO1FBTWEsT0FBRSxHQUFXLGtCQUFrQixDQUFDO1FBQ2hDLGdCQUFXLEdBQVcsZUFBZSxDQUFDO1FBQ3RDLFVBQUssR0FBVyxlQUFlLENBQUM7UUFDaEMsWUFBTyxHQUFnQixJQUFJLENBQUM7UUFDNUIsWUFBTyxHQUFnQixJQUFJLENBQUM7UUFDNUIsV0FBTSxHQUFXLElBQUksQ0FBQyxDQUFDLGtDQUFrQztRQUN6RCxZQUFPLEdBQVksS0FBSyxDQUFDLENBQUMsMENBQTBDO1FBQ3BFLGdCQUFXLEdBQWtCLElBQUksQ0FBQyxDQUFDLDBDQUEwQztRQUM1RSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVsRCxnQkFBVyxHQUFXLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsaUJBQVksR0FBVyxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdDLGlCQUFZLEdBQWdCLElBQUksQ0FBQztRQUNqQyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsY0FBUyxHQUFXLEVB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QU8sSUFBSSxDQUFDO1FBQ3JELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7K0dBblZRLHdCQUF3QjttR0FBeEIsd0JBQXdCLGdTQ1ByQyx3aUVBd0RBOzs0RkRqRGEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNJLGtCQUFrQjs4QkFLbkIsRUFBRTtzQkFBVixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcmdlbnRhLWNhbGVuZGFyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckFyZ2VudGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICdhcmdlbnRhLWNhbGVuZGFyJztcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlbGVjdCBhIGRhdGUnO1xuICAgIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnU2VsZWN0IGEgZGF0ZSc7XG4gICAgQElucHV0KCkgbWluRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIG1heERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBsb2NhbGU6IHN0cmluZyA9ICdwdCc7IC8vIFN1cG9ydGUgcGFyYSBkaWZlcmVudGVzIGlkaW9tYXNcbiAgICBASW5wdXQoKSB1c2VUaW1lOiBib29sZWFuID0gZmFsc2U7IC8vIFByb3ByaWVkYWRlIHBhcmEgZGVmaW5pciBzZSBpbmNsdWkgaG9yYVxuICAgIEBJbnB1dCgpIGluaXRpYWxEYXRlOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gUHJvcHJpZWRhZGUgcGFyYSByZWNlYmVyIGEgZGF0YSBpbmljaWFsXG4gICAgQE91dHB1dCgpIGRhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIGN1cnJlbnRZZWFyOiBudW1iZXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgY3VycmVudE1vbnRoOiBudW1iZXIgPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCk7XG4gICAgc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgaXNDYWxlbmRhclZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpbnB1dERhdGU6IHN0cmluZyA9ICcnO1xuICAgIGludmFsaWREYXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBsb2NhbGVzOiBhbnkgPSB7XG4gICAgICAgIGVuOiB7XG4gICAgICAgICAgICBtb250aHM6IFtcbiAgICAgICAgICAgICAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JyxcbiAgICAgICAgICAgICAgICAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRheXNPZldlZWs6IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXSxcbiAgICAgICAgICAgIGludmFsaWREYXRlTWVzc2FnZTogJ0ludmFsaWQgZGF0ZS4gUGxlYXNlIGVudGVyIGEgZGF0ZSBpbiB0aGUgZm9ybWF0IGRkL01NL3l5eXknXG4gICAgICAgIH0sXG4gICAgICAgIHB0OiB7XG4gICAgICAgICAgICBtb250aHM6IFtcbiAgICAgICAgICAgICAgICAnSmFuZWlybycsICdGZXZlcmVpcm8nLCAnTWFyw6dvJywgJ0FicmlsJywgJ01haW8nLCAnSnVuaG8nLCAnSnVsaG8nLFxuICAgICAgICAgICAgICAgICdBZ29zdG8nLCAnU2V0ZW1icm8nLCAnT3V0dWJybycsICdOb3ZlbWJybycsICdEZXplbWJybydcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkYXlzT2ZXZWVrOiBbJ0RvbScsICdTZWcnLCAnVGVyJywgJ1F1YScsICdRdWknLCAnU2V4JywgJ1PDoWInXSxcbiAgICAgICAgICAgIGludmFsaWREYXRlTWVzc2FnZTogJ0RhdGEgaW52w6FsaWRhLiBQb3IgZmF2b3IsIGluc2lyYSB1bWEgZGF0YSBubyBmb3JtYXRvIGRkL01NL3l5eXknXG4gICAgICAgIH0sXG4gICAgICAgIGVzOiB7XG4gICAgICAgICAgICBtb250aHM6IFtcbiAgICAgICAgICAgICAgICAnRW5lcm8nLCAnRmVicmVybycsICdNYXJ6bycsICdBYnJpbCcsICdNYXlvJywgJ0p1bmlvJywgJ0p1bGlvJyxcbiAgICAgICAgICAgICAgICAnQWdvc3RvJywgJ1NlcHRpZW1icmUnLCAnT2N0dWJyZScsICdOb3ZpZW1icmUnLCAnRGljaWVtYnJlJ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRheXNPZldlZWs6IFsnRG8nLCAnTHUnLCAnTWEnLCAnTWknLCAnSnUnLCAnVmknLCAnU8OhJ10sXG4gICAgICAgICAgICBpbnZhbGlkRGF0ZU1lc3NhZ2U6ICdGZWNoYSBpbnbDoWxpZGEuIFBvciBmYXZvciwgaW5ncmVzZSB1bmEgZmVjaGEgZW4gZWwgZm9ybWF0byBkZC9NTS95eXl5J1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsRGF0ZSkge1xuICAgICAgICAgICAgLy8gU2UgYSBpbml0aWFsRGF0ZSBmb3IgZm9ybmVjaWRhLCB1c2Ftb3MgZWxhXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyKHRoaXMuaW5pdGlhbERhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2FzbyBjb250csOhcmlvLCB1c2Ftb3MgYSBkYXRhIGF0dWFsXG4gICAgICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHRvZGF5O1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KHRvZGF5KTtcbiAgICAgICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMuaW5wdXREYXRlKTsgLy8gRW1pdGUgYSBkYXRhIGluaWNpYWxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxEYXRlJ10gJiYgY2hhbmdlc1snaW5pdGlhbERhdGUnXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXIoY2hhbmdlc1snaW5pdGlhbERhdGUnXS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTcOpdG9kbyBwYXJhIGF0dWFsaXphciBvIGNhbGVuZMOhcmlvIGNvbSBhIGRhdGEgcGFzc2FkYVxuICAgIHVwZGF0ZUNhbGVuZGFyKGRhdGVTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZVN0cmluZyk7XG5cbiAgICAgICAgLy8gVmVyaWZpY2Egc2UgYSBkYXRhIMOpIHbDoWxpZGFcbiAgICAgICAgaWYgKHBhcnNlZERhdGUgIT09IG51bGwgJiYgdGhpcy52YWxpZGF0ZURhdGUoZGF0ZVN0cmluZykpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gcGFyc2VkRGF0ZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXIgPSBwYXJzZWREYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHBhcnNlZERhdGUuZ2V0TW9udGgoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXREYXRlRm9yRGlzcGxheShwYXJzZWREYXRlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMuaW5wdXREYXRlKTsgLy8gRW1pdGUgYSBub3ZhIGRhdGFcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSBmYWxzZTsgLy8gUmVtb3ZlIG8gc3RhdHVzIGRlIGRhdGEgaW52w6FsaWRhXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gdHJ1ZTsgLy8gTWFyY2EgYSBkYXRhIGNvbW8gaW52w6FsaWRhXG4gICAgICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCgnRGF0YSBvdSBob3JhIGludsOhbGlkYScpOyAvLyBFbWl0ZSBtZW5zYWdlbSBkZSBlcnJvXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRGF0YSBvdSBob3JhIGludsOhbGlkYSBwYXNzYWRhIHBhcmEgbyBjb21wb25lbnRlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbklucHV0Q2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmFwcGx5RGF0ZU1hc2soaW5wdXRWYWx1ZSk7XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gcGFyYSBvYnJpZ2FyIGEgaG9yYSBxdWFuZG8gdXNlVGltZSBmb3IgdmVyZGFkZWlyb1xuICAgICAgICBpZiAodGhpcy51c2VUaW1lKSB7XG4gICAgICAgICAgICAvLyBTZSBhIGVudHJhZGEgbsOjbyB0aXZlciBvIGNvbXByaW1lbnRvIGNvcnJldG8gcGFyYSBkYXRhICsgaG9yYVxuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXREYXRlLmxlbmd0aCA8IDE2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkRGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoJ0RhdGEgb3UgaG9yYSBpbnbDoWxpZGEnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb21lbnRlIHZhbGlkYXIgYSBob3JhIHNlIG8gY2FtcG8gdXNlVGltZSBlc3RpdmVyIGF0aXZvIGUgbyBmb3JtYXRvIGVzdGl2ZXIgY29ycmV0b1xuICAgICAgICBpZiAodGhpcy51c2VUaW1lICYmIHRoaXMuaW5wdXREYXRlLmxlbmd0aCA+PSAxNCkge1xuICAgICAgICAgICAgY29uc3QgW2RhdGVQYXJ0LCB0aW1lUGFydF0gPSB0aGlzLmlucHV0RGF0ZS5zcGxpdCgnICcpO1xuICAgICAgICAgICAgaWYgKHRpbWVQYXJ0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2hvdXJTdHIsIG1pbnV0ZVN0cl0gPSB0aW1lUGFydC5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvdXIgPSBOdW1iZXIoaG91clN0cik7XG4gICAgICAgICAgICAgICAgY29uc3QgbWludXRlID0gTnVtYmVyKG1pbnV0ZVN0cik7XG5cbiAgICAgICAgICAgICAgICAvLyBDb3JyaWdlIHNvbWVudGUgc2UgYSBob3JhL21pbnV0byBmb3JlbSBpbnbDoWxpZG9zXG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgPCAwIHx8IGhvdXIgPiAyMyB8fCBpc05hTihob3VyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoJ0hvcmEgaW52w6FsaWRhJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA8IDAgfHwgbWludXRlID4gNTkgfHwgaXNOYU4obWludXRlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoJ0hvcmEgaW52w6FsaWRhJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdGlyIGEgZGF0YSBxdWFuZG8gZm9yIHbDoWxpZGFcbiAgICAgICAgaWYgKCh0aGlzLnVzZVRpbWUgJiYgdGhpcy5pbnB1dERhdGUubGVuZ3RoID09PSAxNikgfHwgKCF0aGlzLnVzZVRpbWUgJiYgdGhpcy5pbnB1dERhdGUubGVuZ3RoID09PSAxMCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRGF0ZSh0aGlzLmlucHV0RGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKHRoaXMuaW5wdXREYXRlKTtcblxuICAgICAgICAgICAgICAgIC8vIFZlcmlmaWNhciBzZSBwYXJzZWREYXRlIG7Do28gw6kgbnVsbyBhbnRlcyBkZSBhY2Vzc2FyIHN1YXMgcHJvcHJpZWRhZGVzXG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZERhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50WWVhciA9IHBhcnNlZERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBwYXJzZWREYXRlLmdldE1vbnRoKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gcGFyc2VkRGF0ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBGb3JtYXRhciBhIGRhdGEgcGFyYSBkZC9NTS95eXl5IC0gSEg6bW1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZUZvckVtaXQocGFyc2VkRGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoZm9ybWF0dGVkRGF0ZSk7IC8vIEVtaXRlIGEgZGF0YSB2w6FsaWRhIGNvbSBvIGjDrWZlblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEYXRhIGludsOhbGlkYSBwYXNzYWRhIHBhcmEgbyBjb21wb25lbnRlLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCgnRGF0YSBpbnbDoWxpZGEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KCdEYXRhIGludsOhbGlkYScpOyAvLyBFbWl0ZSBvIGV2ZW50byBjb20gbWVuc2FnZW0gZGUgZXJyb1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0YXIgYSBkYXRhIGUgaG9yYSBjb20gaMOtZmVuXG4gICAgZm9ybWF0RGF0ZUZvckVtaXQoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgY29uc3QgbW9udGggPSAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gICAgICAgIGxldCBmb3JtYXR0ZWREYXRlID0gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcblxuICAgICAgICBpZiAodGhpcy51c2VUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgICBjb25zdCBtaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgICAgLy8gQWRpY2lvbmEgbyBow61mZW4gZW50cmUgYSBkYXRhIGUgYSBob3JhXG4gICAgICAgICAgICBmb3JtYXR0ZWREYXRlICs9IGAgLSAke2hvdXJzfToke21pbnV0ZXN9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXR0ZWREYXRlO1xuICAgIH1cblxuICAgIGFwcGx5RGF0ZU1hc2soaW5wdXRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGRpZ2l0c09ubHkgPSBpbnB1dFZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG5cbiAgICAgICAgLy8gTGltaXRhIG9zIGTDrWdpdG9zIGNvbSBiYXNlIG5vIHVzbyBkZSBob3JhXG4gICAgICAgIGNvbnN0IG1heExlbmd0aCA9IHRoaXMudXNlVGltZSA/IDEyIDogODtcbiAgICAgICAgaWYgKGRpZ2l0c09ubHkubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICBkaWdpdHNPbmx5ID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXkgPSBkaWdpdHNPbmx5LnN1YnN0cmluZygwLCAyKTtcbiAgICAgICAgbGV0IG1vbnRoID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMiwgNCk7XG4gICAgICAgIGxldCB5ZWFyID0gZGlnaXRzT25seS5zdWJzdHJpbmcoNCwgOCk7XG4gICAgICAgIGxldCBob3VyID0gZGlnaXRzT25seS5zdWJzdHJpbmcoOCwgMTApO1xuICAgICAgICBsZXQgbWludXRlID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMTAsIDEyKTtcblxuICAgICAgICBsZXQgbWFza2VkRGF0ZSA9IGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XG4gICAgICAgIGlmICh0aGlzLnVzZVRpbWUgJiYgaG91ciAmJiBtaW51dGUpIHtcbiAgICAgICAgICAgIG1hc2tlZERhdGUgKz0gYCAke2hvdXJ9OiR7bWludXRlfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFza2VkRGF0ZTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZURhdGUoaW5wdXRWYWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IFtkYXRlUGFydCwgdGltZVBhcnRdID0gaW5wdXRWYWx1ZS5zcGxpdCgnICcpO1xuICAgICAgICBjb25zdCBbZGF5U3RyLCBtb250aFN0ciwgeWVhclN0cl0gPSBkYXRlUGFydC5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBkYXkgPSBOdW1iZXIoZGF5U3RyKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBOdW1iZXIobW9udGhTdHIpO1xuICAgICAgICBjb25zdCB5ZWFyID0gTnVtYmVyKHllYXJTdHIpO1xuXG4gICAgICAgIC8vIFZhbGlkYcOnw6NvIGRlIGRhdGFcbiAgICAgICAgaWYgKG1vbnRoIDwgMSB8fCBtb250aCA+IDEyIHx8IHllYXJTdHIubGVuZ3RoICE9PSA0IHx8IGlzTmFOKHllYXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKS5nZXREYXRlKCk7XG4gICAgICAgIGlmIChkYXkgPCAxIHx8IGRheSA+IGxhc3REYXlPZk1vbnRoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGHDp8OjbyBkZSBob3JhXG4gICAgICAgIGlmICh0aGlzLnVzZVRpbWUgJiYgdGltZVBhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IFtob3VyU3RyLCBtaW51dGVTdHJdID0gdGltZVBhcnQuc3BsaXQoJzonKTtcbiAgICAgICAgICAgIGNvbnN0IGhvdXIgPSBOdW1iZXIoaG91clN0cik7XG4gICAgICAgICAgICBjb25zdCBtaW51dGUgPSBOdW1iZXIobWludXRlU3RyKTtcblxuICAgICAgICAgICAgaWYgKGhvdXIgPCAwIHx8IGhvdXIgPiAyMyB8fCBtaW51dGUgPCAwIHx8IG1pbnV0ZSA+IDU5IHx8IGlzTmFOKGhvdXIpIHx8IGlzTmFOKG1pbnV0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEhvcmEgb3UgbWludXRvIGludsOhbGlkb3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHBhcnNlRGF0ZShkYXRlU3RyOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IFtkYXRlUGFydCwgdGltZVBhcnRdID0gZGF0ZVN0ci5zcGxpdCgnICcpO1xuICAgICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBkYXRlUGFydC5zcGxpdCgnLycpLm1hcChOdW1iZXIpO1xuICAgICAgICBpZiAoIWRheSB8fCAhbW9udGggfHwgIXllYXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcbiAgICAgICAgaWYgKHRoaXMudXNlVGltZSAmJiB0aW1lUGFydCkge1xuICAgICAgICAgICAgY29uc3QgW2hvdXIsIG1pbnV0ZV0gPSB0aW1lUGFydC5zcGxpdCgnOicpLm1hcChOdW1iZXIpO1xuICAgICAgICAgICAgZGF0ZS5zZXRIb3Vycyhob3VyIHx8IDAsIG1pbnV0ZSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICBmb3JtYXREYXRlRm9yRGlzcGxheShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICBjb25zdCBtb250aCA9IChkYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGxldCBmb3JtYXR0ZWREYXRlID0gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcblxuICAgICAgICBpZiAodGhpcy51c2VUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgICBjb25zdCBtaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSArPSBgICR7aG91cnN9OiR7bWludXRlc31gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZERhdGU7XG4gICAgfVxuXG4gICAgdG9nZ2xlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNDYWxlbmRhclZpc2libGUgPSAhdGhpcy5pc0NhbGVuZGFyVmlzaWJsZTtcbiAgICB9XG5cbiAgICBzZWxlY3REYXRlKGRheTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgZGF5KTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KGRhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7IC8vIEFybWF6ZW5hIGEgZGF0YSBzZWxlY2lvbmFkYVxuICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RGF0ZSk7IC8vIEVtaXRlIGEgZGF0YSBzZWxlY2lvbmFkYSBhbyBjbGljYXIgbm8gY2FsZW5kw6FyaW9cbiAgICAgICAgdGhpcy5pc0NhbGVuZGFyVmlzaWJsZSA9IGZhbHNlOyAvLyBGZWNoYSBvIGNhbGVuZMOhcmlvIGFww7NzIGEgc2VsZcOnw6NvXG4gICAgfVxuXG4gICAgaGFuZGxlS2V5UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBldmVudC5rZXkuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICBpZiAoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5wdXREYXRlLnJlcGxhY2UoL1xcRC9nLCAnJykubGVuZ3RoID49ICh0aGlzLnVzZVRpbWUgPyAxMiA6IDgpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGRheXNJbk1vbnRoKCk6IGFueVtdIHtcbiAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGgsIDEpLmdldERheSgpOyAvLyBEaWEgZGEgc2VtYW5hIGRvIHByaW1laXJvIGRpYSBkbyBtw6pzXG4gICAgICAgIGNvbnN0IHRvdGFsRGF5c0luTW9udGggPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCArIDEsIDApLmdldERhdGUoKTsgLy8gVG90YWwgZGUgZGlhcyBubyBtw6pzXG5cbiAgICAgICAgY29uc3QgZGF5c0FycmF5ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdG90YWxEYXlzSW5Nb250aCB9LCAoXywgaSkgPT4gaSArIDEpOyAvLyBBcnJheSBjb20gdG9kb3Mgb3MgZGlhcyBkbyBtw6pzXG5cbiAgICAgICAgY29uc3QgbGVhZGluZ0VtcHR5RGF5cyA9IEFycmF5KGZpcnN0RGF5T2ZNb250aCkuZmlsbChudWxsKTsgLy8gRGlhcyB2YXppb3MgYW50ZXMgZG8gcHJpbWVpcm8gZGlhIGRvIG3DqnNcblxuICAgICAgICByZXR1cm4gWy4uLmxlYWRpbmdFbXB0eURheXMsIC4uLmRheXNBcnJheV07IC8vIFJldG9ybmEgb3MgZGlhcyB2YXppb3Mgc2VndWlkb3MgcGVsb3MgZGlhcyBkbyBtw6pzXG4gICAgfVxuXG5cblxuICAgIGdldCBtb250aHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzW3RoaXMubG9jYWxlXT8ubW9udGhzIHx8IHRoaXMubG9jYWxlc1snZW4nXS5tb250aHM7XG4gICAgfVxuXG4gICAgZ2V0IGRheXNPZldlZWsoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzW3RoaXMubG9jYWxlXT8uZGF5c09mV2VlayB8fCB0aGlzLmxvY2FsZXNbJ2VuJ10uZGF5c09mV2VlaztcbiAgICB9XG5cbiAgICBwcmV2TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxMTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXItLTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoLS07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMTEpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXIrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1NlbGVjdGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXkgPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNb250aCgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzZWxlY3RlZERheSA9PT0gZGF5ICYmXG4gICAgICAgICAgICBzZWxlY3RlZE1vbnRoID09PSB0aGlzLmN1cnJlbnRNb250aCAmJlxuICAgICAgICAgICAgc2VsZWN0ZWRZZWFyID09PSB0aGlzLmN1cnJlbnRZZWFyXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaXNUb2RheShkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0b2RheS5nZXRGdWxsWWVhcigpID09PSB0aGlzLmN1cnJlbnRZZWFyICYmXG4gICAgICAgICAgICB0b2RheS5nZXRNb250aCgpID09PSB0aGlzLmN1cnJlbnRNb250aCAmJlxuICAgICAgICAgICAgdG9kYXkuZ2V0RGF0ZSgpID09PSBkYXlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpc0RhdGVEaXNhYmxlZChkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGgsIGRheSk7XG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgZGF0ZSA8IHRoaXMubWluRGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLm1heERhdGUgJiYgZGF0ZSA+IHRoaXMubWF4RGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICA8bGFiZWwgW2Zvcl09XCJpZFwiIFtuZ0NsYXNzXT1cIidsYWJlbC1zdHlsZXMnXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgIDxpbnB1dFxuICAgICAgaWQ9XCJ7eyBpZCB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBjbGFzcz1cImN1c3RvbS1pbnB1dFwiXG4gICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJ1c2VUaW1lID8gJ2RkL01NL3l5eXkgSEg6bW0nIDogJ2RkL01NL3l5eXknXCJcbiAgICAgIFt2YWx1ZV09XCJpbnB1dERhdGVcIlxuICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoa2V5cHJlc3MpPVwiaGFuZGxlS2V5UHJlc3MoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoKVwiXG4gICAgLz5cbiAgICA8IS0tIMONY29uZSBkZSBjYWxlbmTDoXJpbyBkZW50cm8gZG8gaW5wdXQgLS0+XG4gICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJjYWxlbmRhclwiIGNsYXNzPVwiY2FsZW5kYXItaWNvblwiPjwvbHVjaWRlLWljb24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTWVuc2FnZW0gZGUgZXJybyBlc3RpbG8gYmFsw6NvemluaG8gLS0+XG4gIDxkaXYgKm5nSWY9XCJpbnZhbGlkRGF0ZVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgIHt7IGxvY2FsZXNbbG9jYWxlXS5pbnZhbGlkRGF0ZU1lc3NhZ2UgfX1cbiAgICA8IS0tIE1vc3RyYSBhIHBhcnRlIGRlICdISDptbScgYXBlbmFzIHNlIHVzZVRpbWUgZm9yIHZlcmRhZGVpcm8gLS0+XG4gICAgPHNwYW4gKm5nSWY9XCJ1c2VUaW1lXCI+IEhIOm1tLjwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXdyYXBwZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGFpbmVyXCIgW25nQ2xhc3NdPVwieyBvcGVuOiBpc0NhbGVuZGFyVmlzaWJsZSB9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInByZXZNb250aCgpXCI+JiM4MjQ5OzwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuPnt7IG1vbnRoc1tjdXJyZW50TW9udGhdIH19IHt7IGN1cnJlbnRZZWFyIH19PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm5leHRNb250aCgpXCI+JiM4MjUwOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1kYXktbmFtZXNcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5c09mV2Vla1wiPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1kYXlzXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIGRheXNJbk1vbnRoOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnRvZGF5XT1cImlzVG9kYXkoZGF5KVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc1NlbGVjdGVkKGRheSlcIlxuICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF5KVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkYXkgPyBzZWxlY3REYXRlKGRheSkgOiBudWxsXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPCEtLSBTb21lbnRlIHBlcm1pdGUgY2xpcXVlIGVtIGRpYXMgdsOhbGlkb3MgLS0+XG4gICAgICAgICAgICAgIHt7IGRheSA/IGRheSA6IFwiXCIgfX1cbiAgICAgICAgICAgICAgPCEtLSBFeGliZSBvIGRpYSBzZSBmb3IgdsOhbGlkbywgc2Vuw6NvIGV4aWJlIHZhemlvIC0tPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
489
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWItcG9ydGFsLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyLWFyZ2VudGEvY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWItcG9ydGFsLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyLWFyZ2VudGEvY2FsZW5kYXItYXJnZW50YS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFPekcsTUFBTSxPQUFPLHdCQUF3QjtJQUxyQztRQU1hLE9BQUUsR0FBVyxrQkFBa0IsQ0FBQztRQUNoQyxnQkFBVyxHQUFXLGVBQWUsQ0FBQztRQUN0QyxVQUFLLEdBQVcsZUFBZSxDQUFDO1FBQ2hDLFlBQU8sR0FBZ0IsSUFBSSxDQUFDO1FBQzVCLFlBQU8sR0FBZ0IsSUFBSSxDQUFDO1FBQzVCLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFDdEIsWUFBTyxHQUFZLEtBQUssQ0FBQyxDQUFDLHdCQUF3QjtRQUNsRCxnQkFBVyxHQUFrQixJQUFJLENBQUMsQ0FBQyxxQ0FBcUM7UUFDeEUsY0FBUyxHQUFZLEtBQUssQ0FBQyxDQUFDLHFDQUFxQztRQUNqRSxjQUFTLEdBQWtCLElBQUksQ0FBQyxDQUFDLDhCQUE4QjtRQUMvRCxZQUFPLEdBQWtCLElBQUksQ0FBQyxDQUFDLDJCQUEyQjtRQUMxRCxxQkFBZ0IsR0FBVyxRQUFRLENBQUMsQ0FBQywyQkFBMkI7UUFDL0QsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQyxDQUFDLDJDQUEyQztRQUV2SCxnQkFBVyxHQUFXLElB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TSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFFLENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDbEYsQ0FBQzsrR0ExZVEsd0JBQXdCO21HQUF4Qix3QkFBd0IsNFlDUHJDLCtzR0E2RUE7OzRGRHRFYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0ksa0JBQWtCOzhCQUtuQixFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FyZ2VudGEtY2FsZW5kYXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1hcmdlbnRhLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1hcmdlbnRhLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQXJnZW50YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKSBpZDogc3RyaW5nID0gJ2FyZ2VudGEtY2FsZW5kYXInO1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VsZWN0IGEgZGF0ZSc7XG4gICAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICdTZWxlY3QgYSBkYXRlJztcbiAgICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIGxvY2FsZTogc3RyaW5nID0gJ3B0JztcbiAgICBASW5wdXQoKSB1c2VUaW1lOiBib29sZWFuID0gZmFsc2U7IC8vIEluY2x1aXIgb3UgbsOjbyBhIGhvcmFcbiAgICBASW5wdXQoKSBpbml0aWFsRGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIERhdGEgaW5pY2lhbCBubyBtb2RvIGRlIGRhdGEgw7puaWNhXG4gICAgQElucHV0KCkgcmFuZ2VNb2RlOiBib29sZWFuID0gZmFsc2U7IC8vIEF0aXZhIG8gbW9kbyBkZSBpbnRlcnZhbG8gZGUgZGF0YXNcbiAgICBASW5wdXQoKSBzdGFydERhdGU6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyBEYXRhIGRlIGluw61jaW8gZG8gaW50ZXJ2YWxvXG4gICAgQElucHV0KCkgZW5kRGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIERhdGEgZGUgZmltIGRvIGludGVydmFsb1xuICAgIEBJbnB1dCgpIGNsb3NlQnV0dG9uTGFiZWw6IHN0cmluZyA9ICdGZWNoYXInOyAvLyBUZXh0byBkbyBib3TDo28gZGUgZmVjaGFyXG4gICAgQE91dHB1dCgpIHJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nIH0+KCk7IC8vIEV2ZW50byBxdWUgZW1pdGUgZGF0YSDDum5pY2Egb3UgaW50ZXJ2YWxvXG5cbiAgICBjdXJyZW50WWVhcjogbnVtYmVyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICAgIGN1cnJlbnRNb250aDogbnVtYmVyID0gbmV3IERhdGUoKS5nZXRNb250aCgpO1xuICAgIHNlbGVjdGVkRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIHNlbGVjdGVkU3RhcnREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgc2VsZWN0ZWRFbmREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgaXNDYWxlbmRhclZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpbnB1dERhdGU6IHN0cmluZyA9ICcnO1xuICAgIGludmFsaWREYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaXNTZWxlY3RpbmdTdGFydDogYm9vbGVhbiA9IHRydWU7IC8vIENvbnRyb2xhIHNlIGVzdGFtb3Mgc2VsZWNpb25hbmRvIGEgZGF0YSBpbmljaWFsIG91IGZpbmFsXG4gICAgc3RhcnRUaW1lOiBzdHJpbmcgPSAnJztcbiAgICBlbmRUaW1lOiBzdHJpbmcgPSAnJztcbiAgICBzZWxlY3RlZFRpbWU6IHN0cmluZyA9ICcnO1xuXG4gICAgbG9jYWxlczogYW55ID0ge1xuICAgICAgICBlbjoge1xuICAgICAgICAgICAgbW9udGhzOiBbXG4gICAgICAgICAgICAgICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZGF5c09mV2VlazogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuICAgICAgICAgICAgaW52YWxpZERhdGVNZXNzYWdlOiAnSW52YWxpZCBkYXRlLiBQbGVhc2UgZW50ZXIgYSBkYXRlIGluIHRoZSBmb3JtYXQgZGQvTU0veXl5eScsXG4gICAgICAgICAgICBzdGFydFRpbWVMYWJlbDogJ1N0YXJ0IFRpbWUnLCBcbiAgICAgICAgICAgIGVuZFRpbWVMYWJlbDogJ0VuZCBUaW1lJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHQ6IHtcbiAgICAgICAgICAgIG1vbnRoczogW1xuICAgICAgICAgICAgICAgICdKYW5laXJvJywgJ0ZldmVyZWlybycsICdNYXLDp28nLCAnQWJyaWwnLCAnTWFpbycsICdKdW5obycsICdKdWxobycsICdBZ29zdG8nLCAnU2V0ZW1icm8nLCAnT3V0dWJybycsICdOb3ZlbWJybycsICdEZXplbWJybydcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkYXlzT2ZXZWVrOiBbJ0RvbScsICdTZWcnLCAnVGVyJywgJ1F1YScsICdRdWknLCAnU2V4JywgJ1PDoWInXSxcbiAgICAgICAgICAgIGludmFsaWREYXRlTWVzc2FnZTogJ0RhdGEgaW52w6FsaWRhLiBQb3IgZmF2b3IsIGluc2lyYSB1bWEgZGF0YSBubyBmb3JtYXRvIGRkL01NL3l5eXknLFxuICAgICAgICAgICAgc3RhcnRUaW1lTGFiZWw6ICdIb3JhIGRlIEluw61jaW8nLCBcbiAgICAgICAgICAgIGVuZFRpbWVMYWJlbDogJ0hvcmEgZGUgRmltJyxcbiAgICAgICAgfSxcbiAgICAgICAgZXM6IHtcbiAgICAgICAgICAgIG1vbnRoczogW1xuICAgICAgICAgICAgICAgICdFbmVybycsICdGZWJyZXJvJywgJ01hcnpvJywgJ0FicmlsJywgJ01heW8nLCAnSnVuaW8nLCAnSnVsaW8nLCAnQWdvc3RvJywgJ1NlcHRpZW1icmUnLCAnT2N0dWJyZScsICdOb3ZpZW1icmUnLCAnRGljaWVtYnJlJ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRheXNPZldlZWs6IFsnRG8nLCAnTHUnLCAnTWEnLCAnTWknLCAnSnUnLCAnVmknLCAnU8OhJ10sXG4gICAgICAgICAgICBpbnZhbGlkRGF0ZU1lc3NhZ2U6ICdGZWNoYSBpbnbDoWxpZGEuIFBvciBmYXZvciwgaW5ncmVzZSB1bmEgZmVjaGEgZW4gZWwgZm9ybWF0byBkZC9NTS95eXl5JyxcbiAgICAgICAgICAgIHN0YXJ0VGltZUxhYmVsOiAnSG9yYSBkZSBJbmljaW8nLCAgXG4gICAgICAgICAgICBlbmRUaW1lTGFiZWw6ICdIb3JhIGRlIEZpbicsIFxuICAgICAgICB9XG4gICAgfTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFydERhdGUgPSB0aGlzLnBhcnNlRGF0ZSh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWUgPSB0aGlzLmZvcm1hdFRpbWVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWRTdGFydERhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbmREYXRlID0gdGhpcy5wYXJzZURhdGUodGhpcy5lbmREYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFRpbWUgPSB0aGlzLmZvcm1hdFRpbWVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWRFbmREYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5wdXRGb3JSYW5nZSgpOyAvLyBBdHVhbGl6YSBvIGlucHV0IG5vIG1vZG8gcmFuZ2UgY29tIGhvcmFzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXIodGhpcy5pbml0aWFsRGF0ZSk7IC8vIEF0dWFsaXphIG8gaW5wdXQgw7puaWNvIGNvbSBhIGRhdGEgaW5pY2lhbFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0gdGhpcy5mb3JtYXRUaW1lRm9yRGlzcGxheSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRGF0ZSddICYmIGNoYW5nZXNbJ2luaXRpYWxEYXRlJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyKGNoYW5nZXNbJ2luaXRpYWxEYXRlJ10uY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF0dWFsaXphIG8gY2FsZW5kw6FyaW8gcGFyYSBleGliaXIgYSBkYXRhIMO6bmljYSBlIGEgaG9yYVxuICAgIHVwZGF0ZUNhbGVuZGFyKGRhdGVTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGlmIChwYXJzZWREYXRlICYmIHRoaXMudmFsaWRhdGVEYXRlKGRhdGVTdHJpbmcpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHBhcnNlZERhdGU7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRZZWFyID0gcGFyc2VkRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBwYXJzZWREYXRlLmdldE1vbnRoKCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZUZvckRpc3BsYXkocGFyc2VkRGF0ZSk7IC8vIEluY2x1aSBhIGhvcmEgbm8gaW5wdXQgcHJpbmNpcGFsXG4gICAgICAgICAgICB0aGlzLmVtaXRTaW5nbGVPclJhbmdlKCk7ICAvLyBFbWl0ZSBkYXRhIMO6bmljYSBvdSBpbnRlcnZhbG9cbiAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5hcHBseURhdGVNYXNrKGlucHV0VmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZVBhcnRzID0gdGhpcy5pbnB1dERhdGUuc3BsaXQoJyAtICcpO1xuICAgICAgICAgICAgaWYgKGRhdGVQYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3RhcnREYXRlLCBlbmREYXRlXSA9IGRhdGVQYXJ0cztcblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYSBhcyBkdWFzIHBhcnRlcyBkbyBpbnRlcnZhbG9cbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0ZURhdGUoc3RhcnREYXRlKSAmJiB0aGlzLnZhbGlkYXRlRGF0ZShlbmREYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFN0YXJ0RGF0ZSA9IHRoaXMucGFyc2VEYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEVuZERhdGUgPSB0aGlzLnBhcnNlRGF0ZShlbmREYXRlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkU3RhcnREYXRlICYmIHBhcnNlZEVuZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFydERhdGUgPSBwYXJzZWRTdGFydERhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRW5kRGF0ZSA9IHBhcnNlZEVuZERhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRTaW5nbGVPclJhbmdlKCk7IC8vIEVtaXRlIG8gaW50ZXJ2YWxvIGF0dWFsaXphZG9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFZhbGlkYSBkYXRhIMO6bmljYVxuICAgICAgICAgICAgaWYgKCh0aGlzLnVzZVRpbWUgJiYgdGhpcy5pbnB1dERhdGUubGVuZ3RoID09PSAxNikgfHwgKCF0aGlzLnVzZVRpbWUgJiYgdGhpcy5pbnB1dERhdGUubGVuZ3RoID09PSAxMCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0ZURhdGUodGhpcy5pbnB1dERhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKHRoaXMuaW5wdXREYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gcGFyc2VkRGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNpbmdsZU9yUmFuZ2UoKTsgLy8gRW1pdGUgYSBkYXRhIMO6bmljYSBhdHVhbGl6YWRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIEF0dWFsaXphIG8gaW5wdXQgbm8gbW9kbyBpbnRlcnZhbG9cbiAgICB1cGRhdGVJbnB1dEZvclJhbmdlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZSAmJiB0aGlzLnNlbGVjdGVkRW5kRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkU3RhcnQgPSB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWRTdGFydERhdGUpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRW5kID0gdGhpcy5mb3JtYXREYXRlRm9yRGlzcGxheSh0aGlzLnNlbGVjdGVkRW5kRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IGAke2Zvcm1hdHRlZFN0YXJ0fSAtICR7Zm9ybWF0dGVkRW5kfWA7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWRTdGFydERhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvLy8gRW1pdGUgZGF0YSDDum5pY2Egb3UgaW50ZXJ2YWxvLCBpbmNsdWluZG8gaG9yYXNcbiAgICBlbWl0U2luZ2xlT3JSYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2VNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRTdGFydCA9IHRoaXMuc2VsZWN0ZWRTdGFydERhdGUgPyB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWRTdGFydERhdGUpIDogJyc7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRFbmQgPSB0aGlzLnNlbGVjdGVkRW5kRGF0ZSA/IHRoaXMuZm9ybWF0RGF0ZUZvckRpc3BsYXkodGhpcy5zZWxlY3RlZEVuZERhdGUpIDogJyc7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IGAke2Zvcm1hdHRlZFN0YXJ0fSAtICR7Zm9ybWF0dGVkRW5kfWA7IC8vIEF0dWFsaXphIG8gaW5wdXQgcHJpbmNpcGFsIGNvbSBvIHJhbmdlIGUgaG9yYXNcbiAgICAgICAgICAgIHRoaXMucmFuZ2VDaGFuZ2UuZW1pdCh7IHN0YXJ0OiBmb3JtYXR0ZWRTdGFydCwgZW5kOiBmb3JtYXR0ZWRFbmQgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy5zZWxlY3RlZERhdGUgPyB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KHRoaXMuc2VsZWN0ZWREYXRlKSA6ICcnO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSBmb3JtYXR0ZWREYXRlOyAvLyBBdHVhbGl6YSBvIGlucHV0IHByaW5jaXBhbCBjb20gYSBkYXRhIMO6bmljYSBlIGhvcmFcbiAgICAgICAgICAgIHRoaXMucmFuZ2VDaGFuZ2UuZW1pdCh7IHN0YXJ0OiBmb3JtYXR0ZWREYXRlLCBlbmQ6ICcnIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZ1bsOnw6NvIHBhcmEgdHJhdGFyIG11ZGFuw6dhcyBuYXMgaG9yYXNcbiAgICBvblRpbWVDaGFuZ2UodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3RhcnQnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtob3VycywgbWludXRlc10gPSB0aGlzLnN0YXJ0VGltZSA/IHRoaXMuc3RhcnRUaW1lLnNwbGl0KCc6JykgOiBbJzAwJywgJzAwJ107XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZS5zZXRIb3VycygraG91cnMsICttaW51dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZW5kJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRFbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHRoaXMuZW5kVGltZSA/IHRoaXMuZW5kVGltZS5zcGxpdCgnOicpIDogWycwMCcsICcwMCddO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbmREYXRlLnNldEhvdXJzKCtob3VycywgK21pbnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbaG91cnMsIG1pbnV0ZXNdID0gdGhpcy5zZWxlY3RlZFRpbWUgPyB0aGlzLnNlbGVjdGVkVGltZS5zcGxpdCgnOicpIDogWycwMCcsICcwMCddO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLnNldEhvdXJzKCtob3VycywgK21pbnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdFNpbmdsZU9yUmFuZ2UoKTsgLy8gQXR1YWxpemEgbyB2YWxvciBubyBpbnB1dCBwcmluY2lwYWxcbiAgICB9XG5cblxuXG4gICAgLy8gRnVuw6fDo28gcGFyYSBmb3JtYXRhw6fDo28gZGEgaG9yYSBubyBpbnB1dCBkZSBob3JhXG4gICAgZm9ybWF0VGltZUZvckRpc3BsYXkoZGF0ZTogRGF0ZSB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcbiAgICAgICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICBjb25zdCBtaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICByZXR1cm4gYCR7aG91cnN9OiR7bWludXRlc31gO1xuICAgIH1cblxuXG4gICAgLy8gTcOpdG9kbyBwYXJhIHNlbGVjaW9uYXIgdW1hIGRhdGEgbm8gY2FsZW5kw6FyaW9cbiAgICBzZWxlY3REYXRlKGRheTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgZGF5KTtcblxuICAgICAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgICAgICAgIC8vIEzDs2dpY2EgcGFyYSByYW5nZU1vZGVcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW5nU3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RhcnREYXRlID0gZGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFydFRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHRoaXMuc3RhcnRUaW1lLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFydERhdGUuc2V0SG91cnMoK2hvdXJzLCArbWludXRlcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZS5zZXRIb3VycygwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWUgPSAnMDA6MDAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmlzU2VsZWN0aW5nU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVuZERhdGUgPSBkYXRlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuZFRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHRoaXMuZW5kVGltZS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRW5kRGF0ZS5zZXRIb3VycygraG91cnMsICttaW51dGVzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRW5kRGF0ZS5zZXRIb3VycygwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRUaW1lID0gJzAwOjAwJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGluZ1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTaW5nbGVPclJhbmdlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUlucHV0Rm9yUmFuZ2UoKTtcbiAgICAgICAgICAgIC8vIE8gY2FsZW5kw6FyaW8gc8OzIHNlcsOhIGZlY2hhZG8gYW8gY2xpY2FyIG5vIGJvdMOjbyBcIkZlY2hhclwiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBMw7NnaWNhIHBhcmEgcXVhbmRvIG7Do28gZXN0w6EgZW0gcmFuZ2VNb2RlXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFRpbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbaG91cnMsIG1pbnV0ZXNdID0gdGhpcy5zZWxlY3RlZFRpbWUuc3BsaXQoJzonKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5zZXRIb3VycygraG91cnMsICttaW51dGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUuc2V0SG91cnMoMCwgMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRpbWUgPSAnMDA6MDAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdERhdGVGb3JEaXNwbGF5KGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5lbWl0U2luZ2xlT3JSYW5nZSgpO1xuXG4gICAgICAgICAgICAvLyAqKkZlY2hhciBvIGNhbGVuZMOhcmlvIGFwZW5hcyBzZSBgdXNlVGltZWAgZm9yIGZhbHNlKipcbiAgICAgICAgICAgIGlmICghdGhpcy51c2VUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NhbGVuZGFyVmlzaWJsZSA9IGZhbHNlOyAvLyBGZWNoYSBvIGNhbGVuZMOhcmlvIGF1dG9tYXRpY2FtZW50ZSBzZSBgdXNlVGltZWAgZm9yIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZSBgdXNlVGltZWAgZm9yIHRydWUsIG8gY2FsZW5kw6FyaW8gcGVybWFuZWNlIGFiZXJ0byBwYXJhIGluc2VyaXIgYSBob3JhXG4gICAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgYXBwbHlEYXRlTWFzayhpbnB1dFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBSZW1vdmUgcXVhbHF1ZXIgY2FyYWN0ZXJlIHF1ZSBuw6NvIHNlamEgbnVtw6lyaWNvXG4gICAgICAgIGxldCBkaWdpdHNPbmx5ID0gaW5wdXRWYWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpO1xuXG4gICAgICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gdGhpcy51c2VUaW1lID8gMjggOiAxNzsgLy8gQWp1c3RhIG8gY29tcHJpbWVudG8gbcOheGltbyBwYXJhIGludGVydmFsbyBjb20gb3Ugc2VtIHRlbXBvXG5cbiAgICAgICAgICAgIC8vIENlcnRpZmljYS1zZSBkZSBxdWUgYSBlbnRyYWRhIG7Do28gZXhjZWRlIG8gY29tcHJpbWVudG8gcGVybWl0aWRvXG4gICAgICAgICAgICBpZiAoZGlnaXRzT25seS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBkaWdpdHNPbmx5ID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJpbWVpcm8gaW50ZXJ2YWxvIChzdGFydCBkYXRlKVxuICAgICAgICAgICAgbGV0IGRheTEgPSBkaWdpdHNPbmx5LnN1YnN0cmluZygwLCAyKTtcbiAgICAgICAgICAgIGxldCBtb250aDEgPSBkaWdpdHNPbmx5LnN1YnN0cmluZygyLCA0KTtcbiAgICAgICAgICAgIGxldCB5ZWFyMSA9IGRpZ2l0c09ubHkuc3Vic3RyaW5nKDQsIDgpO1xuICAgICAgICAgICAgbGV0IGhvdXIxID0gZGlnaXRzT25seS5zdWJzdHJpbmcoOCwgMTApO1xuICAgICAgICAgICAgbGV0IG1pbnV0ZTEgPSBkaWdpdHNPbmx5LnN1YnN0cmluZygxMCwgMTIpO1xuXG4gICAgICAgICAgICAvLyBDcmlhIGEgZGF0YSBmb3JtYXRhZGEgcGFyYSBhIHByaW1laXJhIHBhcnRlIChzdGFydCBkYXRlKVxuICAgICAgICAgICAgbGV0IG1hc2tlZERhdGUgPSBgJHtkYXkxfS8ke21vbnRoMX0vJHt5ZWFyMX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlVGltZSAmJiBob3VyMSAmJiBtaW51dGUxKSB7XG4gICAgICAgICAgICAgICAgbWFza2VkRGF0ZSArPSBgICR7aG91cjF9OiR7bWludXRlMX1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGljaW9uYSBvIHNlcGFyYWRvciAnIC0gJyBzZSBob3V2ZXIgZGFkb3MgcGFyYSBvIHNlZ3VuZG8gaW50ZXJ2YWxvXG4gICAgICAgICAgICBpZiAoZGlnaXRzT25seS5sZW5ndGggPiAxMikge1xuICAgICAgICAgICAgICAgIG1hc2tlZERhdGUgKz0gJyAtICc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlZ3VuZG8gaW50ZXJ2YWxvIChlbmQgZGF0ZSlcbiAgICAgICAgICAgIGxldCBkYXkyID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMTIsIDE0KTtcbiAgICAgICAgICAgIGxldCBtb250aDIgPSBkaWdpdHNPbmx5LnN1YnN0cmluZygxNCwgMTYpO1xuICAgICAgICAgICAgbGV0IHllYXIyID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMTYsIDIwKTtcbiAgICAgICAgICAgIGxldCBob3VyMiA9IGRpZ2l0c09ubHkuc3Vic3RyaW5nKDIwLCAyMik7XG4gICAgICAgICAgICBsZXQgbWludXRlMiA9IGRpZ2l0c09ubHkuc3Vic3RyaW5nKDIyLCAyNCk7XG5cbiAgICAgICAgICAgIGxldCBlbmREYXRlUGFydCA9IGAke2RheTJ9LyR7bW9udGgyfS8ke3llYXIyfWA7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VUaW1lICYmIGhvdXIyICYmIG1pbnV0ZTIpIHtcbiAgICAgICAgICAgICAgICBlbmREYXRlUGFydCArPSBgICR7aG91cjJ9OiR7bWludXRlMn1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGljaW9uYSBhIHNlZ3VuZGEgcGFydGUgKGVuZCBkYXRlKSBhbyBpbnB1dCwgc2UgYXBsaWPDoXZlbFxuICAgICAgICAgICAgaWYgKGRpZ2l0c09ubHkubGVuZ3RoID4gMTIpIHtcbiAgICAgICAgICAgICAgICBtYXNrZWREYXRlICs9IGVuZERhdGVQYXJ0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWFza2VkRGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1heExlbmd0aCA9IHRoaXMudXNlVGltZSA/IDE2IDogMTA7XG4gICAgICAgICAgICBpZiAoZGlnaXRzT25seS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBkaWdpdHNPbmx5ID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGRheSA9IGRpZ2l0c09ubHkuc3Vic3RyaW5nKDAsIDIpO1xuICAgICAgICAgICAgbGV0IG1vbnRoID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMiwgNCk7XG4gICAgICAgICAgICBsZXQgeWVhciA9IGRpZ2l0c09ubHkuc3Vic3RyaW5nKDQsIDgpO1xuICAgICAgICAgICAgbGV0IGhvdXIgPSBkaWdpdHNPbmx5LnN1YnN0cmluZyg4LCAxMCk7XG4gICAgICAgICAgICBsZXQgbWludXRlID0gZGlnaXRzT25seS5zdWJzdHJpbmcoMTAsIDEyKTtcblxuICAgICAgICAgICAgbGV0IG1hc2tlZERhdGUgPSBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlVGltZSAmJiBob3VyICYmIG1pbnV0ZSkge1xuICAgICAgICAgICAgICAgIG1hc2tlZERhdGUgKz0gYCAke2hvdXJ9OiR7bWludXRlfWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtYXNrZWREYXRlO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIC8vIFZhbGlkYcOnw6NvIGRhIGRhdGFcbiAgICB2YWxpZGF0ZURhdGUoaW5wdXRWYWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IFtkYXRlUGFydCwgdGltZVBhcnRdID0gaW5wdXRWYWx1ZS5zcGxpdCgnICcpO1xuICAgICAgICBjb25zdCBbZGF5U3RyLCBtb250aFN0ciwgeWVhclN0cl0gPSBkYXRlUGFydC5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBkYXkgPSBOdW1iZXIoZGF5U3RyKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBOdW1iZXIobW9udGhTdHIpO1xuICAgICAgICBjb25zdCB5ZWFyID0gTnVtYmVyKHllYXJTdHIpO1xuXG4gICAgICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMiB8fCB5ZWFyU3RyLmxlbmd0aCAhPT0gNCB8fCBpc05hTih5ZWFyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdERheU9mTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICBpZiAoZGF5IDwgMSB8fCBkYXkgPiBsYXN0RGF5T2ZNb250aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudXNlVGltZSAmJiB0aW1lUGFydCkge1xuICAgICAgICAgICAgY29uc3QgW2hvdXJTdHIsIG1pbnV0ZVN0cl0gPSB0aW1lUGFydC5zcGxpdCgnOicpO1xuICAgICAgICAgICAgY29uc3QgaG91ciA9IE51bWJlcihob3VyU3RyKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbnV0ZSA9IE51bWJlcihtaW51dGVTdHIpO1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAwIHx8IGhvdXIgPiAyMyB8fCBtaW51dGUgPCAwIHx8IG1pbnV0ZSA+IDU5IHx8IGlzTmFOKGhvdXIpIHx8IGlzTmFOKG1pbnV0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBoYW5kbGVLZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGV2ZW50LmtleS5jaGFyQ29kZUF0KDApO1xuXG4gICAgICAgIC8vIFBlcm1pdGlyIGFwZW5hcyBuw7ptZXJvcyBlIGJhcnJhIFwiL1wiXG4gICAgICAgIGlmICgoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSAmJiBjaGFyQ29kZSAhPT0gNDcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIEJsb3F1ZWlhIGEgaW5zZXLDp8OjbyBkZSBjYXJhY3RlcmVzIG7Do28gcGVybWl0aWRvc1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGltaXRhIG8gdGFtYW5obyBkYSBlbnRyYWRhIGNvbmZvcm1lIG8gdGlwbyBkZSBkYWRvIChjb20gb3Ugc2VtIGhvcmEpXG4gICAgICAgIGlmICh0aGlzLmlucHV0RGF0ZS5yZXBsYWNlKC9cXEQvZywgJycpLmxlbmd0aCA+PSAodGhpcy51c2VUaW1lID8gMTIgOiA4KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gTGltaXRhIG8gbsO6bWVybyBkZSBjYXJhY3RlcmVzIHBlcm1pdGlkb3NcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gRmVjaGEgbyBjYWxlbmTDoXJpb1xuICAgIGNsb3NlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNDYWxlbmRhclZpc2libGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBbHRlcm5hIGEgdmlzaWJpbGlkYWRlIGRvIGNhbGVuZMOhcmlvXG4gICAgdG9nZ2xlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNDYWxlbmRhclZpc2libGUgPSAhdGhpcy5pc0NhbGVuZGFyVmlzaWJsZTtcbiAgICB9XG5cbiAgICAvLyBGb3JtYXRhIGEgZGF0YSBlIGhvcmEgcGFyYSBleGliacOnw6NvIG5vIGlucHV0IHByaW5jaXBhbFxuICAgIGZvcm1hdERhdGVGb3JEaXNwbGF5KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgbGV0IGZvcm1hdHRlZERhdGUgPSBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuXG4gICAgICAgIGlmICh0aGlzLnVzZVRpbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgICBmb3JtYXR0ZWREYXRlICs9IGAgJHtob3Vyc306JHttaW51dGVzfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkRGF0ZTtcbiAgICB9XG5cblxuICAgIC8vIEZvcm1hdGEgYSBkYXRhIHBhcmEgZW1pdGlyIG5vIGV2ZW50b1xuICAgIGZvcm1hdERhdGVGb3JFbWl0KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgbGV0IGZvcm1hdHRlZERhdGUgPSBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuICAgICAgICBpZiAodGhpcy51c2VUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgICBjb25zdCBtaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZSArPSBgIC0gJHtob3Vyc306JHttaW51dGVzfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZERhdGU7XG4gICAgfVxuXG4gICAgLy8gRnVuw6fDo28gcGFyYSBwYXJzaW5nIGRlIHN0cmluZyBwYXJhIERhdGVcbiAgICBwYXJzZURhdGUoZGF0ZVN0cjogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgICAgICBjb25zdCBbZGF0ZVBhcnQsIHRpbWVQYXJ0XSA9IGRhdGVTdHIuc3BsaXQoJyAnKTtcbiAgICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gZGF0ZVBhcnQuc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgaWYgKCFkYXkgfHwgIW1vbnRoIHx8ICF5ZWFyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XG4gICAgICAgIGlmICh0aGlzLnVzZVRpbWUgJiYgdGltZVBhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IFtob3VyLCBtaW51dGVdID0gdGltZVBhcnQuc3BsaXQoJzonKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgICAgIGRhdGUuc2V0SG91cnMoaG91ciB8fCAwLCBtaW51dGUgfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgLy8gR2VyYSBhIGxpc3RhIGRlIGRpYXMgbm8gbcOqcyBhdHVhbFxuICAgIGdldCBkYXlzSW5Nb250aCgpOiBhbnlbXSB7XG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoLCAxKS5nZXREYXkoKTtcbiAgICAgICAgY29uc3QgdG90YWxEYXlzSW5Nb250aCA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICBjb25zdCBkYXlzQXJyYXkgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b3RhbERheXNJbk1vbnRoIH0sIChfLCBpKSA9PiBpICsgMSk7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdFbXB0eURheXMgPSBBcnJheShmaXJzdERheU9mTW9udGgpLmZpbGwobnVsbCk7IC8vIERpYXMgdmF6aW9zIGFudGVzIGRvIHByaW1laXJvIGRpYSBkbyBtw6pzXG4gICAgICAgIHJldHVybiBbLi4ubGVhZGluZ0VtcHR5RGF5cywgLi4uZGF5c0FycmF5XTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZmljYSBzZSB1bSBkaWEgZXN0w6Egc2VsZWNpb25hZG9cbiAgICBpc1NlbGVjdGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXkgPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNb250aCgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICByZXR1cm4gc2VsZWN0ZWREYXkgPT09IGRheSAmJiBzZWxlY3RlZE1vbnRoID09PSB0aGlzLmN1cnJlbnRNb250aCAmJiBzZWxlY3RlZFllYXIgPT09IHRoaXMuY3VycmVudFllYXI7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZpY2Egc2UgbyBkaWEgw6kgaG9qZVxuICAgIGlzVG9kYXkoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICByZXR1cm4gdG9kYXkuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5jdXJyZW50WWVhciAmJiB0b2RheS5nZXRNb250aCgpID09PSB0aGlzLmN1cnJlbnRNb250aCAmJiB0b2RheS5nZXREYXRlKCkgPT09IGRheTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZmljYSBzZSBhIGRhdGEgZXN0w6EgZGVzYWJpbGl0YWRhXG4gICAgaXNEYXRlRGlzYWJsZWQoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoLCBkYXkpO1xuICAgICAgICBpZiAodGhpcy5taW5EYXRlICYmIGRhdGUgPCB0aGlzLm1pbkRhdGUpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy5tYXhEYXRlICYmIGRhdGUgPiB0aGlzLm1heERhdGUpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZpY2Egc2UgdW0gZGlhIGVzdMOhIG5vIGludGVydmFsbyBzZWxlY2lvbmFkb1xuICAgIGlzSW5SYW5nZShkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTdGFydERhdGUgfHwgIXRoaXMuc2VsZWN0ZWRFbmREYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgZGF5KTtcbiAgICAgICAgcmV0dXJuIGRhdGUgPj0gdGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZSAmJiBkYXRlIDw9IHRoaXMuc2VsZWN0ZWRFbmREYXRlO1xuICAgIH1cblxuICAgIC8vIEF2YW7Dp2EgcGFyYSBvIHByw7N4aW1vIG3DqnNcbiAgICBuZXh0TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMTEpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXIrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXRyb2NlZGUgcGFyYSBvIG3DqnMgYW50ZXJpb3JcbiAgICBwcmV2TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxMTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXItLTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoLS07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXRvcm5hIGEgbGlzdGEgZGUgbWVzZXMgZGUgYWNvcmRvIGNvbSBvIGxvY2FsZVxuICAgIGdldCBtb250aHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzW3RoaXMubG9jYWxlXT8ubW9udGhzIHx8IHRoaXMubG9jYWxlc1snZW4nXS5tb250aHM7XG4gICAgfVxuXG4gICAgLy8gUmV0b3JuYSBhIGxpc3RhIGRlIGRpYXMgZGEgc2VtYW5hIGRlIGFjb3JkbyBjb20gbyBsb2NhbGVcbiAgICBnZXQgZGF5c09mV2VlaygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZXNbdGhpcy5sb2NhbGVdPy5kYXlzT2ZXZWVrIHx8IHRoaXMubG9jYWxlc1snZW4nXS5kYXlzT2ZXZWVrO1xuICAgIH1cblxuICAgIFxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICA8bGFiZWwgW2Zvcl09XCJpZFwiIFtuZ0NsYXNzXT1cIidsYWJlbC1zdHlsZXMnXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgIDxpbnB1dFxuICAgICAgaWQ9XCJ7eyBpZCB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBjbGFzcz1cImN1c3RvbS1pbnB1dFwiXG4gICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJyYW5nZU1vZGUgJiYgdXNlVGltZSA/ICdkZC9NTS95eXl5IEhIOm1tIC0gZGQvTU0veXl5eSBISDptbScgOiBcbiAgICAgIHJhbmdlTW9kZSAmJiAhdXNlVGltZSA/ICdkZC9NTS95eXl5IC0gZGQvTU0veXl5eScgOighcmFuZ2VNb2RlICYmIHVzZVRpbWUgPyAnZGQvTU0veXl5eSBISDptbScgOiAnZGQvTU0veXl5eScpXCJcbiAgICAgIFt2YWx1ZV09XCJpbnB1dERhdGVcIlxuICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoa2V5cHJlc3MpPVwiaGFuZGxlS2V5UHJlc3MoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoKVwiXG4gICAgLz5cbiAgICA8bHVjaWRlLWljb24gbmFtZT1cImNhbGVuZGFyXCIgY2xhc3M9XCJjYWxlbmRhci1pY29uXCI+PC9sdWNpZGUtaWNvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImludmFsaWREYXRlXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAge3sgbG9jYWxlc1tsb2NhbGVdLmludmFsaWREYXRlTWVzc2FnZSB9fVxuICAgIDxzcGFuICpuZ0lmPVwidXNlVGltZVwiPiBISDptbS48L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjYWxlbmRhci13cmFwcGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsgb3BlbjogaXNDYWxlbmRhclZpc2libGUgfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJwcmV2TW9udGgoKVwiPiYjODI0OTs8L2J1dHRvbj5cbiAgICAgICAgICA8c3Bhbj57eyBtb250aHNbY3VycmVudE1vbnRoXSB9fSB7eyBjdXJyZW50WWVhciB9fTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJuZXh0TW9udGgoKVwiPiYjODI1MDs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWJvZHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItZGF5LW5hbWVzXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgZGF5IG9mIGRheXNPZldlZWtcIj57eyBkYXkgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItZGF5c1wiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzSW5Nb250aDsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJpc1RvZGF5KGRheSlcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChkYXkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmluLXJhbmdlXT1cImlzSW5SYW5nZShkYXkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRGF0ZURpc2FibGVkKGRheSlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGF5ID8gc2VsZWN0RGF0ZShkYXkpIDogbnVsbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGRheSA/IGRheSA6IFwiXCIgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBJbnB1dHMgcGFyYSBpbnNlcsOnw6NvIGRhcyBob3JhcyAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInVzZVRpbWVcIiBjbGFzcz1cInRpbWUtaW5wdXRzXCI+XG4gICAgICAgICAgPCEtLSBDYW1wbyBkZSBob3JhIGRlIGluw61jaW8gLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJhbmdlTW9kZVwiIGNsYXNzPVwidGltZS1pbnB1dFwiPlxuICAgICAgICAgICAgPGxhYmVsPnt7IGxvY2FsZXNbbG9jYWxlXT8uc3RhcnRUaW1lTGFiZWwgfHwgJ0hvcmEgZGUgSW7DrWNpbycgfX08L2xhYmVsPiA8IS0tIFVzYW5kbyB0cmFkdcOnw6NvIC0tPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0aW1lXCIgWyhuZ01vZGVsKV09XCJzdGFydFRpbWVcIiAoY2hhbmdlKT1cIm9uVGltZUNoYW5nZSgnc3RhcnQnKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIENhbXBvIGRlIGhvcmEgZGUgZmltIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJyYW5nZU1vZGVcIiBjbGFzcz1cInRpbWUtaW5wdXRcIj5cbiAgICAgICAgICAgIDxsYWJlbD57eyBsb2NhbGVzW2xvY2FsZV0/LmVuZFRpbWVMYWJlbCB8fCAnSG9yYSBkZSBGaW0nIH19PC9sYWJlbD4gPCEtLSBVc2FuZG8gdHJhZHXDp8OjbyAtLT5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGltZVwiIFsobmdNb2RlbCldPVwiZW5kVGltZVwiIChjaGFuZ2UpPVwib25UaW1lQ2hhbmdlKCdlbmQnKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIENhbXBvIGRlIGhvcmEgw7puaWNhIChzZSBuw6NvIGZvciByYW5nZSkgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFyYW5nZU1vZGVcIiBjbGFzcz1cInRpbWUtaW5wdXRcIj5cbiAgICAgICAgICAgIDxsYWJlbD57eyBsb2NhbGVzW2xvY2FsZV0/LnN0YXJ0VGltZUxhYmVsIHx8ICdIb3JhJyB9fTwvbGFiZWw+IDwhLS0gVXNhbmRvIG8gbGFiZWwgZGUgaW7DrWNpbyAtLT5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGltZVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRUaW1lXCIgKGNoYW5nZSk9XCJvblRpbWVDaGFuZ2UoJ3NpbmdsZScpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBCb3TDo28gZGUgZmVjaGFyIG8gY2FsZW5kw6FyaW8gLS0+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIiAoY2xpY2spPVwiY2xvc2VDYWxlbmRhcigpXCI+e3sgY2xvc2VCdXR0b25MYWJlbCB9fTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=