@seniorsistemas/angular-components 19.5.3 → 19.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.d.ts +2 -0
- package/accordion/lib/accordion/models/accordion-button-settings.d.ts +5 -0
- package/button/lib/button/button.component.d.ts +5 -1
- package/esm2022/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.mjs +11 -3
- package/esm2022/accordion/lib/accordion/models/accordion-button-settings.mjs +1 -1
- package/esm2022/button/lib/button/button.component.mjs +9 -3
- package/esm2022/confirm-dialog/lib/popup-confirm-dialog/popup-confirm-dialog.component.mjs +1 -1
- package/esm2022/content-generator/lib/content-generator/content-generator.component.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/components/grid/row/row.component.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-radio-field/boolean-field.component.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/button-field/button-field.component.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/radio-button/radio-button-field.component.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +2 -2
- package/esm2022/empty-state/lib/empty-state/empty-state.component.mjs +1 -1
- package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +1 -1
- package/esm2022/global-search/lib/global-search/components/dropdown/global-search-dropdown-item.component.mjs +1 -1
- package/esm2022/global-search/lib/global-search/global-search.component.mjs +2 -2
- package/esm2022/help-popover/lib/help-popover/help-popover/help-popover.component.mjs +1 -1
- package/esm2022/image-cropper/lib/image-cropper/image-cropper.component.mjs +1 -1
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
- package/esm2022/inline-edit/lib/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +1 -1
- package/esm2022/kanban/lib/kanban/components/kanban-column/kanban-column.component.mjs +1 -1
- package/esm2022/object-card/lib/object-card/elements/field/object-card-field.component.mjs +1 -1
- package/esm2022/object-card/lib/object-card/elements/main/object-card-main.component.mjs +1 -1
- package/esm2022/picklist/lib/picklist/picklist.component.mjs +2 -2
- package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.component.mjs +1 -1
- package/esm2022/select/lib/select/select.component.mjs +93 -7
- package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +541 -0
- package/esm2022/shared/public-api.mjs +2 -1
- package/esm2022/spotlight/lib/spotlight/spotlight.component.mjs +2 -2
- package/esm2022/table/lib/table/table-paging/table-paging.component.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-accordion.mjs +10 -2
- package/fesm2022/seniorsistemas-angular-components-accordion.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-button.mjs +8 -2
- package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-confirm-dialog.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-confirm-dialog.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-content-generator.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-content-generator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +9 -9
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-empty-state.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-empty-state.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-help-popover.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-help-popover.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-image-cropper.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-image-cropper.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-kanban.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-kanban.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-object-card.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-picklist.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-picklist.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +92 -6
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-shared.mjs +541 -3
- package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-spotlight.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-spotlight.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-table.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
- package/package.json +1 -1
- package/select/lib/select/select.component.d.ts +40 -2
- package/shared/lib/accessibility/datepicker-no-period-tab.directive.d.ts +177 -0
- package/shared/public-api.d.ts +1 -0
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { Directive, HostListener, LOCALE_ID, Renderer2, inject } from '@angular/core';
|
|
3
|
+
import { DatePicker } from 'primeng/datepicker';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* CSS customizado injetado globalmente para focus-visible nos internals do DatePicker.
|
|
7
|
+
* Necessário porque com `appendTo="body"` o overlay fica fora do host component,
|
|
8
|
+
* e estilos com `:host ::ng-deep` ou ViewEncapsulation.Emulated não alcançam.
|
|
9
|
+
*/
|
|
10
|
+
const FOCUS_STYLE_ID = 's-datepicker-a11y-focus-styles';
|
|
11
|
+
/** Delay em ms para foco pós-abertura e navegação (permite NVDA processar dialog announce). */
|
|
12
|
+
const FOCUS_DELAY_MS = 50;
|
|
13
|
+
/** Delay em ms para debounce do MutationObserver (evita re-execução por ripple/animações). */
|
|
14
|
+
const MUTATION_DEBOUNCE_MS = 100;
|
|
15
|
+
/** Attribute name constant to avoid SonarQube literal duplication warning. */
|
|
16
|
+
const ARIA_LABEL_ATTR = 'aria-label';
|
|
17
|
+
const FOCUS_STYLES = `
|
|
18
|
+
.p-datepicker-day:focus-visible,
|
|
19
|
+
.p-datepicker-day.s-datepicker-day-focused {
|
|
20
|
+
outline: 2px solid var(--p-primary-color, #3b82f6) !important;
|
|
21
|
+
outline-offset: -2px;
|
|
22
|
+
border-radius: 4px;
|
|
23
|
+
}
|
|
24
|
+
.p-datepicker-month:focus-visible,
|
|
25
|
+
.p-datepicker-month.s-datepicker-day-focused {
|
|
26
|
+
outline: 2px solid var(--p-primary-color, #3b82f6) !important;
|
|
27
|
+
outline-offset: -2px;
|
|
28
|
+
border-radius: 4px;
|
|
29
|
+
}
|
|
30
|
+
.p-datepicker-year:focus-visible,
|
|
31
|
+
.p-datepicker-year.s-datepicker-day-focused {
|
|
32
|
+
outline: 2px solid var(--p-primary-color, #3b82f6) !important;
|
|
33
|
+
outline-offset: -2px;
|
|
34
|
+
border-radius: 4px;
|
|
35
|
+
}
|
|
36
|
+
.p-datepicker-select-month:focus-visible,
|
|
37
|
+
.p-datepicker-select-year:focus-visible {
|
|
38
|
+
outline: 2px solid var(--p-primary-color, #3b82f6) !important;
|
|
39
|
+
outline-offset: 2px;
|
|
40
|
+
border-radius: 4px;
|
|
41
|
+
}
|
|
42
|
+
.p-datepicker-prev-button:focus-visible,
|
|
43
|
+
.p-datepicker-next-button:focus-visible {
|
|
44
|
+
outline: 2px solid var(--p-primary-color, #3b82f6) !important;
|
|
45
|
+
outline-offset: 2px;
|
|
46
|
+
border-radius: 50%;
|
|
47
|
+
}
|
|
48
|
+
`;
|
|
49
|
+
/**
|
|
50
|
+
* Traduções pt-BR para aria-labels do DatePicker PrimeNG.
|
|
51
|
+
* PrimeNG usa `getTranslation()` que retorna inglês por padrão
|
|
52
|
+
* se não configurado via `PrimeNGConfig.setTranslation()`.
|
|
53
|
+
*
|
|
54
|
+
* Keys correspondem ao texto exato renderizado pelo PrimeNG no DOM:
|
|
55
|
+
* - "Previous Month" (não "Prev Month")
|
|
56
|
+
* - "Choose Date", "Choose Month", "Choose Year"
|
|
57
|
+
*/
|
|
58
|
+
const PREV_DECADE_PT = 'Década anterior';
|
|
59
|
+
const PREV_DECADE_ES = 'Década anterior';
|
|
60
|
+
const ARIA_TRANSLATIONS_PT_BR = {
|
|
61
|
+
'Choose Date': 'Selecionar data',
|
|
62
|
+
'Choose Month': 'Selecionar mês',
|
|
63
|
+
'Choose Year': 'Selecionar ano',
|
|
64
|
+
'Previous Month': 'Mês anterior',
|
|
65
|
+
'Next Month': 'Próximo mês',
|
|
66
|
+
'Previous Year': 'Ano anterior',
|
|
67
|
+
'Next Year': 'Próximo ano',
|
|
68
|
+
'Previous Decade': PREV_DECADE_PT,
|
|
69
|
+
'Next Decade': 'Próxima década',
|
|
70
|
+
'Prev Month': 'Mês anterior',
|
|
71
|
+
'Prev Year': 'Ano anterior',
|
|
72
|
+
'Prev Decade': PREV_DECADE_PT,
|
|
73
|
+
};
|
|
74
|
+
const ARIA_TRANSLATIONS_ES = {
|
|
75
|
+
'Choose Date': 'Seleccionar fecha',
|
|
76
|
+
'Choose Month': 'Seleccionar mes',
|
|
77
|
+
'Choose Year': 'Seleccionar año',
|
|
78
|
+
'Previous Month': 'Mes anterior',
|
|
79
|
+
'Next Month': 'Próximo mes',
|
|
80
|
+
'Previous Year': 'Año anterior',
|
|
81
|
+
'Next Year': 'Próximo año',
|
|
82
|
+
'Previous Decade': PREV_DECADE_ES,
|
|
83
|
+
'Next Decade': 'Próxima década',
|
|
84
|
+
'Prev Month': 'Mes anterior',
|
|
85
|
+
'Prev Year': 'Año anterior',
|
|
86
|
+
'Prev Decade': PREV_DECADE_ES,
|
|
87
|
+
};
|
|
88
|
+
const ARIA_TRANSLATIONS = {
|
|
89
|
+
'pt-BR': ARIA_TRANSLATIONS_PT_BR,
|
|
90
|
+
'pt': ARIA_TRANSLATIONS_PT_BR,
|
|
91
|
+
'es': ARIA_TRANSLATIONS_ES,
|
|
92
|
+
'es-CO': ARIA_TRANSLATIONS_ES,
|
|
93
|
+
'es-ES': ARIA_TRANSLATIONS_ES,
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Diretiva para corrigir a acessibilidade do painel do DatePicker PrimeNG.
|
|
97
|
+
*
|
|
98
|
+
* Resolve os seguintes problemas:
|
|
99
|
+
*
|
|
100
|
+
* 1. **Foco inicial ao abrir overlay**: move foco programaticamente para
|
|
101
|
+
* a célula selecionada, hoje, ou primeira célula disponível — evitando
|
|
102
|
+
* que NVDA leia toda estrutura do grid ao entrar no painel.
|
|
103
|
+
*
|
|
104
|
+
* 2. **Re-foco ao trocar view (mês/ano)**: ao navegar para views de mês ou
|
|
105
|
+
* ano, o DOM é destruído e recriado. Sem intervenção, foco escapa para
|
|
106
|
+
* `<body>` e NVDA lê conteúdo fora do overlay. A diretiva re-foca o
|
|
107
|
+
* primeiro elemento interativo da nova view.
|
|
108
|
+
*
|
|
109
|
+
* 3. **Focus-visible nos elementos internos**: injeta CSS global com
|
|
110
|
+
* outline para todos elementos interativos do overlay, garantindo
|
|
111
|
+
* feedback visual mesmo com `appendTo="body"`.
|
|
112
|
+
*
|
|
113
|
+
* 4. **aria-label enriquecido nos day cells**: PrimeNG seta apenas o
|
|
114
|
+
* número do dia. A diretiva sobrescreve com data completa formatada
|
|
115
|
+
* (ex: "3 de junho de 2026, Qua") — NVDA narra label sem precisar
|
|
116
|
+
* contextualizar toda grid.
|
|
117
|
+
*
|
|
118
|
+
* 5. **View de meses/anos sem tabindex**: spans de mês/ano recebem
|
|
119
|
+
* `tabindex="0"` e `role="option"` para navegação por teclado.
|
|
120
|
+
*
|
|
121
|
+
* Utiliza `MutationObserver` para detectar mudanças internas de view,
|
|
122
|
+
* já que PrimeNG não emite eventos para essas transições.
|
|
123
|
+
*
|
|
124
|
+
* **CSS**: A diretiva injeta um `<style>` global no `<head>` (uma vez).
|
|
125
|
+
* Para projetos que preferem controle manual, desabilite via Input
|
|
126
|
+
* `[sDatepickerInjectStyles]="false"` e importe os estilos manualmente.
|
|
127
|
+
*
|
|
128
|
+
* Uso: `<p-datepicker sDatepickerNoPeriodTab ...>`
|
|
129
|
+
*
|
|
130
|
+
* @category Directives
|
|
131
|
+
*/
|
|
132
|
+
export class DatepickerNoPeriodTabDirective {
|
|
133
|
+
datePicker = inject(DatePicker);
|
|
134
|
+
renderer = inject(Renderer2);
|
|
135
|
+
locale = inject(LOCALE_ID);
|
|
136
|
+
document = inject(DOCUMENT);
|
|
137
|
+
observer = null;
|
|
138
|
+
focusListenerCleanups = [];
|
|
139
|
+
constructor() {
|
|
140
|
+
this.injectGlobalFocusStyles();
|
|
141
|
+
}
|
|
142
|
+
onPanelShow() {
|
|
143
|
+
setTimeout(() => {
|
|
144
|
+
this.fixPanelAccessibility();
|
|
145
|
+
// Não chamar focusBestTarget() aqui — PrimeNG initFocusableCell()
|
|
146
|
+
// já move foco pro day cell com tabindex="0" na abertura.
|
|
147
|
+
// Chamar de novo causa double-announce no NVDA.
|
|
148
|
+
setTimeout(() => this.observePanelChanges(), MUTATION_DEBOUNCE_MS);
|
|
149
|
+
}, FOCUS_DELAY_MS);
|
|
150
|
+
}
|
|
151
|
+
onNavigationChange() {
|
|
152
|
+
setTimeout(() => {
|
|
153
|
+
this.fixPanelAccessibility();
|
|
154
|
+
this.focusBestTarget();
|
|
155
|
+
}, FOCUS_DELAY_MS);
|
|
156
|
+
}
|
|
157
|
+
ngOnDestroy() {
|
|
158
|
+
this.disconnectObserver();
|
|
159
|
+
this.removeFocusListeners();
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Move foco para melhor alvo disponível no painel.
|
|
163
|
+
* Usado ao abrir overlay e ao trocar view (mês/ano).
|
|
164
|
+
*
|
|
165
|
+
* Ao abrir: evita que NVDA leia toda estrutura do grid.
|
|
166
|
+
* Ao trocar view: previne foco escapar para `<body>` quando
|
|
167
|
+
* PrimeNG destrói DOM da view anterior.
|
|
168
|
+
*
|
|
169
|
+
* Prioridade: selecionado > hoje > primeiro disponível.
|
|
170
|
+
* Pula se foco já está no target correto (evita double-announce no NVDA).
|
|
171
|
+
*/
|
|
172
|
+
focusBestTarget() {
|
|
173
|
+
const panel = this.datePicker.overlay;
|
|
174
|
+
if (!panel) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const target = this.findFocusTarget(panel);
|
|
178
|
+
if (target && this.document.activeElement !== target) {
|
|
179
|
+
target.tabIndex = 0;
|
|
180
|
+
target.focus();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Injeta CSS global de focus-visible no `<head>` do documento.
|
|
185
|
+
* Executa apenas uma vez (idempotente via ID do style element).
|
|
186
|
+
* Necessário porque overlay com `appendTo="body"` fica fora do
|
|
187
|
+
* escopo de ViewEncapsulation do componente host.
|
|
188
|
+
*/
|
|
189
|
+
injectGlobalFocusStyles() {
|
|
190
|
+
if (this.document.getElementById(FOCUS_STYLE_ID)) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const style = this.renderer.createElement('style');
|
|
194
|
+
this.renderer.setAttribute(style, 'id', FOCUS_STYLE_ID);
|
|
195
|
+
this.renderer.setAttribute(style, 'type', 'text/css');
|
|
196
|
+
const text = this.renderer.createText(FOCUS_STYLES);
|
|
197
|
+
this.renderer.appendChild(style, text);
|
|
198
|
+
this.renderer.appendChild(this.document.head, style);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Encontra melhor elemento para receber foco no painel atual.
|
|
202
|
+
* Busca em ordem: selecionado → hoje → primeiro disponível.
|
|
203
|
+
* Funciona para views de dias, meses e anos.
|
|
204
|
+
*/
|
|
205
|
+
findFocusTarget(panel) {
|
|
206
|
+
// View de dias
|
|
207
|
+
const selectedDay = panel.querySelector('.p-datepicker-day-selected, .p-datepicker-day[aria-selected="true"]');
|
|
208
|
+
if (selectedDay) {
|
|
209
|
+
return selectedDay;
|
|
210
|
+
}
|
|
211
|
+
const today = panel.querySelector('.p-datepicker-today .p-datepicker-day');
|
|
212
|
+
if (today) {
|
|
213
|
+
return today;
|
|
214
|
+
}
|
|
215
|
+
// View de meses
|
|
216
|
+
const selectedMonth = panel.querySelector('.p-datepicker-month.p-datepicker-month-selected');
|
|
217
|
+
if (selectedMonth) {
|
|
218
|
+
return selectedMonth;
|
|
219
|
+
}
|
|
220
|
+
const firstMonth = panel.querySelector('.p-datepicker-month:not(.p-disabled)');
|
|
221
|
+
if (firstMonth) {
|
|
222
|
+
return firstMonth;
|
|
223
|
+
}
|
|
224
|
+
// View de anos
|
|
225
|
+
const selectedYear = panel.querySelector('.p-datepicker-year.p-datepicker-year-selected');
|
|
226
|
+
if (selectedYear) {
|
|
227
|
+
return selectedYear;
|
|
228
|
+
}
|
|
229
|
+
const firstYear = panel.querySelector('.p-datepicker-year:not(.p-disabled)');
|
|
230
|
+
if (firstYear) {
|
|
231
|
+
return firstYear;
|
|
232
|
+
}
|
|
233
|
+
// Fallback: primeiro day cell disponível
|
|
234
|
+
const firstDay = panel.querySelector('.p-datepicker-day:not(.p-disabled)');
|
|
235
|
+
return firstDay;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Aplica correções de acessibilidade no painel do DatePicker,
|
|
239
|
+
* independente da view interna ativa (dias, meses ou anos).
|
|
240
|
+
*/
|
|
241
|
+
fixPanelAccessibility() {
|
|
242
|
+
const panel = this.datePicker.overlay;
|
|
243
|
+
if (!panel) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
panel.querySelectorAll('.p-datepicker-select-month, .p-datepicker-select-year').forEach((btn) => {
|
|
247
|
+
this.renderer.setAttribute(btn, 'tabindex', '0');
|
|
248
|
+
});
|
|
249
|
+
panel.querySelectorAll('.p-datepicker-month:not([tabindex])').forEach((month) => {
|
|
250
|
+
this.renderer.setAttribute(month, 'tabindex', '0');
|
|
251
|
+
this.renderer.setAttribute(month, 'role', 'option');
|
|
252
|
+
});
|
|
253
|
+
panel.querySelectorAll('.p-datepicker-year:not([tabindex])').forEach((year) => {
|
|
254
|
+
this.renderer.setAttribute(year, 'tabindex', '0');
|
|
255
|
+
this.renderer.setAttribute(year, 'role', 'option');
|
|
256
|
+
});
|
|
257
|
+
this.applyGridcellRoleToDays(panel);
|
|
258
|
+
this.enrichDayCellAriaLabels(panel);
|
|
259
|
+
this.enrichGridAriaLabel(panel);
|
|
260
|
+
this.translateAriaLabels(panel);
|
|
261
|
+
this.fixNavigationButtonLabels(panel);
|
|
262
|
+
this.removeApplicationRoleFromContainer(panel);
|
|
263
|
+
this.setupFocusTracking(panel);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Adiciona `role="gridcell"` nos `<span class="p-datepicker-day">` que recebem foco.
|
|
267
|
+
*
|
|
268
|
+
* PrimeNG coloca `tabindex` no `<span>` dentro do `<td>`, mas sem role explícito.
|
|
269
|
+
* NVDA não entra automaticamente em focus mode quando foca um elemento sem
|
|
270
|
+
* role de widget (gridcell, button, etc). Resultado: NVDA fica em browse mode
|
|
271
|
+
* e lê toda a tabela sequencialmente ao invés de anunciar só a célula focada.
|
|
272
|
+
*
|
|
273
|
+
* Ao adicionar `role="gridcell"` no span focável, NVDA reconhece que é um
|
|
274
|
+
* widget interativo e entra em focus mode — anunciando apenas o aria-label
|
|
275
|
+
* da célula focada.
|
|
276
|
+
*/
|
|
277
|
+
applyGridcellRoleToDays(panel) {
|
|
278
|
+
panel.querySelectorAll('.p-datepicker-day:not(.p-disabled)').forEach((daySpan) => {
|
|
279
|
+
if (!daySpan.getAttribute('role')) {
|
|
280
|
+
this.renderer.setAttribute(daySpan, 'role', 'gridcell');
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Enriquece `aria-label` dos day cells com data completa formatada.
|
|
286
|
+
* PrimeNG por padrão usa apenas o número do dia, forçando NVDA
|
|
287
|
+
* a narrar contexto de grid (linha/coluna/weekday) para informar a data.
|
|
288
|
+
* Com aria-label completo, NVDA narra diretamente a data sem verbosidade.
|
|
289
|
+
*/
|
|
290
|
+
enrichDayCellAriaLabels(panel) {
|
|
291
|
+
const { currentMonth, currentYear } = this.datePicker;
|
|
292
|
+
if (currentMonth == null || currentYear == null) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const weekdayHeaders = panel.querySelectorAll('.p-datepicker-weekday');
|
|
296
|
+
const weekdays = [];
|
|
297
|
+
weekdayHeaders.forEach((header) => {
|
|
298
|
+
weekdays.push(header.textContent?.trim() || '');
|
|
299
|
+
});
|
|
300
|
+
const rows = panel.querySelectorAll('.p-datepicker-day-view tbody tr');
|
|
301
|
+
rows.forEach((row) => {
|
|
302
|
+
const cells = row.querySelectorAll('td');
|
|
303
|
+
cells.forEach((cell, cellIndex) => {
|
|
304
|
+
const daySpan = cell.querySelector('.p-datepicker-day');
|
|
305
|
+
if (!daySpan) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
const dayNumber = parseInt(daySpan.textContent?.trim() || '0', 10);
|
|
309
|
+
if (!dayNumber) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const isOtherMonth = cell.classList.contains('p-datepicker-other-month');
|
|
313
|
+
if (isOtherMonth) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const date = new Date(currentYear, currentMonth, dayNumber);
|
|
317
|
+
const formattedDate = this.formatDateForAriaLabel(date);
|
|
318
|
+
const weekday = weekdays[cellIndex] || '';
|
|
319
|
+
const ariaLabel = weekday ? `${formattedDate}, ${weekday}` : formattedDate;
|
|
320
|
+
this.renderer.setAttribute(daySpan, ARIA_LABEL_ATTR, ariaLabel);
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Adiciona aria-label no grid com mês/ano atual para dar contexto
|
|
326
|
+
* imediato ao NVDA ao entrar na tabela de dias.
|
|
327
|
+
* Exemplo: "Calendário, Junho 2026"
|
|
328
|
+
*/
|
|
329
|
+
enrichGridAriaLabel(panel) {
|
|
330
|
+
const grid = panel.querySelector('.p-datepicker-day-view[role="grid"]');
|
|
331
|
+
if (!grid) {
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const { currentMonth, currentYear } = this.datePicker;
|
|
335
|
+
if (currentMonth == null || currentYear == null) {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const monthName = new Date(currentYear, currentMonth, 1).toLocaleDateString('pt-BR', {
|
|
339
|
+
month: 'long',
|
|
340
|
+
});
|
|
341
|
+
const capitalizedMonth = monthName.charAt(0).toUpperCase() + monthName.slice(1);
|
|
342
|
+
const label = `Calendário, ${capitalizedMonth} ${currentYear}`;
|
|
343
|
+
this.renderer.setAttribute(grid, ARIA_LABEL_ATTR, label);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Formata data para aria-label legível por leitor de tela.
|
|
347
|
+
* Sempre usa pt-BR para garantir consistência com labels traduzidos,
|
|
348
|
+
* independente do LOCALE_ID configurado no Angular.
|
|
349
|
+
* Exemplo: "3 de junho de 2026"
|
|
350
|
+
*/
|
|
351
|
+
formatDateForAriaLabel(date) {
|
|
352
|
+
try {
|
|
353
|
+
return date.toLocaleDateString('pt-BR', {
|
|
354
|
+
day: 'numeric',
|
|
355
|
+
month: 'long',
|
|
356
|
+
year: 'numeric',
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
return `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear()}`;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Retorna locale string para formatação.
|
|
365
|
+
*/
|
|
366
|
+
getLocale() {
|
|
367
|
+
return this.locale || 'pt-BR';
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Traduz aria-labels dos botões do header que PrimeNG renderiza em inglês.
|
|
371
|
+
* PrimeNG usa `getTranslation('chooseDate')` etc, que retorna inglês
|
|
372
|
+
* se `PrimeNGConfig.setTranslation()` não foi configurado pelo projeto.
|
|
373
|
+
*
|
|
374
|
+
* Busca botões com aria-label em inglês e traduz pro locale atual.
|
|
375
|
+
*/
|
|
376
|
+
translateAriaLabels(panel) {
|
|
377
|
+
const translations = this.getTranslations();
|
|
378
|
+
// Dialog aria-label ("Choose Date")
|
|
379
|
+
const dialog = panel.closest('[role="dialog"]') || panel;
|
|
380
|
+
const dialogLabel = dialog.getAttribute(ARIA_LABEL_ATTR);
|
|
381
|
+
if (dialogLabel && translations[dialogLabel]) {
|
|
382
|
+
this.renderer.setAttribute(dialog, ARIA_LABEL_ATTR, translations[dialogLabel]);
|
|
383
|
+
}
|
|
384
|
+
// Botões "Choose Month" e "Choose Year" no header
|
|
385
|
+
panel.querySelectorAll('.p-datepicker-select-month, .p-datepicker-select-year').forEach((btn) => {
|
|
386
|
+
const label = btn.getAttribute(ARIA_LABEL_ATTR);
|
|
387
|
+
if (label && translations[label]) {
|
|
388
|
+
this.renderer.setAttribute(btn, ARIA_LABEL_ATTR, translations[label]);
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Corrige aria-label dos botões prev/next do PrimeNG.
|
|
394
|
+
* PrimeNG usa `p-button` component que seta `aria-label` no host element `<p-button>`,
|
|
395
|
+
* mas NVDA foca o `<button>` interno que não herda o label do custom element.
|
|
396
|
+
*
|
|
397
|
+
* Estrutura DOM: `<p-button aria-label="Previous Month"><button class="p-datepicker-prev-button">...</button></p-button>`
|
|
398
|
+
*
|
|
399
|
+
* Fix: lê aria-label do `<p-button>` host, traduz, e propaga pro `<button>` interno.
|
|
400
|
+
*/
|
|
401
|
+
fixNavigationButtonLabels(panel) {
|
|
402
|
+
const translations = this.getTranslations();
|
|
403
|
+
// Buscar <p-button> hosts que contém os botões prev/next
|
|
404
|
+
const pButtons = panel.querySelectorAll('p-button');
|
|
405
|
+
pButtons.forEach((pBtn) => {
|
|
406
|
+
const innerButton = pBtn.querySelector('button.p-datepicker-prev-button, button.p-datepicker-next-button');
|
|
407
|
+
if (!innerButton) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
let label = pBtn.getAttribute(ARIA_LABEL_ATTR) || '';
|
|
411
|
+
// Traduzir
|
|
412
|
+
if (label && translations[label]) {
|
|
413
|
+
label = translations[label];
|
|
414
|
+
this.renderer.setAttribute(pBtn, ARIA_LABEL_ATTR, label);
|
|
415
|
+
}
|
|
416
|
+
// Propagar pro <button> interno
|
|
417
|
+
if (label) {
|
|
418
|
+
this.renderer.setAttribute(innerButton, ARIA_LABEL_ATTR, label);
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Remove `role="application"` do container do calendário.
|
|
424
|
+
*
|
|
425
|
+
* PrimeNG seta `role="application"` no `.p-datepicker-calendar-container`
|
|
426
|
+
* para que arrow keys cheguem no JavaScript sem interceptação do browse mode.
|
|
427
|
+
* Porém `role="grid"` na table já garante esse comportamento — NVDA entra
|
|
428
|
+
* automaticamente em focus mode ao focar uma gridcell.
|
|
429
|
+
*
|
|
430
|
+
* O `role="application"` no container PAI causa NVDA a despeja o conteúdo
|
|
431
|
+
* virtual do container inteiro ao entrar no dialog, antes de pousar na célula.
|
|
432
|
+
* Removê-lo resolve a leitura excessiva sem quebrar navegação por setas.
|
|
433
|
+
*/
|
|
434
|
+
removeApplicationRoleFromContainer(panel) {
|
|
435
|
+
const calendarContainer = panel.querySelector('.p-datepicker-calendar-container');
|
|
436
|
+
if (calendarContainer?.getAttribute('role') === 'application') {
|
|
437
|
+
this.renderer.removeAttribute(calendarContainer, 'role');
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Retorna mapa de traduções pro locale atual.
|
|
442
|
+
* Se locale é inglês ou não reconhecido, fallback pra pt-BR
|
|
443
|
+
* (assumimos que labels em inglês devem ser traduzidos).
|
|
444
|
+
*/
|
|
445
|
+
getTranslations() {
|
|
446
|
+
const locale = this.getLocale();
|
|
447
|
+
return ARIA_TRANSLATIONS[locale]
|
|
448
|
+
|| ARIA_TRANSLATIONS[locale.split('-')[0]]
|
|
449
|
+
|| ARIA_TRANSLATIONS_PT_BR;
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Adiciona listeners de focus/blur nos elementos interativos para
|
|
453
|
+
* garantir indicador visual quando `.focus()` é chamado programaticamente.
|
|
454
|
+
*
|
|
455
|
+
* `:focus-visible` pode não ser aplicado quando foco é movido via JS,
|
|
456
|
+
* então usamos classe auxiliar `s-datepicker-day-focused` como fallback.
|
|
457
|
+
*/
|
|
458
|
+
setupFocusTracking(panel) {
|
|
459
|
+
this.removeFocusListeners();
|
|
460
|
+
const focusableElements = panel.querySelectorAll('.p-datepicker-day, .p-datepicker-month, .p-datepicker-year');
|
|
461
|
+
focusableElements.forEach((el) => {
|
|
462
|
+
const focusCleanup = this.renderer.listen(el, 'focus', () => {
|
|
463
|
+
this.renderer.addClass(el, 's-datepicker-day-focused');
|
|
464
|
+
});
|
|
465
|
+
const blurCleanup = this.renderer.listen(el, 'blur', () => {
|
|
466
|
+
this.renderer.removeClass(el, 's-datepicker-day-focused');
|
|
467
|
+
});
|
|
468
|
+
this.focusListenerCleanups.push(focusCleanup, blurCleanup);
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Remove listeners de focus/blur registrados anteriormente.
|
|
473
|
+
*/
|
|
474
|
+
removeFocusListeners() {
|
|
475
|
+
this.focusListenerCleanups.forEach((cleanup) => cleanup());
|
|
476
|
+
this.focusListenerCleanups = [];
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Observa mudanças no DOM do painel para reaplicar correções
|
|
480
|
+
* quando o PrimeNG troca a view interna (dias → meses → anos).
|
|
481
|
+
* Usa debounce e só reage a childList changes (não attributes)
|
|
482
|
+
* para evitar loop infinito com as próprias mutações da diretiva.
|
|
483
|
+
*/
|
|
484
|
+
observePanelChanges() {
|
|
485
|
+
this.disconnectObserver();
|
|
486
|
+
const panel = this.datePicker.overlay;
|
|
487
|
+
if (!panel) {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
let debounceTimer = null;
|
|
491
|
+
let isProcessing = false;
|
|
492
|
+
this.observer = new MutationObserver((mutations) => {
|
|
493
|
+
if (isProcessing) {
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
// Só reagir se houve adição/remoção de nós (troca de view)
|
|
497
|
+
const hasStructuralChange = mutations.some((m) => m.type === 'childList' && (m.addedNodes.length > 0 || m.removedNodes.length > 0));
|
|
498
|
+
if (!hasStructuralChange) {
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
if (debounceTimer) {
|
|
502
|
+
clearTimeout(debounceTimer);
|
|
503
|
+
}
|
|
504
|
+
debounceTimer = setTimeout(() => {
|
|
505
|
+
isProcessing = true;
|
|
506
|
+
this.fixPanelAccessibility();
|
|
507
|
+
this.focusBestTarget();
|
|
508
|
+
isProcessing = false;
|
|
509
|
+
}, MUTATION_DEBOUNCE_MS);
|
|
510
|
+
});
|
|
511
|
+
this.observer.observe(panel, {
|
|
512
|
+
childList: true,
|
|
513
|
+
subtree: true,
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
disconnectObserver() {
|
|
517
|
+
if (this.observer) {
|
|
518
|
+
this.observer.disconnect();
|
|
519
|
+
this.observer = null;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerNoPeriodTabDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
523
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: DatepickerNoPeriodTabDirective, isStandalone: true, selector: "[sDatepickerNoPeriodTab]", host: { listeners: { "onShow": "onPanelShow()", "onMonthChange": "onNavigationChange()", "onYearChange": "onNavigationChange()" } }, ngImport: i0 });
|
|
524
|
+
}
|
|
525
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerNoPeriodTabDirective, decorators: [{
|
|
526
|
+
type: Directive,
|
|
527
|
+
args: [{
|
|
528
|
+
selector: '[sDatepickerNoPeriodTab]',
|
|
529
|
+
standalone: true,
|
|
530
|
+
}]
|
|
531
|
+
}], ctorParameters: () => [], propDecorators: { onPanelShow: [{
|
|
532
|
+
type: HostListener,
|
|
533
|
+
args: ['onShow']
|
|
534
|
+
}], onNavigationChange: [{
|
|
535
|
+
type: HostListener,
|
|
536
|
+
args: ['onMonthChange']
|
|
537
|
+
}, {
|
|
538
|
+
type: HostListener,
|
|
539
|
+
args: ['onYearChange']
|
|
540
|
+
}] } });
|
|
541
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1uby1wZXJpb2QtdGFiLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zaGFyZWQvc3JjL2xpYi9hY2Nlc3NpYmlsaXR5L2RhdGVwaWNrZXItbm8tcGVyaW9kLXRhYi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBYSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFaEQ7Ozs7R0FJRztBQUNILE1BQU0sY0FBYyxHQUFHLGdDQUFnQyxDQUFDO0FBRXhELCtGQUErRjtBQUMvRixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFFMUIsOEZBQThGO0FBQzlGLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRWpDLDhFQUE4RTtBQUM5RSxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0ErQnBCLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDO0FBQ3pDLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDO0FBRXpDLE1BQU0sdUJBQXVCLEdBQTJCO0lBQ3BELGFBQWEsRUFBRSxpQkFBaUI7SUFDaEMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxhQUFhLEVBQUUsZ0JBQWdCO0lBQy9CLGdCQUFnQixFQUFFLGNBQWM7SUFDaEMsWUFBWSxFQUFFLGFBQWE7SUFDM0IsZUFBZSxFQUFFLGNBQWM7SUFDL0IsV0FBVyxFQUFFLGFBQWE7SUFDMUIs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a0I7c0JBRnhCLFlBQVk7dUJBQUMsZUFBZTs7c0JBQzVCLFlBQVk7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBMT0NBTEVfSUQsIE9uRGVzdHJveSwgUmVuZGVyZXIyLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGVQaWNrZXIgfSBmcm9tICdwcmltZW5nL2RhdGVwaWNrZXInO1xuXG4vKipcbiAqIENTUyBjdXN0b21pemFkbyBpbmpldGFkbyBnbG9iYWxtZW50ZSBwYXJhIGZvY3VzLXZpc2libGUgbm9zIGludGVybmFscyBkbyBEYXRlUGlja2VyLlxuICogTmVjZXNzw6FyaW8gcG9ycXVlIGNvbSBgYXBwZW5kVG89XCJib2R5XCJgIG8gb3ZlcmxheSBmaWNhIGZvcmEgZG8gaG9zdCBjb21wb25lbnQsXG4gKiBlIGVzdGlsb3MgY29tIGA6aG9zdCA6Om5nLWRlZXBgIG91IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkIG7Do28gYWxjYW7Dp2FtLlxuICovXG5jb25zdCBGT0NVU19TVFlMRV9JRCA9ICdzLWRhdGVwaWNrZXItYTExeS1mb2N1cy1zdHlsZXMnO1xuXG4vKiogRGVsYXkgZW0gbXMgcGFyYSBmb2NvIHDDs3MtYWJlcnR1cmEgZSBuYXZlZ2HDp8OjbyAocGVybWl0ZSBOVkRBIHByb2Nlc3NhciBkaWFsb2cgYW5ub3VuY2UpLiAqL1xuY29uc3QgRk9DVVNfREVMQVlfTVMgPSA1MDtcblxuLyoqIERlbGF5IGVtIG1zIHBhcmEgZGVib3VuY2UgZG8gTXV0YXRpb25PYnNlcnZlciAoZXZpdGEgcmUtZXhlY3XDp8OjbyBwb3IgcmlwcGxlL2FuaW1hw6fDtWVzKS4gKi9cbmNvbnN0IE1VVEFUSU9OX0RFQk9VTkNFX01TID0gMTAwO1xuXG4vKiogQXR0cmlidXRlIG5hbWUgY29uc3RhbnQgdG8gYXZvaWQgU29uYXJRdWJlIGxpdGVyYWwgZHVwbGljYXRpb24gd2FybmluZy4gKi9cbmNvbnN0IEFSSUFfTEFCRUxfQVRUUiA9ICdhcmlhLWxhYmVsJztcbmNvbnN0IEZPQ1VTX1NUWUxFUyA9IGBcbi5wLWRhdGVwaWNrZXItZGF5OmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLWRheS5zLWRhdGVwaWNrZXItZGF5LWZvY3VzZWQge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuLnAtZGF0ZXBpY2tlci1tb250aDpmb2N1cy12aXNpYmxlLFxuLnAtZGF0ZXBpY2tlci1tb250aC5zLWRhdGVwaWNrZXItZGF5LWZvY3VzZWQge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuLnAtZGF0ZXBpY2tlci15ZWFyOmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLXllYXIucy1kYXRlcGlja2VyLWRheS1mb2N1c2VkIHtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcC1wcmltYXJ5LWNvbG9yLCAjM2I4MmY2KSAhaW1wb3J0YW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cbi5wLWRhdGVwaWNrZXItc2VsZWN0LW1vbnRoOmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLXNlbGVjdC15ZWFyOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG4ucC1kYXRlcGlja2VyLXByZXYtYnV0dG9uOmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLW5leHQtYnV0dG9uOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG5gO1xuXG4vKipcbiAqIFRyYWR1w6fDtWVzIHB0LUJSIHBhcmEgYXJpYS1sYWJlbHMgZG8gRGF0ZVBpY2tlciBQcmltZU5HLlxuICogUHJpbWVORyB1c2EgYGdldFRyYW5zbGF0aW9uKClgIHF1ZSByZXRvcm5hIGluZ2zDqnMgcG9yIHBhZHLDo29cbiAqIHNlIG7Do28gY29uZmlndXJhZG8gdmlhIGBQcmltZU5HQ29uZmlnLnNldFRyYW5zbGF0aW9uKClgLlxuICpcbiAqIEtleXMgY29ycmVzcG9uZGVtIGFvIHRleHRvIGV4YXRvIHJlbmRlcml6YWRvIHBlbG8gUHJpbWVORyBubyBET006XG4gKiAtIFwiUHJldmlvdXMgTW9udGhcIiAobsOjbyBcIlByZXYgTW9udGhcIilcbiAqIC0gXCJDaG9vc2UgRGF0ZVwiLCBcIkNob29zZSBNb250aFwiLCBcIkNob29zZSBZZWFyXCJcbiAqL1xuY29uc3QgUFJFVl9ERUNBREVfUFQgPSAnRMOpY2FkYSBhbnRlcmlvcic7XG5jb25zdCBQUkVWX0RFQ0FERV9FUyA9ICdEw6ljYWRhIGFudGVyaW9yJztcblxuY29uc3QgQVJJQV9UUkFOU0xBVElPTlNfUFRfQlI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ0Nob29zZSBEYXRlJzogJ1NlbGVjaW9uYXIgZGF0YScsXG4gICAgJ0Nob29zZSBNb250aCc6ICdTZWxlY2lvbmFyIG3DqnMnLFxuICAgICdDaG9vc2UgWWVhcic6ICdTZWxlY2lvbmFyIGFubycsXG4gICAgJ1ByZXZpb3VzIE1vbnRoJzogJ03DqnMgYW50ZXJpb3InLFxuICAgICdOZXh0IE1vbnRoJzogJ1Byw7N4aW1vIG3DqnMnLFxuICAgICdQcmV2aW91cyBZZWFyJzogJ0FubyBhbnRlcmlvcicsXG4gICAgJ05leHQgWWVhcic6ICdQcsOzeGltbyBhbm8nLFxuICAgICdQcmV2aW91cyBEZWNhZGUnOiBQUkVWX0RFQ0FERV9QVCxcbiAgICAnTmV4dCBEZWNhZGUnOiAnUHLDs3hpbWEgZMOpY2FkYScsXG4gICAgJ1ByZXYgTW9udGgnOiAnTcOqcyBhbnRlcmlvcicsXG4gICAgJ1ByZXYgWWVhcic6ICdBbm8gYW50ZXJpb3InLFxuICAgICdQcmV2IERlY2FkZSc6IFBSRVZfREVDQURFX1BULFxufTtcblxuY29uc3QgQVJJQV9UUkFOU0xBVElPTlNfRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ0Nob29zZSBEYXRlJzogJ1NlbGVjY2lvbmFyIGZlY2hhJyxcbiAgICAnQ2hvb3NlIE1vbnRoJzogJ1NlbGVjY2lvbmFyIG1lcycsXG4gICAgJ0Nob29zZSBZZWFyJzogJ1NlbGVjY2lvbmFyIGHDsW8nLFxuICAgICdQcmV2aW91cyBNb250aCc6ICdNZXMgYW50ZXJpb3InLFxuICAgICdOZXh0IE1vbnRoJzogJ1Byw7N4aW1vIG1lcycsXG4gICAgJ1ByZXZpb3VzIFllYXInOiAnQcOxbyBhbnRlcmlvcicsXG4gICAgJ05leHQgWWVhcic6ICdQcsOzeGltbyBhw7FvJyxcbiAgICAnUHJldmlvdXMgRGVjYWRlJzogUFJFVl9ERUNBREVfRVMsXG4gICAgJ05leHQgRGVjYWRlJzogJ1Byw7N4aW1hIGTDqWNhZGEnLFxuICAgICdQcmV2IE1vbnRoJzogJ01lcyBhbnRlcmlvcicsXG4gICAgJ1ByZXYgWWVhcic6ICdBw7FvIGFudGVyaW9yJyxcbiAgICAnUHJldiBEZWNhZGUnOiBQUkVWX0RFQ0FERV9FUyxcbn07XG5cbmNvbnN0IEFSSUFfVFJBTlNMQVRJT05TOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgICAncHQtQlInOiBBUklBX1RSQU5TTEFUSU9OU19QVF9CUixcbiAgICAncHQnOiBBUklBX1RSQU5TTEFUSU9OU19QVF9CUixcbiAgICAnZXMnOiBBUklBX1RSQU5TTEFUSU9OU19FUyxcbiAgICAnZXMtQ08nOiBBUklBX1RSQU5TTEFUSU9OU19FUyxcbiAgICAnZXMtRVMnOiBBUklBX1RSQU5TTEFUSU9OU19FUyxcbn07XG5cbi8qKlxuICogRGlyZXRpdmEgcGFyYSBjb3JyaWdpciBhIGFjZXNzaWJpbGlkYWRlIGRvIHBhaW5lbCBkbyBEYXRlUGlja2VyIFByaW1lTkcuXG4gKlxuICogUmVzb2x2ZSBvcyBzZWd1aW50ZXMgcHJvYmxlbWFzOlxuICpcbiAqIDEuICoqRm9jbyBpbmljaWFsIGFvIGFicmlyIG92ZXJsYXkqKjogbW92ZSBmb2NvIHByb2dyYW1hdGljYW1lbnRlIHBhcmFcbiAqICAgIGEgY8OpbHVsYSBzZWxlY2lvbmFkYSwgaG9qZSwgb3UgcHJpbWVpcmEgY8OpbHVsYSBkaXNwb27DrXZlbCDigJQgZXZpdGFuZG9cbiAqICAgIHF1ZSBOVkRBIGxlaWEgdG9kYSBlc3RydXR1cmEgZG8gZ3JpZCBhbyBlbnRyYXIgbm8gcGFpbmVsLlxuICpcbiAqIDIuICoqUmUtZm9jbyBhbyB0cm9jYXIgdmlldyAobcOqcy9hbm8pKio6IGFvIG5hdmVnYXIgcGFyYSB2aWV3cyBkZSBtw6pzIG91XG4gKiAgICBhbm8sIG8gRE9NIMOpIGRlc3RydcOtZG8gZSByZWNyaWFkby4gU2VtIGludGVydmVuw6fDo28sIGZvY28gZXNjYXBhIHBhcmFcbiAqICAgIGA8Ym9keT5gIGUgTlZEQSBsw6ogY29udGXDumRvIGZvcmEgZG8gb3ZlcmxheS4gQSBkaXJldGl2YSByZS1mb2NhIG9cbiAqICAgIHByaW1laXJvIGVsZW1lbnRvIGludGVyYXRpdm8gZGEgbm92YSB2aWV3LlxuICpcbiAqIDMuICoqRm9jdXMtdmlzaWJsZSBub3MgZWxlbWVudG9zIGludGVybm9zKio6IGluamV0YSBDU1MgZ2xvYmFsIGNvbVxuICogICAgb3V0bGluZSBwYXJhIHRvZG9zIGVsZW1lbnRvcyBpbnRlcmF0aXZvcyBkbyBvdmVybGF5LCBnYXJhbnRpbmRvXG4gKiAgICBmZWVkYmFjayB2aXN1YWwgbWVzbW8gY29tIGBhcHBlbmRUbz1cImJvZHlcImAuXG4gKlxuICogNC4gKiphcmlhLWxhYmVsIGVucmlxdWVjaWRvIG5vcyBkYXkgY2VsbHMqKjogUHJpbWVORyBzZXRhIGFwZW5hcyBvXG4gKiAgICBuw7ptZXJvIGRvIGRpYS4gQSBkaXJldGl2YSBzb2JyZXNjcmV2ZSBjb20gZGF0YSBjb21wbGV0YSBmb3JtYXRhZGFcbiAqICAgIChleDogXCIzIGRlIGp1bmhvIGRlIDIwMjYsIFF1YVwiKSDigJQgTlZEQSBuYXJyYSBsYWJlbCBzZW0gcHJlY2lzYXJcbiAqICAgIGNvbnRleHR1YWxpemFyIHRvZGEgZ3JpZC5cbiAqXG4gKiA1LiAqKlZpZXcgZGUgbWVzZXMvYW5vcyBzZW0gdGFiaW5kZXgqKjogc3BhbnMgZGUgbcOqcy9hbm8gcmVjZWJlbVxuICogICAgYHRhYmluZGV4PVwiMFwiYCBlIGByb2xlPVwib3B0aW9uXCJgIHBhcmEgbmF2ZWdhw6fDo28gcG9yIHRlY2xhZG8uXG4gKlxuICogVXRpbGl6YSBgTXV0YXRpb25PYnNlcnZlcmAgcGFyYSBkZXRlY3RhciBtdWRhbsOnYXMgaW50ZXJuYXMgZGUgdmlldyxcbiAqIGrDoSBxdWUgUHJpbWVORyBuw6NvIGVtaXRlIGV2ZW50b3MgcGFyYSBlc3NhcyB0cmFuc2nDp8O1ZXMuXG4gKlxuICogKipDU1MqKjogQSBkaXJldGl2YSBpbmpldGEgdW0gYDxzdHlsZT5gIGdsb2JhbCBubyBgPGhlYWQ+YCAodW1hIHZleikuXG4gKiBQYXJhIHByb2pldG9zIHF1ZSBwcmVmZXJlbSBjb250cm9sZSBtYW51YWwsIGRlc2FiaWxpdGUgdmlhIElucHV0XG4gKiBgW3NEYXRlcGlja2VySW5qZWN0U3R5bGVzXT1cImZhbHNlXCJgIGUgaW1wb3J0ZSBvcyBlc3RpbG9zIG1hbnVhbG1lbnRlLlxuICpcbiAqIFVzbzogYDxwLWRhdGVwaWNrZXIgc0RhdGVwaWNrZXJOb1BlcmlvZFRhYiAuLi4+YFxuICpcbiAqIEBjYXRlZ29yeSBEaXJlY3RpdmVzXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3NEYXRlcGlja2VyTm9QZXJpb2RUYWJdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyTm9QZXJpb2RUYWJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVBpY2tlciA9IGluamVjdChEYXRlUGlja2VyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2NhbGUgPSBpbmplY3QoTE9DQUxFX0lEKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgICBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBmb2N1c0xpc3RlbmVyQ2xlYW51cHM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pbmplY3RHbG9iYWxGb2N1c1N0eWxlcygpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ29uU2hvdycpXG4gICAgcHVibGljIG9uUGFuZWxTaG93KCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZml4UGFuZWxBY2Nlc3NpYmlsaXR5KCk7XG4gICAgICAgICAgICAvLyBOw6NvIGNoYW1hciBmb2N1c0Jlc3RUYXJnZXQoKSBhcXVpIOKAlCBQcmltZU5HIGluaXRGb2N1c2FibGVDZWxsKClcbiAgICAgICAgICAgIC8vIGrDoSBtb3ZlIGZvY28gcHJvIGRheSBjZWxsIGNvbSB0YWJpbmRleD1cIjBcIiBuYSBhYmVydHVyYS5cbiAgICAgICAgICAgIC8vIENoYW1hciBkZSBub3ZvIGNhdXNhIGRvdWJsZS1hbm5vdW5jZSBubyBOVkRBLlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm9ic2VydmVQYW5lbENoYW5nZXMoKSwgTVVUQVRJT05fREVCT1VOQ0VfTVMpO1xuICAgICAgICB9LCBGT0NVU19ERUxBWV9NUyk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignb25Nb250aENoYW5nZScpXG4gICAgQEhvc3RMaXN0ZW5lcignb25ZZWFyQ2hhbmdlJylcbiAgICBwdWJsaWMgb25OYXZpZ2F0aW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZml4UGFuZWxBY2Nlc3NpYmlsaXR5KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdFRhcmdldCgpO1xuICAgICAgICB9LCBGT0NVU19ERUxBWV9NUyk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPYnNlcnZlcigpO1xuICAgICAgICB0aGlzLnJlbW92ZUZvY3VzTGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBmb2NvIHBhcmEgbWVsaG9yIGFsdm8gZGlzcG9uw612ZWwgbm8gcGFpbmVsLlxuICAgICAqIFVzYWRvIGFvIGFicmlyIG92ZXJsYXkgZSBhbyB0cm9jYXIgdmlldyAobcOqcy9hbm8pLlxuICAgICAqXG4gICAgICogQW8gYWJyaXI6IGV2aXRhIHF1ZSBOVkRBIGxlaWEgdG9kYSBlc3RydXR1cmEgZG8gZ3JpZC5cbiAgICAgKiBBbyB0cm9jYXIgdmlldzogcHJldmluZSBmb2NvIGVzY2FwYXIgcGFyYSBgPGJvZHk+YCBxdWFuZG9cbiAgICAgKiBQcmltZU5HIGRlc3Ryw7NpIERPTSBkYSB2aWV3IGFudGVyaW9yLlxuICAgICAqXG4gICAgICogUHJpb3JpZGFkZTogc2VsZWNpb25hZG8gPiBob2plID4gcHJpbWVpcm8gZGlzcG9uw612ZWwuXG4gICAgICogUHVsYSBzZSBmb2NvIGrDoSBlc3TDoSBubyB0YXJnZXQgY29ycmV0byAoZXZpdGEgZG91YmxlLWFubm91bmNlIG5vIE5WREEpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZm9jdXNCZXN0VGFyZ2V0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMuZGF0ZVBpY2tlci5vdmVybGF5O1xuICAgICAgICBpZiAoIXBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmZpbmRGb2N1c1RhcmdldChwYW5lbCk7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICAgIHRhcmdldC50YWJJbmRleCA9IDA7XG4gICAgICAgICAgICB0YXJnZXQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamV0YSBDU1MgZ2xvYmFsIGRlIGZvY3VzLXZpc2libGUgbm8gYDxoZWFkPmAgZG8gZG9jdW1lbnRvLlxuICAgICAqIEV4ZWN1dGEgYXBlbmFzIHVtYSB2ZXogKGlkZW1wb3RlbnRlIHZpYSBJRCBkbyBzdHlsZSBlbGVtZW50KS5cbiAgICAgKiBOZWNlc3PDoXJpbyBwb3JxdWUgb3ZlcmxheSBjb20gYGFwcGVuZFRvPVwiYm9keVwiYCBmaWNhIGZvcmEgZG9cbiAgICAgKiBlc2NvcG8gZGUgVmlld0VuY2Fwc3VsYXRpb24gZG8gY29tcG9uZW50ZSBob3N0LlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5qZWN0R2xvYmFsRm9jdXNTdHlsZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEZPQ1VTX1NUWUxFX0lEKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN0eWxlLCAnaWQnLCBGT0NVU19TVFlMRV9JRCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN0eWxlLCAndHlwZScsICd0ZXh0L2NzcycpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KEZPQ1VTX1NUWUxFUyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoc3R5bGUsIHRleHQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuaGVhZCwgc3R5bGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuY29udHJhIG1lbGhvciBlbGVtZW50byBwYXJhIHJlY2ViZXIgZm9jbyBubyBwYWluZWwgYXR1YWwuXG4gICAgICogQnVzY2EgZW0gb3JkZW06IHNlbGVjaW9uYWRvIOKGkiBob2plIOKGkiBwcmltZWlybyBkaXNwb27DrXZlbC5cbiAgICAgKiBGdW5jaW9uYSBwYXJhIHZpZXdzIGRlIGRpYXMsIG1lc2VzIGUgYW5vcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRGb2N1c1RhcmdldChwYW5lbDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICAvLyBWaWV3IGRlIGRpYXNcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXkgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICcucC1kYXRlcGlja2VyLWRheS1zZWxlY3RlZCwgLnAtZGF0ZXBpY2tlci1kYXlbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0nXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzZWxlY3RlZERheSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGF5O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9kYXkgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci10b2RheSAucC1kYXRlcGlja2VyLWRheScpO1xuICAgICAgICBpZiAodG9kYXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2RheTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZpZXcgZGUgbWVzZXNcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRNb250aCA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLW1vbnRoLnAtZGF0ZXBpY2tlci1tb250aC1zZWxlY3RlZCcpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRNb250aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTW9udGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RNb250aCA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLW1vbnRoOm5vdCgucC1kaXNhYmxlZCknKTtcbiAgICAgICAgaWYgKGZpcnN0TW9udGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE1vbnRoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmlldyBkZSBhbm9zXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhciA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLXllYXIucC1kYXRlcGlja2VyLXllYXItc2VsZWN0ZWQnKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkWWVhcikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkWWVhcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdFllYXIgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci15ZWFyOm5vdCgucC1kaXNhYmxlZCknKTtcbiAgICAgICAgaWYgKGZpcnN0WWVhcikge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0WWVhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZhbGxiYWNrOiBwcmltZWlybyBkYXkgY2VsbCBkaXNwb27DrXZlbFxuICAgICAgICBjb25zdCBmaXJzdERheSA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWRheTpub3QoLnAtZGlzYWJsZWQpJyk7XG4gICAgICAgIHJldHVybiBmaXJzdERheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcGxpY2EgY29ycmXDp8O1ZXMgZGUgYWNlc3NpYmlsaWRhZGUgbm8gcGFpbmVsIGRvIERhdGVQaWNrZXIsXG4gICAgICogaW5kZXBlbmRlbnRlIGRhIHZpZXcgaW50ZXJuYSBhdGl2YSAoZGlhcywgbWVzZXMgb3UgYW5vcykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaXhQYW5lbEFjY2Vzc2liaWxpdHkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5kYXRlUGlja2VyLm92ZXJsYXk7XG4gICAgICAgIGlmICghcGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLXNlbGVjdC1tb250aCwgLnAtZGF0ZXBpY2tlci1zZWxlY3QteWVhcicpLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnRuLCAndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1tb250aDpub3QoW3RhYmluZGV4XSknKS5mb3JFYWNoKChtb250aCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUobW9udGgsICd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShtb250aCwgJ3JvbGUnLCAnb3B0aW9uJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLXllYXI6bm90KFt0YWJpbmRleF0pJykuZm9yRWFjaCgoeWVhcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoeWVhciwgJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHllYXIsICdyb2xlJywgJ29wdGlvbicpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFwcGx5R3JpZGNlbGxSb2xlVG9EYXlzKHBhbmVsKTtcbiAgICAgICAgdGhpcy5lbnJpY2hEYXlDZWxsQXJpYUxhYmVscyhwYW5lbCk7XG4gICAgICAgIHRoaXMuZW5yaWNoR3JpZEFyaWFMYWJlbChwYW5lbCk7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQXJpYUxhYmVscyhwYW5lbCk7XG4gICAgICAgIHRoaXMuZml4TmF2aWdhdGlvbkJ1dHRvbkxhYmVscyhwYW5lbCk7XG4gICAgICAgIHRoaXMucmVtb3ZlQXBwbGljYXRpb25Sb2xlRnJvbUNvbnRhaW5lcihwYW5lbCk7XG4gICAgICAgIHRoaXMuc2V0dXBGb2N1c1RyYWNraW5nKHBhbmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSBgcm9sZT1cImdyaWRjZWxsXCJgIG5vcyBgPHNwYW4gY2xhc3M9XCJwLWRhdGVwaWNrZXItZGF5XCI+YCBxdWUgcmVjZWJlbSBmb2NvLlxuICAgICAqXG4gICAgICogUHJpbWVORyBjb2xvY2EgYHRhYmluZGV4YCBubyBgPHNwYW4+YCBkZW50cm8gZG8gYDx0ZD5gLCBtYXMgc2VtIHJvbGUgZXhwbMOtY2l0by5cbiAgICAgKiBOVkRBIG7Do28gZW50cmEgYXV0b21hdGljYW1lbnRlIGVtIGZvY3VzIG1vZGUgcXVhbmRvIGZvY2EgdW0gZWxlbWVudG8gc2VtXG4gICAgICogcm9sZSBkZSB3aWRnZXQgKGdyaWRjZWxsLCBidXR0b24sIGV0YykuIFJlc3VsdGFkbzogTlZEQSBmaWNhIGVtIGJyb3dzZSBtb2RlXG4gICAgICogZSBsw6ogdG9kYSBhIHRhYmVsYSBzZXF1ZW5jaWFsbWVudGUgYW8gaW52w6lzIGRlIGFudW5jaWFyIHPDsyBhIGPDqWx1bGEgZm9jYWRhLlxuICAgICAqXG4gICAgICogQW8gYWRpY2lvbmFyIGByb2xlPVwiZ3JpZGNlbGxcImAgbm8gc3BhbiBmb2PDoXZlbCwgTlZEQSByZWNvbmhlY2UgcXVlIMOpIHVtXG4gICAgICogd2lkZ2V0IGludGVyYXRpdm8gZSBlbnRyYSBlbSBmb2N1cyBtb2RlIOKAlCBhbnVuY2lhbmRvIGFwZW5hcyBvIGFyaWEtbGFiZWxcbiAgICAgKiBkYSBjw6lsdWxhIGZvY2FkYS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5R3JpZGNlbGxSb2xlVG9EYXlzKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1kYXk6bm90KC5wLWRpc2FibGVkKScpLmZvckVhY2goKGRheVNwYW4pID0+IHtcbiAgICAgICAgICAgIGlmICghZGF5U3Bhbi5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGRheVNwYW4sICdyb2xlJywgJ2dyaWRjZWxsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVucmlxdWVjZSBgYXJpYS1sYWJlbGAgZG9zIGRheSBjZWxscyBjb20gZGF0YSBjb21wbGV0YSBmb3JtYXRhZGEuXG4gICAgICogUHJpbWVORyBwb3IgcGFkcsOjbyB1c2EgYXBlbmFzIG8gbsO6bWVybyBkbyBkaWEsIGZvcsOnYW5kbyBOVkRBXG4gICAgICogYSBuYXJyYXIgY29udGV4dG8gZGUgZ3JpZCAobGluaGEvY29sdW5hL3dlZWtkYXkpIHBhcmEgaW5mb3JtYXIgYSBkYXRhLlxuICAgICAqIENvbSBhcmlhLWxhYmVsIGNvbXBsZXRvLCBOVkRBIG5hcnJhIGRpcmV0YW1lbnRlIGEgZGF0YSBzZW0gdmVyYm9zaWRhZGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbnJpY2hEYXlDZWxsQXJpYUxhYmVscyhwYW5lbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50TW9udGgsIGN1cnJlbnRZZWFyIH0gPSB0aGlzLmRhdGVQaWNrZXI7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRNb250aCA9PSBudWxsIHx8IGN1cnJlbnRZZWFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdlZWtkYXlIZWFkZXJzID0gcGFuZWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItd2Vla2RheScpO1xuICAgICAgICBjb25zdCB3ZWVrZGF5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgd2Vla2RheUhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyKSA9PiB7XG4gICAgICAgICAgICB3ZWVrZGF5cy5wdXNoKGhlYWRlci50ZXh0Q29udGVudD8udHJpbSgpIHx8ICcnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgcm93cyA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWRheS12aWV3IHRib2R5IHRyJyk7XG4gICAgICAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjZWxscyA9IHJvdy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PigndGQnKTtcbiAgICAgICAgICAgIGNlbGxzLmZvckVhY2goKGNlbGwsIGNlbGxJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRheVNwYW4gPSBjZWxsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWRheScpO1xuICAgICAgICAgICAgICAgIGlmICghZGF5U3Bhbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF5TnVtYmVyID0gcGFyc2VJbnQoZGF5U3Bhbi50ZXh0Q29udGVudD8udHJpbSgpIHx8ICcwJywgMTApO1xuICAgICAgICAgICAgICAgIGlmICghZGF5TnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpc090aGVyTW9udGggPSBjZWxsLmNsYXNzTGlzdC5jb250YWlucygncC1kYXRlcGlja2VyLW90aGVyLW1vbnRoJyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzT3RoZXJNb250aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIGRheU51bWJlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZUZvckFyaWFMYWJlbChkYXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWVrZGF5ID0gd2Vla2RheXNbY2VsbEluZGV4XSB8fCAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSB3ZWVrZGF5ID8gYCR7Zm9ybWF0dGVkRGF0ZX0sICR7d2Vla2RheX1gIDogZm9ybWF0dGVkRGF0ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGRheVNwYW4sIEFSSUFfTEFCRUxfQVRUUiwgYXJpYUxhYmVsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSBhcmlhLWxhYmVsIG5vIGdyaWQgY29tIG3DqnMvYW5vIGF0dWFsIHBhcmEgZGFyIGNvbnRleHRvXG4gICAgICogaW1lZGlhdG8gYW8gTlZEQSBhbyBlbnRyYXIgbmEgdGFiZWxhIGRlIGRpYXMuXG4gICAgICogRXhlbXBsbzogXCJDYWxlbmTDoXJpbywgSnVuaG8gMjAyNlwiXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbnJpY2hHcmlkQXJpYUxhYmVsKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBncmlkID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItZGF5LXZpZXdbcm9sZT1cImdyaWRcIl0nKTtcbiAgICAgICAgaWYgKCFncmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGN1cnJlbnRNb250aCwgY3VycmVudFllYXIgfSA9IHRoaXMuZGF0ZVBpY2tlcjtcbiAgICAgICAgaWYgKGN1cnJlbnRNb250aCA9PSBudWxsIHx8IGN1cnJlbnRZZWFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vbnRoTmFtZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIDEpLnRvTG9jYWxlRGF0ZVN0cmluZygncHQtQlInLCB7XG4gICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWRNb250aCA9IG1vbnRoTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG1vbnRoTmFtZS5zbGljZSgxKTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBgQ2FsZW5kw6FyaW8sICR7Y2FwaXRhbGl6ZWRNb250aH0gJHtjdXJyZW50WWVhcn1gO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShncmlkLCBBUklBX0xBQkVMX0FUVFIsIGxhYmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRhIGRhdGEgcGFyYSBhcmlhLWxhYmVsIGxlZ8OtdmVsIHBvciBsZWl0b3IgZGUgdGVsYS5cbiAgICAgKiBTZW1wcmUgdXNhIHB0LUJSIHBhcmEgZ2FyYW50aXIgY29uc2lzdMOqbmNpYSBjb20gbGFiZWxzIHRyYWR1emlkb3MsXG4gICAgICogaW5kZXBlbmRlbnRlIGRvIExPQ0FMRV9JRCBjb25maWd1cmFkbyBubyBBbmd1bGFyLlxuICAgICAqIEV4ZW1wbG86IFwiMyBkZSBqdW5obyBkZSAyMDI2XCJcbiAgICAgKi9cbiAgICBwcml2YXRlIGZvcm1hdERhdGVGb3JBcmlhTGFiZWwoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ3B0LUJSJywge1xuICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIGAke2RhdGUuZ2V0RGF0ZSgpfS8ke2RhdGUuZ2V0TW9udGgoKSArIDF9LyR7ZGF0ZS5nZXRGdWxsWWVhcigpfWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIGxvY2FsZSBzdHJpbmcgcGFyYSBmb3JtYXRhw6fDo28uXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlIHx8ICdwdC1CUic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhZHV6IGFyaWEtbGFiZWxzIGRvcyBib3TDtWVzIGRvIGhlYWRlciBxdWUgUHJpbWVORyByZW5kZXJpemEgZW0gaW5nbMOqcy5cbiAgICAgKiBQcmltZU5HIHVzYSBgZ2V0VHJhbnNsYXRpb24oJ2Nob29zZURhdGUnKWAgZXRjLCBxdWUgcmV0b3JuYSBpbmdsw6pzXG4gICAgICogc2UgYFByaW1lTkdDb25maWcuc2V0VHJhbnNsYXRpb24oKWAgbsOjbyBmb2kgY29uZmlndXJhZG8gcGVsbyBwcm9qZXRvLlxuICAgICAqXG4gICAgICogQnVzY2EgYm90w7VlcyBjb20gYXJpYS1sYWJlbCBlbSBpbmdsw6pzIGUgdHJhZHV6IHBybyBsb2NhbGUgYXR1YWwuXG4gICAgICovXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVBcmlhTGFiZWxzKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLmdldFRyYW5zbGF0aW9ucygpO1xuXG4gICAgICAgIC8vIERpYWxvZyBhcmlhLWxhYmVsIChcIkNob29zZSBEYXRlXCIpXG4gICAgICAgIGNvbnN0IGRpYWxvZyA9IHBhbmVsLmNsb3Nlc3QoJ1tyb2xlPVwiZGlhbG9nXCJdJykgfHwgcGFuZWw7XG4gICAgICAgIGNvbnN0IGRpYWxvZ0xhYmVsID0gZGlhbG9nLmdldEF0dHJpYnV0ZShBUklBX0xBQkVMX0FUVFIpO1xuICAgICAgICBpZiAoZGlhbG9nTGFiZWwgJiYgdHJhbnNsYXRpb25zW2RpYWxvZ0xhYmVsXSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZGlhbG9nLCBBUklBX0xBQkVMX0FUVFIsIHRyYW5zbGF0aW9uc1tkaWFsb2dMYWJlbF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm90w7VlcyBcIkNob29zZSBNb250aFwiIGUgXCJDaG9vc2UgWWVhclwiIG5vIGhlYWRlclxuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1zZWxlY3QtbW9udGgsIC5wLWRhdGVwaWNrZXItc2VsZWN0LXllYXInKS5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gYnRuLmdldEF0dHJpYnV0ZShBUklBX0xBQkVMX0FUVFIpO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIHRyYW5zbGF0aW9uc1tsYWJlbF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidG4sIEFSSUFfTEFCRUxfQVRUUiwgdHJhbnNsYXRpb25zW2xhYmVsXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcnJpZ2UgYXJpYS1sYWJlbCBkb3MgYm90w7VlcyBwcmV2L25leHQgZG8gUHJpbWVORy5cbiAgICAgKiBQcmltZU5HIHVzYSBgcC1idXR0b25gIGNvbXBvbmVudCBxdWUgc2V0YSBgYXJpYS1sYWJlbGAgbm8gaG9zdCBlbGVtZW50IGA8cC1idXR0b24+YCxcbiAgICAgKiBtYXMgTlZEQSBmb2NhIG8gYDxidXR0b24+YCBpbnRlcm5vIHF1ZSBuw6NvIGhlcmRhIG8gbGFiZWwgZG8gY3VzdG9tIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBFc3RydXR1cmEgRE9NOiBgPHAtYnV0dG9uIGFyaWEtbGFiZWw9XCJQcmV2aW91cyBNb250aFwiPjxidXR0b24gY2xhc3M9XCJwLWRhdGVwaWNrZXItcHJldi1idXR0b25cIj4uLi48L2J1dHRvbj48L3AtYnV0dG9uPmBcbiAgICAgKlxuICAgICAqIEZpeDogbMOqIGFyaWEtbGFiZWwgZG8gYDxwLWJ1dHRvbj5gIGhvc3QsIHRyYWR1eiwgZSBwcm9wYWdhIHBybyBgPGJ1dHRvbj5gIGludGVybm8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaXhOYXZpZ2F0aW9uQnV0dG9uTGFiZWxzKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLmdldFRyYW5zbGF0aW9ucygpO1xuXG4gICAgICAgIC8vIEJ1c2NhciA8cC1idXR0b24+IGhvc3RzIHF1ZSBjb250w6ltIG9zIGJvdMO1ZXMgcHJldi9uZXh0XG4gICAgICAgIGNvbnN0IHBCdXR0b25zID0gcGFuZWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3AtYnV0dG9uJyk7XG4gICAgICAgIHBCdXR0b25zLmZvckVhY2goKHBCdG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyQnV0dG9uID0gcEJ0bi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICAgICAnYnV0dG9uLnAtZGF0ZXBpY2tlci1wcmV2LWJ1dHRvbiwgYnV0dG9uLnAtZGF0ZXBpY2tlci1uZXh0LWJ1dHRvbidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWlubmVyQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBwQnRuLmdldEF0dHJpYnV0ZShBUklBX0xBQkVMX0FUVFIpIHx8ICcnO1xuXG4gICAgICAgICAgICAvLyBUcmFkdXppclxuICAgICAgICAgICAgaWYgKGxhYmVsICYmIHRyYW5zbGF0aW9uc1tsYWJlbF0pIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IHRyYW5zbGF0aW9uc1tsYWJlbF07XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUocEJ0biwgQVJJQV9MQUJFTF9BVFRSLCBsYWJlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByb3BhZ2FyIHBybyA8YnV0dG9uPiBpbnRlcm5vXG4gICAgICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShpbm5lckJ1dHRvbiwgQVJJQV9MQUJFTF9BVFRSLCBsYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBgcm9sZT1cImFwcGxpY2F0aW9uXCJgIGRvIGNvbnRhaW5lciBkbyBjYWxlbmTDoXJpby5cbiAgICAgKlxuICAgICAqIFByaW1lTkcgc2V0YSBgcm9sZT1cImFwcGxpY2F0aW9uXCJgIG5vIGAucC1kYXRlcGlja2VyLWNhbGVuZGFyLWNvbnRhaW5lcmBcbiAgICAgKiBwYXJhIHF1ZSBhcnJvdyBrZXlzIGNoZWd1ZW0gbm8gSmF2YVNjcmlwdCBzZW0gaW50ZXJjZXB0YcOnw6NvIGRvIGJyb3dzZSBtb2RlLlxuICAgICAqIFBvcsOpbSBgcm9sZT1cImdyaWRcImAgbmEgdGFibGUgasOhIGdhcmFudGUgZXNzZSBjb21wb3J0YW1lbnRvIOKAlCBOVkRBIGVudHJhXG4gICAgICogYXV0b21hdGljYW1lbnRlIGVtIGZvY3VzIG1vZGUgYW8gZm9jYXIgdW1hIGdyaWRjZWxsLlxuICAgICAqXG4gICAgICogTyBgcm9sZT1cImFwcGxpY2F0aW9uXCJgIG5vIGNvbnRhaW5lciBQQUkgY2F1c2EgTlZEQSBhIGRlc3BlamEgbyBjb250ZcO6ZG9cbiAgICAgKiB2aXJ0dWFsIGRvIGNvbnRhaW5lciBpbnRlaXJvIGFvIGVudHJhciBubyBkaWFsb2csIGFudGVzIGRlIHBvdXNhciBuYSBjw6lsdWxhLlxuICAgICAqIFJlbW92w6otbG8gcmVzb2x2ZSBhIGxlaXR1cmEgZXhjZXNzaXZhIHNlbSBxdWVicmFyIG5hdmVnYcOnw6NvIHBvciBzZXRhcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUFwcGxpY2F0aW9uUm9sZUZyb21Db250YWluZXIocGFuZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyQ29udGFpbmVyID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItY2FsZW5kYXItY29udGFpbmVyJyk7XG4gICAgICAgIGlmIChjYWxlbmRhckNvbnRhaW5lcj8uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdhcHBsaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGNhbGVuZGFyQ29udGFpbmVyLCAncm9sZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBtYXBhIGRlIHRyYWR1w6fDtWVzIHBybyBsb2NhbGUgYXR1YWwuXG4gICAgICogU2UgbG9jYWxlIMOpIGluZ2zDqnMgb3UgbsOjbyByZWNvbmhlY2lkbywgZmFsbGJhY2sgcHJhIHB0LUJSXG4gICAgICogKGFzc3VtaW1vcyBxdWUgbGFiZWxzIGVtIGluZ2zDqnMgZGV2ZW0gc2VyIHRyYWR1emlkb3MpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0VHJhbnNsYXRpb25zKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmdldExvY2FsZSgpO1xuICAgICAgICByZXR1cm4gQVJJQV9UUkFOU0xBVElPTlNbbG9jYWxlXVxuICAgICAgICAgICAgfHwgQVJJQV9UUkFOU0xBVElPTlNbbG9jYWxlLnNwbGl0KCctJylbMF1dXG4gICAgICAgICAgICB8fCBBUklBX1RSQU5TTEFUSU9OU19QVF9CUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSBsaXN0ZW5lcnMgZGUgZm9jdXMvYmx1ciBub3MgZWxlbWVudG9zIGludGVyYXRpdm9zIHBhcmFcbiAgICAgKiBnYXJhbnRpciBpbmRpY2Fkb3IgdmlzdWFsIHF1YW5kbyBgLmZvY3VzKClgIMOpIGNoYW1hZG8gcHJvZ3JhbWF0aWNhbWVudGUuXG4gICAgICpcbiAgICAgKiBgOmZvY3VzLXZpc2libGVgIHBvZGUgbsOjbyBzZXIgYXBsaWNhZG8gcXVhbmRvIGZvY28gw6kgbW92aWRvIHZpYSBKUyxcbiAgICAgKiBlbnTDo28gdXNhbW9zIGNsYXNzZSBhdXhpbGlhciBgcy1kYXRlcGlja2VyLWRheS1mb2N1c2VkYCBjb21vIGZhbGxiYWNrLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBGb2N1c1RyYWNraW5nKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZUZvY3VzTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICcucC1kYXRlcGlja2VyLWRheSwgLnAtZGF0ZXBpY2tlci1tb250aCwgLnAtZGF0ZXBpY2tlci15ZWFyJ1xuICAgICAgICApO1xuICAgICAgICBmb2N1c2FibGVFbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNDbGVhbnVwID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oZWwsICdmb2N1cycsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsLCAncy1kYXRlcGlja2VyLWRheS1mb2N1c2VkJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGJsdXJDbGVhbnVwID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oZWwsICdibHVyJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsICdzLWRhdGVwaWNrZXItZGF5LWZvY3VzZWQnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0xpc3RlbmVyQ2xlYW51cHMucHVzaChmb2N1c0NsZWFudXAsIGJsdXJDbGVhbnVwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGxpc3RlbmVycyBkZSBmb2N1cy9ibHVyIHJlZ2lzdHJhZG9zIGFudGVyaW9ybWVudGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW1vdmVGb2N1c0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb2N1c0xpc3RlbmVyQ2xlYW51cHMuZm9yRWFjaCgoY2xlYW51cCkgPT4gY2xlYW51cCgpKTtcbiAgICAgICAgdGhpcy5mb2N1c0xpc3RlbmVyQ2xlYW51cHMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZhIG11ZGFuw6dhcyBubyBET00gZG8gcGFpbmVsIHBhcmEgcmVhcGxpY2FyIGNvcnJlw6fDtWVzXG4gICAgICogcXVhbmRvIG8gUHJpbWVORyB0cm9jYSBhIHZpZXcgaW50ZXJuYSAoZGlhcyDihpIgbWVzZXMg4oaSIGFub3MpLlxuICAgICAqIFVzYSBkZWJvdW5jZSBlIHPDsyByZWFnZSBhIGNoaWxkTGlzdCBjaGFuZ2VzIChuw6NvIGF0dHJpYnV0ZXMpXG4gICAgICogcGFyYSBldml0YXIgbG9vcCBpbmZpbml0byBjb20gYXMgcHLDs3ByaWFzIG11dGHDp8O1ZXMgZGEgZGlyZXRpdmEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBvYnNlcnZlUGFuZWxDaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPYnNlcnZlcigpO1xuXG4gICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5kYXRlUGlja2VyLm92ZXJsYXk7XG4gICAgICAgIGlmICghcGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZWJvdW5jZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgaXNQcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1Byb2Nlc3NpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFPDsyByZWFnaXIgc2UgaG91dmUgYWRpw6fDo28vcmVtb8Onw6NvIGRlIG7Ds3MgKHRyb2NhIGRlIHZpZXcpXG4gICAgICAgICAgICBjb25zdCBoYXNTdHJ1Y3R1cmFsQ2hhbmdlID0gbXV0YXRpb25zLnNvbWUoXG4gICAgICAgICAgICAgICAgKG0pID0+IG0udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgKG0uYWRkZWROb2Rlcy5sZW5ndGggPiAwIHx8IG0ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIWhhc1N0cnVjdHVyYWxDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZWJvdW5jZVRpbWVyKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzUHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5maXhQYW5lbEFjY2Vzc2liaWxpdHkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzQmVzdFRhcmdldCgpO1xuICAgICAgICAgICAgICAgIGlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgTVVUQVRJT05fREVCT1VOQ0VfTVMpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUocGFuZWwsIHtcbiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzY29ubmVjdE9ic2VydmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
@@ -2,6 +2,7 @@ export { EnumSeverity } from './lib/shared/models/severities';
|
|
|
2
2
|
export { BorderButtonComponent } from './lib/shared/border-button/border-button.component';
|
|
3
3
|
export { BorderButtonModule } from './lib/shared/border-button/border-button.module';
|
|
4
4
|
export * from './lib/shared/helpers';
|
|
5
|
+
export { DatepickerNoPeriodTabDirective } from './lib/accessibility/datepicker-no-period-tab.directive';
|
|
5
6
|
export { PaginatorAccessibilityDirective } from './lib/accessibility/paginator-accessibility.directive';
|
|
6
7
|
export { TableCheckboxAccessibilityDirective } from './lib/accessibility/table-checkbox-accessibility.directive';
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zaGFyZWQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3JGLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDeEcsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDeEcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sNERBQTRELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IEJvcmRlckJ1dHRvbk9wdGlvbnMgfSBmcm9tICcuL2xpYi9zaGFyZWQvbW9kZWxzL2JvcmRlci1idXR0b24tb3B0aW9ucyc7XG5leHBvcnQgdHlwZSB7IFNldmVyaXRpZXMgfSBmcm9tICcuL2xpYi9zaGFyZWQvbW9kZWxzL3NldmVyaXRpZXMnO1xuZXhwb3J0IHsgRW51bVNldmVyaXR5IH0gZnJvbSAnLi9saWIvc2hhcmVkL21vZGVscy9zZXZlcml0aWVzJztcbmV4cG9ydCB7IEJvcmRlckJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vbGliL3NoYXJlZC9ib3JkZXItYnV0dG9uL2JvcmRlci1idXR0b24uY29tcG9uZW50JztcbmV4cG9ydCB7IEJvcmRlckJ1dHRvbk1vZHVsZSB9IGZyb20gJy4vbGliL3NoYXJlZC9ib3JkZXItYnV0dG9uL2JvcmRlci1idXR0b24ubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NoYXJlZC9oZWxwZXJzJztcbmV4cG9ydCB7IERhdGVwaWNrZXJOb1BlcmlvZFRhYkRpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2FjY2Vzc2liaWxpdHkvZGF0ZXBpY2tlci1uby1wZXJpb2QtdGFiLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBQYWdpbmF0b3JBY2Nlc3NpYmlsaXR5RGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvYWNjZXNzaWJpbGl0eS9wYWdpbmF0b3ItYWNjZXNzaWJpbGl0eS5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgVGFibGVDaGVja2JveEFjY2Vzc2liaWxpdHlEaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9hY2Nlc3NpYmlsaXR5L3RhYmxlLWNoZWNrYm94LWFjY2Vzc2liaWxpdHkuZGlyZWN0aXZlJztcblxuIl19
|